From dd1a2df1f98d53a7929a2d0b0f9b1bd2366a3f35 Mon Sep 17 00:00:00 2001 From: "jieying.li" Date: Mon, 25 Nov 2024 10:00:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=A0=E5=88=86=E6=94=AF?= =?UTF-8?q?=EF=BC=8C=E4=BB=A3=E7=A0=81=E6=97=A5=E6=9C=9F2024=E5=B9=B411?= =?UTF-8?q?=E6=9C=8822=E6=97=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .version | 1 + README.md | 1 + cctp-atu/README.md | 0 cctp-atu/atu-data-mgr/Dockerfile-dev | 40 + cctp-atu/atu-data-mgr/Dockerfile-prod | 40 + cctp-atu/atu-data-mgr/Dockerfile-test | 40 + cctp-atu/atu-data-mgr/Dockerfile-uat | 40 + cctp-atu/atu-data-mgr/docker-ctl.sh | 179 + cctp-atu/atu-data-mgr/logback-rabbitmq.xml | 86 + cctp-atu/atu-data-mgr/pom.xml | 171 + cctp-atu/atu-data-mgr/shell/nk-ms.sh | 116 + .../cctp/dataPool/DataPoolApplication.java | 36 + .../DataResourcePackageRestfulCtrl.java | 81 + .../api/dataRule/DataRulePubCtrl.java | 45 + .../api/dataRule/DataRuleRestfulCtrl.java | 171 + .../DataResourcePackageApiService.java | 51 + .../DataResourcePackageApiServiceImpl.java | 283 ++ .../dataRule/service/DataRuleApiService.java | 80 + .../service/DataRuleApiServiceImpl.java | 595 +++ .../api/dataSets/DataSetEnvRelCtrl.java | 134 + .../api/dataSets/DataSetTreeRestfulCtrl.java | 143 + .../api/dataSets/DataSetsPubCtrl.java | 29 + .../api/dataSets/DataSetsRestfulCtrl.java | 219 ++ .../service/DataSetEnvRelApiService.java | 34 + .../service/DataSetEnvRelApiServiceImpl.java | 739 ++++ .../service/DataSetTreeApiService.java | 64 + .../service/DataSetTreeApiServiceImpl.java | 542 +++ .../dataSets/service/DataSetsApiService.java | 105 + .../service/DataSetsApiServiceImpl.java | 765 ++++ .../service/TreeIndexNoApiService.java | 7 + .../service/TreeIndexNoApiServiceImpl.java | 39 + .../dataPool/bus/LogRabbitMQPublisher.java | 43 + .../dataPool/constants/DataPoolConstant.java | 33 + .../db/dao/DataResourcePackageDao.java | 44 + .../cctp/dataPool/db/dao/DataRuleDao.java | 53 + .../dataPool/db/dao/DataSetEnvRelDao.java | 31 + .../cctp/dataPool/db/dao/DataSetTreeDao.java | 60 + .../cctp/dataPool/db/dao/DataSetsDao.java | 50 + .../db/entity/DataResourcePackage.java | 286 ++ .../cctp/dataPool/db/entity/DataRule.java | 312 ++ .../dataPool/db/entity/DataSetEnvRel.java | 287 ++ .../cctp/dataPool/db/entity/DataSetTree.java | 395 ++ .../cctp/dataPool/db/entity/DataSets.java | 312 ++ .../impl/DataResourcePackageServiceImpl.java | 58 + .../dataPool/db/impl/DataRuleServiceImpl.java | 65 + .../db/impl/DataSetEnvRelServiceImpl.java | 70 + .../db/impl/DataSetTreeServiceImpl.java | 78 + .../dataPool/db/impl/DataSetsServiceImpl.java | 63 + .../db/mapper/DataResourcePackageMapper.java | 32 + .../dataPool/db/mapper/DataRuleMapper.java | 33 + .../db/mapper/DataSetEnvRelMapper.java | 32 + .../dataPool/db/mapper/DataSetTreeMapper.java | 37 + .../dataPool/db/mapper/DataSetsMapper.java | 33 + .../service/DataResourcePackageService.java | 40 + .../dataPool/db/service/DataRuleService.java | 48 + .../db/service/DataSetEnvRelService.java | 28 + .../db/service/DataSetTreeService.java | 41 + .../dataPool/db/service/DataSetsService.java | 41 + .../DataResourcePackageDetailDto.java | 35 + .../dataRule/DataResourcePackageInfoDto.java | 33 + .../dataRule/DataResourcePackageQueryDto.java | 67 + .../DataResourcePackageUpdateDto.java | 55 + .../dataPool/dto/dataRule/DataRuleAddDto.java | 98 + .../dto/dataRule/DataRuleDetailDto.java | 66 + .../dto/dataRule/DataRuleExecuteDto.java | 86 + .../dto/dataRule/DataRuleQueryDto.java | 100 + .../dto/dataRule/DataRuleUpdateDto.java | 113 + .../dataPool/dto/dataRule/UserQueryDto.java | 35 + .../dto/dataSets/AtuDataSetFeignDto.java | 26 + .../AtuScriptInputSetQuoteFeignDto.java | 14 + .../AtuScriptInputSetQuoteFieldDto.java | 110 + .../dataPool/dto/dataSets/ColumnCheckDto.java | 40 + .../dataPool/dto/dataSets/DataContentDto.java | 32 + .../dataPool/dto/dataSets/DataHeaderDto.java | 42 + .../dto/dataSets/DataSetEnvRelAddDto.java | 55 + .../dto/dataSets/DataSetEnvRelAddTmpDto.java | 58 + .../dto/dataSets/DataSetEnvRelQueryDto.java | 78 + .../dto/dataSets/DataSetTreeAddDto.java | 89 + .../dto/dataSets/DataSetTreeDetailDto.java | 50 + .../dto/dataSets/DataSetTreeMoveDto.java | 68 + .../dto/dataSets/DataSetTreeQueryDto.java | 103 + .../dto/dataSets/DataSetTreeUpdateDto.java | 81 + .../dataPool/dto/dataSets/DataSetsAddDto.java | 119 + .../dto/dataSets/DataSetsDeleteDto.java | 23 + .../dto/dataSets/DataSetsDetailDto.java | 70 + .../dto/dataSets/DataSetsQueryDto.java | 88 + .../dto/dataSets/DataSetsSaveDto.java | 75 + .../dto/dataSets/DataSetsUpdateDto.java | 100 + .../cctp/dataPool/enums/DataHeaderType.java | 35 + .../cctp/dataPool/enums/DataPoolError.java | 99 + .../dataPool/feign/AttachmentFeignClient.java | 29 + .../dataPool/feign/ProjectFeignClient.java | 26 + .../dataPool/feign/ScriptFeignClient.java | 19 + .../feign/dto/AtuInputDataSetResultDto.java | 25 + .../cctp/dataPool/utils/EnvNameUtils.java | 48 + .../cctp/dataPool/utils/ExcelUtils.java | 207 + .../cctp/dataPool/utils/MinioPathUtils.java | 140 + .../cctp/dataPool/utils/MyUrlClassLoader.java | 94 + .../cctp/dataPool/utils/ScriptUtil.java | 30 + .../src/main/resources/application.bak.yml | 93 + .../src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 112 + .../src/main/resources/logback-rabbitmq.xml | 86 + .../base/DataResourcePackage.Mapper.xml | 330 ++ .../mybatis/base/DataRule.Mapper.xml | 353 ++ .../mybatis/base/DataSetEnvRel.Mapper.xml | 337 ++ .../mybatis/base/DataSetTree.Mapper.xml | 445 +++ .../mybatis/base/DataSets.Mapper.xml | 353 ++ .../mybatis/ext/DataResourcePackage.Dao.xml | 115 + .../resources/mybatis/ext/DataRule.Dao.xml | 145 + .../mybatis/ext/DataSetEnvRel.Dao.xml | 46 + .../resources/mybatis/ext/DataSetTree.Dao.xml | 199 + .../resources/mybatis/ext/DataSets.Dao.xml | 145 + cctp-atu/atu-data-mgr/testDockerfile | 31 + .../atu-engine/atu-daemon-process/pom.xml | 101 + .../cctp/commands/CommandExecute.java | 24 + .../northking/cctp/commands/OSCommand.java | 5 + .../northking/cctp/commands/win/TaskKill.java | 166 + .../northking/cctp/commands/win/TaskList.java | 226 ++ .../cctp/daemon/DaemonApplication.java | 35 + .../cctp/daemon/config/DaemonProperties.java | 70 + .../cctp/daemon/config/EngineProperties.java | 102 + .../daemon/config/RestTemplateConfig.java | 27 + .../daemon/config/SwaggerConfiguration.java | 36 + .../cctp/daemon/entity/DaemonEngineInfo.java | 103 + .../cctp/daemon/entity/DaemonStatus.java | 15 + .../cctp/daemon/entity/ResultWrapper.java | 66 + .../daemon/entity/ScriptEngineVersion.java | 30 + .../DaemonEngineInfoRepository.java | 10 + .../daemon/schedule/ScriptEngineSchedule.java | 112 + .../cctp/daemon/schedule/UpgradeSchedule.java | 263 ++ .../cctp/daemon/service/AppLifecycle.java | 27 + .../cctp/daemon/service/DaemonService.java | 111 + .../daemon/service/DaemonServiceImpl.java | 166 + .../service/EngineServiceStartThread.java | 96 + .../cctp/daemon/service/Lifecycle.java | 18 + .../cctp/daemon/service/LifecycleCtrl.java | 27 + .../cctp/daemon/service/RobotProcess.java | 138 + .../daemon/service/ScriptEngineProcess.java | 174 + .../cctp/daemon/utils/FileUtils.java | 87 + .../resources/application-devFront-win.yml | 13 + .../main/resources/application-prod-win.yml | 13 + .../main/resources/application-test-win.yml | 13 + .../main/resources/application-uat-win.yml | 13 + .../src/main/resources/application.yml | 30 + .../src/main/resources/logback.xml | 35 + .../atu-engine/atu-daemon-process/start.bat | 6 + cctp-atu/atu-engine/atu-engine-dto/pom.xml | 23 + .../net/northking/cctp/se/dto/ATULog.java | 132 + .../cctp/se/dto/ATUWebSocketMessage.java | 38 + .../cctp/se/dto/ATUWebSocketPayload.java | 24 + .../cctp/se/dto/ATUWebSocketReplay.java | 55 + .../northking/cctp/se/dto/EngineStatus.java | 13 + .../cctp/se/dto/ScriptEngineInfo.java | 89 + .../northking/cctp/se/script/ATUScript.java | 148 + .../cctp/se/script/ScriptEnvironment.java | 8 + .../cctp/se/script/ScriptResource.java | 8 + .../northking/cctp/se/script/ScriptStep.java | 74 + .../cctp/se/script/ScriptTarget.java | 8 + .../cctp/se/script/ScriptVariable.java | 54 + .../atu-engine/atu-script-engine/Dockerfile | 25 + .../atu-script-engine/Dockerfile-dev | 27 + .../atu-script-engine/Dockerfile-prod | 28 + .../atu-script-engine/Dockerfile-test | 27 + .../atu-script-engine/Dockerfile-uat | 27 + .../atu-script-engine/docker-ctl.sh | 148 + cctp-atu/atu-engine/atu-script-engine/pom.xml | 192 + .../atu-script-engine/shell/startL.sh | 3 + .../atu-script-engine/shell/startW.bat | 6 + .../net/northking/cctp/se/EngineRunner.java | 27 + .../cctp/se/ScriptEngineApplication.java | 45 + .../cctp/se/component/ComLibraryInfoDto.java | 98 + .../cctp/se/component/ComponentLibrary.java | 9 + .../component/ComponentManagementService.java | 31 + .../cctp/se/component/ComponentManager.java | 46 + .../cctp/se/component/InternalComponent.java | 21 + .../component/LibraryDefinitionManager.java | 243 ++ .../se/component/LibraryUpdateSchedule.java | 123 + .../MdBusComponentInfoDetailDto.java | 304 ++ .../cctp/se/config/AtuServerConfig.java | 146 + .../cctp/se/config/CacheConfiguration.java | 190 + .../cctp/se/config/ExecutorPoolConfig.java | 64 + .../cctp/se/config/HttpErrorHandler.java | 24 + .../MobileAutomationSelectorConfig.java | 19 + .../cctp/se/config/RabbitMQConfig.java | 38 + .../cctp/se/config/RabbitMQConst.java | 23 + .../cctp/se/config/RestTemplateConfig.java | 25 + .../cctp/se/config/ScheduleConfig.java | 35 + .../cctp/se/config/SwaggerConfiguration.java | 36 + .../cctp/se/debug/bean/DebugerConst.java | 176 + .../cctp/se/debug/bean/DebuggerRequest.java | 129 + .../cctp/se/debug/bean/DebuggerResponse.java | 145 + .../cctp/se/debug/service/DebugService.java | 45 + .../cctp/se/debug/service/DebugSession.java | 68 + .../se/debug/service/DefaultDebugSession.java | 689 ++++ .../debug/service/impl/DebugServiceImpl.java | 214 ++ .../websocket/DebugWebSocketManager.java | 185 + .../se/debugger/ATUDebuggerLifecycle.java | 257 ++ .../se/debugger/AutomationTestDebugger.java | 38 + .../cctp/se/debugger/InterfaceDebugger.java | 27 + .../cctp/se/debugger/MobileDebugger.java | 29 + .../cctp/se/debugger/PCUIDebugger.java | 40 + .../se/debugger/WebSocketATUDebugger.java | 100 + .../DebuggerInterfaceWebSocketServer.java | 218 ++ .../endpoint/DebuggerPCUIWebSocketServer.java | 107 + .../endpoint/WebSocketConfiguration.java | 19 + .../debugger/pool/WebSocketDebuggerPool.java | 43 + .../pool/WebSocketInterfaceDebuggerPool.java | 118 + .../pool/WebSocketMobileDebuggerPool.java | 95 + .../pool/WebSocketPCUIDebuggerPool.java | 106 + .../device/bean/AbstractDeviceConnection.java | 69 + .../bean/AndroidMobileDeviceDriver.java | 48 + .../cctp/se/device/bean/AppPerInfo.java | 44 + .../se/device/bean/DebuggerDeviceInfo.java | 253 ++ .../cctp/se/device/bean/DeviceInfo.java | 30 + .../cctp/se/device/bean/DevicePerInfo.java | 44 + .../se/device/bean/IosMobileDeviceDriver.java | 47 + .../device/bean/MobileDeviceConnection.java | 998 +++++ .../se/device/bean/MobileDeviceDriver.java | 37 + .../device/bean/MobileDriverKeepThread.java | 46 + .../se/device/bean/PCDeviceConnection.java | 405 ++ .../cctp/se/device/bean/PCDeviceDriver.java | 77 + .../se/device/service/DeviceConnection.java | 102 + .../service/DeviceConnectionService.java | 36 + .../service/impl/DeviceConnectionManager.java | 166 + .../cctp/se/exec/ATUScriptInstance.java | 75 + .../northking/cctp/se/exec/AtuExecThread.java | 13 + .../cctp/se/exec/DefaultExecThread.java | 1057 ++++++ .../se/exec/constant/AtuExecConstant.java | 46 + .../northking/cctp/se/file/Attachment.java | 12 + .../cctp/se/lifecycle/DaemonProcess.java | 140 + .../cctp/se/lifecycle/EngineDestroy.java | 18 + .../se/lifecycle/EngineRegisterService.java | 264 ++ .../cctp/se/lifecycle/EngineRuntime.java | 56 + .../cctp/se/lifecycle/LifecycleCtrl.java | 126 + .../cctp/se/lifecycle/LifecycleSchedule.java | 136 + .../cctp/se/lifecycle/StopServerThread.java | 88 + .../se/lifecycle/constant/MQConstant.java | 17 + .../se/lifecycle/entity/AppLifecycle.java | 28 + .../se/lifecycle/entity/CdEngineInfo.java | 66 + .../entity/CdEngineInfoRegisterDto.java | 35 + .../entity/CdEngineInfoResultDto.java | 27 + .../cctp/se/lifecycle/entity/CdPcDevice.java | 53 + .../se/lifecycle/entity/HeartbeatInfoDto.java | 59 + .../cctp/se/lifecycle/entity/Lifecycle.java | 18 + .../lifecycle/entity/ThreadPoolAllowDto.java | 48 + .../cctp/se/lifecycle/win/CommandExecute.java | 23 + .../cctp/se/lifecycle/win/OSCommand.java | 5 + .../cctp/se/lifecycle/win/TaskKill.java | 165 + .../cctp/se/lifecycle/win/TaskList.java | 232 ++ .../cctp/se/log/bean/ExecuteLog.java | 36 + .../northking/cctp/se/log/bean/StepLog.java | 52 + .../cctp/se/plan/AtuPlanTaskSchedule.java | 373 ++ .../se/plan/AtuTaskExecHeartbeatSchedule.java | 55 + .../cctp/se/plan/AutomationTestPlanCtrl.java | 80 + .../northking/cctp/se/plan/bean/AutoTask.java | 243 ++ .../cctp/se/plan/bean/EnginePlanInfo.java | 142 + .../cctp/se/plan/bean/EnginePlanQuery.java | 98 + .../cctp/se/plan/bean/PlanDeviceInfo.java | 30 + .../cctp/se/plan/bean/QuoteData.java | 45 + .../cctp/se/plan/bean/TaskExecResult.java | 61 + .../plan/servcie/EnginePlanInfoService.java | 54 + .../servcie/EnginePlanInfoServiceImpl.java | 187 + .../se/plan/servcie/PlanDeviceService.java | 20 + .../plan/servcie/PlanDeviceServiceImpl.java | 153 + .../repository/EnginePlanInfoRepository.java | 42 + .../cctp/se/script/bean/LogicStepType.java | 21 + .../northking/cctp/se/script/bean/Script.java | 55 + .../cctp/se/script/bean/ScriptResource.java | 41 + .../cctp/se/script/bean/ScriptRuntime.java | 23 + .../cctp/se/script/bean/ScriptStep.java | 141 + .../cctp/se/script/bean/StepTarget.java | 27 + .../cctp/se/script/bean/TestTarget.java | 12 + .../cctp/se/script/bean/Variable.java | 45 + .../cctp/se/script/bean/VariableDto.java | 23 + .../se/script/core/IScriptRuntimeContext.java | 53 + .../se/script/core/ScriptExecuteResult.java | 49 + .../cctp/se/script/core/ScriptExecutor.java | 96 + .../script/core/ScriptResolutionService.java | 60 + .../se/script/core/ScriptRuntimeListener.java | 16 + .../se/script/core/StepExecuteResult.java | 61 + .../service/ScriptResolutionServiceImpl.java | 149 + .../script/service/ScriptRuntimeExecutor.java | 2057 ++++++++++ .../cctp/se/thread/ExecutorPool.java | 163 + .../northking/cctp/se/util/AndroidUtil.java | 170 + .../northking/cctp/se/util/ArgumentUtil.java | 180 + .../northking/cctp/se/util/ControlTarget.java | 38 + .../northking/cctp/se/util/ElementUtil.java | 409 ++ .../net/northking/cctp/se/util/HttpUtils.java | 198 + .../net/northking/cctp/se/util/IosUtil.java | 163 + .../net/northking/cctp/se/util/JsonUtils.java | 89 + .../northking/cctp/se/util/MobileUtil.java | 40 + .../northking/cctp/se/util/PointMessage.java | 41 + .../northking/cctp/se/util/RegexUtils.java | 96 + .../northking/cctp/se/util/SpringUtils.java | 28 + .../resources/application-devFront-linux.yml | 103 + .../resources/application-devFront-uos.yml | 88 + .../resources/application-devFront-win.yml | 93 + .../main/resources/application-prod-linux.yml | 101 + .../main/resources/application-prod-uos.yml | 88 + .../main/resources/application-prod-win.yml | 93 + .../main/resources/application-test-linux.yml | 104 + .../main/resources/application-test-uos.yml | 88 + .../main/resources/application-test-win.yml | 92 + .../main/resources/application-uat-linux.yml | 104 + .../main/resources/application-uat-uos.yml | 104 + .../main/resources/application-uat-win.yml | 94 + .../src/main/resources/application.yml | 35 + .../src/main/resources/logback.xml | 35 + .../cctp/se/util/RegexUtilsTests.java | 43 + cctp-atu/atu-engine/pom.xml | 96 + cctp-atu/atu-execute-plan/Dockerfile-dev | 40 + cctp-atu/atu-execute-plan/Dockerfile-prod | 40 + cctp-atu/atu-execute-plan/Dockerfile-test | 40 + cctp-atu/atu-execute-plan/Dockerfile-uat | 40 + cctp-atu/atu-execute-plan/docker-ctl.sh | 177 + cctp-atu/atu-execute-plan/pom.xml | 200 + cctp-atu/atu-execute-plan/shell/nk-ms.sh | 116 + .../executePlan/ExecutePlanApplication.java | 48 + .../executePlan/api/AtuPlanInfoBatchCtrl.java | 70 + .../executePlan/api/AtuPlanInfoPubCtrl.java | 108 + .../executePlan/api/AtuPlanInfoQueryCtrl.java | 313 ++ .../api/AtuPlanInfoRestfulCtrl.java | 229 ++ .../execplanTag/AtuExecplanTagQueryCtrl.java | 58 + .../AtuExecplanTagRestfulCtrl.java | 82 + .../service/AtuExecplanTagApiService.java | 41 + .../service/AtuExecplanTagApiServiceImpl.java | 125 + .../api/service/AtuPlanBatchApiService.java | 89 + .../service/AtuPlanBatchApiServiceImpl.java | 648 ++++ .../api/service/AtuPlanInfoApiService.java | 192 + .../service/AtuPlanInfoApiServiceImpl.java | 3356 +++++++++++++++++ .../AtuPlanSceneCaseTaskApiService.java | 16 + .../AtuPlanSceneCaseTaskApiServiceImpl.java | 461 +++ .../api/service/AtuPlanTaskApiService.java | 212 ++ .../service/AtuPlanTaskApiServiceImpl.java | 2182 +++++++++++ .../api/service/MessageCenterService.java | 8 + .../api/service/MessageCenterServiceImpl.java | 123 + .../service/MqSynchronizeTaskApiService.java | 11 + .../MqSynchronizeTaskApiServiceImpl.java | 24 + .../api/third/common/ResponseEntity.java | 39 + .../api/third/common/ThirdConstant.java | 14 + .../api/third/devops/DevopsPubCtrl.java | 122 + .../third/devops/dto/DevopsCaseInfoDto.java | 68 + .../devops/dto/DevopsDoExecplanParamDto.java | 66 + .../dto/DevopsExecplanInfoResultDto.java | 154 + .../devops/dto/DevopsProExecplanInfoDto.java | 57 + .../third/devops/service/DevopsService.java | 24 + .../devops/service/DevopsServiceImpl.java | 158 + .../third/feilang/config/FeilangConfig.java | 50 + .../dto/FeiLangExecplanInfoResultDto.java | 178 + .../api/third/feilang/dto/FeiLangUserDto.java | 34 + .../third/feilang/service/FeiLangService.java | 8 + .../feilang/service/FeiLangServiceImpl.java | 166 + .../api/third/util/FLHttpClientUtils.java | 85 + .../cctp/executePlan/bus/BusConstants.java | 17 + .../cctp/executePlan/bus/ScriptReceiver.java | 61 + .../executePlan/bus/SyncData2DwPublisher.java | 331 ++ .../cctp/executePlan/bus/log/CpLogAddDto.java | 182 + .../executePlan/bus/log/LogPublisher.java | 12 + .../bus/log/LogRabbitMQPublisher.java | 44 + .../executePlan/config/AtuPlanConfig.java | 24 + .../executePlan/config/WebhookConfig.java | 18 + .../executePlan/constants/DictConstant.java | 33 + .../executePlan/constants/MsgConstant.java | 284 ++ .../executePlan/constants/PlanConstant.java | 327 ++ .../executePlan/constants/QuartzConstant.java | 24 + .../executePlan/constants/RabbitConstant.java | 84 + .../executePlan/constants/RedisConstant.java | 62 + .../consumer/CreatedTaskConsumer.java | 157 + .../consumer/DeviceOfflineConsumer.java | 76 + .../consumer/PublishEntrustConsumer.java | 137 + .../consumer/TaskExecHeartbeatConsumer.java | 76 + .../consumer/TaskExecResultConsumer.java | 206 + .../consumer/TaskInputParamConsumer.java | 75 + .../consumer/TaskTimeoutDelayConsumer.java | 92 + .../executePlan/db/dao/AtuPlanAppLinkDao.java | 31 + .../executePlan/db/dao/AtuPlanBatchDao.java | 73 + .../db/dao/AtuPlanBatchDeviceLinkDao.java | 46 + .../db/dao/AtuPlanDeviceLinkDao.java | 32 + .../executePlan/db/dao/AtuPlanEnvLinkDao.java | 33 + .../executePlan/db/dao/AtuPlanInfoDao.java | 102 + .../db/dao/AtuPlanSceneCaseTaskDao.java | 90 + .../db/dao/AtuPlanScriptLinkDao.java | 29 + .../db/dao/AtuPlanScriptLinkMdDao.java | 33 + .../executePlan/db/dao/AtuPlanTaskDao.java | 135 + .../db/dao/AtuPlanTaskRecordDao.java | 30 + .../db/dao/MqSynchronizeTaskDao.java | 13 + .../executePlan/db/entity/AtuPlanAppLink.java | 154 + .../executePlan/db/entity/AtuPlanBatch.java | 501 +++ .../db/entity/AtuPlanBatchDeviceLink.java | 183 + .../db/entity/AtuPlanDeviceLink.java | 166 + .../executePlan/db/entity/AtuPlanEnvLink.java | 127 + .../executePlan/db/entity/AtuPlanInfo.java | 1027 +++++ .../db/entity/AtuPlanSceneCaseTask.java | 643 ++++ .../db/entity/AtuPlanScriptLink.java | 128 + .../db/entity/AtuPlanScriptLinkMd.java | 153 + .../executePlan/db/entity/AtuPlanTask.java | 667 ++++ .../db/entity/AtuPlanTaskRecord.java | 303 ++ .../db/entity/MqSynchronizeTask.java | 16 + .../db/impl/AtuPlanAppLinkServiceImpl.java | 71 + .../AtuPlanBatchDeviceLinkServiceImpl.java | 72 + .../db/impl/AtuPlanBatchServiceImpl.java | 102 + .../db/impl/AtuPlanDeviceLinkServiceImpl.java | 67 + .../db/impl/AtuPlanEnvLinkServiceImpl.java | 65 + .../db/impl/AtuPlanInfoServiceImpl.java | 172 + .../impl/AtuPlanSceneCaseTaskServiceImpl.java | 113 + .../impl/AtuPlanScriptLinkMdServiceImpl.java | 102 + .../db/impl/AtuPlanScriptLinkServiceImpl.java | 73 + .../db/impl/AtuPlanTaskRecordServiceImpl.java | 74 + .../db/impl/AtuPlanTaskServiceImpl.java | 192 + .../db/impl/MqSynchronizeTaskServiceImpl.java | 40 + .../db/mapper/AtuPlanAppLinkMapper.java | 27 + .../mapper/AtuPlanBatchDeviceLinkMapper.java | 28 + .../db/mapper/AtuPlanBatchMapper.java | 40 + .../db/mapper/AtuPlanDeviceLinkMapper.java | 27 + .../db/mapper/AtuPlanEnvLinkMapper.java | 26 + .../db/mapper/AtuPlanInfoMapper.java | 61 + .../db/mapper/AtuPlanSceneCaseTaskMapper.java | 47 + .../db/mapper/AtuPlanScriptLinkMapper.java | 26 + .../db/mapper/AtuPlanScriptLinkMdMapper.java | 27 + .../db/mapper/AtuPlanTaskMapper.java | 48 + .../db/mapper/AtuPlanTaskRecordMapper.java | 33 + .../db/mapper/MqSynchronizeTaskMapper.java | 26 + .../db/service/AtuPlanAppLinkService.java | 29 + .../AtuPlanBatchDeviceLinkService.java | 42 + .../db/service/AtuPlanBatchService.java | 55 + .../db/service/AtuPlanDeviceLinkService.java | 21 + .../db/service/AtuPlanEnvLinkService.java | 32 + .../db/service/AtuPlanInfoService.java | 94 + .../service/AtuPlanSceneCaseTaskService.java | 90 + .../service/AtuPlanScriptLinkMdService.java | 35 + .../db/service/AtuPlanScriptLinkService.java | 32 + .../db/service/AtuPlanTaskRecordService.java | 30 + .../db/service/AtuPlanTaskService.java | 139 + .../db/service/MqSynchronizeTaskService.java | 24 + .../dto/execplanTag/AtuExecplanTagAddDto.java | 48 + .../execplanTag/AtuExecplanTagDetailDto.java | 24 + .../dto/execplanTag/AtuExexplanTagDto.java | 41 + .../dto/execplanTag/TagInfoDto.java | 41 + .../dto/planBatch/AppBaseInfoDto.java | 83 + .../dto/planBatch/AppDetailDto.java | 206 + .../executePlan/dto/planBatch/AppPerInfo.java | 44 + .../dto/planBatch/AtuBatchCaseInfoDto.java | 239 ++ .../dto/planBatch/AtuBatchSumDataDto.java | 56 + .../dto/planBatch/AtuBatchTaskPageDto.java | 27 + .../dto/planBatch/AtuExceptionCase.java | 175 + .../dto/planBatch/AtuPlanBatchDetailDto.java | 43 + .../dto/planBatch/AtuPlanBatchDto.java | 94 + .../dto/planBatch/AtuPlanBatchPageDto.java | 292 ++ .../dto/planBatch/AtuPlanBatchQueryDto.java | 52 + .../dto/planBatch/AtuPlanBatchReportDto.java | 43 + .../dto/planBatch/BatchAppInfoDto.java | 308 ++ .../dto/planBatch/BatchInfoReportDto.java | 172 + .../planBatch/BatchMobilePerformanceDto.java | 98 + .../dto/planBatch/BatchRetryDto.java | 38 + .../planBatch/BatchScriptExecDetailDto.java | 129 + .../dto/planBatch/BatchScriptReportDto.java | 89 + .../dto/planBatch/BatchStrategyDto.java | 132 + .../dto/planBatch/DeviceOfflineMsgDto.java | 57 + .../dto/planBatch/DevicePerInfo.java | 44 + .../planBatch/MobileTaskPerformanceDto.java | 116 + .../executePlan/dto/planBatch/PageEvent.java | 72 + .../dto/planBatch/SceneCaseStopDto.java | 39 + .../dto/planEntrust/AtuEntrustInfoDto.java | 95 + .../dto/planEntrust/AtuEntrustMsgDto.java | 55 + .../dto/planEntrust/DeviceListDto.java | 41 + .../dto/planEntrust/EngineInfoListDto.java | 42 + .../dto/planEntrust/EntrustDeviceDto.java | 36 + .../executePlan/dto/planInfo/AppList.java | 39 + .../dto/planInfo/AtuPlanExportDto.java | 28 + .../dto/planInfo/AtuPlanInfoAddDto.java | 354 ++ .../planInfo/AtuPlanInfoAppAndDeviceDto.java | 43 + .../dto/planInfo/AtuPlanInfoDetailDto.java | 652 ++++ .../dto/planInfo/AtuPlanInfoPageDto.java | 42 + .../dto/planInfo/AtuPlanInfoQueryDto.java | 245 ++ .../dto/planInfo/AtuPlanInfoUpdateDto.java | 373 ++ .../dto/planInfo/AtuPlanPrincipalDto.java | 27 + .../dto/planInfo/AtuPlanRunDto.java | 70 + .../executePlan/dto/planInfo/DeviceList.java | 61 + .../executePlan/dto/planInfo/SelectSets.java | 39 + .../dto/planLink/AtuPlanAppLinkDetailDto.java | 18 + .../planLink/AtuPlanCaseSetLinkDetailDto.java | 17 + .../dto/planLink/AtuPlanEnvLinkDetailDto.java | 73 + .../AtuPlanScriptInputLinkDetailDto.java | 43 + .../planLink/AtuPlanScriptLinkDetailDto.java | 75 + .../dto/planLink/ProjectEnvCheckDto.java | 36 + .../AtuPlanSceneCaseTaskDetailDto.java | 70 + .../AtuPlanSceneCaseTaskQueryDto.java | 59 + .../planSceneCase/AtuSceneNextNodeDto.java | 52 + .../planSceneCase/AtuSceneNodeExecDto.java | 56 + .../planSceneCase/AtuSceneNodeInfoDto.java | 159 + .../planSceneCase/CdEngineInfoDetailDto.java | 161 + .../dto/planSceneCase/SceneFirstNodeDto.java | 36 + .../planScript/AtuPlanScriptDeleteDto.java | 40 + .../dto/planScript/AtuPlanScriptDto.java | 52 + .../dto/planScript/AtuPlanScriptInputDto.java | 36 + .../dto/planScript/AtuPlanScriptLinkDto.java | 19 + .../dto/planScript/AtuPlanScriptPageDto.java | 16 + .../dto/planScript/AtuPlanScriptQueryDto.java | 13 + .../planScript/AtuPlanScriptResultDto.java | 107 + .../dto/planScript/AtuPlanScriptSaveDto.java | 63 + .../dto/planTask/AppPerInfoDataDto.java | 52 + .../dto/planTask/AtuPlanInputDto.java | 32 + .../dto/planTask/AtuPlanInputQueryDto.java | 37 + .../dto/planTask/AtuPlanTaskDetailDto.java | 229 ++ .../dto/planTask/AtuPlanTaskExtendDto.java | 26 + .../dto/planTask/AtuPlanTaskPageDto.java | 409 ++ .../dto/planTask/AtuPlanTaskQueryDto.java | 100 + .../dto/planTask/AtuScriptDetailDto.java | 134 + .../dto/planTask/AtuTaskCreateDto.java | 72 + .../dto/planTask/AtuTaskExecDto.java | 233 ++ .../dto/planTask/AtuTaskExecResultDto.java | 239 ++ .../dto/planTask/AtuTaskSendBugDto.java | 86 + .../dto/planTask/AtuTaskSumDataDto.java | 77 + .../dto/planTask/AtuVariableDto.java | 68 + .../executePlan/dto/planTask/BugAddDto.java | 125 + .../dto/planTask/DeviceInfoDto.java | 16 + .../dto/planTask/DevicePerInfoDataDto.java | 64 + .../dto/planTask/PlanTaskRecordDto.java | 24 + .../executePlan/dto/planTask/QuoteData.java | 101 + .../dto/planTask/SceneNodeDto.java | 50 + .../dto/planTask/ScriptInputFileDto.java | 28 + .../executePlan/dto/planTask/ScriptStep.java | 155 + .../dto/planTask/StepExecuteResult.java | 187 + .../dto/planTask/TaskCaseStepDetailDto.java | 177 + .../cctp/executePlan/enums/ErrorMessage.java | 28 + .../cctp/executePlan/enums/HtmlSpaceEnum.java | 53 + .../executePlan/enums/MobilePlatformEnum.java | 41 + .../cctp/executePlan/enums/TaskTypeEnum.java | 17 + .../executePlan/exception/ExecPlanError.java | 122 + .../feign/ApiCommonCenterService.java | 23 + .../feign/ApiMonsterCommonService.java | 37 + .../feign/ApiMonsterDictService.java | 41 + .../cctp/executePlan/feign/ApiTagService.java | 61 + .../feign/AttachmentFeignClient.java | 70 + .../executePlan/feign/DeviceFeignClient.java | 44 + .../feign/PlatformFeignClient.java | 34 + .../executePlan/feign/PublicFeignClient.java | 136 + .../feign/ScriptCaseFeignClient.java | 73 + .../cctp/executePlan/feign/dto/App.java | 257 ++ .../feign/dto/AtuCaseScriptResultDto.java | 283 ++ .../feign/dto/AtuCaseSetAppDto.java | 20 + .../feign/dto/AtuCaseSetCheckDto.java | 63 + .../feign/dto/AtuCaseSetCountDto.java | 28 + .../feign/dto/AtuCaseSetFeignDto.java | 54 + .../feign/dto/AtuCaseSetResultDto.java | 106 + .../feign/dto/AtuPlanScriptReturnDto.java | 27 + .../feign/dto/AtuSceneInfoDetailDto.java | 138 + .../executePlan/feign/dto/AtuScriptInfo.java | 255 ++ .../feign/dto/AtuScriptInfoDetailDto.java | 20 + .../feign/dto/AtuScriptInfoFeignDto.java | 42 + .../feign/dto/AtuScriptInfoResultDto.java | 100 + .../executePlan/feign/dto/CltDictItem.java | 355 ++ .../feign/dto/DictCatalogSearchDto.java | 35 + .../dto/MdBusComponentInfoDetailDto.java | 304 ++ .../feign/dto/PlanPageQueryDto.java | 13 + .../feign/dto/PlanScriptPageDto.java | 13 + .../feign/dto/PlanScriptQueryPageDto.java | 13 + .../executePlan/feign/dto/UserQueryDto.java | 18 + .../job/PlanBatchTaskDataUpdateJob.java | 711 ++++ .../executePlan/job/TaskExecTimeoutJob.java | 137 + .../ats/TestPlanExecutionToAtsReportPub.java | 33 + .../pub/dto/ScriptFirstExecutionDTO.java | 21 + .../dto/TestPlanScriptExecutionDetailDTO.java | 73 + .../executePlan/quartz/AbstractQuartzJob.java | 100 + .../executePlan/quartz/JobInvokeUtil.java | 73 + .../executePlan/quartz/PlanTaskExecute.java | 39 + .../quartz/QuartzJobExecution.java | 29 + .../executePlan/quartz/ScheduleConfig.java | 59 + .../executePlan/quartz/ScheduleUtils.java | 168 + .../cctp/executePlan/utils/EnvNameUtils.java | 48 + .../executePlan/utils/MinioPathUtils.java | 167 + .../utils/PercentageCalculatorUtil.java | 143 + .../cctp/executePlan/utils/WordUtils.java | 104 + .../cctp/platform/db/entity/CltDictItem.java | 355 ++ .../src/main/resources/application.bak.yml | 70 + .../src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 115 + .../src/main/resources/logback-rabbitmq.xml | 86 + .../resources/lua/batchScriptSumDataCache.lua | 74 + .../main/resources/lua/taskRetryInitCache.lua | 76 + .../mybatis/base/AtuPlanAppLink.Mapper.xml | 222 ++ .../mybatis/base/AtuPlanBatch.Mapper.xml | 521 +++ .../base/AtuPlanBatchDeviceLink.Mapper.xml | 245 ++ .../mybatis/base/AtuPlanDeviceLink.Mapper.xml | 245 ++ .../mybatis/base/AtuPlanEnvLink.Mapper.xml | 197 + .../mybatis/base/AtuPlanInfo.Mapper.xml | 1047 +++++ .../base/AtuPlanSceneCaseTask.Mapper.xml | 682 ++++ .../mybatis/base/AtuPlanScriptLink.Mapper.xml | 197 + .../base/AtuPlanScriptLinkMd.Mapper.xml | 222 ++ .../mybatis/base/AtuPlanTask.Mapper.xml | 705 ++++ .../mybatis/base/AtuPlanTaskRecord.Mapper.xml | 360 ++ .../mybatis/base/MqSynchronizeTask.Mapper.xml | 199 + .../mybatis/ext/AtuPlanAppLink.Dao.xml | 66 + .../mybatis/ext/AtuPlanBatch.Dao.xml | 206 + .../ext/AtuPlanBatchDeviceLink.Dao.xml | 25 + .../mybatis/ext/AtuPlanDeviceLink.Dao.xml | 21 + .../mybatis/ext/AtuPlanEnvLink.Dao.xml | 70 + .../resources/mybatis/ext/AtuPlanInfo.Dao.xml | 598 +++ .../mybatis/ext/AtuPlanSceneCaseTask.Dao.xml | 252 ++ .../mybatis/ext/AtuPlanScriptLink.Dao.xml | 76 + .../mybatis/ext/AtuPlanScriptLinkMd.Dao.xml | 113 + .../resources/mybatis/ext/AtuPlanTask.Dao.xml | 369 ++ .../mybatis/ext/AtuPlanTaskRecord.Dao.xml | 39 + .../mybatis/ext/MqSynchronizeTask.Dao.xml | 62 + .../static/icon/app/appInstallTime.png | Bin 0 -> 7303 bytes .../static/icon/app/appStartTime.png | Bin 0 -> 5448 bytes .../main/resources/static/icon/app/cpu.png | Bin 0 -> 6920 bytes .../main/resources/static/icon/app/flow.png | Bin 0 -> 6379 bytes .../main/resources/static/icon/app/memory.png | Bin 0 -> 4681 bytes .../main/resources/static/icon/device/cpu.png | Bin 0 -> 6920 bytes .../resources/static/icon/device/flow.png | Bin 0 -> 6379 bytes .../resources/static/icon/device/memory.png | Bin 0 -> 4681 bytes .../static/icon/device/temperature.png | Bin 0 -> 6472 bytes .../src/main/resources/templates/pdfTemp.pdf | Bin 0 -> 39626 bytes .../templates/taskReportTemplate.docx | Bin 0 -> 11654 bytes cctp-atu/atu-execute-plan/testDockerfile | 31 + cctp-atu/atu-mobile-driver/pom.xml | 29 + .../driver/constans/AutomationRequestCmd.java | 66 + .../mobile/driver/driver/MobileDriver.java | 81 + .../driver/entity/CmdAutomationRequest.java | 75 + .../driver/entity/CmdAutomationResponse.java | 134 + .../websocket/AutomationSocketClient.java | 79 + .../atu-mobile-script-debuger/Dockerfile-dev | 40 + .../atu-mobile-script-debuger/Dockerfile-prod | 40 + .../atu-mobile-script-debuger/Dockerfile-test | 40 + .../atu-mobile-script-debuger/Dockerfile-uat | 40 + .../atu-mobile-script-debuger/docker-ctl.sh | 178 + cctp-atu/atu-mobile-script-debuger/pom.xml | 101 + .../shell/docker-build.sh | 71 + .../shell/docker-start.sh | 78 + .../atu-mobile-script-debuger/shell/nk-ms.sh | 116 + .../MobileScriptDebugerApplication.java | 29 + .../cctp/debuger/bean/DebugerConst.java | 151 + .../cctp/debuger/bean/DebugerRequest.java | 112 + .../cctp/debuger/bean/DebugerResponse.java | 106 + .../cctp/debuger/config/RabbitMQConfig.java | 36 + .../cctp/debuger/config/WebSocketConfig.java | 14 + .../MobileScriptDebugerConstant.java | 33 + .../cctp/debuger/feign/DeviceFeignClient.java | 22 + .../debuger/listener/WebClientListener.java | 58 + .../debuger/service/DeviceInfoService.java | 26 + .../service/DeviceInfoServiceImpl.java | 72 + .../service/InterfaceScriptDebugService.java | 12 + .../InterfaceScriptDebugServiceImpl.java | 447 +++ .../service/MobileScriptDebugService.java | 23 + .../service/MobileScriptDebugServiceImpl.java | 344 ++ .../cctp/debuger/util/JsonUtils.java | 66 + .../cctp/debuger/util/SpringUtils.java | 24 + .../debuger/websocket/MessageHandler.java | 5 + .../websocket/WSApiSessionManager.java | 121 + .../debuger/websocket/WSSessionManager.java | 176 + .../websocket/WebSocketClientChannel.java | 86 + .../src/main/resources/application_bak.yml | 0 .../src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 114 + .../src/main/resources/logback-rabbitmq.xml | 86 + .../atu-mobile-script-debuger/testDockerfile | 31 + cctp-atu/atu-pc-driver/pom.xml | 37 + .../cctp/pc/driver/constants/PCConstant.java | 44 + .../cctp/pc/driver/dto/EngineResultDto.java | 77 + .../cctp/pc/driver/socket/PCDriver.java | 107 + cctp-atu/atu-script-case/Dockerfile-dev | 40 + cctp-atu/atu-script-case/Dockerfile-prod | 40 + cctp-atu/atu-script-case/Dockerfile-test | 40 + cctp-atu/atu-script-case/Dockerfile-uat | 40 + .../atu-script-case.deployment.yaml | 76 + cctp-atu/atu-script-case/docker-ctl.sh | 178 + cctp-atu/atu-script-case/logback-rabbitmq.xml | 86 + cctp-atu/atu-script-case/pom.xml | 210 ++ cctp-atu/atu-script-case/shell/nk-ms.sh | 116 + .../cctp/platform/db/entity/CpEnv.java | 284 ++ .../scriptcase/ScriptCaseApplication.java | 49 + .../cctp/scriptcase/api/app/AppBatchCtrl.java | 100 + .../cctp/scriptcase/api/app/AppCtrl.java | 71 + .../cctp/scriptcase/api/app/AppPubCtrl.java | 60 + .../cctp/scriptcase/api/app/AppQueryCtrl.java | 102 + .../scriptcase/api/app/AppRestfulCtrl.java | 115 + .../api/app/service/AppApiService.java | 102 + .../api/app/service/AppApiServiceImpl.java | 484 +++ .../api/app/service/FileMinioServiceImpl.java | 537 +++ .../api/app/service/FileService.java | 16 + .../api/ats/AtsTestElementCtrl.java | 76 + .../ats/service/AtsTestElementApiService.java | 16 + .../service/AtsTestElementApiServiceImpl.java | 70 + .../api/atuScript/ScriptInfoCtrl.java | 279 ++ .../api/atuScript/ScriptPubCtrl.java | 83 + .../api/atuScript/ScriptTagCtrl.java | 71 + .../api/atuScript/ScriptTreeCtrl.java | 130 + .../api/atuScript/ScriptVersionCtrl.java | 43 + .../service/AtuScriptGroupApiService.java | 69 + .../service/AtuScriptGroupApiServiceImpl.java | 273 ++ .../service/AtuScriptInfoApiService.java | 161 + .../service/AtuScriptInfoApiServiceImpl.java | 2422 ++++++++++++ .../service/AtuScriptTagApiService.java | 44 + .../service/AtuScriptTagApiServiceImpl.java | 109 + .../service/AtuScriptVersionApiService.java | 38 + .../AtuScriptVersionApiServiceImpl.java | 114 + .../AtuGlobalVariableRestfulCtrl.java | 120 + .../atuscriptrecord/AtuInputRestfulCtrl.java | 127 + .../AtuScriptInputSetCtrl.java | 149 + .../service/AtuGlobalVariableApiService.java | 95 + .../AtuGlobalVariableApiServiceImpl.java | 260 ++ .../service/AtuInputApiService.java | 36 + .../service/AtuInputApiServiceImpl.java | 366 ++ .../service/AtuScriptInputSetApiService.java | 97 + .../AtuScriptInputSetApiServiceImpl.java | 1179 ++++++ .../AtuScriptInputSetVersionApiService.java | 85 + ...tuScriptInputSetVersionApiServiceImpl.java | 186 + .../caseDataSet/AtuCaseDataSetBatchCtrl.java | 100 + .../caseDataSet/AtuCaseDataSetQueryCtrl.java | 140 + .../AtuCaseDataSetRestfulCtrl.java | 114 + .../service/AtuCaseDataSetApiService.java | 126 + .../service/AtuCaseDataSetApiServiceImpl.java | 938 +++++ .../casedesign/AtuProjectEnvRestfulCtrl.java | 65 + .../service/AtuCaseInfoApiServiceImpl.java | 0 .../service/AtuProjectEnvApiService.java | 26 + .../service/AtuProjectEnvApiServiceImpl.java | 77 + .../service/MqSynchronizeTaskApiService.java | 88 + .../MqSynchronizeTaskApiServiceImpl.java | 189 + .../comLib/LibraryBusComInfoQueryCtrl.java | 73 + .../comLib/LibraryBusComInfoRestfulCtrl.java | 56 + .../comLib/LibraryBusComTreeRestfulCtrl.java | 140 + .../service/LibraryBusComInfoApiService.java | 49 + .../LibraryBusComInfoApiServiceImpl.java | 223 ++ .../service/LibraryBusComTreeApiService.java | 49 + .../LibraryBusComTreeApiServiceImpl.java | 262 ++ .../BusComponentTreeRestfulCtrl.java | 136 + .../component/HisBusComInfoRestfulCtrl.java | 53 + .../component/HisUseComponentRestfulCtrl.java | 68 + .../api/component/MdBusComInfoPubCtrl.java | 55 + .../api/component/MdBusComInfoQueryCtrl.java | 89 + .../component/MdBusComInfoRestfulCtrl.java | 161 + .../ReBusComponentInfoRestfulCtrl.java | 99 + .../service/AtuBusinessNoApiService.java | 17 + .../service/AtuBusinessNoApiServiceImpl.java | 57 + .../service/BusComponentTreeApiService.java | 49 + .../BusComponentTreeApiServiceImpl.java | 335 ++ .../HisBusComponentInfoApiService.java | 20 + .../HisBusComponentInfoApiServiceImpl.java | 98 + .../service/HisUseComponentApiService.java | 22 + .../HisUseComponentApiServiceImpl.java | 165 + .../service/MdBusComponentInfoApiService.java | 95 + .../MdBusComponentInfoApiServiceImpl.java | 740 ++++ .../service/ReBusComponentInfoApiService.java | 27 + .../ReBusComponentInfoApiServiceImpl.java | 624 +++ .../service/SequenceStorageImpl.java | 64 + .../api/component/ws/JSchConnectWS.java | 153 + .../AtuElementGroupRestfulCtrl.java | 143 + .../AtuElementInfoRestfulCtrl.java | 209 + .../service/AtuElementGroupApiService.java | 72 + .../AtuElementGroupApiServiceImpl.java | 550 +++ .../service/AtuElementInfoApiService.java | 90 + .../service/AtuElementInfoApiServiceImpl.java | 680 ++++ .../api/inputSet/AtuInputSetBatchCtrl.java | 98 + .../api/inputSet/AtuInputSetPubCtrl.java | 71 + .../api/inputSet/AtuInputSetQueryCtrl.java | 157 + .../api/inputSet/AtuInputSetRestfulCtrl.java | 112 + .../service/AtuInputSetApiService.java | 112 + .../service/AtuInputSetApiServiceImpl.java | 774 ++++ .../cctp/scriptcase/api/nlp/NLPPubCtrl.java | 43 + .../api/nlp/service/MuteCustomDictionary.java | 9 + .../api/nlp/service/NLPService.java | 7 + .../nlp/service/RedisCustomDictionary.java | 61 + .../api/nlp/service/impl/NLPServiceImpl.java | 53 + .../api/scenescript/SceneCoordinatorCtrl.java | 62 + .../api/scenescript/SceneScriptCtrl.java | 122 + .../api/scenescript/bean/Inputs.java | 18 + .../scriptcase/api/scenescript/bean/Line.java | 29 + .../scriptcase/api/scenescript/bean/Node.java | 36 + .../api/scenescript/bean/Outputs.java | 16 + .../api/scenescript/bean/Point.java | 14 + .../api/scenescript/bean/SceneScript.java | 34 + .../api/scenescript/bean/Variable.java | 28 + .../service/AtuSceneScriptApiService.java | 54 + .../service/AtuSceneScriptApiServiceImpl.java | 944 +++++ .../service/SceneDataVerifier.java | 74 + .../coordinate/SceneCoordinatorService.java | 707 ++++ .../service/verfiy/IDataVerify.java | 5 + .../service/verfiy/SceneNameVerify.java | 50 + .../service/verfiy/SceneNodeNameVerify.java | 45 + .../service/verfiy/SceneRelationVerify.java | 58 + .../service/verfiy/UserCaseDataVerify.java | 46 + .../service/verfiy/VariableVerify.java | 94 + .../scriptcase/bus/AppRabbitMQPublisher.java | 56 + .../scriptcase/bus/LogRabbitMQPublisher.java | 42 + .../cctp/scriptcase/bus/NoticePublisher.java | 7 + .../bus/NoticeRabbitMQPublisher.java | 97 + .../scriptcase/bus/PlanRabbitMQPublisher.java | 37 + .../scriptcase/bus/SyncData2DwPublisher.java | 148 + .../scriptcase/config/WebSocketConfig.java | 13 + .../scriptcase/constants/RedisConstant.java | 6 + .../scriptcase/constants/ScriptConstant.java | 356 ++ .../cctp/scriptcase/db/dao/AppDao.java | 39 + .../scriptcase/db/dao/AtuBusinessNoDao.java | 25 + .../scriptcase/db/dao/AtuCaseDataSetDao.java | 68 + .../scriptcase/db/dao/AtuElementGroupDao.java | 44 + .../scriptcase/db/dao/AtuElementInfoDao.java | 42 + .../db/dao/AtuGlobalVariableDao.java | 27 + .../scriptcase/db/dao/AtuInputSetDao.java | 43 + .../scriptcase/db/dao/AtuSceneInfoDao.java | 51 + .../db/dao/AtuSceneNodeInfoDao.java | 32 + .../scriptcase/db/dao/AtuScriptGroupDao.java | 91 + .../scriptcase/db/dao/AtuScriptInfoDao.java | 103 + .../db/dao/AtuScriptInputSetDao.java | 24 + .../db/dao/AtuScriptInputSetVersionDao.java | 24 + .../scriptcase/db/dao/AtuScriptTagDao.java | 33 + .../db/dao/AtuScriptVersionDao.java | 41 + .../db/dao/BusComponentTreeDao.java | 43 + .../scriptcase/db/dao/HisUseComponentDao.java | 27 + .../db/dao/LibraryBusComInfoDao.java | 35 + .../db/dao/LibraryBusComTreeDao.java | 38 + .../db/dao/MdBusComponentInfoDao.java | 46 + .../db/dao/MdComponentParamDao.java | 24 + .../db/dao/MqSynchronizeTaskDao.java | 29 + .../cctp/scriptcase/db/entity/App.java | 476 +++ .../scriptcase/db/entity/AtuBusinessNo.java | 261 ++ .../scriptcase/db/entity/AtuCaseDataSet.java | 396 ++ .../scriptcase/db/entity/AtuElementGroup.java | 404 ++ .../scriptcase/db/entity/AtuElementInfo.java | 404 ++ .../db/entity/AtuGlobalVariable.java | 381 ++ .../scriptcase/db/entity/AtuInputSet.java | 261 ++ .../scriptcase/db/entity/AtuProjectEnv.java | 275 ++ .../scriptcase/db/entity/AtuSceneInfo.java | 359 ++ .../db/entity/AtuSceneNodeInfo.java | 286 ++ .../scriptcase/db/entity/AtuScriptGroup.java | 405 ++ .../scriptcase/db/entity/AtuScriptInfo.java | 471 +++ .../db/entity/AtuScriptInputSet.java | 262 ++ .../db/entity/AtuScriptInputSetVersion.java | 208 + .../scriptcase/db/entity/AtuScriptTag.java | 248 ++ .../db/entity/AtuScriptVersion.java | 343 ++ .../db/entity/BusComponentTree.java | 427 +++ .../scriptcase/db/entity/FileMessage.java | 60 + .../scriptcase/db/entity/HisUseComponent.java | 307 ++ .../db/entity/LibraryBusComInfo.java | 427 +++ .../db/entity/LibraryBusComTree.java | 403 ++ .../db/entity/MdBusComponentInfo.java | 474 +++ .../db/entity/MdComponentParam.java | 238 ++ .../db/entity/MqSynchronizeTask.java | 136 + .../db/entity/ReBusComponentInfo.java | 437 +++ .../scriptcase/db/impl/AppServiceImpl.java | 146 + .../db/impl/AtuBusinessNoServiceImpl.java | 54 + .../db/impl/AtuCaseDataSetServiceImpl.java | 197 + .../db/impl/AtuElementGroupServiceImpl.java | 84 + .../db/impl/AtuElementInfoServiceImpl.java | 94 + .../db/impl/AtuGlobalVariableServiceImpl.java | 80 + .../db/impl/AtuInputSetServiceImpl.java | 89 + .../db/impl/AtuSceneInfoServiceImpl.java | 117 + .../db/impl/AtuSceneNodeInfoServiceImpl.java | 76 + .../db/impl/AtuScriptGroupServiceImpl.java | 556 +++ .../db/impl/AtuScriptInfoServiceImpl.java | 172 + .../db/impl/AtuScriptInputSetServiceImpl.java | 108 + .../AtuScriptInputSetVersionServiceImpl.java | 59 + .../db/impl/AtuScriptTagServiceImpl.java | 152 + .../db/impl/AtuScriptVersionServiceImpl.java | 60 + .../db/impl/BusComponentTreeServiceImpl.java | 101 + .../db/impl/HisUseComponentServiceImpl.java | 59 + .../db/impl/LibraryBusComInfoServiceImpl.java | 117 + .../db/impl/LibraryBusComTreeServiceImpl.java | 85 + .../impl/MdBusComponentInfoServiceImpl.java | 137 + .../db/impl/MdComponentParamServiceImpl.java | 49 + .../db/impl/MqSynchronizeTaskServiceImpl.java | 66 + .../cctp/scriptcase/db/mapper/AppMapper.java | 40 + .../db/mapper/AtuBusinessNoMapper.java | 31 + .../db/mapper/AtuCaseDataSetMapper.java | 34 + .../db/mapper/AtuElementGroupMapper.java | 37 + .../db/mapper/AtuElementInfoMapper.java | 37 + .../db/mapper/AtuGlobalVariableMapper.java | 36 + .../db/mapper/AtuInputSetMapper.java | 31 + .../db/mapper/AtuSceneInfoMapper.java | 34 + .../db/mapper/AtuSceneNodeInfoMapper.java | 32 + .../db/mapper/AtuScriptGroupMapper.java | 37 + .../db/mapper/AtuScriptInfoMapper.java | 39 + .../db/mapper/AtuScriptInputSetMapper.java | 31 + .../AtuScriptInputSetVersionMapper.java | 29 + .../db/mapper/AtuScriptTagMapper.java | 30 + .../db/mapper/AtuScriptVersionMapper.java | 34 + .../db/mapper/BusComponentTreeMapper.java | 38 + .../db/mapper/HisUseComponentMapper.java | 33 + .../db/mapper/LibraryBusComInfoMapper.java | 38 + .../db/mapper/LibraryBusComTreeMapper.java | 37 + .../db/mapper/MdBusComponentInfoMapper.java | 40 + .../db/mapper/MdComponentParamMapper.java | 30 + .../db/mapper/MqSynchronizeTaskMapper.java | 26 + .../scriptcase/db/service/AppService.java | 42 + .../db/service/AtuBusinessNoService.java | 25 + .../db/service/AtuCaseDataSetService.java | 73 + .../db/service/AtuElementGroupService.java | 77 + .../db/service/AtuElementInfoService.java | 66 + .../db/service/AtuGlobalVariableService.java | 28 + .../db/service/AtuInputSetService.java | 42 + .../db/service/AtuSceneInfoService.java | 47 + .../db/service/AtuSceneNodeInfoService.java | 30 + .../db/service/AtuScriptGroupService.java | 87 + .../db/service/AtuScriptInfoService.java | 107 + .../db/service/AtuScriptInputSetService.java | 31 + .../AtuScriptInputSetVersionService.java | 24 + .../db/service/AtuScriptTagService.java | 48 + .../db/service/AtuScriptVersionService.java | 34 + .../db/service/BusComponentTreeService.java | 42 + .../db/service/HisUseComponentService.java | 26 + .../db/service/LibraryBusComInfoService.java | 37 + .../db/service/LibraryBusComTreeService.java | 35 + .../db/service/MdBusComponentInfoService.java | 45 + .../db/service/MdComponentParamService.java | 24 + .../db/service/MqSynchronizeTaskService.java | 27 + .../cctp/scriptcase/dto/IdAndStatusDto.java | 14 + .../cctp/scriptcase/dto/app/AppAddDto.java | 317 ++ .../dto/app/AppCreatedByDetailDto.java | 29 + .../dto/app/AppCreatedByQueryDto.java | 39 + .../cctp/scriptcase/dto/app/AppCreator.java | 29 + .../cctp/scriptcase/dto/app/AppDeleteDto.java | 13 + .../cctp/scriptcase/dto/app/AppDetailDto.java | 206 + .../dto/app/AppPackageAndNameDto.java | 29 + .../cctp/scriptcase/dto/app/AppQueryDto.java | 227 ++ .../cctp/scriptcase/dto/app/AppUpdateDto.java | 23 + .../dto/app/AppVersionQueryDto.java | 79 + .../scriptcase/dto/app/AtuAppVersionDto.java | 29 + .../cctp/scriptcase/dto/ats/AtsQueryDto.java | 59 + .../dto/ats/AtsScenarioExecute.java | 144 + .../scriptcase/dto/ats/ResultResponse.java | 57 + .../scriptcase/dto/atuScript/LogAddDto.java | 165 + .../dto/atuScript/UserQueryDto.java | 50 + .../atuScriptGroup/AtuScriptGroupAddDto.java | 79 + .../AtuScriptGroupDetailDto.java | 63 + .../atuScriptGroup/AtuScriptGroupMoveDto.java | 80 + .../AtuScriptGroupQueryDto.java | 119 + .../AtuScriptGroupUpdateDto.java | 81 + .../PublishScriptDetailDto.java | 32 + .../atuScriptGroup/PublishScriptQueryDto.java | 31 + .../atuScriptInfo/AtuPlanScriptDetailDto.java | 117 + .../atuScriptInfo/AtuScriptInfoAddDto.java | 161 + .../atuScriptInfo/AtuScriptInfoDeleteDto.java | 22 + .../atuScriptInfo/AtuScriptInfoDetailDto.java | 119 + .../atuScriptInfo/AtuScriptInfoFeignDto.java | 42 + .../atuScriptInfo/AtuScriptInfoMoveDto.java | 55 + .../atuScriptInfo/AtuScriptInfoQueryDto.java | 317 ++ .../atuScriptInfo/AtuScriptInfoResultDto.java | 100 + .../atuScriptInfo/AtuScriptInfoUpdateDto.java | 56 + .../atuScriptInfo/CommandDetailDto.java | 93 + .../atuScriptInfo/PlanPageQueryDto.java | 13 + .../atuScriptInfo/PlanScriptPageDto.java | 13 + .../atuScriptInfo/PrincipalUpdateDto.java | 31 + .../atuScriptInfo/ScriptDependencyDto.java | 52 + .../atuScriptInfo/ScriptVariableDto.java | 93 + .../atuScript/atuScriptInfo/TargetDto.java | 42 + .../atuScriptTag/AtuScriptTagAddDto.java | 46 + .../atuScriptTag/AtuScriptTagDetailDto.java | 25 + .../atuScriptTag/AtuScriptTagDto.java | 41 + .../atuScriptTag/AtuScriptTagQueryDto.java | 23 + .../atuScriptTag/AtuScriptTagUpdateDto.java | 23 + .../atuScript/atuScriptTag/TagInfoDto.java | 41 + .../AtuScriptVersionAddDto.java | 23 + .../AtuScriptVersionDetailDto.java | 25 + .../AtuScriptVersionQueryDto.java | 66 + .../AtuScriptVersionResultDto.java | 14 + .../AtuScriptVersionUpdateDto.java | 23 + .../atuscriptrecord/AtuDbConfigAddTmpDto.java | 208 + .../atuscriptrecord/AtuDbConfigQueryDto.java | 120 + .../AtuGlobalVariableAddDto.java | 105 + .../AtuGlobalVariableDetailDto.java | 42 + .../AtuGlobalVariableQueryDto.java | 44 + .../AtuGlobalVariableUpdateDto.java | 67 + .../AtuScriptInputSetAddDto.java | 98 + .../AtuScriptInputSetAddTmpDto.java | 45 + .../AtuScriptInputSetDetailDto.java | 24 + .../AtuScriptInputSetFeignDto.java | 13 + .../AtuScriptInputSetQueryDto.java | 54 + .../AtuScriptInputSetQuoteFeignDto.java | 44 + .../AtuScriptInputSetQuoteFieldDto.java | 89 + .../AtuScriptInputSetResultDto.java | 18 + .../AtuScriptInputSetUpdateDto.java | 24 + .../AtuScriptInputSetVersionAddDto.java | 24 + .../AtuScriptInputSetVersionDetailDto.java | 24 + .../AtuScriptInputSetVersionQueryDto.java | 24 + .../AtuScriptInputSetVersionUpdateDto.java | 24 + .../atuscriptrecord/ScriptInputHeaderDto.java | 69 + .../atuscriptrecord/ScriptInputTableDto.java | 44 + .../dto/caseDataSet/AtuCaseDataSetAddDto.java | 24 + .../caseDataSet/AtuCaseDataSetDetailDto.java | 192 + .../caseDataSet/AtuCaseDataSetFeignDto.java | 27 + .../caseDataSet/AtuCaseDataSetMenuDto.java | 187 + .../caseDataSet/AtuCaseDataSetQueryDto.java | 25 + .../caseDataSet/AtuCaseDataSetUpdateDto.java | 24 + .../caseDataSet/AtuCaseScriptQueryDto.java | 275 ++ .../caseDataSet/AtuCaseScriptResultDto.java | 282 ++ .../caseDataSet/AtuPlanScriptReturnDto.java | 27 + .../dto/caseDataSet/AtuPlanScriptSaveDto.java | 63 + .../dto/caseDataSet/AtuSetTreeQueryDto.java | 51 + .../dto/caseDataSet/PicusQueryDto.java | 18 + .../dto/caseDataSet/PlanQueryAppDto.java | 24 + .../dto/caseDataSet/SetTreeDto.java | 122 + .../casedesign/AtuProjectEnvDetailDto.java | 45 + .../casedesign/MqSynchronizeTaskAddDto.java | 209 + .../MqSynchronizeTaskDetailDto.java | 24 + .../casedesign/MqSynchronizeTaskQueryDto.java | 24 + .../MqSynchronizeTaskUpdateDto.java | 24 + .../dto/casedesign/TableHeader.java | 60 + .../cctp/scriptcase/dto/caseset/AppList.java | 39 + .../dto/caseset/AtuCaseSetAppDto.java | 21 + .../dto/caseset/AtuCaseSetRabbitDto.java | 79 + .../scriptcase/dto/caseset/DeviceList.java | 61 + .../dto/comLib/LibraryBusComCheckDto.java | 39 + .../dto/comLib/LibraryBusComInfoAddDto.java | 167 + .../comLib/LibraryBusComInfoDetailDto.java | 255 ++ .../dto/comLib/LibraryBusComInfoQueryDto.java | 121 + .../comLib/LibraryBusComInfoUpdateDto.java | 24 + .../dto/comLib/LibraryBusComTreeAddDto.java | 69 + .../comLib/LibraryBusComTreeDetailDto.java | 165 + .../dto/comLib/LibraryBusComTreeQueryDto.java | 51 + .../comLib/LibraryBusComTreeUpdateDto.java | 68 + .../dto/component/AtuBusinessNoDetailDto.java | 11 + .../dto/component/AtuBusinessNoQueryDto.java | 45 + .../dto/component/BusComponentTreeAddDto.java | 84 + .../component/BusComponentTreeDetailDto.java | 171 + .../component/BusComponentTreeQueryDto.java | 88 + .../component/BusComponentTreeUpdateDto.java | 82 + .../component/CpComponentListDetailDto.java | 221 ++ .../scriptcase/dto/component/CpLogAddDto.java | 182 + .../component/HisBusComponentInfoAddDto.java | 51 + .../HisBusComponentInfoDetailDto.java | 272 ++ .../HisBusComponentInfoQueryDto.java | 77 + .../HisBusComponentInfoUpdateDto.java | 50 + .../component/HisComponentParamDetailDto.java | 24 + .../dto/component/HisUseComponentAddDto.java | 80 + .../component/HisUseComponentDetailDto.java | 24 + .../component/HisUseComponentQueryDto.java | 24 + .../component/HisUseComponentUpdateDto.java | 24 + .../dto/component/MdBusComCopyDto.java | 81 + .../component/MdBusComponentInfoAddDto.java | 24 + .../MdBusComponentInfoDetailDto.java | 304 ++ .../component/MdBusComponentInfoQueryDto.java | 307 ++ .../MdBusComponentInfoUpdateDto.java | 156 + .../component/MdComponentParamDetailDto.java | 24 + .../component/ReBusComponentInfoAddDto.java | 165 + .../ReBusComponentInfoDetailDto.java | 285 ++ .../component/ReBusComponentInfoQueryDto.java | 97 + .../ReBusComponentInfoUpdateDto.java | 24 + .../ReBusComponentInfoVersionDto.java | 123 + .../component/ReComponentParamDetailDto.java | 24 + .../dto/component/RecordComParamDto.java | 111 + .../dto/component/RecordComTreeDto.java | 180 + .../dto/component/RecordComTreeLikeDto.java | 43 + .../dto/component/RecordComTreeQueryDto.java | 65 + .../scriptcase/dto/component/TreeMoveDto.java | 57 + .../AtuElementFetchTypeDto.java | 40 + .../elementLibrary/AtuElementGroupAddDto.java | 81 + .../AtuElementGroupDetailDto.java | 50 + .../AtuElementGroupMoveDto.java | 68 + .../AtuElementGroupQueryDto.java | 90 + .../AtuElementGroupUpdateDto.java | 81 + .../elementLibrary/AtuElementInfoAddDto.java | 98 + .../elementLibrary/AtuElementInfoDelDto.java | 39 + .../AtuElementInfoDetailDto.java | 78 + .../elementLibrary/AtuElementInfoMoveDto.java | 44 + .../AtuElementInfoQueryDto.java | 266 ++ .../AtuElementInfoUpdateDto.java | 83 + .../inputSet/AtuInnputDataSetQueryDto.java | 14 + .../dto/inputSet/AtuInputDataSetDto.java | 29 + .../inputSet/AtuInputDataSetResultDto.java | 11 + .../dto/inputSet/AtuInputSetAddDto.java | 24 + .../dto/inputSet/AtuInputSetCaseDto.java | 12 + .../dto/inputSet/AtuInputSetDetailDto.java | 25 + .../dto/inputSet/AtuInputSetDownloadDto.java | 47 + .../dto/inputSet/AtuInputSetFileDto.java | 37 + .../dto/inputSet/AtuInputSetQueryDto.java | 24 + .../dto/inputSet/AtuInputSetResultDto.java | 75 + .../dto/inputSet/AtuInputSetSaveDto.java | 31 + .../dto/inputSet/AtuInputSetUpdateDto.java | 24 + .../dto/inputSet/AtuPlanInputQueryDto.java | 23 + .../scriptcase/dto/inputSet/InputSet.java | 23 + .../dto/inputSet/InputSetResultDto.java | 19 + .../sceneScript/AtuSaveSceneInputsDto.java | 31 + .../AtuSaveSceneScriptAndGenCaseDto.java | 57 + .../sceneScript/AtuSaveSceneScriptDto.java | 81 + .../AtuSaveScriptAndCaseResVo.java | 21 + .../sceneScript/AtuSceneInfoDetailDto.java | 120 + .../AtuSceneNodeInfoDetailDto.java | 72 + .../AtuSceneScriptPagingQueryDto.java | 49 + .../sceneScript/AtuSceneScriptQueryDto.java | 53 + .../dto/sceneScript/ReqSceneFirstNodeDto.java | 29 + .../dto/sceneScript/ReqSceneNextNodeDto.java | 36 + .../dto/sceneScript/ReqSceneNodesDto.java | 16 + .../dto/sceneScript/ResNodeInfo.java | 37 + .../dto/sceneScript/ResNodeInfoDto.java | 30 + .../dto/sceneScript/ResVariable.java | 26 + .../dto/sceneScript/SceneNameVerifyDto.java | 19 + .../dto/sceneScript/SceneNodeInfoDto.java | 28 + .../dto/sceneScript/StopCaseDto.java | 18 + .../sceneScript/UserCaseDataVerifyDto.java | 21 + .../scriptcase/enums/ElementLibraryError.java | 49 + .../cctp/scriptcase/enums/ErrorMessage.java | 28 + .../cctp/scriptcase/enums/FileError.java | 38 + .../cctp/scriptcase/enums/MobileError.java | 50 + .../cctp/scriptcase/enums/PlatformType.java | 31 + .../scriptcase/enums/ScriptCaseAppError.java | 184 + .../cctp/scriptcase/feign/ApiTagService.java | 55 + .../feign/AttachmentFeignClient.java | 30 + .../scriptcase/feign/DataMgrFeignClient.java | 29 + .../scriptcase/feign/DeviceFeignClient.java | 19 + .../feign/ExecutePlanFeignClient.java | 40 + .../scriptcase/feign/PlatformFeignClient.java | 55 + .../scriptcase/feign/ProjectFeignClient.java | 36 + .../feign/dto/AtuDataSetFeignDto.java | 13 + .../feign/dto/AtuExceptionCase.java | 138 + .../scriptcase/feign/dto/DataContentDto.java | 32 + .../scriptcase/feign/dto/DataHeaderDto.java | 42 + .../scriptcase/feign/dto/DataSetsSaveDto.java | 75 + .../scriptcase/pub/AtuCaseDataSetPub.java | 78 + .../pub/variable/VariablePubCtrl.java | 69 + .../pub/variable/dto/VariableDto.java | 84 + .../pub/workbench/WorkbenchDataPub.java | 43 + .../service/WorkbenchDataService.java | 16 + .../service/WorkbenchDataServiceImpl.java | 43 + .../workbench/vo/WorkbenchUIScriptNumVO.java | 38 + .../cctp/scriptcase/tools/Assert.java | 187 + .../cctp/scriptcase/tools/DataMgrUtils.java | 187 + .../scriptcase/tools/DownloadFileUtils.java | 117 + .../cctp/scriptcase/tools/EnvNameUtils.java | 47 + .../scriptcase/tools/HttpClientUtils.java | 152 + .../cctp/scriptcase/tools/HttpUtils.java | 28 + .../cctp/scriptcase/tools/IpaUtil.java | 132 + .../cctp/scriptcase/tools/MinioPathUtils.java | 133 + .../cctp/scriptcase/tools/PinYinUtil.java | 81 + .../scriptcase/tools/RuleDefinitionTool.java | 23 + .../scriptcase/tools/ScriptCaseUtils.java | 131 + .../tools/SnowflakeIdGenerator.java | 133 + .../cctp/scriptcase/tools/StreamUtils.java | 57 + .../cctp/scriptcase/tools/XMLUtils.java | 83 + .../tools/iosPng/NorthKingIpaPngFix.java | 229 ++ .../scriptcase/tools/iosPng/PNGIHDRTrunk.java | 13 + .../scriptcase/tools/iosPng/PNGTrunk.java | 87 + .../src/main/resources/application.bak.yml | 101 + .../src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 116 + .../src/main/resources/logback-rabbitmq.xml | 86 + .../resources/mybatis/base/App.Mapper.xml | 514 +++ .../mybatis/base/AtuBusinessNo.Mapper.xml | 307 ++ .../mybatis/base/AtuCaseDataSet.Mapper.xml | 498 +++ .../mybatis/base/AtuElementGroup.Mapper.xml | 445 +++ .../mybatis/base/AtuElementInfo.Mapper.xml | 445 +++ .../mybatis/base/AtuGlobalVariable.Mapper.xml | 429 +++ .../mybatis/base/AtuInputSet.Mapper.xml | 314 ++ .../mybatis/base/AtuSceneInfo.Mapper.xml | 429 +++ .../mybatis/base/AtuSceneNodeInfo.Mapper.xml | 337 ++ .../mybatis/base/AtuScriptGroup.Mapper.xml | 444 +++ .../mybatis/base/AtuScriptInfo.Mapper.xml | 537 +++ .../mybatis/base/AtuScriptInputSet.Mapper.xml | 314 ++ .../base/AtuScriptInputSetVersion.Mapper.xml | 268 ++ .../mybatis/base/AtuScriptTag.Mapper.xml | 286 ++ .../mybatis/base/AtuScriptVersion.Mapper.xml | 378 ++ .../mybatis/base/BusComponentTree.Mapper.xml | 468 +++ .../mybatis/base/HisUseComponent.Mapper.xml | 354 ++ .../mybatis/base/LibraryBusComInfo.Mapper.xml | 468 +++ .../mybatis/base/LibraryBusComTree.Mapper.xml | 445 +++ .../base/MdBusComponentInfo.Mapper.xml | 514 +++ .../mybatis/base/MdComponentParam.Mapper.xml | 284 ++ .../mybatis/base/MqSynchronizeTask.Mapper.xml | 199 + .../main/resources/mybatis/ext/App.Dao.xml | 320 ++ .../mybatis/ext/AtuBusinessNo.Dao.xml | 92 + .../mybatis/ext/AtuCaseDataSet.Dao.xml | 608 +++ .../mybatis/ext/AtuElementGroup.Dao.xml | 194 + .../mybatis/ext/AtuElementInfo.Dao.xml | 242 ++ .../mybatis/ext/AtuGlobalVariable.Dao.xml | 148 + .../resources/mybatis/ext/AtuInputSet.Dao.xml | 161 + .../mybatis/ext/AtuSceneInfo.Dao.xml | 242 ++ .../mybatis/ext/AtuSceneNodeInfo.Dao.xml | 117 + .../mybatis/ext/AtuScriptGroup.Dao.xml | 216 ++ .../mybatis/ext/AtuScriptInfo.Dao.xml | 496 +++ .../mybatis/ext/AtuScriptInputSet.Dao.xml | 10 + .../ext/AtuScriptInputSetVersion.Dao.xml | 65 + .../mybatis/ext/AtuScriptTag.Dao.xml | 95 + .../mybatis/ext/AtuScriptVersion.Dao.xml | 118 + .../mybatis/ext/BusComponentTree.Dao.xml | 300 ++ .../mybatis/ext/HisUseComponent.Dao.xml | 113 + .../mybatis/ext/LibraryBusComInfo.Dao.xml | 161 + .../mybatis/ext/LibraryBusComTree.Dao.xml | 215 ++ .../mybatis/ext/MdBusComponentInfo.Dao.xml | 282 ++ .../mybatis/ext/MdComponentParam.Dao.xml | 65 + .../mybatis/ext/MqSynchronizeTask.Dao.xml | 62 + cctp-atu/atu-script-case/testDockerfile | 31 + cctp-atu/atu-upper-computer/pom.xml | 175 + .../atu-upper-computer/shell/docker-build.sh | 71 + .../atu-upper-computer/shell/docker-start.sh | 78 + cctp-atu/atu-upper-computer/shell/nk-ms.sh | 116 + .../AtuUpperComputerApplication.java | 29 + .../upperComputer/aop/ControllerAspect.java | 54 + .../automation/AutomationWebSocketServer.java | 192 + .../constants/AutomationRequestCmd.java | 66 + .../automation/constants/Command.java | 34 + .../automation/constants/UpperParamKey.java | 153 + .../entity/CmdAutomationRequest.java | 75 + .../entity/CmdAutomationResponse.java | 136 + .../handler/AbstractAutomationHandler.java | 109 + .../handler/AndroidAutomationHandler.java | 217 ++ .../handler/AutomationMessageHandler.java | 91 + .../handler/IosAutomationHandler.java | 2749 ++++++++++++++ .../upperComputer/config/BuildWdaConfig.java | 130 + .../config/HttpRequestPathConfig.java | 83 + .../upperComputer/config/MobileProperty.java | 205 + .../upperComputer/config/RabbitMQConfig.java | 82 + .../config/SwaggerConfiguration.java | 36 + .../upperComputer/config/WebSocketConfig.java | 14 + .../constants/AndroidHotKeyCodeEnum.java | 35 + .../BaseDefineDependencyConstants.java | 28 + .../upperComputer/constants/HandCommand.java | 38 + .../upperComputer/constants/HzBankOcr.java | 15 + .../constants/HzBankOcrCode.java | 10 + .../constants/IosInputKeyBoardEnum.java | 120 + .../constants/KeyBoardCodeEnum.java | 172 + .../upperComputer/constants/RequestCmd.java | 85 + .../upperComputer/constants/ResponseCmd.java | 20 + .../constants/UpperComputerConstant.java | 44 + .../constants/WebDriverAgentState.java | 26 + .../controller/ElementController.java | 51 + .../controller/EngineController.java | 323 ++ .../deviceManager/AbstractDeviceManager.java | 193 + .../deviceManager/AndroidDeviceManager.java | 332 ++ .../deviceManager/DeviceManager.java | 57 + .../deviceManager/IOSDeviceManager.java | 421 +++ .../deviceManager/UpperComputerManager.java | 339 ++ .../deviceManager/common/PyMobileDevice.java | 1058 ++++++ .../deviceManager/common/Python3.java | 371 ++ .../deviceManager/entity/AdapterDetails.java | 110 + .../entity/AppleApplicationInfo.java | 803 ++++ .../entity/AppleRawAdapterDetail.java | 110 + .../entity/BasebandKeyHashInformation.java | 30 + .../deviceManager/entity/BatteryBaseInfo.java | 70 + .../deviceManager/entity/BatteryData.java | 605 +++ .../deviceManager/entity/BatteryDetail.java | 562 +++ .../entity/CFBundleDocumentType.java | 42 + .../deviceManager/entity/CFBundleIcons.java | 20 + .../entity/CFBundlePrimaryIcon.java | 32 + .../deviceManager/entity/CFBundleURLType.java | 42 + .../deviceManager/entity/CarrierMode.java | 40 + .../deviceManager/entity/ChargerData.java | 90 + .../entity/DeadBatteryBootData.java | 110 + .../entity/DeveloperDvtGraphics.java | 454 +++ .../deviceManager/entity/DeviceBaseInfo.java | 714 ++++ .../deviceManager/entity/DevicePortData.java | 66 + .../deviceManager/entity/Entitlements.java | 92 + .../entity/EnvironmentVariables.java | 40 + .../deviceManager/entity/GroupContainers.java | 20 + .../entity/INAlternativeAppName.java | 20 + .../entity/IOReportChannelInfo.java | 20 + .../deviceManager/entity/IOReportLegend.java | 42 + .../deviceManager/entity/InductiveData.java | 20 + .../deviceManager/entity/KioskMode.java | 60 + .../deviceManager/entity/LPEMData.java | 20 + .../deviceManager/entity/LifetimeData.java | 280 ++ .../deviceManager/entity/LockdownInfo.java | 777 ++++ .../entity/NSAppTransportSecurity.java | 20 + .../deviceManager/entity/NonVolatileRAM.java | 121 + .../entity/PowerTelemetryData.java | 190 + .../deviceManager/entity/ProcessInfo.java | 32 + .../entity/UIApplicationShortcutItem.java | 40 + .../entity/UTExportedTypeDeclaration.java | 42 + .../entity/UTTypeTagSpecification.java | 32 + .../screen/AndroidScreenResponseThread.java | 171 + .../AndroidVideoScreenResponseThread.java | 286 ++ .../screen/ImageScreenResponse.java | 144 + .../screen/IosScreenResponseThread.java | 305 ++ .../deviceManager/screen/ScreenRecorder.java | 140 + .../thread/AndroidDeviceInitThread.java | 641 ++++ .../thread/AppiumEnvironmentThread.java | 111 + .../thread/Device8100WatchThread.java | 41 + .../thread/IosDeviceInitThread.java | 107 + .../thread/MacIosDeviceInitThread.java | 269 ++ .../thread/UpperComputerHeartThread.java | 55 + .../thread/UsbMuxdDriverThread.java | 129 + .../WindowsAndLinuxIosDeviceInitThread.java | 262 ++ .../utils/OutputLineCallback.java | 8 + .../deviceManager/utils/XcodeBuild.java | 830 ++++ .../cctp/upperComputer/driver/adb/Adb.java | 363 ++ .../upperComputer/driver/adb/AdbDevice.java | 363 ++ .../driver/adb/AdbServerRunner.java | 289 ++ .../driver/adb/AdbShellSession.java | 51 + .../driver/adb/AdbTransport.java | 243 ++ .../driver/adb/AndroidDeviceListener.java | 22 + .../driver/adb/PushBytesCountCallback.java | 7 + .../driver/adb/RemoteFileRecord.java | 88 + .../driver/adb/TransportException.java | 22 + .../cctp/upperComputer/driver/adb/Tunnel.java | 198 + .../driver/agent/AndroidAgent.java | 42 + .../driver/agent/AndroidAgentSession.java | 198 + .../agent/StandaloneCommandException.java | 7 + .../driver/agent/StandaloneCommandRunner.java | 84 + .../StandaloneCommandTimeoutException.java | 8 + .../ActivityManagerServiceShellCommand.java | 33 + .../agent/command/AppiumSourceXmlCommand.java | 34 + .../agent/command/ClipboardCommand.java | 57 + .../agent/command/CloseSessionCommand.java | 40 + .../driver/agent/command/EchoCommand.java | 55 + .../agent/command/GetSmsListCommand.java | 44 + .../driver/agent/command/KeyEventCommand.java | 1589 ++++++++ .../agent/command/MediaCodecListCommand.java | 57 + .../agent/command/MotionEventCommand.java | 303 ++ .../agent/command/PackageListCommand.java | 111 + .../agent/command/RotationScreenCommand.java | 59 + .../agent/command/RunningAppProcessInfo.java | 105 + .../command/RunningAppProcessInfoCommand.java | 57 + .../agent/command/ScreenStreamCommand.java | 120 + .../command/StartScreenVideoCommand.java | 223 ++ .../driver/agent/command/StopCommand.java | 26 + .../agent/command/StopScreenVideoCommand.java | 34 + .../agent/command/SwitchWifiCommand.java | 39 + .../agent/command/TakeScreenshotCommand.java | 63 + .../agent/command/TextInputCommand.java | 66 + .../command/WatchBatteryDetailCommand.java | 36 + .../agent/command/WatchCpuUsageCommand.java | 38 + .../command/WatchDisplayInfoCommand.java | 54 + .../command/WatchMemoryUsageCommand.java | 36 + .../command/WatchScreenStreamCommand.java | 45 + .../command/WatchScreenVideoFrameCommand.java | 43 + .../WatchTrafficStatsNetworkSpeedCommand.java | 39 + .../agent/command/WatchWifiStateCommand.java | 33 + .../agent/command/data/BatteryData.java | 233 ++ .../agent/command/data/DisplayData.java | 168 + .../agent/command/data/MediaCodecInfo.java | 93 + .../command/data/NetworkCollectInfo.java | 462 +++ .../agent/command/data/NetworkSpeed.java | 14 + .../agent/command/data/PackageInfo.java | 602 +++ .../agent/command/data/ProcessMemoryInfo.java | 200 + .../agent/command/data/ScreenVideoFrame.java | 63 + .../protocol/AbstractProtocolCommand.java | 69 + .../command/protocol/ProtocolCommand.java | 26 + .../command/protocol/ProtocolStreamUtil.java | 82 + .../driver/ios/DeviceSocketProvider.java | 11 + .../driver/ios/DeviceSocketStream.java | 31 + .../ios/LocalUsbmuxdDeviceSocketProvider.java | 52 + .../ios/LocalUsbmuxdDeviceSocketStream.java | 53 + .../upperComputer/driver/ios/NKAgent.java | 334 ++ .../ios/command/data/AppBatteryData.java | 34 + .../ios/command/data/DragUiNodeData.java | 31 + .../driver/ios/command/data/DragXYData.java | 53 + .../ios/command/data/ForceTapXYData.java | 41 + .../ios/command/data/HoldUiNodeData.java | 31 + .../command/data/MultiplyTapUiNodeData.java | 43 + .../ios/command/data/PinchUiNodeData.java | 43 + .../command/data/PressAndDragUiNodeData.java | 53 + .../ios/command/data/PressAndDragXYData.java | 41 + .../ios/command/data/ScreenInfoData.java | 57 + .../ios/command/data/ScreenShotData.java | 31 + .../ios/command/data/SearchUiNodeData.java | 258 ++ .../ios/command/data/SwipeUiNodeData.java | 42 + .../driver/ios/command/data/TapXYData.java | 81 + .../driver/ios/command/data/TextData.java | 40 + .../ios/command/data/TypeKeysUiNodeData.java | 45 + .../driver/ios/command/data/UiNodeData.java | 263 ++ .../command/data/WheelSelectUiNodeData.java | 41 + .../listener/AppBatteryDataListener.java | 30 + .../listener/ScreenInfoDataListener.java | 29 + .../ios/packet/AsyncPacketListener.java | 63 + .../driver/ios/packet/BooleanCommandData.java | 40 + .../driver/ios/packet/ByteCommandData.java | 27 + .../driver/ios/packet/CodecUtils.java | 82 + .../driver/ios/packet/CommandPacket.java | 83 + .../driver/ios/packet/EmptyCommandData.java | 17 + .../driver/ios/packet/ICommandData.java | 25 + .../driver/ios/packet/ICommandPacket.java | 69 + .../driver/ios/packet/IntCommandData.java | 28 + .../driver/ios/packet/PacketHandler.java | 5 + .../driver/ios/packet/PacketTransfer.java | 461 +++ .../driver/ios/packet/TextCommandData.java | 36 + .../driver/proxy/WebDriverAgentApiProxy.java | 389 ++ .../proxy/WebDriverAgentScreenProxy.java | 759 ++++ .../driver/usbmuxd/AppleDevice.java | 144 + .../driver/usbmuxd/AppleDeviceWatcher.java | 148 + .../driver/usbmuxd/IOSDeviceListener.java | 16 + .../upperComputer/driver/usbmuxd/UsbMuxd.java | 269 ++ .../UsbMuxdConnectFailedException.java | 39 + .../driver/usbmuxd/payload/Payload.java | 35 + .../payload/service/ServicePayload.java | 8 + .../service/request/GetValueRequest.java | 27 + .../service/request/QueryTypeRequest.java | 20 + .../payload/usbmuxd/UsbMuxdPayload.java | 86 + .../entity/DeviceConnectionDetail.java | 233 ++ .../request/ConnectDevicePortRequest.java | 66 + .../usbmuxd/request/ListDevicesRequest.java | 28 + .../usbmuxd/request/ListenDeviceRequest.java | 28 + .../usbmuxd/response/ListDeviceResponse.java | 69 + .../response/ListenDeviceResponse.java | 45 + .../usbmuxd/response/ResultResponse.java | 83 + .../service/AppleDeviceInnerService.java | 106 + .../usbmuxd/service/LockdownService.java | 68 + .../cctp/upperComputer/entity/Attachment.java | 26 + .../upperComputer/entity/CdDeviceCtrl.java | 151 + .../upperComputer/entity/CdDeviceModel.java | 417 ++ .../entity/CdDeviceRegisterDto.java | 48 + .../upperComputer/entity/CdEngineInfo.java | 256 ++ .../upperComputer/entity/CdMobileBrand.java | 212 ++ .../upperComputer/entity/CdMobileDevice.java | 243 ++ .../cctp/upperComputer/entity/CdPcDevice.java | 373 ++ .../entity/ComputerHeartInfo.java | 46 + .../upperComputer/entity/ConsumerInfoDto.java | 68 + .../entity/DebuggerDeviceInfo.java | 310 ++ .../cctp/upperComputer/entity/DeviceInfo.java | 214 ++ .../upperComputer/entity/DeviceInfoDto.java | 98 + .../upperComputer/entity/PhoneEntity.java | 123 + .../upperComputer/entity/ResultWrapper.java | 141 + .../cctp/upperComputer/enums/BrandEnum.java | 44 + .../enums/FileBusinessTypeEnum.java | 96 + .../upperComputer/enums/PlatformType.java | 31 + .../exception/AppiumException.java | 23 + .../exception/ExecuteException.java | 24 + .../exception/ParamMistakeException.java | 19 + .../upperComputer/exception/ResponseVO.java | 55 + .../upperComputer/init/UpperComputerInit.java | 63 + .../listener/UpperComputerConsumer.java | 52 + .../service/AbstractDebuggerService.java | 137 + .../service/AndroidDebuggerServiceImpl.java | 1225 ++++++ .../service/DebuggerService.java | 56 + .../service/DeviceConnectionService.java | 25 + .../upperComputer/service/DeviceService.java | 21 + .../service/DeviceServiceImpl.java | 119 + .../service/IosDebuggerServiceImpl.java | 404 ++ .../service/impl/ConnectionServiceImpl.java | 170 + .../thread/AndroidDeviceAllInfoThread.java | 330 ++ .../AndroidDeviceInfoByPackageThread.java | 448 +++ .../thread/IOSDeviceAllInfoThread.java | 377 ++ .../thread/IOSDeviceInfoByPackageThread.java | 317 ++ .../thread/AndroidAdbDataThread.java | 416 ++ .../upperComputer/thread/IosPerfDataRead.java | 135 + .../thread/IosTiDeviceThread.java | 109 + .../upperComputer/thread/ShutdownHook.java | 32 + .../utils/AndroidAppiumHelper.java | 200 + .../cctp/upperComputer/utils/ByteUtils.java | 88 + .../cctp/upperComputer/utils/HttpUtils.java | 392 ++ .../cctp/upperComputer/utils/JsonUtils.java | 89 + .../upperComputer/utils/ProcessCmdUtils.java | 28 + .../upperComputer/utils/ScreenShotUtils.java | 127 + .../upperComputer/utils/SessionUtils.java | 65 + .../cctp/upperComputer/utils/SpringUtils.java | 34 + .../utils/hzBank/HzBankOcrUtils.java | 215 ++ .../utils/ios/IosDeviceHandleHelper.java | 102 + .../ios/LinuxAndWindowsIosHandleHelper.java | 301 ++ .../utils/ios/MacIosHandleHelper.java | 214 ++ .../cctp/upperComputer/vo/HzBankOcrVo.java | 204 + .../webSocket/DeviceConnectionWebSocket.java | 137 + .../webSocket/entity/CatchParam.java | 124 + .../webSocket/entity/CmdRequest.java | 46 + .../webSocket/entity/CmdResponse.java | 136 + .../webSocket/entity/ParamCheck.java | 145 + .../upperComputer/webSocket/entity/Point.java | 32 + .../webSocket/function/FunctionConstants.java | 39 + .../webSocket/function/IosFunction.java | 186 + .../function/IosFunctionByAgent.java | 139 + .../AbstractIosMessageHandlerThread.java | 675 ++++ .../thread/AbstractMessageHandler.java | 280 ++ .../webSocket/thread/AndroidLogThread.java | 234 ++ .../thread/AndroidMessageHandlerThread.java | 1417 +++++++ .../webSocket/thread/AndroidPerfThread.java | 466 +++ .../webSocket/thread/GetNodeTreeThread.java | 140 + .../webSocket/thread/IosLogThread.java | 232 ++ .../thread/IosMacMessageHandlerThread.java | 735 ++++ .../webSocket/thread/IosPerfThread.java | 196 + .../thread/IosScreenCompressHandleThread.java | 284 ++ ...osWindowsAndLinuxMessageHandlerThread.java | 763 ++++ .../webSocket/thread/MessageHandler.java | 104 + .../NotifyWebCloseConnectionThread.java | 58 + .../main/resources/application-devFront.yml | 60 + .../src/main/resources/application-prod.yml | 61 + .../src/main/resources/application-test.yml | 59 + .../src/main/resources/application-uat.yml | 61 + .../src/main/resources/application.yml | 13 + .../src/main/resources/logback.xml | 86 + cctp-atu/cctp-guaca-proxy/Dockerfile-dev | 42 + cctp-atu/cctp-guaca-proxy/Dockerfile-prod | 41 + cctp-atu/cctp-guaca-proxy/Dockerfile-test | 41 + cctp-atu/cctp-guaca-proxy/Dockerfile-uat | 42 + cctp-atu/cctp-guaca-proxy/docker-ctl.sh | 167 + cctp-atu/cctp-guaca-proxy/pom.xml | 106 + .../cctp-guaca-proxy/shell/docker-build.sh | 71 + .../cctp-guaca-proxy/shell/docker-start.sh | 77 + cctp-atu/cctp-guaca-proxy/shell/nk-ms.sh | 117 + .../cctp/guaca/GuacaProxyApplication.java | 30 + .../cctp/guaca/ws/GuacaProxyFeignClient.java | 24 + .../cctp/guaca/ws/WebSocketConfig.java | 22 + .../cctp/guaca/ws/WebSocketTunnel.java | 204 + .../src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 112 + .../src/main/resources/logback-rabbitmq.xml | 45 + cctp-atu/cctp-pcui-designer/Dockerfile-dev | 41 + cctp-atu/cctp-pcui-designer/Dockerfile-prod | 41 + cctp-atu/cctp-pcui-designer/Dockerfile-test | 41 + cctp-atu/cctp-pcui-designer/Dockerfile-uat | 41 + cctp-atu/cctp-pcui-designer/docker-ctl.sh | 176 + cctp-atu/cctp-pcui-designer/pom.xml | 81 + .../cctp-pcui-designer/shell/docker-build.sh | 71 + .../cctp-pcui-designer/shell/docker-start.sh | 77 + cctp-atu/cctp-pcui-designer/shell/nk-ms.sh | 117 + .../designer/PcuiDesignerApplication.java | 33 + .../designer/ws/ImgBase64InstructUtil.java | 87 + .../cctp/designer/ws/InstructSetMsg.java | 109 + .../northking/cctp/designer/ws/RedisUtil.java | 254 ++ .../ws/RobotEngineConnetStatusBo.java | 31 + .../cctp/designer/ws/WebSocketConfig.java | 24 + .../cctp/designer/ws/WsManyWaysBo.java | 44 + .../northking/cctp/designer/ws/WsUtils.java | 110 + .../designer/ws/client/EngineWsClient.java | 239 ++ .../designer/ws/client/RobotWsClient.java | 352 ++ .../ws/constants/PcuiDesignerConstant.java | 33 + .../ws/feign/CctpPlatformFeignClient.java | 20 + .../ws/feign/DesignerFeignClient.java | 32 + .../cctp/designer/ws/mq/MqConstant.java | 8 + .../ws/server/FrontDatasWebsocket.java | 684 ++++ .../ws/server/InstructSetTransetionEnum.java | 50 + .../src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 112 + .../src/main/resources/logback-rabbitmq.xml | 45 + cctp-atu/cctp-pcui-designer/testDockerfile | 32 + cctp-production/README.md | 33 + .../cctp-device-mgr/Dockerfile-dev | 40 + .../cctp-device-mgr/Dockerfile-prod | 40 + .../cctp-device-mgr/Dockerfile-test | 40 + .../cctp-device-mgr/Dockerfile-uat | 40 + cctp-production/cctp-device-mgr/README.md | 155 + .../cctp-device-mgr.deployment.yaml | 76 + cctp-production/cctp-device-mgr/docker-ctl.sh | 177 + cctp-production/cctp-device-mgr/pom.xml | 141 + .../cctp-device-mgr/shell/docker-build.sh | 71 + .../cctp-device-mgr/shell/docker-start.sh | 77 + .../cctp-device-mgr/shell/nk-ms.sh | 114 + .../cctp/device/DeviceMgrApplication.java | 54 + .../net/northking/cctp/device/api/README.MD | 1 + .../api/activity/DeviceActivityCtrl.java | 245 ++ .../device/api/activity/DeviceActivityWS.java | 140 + .../service/DeviceActivityApiService.java | 65 + .../service/DeviceActivityApiServiceImpl.java | 840 +++++ .../activity/service/EngineActivityCtrl.java | 51 + .../api/brand/CdMobileBrandQueryCtrl.java | 71 + .../api/brand/CdMobileBrandRestfulCtrl.java | 107 + .../service/CdMobileBrandApiService.java | 88 + .../service/CdMobileBrandApiServiceImpl.java | 241 ++ .../api/ctrl/CdDeviceCtrlQueryCtrl.java | 73 + .../api/ctrl/CdDeviceCtrlRestfulCtrl.java | 114 + .../ctrl/service/CdDeviceCtrlApiService.java | 90 + .../service/CdDeviceCtrlApiServiceImpl.java | 240 ++ .../api/engineInfo/CdEngineInfoQueryCtrl.java | 105 + .../engineInfo/CdEngineInfoRestfulCtrl.java | 118 + .../service/CdEngineInfoApiService.java | 96 + .../service/CdEngineInfoApiServiceImpl.java | 434 +++ .../CdEngineReleasesQueryCtrl.java | 56 + .../CdEngineReleasesRestfulCtrl.java | 112 + .../service/CdEngineReleasesApiService.java | 88 + .../CdEngineReleasesApiServiceImpl.java | 205 + .../mobile/CdMobileDevicePlatformCtrl.java | 128 + .../api/mobile/CdMobileDeviceQueryCtrl.java | 67 + .../api/mobile/CdMobileDeviceSaaSCtrl.java | 115 + .../service/CdMobileDeviceApiService.java | 130 + .../service/CdMobileDeviceApiServiceImpl.java | 846 +++++ .../api/model/CdDeviceModelQueryCtrl.java | 74 + .../api/model/CdDeviceModelRestfulCtrl.java | 114 + .../service/CdDeviceModelApiService.java | 70 + .../service/CdDeviceModelApiServiceImpl.java | 287 ++ .../api/pcDevice/CdPcDevicePlatformCtrl.java | 93 + .../api/pcDevice/CdPcDeviceQueryCtrl.java | 113 + .../api/pcDevice/CdPcDeviceRestfulCtrl.java | 101 + .../api/pcDevice/CdPcDeviceSaaSCtrl.java | 71 + .../device/api/pcDevice/PcMonitorDataWS.java | 196 + .../service/CdPcDeviceApiService.java | 86 + .../service/CdPcDeviceApiServiceImpl.java | 535 +++ .../cctp/device/bus/BusConstants.java | 28 + .../net/northking/cctp/device/bus/README.MD | 1 + .../device/bus/feign/CctpPlatformFeign.java | 19 + .../cctp/device/bus/feign/PlatformFeign.java | 19 + .../cctp/device/bus/feign/TenantFeign.java | 19 + .../device/bus/feign/dto/CltDictCatalog.java | 172 + .../device/bus/feign/dto/CltDictItem.java | 326 ++ .../device/bus/feign/dto/UserInfoDto.java | 94 + .../device/bus/publisher/CtrlMQPublisher.java | 70 + .../device/bus/publisher/CtrlPublisher.java | 11 + .../publisher/DeviceStatusMQPublisher.java | 64 + .../bus/publisher/DeviceStatusPublisher.java | 6 + .../bus/publisher/dto/ConsumerInfoDto.java | 58 + .../fanout/DeviceFanoutPublisher.java | 27 + .../device/bus/receiver/DeviceMQReceiver.java | 93 + .../device/bus/receiver/HeartMQReceiver.java | 173 + .../bus/receiver/dto/CtrlReceiverDto.java | 49 + .../device/bus/receiver/dto/HeartMQDto.java | 17 + .../cctp/device/config/EmailConfig.java | 18 + .../cctp/device/config/EngineConfig.java | 20 + .../cctp/device/config/PrometheusConfig.java | 19 + .../northking/cctp/device/config/README.MD | 1 + .../cctp/device/config/RabbitConfig.java | 14 + .../cctp/device/config/SystemConfig.java | 26 + .../cctp/device/config/WebSocketConfig.java | 13 + .../device/constants/DeviceConstants.java | 205 + .../cctp/device/constants/DeviceError.java | 102 + .../cctp/device/constants/ErrorMessage.java | 28 + .../northking/cctp/device/constants/README.MD | 22 + .../net/northking/cctp/device/db/README.MD | 1 + .../cctp/device/db/dao/CdDeviceCtrlDao.java | 26 + .../cctp/device/db/dao/CdDeviceModelDao.java | 32 + .../device/db/dao/CdDeviceProjectDao.java | 29 + .../cctp/device/db/dao/CdDeviceStatusDao.java | 34 + .../cctp/device/db/dao/CdDeviceTenantDao.java | 31 + .../cctp/device/db/dao/CdDeviceTokenDao.java | 31 + .../device/db/dao/CdDeviceUsageLogDao.java | 32 + .../cctp/device/db/dao/CdEngineInfoDao.java | 48 + .../device/db/dao/CdEngineReleasesDao.java | 27 + .../cctp/device/db/dao/CdMobileBrandDao.java | 30 + .../cctp/device/db/dao/CdMobileDeviceDao.java | 52 + .../cctp/device/db/dao/CdPcDeviceDao.java | 38 + .../cctp/device/db/dao/CdPcUserDao.java | 29 + .../cctp/device/db/entity/CdDeviceCtrl.java | 327 ++ .../cctp/device/db/entity/CdDeviceModel.java | 452 +++ .../device/db/entity/CdDeviceProject.java | 130 + .../cctp/device/db/entity/CdDeviceStatus.java | 161 + .../cctp/device/db/entity/CdDeviceTenant.java | 139 + .../cctp/device/db/entity/CdDeviceToken.java | 215 ++ .../device/db/entity/CdDeviceUsageLog.java | 356 ++ .../cctp/device/db/entity/CdEngineInfo.java | 290 ++ .../device/db/entity/CdEngineReleases.java | 220 ++ .../cctp/device/db/entity/CdMobileBrand.java | 230 ++ .../cctp/device/db/entity/CdMobileDevice.java | 276 ++ .../cctp/device/db/entity/CdPcDevice.java | 485 +++ .../cctp/device/db/entity/CdPcUser.java | 153 + .../db/impl/CdDeviceCtrlServiceImpl.java | 56 + .../db/impl/CdDeviceModelServiceImpl.java | 82 + .../db/impl/CdDeviceProjectServiceImpl.java | 73 + .../db/impl/CdDeviceStatusServiceImpl.java | 79 + .../db/impl/CdDeviceTenantServiceImpl.java | 78 + .../db/impl/CdDeviceTokenServiceImpl.java | 71 + .../db/impl/CdDeviceUsageLogServiceImpl.java | 79 + .../db/impl/CdEngineInfoServiceImpl.java | 120 + .../db/impl/CdEngineReleasesServiceImpl.java | 65 + .../db/impl/CdMobileBrandServiceImpl.java | 63 + .../db/impl/CdMobileDeviceServiceImpl.java | 272 ++ .../device/db/impl/CdPcDeviceServiceImpl.java | 246 ++ .../device/db/impl/CdPcUserServiceImpl.java | 67 + .../device/db/mapper/CdDeviceCtrlMapper.java | 31 + .../device/db/mapper/CdDeviceModelMapper.java | 38 + .../db/mapper/CdDeviceProjectMapper.java | 25 + .../db/mapper/CdDeviceStatusMapper.java | 26 + .../db/mapper/CdDeviceTenantMapper.java | 25 + .../device/db/mapper/CdDeviceTokenMapper.java | 27 + .../db/mapper/CdDeviceUsageLogMapper.java | 33 + .../device/db/mapper/CdEngineInfoMapper.java | 30 + .../db/mapper/CdEngineReleasesMapper.java | 28 + .../device/db/mapper/CdMobileBrandMapper.java | 29 + .../db/mapper/CdMobileDeviceMapper.java | 30 + .../device/db/mapper/CdPcDeviceMapper.java | 35 + .../cctp/device/db/mapper/CdPcUserMapper.java | 26 + .../db/service/CdDeviceCtrlService.java | 18 + .../db/service/CdDeviceModelService.java | 25 + .../db/service/CdDeviceProjectService.java | 20 + .../db/service/CdDeviceStatusService.java | 22 + .../db/service/CdDeviceTenantService.java | 22 + .../db/service/CdDeviceTokenService.java | 20 + .../db/service/CdDeviceUsageLogService.java | 24 + .../db/service/CdEngineInfoService.java | 44 + .../db/service/CdEngineReleasesService.java | 16 + .../db/service/CdMobileBrandService.java | 20 + .../db/service/CdMobileDeviceService.java | 34 + .../device/db/service/CdPcDeviceService.java | 25 + .../device/db/service/CdPcUserService.java | 18 + .../net/northking/cctp/device/dto/README.MD | 1 + .../device/dto/brand/CdMobileBrandAddDto.java | 66 + .../dto/brand/CdMobileBrandDetailDto.java | 155 + .../dto/brand/CdMobileBrandQueryDto.java | 54 + .../dto/brand/CdMobileBrandUpdateDto.java | 66 + .../device/dto/ctrl/CdDeviceCtrlAddDto.java | 136 + .../dto/ctrl/CdDeviceCtrlDetailDto.java | 202 + .../device/dto/ctrl/CdDeviceCtrlQueryDto.java | 24 + .../dto/ctrl/CdDeviceCtrlUpdateDto.java | 67 + .../dto/device/CdDeviceRegisterDto.java | 55 + .../dto/device/CdMobileDeviceAddDto.java | 24 + .../dto/device/CdMobileDeviceDetailDto.java | 156 + .../dto/device/CdMobileDeviceExitDto.java | 28 + .../dto/device/CdMobileDeviceQueryDto.java | 84 + .../dto/device/CdMobileDeviceRecycleDto.java | 70 + .../dto/device/CdMobileDeviceScriptDto.java | 127 + .../dto/device/CdMobileDeviceScriptDto2.java | 137 + .../dto/device/CdMobileDeviceUpdateDto.java | 24 + .../cctp/device/dto/device/DeviceInfoDto.java | 130 + .../cctp/device/dto/device/DeviceLockDto.java | 27 + .../cctp/device/dto/device/DeviceLogDto.java | 28 + .../dto/device/DeviceSelectQueryDto.java | 50 + .../device/dto/device/ScriptResultDto.java | 228 ++ .../dto/engineInfo/CdEngineInfoAddDto.java | 24 + .../dto/engineInfo/CdEngineInfoDetailDto.java | 161 + .../dto/engineInfo/CdEngineInfoQueryDto.java | 103 + .../engineInfo/CdEngineInfoRegisterDto.java | 36 + .../dto/engineInfo/CdEngineInfoResultDto.java | 27 + .../dto/engineInfo/CdEngineInfoUpdateDto.java | 111 + .../engineInfo/CdEngineInfoVersionDto.java | 29 + .../device/dto/engineInfo/DeviceListDto.java | 16 + .../dto/engineInfo/EngineInfoListDto.java | 19 + .../dto/engineLog/CdEngineLogAddDto.java | 24 + .../dto/engineLog/CdEngineLogDetailDto.java | 24 + .../dto/engineLog/CdEngineLogQueryDto.java | 24 + .../dto/engineLog/CdEngineLogUpdateDto.java | 24 + .../CdEngineReleasesAddDto.java | 92 + .../CdEngineReleasesDetailDto.java | 134 + .../CdEngineReleasesQueryDto.java | 69 + .../CdEngineReleasesUpdateDto.java | 106 + .../engineReleases/ScriptEngineVersion.java | 30 + .../device/dto/model/CdDeviceModelAddDto.java | 191 + .../dto/model/CdDeviceModelDetailDto.java | 267 ++ .../dto/model/CdDeviceModelQueryDto.java | 64 + .../dto/model/CdDeviceModelUpdateDto.java | 191 + .../device/dto/model/DeviceSelectDto.java | 55 + .../device/dto/model/SystemVersionDto.java | 96 + .../dto/pcDevice/CdDeviceListRemoteDto.java | 11 + .../dto/pcDevice/CdDeviceRemoteDto.java | 17 + .../device/dto/pcDevice/CdPcDeviceAddDto.java | 95 + .../dto/pcDevice/CdPcDeviceDetailDto.java | 181 + .../device/dto/pcDevice/CdPcDeviceDto.java | 70 + .../dto/pcDevice/CdPcDeviceExitDto.java | 27 + .../dto/pcDevice/CdPcDeviceQueryDto.java | 78 + .../dto/pcDevice/CdPcDeviceRemoteDto.java | 53 + .../dto/pcDevice/CdPcDeviceScriptDto.java | 107 + .../dto/pcDevice/CdPcDeviceStatusDto.java | 37 + .../dto/pcDevice/CdPcDeviceUpdateDto.java | 157 + .../dto/pcDevice/CdPcUserUpdateDto.java | 28 + .../dto/pcDevice/ScriptPcResultDto.java | 174 + .../cctp/device/dto/tenant/TenantDetail.java | 69 + .../device/pub/CdEngineReleasesPubCtrl.java | 74 + .../cctp/device/pub/DevicePubCtrl.java | 164 + .../cctp/device/pub/RegisterPubCtrl.java | 91 + .../device/schedule/DeviceLogSchedule.java | 24 + .../cctp/device/schedule/DeviceSchedule.java | 268 ++ .../device/schedule/MonitorDataSchedule.java | 152 + .../cctp/device/util/DeviceStatusUtil.java | 51 + .../northking/cctp/device/util/IpUtil.java | 16 + .../cctp/device/util/OkHttpClientUtil.java | 91 + .../net/northking/cctp/device/util/README.md | 1 + .../device/util/prometheus/MonitorTools.java | 35 + .../device/util/prometheus/PromQlConfig.java | 102 + .../device/util/prometheus/PromSqlDto.java | 35 + .../util/prometheus/PrometheusClient.java | 128 + .../util/prometheus/PrometheusQuery.java | 31 + .../util/prometheus/PrometheusRequest.java | 110 + .../util/prometheus/PrometheusTargets.java | 38 + .../device/util/prometheus/TargetDto.java | 19 + .../src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 118 + .../main/resources/db/mysql/data/README.MD | 1 + .../main/resources/db/mysql/schema/README.md | 1 + .../db/mysql/schema/cd_mobile_brand.sql | 15 + .../main/resources/db/mysql/update/update.sql | 14 + .../src/main/resources/logback-rabbitmq.xml | 86 + .../src/main/resources/mybatis/README.MD | 1 + .../mybatis/base/CdDeviceCtrl.Mapper.xml | 383 ++ .../mybatis/base/CdDeviceModel.Mapper.xml | 498 +++ .../mybatis/base/CdDeviceProject.Mapper.xml | 199 + .../mybatis/base/CdDeviceStatus.Mapper.xml | 222 ++ .../mybatis/base/CdDeviceTenant.Mapper.xml | 199 + .../mybatis/base/CdDeviceToken.Mapper.xml | 291 ++ .../mybatis/base/CdDeviceUsageLog.Mapper.xml | 383 ++ .../mybatis/base/CdEngineInfo.Mapper.xml | 360 ++ .../mybatis/base/CdEngineReleases.Mapper.xml | 291 ++ .../mybatis/base/CdMobileBrand.Mapper.xml | 286 ++ .../mybatis/base/CdMobileDevice.Mapper.xml | 329 ++ .../mybatis/base/CdPcDevice.Mapper.xml | 572 +++ .../mybatis/base/CdPcUser.Mapper.xml | 222 ++ .../mybatis/ext/CdDeviceCtrl.Dao.xml | 97 + .../mybatis/ext/CdDeviceModel.Dao.xml | 84 + .../mybatis/ext/CdDeviceProject.Dao.xml | 24 + .../mybatis/ext/CdDeviceStatus.Dao.xml | 30 + .../mybatis/ext/CdDeviceTenant.Dao.xml | 31 + .../mybatis/ext/CdDeviceToken.Dao.xml | 31 + .../mybatis/ext/CdDeviceUsageLog.Dao.xml | 52 + .../mybatis/ext/CdEngineInfo.Dao.xml | 149 + .../mybatis/ext/CdEngineReleases.Dao.xml | 62 + .../mybatis/ext/CdMobileBrand.Dao.xml | 84 + .../mybatis/ext/CdMobileDevice.Dao.xml | 634 ++++ .../resources/mybatis/ext/CdPcDevice.Dao.xml | 331 ++ .../resources/mybatis/ext/CdPcUser.Dao.xml | 21 + .../cctp-device-mgr/testDockerfile | 31 + cctp-production/cctp-mobile/Dockerfile-dev | 40 + cctp-production/cctp-mobile/Dockerfile-prod | 40 + cctp-production/cctp-mobile/Dockerfile-test | 40 + cctp-production/cctp-mobile/Dockerfile-uat | 40 + .../cctp-mobile/cctp-mobile.deployment.yaml | 76 + cctp-production/cctp-mobile/docker-ctl.sh | 175 + cctp-production/cctp-mobile/pom.xml | 213 ++ cctp-production/cctp-mobile/shell/Dockerfile | 27 + .../cctp-mobile/shell/docker-build.sh | 71 + .../cctp-mobile/shell/docker-start.sh | 77 + cctp-production/cctp-mobile/shell/nk-ms.sh | 116 + .../mobile/MobileBusinessApplication.java | 37 + .../mobile/api/device/DeviceMobileCtrl.java | 33 + .../config/ConnectThreadPoolService.java | 50 + .../mobile/config/FeignRequestConfig.java | 25 + .../cctp/mobile/config/FixedReplyConfig.java | 41 + .../mobile/config/MobileConnectionConfig.java | 19 + .../cctp/mobile/config/RabbitMQConfig.java | 22 + .../cctp/mobile/config/RedisConfig.java | 18 + .../mobile/config/RestTemplateConfig.java | 42 + .../mobile/config/WebMvcConfiguration.java | 14 + .../cctp/mobile/config/WebSocketConfig.java | 13 + .../mobile/constants/DeviceConstants.java | 18 + .../cctp/mobile/constants/ErrorMessage.java | 30 + .../constants/MobileConnectionConstants.java | 126 + .../db/impl/MobileConnectServiceImpl.java | 231 ++ .../db/service/MobileConnectService.java | 36 + .../cctp/mobile/dto/device/CdDeviceCtrl.java | 326 ++ .../cctp/mobile/dto/device/CdDeviceModel.java | 451 +++ .../cctp/mobile/dto/device/CdEngineInfo.java | 279 ++ .../cctp/mobile/dto/device/CdMobileBrand.java | 229 ++ .../mobile/dto/device/CdMobileDevice.java | 275 ++ .../cctp/mobile/dto/device/CdPcDevice.java | 484 +++ .../mobile/dto/device/DeviceDetailDto.java | 558 +++ .../cctp/mobile/dto/device/DeviceInfoDto.java | 130 + .../mobile/dto/device/DeviceQueryDto.java | 380 ++ .../dto/device/DeviceSelectQueryDto.java | 52 + .../mobile/dto/device/DeviceUiTreeDto.java | 27 + .../cctp/mobile/dto/device/TypeQuery.java | 46 + .../report/AppInstallationDataDetailDto.java | 63 + .../report/DeviceIdNameAndUrlsDetailDto.java | 56 + .../cctp/mobile/dto/report/DeviceLogDto.java | 13 + .../cctp/mobile/entity/FileMessage.java | 60 + .../cctp/mobile/entity/UpperWSRequest.java | 125 + .../cctp/mobile/entity/UpperWSResponse.java | 84 + .../cctp/mobile/entity/WSRequest.java | 116 + .../cctp/mobile/entity/WSResponse.java | 153 + .../cctp/mobile/enums/PlatformType.java | 40 + .../exception/MobileConnectException.java | 27 + .../exception/MobileRuntimeException.java | 25 + .../feign/device/DeviceMgrFeignClient.java | 24 + .../mobile/socket/MobileSessionManager.java | 246 ++ .../mobile/socket/UpperMessageHandler.java | 8 + .../mobile/socket/UpperWebSocketClient.java | 207 + .../cctp/mobile/thread/ProcessMsgThread.java | 334 ++ .../northking/cctp/mobile/util/HttpUtils.java | 50 + .../northking/cctp/mobile/util/JsonUtils.java | 68 + .../cctp/mobile/util/SpringUtils.java | 34 + .../northking/cctp/mobile/util/WSUtils.java | 58 + .../cctp-mobile/src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 85 + .../src/main/resources/logback-rabbitmq.xml | 86 + .../src/main/resources/mybatis/README.MD | 1 + .../src/main/resources/mysql/data/README.MD | 1 + .../src/main/resources/mysql/schema/README.MD | 1 + cctp-production/cctp-projects/Dockerfile-dev | 40 + cctp-production/cctp-projects/Dockerfile-prod | 40 + cctp-production/cctp-projects/Dockerfile-test | 40 + cctp-production/cctp-projects/Dockerfile-uat | 40 + cctp-production/cctp-projects/README.md | 155 + .../cctp-projects.deployment.yaml | 76 + cctp-production/cctp-projects/docker-ctl.sh | 176 + cctp-production/cctp-projects/pom.xml | 126 + .../cctp-projects/shell/Dockerfile | 27 + .../cctp-projects/shell/docker-build.sh | 71 + .../cctp-projects/shell/docker-start.sh | 77 + cctp-production/cctp-projects/shell/nk-ms.sh | 114 + .../cctp/platform/db/entity/CltDictItem.java | 355 ++ .../cctp/platform/db/entity/CpEnv.java | 314 ++ .../cctp/project/ProjectsApplication.java | 47 + .../api/env/CpProjectEnvDsPubCtrl.java | 59 + .../api/env/CpProjectEnvDsQueryCtrl.java | 60 + .../api/env/CpProjectEnvDsRestfulCtrl.java | 217 ++ .../project/api/env/CpProjectEnvPubCtrl.java | 40 + .../api/env/CpProjectEnvSysPubCtrl.java | 60 + .../api/env/CpProjectEnvSysQueryCtrl.java | 61 + .../api/env/CpProjectEnvSysRestfulCtrl.java | 137 + .../env/service/CpProjectEnvDsApiService.java | 120 + .../service/CpProjectEnvDsApiServiceImpl.java | 855 +++++ .../service/CpProjectEnvSysApiService.java | 104 + .../CpProjectEnvSysApiServiceImpl.java | 374 ++ .../api/project/CpProjectQueryCtrl.java | 127 + .../api/project/CpProjectRestfulCtrl.java | 58 + .../project/service/CpProjectApiService.java | 59 + .../service/CpProjectApiServiceImpl.java | 265 ++ .../cctp/project/api/pub/ProjectPubCtrl.java | 50 + .../cctp/project/api/pub/dto/PubDto.java | 42 + .../service/CpProjectSoftwareApiService.java | 18 + .../CpProjectSoftwareApiServiceImpl.java | 143 + .../api/team/MtProjectTeamQueryCtrl.java | 53 + .../team/service/MtProjectTeamApiService.java | 28 + .../service/MtProjectTeamApiServiceImpl.java | 71 + .../cctp/project/bus/BusConstants.java | 20 + .../project/bus/feign/CpEnvProjectDto.java | 69 + .../bus/feign/CpEnvProjectQueryDto.java | 25 + .../cctp/project/bus/feign/FlowFeign.java | 33 + .../cctp/project/bus/feign/HzBankFeign.java | 46 + .../cctp/project/bus/feign/PlatformFeign.java | 46 + .../bus/feign/PlatformForHzBankFeign.java | 24 + .../cctp/project/bus/feign/TestBugFeign.java | 22 + .../cctp/project/config/HzFeignConfig.java | 30 + .../cctp/project/config/RabbitConfig.java | 14 + .../cctp/project/config/SyncParamConfig.java | 23 + .../cctp/project/config/TaskSyncConfig.java | 53 + .../constants/ColumnTypeConstants.java | 16 + .../project/constants/ProjectAppError.java | 143 + .../project/constants/ProjectConstants.java | 288 ++ .../cctp/project/constants/README.MD | 22 + .../net/northking/cctp/project/db/README.MD | 1 + .../project/db/dao/CpProjectEnvDsDao.java | 35 + .../project/db/dao/CpProjectEnvSysDao.java | 31 + .../project/db/dao/CpProjectSoftwareDao.java | 31 + .../cctp/project/db/entity/CpProject.java | 525 +++ .../project/db/entity/CpProjectEnvDs.java | 485 +++ .../project/db/entity/CpProjectEnvSys.java | 333 ++ .../project/db/entity/CpProjectSoftware.java | 238 ++ .../db/impl/CpProjectEnvDsServiceImpl.java | 62 + .../db/impl/CpProjectEnvSysServiceImpl.java | 53 + .../project/db/impl/CpProjectServiceImpl.java | 183 + .../db/impl/CpProjectSoftwareServiceImpl.java | 52 + .../db/mapper/CpProjectEnvDsMapper.java | 39 + .../db/mapper/CpProjectEnvSysMapper.java | 34 + .../db/mapper/CpProjectSoftwareMapper.java | 29 + .../db/service/CpProjectEnvDsService.java | 25 + .../db/service/CpProjectEnvSysService.java | 31 + .../project/db/service/CpProjectService.java | 29 + .../db/service/CpProjectSoftwareService.java | 16 + .../net/northking/cctp/project/dto/README.MD | 1 + .../project/dto/env/CpProjectEnvDsAddDto.java | 189 + .../dto/env/CpProjectEnvDsConnDto.java | 141 + .../dto/env/CpProjectEnvDsDeleteDto.java | 46 + .../dto/env/CpProjectEnvDsDetailDto.java | 281 ++ .../dto/env/CpProjectEnvDsExecuteDto.java | 79 + .../dto/env/CpProjectEnvDsModuleExecDto.java | 206 + .../dto/env/CpProjectEnvDsQueryDto.java | 56 + .../dto/env/CpProjectEnvDsSelectDto.java | 46 + .../dto/env/CpProjectEnvDsUpdateDto.java | 157 + .../dto/env/CpProjectEnvSysAddDto.java | 99 + .../dto/env/CpProjectEnvSysDeleteDto.java | 46 + .../dto/env/CpProjectEnvSysDetailDto.java | 25 + .../dto/env/CpProjectEnvSysQueryDto.java | 54 + .../dto/env/CpProjectEnvSysSelectDto.java | 45 + .../dto/env/CpProjectEnvSysUpdateDto.java | 71 + .../dto/env/CpProjectEnvSysUrlSearchDto.java | 63 + .../project/dto/process/StatusRoleDto.java | 110 + .../dto/project/CpProjectDetailDto.java | 724 ++++ .../dto/project/CpProjectEnvOptionDto.java | 35 + .../dto/project/CpProjectEnvQueryDto.java | 66 + .../dto/project/CpProjectQueryDto.java | 168 + .../cctp/project/dto/project/OptionVO.java | 35 + .../project/dto/project/ProMobQueryDto.java | 82 + .../project/dto/project/ProMobResultDto.java | 87 + .../dto/project/ProjectLinkDetailDto.java | 294 ++ .../project/ProjectOverallGanttDetailDto.java | 105 + .../project/dto/project/ProjectQueryDto.java | 8 + .../dto/project/ProjectSimpleInfo.java | 149 + .../project/dto/project/ProjectSoftware.java | 57 + .../cctp/project/dto/software/Software.java | 39 + .../dto/team/MtProjectTeamDetailDto.java | 167 + .../dto/team/MtProjectTeamQueryDto.java | 132 + .../template/MtProjectTemplateDetailDto.java | 145 + .../template/MtProjectTemplateQueryDto.java | 93 + .../cctp/project/enums/OperateType.java | 11 + .../cctp/project/vo/SnowWolfProjectVO.java | 17 + .../src/main/resources/application.bak.yml | 112 + .../src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 117 + .../main/resources/db/mysql/data/README.MD | 1 + .../db/mysql/schema/cp_demand_manager.sql | 11 + .../db/mysql/schema/cp_demand_plan.sql | 22 + .../db/mysql/schema/cp_demand_system.sql | 10 + .../resources/db/mysql/schema/cp_project.sql | 25 + .../mysql/schema/cp_project_bug_process.sql | 12 + .../db/mysql/schema/cp_project_demand.sql | 12 + .../db/mysql/schema/cp_project_details.sql | 12 + .../schema/cp_project_implement_process.sql | 12 + .../db/mysql/schema/cp_project_layer.sql | 17 + .../db/mysql/schema/cp_project_manage.sql | 15 + .../db/mysql/schema/cp_project_principal.sql | 14 + .../db/mysql/schema/cp_project_risk.sql | 11 + .../db/mysql/schema/cp_project_rule.sql | 14 + .../db/mysql/schema/cp_project_software.sql | 15 + .../db/mysql/schema/cp_project_template.sql | 16 + .../resources/db/mysql/schema/cp_team.sql | 15 + .../db/mysql/schema/cp_team_member.sql | 15 + .../db/mysql/schema/mt_project_group.sql | 18 + .../db/mysql/schema/mt_project_group_user.sql | 11 + .../db/mysql/schema/mt_project_team.sql | 17 + .../db/mysql/schema/mt_project_team_role.sql | 11 + .../db/mysql/schema/mt_project_template.sql | 25 + .../schema/project_overall_gantt_chart.sql | 14 + .../db/mysql/schema/project_test_report.sql | 21 + .../main/resources/db/mysql/update/update.sql | 13 + .../src/main/resources/logback-rabbitmq.xml | 86 + .../src/main/resources/mybatis/README.MD | 1 + .../mybatis/base/CpProjectEnvDs.Mapper.xml | 519 +++ .../mybatis/base/CpProjectEnvSys.Mapper.xml | 381 ++ .../mybatis/base/CpProjectSoftware.Mapper.xml | 284 ++ .../mybatis/ext/CpProjectEnvDs.Dao.xml | 193 + .../mybatis/ext/CpProjectEnvSys.Dao.xml | 104 + .../mybatis/ext/CpProjectSoftware.Dao.xml | 61 + .../src/main/resources/mybatis/ext/README.MD | 1 + cctp-production/cctp-projects/testDockerfile | 31 + cctp-production/cctp-test-bug/Dockerfile-dev | 40 + cctp-production/cctp-test-bug/Dockerfile-prod | 40 + cctp-production/cctp-test-bug/Dockerfile-test | 40 + cctp-production/cctp-test-bug/Dockerfile-uat | 40 + cctp-production/cctp-test-bug/README.md | 45 + .../cctp-test-bug.deployment.yaml | 76 + cctp-production/cctp-test-bug/docker-ctl.sh | 176 + cctp-production/cctp-test-bug/pom.xml | 147 + .../cctp-test-bug/shell/Dockerfile | 27 + .../cctp-test-bug/shell/docker-build.sh | 71 + .../cctp-test-bug/shell/docker-start.sh | 77 + cctp-production/cctp-test-bug/shell/nk-ms.sh | 116 + .../cctp/platform/db/entity/CltDictItem.java | 356 ++ .../cctp/platform/db/entity/CpRuleConfig.java | 259 ++ .../cctp/testbug/TestBugApplication.java | 44 + .../api/BugCorrelationLinkBatchCtrl.java | 98 + .../api/BugCorrelationLinkQueryCtrl.java | 120 + .../api/BugCorrelationLinkRestfulCtrl.java | 112 + .../cctp/testbug/api/BugLogBatchCtrl.java | 100 + .../cctp/testbug/api/BugLogQueryCtrl.java | 96 + .../cctp/testbug/api/BugLogRestfulCtrl.java | 111 + .../testbug/api/BugManagementBatchCtrl.java | 104 + .../testbug/api/BugManagementQueryCtrl.java | 273 ++ .../testbug/api/BugManagementRestfulCtrl.java | 141 + .../cctp/testbug/api/BugPubCtrl.java | 96 + .../cctp/testbug/api/BugRecordBatchCtrl.java | 100 + .../cctp/testbug/api/BugRecordQueryCtrl.java | 96 + .../testbug/api/BugRecordRestfulCtrl.java | 111 + .../testbug/api/BugRelationBatchCtrl.java | 65 + .../testbug/api/MtBusinessRuleResultCtrl.java | 55 + .../api/OverallViewIndex2BatchCtrl.java | 98 + .../api/OverallViewIndex2QueryCtrl.java | 117 + .../api/OverallViewIndex2RestfulCtrl.java | 112 + .../api/OverallViewIndexBatchCtrl.java | 98 + .../api/OverallViewIndexQueryCtrl.java | 114 + .../api/OverallViewIndexRestfulCtrl.java | 112 + .../service/BugCorrelationLinkApiService.java | 108 + .../BugCorrelationLinkApiServiceImpl.java | 242 ++ .../testbug/api/service/BugLogApiService.java | 98 + .../api/service/BugLogApiServiceImpl.java | 195 + .../api/service/BugManagementApiService.java | 185 + .../service/BugManagementApiServiceImpl.java | 1549 ++++++++ .../testbug/api/service/BugNoApiService.java | 18 + .../api/service/BugNoApiServiceImpl.java | 62 + .../BugOverallTendencyChartApiService.java | 89 + ...BugOverallTendencyChartApiServiceImpl.java | 196 + .../api/service/BugRecordApiService.java | 109 + .../api/service/BugRecordApiServiceImpl.java | 244 ++ .../service/BugStatisticsChartApiService.java | 87 + .../BugStatisticsChartApiServiceImpl.java | 193 + .../testbug/api/service/EmailService.java | 7 + .../testbug/api/service/EmailServiceImpl.java | 75 + .../api/service/MtBusinessRuleService.java | 12 + .../service/MtBusinessRuleServiceImpl.java | 90 + .../service/OverallViewIndex2ApiService.java | 88 + .../OverallViewIndex2ApiServiceImpl.java | 264 ++ .../service/OverallViewIndexApiService.java | 87 + .../OverallViewIndexApiServiceImpl.java | 274 ++ .../api/service/SequenceStorageImpl.java | 60 + .../testbug/bus/constants/MQConstants.java | 26 + .../bus/publisher/NoticePublisher.java | 27 + .../publisher/NoticeRabbitMQPublisher.java | 86 + .../cctp/testbug/bus/receive/MQNotice.java | 73 + .../cctp/testbug/config/RabbitConfig.java | 18 + .../cctp/testbug/constants/MQConstant.java | 13 + .../testbug/constants/TestBugConstants.java | 83 + .../cctp/testbug/constants/TestBugError.java | 59 + .../testbug/constants/TestBugRuleCode.java | 18 + .../testbug/db/dao/BugCorrelationLinkDao.java | 32 + .../cctp/testbug/db/dao/BugLogDao.java | 26 + .../cctp/testbug/db/dao/BugManagementDao.java | 65 + .../cctp/testbug/db/dao/BugNoDao.java | 28 + .../db/dao/BugOverallTendencyChartDao.java | 28 + .../cctp/testbug/db/dao/BugRecordDao.java | 30 + .../testbug/db/dao/BugStatisticsChartDao.java | 24 + .../testbug/db/dao/MqSynchronizeTaskDao.java | 24 + .../testbug/db/dao/OverallViewIndex2Dao.java | 26 + .../testbug/db/dao/OverallViewIndexDao.java | 24 + .../testbug/db/entity/BugCorrelationLink.java | 337 ++ .../cctp/testbug/db/entity/BugLog.java | 238 ++ .../cctp/testbug/db/entity/BugManagement.java | 1182 ++++++ .../cctp/testbug/db/entity/BugNo.java | 262 ++ .../db/entity/BugOverallTendencyChart.java | 259 ++ .../cctp/testbug/db/entity/BugRecord.java | 262 ++ .../cctp/testbug/db/entity/BugSearch.java | 1164 ++++++ .../testbug/db/entity/BugStatisticsChart.java | 271 ++ .../testbug/db/entity/MqSynchronizeTask.java | 72 + .../testbug/db/entity/OverallViewIndex.java | 160 + .../testbug/db/entity/OverallViewIndex2.java | 218 ++ .../impl/BugCorrelationLinkServiceImpl.java | 66 + .../testbug/db/impl/BugLogServiceImpl.java | 54 + .../db/impl/BugManagementServiceImpl.java | 228 ++ .../testbug/db/impl/BugNoServiceImpl.java | 60 + .../BugOverallTendencyChartServiceImpl.java | 73 + .../testbug/db/impl/BugRecordServiceImpl.java | 62 + .../impl/BugStatisticsChartServiceImpl.java | 65 + .../db/impl/MqSynchronizeTaskServiceImpl.java | 98 + .../db/impl/OverallViewIndex2ServiceImpl.java | 66 + .../db/impl/OverallViewIndexServiceImpl.java | 59 + .../db/mapper/BugCorrelationLinkMapper.java | 33 + .../cctp/testbug/db/mapper/BugLogMapper.java | 30 + .../db/mapper/BugManagementMapper.java | 68 + .../cctp/testbug/db/mapper/BugNoMapper.java | 31 + .../mapper/BugOverallTendencyChartMapper.java | 30 + .../testbug/db/mapper/BugRecordMapper.java | 31 + .../testbug/db/mapper/BugSearchMapper.java | 61 + .../db/mapper/BugStatisticsChartMapper.java | 32 + .../db/mapper/MqSynchronizeTaskMapper.java | 24 + .../db/mapper/OverallViewIndex2Mapper.java | 25 + .../db/mapper/OverallViewIndexMapper.java | 25 + .../db/service/BugCorrelationLinkService.java | 31 + .../testbug/db/service/BugLogService.java | 25 + .../db/service/BugManagementService.java | 65 + .../cctp/testbug/db/service/BugNoService.java | 27 + .../BugOverallTendencyChartService.java | 30 + .../testbug/db/service/BugRecordService.java | 30 + .../db/service/BugStatisticsChartService.java | 25 + .../db/service/MqSynchronizeTaskService.java | 25 + .../db/service/OverallViewIndex2Service.java | 27 + .../db/service/OverallViewIndexService.java | 21 + .../testbug/dto/BugCorrelationLinkAddDto.java | 22 + .../dto/BugCorrelationLinkDetailDto.java | 118 + .../dto/BugCorrelationLinkQueryDto.java | 22 + .../dto/BugCorrelationLinkUpdateDto.java | 22 + .../dto/BugHighDegreeChartDetailDto.java | 154 + .../dto/BugHighDegreeChartQueryDto.java | 77 + .../cctp/testbug/dto/BugLegacyGradeDto.java | 105 + .../testbug/dto/BugLegacyGradeGroupDto.java | 70 + .../cctp/testbug/dto/BugLinkDeleteDto.java | 13 + .../cctp/testbug/dto/BugLogAddDto.java | 23 + .../cctp/testbug/dto/BugLogDetailDto.java | 66 + .../cctp/testbug/dto/BugLogQueryDto.java | 22 + .../cctp/testbug/dto/BugLogUpdateDto.java | 22 + .../cctp/testbug/dto/BugManagementAddDto.java | 306 ++ .../testbug/dto/BugManagementDetailDto.java | 249 ++ .../testbug/dto/BugManagementQueryDto.java | 535 +++ .../testbug/dto/BugManagementUpdateDto.java | 359 ++ .../cctp/testbug/dto/BugNoQueryDto.java | 33 + .../dto/BugOverallStatisticsDetailDto.java | 64 + .../dto/BugOverallTendencyChartAddDto.java | 24 + .../dto/BugOverallTendencyChartDetailDto.java | 35 + .../dto/BugOverallTendencyChartQueryDto.java | 24 + .../dto/BugOverallTendencyChartUpdateDto.java | 24 + .../cctp/testbug/dto/BugRecordAddDto.java | 23 + .../cctp/testbug/dto/BugRecordDetailDto.java | 162 + .../cctp/testbug/dto/BugRecordQueryDto.java | 22 + .../cctp/testbug/dto/BugRecordUpdateDto.java | 22 + .../cctp/testbug/dto/BugSearchAddDto.java | 23 + .../cctp/testbug/dto/BugSearchDetailDto.java | 23 + .../cctp/testbug/dto/BugSearchQueryDto.java | 23 + .../cctp/testbug/dto/BugSearchUpdateDto.java | 23 + .../testbug/dto/BugStatisticsChartAddDto.java | 40 + .../dto/BugStatisticsChartDetailDto.java | 24 + .../dto/BugStatisticsChartQueryDto.java | 24 + .../dto/BugStatisticsChartUpdateDto.java | 24 + .../dto/BugTendencyChartDetailDto.java | 132 + .../testbug/dto/BugTendencyChartQueryDto.java | 84 + .../dto/BugTendencyChartQueryTmpDto.java | 75 + .../cctp/testbug/dto/BugValidRepairRatio.java | 244 ++ .../cctp/testbug/dto/BusinessRuleDto.java | 80 + .../cctp/testbug/dto/CountBugDetailDto.java | 72 + .../testbug/dto/IsCommitBugDetailDto.java | 33 + .../cctp/testbug/dto/MidUserBugGrade.java | 210 ++ .../testbug/dto/OverallViewIndex2AddDto.java | 25 + .../dto/OverallViewIndex2DetailDto.java | 24 + .../dto/OverallViewIndex2QueryDto.java | 25 + .../dto/OverallViewIndex2UpdateDto.java | 25 + .../testbug/dto/OverallViewIndexAddDto.java | 25 + .../dto/OverallViewIndexDetailDto.java | 33 + .../testbug/dto/OverallViewIndexQueryDto.java | 24 + .../dto/OverallViewIndexUpdateDto.java | 25 + .../testbug/dto/ProjectGroupDetailDto.java | 47 + .../cctp/testbug/dto/SynBugInfoDto.java | 314 ++ .../testbug/dto/bug/BugManageQueryDto.java | 182 + .../testbug/dto/bug/BugManagementDto.java | 120 + .../cctp/testbug/dto/bug/ResultResponse.java | 48 + .../cctp/testbug/dto/bug/SearchDetailDto.java | 334 ++ .../testbug/dto/bus/AtuCaseInfoDetailDto.java | 311 ++ .../dto/bus/BugGradeStatisticsAddDto.java | 173 + .../dto/bus/BugLifeCycleChartAddDto.java | 80 + .../dto/bus/BugTendencyChartTmpAddDto.java | 102 + .../cctp/testbug/dto/bus/SynModule.java | 58 + .../cctp/testbug/dto/bus/SynSystem.java | 51 + .../cctp/testbug/dto/cases/BugSysFields.java | 48 + .../dto/cases/CltBusinessNoQueryDto.java | 78 + .../dto/cases/MtProjectTemplateDetailDto.java | 145 + .../dto/cases/MtProjectTemplateQueryDto.java | 93 + .../cctp/testbug/dto/dict/DictItem.java | 28 + .../cctp/testbug/dto/platform/CpNotice.java | 441 +++ .../CpTemplatePropertiesDetailDto.java | 56 + .../testbug/dto/platform/UserQueryDto.java | 187 + .../testbug/dto/project/CpDemandPlan.java | 332 ++ .../dto/project/CpProjectDetailDto.java | 583 +++ .../dto/project/CpProjectRuleQueryDto.java | 56 + .../testbug/dto/project/RuleConfigValue.java | 52 + .../testbug/dto/project/StatusRoleDto.java | 75 + .../dto/team/MtProjectTeamDetailDto.java | 146 + .../dto/team/MtProjectTeamQueryDto.java | 111 + .../testbug/dto/team/ProjectGroupNameDto.java | 40 + .../dto/team/ProjectUserRoleNameIdDto.java | 40 + .../northking/cctp/testbug/enums/BugFrom.java | 38 + .../cctp/testbug/enums/Emergency.java | 38 + .../cctp/testbug/enums/TestBugGrade.java | 40 + .../cctp/testbug/enums/TestBugStatus.java | 53 + .../cctp/testbug/enums/TestBugType.java | 43 + .../feign/client/CasesFeignClient.java | 29 + .../cctp/testbug/feign/client/CpProject.java | 525 +++ .../feign/client/PlatFormFeignClient.java | 100 + .../feign/client/ProjectsFeignClient.java | 150 + .../cctp/testbug/feign/client/UserInfo.java | 34 + .../testbug/feign/client/UserInfoDto.java | 67 + .../feign/server/CasesFeignServer.java | 40 + .../feign/server/PlatFormFeignServer.java | 83 + .../feign/server/ProjectsFeignServer.java | 140 + .../pub/bug/dto/BugManagementPubAddDto.java | 127 + .../testbug/pub/bug/dto/CpAttachAddDto.java | 104 + .../cctp/testbug/pub/bug/dto/PubDto.java | 24 + .../cctp/testbug/schedule/BugSchedule.java | 37 + .../schedule/service/ScheduleService.java | 8 + .../service/impl/ScheduleServiceImpl.java | 142 + .../cctp/testbug/util/BeanHelper.java | 40 + .../cctp/testbug/util/CompareFieldsUtil.java | 64 + .../cctp/testbug/util/ExcelUtil.java | 54 + .../cctp/testbug/util/HTMLToText.java | 54 + .../cctp/testbug/util/HttpClientUtil.java | 74 + .../cctp/testbug/util/ListUtils.java | 36 + .../src/main/resources/application.bak.yml | 82 + .../src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 124 + .../main/resources/db/mysql/data/README.MD | 1 + .../db/mysql/schema/bug_correlation_link.sql | 41 + .../resources/db/mysql/schema/bug_log.sql | 33 + .../db/mysql/schema/bug_management.sql | 118 + .../main/resources/db/mysql/schema/bug_no.sql | 36 + .../resources/db/mysql/schema/bug_record.sql | 36 + .../resources/db/mysql/schema/bug_search.sql | 76 + .../db/mysql/schema/mq_synchronize_task.sql | 21 + .../db/mysql/schema/overall_view_index.sql | 24 + .../db/mysql/schema/overall_view_index2.sql | 30 + .../src/main/resources/logback-rabbitmq.xml | 86 + .../base/BugCorrelationLink.Mapper.xml | 385 ++ .../resources/mybatis/base/BugLog.Mapper.xml | 291 ++ .../mybatis/base/BugManagement.Mapper.xml | 1168 ++++++ .../resources/mybatis/base/BugNo.Mapper.xml | 307 ++ .../base/BugOverallTendencyChart.Mapper.xml | 291 ++ .../mybatis/base/BugRecord.Mapper.xml | 314 ++ .../mybatis/base/BugSearch.Mapper.xml | 309 ++ .../base/BugStatisticsChart.Mapper.xml | 337 ++ .../mybatis/base/MqSynchronizeTask.Mapper.xml | 173 + .../mybatis/base/OverallViewIndex.Mapper.xml | 199 + .../mybatis/base/OverallViewIndex2.Mapper.xml | 268 ++ .../mybatis/ext/BugCorrelationLink.Dao.xml | 180 + .../main/resources/mybatis/ext/BugLog.Dao.xml | 128 + .../mybatis/ext/BugManagement.Dao.xml | 1482 ++++++++ .../main/resources/mybatis/ext/BugNo.Dao.xml | 107 + .../ext/BugOverallTendencyChart.Dao.xml | 83 + .../resources/mybatis/ext/BugRecord.Dao.xml | 150 + .../mybatis/ext/BugStatisticsChart.Dao.xml | 83 + .../mybatis/ext/MqSynchronizeTask.Dao.xml | 18 + .../mybatis/ext/OverallViewIndex.Dao.xml | 48 + .../mybatis/ext/OverallViewIndex2.Dao.xml | 90 + .../src/test/java/net/northking/Test.java | 108 + .../northking/cctp/HttpApiCaseExecutor.java | 92 + .../northking/cctp/HttpApiSuiteExecutor.java | 88 + .../test/resources/UT-http-api.round1.xlsx | Bin 0 -> 10084 bytes .../resources/example/data-source-add.xlsx | Bin 0 -> 96135 bytes .../resources/example/data-source-delete.xlsx | Bin 0 -> 89027 bytes .../resources/example/data-source-detail.xlsx | Bin 0 -> 89050 bytes .../resources/example/data-source-paging.xlsx | Bin 0 -> 94034 bytes .../resources/example/data-source-update.xlsx | Bin 0 -> 95393 bytes cctp-production/cctp-test-bug/testDockerfile | 31 + cctp-test-element/README.md | 0 .../cctp-test-element-core/pom.xml | 69 + .../cctp/element/core/APIFactory.java | 24 + .../cctp/element/core/AbstractLibrary.java | 275 ++ .../cctp/element/core/ContextInitializer.java | 88 + .../cctp/element/core/DeviceDriver.java | 12 + .../cctp/element/core/IExecuteContext.java | 133 + .../cctp/element/core/IScriptStep.java | 16 + .../cctp/element/core/IStepTarget.java | 18 + .../cctp/element/core/ITestTarget.java | 10 + .../cctp/element/core/InitializingBean.java | 12 + .../northking/cctp/element/core/Library.java | 113 + .../cctp/element/core/LibraryContext.java | 44 + .../element/core/PresetConfiguration.java | 187 + .../cctp/element/core/RegisterInfo.java | 53 + .../cctp/element/core/ResourceLoader.java | 27 + .../element/core/annotation/Argument.java | 104 + .../core/annotation/ArgumentBusMap.java | 16 + .../element/core/annotation/Autowired.java | 11 + .../cctp/element/core/annotation/Bean.java | 11 + .../cctp/element/core/annotation/Keyword.java | 70 + .../element/core/annotation/Keywords.java | 18 + .../cctp/element/core/annotation/Library.java | 21 + .../cctp/element/core/annotation/Return.java | 35 + .../core/exception/AssertException.java | 39 + .../exception/ComponentRuntimeException.java | 24 + .../core/exception/EnvironmentException.java | 24 + .../core/exception/ExecuteException.java | 37 + .../exception/FactoriesConfigException.java | 24 + .../IdentifierMismatchException.java | 24 + .../KeywordArgumentConvertException.java | 26 + .../exception/KeywordNotFoundException.java | 26 + .../exception/NoSuchLibraryException.java | 26 + .../core/exception/ParamMistakeException.java | 20 + .../core/filter/DefaultClassFilter.java | 84 + .../element/core/filter/IClassFilter.java | 13 + .../core/keyword/IKeywordExtractor.java | 21 + .../element/core/keyword/IKeywordFactory.java | 22 + .../cctp/element/core/keyword/Keyword.java | 93 + .../element/core/keyword/KeywordArgument.java | 193 + .../core/keyword/KeywordExtractor.java | 130 + .../element/core/keyword/KeywordFactory.java | 54 + .../element/core/keyword/KeywordInfo.java | 152 + .../element/core/keyword/KeywordReturn.java | 11 + .../core/reflect/ArgumentConverter.java | 181 + .../element/core/reflect/ArgumentGrouper.java | 71 + .../core/reflect/IArgumentConverter.java | 21 + .../core/reflect/IArgumentGrouper.java | 23 + .../element/core/reflect/IKeywordInvoker.java | 84 + .../element/core/reflect/KeywordInvoker.java | 179 + .../element/core/scanner/BeanClassLookup.java | 40 + .../element/core/scanner/FactoriesLoader.java | 137 + .../core/scanner/LibraryDefinition.java | 69 + .../element/core/scanner/ResourceScanner.java | 91 + .../element/core/support/BeanFactory.java | 29 + .../core/support/BeanPostProcessor.java | 66 + .../element/core/support/BeanRegistry.java | 26 + .../core/support/DefaultBeanFactory.java | 53 + .../core/support/DefaultLibraryContext.java | 222 ++ .../support/PathMatchingResourceResolver.java | 132 + .../core/support/ThreadLevelCache.java | 125 + .../cctp/element/core/type/DataType.java | 21 + .../cctp/element/core/type/EnumClass.java | 5 + .../cctp/element/core/type/InputType.java | 12 + .../element/core/type/LibraryConstant.java | 36 + .../cctp/element/core/type/NullEnum.java | 30 + .../cctp/element/core/type/ParamScope.java | 9 + .../net/northking/cctp/element/log/Level.java | 47 + .../northking/cctp/element/log/Logger.java | 71 + .../cctp/element/log/Slf4jLogger.java | 78 + .../element/scanner/JarLibraryScanner.java | 53 + .../element/scanner/JarResourceProvider.java | 38 + .../element/scanner/LibraryLoadHelper.java | 82 + .../cctp/element/system/FileStorage.java | 59 + .../cctp/element/system/SystemProperties.java | 14 + .../element/test/AbstractLibraryTest.java | 87 + .../cctp/element/test/ParamsBuilder.java | 28 + .../element/test/SampleExecuteContext.java | 233 ++ .../test/junit/LibraryJUnit4ClassRunner.java | 50 + .../cctp/element/util/AntPathMatcher.java | 1263 +++++++ .../element/util/AntPathStringMatcher.java | 98 + .../northking/cctp/element/util/Assert.java | 86 + .../northking/cctp/element/util/AtpUtils.java | 57 + .../cctp/element/util/ComponentUtils.java | 62 + .../cctp/element/util/FileUtils.java | 47 + .../northking/cctp/element/util/IOUtils.java | 22 + .../cctp/element/util/Javadoc2Libdoc.java | 242 ++ .../cctp/element/validation/Constraint.java | 174 + .../ViolateComponentStandardsException.java | 26 + .../cctp-test-element-ats/pom.xml | 98 + .../cctp/element/ats/AtsInterfaceLibrary.java | 52 + .../ats/constants/AtsUrlConstants.java | 23 + .../cctp/element/ats/dto/AtsQueryDto.java | 60 + .../element/ats/dto/AtsScenarioExecute.java | 147 + .../element/ats/dto/AtsScriptExecute.java | 127 + .../cctp/element/ats/dto/ResultResponse.java | 38 + .../ats/keywords/AtsInterfaceTools.java | 172 + .../element/ats/utils/HttpClientUtils.java | 151 + .../ats/utils/SnowflakeIdGenerator.java | 133 + .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 47 + .../cctp-test-element-basic/pom.xml | 113 + .../cctp/element/basic/BasicLibrary.java | 53 + .../element/basic/enums/DecipherTypeEnum.java | 48 + .../element/basic/enums/EncipherTypeEnum.java | 55 + .../element/basic/enums/ModeTypeEnum.java | 48 + .../element/basic/enums/ParamsTypeEnum.java | 49 + .../basic/enums/TypeConversionEnum.java | 54 + .../cctp/element/basic/keywords/Common.java | 769 ++++ .../element/basic/keywords/LogicControl.java | 141 + .../cctp/element/basic/utils/ContextUtil.java | 52 + .../cctp/element/basic/utils/DigestUtils.java | 180 + .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 99 + .../cctp/element/basic/ScanTest.java | 29 + .../element/basic/keywords/CommonTest.java | 173 + .../element/basic/utils/ContextUtilTest.java | 25 + .../cctp-test-element-collections/pom.xml | 76 + .../collections/CollectionsLibrary.java | 60 + .../enums/TypeConversionRemoveEnum.java | 47 + .../enums/TypeConversionSortEnum.java | 47 + .../collections/enums/TypeCountEnum.java | 47 + .../collections/keywords/Collections.java | 384 ++ .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 22 + .../cctp/element/CollectionsLibraryTest.java | 61 + .../cctp-test-element-database/pom.xml | 121 + .../element/database/DatabaseLibrary.java | 53 + .../database/keywords/DatabaseTools.java | 192 + .../keywords/constants/ConfigPath.java | 9 + .../keywords/util/AtuDbConfigAddTmp2Dto.java | 178 + .../keywords/util/AtuDbConfigAddTmpDto.java | 187 + .../database/keywords/util/HttpUtils.java | 95 + .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 69 + .../element/database/DatabaseLibraryTest.java | 41 + .../cctp-test-element-datetime/pom.xml | 76 + .../element/datetime/DateTimeLibrary.java | 59 + .../datetime/enums/TypeConversionEnum.java | 47 + .../enums/TypeConversionOperateEnum.java | 47 + .../element/datetime/keywords/DateTime.java | 248 ++ .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 21 + .../cctp/element/DateTimeLibraryTest.java | 51 + .../cctp-test-element-desktop/pom.xml | 82 + .../cctp/element/desktop/DesktopLibrary.java | 83 + .../desktop/constants/CmdConstant.java | 201 + .../element/desktop/constants/ConfigPath.java | 5 + .../desktop/constants/DesktopConstant.java | 51 + .../constants/ErrorMessageConstant.java | 30 + .../desktop/constants/RobotParamConstant.java | 152 + .../element/desktop/dto/EngineResult.java | 77 + .../cctp/element/desktop/dto/VariableDto.java | 96 + .../element/desktop/enums/ActionEnum.java | 52 + .../element/desktop/enums/BooleanEnum.java | 48 + .../desktop/enums/BrowserTypeEnum.java | 56 + .../element/desktop/enums/ClickTypeEnum.java | 56 + .../desktop/enums/CombinationKeyEnum.java | 56 + .../element/desktop/enums/DirectionEnum.java | 48 + .../element/desktop/enums/EnvTypeEnum.java | 48 + .../element/desktop/enums/InputModeEnum.java | 52 + .../desktop/enums/MouseButtonEnum.java | 52 + .../desktop/enums/OffsetValueEnum.java | 56 + .../element/desktop/enums/ScrollTimeEnum.java | 160 + .../desktop/enums/SelectedKeyEnum.java | 117 + .../desktop/enums/SelectedKeyTableEnum.java | 42 + .../desktop/enums/SimulateTypeEnum.java | 48 + .../desktop/enums/VerificationTypeEnum.java | 38 + .../desktop/enums/WaitForReadyEnum.java | 52 + .../element/desktop/enums/WorkWayEnum.java | 48 + .../desktop/keywords/ApplicationTools.java | 211 ++ .../desktop/keywords/DesktopTools.java | 1140 ++++++ .../desktop/service/PublicService.java | 371 ++ .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 55 + .../cctp-test-element-ftp/pom.xml | 93 + .../cctp/element/ftp/FtpLibrary.java | 52 + .../cctp/element/ftp/keywords/FtpTools.java | 186 + .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 10 + .../cctp/element/ftp/FtpLibraryTest.java | 70 + .../cctp-test-element-interface/pom.xml | 144 + .../element/internal/InterfaceLibrary.java | 71 + .../cctp/element/internal/dto/ColumnDTO.java | 93 + .../cctp/element/internal/dto/FieldDto.java | 157 + .../cctp/element/internal/dto/ParamDto.java | 81 + .../element/internal/dto/RequestBody.java | 33 + .../element/internal/dto/VariableDto.java | 86 + .../internal/enums/ReportTypeEnum.java | 35 + .../internal/keywords/CommonTools.java | 288 ++ .../internal/keywords/HttpRequest.java | 143 + .../internal/keywords/SocketRequest.java | 105 + .../internal/protocol/ResponseData.java | 32 + .../internal/protocol/http/HttpClient.java | 241 ++ .../internal/protocol/http/HttpClientKey.java | 47 + .../protocol/http/HttpResponseData.java | 126 + .../internal/protocol/http/KeyStoreType.java | 21 + .../protocol/http/RequestBuilder.java | 410 ++ .../internal/protocol/http/RequestMethod.java | 21 + .../internal/protocol/http/RequestParam.java | 467 +++ .../protocol/http/auth/AuthScheme.java | 20 + .../http/auth/oauth2/OAuth2Client.java | 227 ++ .../http/auth/oauth2/OAuth2Credentials.java | 147 + .../http/auth/oauth2/OAuth2Scheme.java | 95 + .../http/auth/oauth2/OAuth2SchemeFactory.java | 19 + .../protocol/socket/MessageHandler.java | 29 + .../socket/MessageHandlerFactory.java | 27 + .../protocol/socket/SocketClient.java | 152 + .../protocol/socket/SocketResponseData.java | 55 + .../socket/cups8583/CupsMessageHandler.java | 169 + .../protocol/socket/cups8583/CupsRequest.java | 80 + .../socket/cups8583/CupsRequestParam.java | 136 + .../protocol/socket/cups8583/CupsUtils.java | 404 ++ .../internal/CsvCupsFieldDefReader.java | 99 + .../cups8583/internal/CupsDataType.java | 33 + .../socket/cups8583/internal/CupsField.java | 151 + .../cups8583/internal/CupsFieldType.java | 31 + .../socket/cups8583/internal/CupsHeader.java | 275 ++ .../cups8583/internal/CupsMsgBodyDecoder.java | 118 + .../cups8583/internal/CupsMsgBodyEncoder.java | 185 + .../socket/cups8583/internal/ValueObject.java | 47 + .../socket/def01/Def01MessageHandler.java | 125 + .../element/internal/utils/BinaryUtils.java | 83 + .../element/internal/utils/FileServer.java | 338 ++ .../element/internal/utils/JsonUtils.java | 55 + .../internal/utils/MessageOperation.java | 124 + .../internal/utils/NetLoggerTemplate.java | 25 + .../internal/utils/TemplateHelper.java | 237 ++ .../cctp/element/internal/utils/XmlUtils.java | 36 + .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 11 + .../src/main/resources/config_cups.csv | 128 + .../cctp-test-element-json/pom.xml | 82 + .../cctp/element/json/JSONLibrary.java | 169 + .../cctp/element/json/keywords/JSON.java | 195 + .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 20 + .../cctp/element/JSONLibraryTest.java | 107 + .../cctp-test-element-mobile-ios/pom.xml | 93 + .../element/mobile/ios/MobileIosLibrary.java | 52 + .../mobile/ios/constants/CommandId.java | 34 + .../mobile/ios/constants/ConfigPath.java | 55 + .../mobile/ios/constants/UpperParamKey.java | 150 + .../mobile/ios/constants/UsingType.java | 21 + .../mobile/ios/entity/ElementHandleParam.java | 440 +++ .../mobile/ios/entity/PointMessage.java | 106 + .../element/mobile/ios/entity/StepTarget.java | 45 + .../element/mobile/ios/enums/AppEnum.java | 32 + .../mobile/ios/enums/SwipeDirection.java | 34 + .../mobile/ios/enums/TextDirection.java | 33 + .../mobile/ios/enums/WhetherOrNotEnum.java | 35 + .../mobile/ios/keywords/IOSNewTools.java | 1189 ++++++ .../ios/utils/AutomationHandleUtil.java | 1548 ++++++++ .../element/mobile/ios/utils/CommonUtils.java | 66 + .../element/mobile/ios/utils/HttpUtils.java | 95 + .../element/mobile/ios/utils/RegexUtils.java | 51 + .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 56 + .../cctp-test-element-mobile/pom.xml | 98 + .../cctp/element/mobile/MobileLibrary.java | 55 + .../element/mobile/constants/ConfigPath.java | 57 + .../element/mobile/constants/HzBankOcr.java | 15 + .../mobile/constants/HzBankOcrCode.java | 10 + .../element/mobile/constants/UsingType.java | 20 + .../cctp/element/mobile/entity/Device.java | 34 + .../element/mobile/entity/PointMessage.java | 59 + .../element/mobile/entity/ScriptParam.java | 134 + .../element/mobile/entity/StepTarget.java | 45 + .../cctp/element/mobile/enums/AppEnum.java | 32 + .../cctp/element/mobile/enums/ExistEnum.java | 31 + .../cctp/element/mobile/enums/KeyCode.java | 32 + .../element/mobile/enums/ParamTypeEnum.java | 33 + .../element/mobile/enums/PasswordKeyCode.java | 89 + .../element/mobile/enums/PasswordKeyMove.java | 96 + .../element/mobile/enums/SwipeDirection.java | 34 + .../element/mobile/enums/TextDirection.java | 33 + .../mobile/enums/WhetherOrNotEnum.java | 35 + .../element/mobile/keywords/AndroidTools.java | 145 + .../element/mobile/keywords/CommonTools.java | 2035 ++++++++++ .../element/mobile/keywords/IOSTools.java | 7 + .../mobile/thread/AppHandleThread.java | 40 + .../mobile/thread/AssertElementThread.java | 63 + .../mobile/thread/ClickElementThread.java | 82 + .../thread/ClickIfExistElementThread.java | 74 + .../thread/ClickTextDirectionTextThread.java | 59 + .../mobile/thread/ClickTextThread.java | 74 + .../mobile/thread/ClickTextThreadNew.java | 69 + .../mobile/thread/ElementSwipeThread.java | 79 + .../mobile/thread/GetCodeByOcrThread.java | 48 + .../thread/GetElementMoneyTextThread.java | 74 + .../mobile/thread/GetElementTextThread.java | 75 + .../thread/GetElementValueByOcrThread.java | 194 + .../mobile/thread/GetTableColValueThread.java | 229 ++ .../thread/GetTextDirectionTextThread.java | 56 + .../mobile/thread/IfElementThread.java | 58 + .../element/mobile/thread/IfTextThread.java | 107 + .../thread/InputFromKeyBoardThread.java | 56 + .../mobile/thread/InputPasswordThread.java | 489 +++ .../InputPasswordThreadByOcrThread.java | 470 +++ .../mobile/thread/InputTextElementThread.java | 85 + .../mobile/thread/InputTextThread.java | 90 + .../mobile/thread/LongPressThread.java | 65 + .../mobile/thread/MonkeyTestThread.java | 70 + .../mobile/thread/PressAndSwipeThread.java | 89 + .../mobile/thread/PressKeyBackThread.java | 29 + .../mobile/thread/PressKeyHomeThread.java | 48 + .../mobile/thread/PressKeyMenuThread.java | 29 + .../mobile/thread/ScreenShotThread.java | 45 + .../mobile/thread/StandardSwipeThread.java | 54 + .../SwipeAndFindTargetElementThread.java | 87 + .../element/mobile/thread/WaitThread.java | 28 + .../element/mobile/utils/CommonUtils.java | 98 + .../cctp/element/mobile/utils/HttpUtils.java | 130 + .../cctp/element/mobile/utils/RandomUtil.java | 87 + .../cctp/element/mobile/utils/RegexUtils.java | 51 + .../element/mobile/utils/RuntimeUtils.java | 27 + .../cctp/element/mobile/utils/ThreadUtil.java | 13 + .../mobile/utils/hzBank/HzBankOcrUtils.java | 216 ++ .../mobile/utils/phoneUtils/AndroidUtil.java | 46 + .../mobile/utils/phoneUtils/AppUtil.java | 114 + .../mobile/utils/phoneUtils/ElementUtil.java | 2498 ++++++++++++ .../utils/phoneUtils/FunctionKeyUtil.java | 71 + .../mobile/utils/phoneUtils/HandleUtils.java | 253 ++ .../mobile/utils/phoneUtils/IosUtil.java | 184 + .../mobile/utils/phoneUtils/ScreenUtil.java | 804 ++++ .../element/mobile/utils/thread/Xpath.java | 110 + .../cctp/element/mobile/vo/HzBankOcrVo.java | 204 + .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 75 + .../cctp-test-element-string/pom.xml | 82 + .../cctp/element/string/StringLibrary.java | 54 + .../enums/TypeConversionContainEnum.java | 48 + .../string/enums/TypeConversionPadEnum.java | 47 + .../enums/TypeConversionProcessEnum.java | 49 + .../enums/TypeConversionReplaceEnum.java | 47 + .../enums/TypeConversionSubStringEnum.java | 51 + .../element/string/keywords/StringTools.java | 581 +++ .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 42 + .../atp/element/StringLibraryTest.java | 324 ++ .../cctp-test-element-xml/pom.xml | 82 + .../cctp/element/xml/XMLLibrary.java | 149 + .../xml/enums/TypeConversionGetEnum.java | 50 + .../xml/enums/TypeConversionRemoveEnum.java | 49 + .../xml/enums/TypeConversionSetEnum.java | 49 + .../element/xml/exception/XMLException.java | 20 + .../cctp/element/xml/keywords/XML.java | 445 +++ .../resources/META-INF/cctp-class.factories | 1 + .../src/main/resources/changelog.md | 24 + .../cctp/element/XMLLibraryTest.java | 135 + .../cctp-test-element-library/pom.xml | 115 + cloud-basic/README.md | 33 + cloud-basic/cctp-commons/ReadMe.MD | 13 + cloud-basic/cctp-commons/pom.xml | 319 ++ .../cctp/common/cache/EntityNameCache.java | 77 + .../cctp/common/cache/EntityNameCatalog.java | 39 + .../cache/EntityNameRedisRepository.java | 59 + .../common/config/CacheConfiguration.java | 189 + .../cctp/common/config/EnableNKCloud.java | 22 + .../config/EnableNKDataSourceCluster.java | 26 + .../cctp/common/config/EnableNKWebMvc.java | 22 + .../common/config/GlobalConfiguration.java | 115 + .../NKDataSourceClusterConfiguration.java | 49 + .../common/config/SwaggerConfiguration.java | 114 + .../cctp/common/db/AbstractService.java | 106 + .../northking/cctp/common/db/BasicDao.java | 37 + .../cctp/common/db/BasicService.java | 62 + .../cctp/common/db/DefaultPagination.java | 136 + .../net/northking/cctp/common/db/OrderBy.java | 57 + .../net/northking/cctp/common/db/POJO.java | 11 + .../northking/cctp/common/db/Pagination.java | 49 + .../cctp/common/db/PaginationService.java | 136 + .../cctp/common/db/PagingQueryDao.java | 24 + .../northking/cctp/common/db/Partition.java | 52 + .../northking/cctp/common/db/SqlOrderBy.java | 100 + .../db/annotation/DatabaseReadOnly.java | 22 + .../db/annotation/DatabaseWriteOnly.java | 22 + .../cctp/common/db/ds/DynamicDataSource.java | 170 + .../db/ds/DynamicDataSourceContext.java | 45 + .../db/ds/DynamicDataSourceService.java | 17 + .../cctp/common/db/entity/Entity.java | 66 + .../common/db/entity/EntityDBService.java | 46 + .../cctp/common/db/entity/EntityService.java | 43 + .../common/db/excel/AbstractExcelService.java | 474 +++ .../cctp/common/db/excel/ExcelHeader.java | 66 + .../cctp/common/db/excel/ExcelService.java | 46 + .../db/mode/AbstractClusterDataSource.java | 56 + .../common/db/mode/DataBaseModeAspect.java | 44 + .../common/db/mode/DataBaseModeContext.java | 80 + .../common/db/mode/DataSourceCluster.java | 182 + .../db/mode/DataSourceClusterProperties.java | 37 + .../cctp/common/db/mode/DataSourceConfig.java | 157 + .../mode/NKDataSourceClusterProperties.java | 35 + .../db/mode/SingleClusterDataSource.java | 101 + .../cctp/common/db/tree/EntityTree.java | 79 + .../common/db/tree/EntityTreeService.java | 226 ++ .../cctp/common/dto/AdvancedQueryOptions.java | 22 + .../cctp/common/dto/AssociatedFilesDto.java | 25 + .../cctp/common/dto/CpLogAddDto.java | 190 + .../cctp/common/dto/UserOptions.java | 41 + .../common/enums/FileBusinessTypeEnum.java | 98 + .../common/exception/ApiExceptionHandler.java | 201 + .../cctp/common/exception/ErrorEnum.java | 53 + .../exception/PlatformAuthException.java | 18 + .../cctp/common/exception/PlatformError.java | 13 + .../exception/PlatformForbiddenException.java | 18 + .../exception/PlatformRuntimeException.java | 37 + .../common/feign/ApiAtsEnviromentFeign.java | 30 + .../cctp/common/feign/FeignCctpConfig.java | 41 + .../feign/MonsterCommonFeignClient.java | 30 + .../cctp/common/feign/MonsterLogServer.java | 50 + .../cctp/common/http/QueryByPage.java | 196 + .../cctp/common/http/QueryOrderBy.java | 77 + .../cctp/common/http/ResultCodeEnum.java | 56 + .../cctp/common/http/ResultWrapper.java | 169 + .../cctp/common/jpa/BasicJpaRepository.java | 64 + .../cctp/common/jpa/CctpJpaRepository.java | 150 + .../jpa/interceptor/BasicJpaInterceptor.java | 35 + .../CreatedUpdatedJpaInterceptor.java | 52 + .../interceptor/IDEntityJpaInterceptor.java | 30 + .../jpa/interceptor/JpaInterceptor.java | 19 + .../jpa/interceptor/TenantJpaInterceptor.java | 36 + .../northking/cctp/common/log/HttpLog.java | 354 ++ .../cctp/common/log/HttpLogAspect.java | 177 + .../cctp/common/log/HttpLogProducer.java | 22 + .../common/log/HttpLogRabbitMQProducer.java | 89 + .../cctp/common/persistence/BizEntity.java | 121 + .../cctp/common/persistence/IDEntity.java | 34 + .../cctp/common/persistence/NamedEntity.java | 37 + .../persistence/rule/CreatedUpdatedRule.java | 28 + .../common/persistence/rule/IdentityRule.java | 11 + .../persistence/rule/LogicDeletedRule.java | 14 + .../common/persistence/rule/NamedRule.java | 15 + .../common/persistence/rule/RevisionRule.java | 14 + .../common/persistence/rule/TenantRule.java | 14 + .../cctp/common/s3/AmazonS3Properties.java | 127 + .../cctp/common/s3/AttachMQProducer.java | 55 + .../cctp/common/s3/AttachmentProducer.java | 24 + .../northking/cctp/common/s3/ContentType.java | 51 + .../northking/cctp/common/s3/EnableS3.java | 21 + .../cctp/common/s3/FileDownloadException.java | 18 + .../cctp/common/s3/FileUploadException.java | 13 + .../net/northking/cctp/common/s3/NKFile.java | 121 + .../cctp/common/s3/S3Configuration.java | 39 + .../net/northking/cctp/common/s3/S3File.java | 212 ++ .../cctp/common/s3/SimpleStorageService.java | 107 + .../cctp/common/s3/impl/MinioFileStorage.java | 370 ++ .../common/s3/impl/SeaweedFileStorage.java | 369 ++ .../cctp/common/saas/SaaSContext.java | 63 + .../northking/cctp/common/saas/Tenant.java | 213 ++ .../cache/SaaSAppDataSourceClusterCache.java | 32 + ...aSAppDataSourceClusterRedisRepository.java | 45 + .../common/saas/cache/SaaSTenantCache.java | 47 + .../common/saas/cache/StaticTenantCache.java | 67 + .../common/saas/config/SaaSConfiguration.java | 51 + .../common/saas/config/SaaSProperties.java | 48 + .../db/MultiClusterDynamicDataSource.java | 145 + .../cctp/common/saas/db/TenantDBService.java | 30 + .../common/saas/db/TenantEntityService.java | 46 + .../saas/db/TenantPaginationService.java | 44 + .../cctp/common/saas/db/TenantPartition.java | 10 + .../security/SecurityHttpConstants.java | 55 + .../authentication/NKSecurityContext.java | 91 + .../authorization/ResourceAuthority.java | 105 + .../authorization/ResourceAuthorityCache.java | 43 + .../ResourceAuthorityRedisRepository.java | 157 + .../sequence/SequenceDistributedService.java | 94 + .../common/sequence/SequenceNoneStorage.java | 28 + .../cctp/common/sequence/SequenceService.java | 26 + .../cctp/common/sequence/SequenceStorage.java | 25 + .../northking/cctp/common/util/CamelUtil.java | 66 + .../northking/cctp/common/util/DateUtil.java | 150 + .../cctp/common/util/EntityUtils.java | 262 ++ .../northking/cctp/common/util/UUIDUtil.java | 27 + .../cctp/common/util/WebFluxNetUtils.java | 69 + .../cctp/common/util/WebNetUtils.java | 67 + .../util/excelUtil/ExcelMergedRegionBean.java | 69 + .../common/util/excelUtil/ExcelResult.java | 48 + .../common/util/excelUtil/ExcelToolUtil.java | 61 + .../common/util/excelUtil/ExportExcel.java | 390 ++ .../common/util/excelUtil/ImportExcel.java | 528 +++ .../excelEntity/CellStyleTemplate.java | 47 + .../excelEntity/ExcelDataTemplate.java | 122 + .../util/excelUtil/excelEntity/ExcelHead.java | 121 + .../util/excelUtil/excelEntity/SheetHead.java | 119 + .../excelUtil/excelEntity/SheetTemplate.java | 46 + .../cctp/common/validation/ValAddGroup.java | 8 + .../common/validation/ValUpdateGroup.java | 8 + .../cctp/common/util/CamelUtilTest.java | 26 + .../cctp/common/util/DateUtilTest.java | 102 + .../cctp/common/util/UUIDUtilTest.java | 20 + cloud-basic/cctp-flowable/Dockerfile-dev | 40 + cloud-basic/cctp-flowable/Dockerfile-prod | 40 + cloud-basic/cctp-flowable/Dockerfile-test | 40 + cloud-basic/cctp-flowable/Dockerfile-uat | 40 + .../cctp-flowable.deployment.yaml | 76 + cloud-basic/cctp-flowable/docker-ctl.sh | 178 + cloud-basic/cctp-flowable/pom.xml | 124 + cloud-basic/cctp-flowable/shell/Dockerfile | 27 + .../cctp-flowable/shell/docker-build.sh | 71 + .../cctp-flowable/shell/docker-start.sh | 77 + cloud-basic/cctp-flowable/shell/nk-ms.sh | 116 + .../java/net/northking/cctp/diagram/Edge.java | 42 + .../net/northking/cctp/diagram/Graph.java | 15 + .../net/northking/cctp/diagram/Identity.java | 28 + .../java/net/northking/cctp/diagram/Item.java | 43 + .../java/net/northking/cctp/diagram/Node.java | 18 + .../net/northking/cctp/diagram/Point.java | 42 + .../cctp/flowable/WorkFlowAppRunner.java | 24 + .../cctp/flowable/WorkFlowApplication.java | 46 + .../api/implement/ImplementProcessCtrl.java | 147 + .../service/ImplementProcessService.java | 33 + .../service/ImplementProcessServiceImpl.java | 455 +++ .../flowable/api/sm/StateAuthQueryCtrl.java | 77 + .../api/sm/StateProcessActHistoryCtrl.java | 82 + .../flowable/api/sm/StateProcessDefCtrl.java | 180 + .../api/sm/StateProcessDeploymentCtrl.java | 83 + .../api/sm/StateProcessInstanceCtrl.java | 37 + .../service/StateProcessActHisApiService.java | 69 + .../sm/service/StateProcessDefApiService.java | 108 + .../StateProcessDefApiServiceImpl.java | 626 +++ .../StateProcessDeploymentApiService.java | 51 + .../StateProcessDeploymentApiServiceImpl.java | 57 + .../cctp/flowable/bus/BusConstants.java | 31 + .../cctp/flowable/bus/dto/ImFlowMQDto.java | 27 + .../cctp/flowable/bus/mq/FlowPublisher.java | 57 + .../flowable/bus/platform/CpLogAddDto.java | 166 + .../flowable/bus/platform/LogPublisher.java | 7 + .../bus/platform/LogRabbitMQPublisher.java | 44 + .../bus/receiver/PlatformMQReceiver.java | 74 + .../flowable/common/FlowableConstants.java | 39 + .../cctp/flowable/common/enums/ItemType.java | 29 + .../common/exception/FlowAppError.java | 63 + .../cctp/flowable/config/RabbitConfig.java | 14 + .../cctp/flowable/db/entity/IpEvent.java | 293 ++ .../cctp/flowable/db/entity/IpProcess.java | 339 ++ .../cctp/flowable/db/entity/IpState.java | 270 ++ .../cctp/flowable/db/entity/SpActHis.java | 279 ++ .../cctp/flowable/db/entity/SpAction.java | 378 ++ .../cctp/flowable/db/entity/SpDefEvent.java | 362 ++ .../flowable/db/entity/SpDefEventAuth.java | 155 + .../cctp/flowable/db/entity/SpDefItemExt.java | 201 + .../cctp/flowable/db/entity/SpDefProcess.java | 421 +++ .../db/entity/SpDefProcessAction.java | 178 + .../flowable/db/entity/SpDefProcessAuth.java | 132 + .../cctp/flowable/db/entity/SpDefState.java | 339 ++ .../cctp/flowable/db/entity/SpDeployment.java | 240 ++ .../flowable/db/jpa/IpEventRepository.java | 20 + .../flowable/db/jpa/IpProcessRepository.java | 42 + .../flowable/db/jpa/IpStateRepository.java | 20 + .../flowable/db/jpa/SpActHisRepository.java | 20 + .../flowable/db/jpa/SpActionRepository.java | 20 + .../db/jpa/SpDefEventAuthRepository.java | 20 + .../flowable/db/jpa/SpDefEventRepository.java | 20 + .../db/jpa/SpDefItemExtRepository.java | 20 + .../db/jpa/SpDefProcessActionRepository.java | 20 + .../db/jpa/SpDefProcessAuthRepository.java | 20 + .../db/jpa/SpDefProcessRepository.java | 45 + .../flowable/db/jpa/SpDefStateRepository.java | 45 + .../db/jpa/SpDeploymentRepository.java | 20 + .../northking/cctp/flowable/dto/ip/Event.java | 108 + .../cctp/flowable/dto/ip/IpProcessState.java | 222 ++ .../northking/cctp/flowable/dto/ip/State.java | 87 + .../cctp/flowable/dto/sm/CltDictItem.java | 368 ++ .../cctp/flowable/dto/sm/StateAuthDto.java | 63 + .../dto/sm/StateProcessActHisDto.java | 15 + .../dto/sm/StateProcessActHisQueryDto.java | 15 + .../flowable/dto/sm/StateProcessDefDto.java | 218 ++ .../dto/sm/StateProcessDefQueryDto.java | 15 + .../dto/sm/StateProcessDeploymentDto.java | 15 + .../sm/StateProcessDeploymentQueryDto.java | 15 + .../flowable/dto/sm/SyncCltDictItemDto.java | 74 + .../engine/DefaultStateProcessEngine.java | 39 + .../flowable/pub/StateAuthPubQueryCtrl.java | 55 + .../northking/cctp/flowable/sm/Activity.java | 37 + .../cctp/flowable/sm/Coordinate.java | 55 + .../net/northking/cctp/flowable/sm/Event.java | 176 + .../cctp/flowable/sm/EventAuthority.java | 66 + .../net/northking/cctp/flowable/sm/State.java | 177 + .../cctp/flowable/sm/StateProcessAction.java | 30 + .../flowable/sm/StateProcessDefinition.java | 333 ++ .../cctp/flowable/sm/StateProcessEngine.java | 38 + .../flowable/sm/StateProcessInstance.java | 15 + .../src/main/resources/application.bak.yml | 77 + .../src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 113 + .../resources/db/mysql/schema/ip_event.sql | 16 + .../resources/db/mysql/schema/ip_process.sql | 17 + .../resources/db/mysql/schema/ip_state.sql | 17 + .../resources/db/mysql/schema/sp_act_his.sql | 15 + .../resources/db/mysql/schema/sp_action.sql | 20 + .../db/mysql/schema/sp_def_event.sql | 20 + .../db/mysql/schema/sp_def_event_auth.sql | 11 + .../db/mysql/schema/sp_def_item_ext.sql | 12 + .../db/mysql/schema/sp_def_process.sql | 21 + .../db/mysql/schema/sp_def_process_action.sql | 11 + .../db/mysql/schema/sp_def_process_auth.sql | 9 + .../db/mysql/schema/sp_def_state.sql | 19 + .../db/mysql/schema/sp_deployment.sql | 14 + .../src/main/resources/logback-rabbitmq.xml | 86 + .../api/sm/StateProcessDefCtrlTest.java | 54 + .../src/test/resources/application.yml | 77 + .../src/test/resources/sm/defect01.sp.json | 54 + cloud-basic/cctp-flowable/testDockerfile | 31 + cloud-basic/cctp-maven-plugin/pom.xml | 71 + .../cctp/maven/analyse/Constants.java | 180 + .../cctp/maven/analyse/JDBCConfig.java | 156 + .../cctp/maven/analyse/Messages.java | 185 + .../maven/analyse/dialects/AbsDialect.java | 285 ++ .../maven/analyse/dialects/DBDialects.java | 59 + .../cctp/maven/analyse/dialects/Dialect.java | 31 + .../maven/analyse/dialects/MySQLDialect.java | 163 + .../analyse/dialects/PostgreSQLDialect.java | 32 + .../maven/analyse/entity/AttributesRef.java | 239 ++ .../cctp/maven/analyse/entity/ColumnRef.java | 345 ++ .../maven/analyse/entity/ForeignKeyRef.java | 162 + .../maven/analyse/entity/IndexInfoRef.java | 122 + .../maven/analyse/entity/JavaClassRef.java | 336 ++ .../maven/analyse/entity/PrimaryKeyRef.java | 86 + .../cctp/maven/analyse/entity/TableRef.java | 420 +++ .../cctp/maven/analyse/util/DBUtil.java | 136 + .../cctp/maven/analyse/util/StringUtil.java | 104 + .../maven/analyse/util/TypeSqlToJava.java | 148 + .../cctp/maven/gen/CCTPGenerator.java | 265 ++ .../northking/cctp/maven/gen/Constants.java | 26 + .../cctp/maven/gen/GenCodeTaskEnum.java | 117 + .../northking/cctp/maven/gen/VMGenerator.java | 317 ++ .../maven/plugin/AbsDatabaseLoadMojo.java | 96 + .../northking/cctp/maven/plugin/DtoMojo.java | 48 + .../cctp/maven/plugin/EntityMojo.java | 62 + .../cctp/maven/plugin/HttpApiMojo.java | 65 + .../northking/cctp/maven/plugin/JpaMojo.java | 48 + .../northking/cctp/maven/plugin/MainMojo.java | 148 + .../maven/plugin/MybatisMapperBaseMojo.java | 49 + .../maven/plugin/MybatisMapperExtMojo.java | 49 + .../cctp/maven/plugin/MybatisMojo.java | 62 + .../cctp/maven/plugin/MybatisServiceMojo.java | 49 + .../northking/cctp/maven/plugin/VueMojo.java | 58 + .../cctp/maven/tenant/TenantEntityMojo.java | 63 + .../cctp/maven/tenant/TenantJpaMojo.java | 49 + .../cctp/maven/tenant/TenantMybatisMojo.java | 63 + .../main/resources/api/api-service-impl.vm | 181 + .../src/main/resources/api/api-service.vm | 81 + .../src/main/resources/api/batch-ctrl.vm | 96 + .../src/main/resources/api/query-ctrl.vm | 99 + .../src/main/resources/api/restful-ctrl.vm | 109 + .../src/main/resources/api/restful-dto-add.vm | 25 + .../main/resources/api/restful-dto-detail.vm | 24 + .../main/resources/api/restful-dto-query.vm | 26 + .../main/resources/api/restful-dto-update.vm | 25 + .../config/messages_en_US.properties | 28 + .../main/resources/config/messages_zh_CN.out | 16 + .../config/messages_zh_CN.properties | 28 + .../main/resources/config/nkplugin.properties | 3 + .../src/main/resources/dao/dao.vm | 46 + .../src/main/resources/dao/daoXml.vm | 63 + .../src/main/resources/dao/jpa-tenant.vm | 20 + .../src/main/resources/dao/jpa.vm | 20 + .../src/main/resources/dao/mapper.vm | 25 + .../main/resources/dao/mapperXml-tenant.vm | 168 + .../src/main/resources/dao/mapperXml.vm | 172 + .../src/main/resources/dto/dto.vm | 71 + .../main/resources/pojo/JpaEntity-tenant.vm | 92 + .../src/main/resources/pojo/JpaEntity.vm | 91 + .../src/main/resources/pojo/entity-tenant.vm | 89 + .../src/main/resources/pojo/entity.vm | 89 + .../src/main/resources/service/service.vm | 45 + .../resources/service/serviceImpl-tenant.vm | 73 + .../src/main/resources/service/serviceImpl.vm | 73 + .../src/main/resources/vue/add.vue.vm | 96 + .../src/main/resources/vue/detail.vue.vm | 80 + .../src/main/resources/vue/edit.vue.vm | 116 + .../src/main/resources/vue/entity.js.vm | 26 + .../src/main/resources/vue/index.vue.vm | 167 + .../src/main/resources/vue/router.js.vm | 34 + .../analyse/dialects/MySQLDialectTest.java | 23 + cloud-basic/production-parent/README.md | 5 + .../production-parent/cctp-parent/pom.xml | 434 +++ cloud-basic/production-parent/pom.xml | 68 + cloud-basic/sample-weed-client/pom.xml | 61 + .../org/lokra/seaweedfs/core/Connection.java | 767 ++++ .../org/lokra/seaweedfs/core/FileSource.java | 243 ++ .../lokra/seaweedfs/core/FileTemplate.java | 430 +++ .../lokra/seaweedfs/core/MasterWrapper.java | 154 + .../lokra/seaweedfs/core/VolumeWrapper.java | 215 ++ .../core/contect/AssignFileKeyParams.java | 118 + .../core/contect/AssignFileKeyResult.java | 80 + .../contect/ForceGarbageCollectionParams.java | 61 + .../core/contect/LocationResult.java | 78 + .../core/contect/LookupVolumeParams.java | 83 + .../core/contect/LookupVolumeResult.java | 69 + .../contect/PreAllocateVolumesParams.java | 124 + .../contect/PreAllocateVolumesResult.java | 48 + .../seaweedfs/core/file/FileHandleStatus.java | 78 + .../seaweedfs/core/http/HeaderResponse.java | 68 + .../seaweedfs/core/http/JsonResponse.java | 37 + .../seaweedfs/core/http/StreamResponse.java | 82 + .../seaweedfs/core/topology/DataCenter.java | 78 + .../seaweedfs/core/topology/DataNode.java | 88 + .../lokra/seaweedfs/core/topology/Layout.java | 78 + .../seaweedfs/core/topology/MasterStatus.java | 76 + .../lokra/seaweedfs/core/topology/Rack.java | 78 + .../core/topology/ReplicaPlacement.java | 71 + .../core/topology/SystemClusterStatus.java | 72 + .../core/topology/SystemTopologyStatus.java | 99 + .../lokra/seaweedfs/core/topology/Volume.java | 150 + .../seaweedfs/core/topology/VolumeStatus.java | 76 + .../exception/SeaweedfsException.java | 36 + .../SeaweedfsFileDeleteException.java | 55 + .../SeaweedfsFileNotFoundException.java | 34 + .../lokra/seaweedfs/util/ConnectionUtil.java | 78 + .../seaweedfs/util/RequestPathStrategy.java | 38 + .../org/lokra/seaweedfs/FileSystemTest.java | 53 + .../lokra/seaweedfs/core/ConnectionTest.java | 87 + .../lokra/seaweedfs/core/FileSourceTest.java | 54 + .../seaweedfs/core/FileTemplateTest.java | 119 + .../seaweedfs/core/MasterWrapperTest.java | 79 + .../seaweedfs/core/VolumeWrapperTest.java | 131 + cloud-platform/README.md | 64 + cloud-platform/cctp-attachment/Dockerfile-dev | 41 + .../cctp-attachment/Dockerfile-prod | 41 + .../cctp-attachment/Dockerfile-test | 41 + cloud-platform/cctp-attachment/Dockerfile-uat | 41 + cloud-platform/cctp-attachment/docker-ctl.sh | 177 + cloud-platform/cctp-attachment/pom.xml | 125 + .../cctp-attachment/shell/docker-build.sh | 71 + .../cctp-attachment/shell/docker-start.sh | 77 + cloud-platform/cctp-attachment/shell/nk-ms.sh | 116 + .../attachment/AttachmentApplication.java | 50 + .../cctp/attachment/api/AttachFileCtrl.java | 213 ++ .../api/service/AttachFileService.java | 87 + .../api/service/AttachFileServiceImpl.java | 543 +++ .../attachment/api/service/FileService.java | 12 + .../api/service/FileServiceImpl.java | 508 +++ .../attachment/bus/AttachmentConsumer.java | 23 + .../attachment/bus/AttachmentMQConsumer.java | 93 + .../attachment/constant/FileConstant.java | 28 + .../attachment/constant/ScriptConstant.java | 71 + .../cctp/attachment/db/dao/AttachmentDao.java | 54 + .../cctp/attachment/db/entity/Attachment.java | 223 ++ .../db/impl/AttachmentServiceImpl.java | 177 + .../db/mapper/AttachmentMapper.java | 32 + .../db/service/AttachmentService.java | 90 + .../cctp/attachment/dto/ChunkFiles.java | 41 + .../cctp/attachment/dto/FileMessage.java | 60 + .../cctp/attachment/enums/FileError.java | 41 + .../cctp/attachment/enums/PlatformType.java | 31 + .../attachment/util/NorthKingIpaPngFix.java | 232 ++ .../cctp/attachment/util/PNGIHDRTrunk.java | 13 + .../cctp/attachment/util/PNGTrunk.java | 126 + .../cctp/attachment/util/XMLUtils.java | 82 + .../src/main/resources/application.bak.yml | 99 + .../src/main/resources/bootstrap.yml | 111 + .../resources/db/mysql/schema/attachment.sql | 21 + .../src/main/resources/logback-rabbitmq.xml | 87 + .../mybatis/base/Attachment.Mapper.xml | 400 ++ .../resources/mybatis/ext/Attachment.Dao.xml | 192 + cloud-platform/cctp-attachment/testDockerfile | 32 + cloud-platform/cctp-dw/Dockerfile-dev | 40 + cloud-platform/cctp-dw/Dockerfile-prod | 40 + cloud-platform/cctp-dw/Dockerfile-test | 40 + cloud-platform/cctp-dw/Dockerfile-uat | 40 + cloud-platform/cctp-dw/README.md | 149 + .../cctp-dw/cctp-dw.deployment.yaml | 76 + cloud-platform/cctp-dw/docker-ctl.sh | 177 + cloud-platform/cctp-dw/pom.xml | 122 + cloud-platform/cctp-dw/shell/docker-build.sh | 71 + cloud-platform/cctp-dw/shell/docker-start.sh | 77 + cloud-platform/cctp-dw/shell/nk-ms.sh | 116 + .../northking/cctp/dw/CCTPDwApplication.java | 41 + .../northking/cctp/dw/api/BugChartCtrl.java | 34 + .../dw/api/BugGradeStatisticsQueryCtrl.java | 124 + .../dw/api/BugLifeCycleChartQueryCtrl.java | 122 + .../api/BugOverallTendencyChartQueryCtrl.java | 117 + .../dw/api/BugStatusStatisticsQueryCtrl.java | 126 + .../dw/api/BugTemplateStatusBatchCtrl.java | 98 + .../dw/api/BugTemplateStatusQueryCtrl.java | 101 + .../dw/api/BugTemplateStatusRestfulCtrl.java | 112 + .../dw/api/BugTendencyChartTmpQueryCtrl.java | 121 + .../cctp/dw/api/CpProjectDetailCtrl.java | 62 + .../dw/api/DwCaseDesignInfoQueryCtrl.java | 55 + .../dw/api/DwPlanExecutionForHzBankCtrl.java | 14 + .../dw/api/DwScriptQueryForHzBankCtrl.java | 97 + .../cctp/dw/api/MobileScreenDataCtrl.java | 108 + .../dw/api/MtCaseDesignChartQueryCtrl.java | 100 + .../cctp/dw/api/MtCaseDesignCtrl.java | 33 + .../cctp/dw/api/MtCaseExecChartQueryCtrl.java | 122 + .../dw/api/MtCaseExecTrendChartQueryCtrl.java | 121 + .../cctp/dw/api/MtLeafDesignQueryCtrl.java | 121 + .../cctp/dw/api/MtManualExecJobCtrl.java | 33 + .../cctp/dw/api/MtProjectOverviewCtrl.java | 63 + .../cctp/dw/api/MtTestChartCtrl.java | 36 + .../cctp/dw/api/MtTestPointCtrl.java | 34 + .../api/MtTestPointStatisticsQueryCtrl.java | 122 + .../northking/cctp/dw/api/ScreenDataCtrl.java | 185 + .../api/atu/DwAtuCaseDesignRestfulCtrl.java | 58 + .../api/atu/DwAtuScriptInfoRestfulCtrl.java | 55 + .../api/atu/DwReBusComponentRestfulCtrl.java | 57 + .../service/DwAtuCaseDesignApiService.java | 85 + .../DwAtuCaseDesignApiServiceImpl.java | 224 ++ .../atu/service/DwAtuPlanBatchApiService.java | 13 + .../service/DwAtuPlanBatchApiServiceImpl.java | 40 + .../service/DwAtuPlanEnvLinkApiService.java | 16 + .../DwAtuPlanEnvLinkApiServiceImpl.java | 55 + .../atu/service/DwAtuPlanInfoApiService.java | 13 + .../service/DwAtuPlanInfoApiServiceImpl.java | 41 + .../DwAtuPlanScriptLinkApiService.java | 15 + .../DwAtuPlanScriptLinkApiServiceImpl.java | 44 + .../atu/service/DwAtuPlanTaskApiService.java | 13 + .../service/DwAtuPlanTaskApiServiceImpl.java | 39 + .../service/DwAtuScriptInfoApiService.java | 85 + .../DwAtuScriptInfoApiServiceImpl.java | 222 ++ .../service/DwAtuScriptVersionApiService.java | 87 + .../DwAtuScriptVersionApiServiceImpl.java | 186 + .../service/DwReBusComponentApiService.java | 85 + .../DwReBusComponentApiServiceImpl.java | 220 ++ .../cctp/dw/api/service/BugChartService.java | 73 + .../dw/api/service/BugChartServiceImpl.java | 364 ++ .../service/BugGradeStatisticsApiService.java | 84 + .../BugGradeStatisticsApiServiceImpl.java | 208 + .../service/BugLifeCycleChartApiService.java | 87 + .../BugLifeCycleChartApiServiceImpl.java | 189 + .../BugOverallTendencyChartApiService.java | 92 + ...BugOverallTendencyChartApiServiceImpl.java | 213 ++ .../BugStatusStatisticsApiService.java | 89 + .../BugStatusStatisticsApiServiceImpl.java | 248 ++ .../service/BugTemplateStatusApiService.java | 92 + .../BugTemplateStatusApiServiceImpl.java | 196 + .../BugTendencyChartTmpApiService.java | 84 + .../BugTendencyChartTmpApiServiceImpl.java | 196 + .../cctp/dw/api/service/ChartApiService.java | 69 + .../dw/api/service/ChartApiServiceImpl.java | 365 ++ .../service/CpProjectDetailApiService.java | 23 + .../CpProjectDetailApiServiceImpl.java | 80 + .../service/DwCaseDesignInfoApiService.java | 84 + .../DwCaseDesignInfoApiServiceImpl.java | 187 + .../api/service/MtCaseDesignApiService.java | 63 + .../service/MtCaseDesignApiServiceImpl.java | 178 + .../service/MtCaseDesignChartApiService.java | 90 + .../MtCaseDesignChartApiServiceImpl.java | 199 + .../service/MtCaseExecChartApiService.java | 84 + .../MtCaseExecChartApiServiceImpl.java | 205 + .../MtCaseExecTrendChartApiService.java | 84 + .../MtCaseExecTrendChartApiServiceImpl.java | 188 + .../api/service/MtLeafDesignApiService.java | 84 + .../service/MtLeafDesignApiServiceImpl.java | 187 + .../service/MtManualExecJobApiService.java | 91 + .../MtManualExecJobApiServiceImpl.java | 228 ++ .../dw/api/service/MtTestPointApiService.java | 46 + .../service/MtTestPointApiServiceImpl.java | 142 + .../MtTestPointStatisticsApiService.java | 84 + .../MtTestPointStatisticsApiServiceImpl.java | 200 + .../service/ProjectOverviewApiService.java | 17 + .../ProjectOverviewApiServiceImpl.java | 47 + .../UIDwAtuPlanExecutionApiService.java | 20 + .../UIDwAtuPlanExecutionApiServiceImpl.java | 38 + .../UIDwAtuScriptExecutionApiService.java | 11 + .../UIDwAtuScriptExecutionApiServiceImpl.java | 21 + .../service/UIDwAtuStatisticsApiService.java | 22 + .../UIDwAtuStatisticsApiServiceImpl.java | 34 + .../cctp/dw/bus/AtuDataListener.java | 382 ++ .../cctp/dw/bus/CaseDesginDataListener.java | 117 + .../cctp/dw/bus/ExecJobDataListener.java | 173 + .../cctp/dw/bus/HandleDataListener.java | 431 +++ .../net/northking/cctp/dw/bus/MQNotice.java | 70 + .../cctp/dw/bus/RabbitMqListener.java | 321 ++ .../cctp/dw/bus/TestPointDataListener.java | 97 + .../cctp/dw/config/RabbitConfig.java | 18 + .../cctp/dw/constant/DWBaseConstant.java | 38 + .../cctp/dw/constant/DWConstant.java | 104 + .../northking/cctp/dw/constant/DWError.java | 62 + .../cctp/dw/constant/MQConstant.java | 39 + .../cctp/dw/db/dao/BugDensityChartDao.java | 39 + .../cctp/dw/db/dao/BugGradeStatisticsDao.java | 35 + .../cctp/dw/db/dao/BugLegacyGradeDao.java | 30 + .../cctp/dw/db/dao/BugLifeCycleChartDao.java | 33 + .../dw/db/dao/BugOverallTendencyChartDao.java | 42 + .../dw/db/dao/BugStatusStatisticsDao.java | 43 + .../cctp/dw/db/dao/BugTemplateStatusDao.java | 29 + .../dw/db/dao/BugTendencyChartTmpDao.java | 35 + .../dw/db/dao/BugValidRepairRatioDao.java | 31 + .../db/dao/CaseDesignCompleteDetailsDao.java | 32 + .../cctp/dw/db/dao/CpProjectDetailDao.java | 31 + .../cctp/dw/db/dao/DwAtuCaseDesignDao.java | 29 + .../cctp/dw/db/dao/DwAtuPlanBatchDao.java | 18 + .../cctp/dw/db/dao/DwAtuPlanEnvLinkDao.java | 18 + .../cctp/dw/db/dao/DwAtuPlanInfoDao.java | 43 + .../dw/db/dao/DwAtuPlanScriptLinkDao.java | 11 + .../cctp/dw/db/dao/DwAtuPlanTaskDao.java | 19 + .../cctp/dw/db/dao/DwAtuScriptInfoDao.java | 64 + .../cctp/dw/db/dao/DwAtuScriptVersionDao.java | 24 + .../cctp/dw/db/dao/DwCaseDesignInfoDao.java | 43 + .../cctp/dw/db/dao/DwManualExecDirDao.java | 27 + .../cctp/dw/db/dao/DwManualExecJobDao.java | 29 + .../cctp/dw/db/dao/DwReBusComponentDao.java | 35 + .../cctp/dw/db/dao/DwTestPointDao.java | 33 + .../cctp/dw/db/dao/MidCaseDesignDao.java | 45 + .../cctp/dw/db/dao/MidManualExecJobDao.java | 46 + .../cctp/dw/db/dao/MidProjectInfoDao.java | 40 + .../cctp/dw/db/dao/MidTestPointDao.java | 38 + .../cctp/dw/db/dao/MidUserBugGradeDao.java | 31 + .../cctp/dw/db/dao/MidValidExecJobDao.java | 29 + .../cctp/dw/db/dao/MtCaseDesignChartDao.java | 43 + .../cctp/dw/db/dao/MtCaseExecChartDao.java | 36 + .../cctp/dw/db/dao/MtCaseExecOverallDao.java | 27 + .../dw/db/dao/MtCaseExecPassRatioDao.java | 27 + .../dw/db/dao/MtCaseExecTrendChartDao.java | 33 + .../cctp/dw/db/dao/MtCaseNonExecDao.java | 28 + .../cctp/dw/db/dao/MtLeafDesignDao.java | 29 + .../cctp/dw/db/dao/MtTestChartDao.java | 48 + .../dw/db/dao/MtTestPointStatisticsDao.java | 33 + .../dw/db/dao/PointCompleteDetailsDao.java | 30 + .../dw/db/dao/ProgressChartPrepareDao.java | 31 + .../cctp/dw/db/dao/SynBugInfoDao.java | 42 + .../cctp/dw/db/entity/BugDensityChart.java | 220 ++ .../cctp/dw/db/entity/BugGradeStatistics.java | 348 ++ .../cctp/dw/db/entity/BugLegacyGrade.java | 254 ++ .../cctp/dw/db/entity/BugLifeCycleChart.java | 165 + .../dw/db/entity/BugOverallTendencyChart.java | 233 ++ .../dw/db/entity/BugStatusStatistics.java | 272 ++ .../cctp/dw/db/entity/BugTemplateStatus.java | 184 + .../dw/db/entity/BugTendencyChartTmp.java | 176 + .../dw/db/entity/BugValidRepairRatio.java | 244 ++ .../db/entity/CaseDesignCompleteDetails.java | 245 ++ .../cctp/dw/db/entity/CpProjectDetail.java | 211 ++ .../cctp/dw/db/entity/DwAtuCaseDesign.java | 255 ++ .../cctp/dw/db/entity/DwAtuPlanBatch.java | 78 + .../cctp/dw/db/entity/DwAtuPlanEnvLink.java | 32 + .../cctp/dw/db/entity/DwAtuPlanInfo.java | 82 + .../dw/db/entity/DwAtuPlanScriptLink.java | 25 + .../cctp/dw/db/entity/DwAtuPlanTask.java | 34 + .../cctp/dw/db/entity/DwAtuScriptInfo.java | 308 ++ .../cctp/dw/db/entity/DwAtuScriptVersion.java | 136 + .../cctp/dw/db/entity/DwCaseDesignInfo.java | 170 + .../cctp/dw/db/entity/DwManualExecDir.java | 244 ++ .../cctp/dw/db/entity/DwManualExecJob.java | 368 ++ .../cctp/dw/db/entity/DwReBusComponent.java | 242 ++ .../cctp/dw/db/entity/DwTestPoint.java | 182 + .../cctp/dw/db/entity/MidCaseDesign.java | 204 + .../cctp/dw/db/entity/MidManualExecJob.java | 319 ++ .../cctp/dw/db/entity/MidProjectInfo.java | 188 + .../cctp/dw/db/entity/MidTestPoint.java | 203 + .../cctp/dw/db/entity/MidUserBugGrade.java | 242 ++ .../cctp/dw/db/entity/MidValidExecJob.java | 150 + .../cctp/dw/db/entity/MtCaseDesignChart.java | 195 + .../cctp/dw/db/entity/MtCaseExecChart.java | 359 ++ .../cctp/dw/db/entity/MtCaseExecOverall.java | 340 ++ .../dw/db/entity/MtCaseExecPassRatio.java | 208 + .../dw/db/entity/MtCaseExecTrendChart.java | 210 ++ .../cctp/dw/db/entity/MtCaseNonExec.java | 164 + .../cctp/dw/db/entity/MtLeafDesign.java | 175 + .../cctp/dw/db/entity/MtTestChart.java | 250 ++ .../dw/db/entity/MtTestPointStatistics.java | 204 + .../dw/db/entity/PointCompleteDetails.java | 256 ++ .../dw/db/entity/ProgressChartPrepare.java | 227 ++ .../cctp/dw/db/entity/SynBugInfo.java | 532 +++ .../db/impl/BugDensityChartServiceImpl.java | 88 + .../impl/BugGradeStatisticsServiceImpl.java | 79 + .../dw/db/impl/BugLegacyGradeServiceImpl.java | 71 + .../db/impl/BugLifeCycleChartServiceImpl.java | 83 + .../BugOverallTendencyChartServiceImpl.java | 99 + .../impl/BugStatusStatisticsServiceImpl.java | 107 + .../db/impl/BugTemplateStatusServiceImpl.java | 85 + .../impl/BugTendencyChartTmpServiceImpl.java | 79 + .../impl/BugValidRepairRatioServiceImpl.java | 72 + .../CaseDesignCompleteDetailsServiceImpl.java | 69 + .../db/impl/CpProjectDetailServiceImpl.java | 70 + .../db/impl/DwAtuCaseDesignServiceImpl.java | 68 + .../dw/db/impl/DwAtuPlanBatchServiceImpl.java | 34 + .../db/impl/DwAtuPlanEnvLinkServiceImpl.java | 57 + .../dw/db/impl/DwAtuPlanInfoServiceImpl.java | 32 + .../impl/DwAtuPlanScriptLinkServiceImpl.java | 48 + .../dw/db/impl/DwAtuPlanTaskServiceImpl.java | 37 + .../db/impl/DwAtuScriptInfoServiceImpl.java | 68 + .../impl/DwAtuScriptVersionServiceImpl.java | 59 + .../db/impl/DwCaseDesignInfoServiceImpl.java | 75 + .../db/impl/DwManualExecDirServiceImpl.java | 50 + .../db/impl/DwManualExecJobServiceImpl.java | 60 + .../db/impl/DwReBusComponentServiceImpl.java | 68 + .../dw/db/impl/DwTestPointServiceImpl.java | 63 + .../dw/db/impl/MidCaseDesignServiceImpl.java | 276 ++ .../db/impl/MidManualExecJobServiceImpl.java | 111 + .../dw/db/impl/MidProjectInfoServiceImpl.java | 115 + .../dw/db/impl/MidTestPointServiceImpl.java | 83 + .../db/impl/MidUserBugGradeServiceImpl.java | 72 + .../db/impl/MidValidExecJobServiceImpl.java | 72 + .../db/impl/MtCaseDesignChartServiceImpl.java | 97 + .../db/impl/MtCaseExecChartServiceImpl.java | 79 + .../db/impl/MtCaseExecOverallServiceImpl.java | 64 + .../impl/MtCaseExecPassRatioServiceImpl.java | 63 + .../impl/MtCaseExecTrendChartServiceImpl.java | 85 + .../dw/db/impl/MtCaseNonExecServiceImpl.java | 70 + .../dw/db/impl/MtLeafDesignServiceImpl.java | 68 + .../dw/db/impl/MtTestChartServiceImpl.java | 116 + .../MtTestPointStatisticsServiceImpl.java | 79 + .../impl/PointCompleteDetailsServiceImpl.java | 64 + .../impl/ProgressChartPrepareServiceImpl.java | 73 + .../db/impl/ProjectOverviewServiceImpl.java | 277 ++ .../dw/db/impl/SynBugInfoServiceImpl.java | 92 + .../impl/UIDwAtuPlanExecutionServiceImpl.java | 118 + .../UIDwAtuScriptExecutionServiceImpl.java | 78 + .../db/impl/UIDwAtuStatisticsServiceImpl.java | 168 + .../dw/db/mapper/BugDensityChartMapper.java | 30 + .../db/mapper/BugGradeStatisticsMapper.java | 35 + .../dw/db/mapper/BugLegacyGradeMapper.java | 31 + .../dw/db/mapper/BugLifeCycleChartMapper.java | 27 + .../mapper/BugOverallTendencyChartMapper.java | 30 + .../db/mapper/BugStatusStatisticsMapper.java | 32 + .../dw/db/mapper/BugTemplateStatusMapper.java | 27 + .../db/mapper/BugTendencyChartTmpMapper.java | 28 + .../db/mapper/BugValidRepairRatioMapper.java | 31 + .../CaseDesignCompleteDetailsMapper.java | 30 + .../dw/db/mapper/CpProjectDetailMapper.java | 29 + .../dw/db/mapper/DwAtuCaseDesignMapper.java | 31 + .../dw/db/mapper/DwAtuPlanBatchMapper.java | 22 + .../dw/db/mapper/DwAtuPlanEnvLinkMapper.java | 15 + .../dw/db/mapper/DwAtuPlanInfoMapper.java | 17 + .../db/mapper/DwAtuPlanScriptLinkMapper.java | 14 + .../dw/db/mapper/DwAtuPlanTaskMapper.java | 17 + .../dw/db/mapper/DwAtuScriptInfoMapper.java | 28 + .../db/mapper/DwAtuScriptVersionMapper.java | 26 + .../dw/db/mapper/DwCaseDesignInfoMapper.java | 27 + .../dw/db/mapper/DwManualExecDirMapper.java | 32 + .../dw/db/mapper/DwManualExecJobMapper.java | 35 + .../dw/db/mapper/DwReBusComponentMapper.java | 30 + .../cctp/dw/db/mapper/DwTestPointMapper.java | 27 + .../dw/db/mapper/MidCaseDesignMapper.java | 29 + .../dw/db/mapper/MidManualExecJobMapper.java | 34 + .../dw/db/mapper/MidProjectInfoMapper.java | 28 + .../cctp/dw/db/mapper/MidTestPointMapper.java | 29 + .../dw/db/mapper/MidUserBugGradeMapper.java | 31 + .../dw/db/mapper/MidValidExecJobMapper.java | 27 + .../dw/db/mapper/MtCaseDesignChartMapper.java | 40 + .../dw/db/mapper/MtCaseExecChartMapper.java | 35 + .../dw/db/mapper/MtCaseExecOverallMapper.java | 35 + .../db/mapper/MtCaseExecPassRatioMapper.java | 29 + .../db/mapper/MtCaseExecTrendChartMapper.java | 29 + .../dw/db/mapper/MtCaseNonExecMapper.java | 27 + .../cctp/dw/db/mapper/MtLeafDesignMapper.java | 28 + .../cctp/dw/db/mapper/MtTestChartMapper.java | 31 + .../mapper/MtTestPointStatisticsMapper.java | 29 + .../db/mapper/PointCompleteDetailsMapper.java | 31 + .../db/mapper/ProgressChartPrepareMapper.java | 30 + .../cctp/dw/db/mapper/SynBugInfoMapper.java | 41 + .../dw/db/service/BugDensityChartService.java | 37 + .../db/service/BugGradeStatisticsService.java | 34 + .../dw/db/service/BugLegacyGradeService.java | 27 + .../db/service/BugLifeCycleChartService.java | 31 + .../BugOverallTendencyChartService.java | 39 + .../service/BugStatusStatisticsService.java | 37 + .../db/service/BugTemplateStatusService.java | 31 + .../service/BugTendencyChartTmpService.java | 33 + .../service/BugValidRepairRatioService.java | 30 + .../CaseDesignCompleteDetailsService.java | 31 + .../dw/db/service/CpProjectDetailService.java | 29 + .../dw/db/service/DwAtuCaseDesignService.java | 29 + .../dw/db/service/DwAtuPlanBatchService.java | 7 + .../db/service/DwAtuPlanEnvLinkService.java | 9 + .../dw/db/service/DwAtuPlanInfoService.java | 8 + .../service/DwAtuPlanScriptLinkService.java | 8 + .../dw/db/service/DwAtuPlanTaskService.java | 8 + .../dw/db/service/DwAtuScriptInfoService.java | 29 + .../db/service/DwAtuScriptVersionService.java | 24 + .../db/service/DwCaseDesignInfoService.java | 35 + .../dw/db/service/DwManualExecDirService.java | 23 + .../dw/db/service/DwManualExecJobService.java | 25 + .../db/service/DwReBusComponentService.java | 27 + .../dw/db/service/DwTestPointService.java | 34 + .../dw/db/service/MidCaseDesignService.java | 50 + .../db/service/MidManualExecJobService.java | 42 + .../dw/db/service/MidProjectInfoService.java | 47 + .../dw/db/service/MidTestPointService.java | 35 + .../dw/db/service/MidUserBugGradeService.java | 30 + .../dw/db/service/MidValidExecJobService.java | 27 + .../db/service/MtCaseDesignChartService.java | 40 + .../dw/db/service/MtCaseExecChartService.java | 31 + .../db/service/MtCaseExecOverallService.java | 25 + .../service/MtCaseExecPassRatioService.java | 25 + .../service/MtCaseExecTrendChartService.java | 33 + .../dw/db/service/MtCaseNonExecService.java | 28 + .../dw/db/service/MtLeafDesignService.java | 27 + .../dw/db/service/MtTestChartService.java | 42 + .../service/MtTestPointStatisticsService.java | 31 + .../service/PointCompleteDetailsService.java | 27 + .../service/ProgressChartPrepareService.java | 27 + .../dw/db/service/ProjectOverviewService.java | 17 + .../cctp/dw/db/service/SynBugInfoService.java | 38 + .../service/UIDwAtuPlanExecutionService.java | 19 + .../UIDwAtuScriptExecutionService.java | 10 + .../db/service/UIDwAtuStatisticsService.java | 22 + .../net/northking/cctp/dw/dto/AxesDto.java | 123 + .../cctp/dw/dto/BugGradeStatisticsAddDto.java | 25 + .../dw/dto/BugGradeStatisticsDetailDto.java | 25 + .../dw/dto/BugGradeStatisticsQueryDto.java | 24 + .../dw/dto/BugGradeStatisticsUpdateDto.java | 24 + .../cctp/dw/dto/BugLegacyGradeGroupDto.java | 70 + .../cctp/dw/dto/BugLifeCycleChartAddDto.java | 25 + .../dw/dto/BugLifeCycleChartDetailDto.java | 25 + .../dw/dto/BugLifeCycleChartQueryDto.java | 24 + .../dw/dto/BugLifeCycleChartUpdateDto.java | 24 + .../dw/dto/BugOverallTendencyChartAddDto.java | 24 + .../dto/BugOverallTendencyChartDetailDto.java | 33 + .../dw/dto/BugOverallTendencyChartDto.java | 46 + .../dto/BugOverallTendencyChartQueryDto.java | 52 + .../dto/BugOverallTendencyChartUpdateDto.java | 24 + .../dw/dto/BugStatusStatisticsAddDto.java | 24 + .../dw/dto/BugStatusStatisticsDetailDto.java | 25 + .../dw/dto/BugStatusStatisticsQueryDto.java | 24 + .../dw/dto/BugStatusStatisticsUpdateDto.java | 24 + .../cctp/dw/dto/BugTemplateStatusAddDto.java | 24 + .../dw/dto/BugTemplateStatusDetailDto.java | 24 + .../dw/dto/BugTemplateStatusQueryDto.java | 24 + .../dw/dto/BugTemplateStatusUpdateDto.java | 24 + .../dw/dto/BugTendencyChartTmpAddDto.java | 25 + .../dw/dto/BugTendencyChartTmpDetailDto.java | 61 + .../dw/dto/BugTendencyChartTmpQueryDto.java | 24 + .../dw/dto/BugTendencyChartTmpUpdateDto.java | 24 + .../cctp/dw/dto/CaseDesignPieDto.java | 78 + .../northking/cctp/dw/dto/ChargeInfoDto.java | 22 + .../cctp/dw/dto/ChargeInfoQueryDto.java | 8 + .../cctp/dw/dto/ChartDataGeneQueryDto.java | 79 + .../cctp/dw/dto/ChartProgressQueryDto.java | 28 + .../northking/cctp/dw/dto/CltDictItem.java | 368 ++ .../net/northking/cctp/dw/dto/CpProject.java | 419 ++ .../cctp/dw/dto/CpProjectDetailAddDto.java | 106 + .../cctp/dw/dto/CpProjectDetailQueryDto.java | 117 + .../cctp/dw/dto/DwAtuPlanTaskSyncDto.java | 22 + .../cctp/dw/dto/DwCaseDesignInfoAddDto.java | 24 + .../dw/dto/DwCaseDesignInfoDetailDto.java | 119 + .../cctp/dw/dto/DwCaseDesignInfoDto.java | 58 + .../cctp/dw/dto/DwCaseDesignInfoQueryDto.java | 68 + .../dw/dto/DwCaseDesignInfoUpdateDto.java | 55 + .../cctp/dw/dto/FailPlanInfoDto.java | 26 + .../cctp/dw/dto/FirstExecuteInfoDto.java | 29 + .../cctp/dw/dto/ManualExecJobPieDto.java | 161 + .../cctp/dw/dto/MidCaseDesignDetailDto.java | 20 + .../dw/dto/MidManualExecJobDetailDto.java | 20 + .../cctp/dw/dto/MidProjectInfoAddDto.java | 71 + .../cctp/dw/dto/MidTestPointDetailDto.java | 20 + .../northking/cctp/dw/dto/ModifyInfoDto.java | 18 + .../cctp/dw/dto/ModifyInfoQueryDto.java | 8 + .../cctp/dw/dto/MtCaseDesignChartAddDto.java | 35 + .../dw/dto/MtCaseDesignChartDetailDto.java | 26 + .../dw/dto/MtCaseDesignChartQueryDto.java | 25 + .../dw/dto/MtCaseDesignChartUpdateDto.java | 25 + .../cctp/dw/dto/MtCaseDesignInfoDw.java | 116 + .../cctp/dw/dto/MtCaseExecChartAddDto.java | 33 + .../cctp/dw/dto/MtCaseExecChartDetailDto.java | 25 + .../cctp/dw/dto/MtCaseExecChartQueryDto.java | 24 + .../cctp/dw/dto/MtCaseExecChartUpdateDto.java | 24 + .../dw/dto/MtCaseExecTrendChartAddDto.java | 25 + .../dw/dto/MtCaseExecTrendChartDetailDto.java | 25 + .../dw/dto/MtCaseExecTrendChartQueryDto.java | 24 + .../dw/dto/MtCaseExecTrendChartUpdateDto.java | 24 + .../cctp/dw/dto/MtCaseNonExecAddDto.java | 24 + .../cctp/dw/dto/MtCaseNonExecDetailDto.java | 24 + .../cctp/dw/dto/MtCaseNonExecQueryDto.java | 24 + .../cctp/dw/dto/MtCaseNonExecUpdateDto.java | 24 + .../cctp/dw/dto/MtLeafDesignAddDto.java | 25 + .../cctp/dw/dto/MtLeafDesignDetailDto.java | 25 + .../cctp/dw/dto/MtLeafDesignQueryDto.java | 24 + .../cctp/dw/dto/MtLeafDesignUpdateDto.java | 24 + .../northking/cctp/dw/dto/MtTestChartDto.java | 227 ++ .../dw/dto/MtTestPointStatisticsAddDto.java | 25 + .../dto/MtTestPointStatisticsDetailDto.java | 25 + .../dw/dto/MtTestPointStatisticsQueryDto.java | 24 + .../dto/MtTestPointStatisticsUpdateDto.java | 24 + .../cctp/dw/dto/MtTestPointSynDto.java | 133 + .../northking/cctp/dw/dto/PlanQueryDto.java | 10 + .../cctp/dw/dto/PlanQueryRspDto.java | 10 + .../northking/cctp/dw/dto/ProjectDataVo.java | 191 + .../northking/cctp/dw/dto/ProjectInfoDto.java | 10 + .../cctp/dw/dto/ProjectOverviewDto.java | 52 + .../cctp/dw/dto/ProjectOverviewQueryDto.java | 12 + .../cctp/dw/dto/ProjectScriptNumDto.java | 12 + .../cctp/dw/dto/SynTestRolesDto.java | 46 + .../cctp/dw/dto/SyncCltDictItemDto.java | 75 + .../cctp/dw/dto/TestPointPieDto.java | 81 + .../cctp/dw/dto/Tmp2PrepareDataDto.java | 29 + .../cctp/dw/dto/UIDwAtuPlanQueryDto.java | 26 + .../dw/dto/UIDwAtuScriptInfoQueryDto.java | 22 + .../northking/cctp/dw/dto/ValidScriptDTO.java | 87 + .../dw/dto/atu/DwAtuCaseDesignAddDto.java | 24 + .../dw/dto/atu/DwAtuCaseDesignDetailDto.java | 50 + .../dw/dto/atu/DwAtuCaseDesignQueryDto.java | 52 + .../dw/dto/atu/DwAtuCaseDesignUpdateDto.java | 24 + .../cctp/dw/dto/atu/DwAtuDetailTmpDto.java | 60 + .../dw/dto/atu/DwAtuPlanExecutionDataDto.java | 56 + .../dto/atu/DwAtuScriptExecutionDataDto.java | 39 + .../dw/dto/atu/DwAtuScriptExecutionDto.java | 43 + .../dw/dto/atu/DwAtuScriptInfoAddDto.java | 24 + .../dw/dto/atu/DwAtuScriptInfoDetailDto.java | 50 + .../cctp/dw/dto/atu/DwAtuScriptInfoDto.java | 50 + .../dw/dto/atu/DwAtuScriptInfoQueryDto.java | 52 + .../dw/dto/atu/DwAtuScriptInfoUpdateDto.java | 24 + .../dw/dto/atu/DwAtuScriptVersionAddDto.java | 24 + .../dto/atu/DwAtuScriptVersionDetailDto.java | 24 + .../dto/atu/DwAtuScriptVersionQueryDto.java | 24 + .../dto/atu/DwAtuScriptVersionUpdateDto.java | 24 + .../cctp/dw/dto/atu/DwDataAndSumDto.java | 13 + .../cctp/dw/dto/atu/DwOptionDto.java | 19 + .../dw/dto/atu/DwReBusComponentAddDto.java | 24 + .../dw/dto/atu/DwReBusComponentDetailDto.java | 50 + .../dw/dto/atu/DwReBusComponentQueryDto.java | 52 + .../dw/dto/atu/DwReBusComponentUpdateDto.java | 24 + .../dw/dto/atu/MqSynchronizeTaskAddDto.java | 209 + .../cctp/dw/dto/atu/ScriptSuccessQuery.java | 50 + .../northking/cctp/dw/enums/ProgressType.java | 39 + .../cctp/dw/feign/CltTestTeamDto.java | 86 + .../net/northking/cctp/dw/feign/CpEnv.java | 67 + .../cctp/dw/feign/HZBankFeignClient.java | 15 + .../cctp/dw/feign/ManualTestFeignClient.java | 22 + .../cctp/dw/feign/PlatformFeignClient.java | 41 + .../cctp/dw/feign/ProjectsFeignClient.java | 53 + .../feign/ProjectsFeignForScheduleClient.java | 20 + .../cctp/dw/feign/StatusRoleDto.java | 38 + .../northking/cctp/dw/feign/UserInfoRsp.java | 12 + .../schedule/MtManualCaseDesginProducer.java | 112 + .../dw/schedule/MtManualExecJobProducer.java | 215 ++ .../schedule/MtManualTestPointProducer.java | 120 + .../cctp/dw/schedule/ScheduleTask.java | 575 +++ .../northking/cctp/dw/utils/BeanHelper.java | 40 + .../northking/cctp/dw/utils/DataDealUtil.java | 33 + .../cctp/dw/utils/DateDealUtils.java | 59 + .../northking/cctp/dw/utils/FileUtils.java | 75 + .../northking/cctp/dw/utils/ListUtils.java | 36 + .../cctp/platform/db/entity/CltDictItem.java | 355 ++ .../src/main/resources/application.bak.yml | 88 + .../cctp-dw/src/main/resources/banner.txt | 8 + .../cctp-dw/src/main/resources/bootstrap.yml | 110 + .../main/resources/db/mysql/data/README.MD | 1 + .../main/resources/db/mysql/schema/README.MD | 1 + .../db/mysql/schema/bug_density_chart.sql | 37 + .../db/mysql/schema/bug_grade_statistics.sql | 46 + .../db/mysql/schema/bug_legacy_grade.sql | 40 + .../db/mysql/schema/bug_life_cycle_chart.sql | 27 + .../schema/bug_overall_tendency_chart.sql | 35 + .../db/mysql/schema/bug_status_statistics.sql | 41 + .../db/mysql/schema/bug_template_status.sql | 30 + .../mysql/schema/bug_tendency_chart_tmp.sql | 34 + .../mysql/schema/bug_valid_repair_ratio.sql | 39 + .../schema/case_design_complete_details.sql | 38 + .../db/mysql/schema/cp_project_detail.sql | 34 + .../db/mysql/schema/dw_case_design_info.sql | 35 + .../db/mysql/schema/dw_manual_exec_dir.sql | 36 + .../db/mysql/schema/dw_manual_exec_job.sql | 42 + .../db/mysql/schema/dw_test_point.sql | 29 + .../db/mysql/schema/mid_case_design.sql | 35 + .../db/mysql/schema/mid_manual_exec_job.sql | 46 + .../db/mysql/schema/mid_project_info.sql | 31 + .../db/mysql/schema/mid_test_point.sql | 36 + .../db/mysql/schema/mid_user_bug_grade.sql | 39 + .../db/mysql/schema/mid_valid_exec_job.sql | 30 + .../db/mysql/schema/mt_case_design_chart.sql | 35 + .../db/mysql/schema/mt_case_exec_chart.sql | 50 + .../db/mysql/schema/mt_case_exec_overall.sql | 47 + .../mysql/schema/mt_case_exec_pass_ratio.sql | 35 + .../mysql/schema/mt_case_exec_trend_chart.sql | 33 + .../db/mysql/schema/mt_test_chart.sql | 40 + .../mysql/schema/mt_test_point_statistics.sql | 35 + .../mysql/schema/point_complete_details.sql | 37 + .../mysql/schema/progress_chart_prepare.sql | 35 + .../db/mysql/schema/syn_bug_info.sql | 56 + .../src/main/resources/db/mysql/update.sql | 59 + .../src/main/resources/logback-rabbitmq.xml | 86 + .../mybatis/base/BugDensityChart.Mapper.xml | 284 ++ .../base/BugGradeStatistics.Mapper.xml | 406 ++ .../mybatis/base/BugLegacyGrade.Mapper.xml | 307 ++ .../mybatis/base/BugLifeCycleChart.Mapper.xml | 222 ++ .../base/BugOverallTendencyChart.Mapper.xml | 291 ++ .../base/BugStatusStatistics.Mapper.xml | 337 ++ .../mybatis/base/BugTemplateStatus.Mapper.xml | 268 ++ .../base/BugTendencyChartTmp.Mapper.xml | 245 ++ .../base/BugValidRepairRatio.Mapper.xml | 307 ++ .../base/CaseDesignCompleteDetails.Mapper.xml | 307 ++ .../mybatis/base/CpProjectDetail.Mapper.xml | 261 ++ .../mybatis/base/DwAtuCaseDesign.Mapper.xml | 314 ++ .../mybatis/base/DwAtuPlanBatch.Mapper.xml | 495 +++ .../mybatis/base/DwAtuPlanEnvLink.Mapper.xml | 228 ++ .../mybatis/base/DwAtuPlanInfo.Mapper.xml | 414 ++ .../base/DwAtuPlanScriptLink.Mapper.xml | 210 ++ .../mybatis/base/DwAtuPlanTask.Mapper.xml | 323 ++ .../mybatis/base/DwAtuScriptInfo.Mapper.xml | 327 ++ .../base/DwAtuScriptVersion.Mapper.xml | 199 + .../mybatis/base/DwCaseDesignInfo.Mapper.xml | 262 ++ .../mybatis/base/DwManualExecDir.Mapper.xml | 330 ++ .../mybatis/base/DwManualExecJob.Mapper.xml | 399 ++ .../mybatis/base/DwReBusComponent.Mapper.xml | 297 ++ .../mybatis/base/DwTestPoint.Mapper.xml | 238 ++ .../mybatis/base/MidCaseDesign.Mapper.xml | 261 ++ .../mybatis/base/MidManualExecJob.Mapper.xml | 376 ++ .../mybatis/base/MidProjectInfo.Mapper.xml | 238 ++ .../mybatis/base/MidTestPoint.Mapper.xml | 261 ++ .../mybatis/base/MidUserBugGrade.Mapper.xml | 307 ++ .../mybatis/base/MidValidExecJob.Mapper.xml | 215 ++ .../mybatis/base/MtCaseDesignChart.Mapper.xml | 269 ++ .../mybatis/base/MtCaseExecChart.Mapper.xml | 406 ++ .../mybatis/base/MtCaseExecOverall.Mapper.xml | 399 ++ .../base/MtCaseExecPassRatio.Mapper.xml | 261 ++ .../base/MtCaseExecTrendChart.Mapper.xml | 268 ++ .../mybatis/base/MtCaseNonExec.Mapper.xml | 222 ++ .../mybatis/base/MtLeafDesign.Mapper.xml | 245 ++ .../mybatis/base/MtTestChart.Mapper.xml | 307 ++ .../base/MtTestPointStatistics.Mapper.xml | 268 ++ .../base/PointCompleteDetails.Mapper.xml | 307 ++ .../base/ProgressChartPrepare.Mapper.xml | 284 ++ .../mybatis/base/SynBugInfo.Mapper.xml | 537 +++ .../mybatis/ext/BugDensityChart.Dao.xml | 141 + .../mybatis/ext/BugGradeStatistics.Dao.xml | 282 ++ .../mybatis/ext/BugLegacyGrade.Dao.xml | 56 + .../mybatis/ext/BugLifeCycleChart.Dao.xml | 153 + .../ext/BugOverallTendencyChart.Dao.xml | 236 ++ .../mybatis/ext/BugStatusStatistics.Dao.xml | 390 ++ .../mybatis/ext/BugTemplateStatus.Dao.xml | 88 + .../mybatis/ext/BugTendencyChartTmp.Dao.xml | 130 + .../mybatis/ext/BugValidRepairRatio.Dao.xml | 43 + .../ext/CaseDesignCompleteDetails.Dao.xml | 95 + .../mybatis/ext/CpProjectDetail.Dao.xml | 26 + .../mybatis/ext/DwAtuCaseDesign.Dao.xml | 97 + .../mybatis/ext/DwAtuPlanBatch.Dao.xml | 40 + .../mybatis/ext/DwAtuPlanEnvLink.Dao.xml | 20 + .../mybatis/ext/DwAtuPlanInfo.Dao.xml | 255 ++ .../mybatis/ext/DwAtuScriptInfo.Dao.xml | 382 ++ .../mybatis/ext/DwAtuScriptVersion.Dao.xml | 47 + .../mybatis/ext/DwCaseDesignInfo.Dao.xml | 125 + .../mybatis/ext/DwManualExecDir.Dao.xml | 45 + .../mybatis/ext/DwManualExecJob.Dao.xml | 69 + .../mybatis/ext/DwReBusComponent.Dao.xml | 111 + .../resources/mybatis/ext/DwTestPoint.Dao.xml | 67 + .../mybatis/ext/MidCaseDesign.Dao.xml | 181 + .../mybatis/ext/MidManualExecJob.Dao.xml | 188 + .../mybatis/ext/MidProjectInfo.Dao.xml | 122 + .../mybatis/ext/MidTestPoint.Dao.xml | 93 + .../mybatis/ext/MidUserBugGrade.Dao.xml | 42 + .../mybatis/ext/MidValidExecJob.Dao.xml | 51 + .../mybatis/ext/MtCaseDesignChart.Dao.xml | 182 + .../mybatis/ext/MtCaseExecChart.Dao.xml | 234 ++ .../mybatis/ext/MtCaseExecOverall.Dao.xml | 62 + .../mybatis/ext/MtCaseExecPassRatio.Dao.xml | 64 + .../mybatis/ext/MtCaseExecTrendChart.Dao.xml | 133 + .../mybatis/ext/MtCaseNonExec.Dao.xml | 89 + .../mybatis/ext/MtLeafDesign.Dao.xml | 74 + .../resources/mybatis/ext/MtTestChart.Dao.xml | 168 + .../mybatis/ext/MtTestPointStatistics.Dao.xml | 132 + .../mybatis/ext/PointCompleteDetails.Dao.xml | 97 + .../mybatis/ext/ProgressChartPrepare.Dao.xml | 29 + .../resources/mybatis/ext/SynBugInfo.Dao.xml | 193 + cloud-platform/cctp-dw/testDockerfile | 32 + cloud-platform/cctp-platform/Dockerfile-dev | 41 + cloud-platform/cctp-platform/Dockerfile-prod | 41 + cloud-platform/cctp-platform/Dockerfile-test | 41 + cloud-platform/cctp-platform/Dockerfile-uat | 41 + cloud-platform/cctp-platform/README.MD | 111 + .../cctp-platform.deployment.yaml | 76 + cloud-platform/cctp-platform/docker-ctl.sh | 177 + cloud-platform/cctp-platform/pom.xml | 167 + .../cctp-platform/shell/docker-build.sh | 71 + .../cctp-platform/shell/docker-start.sh | 77 + cloud-platform/cctp-platform/shell/nk-ms.sh | 116 + .../cctp/platform/PlatformApplication.java | 52 + .../api/comlibrary/CpComLibPubCtrl.java | 41 + .../CpComponentLibraryRestfulCtrl.java | 175 + .../comlibrary/CpComponentListQueryCtrl.java | 59 + .../CpComponentListRestfulCtrl.java | 150 + .../service/CpComponentLibraryApiService.java | 72 + .../CpComponentLibraryApiServiceImpl.java | 601 +++ .../service/CpComponentListApiService.java | 53 + .../CpComponentListApiServiceImpl.java | 386 ++ .../CpComponentParamterApiService.java | 26 + .../CpComponentParamterApiServiceImpl.java | 58 + .../service/CltDictCatalogApiService.java | 23 + .../service/CltDictCatalogApiServiceImpl.java | 106 + .../api/log/service/CpLogApiService.java | 25 + .../api/log/service/CpLogApiServiceImpl.java | 132 + .../api/login/service/UserLoginService.java | 22 + .../login/service/UserLoginServiceImpl.java | 70 + .../platform/api/user/UserLoginFeignCtrl.java | 40 + .../cctp/platform/api/user/UserQueryCtrl.java | 58 + .../api/user/service/UserApiService.java | 21 + .../api/user/service/UserApiServiceImpl.java | 87 + .../cctp/platform/bus/BusConstants.java | 128 + .../cctp/platform/bus/feign/HzBankFeign.java | 69 + .../platform/bus/notice/LogPublisher.java | 13 + .../bus/notice/LogRabbitMQPublisher.java | 44 + .../platform/bus/receive/LogReceiver.java | 53 + .../bus/receive/SaasFuncResource.java | 108 + .../platform/config/HzBankFeignConfig.java | 23 + .../cctp/platform/config/RabbitConfig.java | 14 + .../cctp/platform/config/SyncParamConfig.java | 23 + .../cctp/platform/config/TaskSyncConfig.java | 63 + .../cctp/platform/constants/ErrorMessage.java | 28 + .../platform/constants/PlatformAppError.java | 225 ++ .../platform/constants/PlatformConstants.java | 270 ++ .../db/dao/CpComponentLibraryDao.java | 31 + .../platform/db/dao/CpComponentListDao.java | 28 + .../db/dao/CpComponentParamterDao.java | 26 + .../cctp/platform/db/dao/CpLogContentDao.java | 24 + .../db/dao/CpLogContentDetailDao.java | 32 + .../cctp/platform/db/dao/CpLogDao.java | 31 + .../platform/db/entity/CltDictCatalog.java | 331 ++ .../cctp/platform/db/entity/CltDictItem.java | 355 ++ .../db/entity/CpComponentLibrary.java | 404 ++ .../platform/db/entity/CpComponentList.java | 380 ++ .../db/entity/CpComponentParamter.java | 498 +++ .../cctp/platform/db/entity/CpLog.java | 285 ++ .../cctp/platform/db/entity/CpLogContent.java | 105 + .../db/entity/CpLogContentDetail.java | 129 + .../db/impl/CltUserLoginServiceImpl.java | 40 + .../impl/CpComponentLibraryServiceImpl.java | 62 + .../db/impl/CpComponentListServiceImpl.java | 101 + .../impl/CpComponentParamterServiceImpl.java | 56 + .../impl/CpLogContentDetailServiceImpl.java | 55 + .../db/impl/CpLogContentServiceImpl.java | 54 + .../platform/db/impl/CpLogServiceImpl.java | 56 + .../db/mapper/CltDictCatalogMapper.java | 33 + .../platform/db/mapper/CltDictItemMapper.java | 34 + .../db/mapper/CpComponentLibraryMapper.java | 37 + .../db/mapper/CpComponentListMapper.java | 36 + .../db/mapper/CpComponentParamterMapper.java | 41 + .../db/mapper/CpLogContentDetailMapper.java | 25 + .../db/mapper/CpLogContentMapper.java | 24 + .../cctp/platform/db/mapper/CpLogMapper.java | 31 + .../db/service/CltUserLoginService.java | 12 + .../db/service/CpComponentLibraryService.java | 31 + .../db/service/CpComponentListService.java | 33 + .../service/CpComponentParamterService.java | 24 + .../db/service/CpLogContentDetailService.java | 14 + .../db/service/CpLogContentService.java | 13 + .../platform/db/service/CpLogService.java | 14 + .../platform/dto/attach/CpAttachAddDto.java | 94 + .../dto/attach/CpAttachDetailDto.java | 152 + .../cctp/platform/dto/bus/DictItem.java | 66 + .../dto/comlibrary/CpComLibListEngineDto.java | 11 + .../dto/comlibrary/CpComLibraryTree.java | 79 + .../comlibrary/CpComponentLibraryAddDto.java | 108 + .../CpComponentLibraryDetailDto.java | 232 ++ .../CpComponentLibraryQueryDto.java | 97 + .../CpComponentLibraryUpdateDto.java | 50 + .../comlibrary/CpComponentListDetailDto.java | 220 ++ .../comlibrary/CpComponentListQueryDto.java | 61 + .../CpComponentParamterDetailDto.java | 270 ++ .../comlibrary/RecordComInfoByNameDto.java | 34 + .../dto/comlibrary/RecordComParamDto.java | 126 + .../dto/comlibrary/RecordComTreeDto.java | 165 + .../dto/comlibrary/RecordComTreeQueryDto.java | 54 + .../dto/dict/CltDictCatalogDetailDto.java | 195 + .../dto/dict/CltDictItemDetailDto.java | 214 ++ .../cctp/platform/dto/init/process/State.java | 163 + .../cctp/platform/dto/log/CpLogAddDto.java | 177 + .../dto/log/CpLogContentDetailDto.java | 24 + .../cctp/platform/dto/log/CpLogDetailDto.java | 209 + .../cctp/platform/dto/log/CpLogQueryDto.java | 201 + .../platform/dto/user/CltTestTeamDto.java | 90 + .../platform/dto/user/CltUserLoginDto.java | 92 + .../dto/user/CltUserRoleDetailDto.java | 131 + .../cctp/platform/dto/user/OptionVO.java | 35 + .../platform/dto/user/TestGroupQueryDto.java | 10 + .../dto/user/UserAuthorityQueryDto.java | 72 + .../dto/user/UserAuthorityResultDto.java | 107 + .../platform/dto/user/UserInfoFeignDto.java | 49 + .../platform/dto/user/UserInfoForHzDto.java | 20 + .../platform/dto/user/UserQueryByDto.java | 16 + .../cctp/platform/dto/user/UserQueryDto.java | 216 ++ .../cctp/platform/feign/ApiTagService.java | 55 + .../platform/feign/AttachmentFeignClient.java | 28 + .../pub/CltDictCatalogPubQueryCtrl.java | 70 + .../cctp/platform/pub/PubEnvCtrl.java | 57 + .../cctp/platform/pub/PubRoleCtrl.java | 37 + .../platform/pub/dto/CpAttachPubAddDto.java | 104 + .../cctp/platform/pub/dto/PubDto.java | 24 + .../cctp/platform/util/InterfaceSqlUtils.java | 60 + .../cctp/platform/util/LogEntity.java | 116 + .../cctp/platform/util/MinioPathUtils.java | 133 + .../cctp/platform/util/PageUtils.java | 63 + .../cctp/platform/util/PwdEnCoder.java | 119 + .../src/main/resources/application.yml.bak | 106 + .../src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 111 + .../db/mysql/data/clt_dict_catalog.sql | 38 + .../resources/db/mysql/data/clt_dict_item.sql | 146 + .../main/resources/db/mysql/data/clt_func.sql | 198 + .../db/mysql/data/clt_func_resource.sql | 26 + .../resources/db/mysql/data/clt_resource.sql | 197 + .../main/resources/db/mysql/data/clt_role.sql | 14 + .../resources/db/mysql/data/clt_role_func.sql | 151 + .../main/resources/db/mysql/data/clt_user.sql | 9 + .../db/mysql/data/clt_user_login.sql | 20 + .../resources/db/mysql/data/clt_user_role.sql | 12 + .../db/mysql/data/cp_manage_template.sql | 8 + .../db/mysql/data/cp_rule_collection.sql | 2 + .../db/mysql/data/cp_template_data.sql | 3 + .../data/cp_template_properties_data.sql | 16 + .../resources/db/mysql/data/interface.sql | 272 ++ .../db/mysql/schema/clt_dict_catalog.sql | 18 + .../db/mysql/schema/clt_dict_item.sql | 19 + .../resources/db/mysql/schema/clt_func.sql | 31 + .../db/mysql/schema/clt_func_resource.sql | 12 + .../resources/db/mysql/schema/clt_org.sql | 19 + .../db/mysql/schema/clt_org_manager.sql | 17 + .../db/mysql/schema/clt_resource.sql | 18 + .../resources/db/mysql/schema/clt_role.sql | 18 + .../db/mysql/schema/clt_role_func.sql | 13 + .../db/mysql/schema/clt_sys_dict_catalog.sql | 9 + .../db/mysql/schema/clt_sys_dict_item.sql | 11 + .../resources/db/mysql/schema/clt_user.sql | 25 + .../db/mysql/schema/clt_user_login.sql | 21 + .../db/mysql/schema/clt_user_role.sql | 13 + .../resources/db/mysql/schema/cp_attach.sql | 14 + .../resources/db/mysql/schema/cp_feedback.sql | 13 + .../db/mysql/schema/cp_knowledge_info.sql | 14 + .../db/mysql/schema/cp_knowledge_tree.sql | 19 + .../resources/db/mysql/schema/cp_label.sql | 15 + .../main/resources/db/mysql/schema/cp_log.sql | 15 + .../db/mysql/schema/cp_log_content.sql | 8 + .../db/mysql/schema/cp_log_content_detail.sql | 10 + .../db/mysql/schema/cp_manage_template.sql | 15 + .../mysql/schema/cp_manage_template_layer.sql | 14 + .../resources/db/mysql/schema/cp_notice.sql | 25 + .../db/mysql/schema/cp_notice_extend.sql | 12 + .../db/mysql/schema/cp_notice_memo.sql | 12 + .../db/mysql/schema/cp_rule_collection.sql | 16 + .../db/mysql/schema/cp_rule_config.sql | 15 + .../resources/db/mysql/schema/cp_template.sql | 16 + .../mysql/schema/cp_template_project_type.sql | 10 + .../mysql/schema/cp_template_properties.sql | 23 + .../db/mysql/schema/cp_workbench_resource.sql | 18 + .../main/resources/db/mysql/update/update.sql | 37 + .../src/main/resources/logback-rabbitmq.xml | 87 + .../base/CpComponentLibrary.Mapper.xml | 444 +++ .../mybatis/base/CpComponentList.Mapper.xml | 419 ++ .../base/CpComponentParamter.Mapper.xml | 534 +++ .../resources/mybatis/base/CpLog.Mapper.xml | 337 ++ .../mybatis/base/CpLogContent.Mapper.xml | 176 + .../mybatis/ext/CpComponentLibrary.Dao.xml | 184 + .../mybatis/ext/CpComponentList.Dao.xml | 159 + .../mybatis/ext/CpComponentParamter.Dao.xml | 148 + .../main/resources/mybatis/ext/CpLog.Dao.xml | 162 + .../mybatis/ext/CpLogContent.Dao.xml | 63 + .../mybatis/ext/CpLogContentDetail.Dao.xml | 70 + cloud-platform/cctp-platform/testDockerfile | 31 + cloud-platform/cctp-saas/Dockerfile-dev | 40 + cloud-platform/cctp-saas/Dockerfile-prod | 40 + cloud-platform/cctp-saas/Dockerfile-test | 40 + cloud-platform/cctp-saas/Dockerfile-uat | 40 + .../cctp-saas/cctp-saas.deployment.yaml | 76 + cloud-platform/cctp-saas/docker-ctl.sh | 178 + cloud-platform/cctp-saas/pom.xml | 106 + .../cctp-saas/shell/docker-build.sh | 71 + .../cctp-saas/shell/docker-start.sh | 77 + cloud-platform/cctp-saas/shell/nk-ms.sh | 116 + .../northking/cctp/saas/SaaSApplication.java | 49 + .../saas/api/tenant/SaaSTenantQueryCtrl.java | 63 + .../api/tenant/SaaSTenantRestfulCtrl.java | 55 + .../tenant/service/SaaSTenantApiService.java | 36 + .../service/SaaSTenantApiServiceImpl.java | 176 + .../northking/cctp/saas/bus/BusConstants.java | 106 + .../cctp/saas/config/SaaSConfiguration.java | 40 + .../cctp/saas/constants/SaaSAppError.java | 102 + .../cctp/saas/constants/SaaSConstants.java | 76 + .../cctp/saas/db/dao/SaasTenantAdminDao.java | 24 + .../cctp/saas/db/dao/SaasTenantDao.java | 43 + .../cctp/saas/db/entity/SaasTenant.java | 540 +++ .../cctp/saas/db/entity/SaasTenantAdmin.java | 239 ++ .../db/impl/SaasTenantAdminServiceImpl.java | 49 + .../saas/db/impl/SaasTenantServiceImpl.java | 41 + .../saas/db/mapper/SaasTenantAdminMapper.java | 29 + .../cctp/saas/db/mapper/SaasTenantMapper.java | 35 + .../db/service/SaasTenantAdminService.java | 16 + .../saas/db/service/SaasTenantService.java | 13 + .../announcement/SaasAnnouncementAddDto.java | 72 + .../SaasAnnouncementDetailDto.java | 176 + .../SaasAnnouncementQueryDto.java | 90 + .../SaasAnnouncementUpdateDto.java | 119 + .../cctp/saas/dto/app/SaaSAppAddDto.java | 91 + .../cctp/saas/dto/app/SaaSAppDetailDto.java | 199 + .../cctp/saas/dto/app/SaaSAppQueryDto.java | 85 + .../saas/dto/app/SaaSAppResourceAddDto.java | 159 + .../dto/app/SaaSAppResourceDetailDto.java | 222 ++ .../saas/dto/app/SaaSAppResourceQueryDto.java | 143 + .../dto/app/SaaSAppResourceUpdateDto.java | 154 + .../cctp/saas/dto/app/SaasAppUpdateDto.java | 106 + .../datasource/SaaSAppDataSourceAddDto.java | 75 + .../SaaSAppDataSourceBatchAddDto.java | 53 + .../SaaSAppDataSourceDetailDto.java | 144 + .../datasource/SaaSAppDataSourceQueryDto.java | 59 + .../SaaSAppDataSourceUpdateDto.java | 74 + .../dto/datasource/SaaSDataSourceAddDto.java | 223 ++ .../SaaSDataSourceClusterAddDto.java | 109 + .../SaaSDataSourceClusterDetailDto.java | 216 ++ .../SaaSDataSourceClusterQueryDto.java | 135 + .../SaaSDataSourceClusterUpdateDto.java | 140 + .../datasource/SaaSDataSourceDetailDto.java | 295 ++ .../datasource/SaaSDataSourceQueryDto.java | 174 + .../datasource/SaaSDataSourceUpdateDto.java | 247 ++ .../saas/dto/menu/SaasTenantMenuAddDto.java | 192 + .../dto/menu/SaasTenantMenuDetailDto.java | 191 + .../saas/dto/menu/SaasTenantMenuQueryDto.java | 37 + .../dto/menu/SaasTenantMenuUpdateDto.java | 24 + .../saas/dto/tenant/SaaSTenantDetailDto.java | 296 ++ .../saas/dto/tenant/SaaSTenantQueryDto.java | 246 ++ .../tenant/SaaSTenantSoftwareDetailDto.java | 346 ++ .../dto/tenant/SaasTenantAdminDetailDto.java | 68 + .../src/main/resources/application.bak.yml | 103 + .../cctp-saas/src/main/resources/banner.txt | 8 + .../src/main/resources/bootstrap.yml | 111 + .../main/resources/db/mysql/data/saas_app.sql | 11 + .../db/mysql/data/saas_app_data_source.sql | 8 + .../db/mysql/data/saas_app_resource.sql | 204 + .../db/mysql/data/saas_data_source.sql | 16 + .../mysql/data/saas_data_source_cluster.sql | 11 + .../db/mysql/data/saas_func_resource.sql | 3 + .../resources/db/mysql/data/saas_software.sql | 17 + .../db/mysql/data/saas_software_app.sql | 9 + .../db/mysql/data/saas_software_func.sql | 69 + .../resources/db/mysql/data/saas_tenant.sql | 15 + .../db/mysql/data/saas_tenant_software.sql | 16 + .../db/mysql/schema/saas_announcement.sql | 19 + .../resources/db/mysql/schema/saas_app.sql | 16 + .../db/mysql/schema/saas_app_data_source.sql | 14 + .../db/mysql/schema/saas_app_resource.sql | 19 + .../db/mysql/schema/saas_data_source.sql | 25 + .../mysql/schema/saas_data_source_cluster.sql | 19 + .../db/mysql/schema/saas_func_resource.sql | 14 + .../db/mysql/schema/saas_software.sql | 13 + .../db/mysql/schema/saas_software_app.sql | 10 + .../db/mysql/schema/saas_software_func.sql | 27 + .../resources/db/mysql/schema/saas_tenant.sql | 30 + .../db/mysql/schema/saas_tenant_admin.sql | 14 + .../db/mysql/schema/saas_tenant_menu.sql | 20 + .../db/mysql/schema/saas_tenant_software.sql | 23 + .../schema/saas_tenant_software_func.sql | 29 + .../main/resources/db/mysql/update/update.sql | 49 + .../src/main/resources/logback-rabbitmq.xml | 86 + .../mybatis/base/SaasTenant.Mapper.xml | 659 ++++ .../mybatis/base/SaasTenantAdmin.Mapper.xml | 285 ++ .../resources/mybatis/ext/SaasTenant.Dao.xml | 102 + .../mybatis/ext/SaasTenantAdmin.Dao.xml | 57 + cloud-platform/cctp-saas/testDockerfile | 31 + .../V3.0.2_dsy_add_atu_plan_20241112.sql | 22 + ....5.0_lyb_alter_atu_plan_batch_20240513.sql | 3 + .../V2.6.0_wjd_clean_atu_plan20240612.sql | 6 + .../V2.7.0_cjf_add_atu_plan_20240705.sql | 5 + ...002_create_atu_input_data_set_20231225.sql | 13 + ...llc_create_atu_input_data_set_20231225.sql | 13 + .../cjf_create_atu_script_case_20240203.sql | 3 + ...6.0_wjd_clean_atu_script_case_20240612.sql | 14 + .../lyb_update_attachment_20240326.sql | 7 + .../V2.6.0_wjd_clean_driver_mgr_20240612.sql | 1 + .../001_create_cctp_mobile_20231225.sql | 160 + .../cjf_create_cctp_mobile_20231225.sql | 160 + .../V2.6.0_wjd_clean_cctp_mobile_20240612.sql | 6 + .../cjf_create_cctp_platform_20240203.sql | 2 + .../cjf_delete_clt_dict_item_20231229.sql | 2 + ...2.6.0_wjd_clean_cctp_platform_20240612.sql | 36 + .../V2.6.0_wjd_clean_projects_20240612.sql | 25 + ...003_update_saas_software_func_20231219.sql | 13 + ...llc_update_saas_software_func_20231219.sql | 13 + .../V2.6.0_wjd_clean_saas_20240612.sql | 13 + 3913 files changed, 440010 insertions(+) create mode 100644 .version create mode 100644 README.md create mode 100644 cctp-atu/README.md create mode 100644 cctp-atu/atu-data-mgr/Dockerfile-dev create mode 100644 cctp-atu/atu-data-mgr/Dockerfile-prod create mode 100644 cctp-atu/atu-data-mgr/Dockerfile-test create mode 100644 cctp-atu/atu-data-mgr/Dockerfile-uat create mode 100644 cctp-atu/atu-data-mgr/docker-ctl.sh create mode 100644 cctp-atu/atu-data-mgr/logback-rabbitmq.xml create mode 100644 cctp-atu/atu-data-mgr/pom.xml create mode 100644 cctp-atu/atu-data-mgr/shell/nk-ms.sh create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/DataPoolApplication.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/DataResourcePackageRestfulCtrl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/DataRulePubCtrl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/DataRuleRestfulCtrl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataResourcePackageApiService.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataResourcePackageApiServiceImpl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataRuleApiService.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataRuleApiServiceImpl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetEnvRelCtrl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetTreeRestfulCtrl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetsPubCtrl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetsRestfulCtrl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetEnvRelApiService.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetEnvRelApiServiceImpl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetTreeApiService.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetTreeApiServiceImpl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetsApiService.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetsApiServiceImpl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/TreeIndexNoApiService.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/TreeIndexNoApiServiceImpl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/bus/LogRabbitMQPublisher.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/constants/DataPoolConstant.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataResourcePackageDao.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataRuleDao.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataSetEnvRelDao.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataSetTreeDao.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataSetsDao.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataResourcePackage.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataRule.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataSetEnvRel.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataSetTree.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataSets.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataResourcePackageServiceImpl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataRuleServiceImpl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataSetEnvRelServiceImpl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataSetTreeServiceImpl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataSetsServiceImpl.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataResourcePackageMapper.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataRuleMapper.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataSetEnvRelMapper.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataSetTreeMapper.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataSetsMapper.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataResourcePackageService.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataRuleService.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataSetEnvRelService.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataSetTreeService.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataSetsService.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageDetailDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageInfoDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageQueryDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageUpdateDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleAddDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleDetailDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleExecuteDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleQueryDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleUpdateDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/UserQueryDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/AtuDataSetFeignDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/AtuScriptInputSetQuoteFeignDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/AtuScriptInputSetQuoteFieldDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/ColumnCheckDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataContentDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataHeaderDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetEnvRelAddDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetEnvRelAddTmpDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetEnvRelQueryDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeAddDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeDetailDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeMoveDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeQueryDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeUpdateDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsAddDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsDeleteDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsDetailDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsQueryDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsSaveDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsUpdateDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/enums/DataHeaderType.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/enums/DataPoolError.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/AttachmentFeignClient.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/ProjectFeignClient.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/ScriptFeignClient.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/dto/AtuInputDataSetResultDto.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/EnvNameUtils.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/ExcelUtils.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/MinioPathUtils.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/MyUrlClassLoader.java create mode 100644 cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/ScriptUtil.java create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/application.bak.yml create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/banner.txt create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/bootstrap.yml create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/logback-rabbitmq.xml create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataResourcePackage.Mapper.xml create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataRule.Mapper.xml create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataSetEnvRel.Mapper.xml create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataSetTree.Mapper.xml create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataSets.Mapper.xml create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataResourcePackage.Dao.xml create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataRule.Dao.xml create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataSetEnvRel.Dao.xml create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataSetTree.Dao.xml create mode 100644 cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataSets.Dao.xml create mode 100644 cctp-atu/atu-data-mgr/testDockerfile create mode 100644 cctp-atu/atu-engine/atu-daemon-process/pom.xml create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/CommandExecute.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/OSCommand.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/win/TaskKill.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/win/TaskList.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/DaemonApplication.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/DaemonProperties.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/EngineProperties.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/RestTemplateConfig.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/SwaggerConfiguration.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/DaemonEngineInfo.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/DaemonStatus.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/ResultWrapper.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/ScriptEngineVersion.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/repository/DaemonEngineInfoRepository.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/schedule/ScriptEngineSchedule.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/schedule/UpgradeSchedule.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/AppLifecycle.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/DaemonService.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/DaemonServiceImpl.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/EngineServiceStartThread.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/Lifecycle.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/LifecycleCtrl.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/RobotProcess.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/ScriptEngineProcess.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/utils/FileUtils.java create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-devFront-win.yml create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-prod-win.yml create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-test-win.yml create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-uat-win.yml create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application.yml create mode 100644 cctp-atu/atu-engine/atu-daemon-process/src/main/resources/logback.xml create mode 100644 cctp-atu/atu-engine/atu-daemon-process/start.bat create mode 100644 cctp-atu/atu-engine/atu-engine-dto/pom.xml create mode 100644 cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATULog.java create mode 100644 cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATUWebSocketMessage.java create mode 100644 cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATUWebSocketPayload.java create mode 100644 cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATUWebSocketReplay.java create mode 100644 cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/EngineStatus.java create mode 100644 cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ScriptEngineInfo.java create mode 100644 cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ATUScript.java create mode 100644 cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptEnvironment.java create mode 100644 cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptResource.java create mode 100644 cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptStep.java create mode 100644 cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptTarget.java create mode 100644 cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptVariable.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/Dockerfile create mode 100644 cctp-atu/atu-engine/atu-script-engine/Dockerfile-dev create mode 100644 cctp-atu/atu-engine/atu-script-engine/Dockerfile-prod create mode 100644 cctp-atu/atu-engine/atu-script-engine/Dockerfile-test create mode 100644 cctp-atu/atu-engine/atu-script-engine/Dockerfile-uat create mode 100644 cctp-atu/atu-engine/atu-script-engine/docker-ctl.sh create mode 100644 cctp-atu/atu-engine/atu-script-engine/pom.xml create mode 100644 cctp-atu/atu-engine/atu-script-engine/shell/startL.sh create mode 100644 cctp-atu/atu-engine/atu-script-engine/shell/startW.bat create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/EngineRunner.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/ScriptEngineApplication.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComLibraryInfoDto.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComponentLibrary.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComponentManagementService.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComponentManager.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/InternalComponent.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/LibraryDefinitionManager.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/LibraryUpdateSchedule.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/MdBusComponentInfoDetailDto.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/AtuServerConfig.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/CacheConfiguration.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/ExecutorPoolConfig.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/HttpErrorHandler.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/MobileAutomationSelectorConfig.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/RabbitMQConfig.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/RabbitMQConst.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/RestTemplateConfig.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/ScheduleConfig.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/SwaggerConfiguration.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/bean/DebugerConst.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/bean/DebuggerRequest.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/bean/DebuggerResponse.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DebugService.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DebugSession.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DefaultDebugSession.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/impl/DebugServiceImpl.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/websocket/DebugWebSocketManager.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/ATUDebuggerLifecycle.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/AutomationTestDebugger.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/InterfaceDebugger.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/MobileDebugger.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/PCUIDebugger.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/WebSocketATUDebugger.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/endpoint/DebuggerInterfaceWebSocketServer.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/endpoint/DebuggerPCUIWebSocketServer.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/endpoint/WebSocketConfiguration.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketDebuggerPool.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketInterfaceDebuggerPool.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketMobileDebuggerPool.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketPCUIDebuggerPool.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/AbstractDeviceConnection.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/AndroidMobileDeviceDriver.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/AppPerInfo.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/DebuggerDeviceInfo.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/DeviceInfo.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/DevicePerInfo.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/IosMobileDeviceDriver.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/MobileDeviceConnection.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/MobileDeviceDriver.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/MobileDriverKeepThread.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/PCDeviceConnection.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/PCDeviceDriver.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/service/DeviceConnection.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/service/DeviceConnectionService.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/service/impl/DeviceConnectionManager.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/ATUScriptInstance.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/AtuExecThread.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/DefaultExecThread.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/constant/AtuExecConstant.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/file/Attachment.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/DaemonProcess.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/EngineDestroy.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/EngineRegisterService.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/EngineRuntime.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/LifecycleCtrl.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/LifecycleSchedule.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/StopServerThread.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/constant/MQConstant.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/AppLifecycle.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdEngineInfo.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdEngineInfoRegisterDto.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdEngineInfoResultDto.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdPcDevice.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/HeartbeatInfoDto.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/Lifecycle.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/ThreadPoolAllowDto.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/CommandExecute.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/OSCommand.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/TaskKill.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/TaskList.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/log/bean/ExecuteLog.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/log/bean/StepLog.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/AtuPlanTaskSchedule.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/AtuTaskExecHeartbeatSchedule.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/AutomationTestPlanCtrl.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/AutoTask.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/EnginePlanInfo.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/EnginePlanQuery.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/PlanDeviceInfo.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/QuoteData.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/TaskExecResult.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/EnginePlanInfoService.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/EnginePlanInfoServiceImpl.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/PlanDeviceService.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/PlanDeviceServiceImpl.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/repository/EnginePlanInfoRepository.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/LogicStepType.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/Script.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/ScriptResource.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/ScriptRuntime.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/ScriptStep.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/StepTarget.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/TestTarget.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/Variable.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/VariableDto.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/IScriptRuntimeContext.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptExecuteResult.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptExecutor.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptResolutionService.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptRuntimeListener.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/StepExecuteResult.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/service/ScriptResolutionServiceImpl.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/service/ScriptRuntimeExecutor.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/thread/ExecutorPool.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/AndroidUtil.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/ArgumentUtil.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/ControlTarget.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/ElementUtil.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/HttpUtils.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/IosUtil.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/JsonUtils.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/MobileUtil.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/PointMessage.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/RegexUtils.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/SpringUtils.java create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-devFront-linux.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-devFront-uos.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-devFront-win.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-prod-linux.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-prod-uos.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-prod-win.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-test-linux.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-test-uos.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-test-win.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-uat-linux.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-uat-uos.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-uat-win.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/application.yml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/main/resources/logback.xml create mode 100644 cctp-atu/atu-engine/atu-script-engine/src/test/java/net/northing/cctp/se/util/RegexUtilsTests.java create mode 100644 cctp-atu/atu-engine/pom.xml create mode 100644 cctp-atu/atu-execute-plan/Dockerfile-dev create mode 100644 cctp-atu/atu-execute-plan/Dockerfile-prod create mode 100644 cctp-atu/atu-execute-plan/Dockerfile-test create mode 100644 cctp-atu/atu-execute-plan/Dockerfile-uat create mode 100644 cctp-atu/atu-execute-plan/docker-ctl.sh create mode 100644 cctp-atu/atu-execute-plan/pom.xml create mode 100644 cctp-atu/atu-execute-plan/shell/nk-ms.sh create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/ExecutePlanApplication.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoBatchCtrl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoPubCtrl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoQueryCtrl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoRestfulCtrl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/AtuExecplanTagQueryCtrl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/AtuExecplanTagRestfulCtrl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/service/AtuExecplanTagApiService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/service/AtuExecplanTagApiServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanBatchApiService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanBatchApiServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanInfoApiService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanInfoApiServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanSceneCaseTaskApiService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanSceneCaseTaskApiServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanTaskApiService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanTaskApiServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MessageCenterService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MessageCenterServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MqSynchronizeTaskApiService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MqSynchronizeTaskApiServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/common/ResponseEntity.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/common/ThirdConstant.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/DevopsPubCtrl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsCaseInfoDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsDoExecplanParamDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsExecplanInfoResultDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsProExecplanInfoDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/service/DevopsService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/service/DevopsServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/config/FeilangConfig.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/dto/FeiLangExecplanInfoResultDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/dto/FeiLangUserDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/service/FeiLangService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/service/FeiLangServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/util/FLHttpClientUtils.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/BusConstants.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/ScriptReceiver.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/SyncData2DwPublisher.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/log/CpLogAddDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/log/LogPublisher.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/log/LogRabbitMQPublisher.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/config/AtuPlanConfig.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/config/WebhookConfig.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/DictConstant.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/MsgConstant.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/PlanConstant.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/QuartzConstant.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/RabbitConstant.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/RedisConstant.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/CreatedTaskConsumer.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/DeviceOfflineConsumer.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/PublishEntrustConsumer.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskExecHeartbeatConsumer.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskExecResultConsumer.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskInputParamConsumer.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskTimeoutDelayConsumer.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanAppLinkDao.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanBatchDao.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanBatchDeviceLinkDao.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanDeviceLinkDao.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanEnvLinkDao.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanInfoDao.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanSceneCaseTaskDao.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanScriptLinkDao.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanScriptLinkMdDao.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanTaskDao.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanTaskRecordDao.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/MqSynchronizeTaskDao.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanAppLink.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanBatch.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanBatchDeviceLink.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanDeviceLink.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanEnvLink.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanInfo.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanSceneCaseTask.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanScriptLink.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanScriptLinkMd.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanTask.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanTaskRecord.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/MqSynchronizeTask.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanAppLinkServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanBatchDeviceLinkServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanBatchServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanDeviceLinkServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanEnvLinkServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanInfoServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanSceneCaseTaskServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanScriptLinkMdServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanScriptLinkServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanTaskRecordServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanTaskServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/MqSynchronizeTaskServiceImpl.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanAppLinkMapper.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanBatchDeviceLinkMapper.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanBatchMapper.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanDeviceLinkMapper.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanEnvLinkMapper.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanInfoMapper.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanSceneCaseTaskMapper.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanScriptLinkMapper.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanScriptLinkMdMapper.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanTaskMapper.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanTaskRecordMapper.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/MqSynchronizeTaskMapper.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanAppLinkService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanBatchDeviceLinkService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanBatchService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanDeviceLinkService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanEnvLinkService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanInfoService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanSceneCaseTaskService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanScriptLinkMdService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanScriptLinkService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanTaskRecordService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanTaskService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/MqSynchronizeTaskService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/AtuExecplanTagAddDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/AtuExecplanTagDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/AtuExexplanTagDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/TagInfoDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AppBaseInfoDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AppDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AppPerInfo.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuBatchCaseInfoDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuBatchSumDataDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuBatchTaskPageDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuExceptionCase.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchPageDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchQueryDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchReportDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchAppInfoDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchInfoReportDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchMobilePerformanceDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchRetryDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchScriptExecDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchScriptReportDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchStrategyDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/DeviceOfflineMsgDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/DevicePerInfo.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/MobileTaskPerformanceDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/PageEvent.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/SceneCaseStopDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/AtuEntrustInfoDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/AtuEntrustMsgDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/DeviceListDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/EngineInfoListDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/EntrustDeviceDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AppList.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanExportDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoAddDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoAppAndDeviceDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoPageDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoQueryDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoUpdateDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanPrincipalDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanRunDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/DeviceList.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/SelectSets.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanAppLinkDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanCaseSetLinkDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanEnvLinkDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanScriptInputLinkDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanScriptLinkDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/ProjectEnvCheckDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuPlanSceneCaseTaskDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuPlanSceneCaseTaskQueryDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuSceneNextNodeDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuSceneNodeExecDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuSceneNodeInfoDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/CdEngineInfoDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/SceneFirstNodeDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptDeleteDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptInputDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptLinkDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptPageDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptQueryDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptResultDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptSaveDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AppPerInfoDataDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanInputDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanInputQueryDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskExtendDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskPageDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskQueryDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuScriptDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskCreateDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskExecDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskExecResultDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskSendBugDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskSumDataDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuVariableDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/BugAddDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/DeviceInfoDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/DevicePerInfoDataDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/PlanTaskRecordDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/QuoteData.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/SceneNodeDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/ScriptInputFileDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/ScriptStep.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/StepExecuteResult.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/TaskCaseStepDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/ErrorMessage.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/HtmlSpaceEnum.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/MobilePlatformEnum.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/TaskTypeEnum.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/exception/ExecPlanError.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiCommonCenterService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiMonsterCommonService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiMonsterDictService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiTagService.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/AttachmentFeignClient.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/DeviceFeignClient.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/PlatformFeignClient.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/PublicFeignClient.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ScriptCaseFeignClient.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/App.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseScriptResultDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetAppDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetCheckDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetCountDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetFeignDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetResultDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuPlanScriptReturnDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuSceneInfoDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfo.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfoDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfoFeignDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfoResultDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/CltDictItem.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/DictCatalogSearchDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/MdBusComponentInfoDetailDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/PlanPageQueryDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/PlanScriptPageDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/PlanScriptQueryPageDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/UserQueryDto.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/job/PlanBatchTaskDataUpdateJob.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/job/TaskExecTimeoutJob.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/pub/ats/TestPlanExecutionToAtsReportPub.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/pub/dto/ScriptFirstExecutionDTO.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/pub/dto/TestPlanScriptExecutionDetailDTO.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/AbstractQuartzJob.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/JobInvokeUtil.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/PlanTaskExecute.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/QuartzJobExecution.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/ScheduleConfig.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/ScheduleUtils.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/EnvNameUtils.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/MinioPathUtils.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/PercentageCalculatorUtil.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/WordUtils.java create mode 100644 cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/platform/db/entity/CltDictItem.java create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/application.bak.yml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/banner.txt create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/bootstrap.yml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/logback-rabbitmq.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/lua/batchScriptSumDataCache.lua create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/lua/taskRetryInitCache.lua create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/base/AtuPlanAppLink.Mapper.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/base/AtuPlanBatch.Mapper.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/base/AtuPlanBatchDeviceLink.Mapper.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/base/AtuPlanDeviceLink.Mapper.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/base/AtuPlanEnvLink.Mapper.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/base/AtuPlanInfo.Mapper.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/base/AtuPlanSceneCaseTask.Mapper.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/base/AtuPlanScriptLink.Mapper.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/base/AtuPlanScriptLinkMd.Mapper.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/base/AtuPlanTask.Mapper.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/base/AtuPlanTaskRecord.Mapper.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/base/MqSynchronizeTask.Mapper.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/ext/AtuPlanAppLink.Dao.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/ext/AtuPlanBatch.Dao.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/ext/AtuPlanBatchDeviceLink.Dao.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/ext/AtuPlanDeviceLink.Dao.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/ext/AtuPlanEnvLink.Dao.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/ext/AtuPlanInfo.Dao.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/ext/AtuPlanSceneCaseTask.Dao.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/ext/AtuPlanScriptLink.Dao.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/ext/AtuPlanScriptLinkMd.Dao.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/ext/AtuPlanTask.Dao.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/ext/AtuPlanTaskRecord.Dao.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/mybatis/ext/MqSynchronizeTask.Dao.xml create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/static/icon/app/appInstallTime.png create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/static/icon/app/appStartTime.png create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/static/icon/app/cpu.png create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/static/icon/app/flow.png create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/static/icon/app/memory.png create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/static/icon/device/cpu.png create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/static/icon/device/flow.png create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/static/icon/device/memory.png create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/static/icon/device/temperature.png create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/templates/pdfTemp.pdf create mode 100644 cctp-atu/atu-execute-plan/src/main/resources/templates/taskReportTemplate.docx create mode 100644 cctp-atu/atu-execute-plan/testDockerfile create mode 100644 cctp-atu/atu-mobile-driver/pom.xml create mode 100644 cctp-atu/atu-mobile-driver/src/main/java/net/northking/cctp/mobile/driver/constans/AutomationRequestCmd.java create mode 100644 cctp-atu/atu-mobile-driver/src/main/java/net/northking/cctp/mobile/driver/driver/MobileDriver.java create mode 100644 cctp-atu/atu-mobile-driver/src/main/java/net/northking/cctp/mobile/driver/entity/CmdAutomationRequest.java create mode 100644 cctp-atu/atu-mobile-driver/src/main/java/net/northking/cctp/mobile/driver/entity/CmdAutomationResponse.java create mode 100644 cctp-atu/atu-mobile-driver/src/main/java/net/northking/cctp/mobile/driver/websocket/AutomationSocketClient.java create mode 100644 cctp-atu/atu-mobile-script-debuger/Dockerfile-dev create mode 100644 cctp-atu/atu-mobile-script-debuger/Dockerfile-prod create mode 100644 cctp-atu/atu-mobile-script-debuger/Dockerfile-test create mode 100644 cctp-atu/atu-mobile-script-debuger/Dockerfile-uat create mode 100644 cctp-atu/atu-mobile-script-debuger/docker-ctl.sh create mode 100644 cctp-atu/atu-mobile-script-debuger/pom.xml create mode 100644 cctp-atu/atu-mobile-script-debuger/shell/docker-build.sh create mode 100644 cctp-atu/atu-mobile-script-debuger/shell/docker-start.sh create mode 100644 cctp-atu/atu-mobile-script-debuger/shell/nk-ms.sh create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/MobileScriptDebugerApplication.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/bean/DebugerConst.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/bean/DebugerRequest.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/bean/DebugerResponse.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/config/RabbitMQConfig.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/config/WebSocketConfig.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/constants/MobileScriptDebugerConstant.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/feign/DeviceFeignClient.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/listener/WebClientListener.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/service/DeviceInfoService.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/service/DeviceInfoServiceImpl.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/service/InterfaceScriptDebugService.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/service/InterfaceScriptDebugServiceImpl.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/service/MobileScriptDebugService.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/service/MobileScriptDebugServiceImpl.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/util/JsonUtils.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/util/SpringUtils.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/websocket/MessageHandler.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/websocket/WSApiSessionManager.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/websocket/WSSessionManager.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/java/net/northking/cctp/debuger/websocket/WebSocketClientChannel.java create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/resources/application_bak.yml create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/resources/banner.txt create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/resources/bootstrap.yml create mode 100644 cctp-atu/atu-mobile-script-debuger/src/main/resources/logback-rabbitmq.xml create mode 100644 cctp-atu/atu-mobile-script-debuger/testDockerfile create mode 100644 cctp-atu/atu-pc-driver/pom.xml create mode 100644 cctp-atu/atu-pc-driver/src/main/java/net/northking/cctp/pc/driver/constants/PCConstant.java create mode 100644 cctp-atu/atu-pc-driver/src/main/java/net/northking/cctp/pc/driver/dto/EngineResultDto.java create mode 100644 cctp-atu/atu-pc-driver/src/main/java/net/northking/cctp/pc/driver/socket/PCDriver.java create mode 100644 cctp-atu/atu-script-case/Dockerfile-dev create mode 100644 cctp-atu/atu-script-case/Dockerfile-prod create mode 100644 cctp-atu/atu-script-case/Dockerfile-test create mode 100644 cctp-atu/atu-script-case/Dockerfile-uat create mode 100644 cctp-atu/atu-script-case/atu-script-case.deployment.yaml create mode 100644 cctp-atu/atu-script-case/docker-ctl.sh create mode 100644 cctp-atu/atu-script-case/logback-rabbitmq.xml create mode 100644 cctp-atu/atu-script-case/pom.xml create mode 100644 cctp-atu/atu-script-case/shell/nk-ms.sh create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/platform/db/entity/CpEnv.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/ScriptCaseApplication.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/app/AppBatchCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/app/AppCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/app/AppPubCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/app/AppQueryCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/app/AppRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/app/service/AppApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/app/service/AppApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/app/service/FileMinioServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/app/service/FileService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/ats/AtsTestElementCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/ats/service/AtsTestElementApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/ats/service/AtsTestElementApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/ScriptInfoCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/ScriptPubCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/ScriptTagCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/ScriptTreeCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/ScriptVersionCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/service/AtuScriptGroupApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/service/AtuScriptGroupApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/service/AtuScriptInfoApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/service/AtuScriptInfoApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/service/AtuScriptTagApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/service/AtuScriptTagApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/service/AtuScriptVersionApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuScript/service/AtuScriptVersionApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuscriptrecord/AtuGlobalVariableRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuscriptrecord/AtuInputRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuscriptrecord/AtuScriptInputSetCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuscriptrecord/service/AtuGlobalVariableApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuscriptrecord/service/AtuGlobalVariableApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuscriptrecord/service/AtuInputApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuscriptrecord/service/AtuInputApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuscriptrecord/service/AtuScriptInputSetApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuscriptrecord/service/AtuScriptInputSetApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuscriptrecord/service/AtuScriptInputSetVersionApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/atuscriptrecord/service/AtuScriptInputSetVersionApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/caseDataSet/AtuCaseDataSetBatchCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/caseDataSet/AtuCaseDataSetQueryCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/caseDataSet/AtuCaseDataSetRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/caseDataSet/service/AtuCaseDataSetApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/caseDataSet/service/AtuCaseDataSetApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/casedesign/AtuProjectEnvRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/casedesign/service/AtuCaseInfoApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/casedesign/service/AtuProjectEnvApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/casedesign/service/AtuProjectEnvApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/casedesign/service/MqSynchronizeTaskApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/casedesign/service/MqSynchronizeTaskApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/comLib/LibraryBusComInfoQueryCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/comLib/LibraryBusComInfoRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/comLib/LibraryBusComTreeRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/comLib/service/LibraryBusComInfoApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/comLib/service/LibraryBusComInfoApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/comLib/service/LibraryBusComTreeApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/comLib/service/LibraryBusComTreeApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/BusComponentTreeRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/HisBusComInfoRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/HisUseComponentRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/MdBusComInfoPubCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/MdBusComInfoQueryCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/MdBusComInfoRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/ReBusComponentInfoRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/AtuBusinessNoApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/AtuBusinessNoApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/BusComponentTreeApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/BusComponentTreeApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/HisBusComponentInfoApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/HisBusComponentInfoApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/HisUseComponentApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/HisUseComponentApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/MdBusComponentInfoApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/MdBusComponentInfoApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/ReBusComponentInfoApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/ReBusComponentInfoApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/service/SequenceStorageImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/component/ws/JSchConnectWS.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/elementLibrary/AtuElementGroupRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/elementLibrary/AtuElementInfoRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/elementLibrary/service/AtuElementGroupApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/elementLibrary/service/AtuElementGroupApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/elementLibrary/service/AtuElementInfoApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/elementLibrary/service/AtuElementInfoApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/inputSet/AtuInputSetBatchCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/inputSet/AtuInputSetPubCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/inputSet/AtuInputSetQueryCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/inputSet/AtuInputSetRestfulCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/inputSet/service/AtuInputSetApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/inputSet/service/AtuInputSetApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/nlp/NLPPubCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/nlp/service/MuteCustomDictionary.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/nlp/service/NLPService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/nlp/service/RedisCustomDictionary.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/nlp/service/impl/NLPServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/SceneCoordinatorCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/SceneScriptCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/bean/Inputs.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/bean/Line.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/bean/Node.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/bean/Outputs.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/bean/Point.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/bean/SceneScript.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/bean/Variable.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/service/AtuSceneScriptApiService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/service/AtuSceneScriptApiServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/service/SceneDataVerifier.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/service/coordinate/SceneCoordinatorService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/service/verfiy/IDataVerify.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/service/verfiy/SceneNameVerify.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/service/verfiy/SceneNodeNameVerify.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/service/verfiy/SceneRelationVerify.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/service/verfiy/UserCaseDataVerify.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/api/scenescript/service/verfiy/VariableVerify.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/bus/AppRabbitMQPublisher.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/bus/LogRabbitMQPublisher.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/bus/NoticePublisher.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/bus/NoticeRabbitMQPublisher.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/bus/PlanRabbitMQPublisher.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/bus/SyncData2DwPublisher.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/config/WebSocketConfig.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/constants/RedisConstant.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/constants/ScriptConstant.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AppDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuBusinessNoDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuCaseDataSetDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuElementGroupDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuElementInfoDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuGlobalVariableDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuInputSetDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuSceneInfoDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuSceneNodeInfoDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuScriptGroupDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuScriptInfoDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuScriptInputSetDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuScriptInputSetVersionDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuScriptTagDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/AtuScriptVersionDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/BusComponentTreeDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/HisUseComponentDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/LibraryBusComInfoDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/LibraryBusComTreeDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/MdBusComponentInfoDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/MdComponentParamDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/dao/MqSynchronizeTaskDao.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/App.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuBusinessNo.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuCaseDataSet.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuElementGroup.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuElementInfo.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuGlobalVariable.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuInputSet.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuProjectEnv.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuSceneInfo.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuSceneNodeInfo.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuScriptGroup.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuScriptInfo.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuScriptInputSet.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuScriptInputSetVersion.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuScriptTag.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/AtuScriptVersion.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/BusComponentTree.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/FileMessage.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/HisUseComponent.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/LibraryBusComInfo.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/LibraryBusComTree.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/MdBusComponentInfo.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/MdComponentParam.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/MqSynchronizeTask.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/entity/ReBusComponentInfo.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AppServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuBusinessNoServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuCaseDataSetServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuElementGroupServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuElementInfoServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuGlobalVariableServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuInputSetServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuSceneInfoServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuSceneNodeInfoServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuScriptGroupServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuScriptInfoServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuScriptInputSetServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuScriptInputSetVersionServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuScriptTagServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/AtuScriptVersionServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/BusComponentTreeServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/HisUseComponentServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/LibraryBusComInfoServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/LibraryBusComTreeServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/MdBusComponentInfoServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/MdComponentParamServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/impl/MqSynchronizeTaskServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AppMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuBusinessNoMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuCaseDataSetMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuElementGroupMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuElementInfoMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuGlobalVariableMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuInputSetMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuSceneInfoMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuSceneNodeInfoMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuScriptGroupMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuScriptInfoMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuScriptInputSetMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuScriptInputSetVersionMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuScriptTagMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/AtuScriptVersionMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/BusComponentTreeMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/HisUseComponentMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/LibraryBusComInfoMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/LibraryBusComTreeMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/MdBusComponentInfoMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/MdComponentParamMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/mapper/MqSynchronizeTaskMapper.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AppService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuBusinessNoService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuCaseDataSetService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuElementGroupService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuElementInfoService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuGlobalVariableService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuInputSetService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuSceneInfoService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuSceneNodeInfoService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuScriptGroupService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuScriptInfoService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuScriptInputSetService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuScriptInputSetVersionService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuScriptTagService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/AtuScriptVersionService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/BusComponentTreeService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/HisUseComponentService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/LibraryBusComInfoService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/LibraryBusComTreeService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/MdBusComponentInfoService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/MdComponentParamService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/db/service/MqSynchronizeTaskService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/IdAndStatusDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/app/AppAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/app/AppCreatedByDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/app/AppCreatedByQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/app/AppCreator.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/app/AppDeleteDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/app/AppDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/app/AppPackageAndNameDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/app/AppQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/app/AppUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/app/AppVersionQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/app/AtuAppVersionDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/ats/AtsQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/ats/AtsScenarioExecute.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/ats/ResultResponse.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/LogAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/UserQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptGroup/AtuScriptGroupAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptGroup/AtuScriptGroupDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptGroup/AtuScriptGroupMoveDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptGroup/AtuScriptGroupQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptGroup/AtuScriptGroupUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptGroup/PublishScriptDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptGroup/PublishScriptQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/AtuPlanScriptDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/AtuScriptInfoAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/AtuScriptInfoDeleteDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/AtuScriptInfoDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/AtuScriptInfoFeignDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/AtuScriptInfoMoveDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/AtuScriptInfoQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/AtuScriptInfoResultDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/AtuScriptInfoUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/CommandDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/PlanPageQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/PlanScriptPageDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/PrincipalUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/ScriptDependencyDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/ScriptVariableDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptInfo/TargetDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptTag/AtuScriptTagAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptTag/AtuScriptTagDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptTag/AtuScriptTagDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptTag/AtuScriptTagQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptTag/AtuScriptTagUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptTag/TagInfoDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptVersion/AtuScriptVersionAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptVersion/AtuScriptVersionDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptVersion/AtuScriptVersionQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptVersion/AtuScriptVersionResultDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuScript/atuScriptVersion/AtuScriptVersionUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuDbConfigAddTmpDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuDbConfigQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuGlobalVariableAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuGlobalVariableDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuGlobalVariableQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuGlobalVariableUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetAddTmpDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetFeignDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetQuoteFeignDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetQuoteFieldDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetResultDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetVersionAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetVersionDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetVersionQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/AtuScriptInputSetVersionUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/ScriptInputHeaderDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/atuscriptrecord/ScriptInputTableDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/AtuCaseDataSetAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/AtuCaseDataSetDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/AtuCaseDataSetFeignDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/AtuCaseDataSetMenuDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/AtuCaseDataSetQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/AtuCaseDataSetUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/AtuCaseScriptQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/AtuCaseScriptResultDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/AtuPlanScriptReturnDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/AtuPlanScriptSaveDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/AtuSetTreeQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/PicusQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/PlanQueryAppDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseDataSet/SetTreeDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/casedesign/AtuProjectEnvDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/casedesign/MqSynchronizeTaskAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/casedesign/MqSynchronizeTaskDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/casedesign/MqSynchronizeTaskQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/casedesign/MqSynchronizeTaskUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/casedesign/TableHeader.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseset/AppList.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseset/AtuCaseSetAppDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseset/AtuCaseSetRabbitDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/caseset/DeviceList.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/comLib/LibraryBusComCheckDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/comLib/LibraryBusComInfoAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/comLib/LibraryBusComInfoDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/comLib/LibraryBusComInfoQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/comLib/LibraryBusComInfoUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/comLib/LibraryBusComTreeAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/comLib/LibraryBusComTreeDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/comLib/LibraryBusComTreeQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/comLib/LibraryBusComTreeUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/AtuBusinessNoDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/AtuBusinessNoQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/BusComponentTreeAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/BusComponentTreeDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/BusComponentTreeQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/BusComponentTreeUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/CpComponentListDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/CpLogAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/HisBusComponentInfoAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/HisBusComponentInfoDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/HisBusComponentInfoQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/HisBusComponentInfoUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/HisComponentParamDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/HisUseComponentAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/HisUseComponentDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/HisUseComponentQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/HisUseComponentUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/MdBusComCopyDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/MdBusComponentInfoAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/MdBusComponentInfoDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/MdBusComponentInfoQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/MdBusComponentInfoUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/MdComponentParamDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/ReBusComponentInfoAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/ReBusComponentInfoDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/ReBusComponentInfoQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/ReBusComponentInfoUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/ReBusComponentInfoVersionDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/ReComponentParamDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/RecordComParamDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/RecordComTreeDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/RecordComTreeLikeDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/RecordComTreeQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/component/TreeMoveDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/elementLibrary/AtuElementFetchTypeDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/elementLibrary/AtuElementGroupAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/elementLibrary/AtuElementGroupDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/elementLibrary/AtuElementGroupMoveDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/elementLibrary/AtuElementGroupQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/elementLibrary/AtuElementGroupUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/elementLibrary/AtuElementInfoAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/elementLibrary/AtuElementInfoDelDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/elementLibrary/AtuElementInfoDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/elementLibrary/AtuElementInfoMoveDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/elementLibrary/AtuElementInfoQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/elementLibrary/AtuElementInfoUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuInnputDataSetQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuInputDataSetDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuInputDataSetResultDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuInputSetAddDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuInputSetCaseDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuInputSetDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuInputSetDownloadDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuInputSetFileDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuInputSetQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuInputSetResultDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuInputSetSaveDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuInputSetUpdateDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/AtuPlanInputQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/InputSet.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/inputSet/InputSetResultDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/AtuSaveSceneInputsDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/AtuSaveSceneScriptAndGenCaseDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/AtuSaveSceneScriptDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/AtuSaveScriptAndCaseResVo.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/AtuSceneInfoDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/AtuSceneNodeInfoDetailDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/AtuSceneScriptPagingQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/AtuSceneScriptQueryDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/ReqSceneFirstNodeDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/ReqSceneNextNodeDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/ReqSceneNodesDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/ResNodeInfo.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/ResNodeInfoDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/ResVariable.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/SceneNameVerifyDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/SceneNodeInfoDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/StopCaseDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/dto/sceneScript/UserCaseDataVerifyDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/enums/ElementLibraryError.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/enums/ErrorMessage.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/enums/FileError.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/enums/MobileError.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/enums/PlatformType.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/enums/ScriptCaseAppError.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/feign/ApiTagService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/feign/AttachmentFeignClient.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/feign/DataMgrFeignClient.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/feign/DeviceFeignClient.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/feign/ExecutePlanFeignClient.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/feign/PlatformFeignClient.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/feign/ProjectFeignClient.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/feign/dto/AtuDataSetFeignDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/feign/dto/AtuExceptionCase.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/feign/dto/DataContentDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/feign/dto/DataHeaderDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/feign/dto/DataSetsSaveDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/pub/AtuCaseDataSetPub.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/pub/variable/VariablePubCtrl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/pub/variable/dto/VariableDto.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/pub/workbench/WorkbenchDataPub.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/pub/workbench/service/WorkbenchDataService.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/pub/workbench/service/WorkbenchDataServiceImpl.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/pub/workbench/vo/WorkbenchUIScriptNumVO.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/Assert.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/DataMgrUtils.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/DownloadFileUtils.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/EnvNameUtils.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/HttpClientUtils.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/HttpUtils.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/IpaUtil.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/MinioPathUtils.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/PinYinUtil.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/RuleDefinitionTool.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/ScriptCaseUtils.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/SnowflakeIdGenerator.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/StreamUtils.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/XMLUtils.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/iosPng/NorthKingIpaPngFix.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/iosPng/PNGIHDRTrunk.java create mode 100644 cctp-atu/atu-script-case/src/main/java/net/northking/cctp/scriptcase/tools/iosPng/PNGTrunk.java create mode 100644 cctp-atu/atu-script-case/src/main/resources/application.bak.yml create mode 100644 cctp-atu/atu-script-case/src/main/resources/banner.txt create mode 100644 cctp-atu/atu-script-case/src/main/resources/bootstrap.yml create mode 100644 cctp-atu/atu-script-case/src/main/resources/logback-rabbitmq.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/App.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuBusinessNo.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuCaseDataSet.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuElementGroup.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuElementInfo.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuGlobalVariable.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuInputSet.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuSceneInfo.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuSceneNodeInfo.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuScriptGroup.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuScriptInfo.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuScriptInputSet.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuScriptInputSetVersion.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuScriptTag.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/AtuScriptVersion.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/BusComponentTree.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/HisUseComponent.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/LibraryBusComInfo.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/LibraryBusComTree.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/MdBusComponentInfo.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/MdComponentParam.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/base/MqSynchronizeTask.Mapper.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/App.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuBusinessNo.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuCaseDataSet.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuElementGroup.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuElementInfo.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuGlobalVariable.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuInputSet.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuSceneInfo.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuSceneNodeInfo.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuScriptGroup.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuScriptInfo.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuScriptInputSet.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuScriptInputSetVersion.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuScriptTag.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/AtuScriptVersion.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/BusComponentTree.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/HisUseComponent.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/LibraryBusComInfo.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/LibraryBusComTree.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/MdBusComponentInfo.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/MdComponentParam.Dao.xml create mode 100644 cctp-atu/atu-script-case/src/main/resources/mybatis/ext/MqSynchronizeTask.Dao.xml create mode 100644 cctp-atu/atu-script-case/testDockerfile create mode 100644 cctp-atu/atu-upper-computer/pom.xml create mode 100644 cctp-atu/atu-upper-computer/shell/docker-build.sh create mode 100644 cctp-atu/atu-upper-computer/shell/docker-start.sh create mode 100644 cctp-atu/atu-upper-computer/shell/nk-ms.sh create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/AtuUpperComputerApplication.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/aop/ControllerAspect.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/automation/AutomationWebSocketServer.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/automation/constants/AutomationRequestCmd.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/automation/constants/Command.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/automation/constants/UpperParamKey.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/automation/entity/CmdAutomationRequest.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/automation/entity/CmdAutomationResponse.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/automation/handler/AbstractAutomationHandler.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/automation/handler/AndroidAutomationHandler.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/automation/handler/AutomationMessageHandler.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/automation/handler/IosAutomationHandler.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/config/BuildWdaConfig.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/config/HttpRequestPathConfig.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/config/MobileProperty.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/config/RabbitMQConfig.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/config/SwaggerConfiguration.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/config/WebSocketConfig.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/AndroidHotKeyCodeEnum.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/BaseDefineDependencyConstants.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/HandCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/HzBankOcr.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/HzBankOcrCode.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/IosInputKeyBoardEnum.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/KeyBoardCodeEnum.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/RequestCmd.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/ResponseCmd.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/UpperComputerConstant.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/WebDriverAgentState.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/controller/ElementController.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/controller/EngineController.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/AbstractDeviceManager.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/AndroidDeviceManager.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/DeviceManager.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/IOSDeviceManager.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/UpperComputerManager.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/common/PyMobileDevice.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/common/Python3.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/AdapterDetails.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/AppleApplicationInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/AppleRawAdapterDetail.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/BasebandKeyHashInformation.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/BatteryBaseInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/BatteryData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/BatteryDetail.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/CFBundleDocumentType.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/CFBundleIcons.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/CFBundlePrimaryIcon.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/CFBundleURLType.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/CarrierMode.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/ChargerData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/DeadBatteryBootData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/DeveloperDvtGraphics.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/DeviceBaseInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/DevicePortData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/Entitlements.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/EnvironmentVariables.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/GroupContainers.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/INAlternativeAppName.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/IOReportChannelInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/IOReportLegend.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/InductiveData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/KioskMode.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/LPEMData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/LifetimeData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/LockdownInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/NSAppTransportSecurity.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/NonVolatileRAM.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/PowerTelemetryData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/ProcessInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/UIApplicationShortcutItem.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/UTExportedTypeDeclaration.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/entity/UTTypeTagSpecification.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/screen/AndroidScreenResponseThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/screen/AndroidVideoScreenResponseThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/screen/ImageScreenResponse.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/screen/IosScreenResponseThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/screen/ScreenRecorder.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/AndroidDeviceInitThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/AppiumEnvironmentThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/Device8100WatchThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/IosDeviceInitThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/MacIosDeviceInitThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/UpperComputerHeartThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/UsbMuxdDriverThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/WindowsAndLinuxIosDeviceInitThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/utils/OutputLineCallback.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/utils/XcodeBuild.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/adb/Adb.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/adb/AdbDevice.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/adb/AdbServerRunner.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/adb/AdbShellSession.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/adb/AdbTransport.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/adb/AndroidDeviceListener.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/adb/PushBytesCountCallback.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/adb/RemoteFileRecord.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/adb/TransportException.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/adb/Tunnel.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/AndroidAgent.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/AndroidAgentSession.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/StandaloneCommandException.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/StandaloneCommandRunner.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/StandaloneCommandTimeoutException.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/ActivityManagerServiceShellCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/AppiumSourceXmlCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/ClipboardCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/CloseSessionCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/EchoCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/GetSmsListCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/KeyEventCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/MediaCodecListCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/MotionEventCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/PackageListCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/RotationScreenCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/RunningAppProcessInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/RunningAppProcessInfoCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/ScreenStreamCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/StartScreenVideoCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/StopCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/StopScreenVideoCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/SwitchWifiCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/TakeScreenshotCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/TextInputCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/WatchBatteryDetailCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/WatchCpuUsageCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/WatchDisplayInfoCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/WatchMemoryUsageCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/WatchScreenStreamCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/WatchScreenVideoFrameCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/WatchTrafficStatsNetworkSpeedCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/WatchWifiStateCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/data/BatteryData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/data/DisplayData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/data/MediaCodecInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/data/NetworkCollectInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/data/NetworkSpeed.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/data/PackageInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/data/ProcessMemoryInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/data/ScreenVideoFrame.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/protocol/AbstractProtocolCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/protocol/ProtocolCommand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/agent/command/protocol/ProtocolStreamUtil.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/DeviceSocketProvider.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/DeviceSocketStream.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/LocalUsbmuxdDeviceSocketProvider.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/LocalUsbmuxdDeviceSocketStream.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/NKAgent.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/AppBatteryData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/DragUiNodeData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/DragXYData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/ForceTapXYData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/HoldUiNodeData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/MultiplyTapUiNodeData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/PinchUiNodeData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/PressAndDragUiNodeData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/PressAndDragXYData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/ScreenInfoData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/ScreenShotData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/SearchUiNodeData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/SwipeUiNodeData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/TapXYData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/TextData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/TypeKeysUiNodeData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/UiNodeData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/data/WheelSelectUiNodeData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/listener/AppBatteryDataListener.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/command/listener/ScreenInfoDataListener.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/packet/AsyncPacketListener.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/packet/BooleanCommandData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/packet/ByteCommandData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/packet/CodecUtils.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/packet/CommandPacket.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/packet/EmptyCommandData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/packet/ICommandData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/packet/ICommandPacket.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/packet/IntCommandData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/packet/PacketHandler.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/packet/PacketTransfer.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/ios/packet/TextCommandData.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/proxy/WebDriverAgentApiProxy.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/proxy/WebDriverAgentScreenProxy.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/AppleDevice.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/AppleDeviceWatcher.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/IOSDeviceListener.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/UsbMuxd.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/UsbMuxdConnectFailedException.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/payload/Payload.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/payload/service/ServicePayload.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/payload/service/request/GetValueRequest.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/payload/service/request/QueryTypeRequest.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/payload/usbmuxd/UsbMuxdPayload.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/payload/usbmuxd/entity/DeviceConnectionDetail.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/payload/usbmuxd/request/ConnectDevicePortRequest.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/payload/usbmuxd/request/ListDevicesRequest.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/payload/usbmuxd/request/ListenDeviceRequest.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/payload/usbmuxd/response/ListDeviceResponse.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/payload/usbmuxd/response/ListenDeviceResponse.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/payload/usbmuxd/response/ResultResponse.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/service/AppleDeviceInnerService.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/driver/usbmuxd/service/LockdownService.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/Attachment.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/CdDeviceCtrl.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/CdDeviceModel.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/CdDeviceRegisterDto.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/CdEngineInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/CdMobileBrand.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/CdMobileDevice.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/CdPcDevice.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/ComputerHeartInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/ConsumerInfoDto.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/DebuggerDeviceInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/DeviceInfo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/DeviceInfoDto.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/PhoneEntity.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/entity/ResultWrapper.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/enums/BrandEnum.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/enums/FileBusinessTypeEnum.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/enums/PlatformType.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/exception/AppiumException.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/exception/ExecuteException.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/exception/ParamMistakeException.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/exception/ResponseVO.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/init/UpperComputerInit.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/listener/UpperComputerConsumer.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/AbstractDebuggerService.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/AndroidDebuggerServiceImpl.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/DebuggerService.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/DeviceConnectionService.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/DeviceService.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/DeviceServiceImpl.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/IosDebuggerServiceImpl.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/impl/ConnectionServiceImpl.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/thread/AndroidDeviceAllInfoThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/thread/AndroidDeviceInfoByPackageThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/thread/IOSDeviceAllInfoThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/thread/IOSDeviceInfoByPackageThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/thread/AndroidAdbDataThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/thread/IosPerfDataRead.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/thread/IosTiDeviceThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/thread/ShutdownHook.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/utils/AndroidAppiumHelper.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/utils/ByteUtils.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/utils/HttpUtils.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/utils/JsonUtils.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/utils/ProcessCmdUtils.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/utils/ScreenShotUtils.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/utils/SessionUtils.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/utils/SpringUtils.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/utils/hzBank/HzBankOcrUtils.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/utils/ios/IosDeviceHandleHelper.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/utils/ios/LinuxAndWindowsIosHandleHelper.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/utils/ios/MacIosHandleHelper.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/vo/HzBankOcrVo.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/DeviceConnectionWebSocket.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/entity/CatchParam.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/entity/CmdRequest.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/entity/CmdResponse.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/entity/ParamCheck.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/entity/Point.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/function/FunctionConstants.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/function/IosFunction.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/function/IosFunctionByAgent.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/AbstractIosMessageHandlerThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/AbstractMessageHandler.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/AndroidLogThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/AndroidMessageHandlerThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/AndroidPerfThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/GetNodeTreeThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/IosLogThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/IosMacMessageHandlerThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/IosPerfThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/IosScreenCompressHandleThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/IosWindowsAndLinuxMessageHandlerThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/MessageHandler.java create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/NotifyWebCloseConnectionThread.java create mode 100644 cctp-atu/atu-upper-computer/src/main/resources/application-devFront.yml create mode 100644 cctp-atu/atu-upper-computer/src/main/resources/application-prod.yml create mode 100644 cctp-atu/atu-upper-computer/src/main/resources/application-test.yml create mode 100644 cctp-atu/atu-upper-computer/src/main/resources/application-uat.yml create mode 100644 cctp-atu/atu-upper-computer/src/main/resources/application.yml create mode 100644 cctp-atu/atu-upper-computer/src/main/resources/logback.xml create mode 100644 cctp-atu/cctp-guaca-proxy/Dockerfile-dev create mode 100644 cctp-atu/cctp-guaca-proxy/Dockerfile-prod create mode 100644 cctp-atu/cctp-guaca-proxy/Dockerfile-test create mode 100644 cctp-atu/cctp-guaca-proxy/Dockerfile-uat create mode 100644 cctp-atu/cctp-guaca-proxy/docker-ctl.sh create mode 100644 cctp-atu/cctp-guaca-proxy/pom.xml create mode 100644 cctp-atu/cctp-guaca-proxy/shell/docker-build.sh create mode 100644 cctp-atu/cctp-guaca-proxy/shell/docker-start.sh create mode 100644 cctp-atu/cctp-guaca-proxy/shell/nk-ms.sh create mode 100644 cctp-atu/cctp-guaca-proxy/src/main/java/net/northking/cctp/guaca/GuacaProxyApplication.java create mode 100644 cctp-atu/cctp-guaca-proxy/src/main/java/net/northking/cctp/guaca/ws/GuacaProxyFeignClient.java create mode 100644 cctp-atu/cctp-guaca-proxy/src/main/java/net/northking/cctp/guaca/ws/WebSocketConfig.java create mode 100644 cctp-atu/cctp-guaca-proxy/src/main/java/net/northking/cctp/guaca/ws/WebSocketTunnel.java create mode 100644 cctp-atu/cctp-guaca-proxy/src/main/resources/banner.txt create mode 100644 cctp-atu/cctp-guaca-proxy/src/main/resources/bootstrap.yml create mode 100644 cctp-atu/cctp-guaca-proxy/src/main/resources/logback-rabbitmq.xml create mode 100644 cctp-atu/cctp-pcui-designer/Dockerfile-dev create mode 100644 cctp-atu/cctp-pcui-designer/Dockerfile-prod create mode 100644 cctp-atu/cctp-pcui-designer/Dockerfile-test create mode 100644 cctp-atu/cctp-pcui-designer/Dockerfile-uat create mode 100644 cctp-atu/cctp-pcui-designer/docker-ctl.sh create mode 100644 cctp-atu/cctp-pcui-designer/pom.xml create mode 100644 cctp-atu/cctp-pcui-designer/shell/docker-build.sh create mode 100644 cctp-atu/cctp-pcui-designer/shell/docker-start.sh create mode 100644 cctp-atu/cctp-pcui-designer/shell/nk-ms.sh create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/PcuiDesignerApplication.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/ImgBase64InstructUtil.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/InstructSetMsg.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/RedisUtil.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/RobotEngineConnetStatusBo.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/WebSocketConfig.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/WsManyWaysBo.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/WsUtils.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/client/EngineWsClient.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/client/RobotWsClient.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/constants/PcuiDesignerConstant.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/feign/CctpPlatformFeignClient.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/feign/DesignerFeignClient.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/mq/MqConstant.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/server/FrontDatasWebsocket.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/java/net/northking/cctp/designer/ws/server/InstructSetTransetionEnum.java create mode 100644 cctp-atu/cctp-pcui-designer/src/main/resources/banner.txt create mode 100644 cctp-atu/cctp-pcui-designer/src/main/resources/bootstrap.yml create mode 100644 cctp-atu/cctp-pcui-designer/src/main/resources/logback-rabbitmq.xml create mode 100644 cctp-atu/cctp-pcui-designer/testDockerfile create mode 100644 cctp-production/README.md create mode 100644 cctp-production/cctp-device-mgr/Dockerfile-dev create mode 100644 cctp-production/cctp-device-mgr/Dockerfile-prod create mode 100644 cctp-production/cctp-device-mgr/Dockerfile-test create mode 100644 cctp-production/cctp-device-mgr/Dockerfile-uat create mode 100644 cctp-production/cctp-device-mgr/README.md create mode 100644 cctp-production/cctp-device-mgr/cctp-device-mgr.deployment.yaml create mode 100644 cctp-production/cctp-device-mgr/docker-ctl.sh create mode 100644 cctp-production/cctp-device-mgr/pom.xml create mode 100644 cctp-production/cctp-device-mgr/shell/docker-build.sh create mode 100644 cctp-production/cctp-device-mgr/shell/docker-start.sh create mode 100644 cctp-production/cctp-device-mgr/shell/nk-ms.sh create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/DeviceMgrApplication.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/README.MD create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/activity/DeviceActivityCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/activity/DeviceActivityWS.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/activity/service/DeviceActivityApiService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/activity/service/DeviceActivityApiServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/activity/service/EngineActivityCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/brand/CdMobileBrandQueryCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/brand/CdMobileBrandRestfulCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/brand/service/CdMobileBrandApiService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/brand/service/CdMobileBrandApiServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/ctrl/CdDeviceCtrlQueryCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/ctrl/CdDeviceCtrlRestfulCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/ctrl/service/CdDeviceCtrlApiService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/ctrl/service/CdDeviceCtrlApiServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/engineInfo/CdEngineInfoQueryCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/engineInfo/CdEngineInfoRestfulCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/engineInfo/service/CdEngineInfoApiService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/engineInfo/service/CdEngineInfoApiServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/engineReleases/CdEngineReleasesQueryCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/engineReleases/CdEngineReleasesRestfulCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/engineReleases/service/CdEngineReleasesApiService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/engineReleases/service/CdEngineReleasesApiServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/mobile/CdMobileDevicePlatformCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/mobile/CdMobileDeviceQueryCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/mobile/CdMobileDeviceSaaSCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/mobile/service/CdMobileDeviceApiService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/mobile/service/CdMobileDeviceApiServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/model/CdDeviceModelQueryCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/model/CdDeviceModelRestfulCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/model/service/CdDeviceModelApiService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/model/service/CdDeviceModelApiServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/pcDevice/CdPcDevicePlatformCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/pcDevice/CdPcDeviceQueryCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/pcDevice/CdPcDeviceRestfulCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/pcDevice/CdPcDeviceSaaSCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/pcDevice/PcMonitorDataWS.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/pcDevice/service/CdPcDeviceApiService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/api/pcDevice/service/CdPcDeviceApiServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/BusConstants.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/README.MD create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/feign/CctpPlatformFeign.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/feign/PlatformFeign.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/feign/TenantFeign.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/feign/dto/CltDictCatalog.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/feign/dto/CltDictItem.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/feign/dto/UserInfoDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/publisher/CtrlMQPublisher.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/publisher/CtrlPublisher.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/publisher/DeviceStatusMQPublisher.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/publisher/DeviceStatusPublisher.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/publisher/dto/ConsumerInfoDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/publisher/fanout/DeviceFanoutPublisher.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/receiver/DeviceMQReceiver.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/receiver/HeartMQReceiver.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/receiver/dto/CtrlReceiverDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/bus/receiver/dto/HeartMQDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/config/EmailConfig.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/config/EngineConfig.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/config/PrometheusConfig.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/config/README.MD create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/config/RabbitConfig.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/config/SystemConfig.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/config/WebSocketConfig.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/constants/DeviceConstants.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/constants/DeviceError.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/constants/ErrorMessage.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/constants/README.MD create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/README.MD create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdDeviceCtrlDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdDeviceModelDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdDeviceProjectDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdDeviceStatusDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdDeviceTenantDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdDeviceTokenDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdDeviceUsageLogDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdEngineInfoDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdEngineReleasesDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdMobileBrandDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdMobileDeviceDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdPcDeviceDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/dao/CdPcUserDao.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdDeviceCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdDeviceModel.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdDeviceProject.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdDeviceStatus.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdDeviceTenant.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdDeviceToken.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdDeviceUsageLog.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdEngineInfo.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdEngineReleases.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdMobileBrand.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdMobileDevice.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdPcDevice.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/entity/CdPcUser.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdDeviceCtrlServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdDeviceModelServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdDeviceProjectServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdDeviceStatusServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdDeviceTenantServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdDeviceTokenServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdDeviceUsageLogServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdEngineInfoServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdEngineReleasesServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdMobileBrandServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdMobileDeviceServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdPcDeviceServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/impl/CdPcUserServiceImpl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdDeviceCtrlMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdDeviceModelMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdDeviceProjectMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdDeviceStatusMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdDeviceTenantMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdDeviceTokenMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdDeviceUsageLogMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdEngineInfoMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdEngineReleasesMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdMobileBrandMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdMobileDeviceMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdPcDeviceMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/mapper/CdPcUserMapper.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdDeviceCtrlService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdDeviceModelService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdDeviceProjectService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdDeviceStatusService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdDeviceTenantService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdDeviceTokenService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdDeviceUsageLogService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdEngineInfoService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdEngineReleasesService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdMobileBrandService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdMobileDeviceService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdPcDeviceService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/db/service/CdPcUserService.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/README.MD create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/brand/CdMobileBrandAddDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/brand/CdMobileBrandDetailDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/brand/CdMobileBrandQueryDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/brand/CdMobileBrandUpdateDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/ctrl/CdDeviceCtrlAddDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/ctrl/CdDeviceCtrlDetailDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/ctrl/CdDeviceCtrlQueryDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/ctrl/CdDeviceCtrlUpdateDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/CdDeviceRegisterDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/CdMobileDeviceAddDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/CdMobileDeviceDetailDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/CdMobileDeviceExitDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/CdMobileDeviceQueryDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/CdMobileDeviceRecycleDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/CdMobileDeviceScriptDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/CdMobileDeviceScriptDto2.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/CdMobileDeviceUpdateDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/DeviceInfoDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/DeviceLockDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/DeviceLogDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/DeviceSelectQueryDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/device/ScriptResultDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineInfo/CdEngineInfoAddDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineInfo/CdEngineInfoDetailDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineInfo/CdEngineInfoQueryDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineInfo/CdEngineInfoRegisterDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineInfo/CdEngineInfoResultDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineInfo/CdEngineInfoUpdateDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineInfo/CdEngineInfoVersionDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineInfo/DeviceListDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineInfo/EngineInfoListDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineLog/CdEngineLogAddDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineLog/CdEngineLogDetailDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineLog/CdEngineLogQueryDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineLog/CdEngineLogUpdateDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineReleases/CdEngineReleasesAddDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineReleases/CdEngineReleasesDetailDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineReleases/CdEngineReleasesQueryDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineReleases/CdEngineReleasesUpdateDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/engineReleases/ScriptEngineVersion.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/model/CdDeviceModelAddDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/model/CdDeviceModelDetailDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/model/CdDeviceModelQueryDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/model/CdDeviceModelUpdateDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/model/DeviceSelectDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/model/SystemVersionDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/CdDeviceListRemoteDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/CdDeviceRemoteDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/CdPcDeviceAddDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/CdPcDeviceDetailDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/CdPcDeviceDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/CdPcDeviceExitDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/CdPcDeviceQueryDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/CdPcDeviceRemoteDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/CdPcDeviceScriptDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/CdPcDeviceStatusDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/CdPcDeviceUpdateDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/CdPcUserUpdateDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/pcDevice/ScriptPcResultDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/dto/tenant/TenantDetail.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/pub/CdEngineReleasesPubCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/pub/DevicePubCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/pub/RegisterPubCtrl.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/schedule/DeviceLogSchedule.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/schedule/DeviceSchedule.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/schedule/MonitorDataSchedule.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/util/DeviceStatusUtil.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/util/IpUtil.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/util/OkHttpClientUtil.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/util/README.md create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/util/prometheus/MonitorTools.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/util/prometheus/PromQlConfig.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/util/prometheus/PromSqlDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/util/prometheus/PrometheusClient.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/util/prometheus/PrometheusQuery.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/util/prometheus/PrometheusRequest.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/util/prometheus/PrometheusTargets.java create mode 100644 cctp-production/cctp-device-mgr/src/main/java/net/northking/cctp/device/util/prometheus/TargetDto.java create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/banner.txt create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/bootstrap.yml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/db/mysql/data/README.MD create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/db/mysql/schema/README.md create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/db/mysql/schema/cd_mobile_brand.sql create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/db/mysql/update/update.sql create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/logback-rabbitmq.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/README.MD create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdDeviceCtrl.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdDeviceModel.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdDeviceProject.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdDeviceStatus.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdDeviceTenant.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdDeviceToken.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdDeviceUsageLog.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdEngineInfo.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdEngineReleases.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdMobileBrand.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdMobileDevice.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdPcDevice.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/base/CdPcUser.Mapper.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdDeviceCtrl.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdDeviceModel.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdDeviceProject.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdDeviceStatus.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdDeviceTenant.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdDeviceToken.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdDeviceUsageLog.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdEngineInfo.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdEngineReleases.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdMobileBrand.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdMobileDevice.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdPcDevice.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/src/main/resources/mybatis/ext/CdPcUser.Dao.xml create mode 100644 cctp-production/cctp-device-mgr/testDockerfile create mode 100644 cctp-production/cctp-mobile/Dockerfile-dev create mode 100644 cctp-production/cctp-mobile/Dockerfile-prod create mode 100644 cctp-production/cctp-mobile/Dockerfile-test create mode 100644 cctp-production/cctp-mobile/Dockerfile-uat create mode 100644 cctp-production/cctp-mobile/cctp-mobile.deployment.yaml create mode 100644 cctp-production/cctp-mobile/docker-ctl.sh create mode 100644 cctp-production/cctp-mobile/pom.xml create mode 100644 cctp-production/cctp-mobile/shell/Dockerfile create mode 100644 cctp-production/cctp-mobile/shell/docker-build.sh create mode 100644 cctp-production/cctp-mobile/shell/docker-start.sh create mode 100644 cctp-production/cctp-mobile/shell/nk-ms.sh create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/MobileBusinessApplication.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/api/device/DeviceMobileCtrl.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/config/ConnectThreadPoolService.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/config/FeignRequestConfig.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/config/FixedReplyConfig.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/config/MobileConnectionConfig.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/config/RabbitMQConfig.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/config/RedisConfig.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/config/RestTemplateConfig.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/config/WebMvcConfiguration.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/config/WebSocketConfig.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/constants/DeviceConstants.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/constants/ErrorMessage.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/constants/MobileConnectionConstants.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/db/impl/MobileConnectServiceImpl.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/db/service/MobileConnectService.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/device/CdDeviceCtrl.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/device/CdDeviceModel.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/device/CdEngineInfo.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/device/CdMobileBrand.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/device/CdMobileDevice.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/device/CdPcDevice.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/device/DeviceDetailDto.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/device/DeviceInfoDto.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/device/DeviceQueryDto.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/device/DeviceSelectQueryDto.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/device/DeviceUiTreeDto.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/device/TypeQuery.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/report/AppInstallationDataDetailDto.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/report/DeviceIdNameAndUrlsDetailDto.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/dto/report/DeviceLogDto.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/entity/FileMessage.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/entity/UpperWSRequest.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/entity/UpperWSResponse.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/entity/WSRequest.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/entity/WSResponse.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/enums/PlatformType.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/exception/MobileConnectException.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/exception/MobileRuntimeException.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/feign/device/DeviceMgrFeignClient.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/socket/MobileSessionManager.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/socket/UpperMessageHandler.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/socket/UpperWebSocketClient.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/thread/ProcessMsgThread.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/util/HttpUtils.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/util/JsonUtils.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/util/SpringUtils.java create mode 100644 cctp-production/cctp-mobile/src/main/java/net/northking/cctp/mobile/util/WSUtils.java create mode 100644 cctp-production/cctp-mobile/src/main/resources/banner.txt create mode 100644 cctp-production/cctp-mobile/src/main/resources/bootstrap.yml create mode 100644 cctp-production/cctp-mobile/src/main/resources/logback-rabbitmq.xml create mode 100644 cctp-production/cctp-mobile/src/main/resources/mybatis/README.MD create mode 100644 cctp-production/cctp-mobile/src/main/resources/mysql/data/README.MD create mode 100644 cctp-production/cctp-mobile/src/main/resources/mysql/schema/README.MD create mode 100644 cctp-production/cctp-projects/Dockerfile-dev create mode 100644 cctp-production/cctp-projects/Dockerfile-prod create mode 100644 cctp-production/cctp-projects/Dockerfile-test create mode 100644 cctp-production/cctp-projects/Dockerfile-uat create mode 100644 cctp-production/cctp-projects/README.md create mode 100644 cctp-production/cctp-projects/cctp-projects.deployment.yaml create mode 100644 cctp-production/cctp-projects/docker-ctl.sh create mode 100644 cctp-production/cctp-projects/pom.xml create mode 100644 cctp-production/cctp-projects/shell/Dockerfile create mode 100644 cctp-production/cctp-projects/shell/docker-build.sh create mode 100644 cctp-production/cctp-projects/shell/docker-start.sh create mode 100644 cctp-production/cctp-projects/shell/nk-ms.sh create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/platform/db/entity/CltDictItem.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/platform/db/entity/CpEnv.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/ProjectsApplication.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/env/CpProjectEnvDsPubCtrl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/env/CpProjectEnvDsQueryCtrl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/env/CpProjectEnvDsRestfulCtrl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/env/CpProjectEnvPubCtrl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/env/CpProjectEnvSysPubCtrl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/env/CpProjectEnvSysQueryCtrl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/env/CpProjectEnvSysRestfulCtrl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/env/service/CpProjectEnvDsApiService.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/env/service/CpProjectEnvDsApiServiceImpl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/env/service/CpProjectEnvSysApiService.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/env/service/CpProjectEnvSysApiServiceImpl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/project/CpProjectQueryCtrl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/project/CpProjectRestfulCtrl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/project/service/CpProjectApiService.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/project/service/CpProjectApiServiceImpl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/pub/ProjectPubCtrl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/pub/dto/PubDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/software/service/CpProjectSoftwareApiService.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/software/service/CpProjectSoftwareApiServiceImpl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/team/MtProjectTeamQueryCtrl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/team/service/MtProjectTeamApiService.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/api/team/service/MtProjectTeamApiServiceImpl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/bus/BusConstants.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/bus/feign/CpEnvProjectDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/bus/feign/CpEnvProjectQueryDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/bus/feign/FlowFeign.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/bus/feign/HzBankFeign.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/bus/feign/PlatformFeign.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/bus/feign/PlatformForHzBankFeign.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/bus/feign/TestBugFeign.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/config/HzFeignConfig.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/config/RabbitConfig.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/config/SyncParamConfig.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/config/TaskSyncConfig.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/constants/ColumnTypeConstants.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/constants/ProjectAppError.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/constants/ProjectConstants.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/constants/README.MD create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/README.MD create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/dao/CpProjectEnvDsDao.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/dao/CpProjectEnvSysDao.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/dao/CpProjectSoftwareDao.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/entity/CpProject.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/entity/CpProjectEnvDs.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/entity/CpProjectEnvSys.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/entity/CpProjectSoftware.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/impl/CpProjectEnvDsServiceImpl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/impl/CpProjectEnvSysServiceImpl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/impl/CpProjectServiceImpl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/impl/CpProjectSoftwareServiceImpl.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/mapper/CpProjectEnvDsMapper.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/mapper/CpProjectEnvSysMapper.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/mapper/CpProjectSoftwareMapper.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/service/CpProjectEnvDsService.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/service/CpProjectEnvSysService.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/service/CpProjectService.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/db/service/CpProjectSoftwareService.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/README.MD create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvDsAddDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvDsConnDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvDsDeleteDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvDsDetailDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvDsExecuteDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvDsModuleExecDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvDsQueryDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvDsSelectDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvDsUpdateDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvSysAddDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvSysDeleteDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvSysDetailDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvSysQueryDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvSysSelectDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvSysUpdateDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/env/CpProjectEnvSysUrlSearchDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/process/StatusRoleDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/project/CpProjectDetailDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/project/CpProjectEnvOptionDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/project/CpProjectEnvQueryDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/project/CpProjectQueryDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/project/OptionVO.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/project/ProMobQueryDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/project/ProMobResultDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/project/ProjectLinkDetailDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/project/ProjectOverallGanttDetailDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/project/ProjectQueryDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/project/ProjectSimpleInfo.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/project/ProjectSoftware.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/software/Software.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/team/MtProjectTeamDetailDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/team/MtProjectTeamQueryDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/template/MtProjectTemplateDetailDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/dto/template/MtProjectTemplateQueryDto.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/enums/OperateType.java create mode 100644 cctp-production/cctp-projects/src/main/java/net/northking/cctp/project/vo/SnowWolfProjectVO.java create mode 100644 cctp-production/cctp-projects/src/main/resources/application.bak.yml create mode 100644 cctp-production/cctp-projects/src/main/resources/banner.txt create mode 100644 cctp-production/cctp-projects/src/main/resources/bootstrap.yml create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/data/README.MD create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_demand_manager.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_demand_plan.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_demand_system.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_project.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_project_bug_process.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_project_demand.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_project_details.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_project_implement_process.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_project_layer.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_project_manage.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_project_principal.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_project_risk.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_project_rule.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_project_software.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_project_template.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_team.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/cp_team_member.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/mt_project_group.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/mt_project_group_user.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/mt_project_team.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/mt_project_team_role.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/mt_project_template.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/project_overall_gantt_chart.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/schema/project_test_report.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/db/mysql/update/update.sql create mode 100644 cctp-production/cctp-projects/src/main/resources/logback-rabbitmq.xml create mode 100644 cctp-production/cctp-projects/src/main/resources/mybatis/README.MD create mode 100644 cctp-production/cctp-projects/src/main/resources/mybatis/base/CpProjectEnvDs.Mapper.xml create mode 100644 cctp-production/cctp-projects/src/main/resources/mybatis/base/CpProjectEnvSys.Mapper.xml create mode 100644 cctp-production/cctp-projects/src/main/resources/mybatis/base/CpProjectSoftware.Mapper.xml create mode 100644 cctp-production/cctp-projects/src/main/resources/mybatis/ext/CpProjectEnvDs.Dao.xml create mode 100644 cctp-production/cctp-projects/src/main/resources/mybatis/ext/CpProjectEnvSys.Dao.xml create mode 100644 cctp-production/cctp-projects/src/main/resources/mybatis/ext/CpProjectSoftware.Dao.xml create mode 100644 cctp-production/cctp-projects/src/main/resources/mybatis/ext/README.MD create mode 100644 cctp-production/cctp-projects/testDockerfile create mode 100644 cctp-production/cctp-test-bug/Dockerfile-dev create mode 100644 cctp-production/cctp-test-bug/Dockerfile-prod create mode 100644 cctp-production/cctp-test-bug/Dockerfile-test create mode 100644 cctp-production/cctp-test-bug/Dockerfile-uat create mode 100644 cctp-production/cctp-test-bug/README.md create mode 100644 cctp-production/cctp-test-bug/cctp-test-bug.deployment.yaml create mode 100644 cctp-production/cctp-test-bug/docker-ctl.sh create mode 100644 cctp-production/cctp-test-bug/pom.xml create mode 100644 cctp-production/cctp-test-bug/shell/Dockerfile create mode 100644 cctp-production/cctp-test-bug/shell/docker-build.sh create mode 100644 cctp-production/cctp-test-bug/shell/docker-start.sh create mode 100644 cctp-production/cctp-test-bug/shell/nk-ms.sh create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/platform/db/entity/CltDictItem.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/platform/db/entity/CpRuleConfig.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/TestBugApplication.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugCorrelationLinkBatchCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugCorrelationLinkQueryCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugCorrelationLinkRestfulCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugLogBatchCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugLogQueryCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugLogRestfulCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugManagementBatchCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugManagementQueryCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugManagementRestfulCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugPubCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugRecordBatchCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugRecordQueryCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugRecordRestfulCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/BugRelationBatchCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/MtBusinessRuleResultCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/OverallViewIndex2BatchCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/OverallViewIndex2QueryCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/OverallViewIndex2RestfulCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/OverallViewIndexBatchCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/OverallViewIndexQueryCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/OverallViewIndexRestfulCtrl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugCorrelationLinkApiService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugCorrelationLinkApiServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugLogApiService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugLogApiServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugManagementApiService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugManagementApiServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugNoApiService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugNoApiServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugOverallTendencyChartApiService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugOverallTendencyChartApiServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugRecordApiService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugRecordApiServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugStatisticsChartApiService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/BugStatisticsChartApiServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/EmailService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/EmailServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/MtBusinessRuleService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/MtBusinessRuleServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/OverallViewIndex2ApiService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/OverallViewIndex2ApiServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/OverallViewIndexApiService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/OverallViewIndexApiServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/api/service/SequenceStorageImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/bus/constants/MQConstants.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/bus/publisher/NoticePublisher.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/bus/publisher/NoticeRabbitMQPublisher.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/bus/receive/MQNotice.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/config/RabbitConfig.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/constants/MQConstant.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/constants/TestBugConstants.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/constants/TestBugError.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/constants/TestBugRuleCode.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/dao/BugCorrelationLinkDao.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/dao/BugLogDao.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/dao/BugManagementDao.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/dao/BugNoDao.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/dao/BugOverallTendencyChartDao.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/dao/BugRecordDao.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/dao/BugStatisticsChartDao.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/dao/MqSynchronizeTaskDao.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/dao/OverallViewIndex2Dao.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/dao/OverallViewIndexDao.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/entity/BugCorrelationLink.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/entity/BugLog.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/entity/BugManagement.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/entity/BugNo.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/entity/BugOverallTendencyChart.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/entity/BugRecord.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/entity/BugSearch.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/entity/BugStatisticsChart.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/entity/MqSynchronizeTask.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/entity/OverallViewIndex.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/entity/OverallViewIndex2.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/impl/BugCorrelationLinkServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/impl/BugLogServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/impl/BugManagementServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/impl/BugNoServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/impl/BugOverallTendencyChartServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/impl/BugRecordServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/impl/BugStatisticsChartServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/impl/MqSynchronizeTaskServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/impl/OverallViewIndex2ServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/impl/OverallViewIndexServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/mapper/BugCorrelationLinkMapper.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/mapper/BugLogMapper.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/mapper/BugManagementMapper.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/mapper/BugNoMapper.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/mapper/BugOverallTendencyChartMapper.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/mapper/BugRecordMapper.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/mapper/BugSearchMapper.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/mapper/BugStatisticsChartMapper.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/mapper/MqSynchronizeTaskMapper.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/mapper/OverallViewIndex2Mapper.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/mapper/OverallViewIndexMapper.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/service/BugCorrelationLinkService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/service/BugLogService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/service/BugManagementService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/service/BugNoService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/service/BugOverallTendencyChartService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/service/BugRecordService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/service/BugStatisticsChartService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/service/MqSynchronizeTaskService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/service/OverallViewIndex2Service.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/db/service/OverallViewIndexService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugCorrelationLinkAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugCorrelationLinkDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugCorrelationLinkQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugCorrelationLinkUpdateDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugHighDegreeChartDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugHighDegreeChartQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugLegacyGradeDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugLegacyGradeGroupDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugLinkDeleteDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugLogAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugLogDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugLogQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugLogUpdateDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugManagementAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugManagementDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugManagementQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugManagementUpdateDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugNoQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugOverallStatisticsDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugOverallTendencyChartAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugOverallTendencyChartDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugOverallTendencyChartQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugOverallTendencyChartUpdateDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugRecordAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugRecordDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugRecordQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugRecordUpdateDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugSearchAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugSearchDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugSearchQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugSearchUpdateDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugStatisticsChartAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugStatisticsChartDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugStatisticsChartQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugStatisticsChartUpdateDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugTendencyChartDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugTendencyChartQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugTendencyChartQueryTmpDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BugValidRepairRatio.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/BusinessRuleDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/CountBugDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/IsCommitBugDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/MidUserBugGrade.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/OverallViewIndex2AddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/OverallViewIndex2DetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/OverallViewIndex2QueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/OverallViewIndex2UpdateDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/OverallViewIndexAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/OverallViewIndexDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/OverallViewIndexQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/OverallViewIndexUpdateDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/ProjectGroupDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/SynBugInfoDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/bug/BugManageQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/bug/BugManagementDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/bug/ResultResponse.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/bug/SearchDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/bus/AtuCaseInfoDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/bus/BugGradeStatisticsAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/bus/BugLifeCycleChartAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/bus/BugTendencyChartTmpAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/bus/SynModule.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/bus/SynSystem.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/cases/BugSysFields.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/cases/CltBusinessNoQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/cases/MtProjectTemplateDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/cases/MtProjectTemplateQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/dict/DictItem.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/platform/CpNotice.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/platform/CpTemplatePropertiesDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/platform/UserQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/project/CpDemandPlan.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/project/CpProjectDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/project/CpProjectRuleQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/project/RuleConfigValue.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/project/StatusRoleDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/team/MtProjectTeamDetailDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/team/MtProjectTeamQueryDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/team/ProjectGroupNameDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/dto/team/ProjectUserRoleNameIdDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/enums/BugFrom.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/enums/Emergency.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/enums/TestBugGrade.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/enums/TestBugStatus.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/enums/TestBugType.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/feign/client/CasesFeignClient.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/feign/client/CpProject.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/feign/client/PlatFormFeignClient.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/feign/client/ProjectsFeignClient.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/feign/client/UserInfo.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/feign/client/UserInfoDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/feign/server/CasesFeignServer.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/feign/server/PlatFormFeignServer.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/feign/server/ProjectsFeignServer.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/pub/bug/dto/BugManagementPubAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/pub/bug/dto/CpAttachAddDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/pub/bug/dto/PubDto.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/schedule/BugSchedule.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/schedule/service/ScheduleService.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/schedule/service/impl/ScheduleServiceImpl.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/util/BeanHelper.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/util/CompareFieldsUtil.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/util/ExcelUtil.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/util/HTMLToText.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/util/HttpClientUtil.java create mode 100644 cctp-production/cctp-test-bug/src/main/java/net/northking/cctp/testbug/util/ListUtils.java create mode 100644 cctp-production/cctp-test-bug/src/main/resources/application.bak.yml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/banner.txt create mode 100644 cctp-production/cctp-test-bug/src/main/resources/bootstrap.yml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/db/mysql/data/README.MD create mode 100644 cctp-production/cctp-test-bug/src/main/resources/db/mysql/schema/bug_correlation_link.sql create mode 100644 cctp-production/cctp-test-bug/src/main/resources/db/mysql/schema/bug_log.sql create mode 100644 cctp-production/cctp-test-bug/src/main/resources/db/mysql/schema/bug_management.sql create mode 100644 cctp-production/cctp-test-bug/src/main/resources/db/mysql/schema/bug_no.sql create mode 100644 cctp-production/cctp-test-bug/src/main/resources/db/mysql/schema/bug_record.sql create mode 100644 cctp-production/cctp-test-bug/src/main/resources/db/mysql/schema/bug_search.sql create mode 100644 cctp-production/cctp-test-bug/src/main/resources/db/mysql/schema/mq_synchronize_task.sql create mode 100644 cctp-production/cctp-test-bug/src/main/resources/db/mysql/schema/overall_view_index.sql create mode 100644 cctp-production/cctp-test-bug/src/main/resources/db/mysql/schema/overall_view_index2.sql create mode 100644 cctp-production/cctp-test-bug/src/main/resources/logback-rabbitmq.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/base/BugCorrelationLink.Mapper.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/base/BugLog.Mapper.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/base/BugManagement.Mapper.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/base/BugNo.Mapper.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/base/BugOverallTendencyChart.Mapper.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/base/BugRecord.Mapper.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/base/BugSearch.Mapper.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/base/BugStatisticsChart.Mapper.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/base/MqSynchronizeTask.Mapper.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/base/OverallViewIndex.Mapper.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/base/OverallViewIndex2.Mapper.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/ext/BugCorrelationLink.Dao.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/ext/BugLog.Dao.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/ext/BugManagement.Dao.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/ext/BugNo.Dao.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/ext/BugOverallTendencyChart.Dao.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/ext/BugRecord.Dao.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/ext/BugStatisticsChart.Dao.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/ext/MqSynchronizeTask.Dao.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/ext/OverallViewIndex.Dao.xml create mode 100644 cctp-production/cctp-test-bug/src/main/resources/mybatis/ext/OverallViewIndex2.Dao.xml create mode 100644 cctp-production/cctp-test-bug/src/test/java/net/northking/Test.java create mode 100644 cctp-production/cctp-test-bug/src/test/java/net/northking/cctp/HttpApiCaseExecutor.java create mode 100644 cctp-production/cctp-test-bug/src/test/java/net/northking/cctp/HttpApiSuiteExecutor.java create mode 100644 cctp-production/cctp-test-bug/src/test/resources/UT-http-api.round1.xlsx create mode 100644 cctp-production/cctp-test-bug/src/test/resources/example/data-source-add.xlsx create mode 100644 cctp-production/cctp-test-bug/src/test/resources/example/data-source-delete.xlsx create mode 100644 cctp-production/cctp-test-bug/src/test/resources/example/data-source-detail.xlsx create mode 100644 cctp-production/cctp-test-bug/src/test/resources/example/data-source-paging.xlsx create mode 100644 cctp-production/cctp-test-bug/src/test/resources/example/data-source-update.xlsx create mode 100644 cctp-production/cctp-test-bug/testDockerfile create mode 100644 cctp-test-element/README.md create mode 100644 cctp-test-element/cctp-test-element-core/pom.xml create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/APIFactory.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/AbstractLibrary.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/ContextInitializer.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/DeviceDriver.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/IExecuteContext.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/IScriptStep.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/IStepTarget.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/ITestTarget.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/InitializingBean.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/Library.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/LibraryContext.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/PresetConfiguration.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/RegisterInfo.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/ResourceLoader.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/annotation/Argument.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/annotation/ArgumentBusMap.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/annotation/Autowired.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/annotation/Bean.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/annotation/Keyword.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/annotation/Keywords.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/annotation/Library.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/annotation/Return.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/exception/AssertException.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/exception/ComponentRuntimeException.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/exception/EnvironmentException.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/exception/ExecuteException.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/exception/FactoriesConfigException.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/exception/IdentifierMismatchException.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/exception/KeywordArgumentConvertException.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/exception/KeywordNotFoundException.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/exception/NoSuchLibraryException.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/exception/ParamMistakeException.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/filter/DefaultClassFilter.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/filter/IClassFilter.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/keyword/IKeywordExtractor.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/keyword/IKeywordFactory.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/keyword/Keyword.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/keyword/KeywordArgument.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/keyword/KeywordExtractor.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/keyword/KeywordFactory.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/keyword/KeywordInfo.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/keyword/KeywordReturn.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/reflect/ArgumentConverter.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/reflect/ArgumentGrouper.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/reflect/IArgumentConverter.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/reflect/IArgumentGrouper.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/reflect/IKeywordInvoker.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/reflect/KeywordInvoker.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/scanner/BeanClassLookup.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/scanner/FactoriesLoader.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/scanner/LibraryDefinition.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/scanner/ResourceScanner.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/support/BeanFactory.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/support/BeanPostProcessor.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/support/BeanRegistry.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/support/DefaultBeanFactory.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/support/DefaultLibraryContext.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/support/PathMatchingResourceResolver.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/support/ThreadLevelCache.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/type/DataType.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/type/EnumClass.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/type/InputType.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/type/LibraryConstant.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/type/NullEnum.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/core/type/ParamScope.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/log/Level.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/log/Logger.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/log/Slf4jLogger.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/scanner/JarLibraryScanner.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/scanner/JarResourceProvider.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/scanner/LibraryLoadHelper.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/system/FileStorage.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/system/SystemProperties.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/test/AbstractLibraryTest.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/test/ParamsBuilder.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/test/SampleExecuteContext.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/test/junit/LibraryJUnit4ClassRunner.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/util/AntPathMatcher.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/util/AntPathStringMatcher.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/util/Assert.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/util/AtpUtils.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/util/ComponentUtils.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/util/FileUtils.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/util/IOUtils.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/util/Javadoc2Libdoc.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/validation/Constraint.java create mode 100644 cctp-test-element/cctp-test-element-core/src/main/java/net/northking/cctp/element/validation/ViolateComponentStandardsException.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ats/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ats/src/main/java/net/northking/cctp/element/ats/AtsInterfaceLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ats/src/main/java/net/northking/cctp/element/ats/constants/AtsUrlConstants.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ats/src/main/java/net/northking/cctp/element/ats/dto/AtsQueryDto.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ats/src/main/java/net/northking/cctp/element/ats/dto/AtsScenarioExecute.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ats/src/main/java/net/northking/cctp/element/ats/dto/AtsScriptExecute.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ats/src/main/java/net/northking/cctp/element/ats/dto/ResultResponse.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ats/src/main/java/net/northking/cctp/element/ats/keywords/AtsInterfaceTools.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ats/src/main/java/net/northking/cctp/element/ats/utils/HttpClientUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ats/src/main/java/net/northking/cctp/element/ats/utils/SnowflakeIdGenerator.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ats/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ats/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/main/java/net/northking/cctp/element/basic/BasicLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/main/java/net/northking/cctp/element/basic/enums/DecipherTypeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/main/java/net/northking/cctp/element/basic/enums/EncipherTypeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/main/java/net/northking/cctp/element/basic/enums/ModeTypeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/main/java/net/northking/cctp/element/basic/enums/ParamsTypeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/main/java/net/northking/cctp/element/basic/enums/TypeConversionEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/main/java/net/northking/cctp/element/basic/keywords/Common.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/main/java/net/northking/cctp/element/basic/keywords/LogicControl.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/main/java/net/northking/cctp/element/basic/utils/ContextUtil.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/main/java/net/northking/cctp/element/basic/utils/DigestUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/test/java/net/northking/cctp/element/basic/ScanTest.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/test/java/net/northking/cctp/element/basic/keywords/CommonTest.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-basic/src/test/java/net/northking/cctp/element/basic/utils/ContextUtilTest.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-collections/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-collections/src/main/java/net/northking/cctp/element/collections/CollectionsLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-collections/src/main/java/net/northking/cctp/element/collections/enums/TypeConversionRemoveEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-collections/src/main/java/net/northking/cctp/element/collections/enums/TypeConversionSortEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-collections/src/main/java/net/northking/cctp/element/collections/enums/TypeCountEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-collections/src/main/java/net/northking/cctp/element/collections/keywords/Collections.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-collections/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-collections/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-collections/src/test/java/net/northking/cctp/element/CollectionsLibraryTest.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-database/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-database/src/main/java/net/northking/cctp/element/database/DatabaseLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-database/src/main/java/net/northking/cctp/element/database/keywords/DatabaseTools.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-database/src/main/java/net/northking/cctp/element/database/keywords/constants/ConfigPath.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-database/src/main/java/net/northking/cctp/element/database/keywords/util/AtuDbConfigAddTmp2Dto.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-database/src/main/java/net/northking/cctp/element/database/keywords/util/AtuDbConfigAddTmpDto.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-database/src/main/java/net/northking/cctp/element/database/keywords/util/HttpUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-database/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-database/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-database/src/test/java/net/northking/cctp/element/database/DatabaseLibraryTest.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-datetime/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-datetime/src/main/java/net/northking/cctp/element/datetime/DateTimeLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-datetime/src/main/java/net/northking/cctp/element/datetime/enums/TypeConversionEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-datetime/src/main/java/net/northking/cctp/element/datetime/enums/TypeConversionOperateEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-datetime/src/main/java/net/northking/cctp/element/datetime/keywords/DateTime.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-datetime/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-datetime/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-datetime/src/test/java/net/northking/cctp/element/DateTimeLibraryTest.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/DesktopLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/constants/CmdConstant.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/constants/ConfigPath.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/constants/DesktopConstant.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/constants/ErrorMessageConstant.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/constants/RobotParamConstant.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/dto/EngineResult.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/dto/VariableDto.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/ActionEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/BooleanEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/BrowserTypeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/ClickTypeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/CombinationKeyEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/DirectionEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/EnvTypeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/InputModeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/MouseButtonEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/OffsetValueEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/ScrollTimeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/SelectedKeyEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/SelectedKeyTableEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/SimulateTypeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/VerificationTypeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/WaitForReadyEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/enums/WorkWayEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/keywords/ApplicationTools.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/keywords/DesktopTools.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/java/net/northking/cctp/element/desktop/service/PublicService.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-desktop/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ftp/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ftp/src/main/java/net/northking/cctp/element/ftp/FtpLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ftp/src/main/java/net/northking/cctp/element/ftp/keywords/FtpTools.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ftp/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ftp/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-ftp/src/test/java/net/northking/cctp/element/ftp/FtpLibraryTest.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/InterfaceLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/dto/ColumnDTO.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/dto/FieldDto.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/dto/ParamDto.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/dto/RequestBody.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/dto/VariableDto.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/enums/ReportTypeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/keywords/CommonTools.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/keywords/HttpRequest.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/keywords/SocketRequest.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/ResponseData.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/http/HttpClient.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/http/HttpClientKey.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/http/HttpResponseData.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/http/KeyStoreType.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/http/RequestBuilder.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/http/RequestMethod.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/http/RequestParam.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/http/auth/AuthScheme.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/http/auth/oauth2/OAuth2Client.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/http/auth/oauth2/OAuth2Credentials.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/http/auth/oauth2/OAuth2Scheme.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/http/auth/oauth2/OAuth2SchemeFactory.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/MessageHandler.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/MessageHandlerFactory.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/SocketClient.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/SocketResponseData.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/cups8583/CupsMessageHandler.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/cups8583/CupsRequest.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/cups8583/CupsRequestParam.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/cups8583/CupsUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/cups8583/internal/CsvCupsFieldDefReader.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/cups8583/internal/CupsDataType.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/cups8583/internal/CupsField.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/cups8583/internal/CupsFieldType.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/cups8583/internal/CupsHeader.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/cups8583/internal/CupsMsgBodyDecoder.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/cups8583/internal/CupsMsgBodyEncoder.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/cups8583/internal/ValueObject.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/protocol/socket/def01/Def01MessageHandler.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/utils/BinaryUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/utils/FileServer.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/utils/JsonUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/utils/MessageOperation.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/utils/NetLoggerTemplate.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/utils/TemplateHelper.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/java/net/northking/cctp/element/internal/utils/XmlUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-interface/src/main/resources/config_cups.csv create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-json/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-json/src/main/java/net/northking/cctp/element/json/JSONLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-json/src/main/java/net/northking/cctp/element/json/keywords/JSON.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-json/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-json/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-json/src/test/java/net/northking/cctp/element/JSONLibraryTest.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/MobileIosLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/constants/CommandId.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/constants/ConfigPath.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/constants/UpperParamKey.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/constants/UsingType.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/entity/ElementHandleParam.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/entity/PointMessage.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/entity/StepTarget.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/enums/AppEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/enums/SwipeDirection.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/enums/TextDirection.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/enums/WhetherOrNotEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/keywords/IOSNewTools.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/utils/AutomationHandleUtil.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/utils/CommonUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/utils/HttpUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/java/net/northking/cctp/element/mobile/ios/utils/RegexUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile-ios/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/MobileLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/constants/ConfigPath.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/constants/HzBankOcr.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/constants/HzBankOcrCode.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/constants/UsingType.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/entity/Device.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/entity/PointMessage.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/entity/ScriptParam.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/entity/StepTarget.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/enums/AppEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/enums/ExistEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/enums/KeyCode.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/enums/ParamTypeEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/enums/PasswordKeyCode.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/enums/PasswordKeyMove.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/enums/SwipeDirection.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/enums/TextDirection.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/enums/WhetherOrNotEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/keywords/AndroidTools.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/keywords/CommonTools.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/keywords/IOSTools.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/AppHandleThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/AssertElementThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/ClickElementThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/ClickIfExistElementThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/ClickTextDirectionTextThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/ClickTextThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/ClickTextThreadNew.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/ElementSwipeThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/GetCodeByOcrThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/GetElementMoneyTextThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/GetElementTextThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/GetElementValueByOcrThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/GetTableColValueThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/GetTextDirectionTextThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/IfElementThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/IfTextThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/InputFromKeyBoardThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/InputPasswordThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/InputPasswordThreadByOcrThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/InputTextElementThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/InputTextThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/LongPressThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/MonkeyTestThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/PressAndSwipeThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/PressKeyBackThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/PressKeyHomeThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/PressKeyMenuThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/ScreenShotThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/StandardSwipeThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/SwipeAndFindTargetElementThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/thread/WaitThread.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/CommonUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/HttpUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/RandomUtil.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/RegexUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/RuntimeUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/ThreadUtil.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/hzBank/HzBankOcrUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/phoneUtils/AndroidUtil.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/phoneUtils/AppUtil.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/phoneUtils/ElementUtil.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/phoneUtils/FunctionKeyUtil.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/phoneUtils/HandleUtils.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/phoneUtils/IosUtil.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/phoneUtils/ScreenUtil.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/utils/thread/Xpath.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/vo/HzBankOcrVo.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-string/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-string/src/main/java/net/northking/cctp/element/string/StringLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-string/src/main/java/net/northking/cctp/element/string/enums/TypeConversionContainEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-string/src/main/java/net/northking/cctp/element/string/enums/TypeConversionPadEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-string/src/main/java/net/northking/cctp/element/string/enums/TypeConversionProcessEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-string/src/main/java/net/northking/cctp/element/string/enums/TypeConversionReplaceEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-string/src/main/java/net/northking/cctp/element/string/enums/TypeConversionSubStringEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-string/src/main/java/net/northking/cctp/element/string/keywords/StringTools.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-string/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-string/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-string/src/test/java/net/northking/atp/element/StringLibraryTest.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-xml/pom.xml create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-xml/src/main/java/net/northking/cctp/element/xml/XMLLibrary.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-xml/src/main/java/net/northking/cctp/element/xml/enums/TypeConversionGetEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-xml/src/main/java/net/northking/cctp/element/xml/enums/TypeConversionRemoveEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-xml/src/main/java/net/northking/cctp/element/xml/enums/TypeConversionSetEnum.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-xml/src/main/java/net/northking/cctp/element/xml/exception/XMLException.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-xml/src/main/java/net/northking/cctp/element/xml/keywords/XML.java create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-xml/src/main/resources/META-INF/cctp-class.factories create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-xml/src/main/resources/changelog.md create mode 100644 cctp-test-element/cctp-test-element-library/cctp-test-element-xml/src/test/java/net/northking/cctp/element/XMLLibraryTest.java create mode 100644 cctp-test-element/cctp-test-element-library/pom.xml create mode 100644 cloud-basic/README.md create mode 100644 cloud-basic/cctp-commons/ReadMe.MD create mode 100644 cloud-basic/cctp-commons/pom.xml create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/cache/EntityNameCache.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/cache/EntityNameCatalog.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/cache/EntityNameRedisRepository.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/config/CacheConfiguration.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/config/EnableNKCloud.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/config/EnableNKDataSourceCluster.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/config/EnableNKWebMvc.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/config/GlobalConfiguration.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/config/NKDataSourceClusterConfiguration.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/config/SwaggerConfiguration.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/AbstractService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/BasicDao.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/BasicService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/DefaultPagination.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/OrderBy.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/POJO.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/Pagination.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/PaginationService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/PagingQueryDao.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/Partition.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/SqlOrderBy.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/annotation/DatabaseReadOnly.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/annotation/DatabaseWriteOnly.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/ds/DynamicDataSource.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/ds/DynamicDataSourceContext.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/ds/DynamicDataSourceService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/entity/Entity.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/entity/EntityDBService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/entity/EntityService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/excel/AbstractExcelService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/excel/ExcelHeader.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/excel/ExcelService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/mode/AbstractClusterDataSource.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/mode/DataBaseModeAspect.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/mode/DataBaseModeContext.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/mode/DataSourceCluster.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/mode/DataSourceClusterProperties.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/mode/DataSourceConfig.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/mode/NKDataSourceClusterProperties.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/mode/SingleClusterDataSource.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/tree/EntityTree.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/db/tree/EntityTreeService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/dto/AdvancedQueryOptions.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/dto/AssociatedFilesDto.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/dto/CpLogAddDto.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/dto/UserOptions.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/enums/FileBusinessTypeEnum.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/exception/ApiExceptionHandler.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/exception/ErrorEnum.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/exception/PlatformAuthException.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/exception/PlatformError.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/exception/PlatformForbiddenException.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/exception/PlatformRuntimeException.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/feign/ApiAtsEnviromentFeign.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/feign/FeignCctpConfig.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/feign/MonsterCommonFeignClient.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/feign/MonsterLogServer.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/http/QueryByPage.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/http/QueryOrderBy.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/http/ResultCodeEnum.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/http/ResultWrapper.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/jpa/BasicJpaRepository.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/jpa/CctpJpaRepository.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/jpa/interceptor/BasicJpaInterceptor.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/jpa/interceptor/CreatedUpdatedJpaInterceptor.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/jpa/interceptor/IDEntityJpaInterceptor.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/jpa/interceptor/JpaInterceptor.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/jpa/interceptor/TenantJpaInterceptor.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/log/HttpLog.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/log/HttpLogAspect.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/log/HttpLogProducer.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/log/HttpLogRabbitMQProducer.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/persistence/BizEntity.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/persistence/IDEntity.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/persistence/NamedEntity.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/persistence/rule/CreatedUpdatedRule.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/persistence/rule/IdentityRule.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/persistence/rule/LogicDeletedRule.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/persistence/rule/NamedRule.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/persistence/rule/RevisionRule.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/persistence/rule/TenantRule.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/AmazonS3Properties.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/AttachMQProducer.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/AttachmentProducer.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/ContentType.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/EnableS3.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/FileDownloadException.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/FileUploadException.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/NKFile.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/S3Configuration.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/S3File.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/SimpleStorageService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/impl/MinioFileStorage.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/s3/impl/SeaweedFileStorage.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/SaaSContext.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/Tenant.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/cache/SaaSAppDataSourceClusterCache.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/cache/SaaSAppDataSourceClusterRedisRepository.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/cache/SaaSTenantCache.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/cache/StaticTenantCache.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/config/SaaSConfiguration.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/config/SaaSProperties.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/db/MultiClusterDynamicDataSource.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/db/TenantDBService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/db/TenantEntityService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/db/TenantPaginationService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/saas/db/TenantPartition.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/security/SecurityHttpConstants.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/security/authentication/NKSecurityContext.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/security/authorization/ResourceAuthority.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/security/authorization/ResourceAuthorityCache.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/security/authorization/ResourceAuthorityRedisRepository.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/sequence/SequenceDistributedService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/sequence/SequenceNoneStorage.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/sequence/SequenceService.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/sequence/SequenceStorage.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/CamelUtil.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/DateUtil.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/EntityUtils.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/UUIDUtil.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/WebFluxNetUtils.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/WebNetUtils.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/excelUtil/ExcelMergedRegionBean.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/excelUtil/ExcelResult.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/excelUtil/ExcelToolUtil.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/excelUtil/ExportExcel.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/excelUtil/ImportExcel.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/excelUtil/excelEntity/CellStyleTemplate.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/excelUtil/excelEntity/ExcelDataTemplate.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/excelUtil/excelEntity/ExcelHead.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/excelUtil/excelEntity/SheetHead.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/util/excelUtil/excelEntity/SheetTemplate.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/validation/ValAddGroup.java create mode 100644 cloud-basic/cctp-commons/src/main/java/net/northking/cctp/common/validation/ValUpdateGroup.java create mode 100644 cloud-basic/cctp-commons/src/test/java/net/northking/cctp/common/util/CamelUtilTest.java create mode 100644 cloud-basic/cctp-commons/src/test/java/net/northking/cctp/common/util/DateUtilTest.java create mode 100644 cloud-basic/cctp-commons/src/test/java/net/northking/cctp/common/util/UUIDUtilTest.java create mode 100644 cloud-basic/cctp-flowable/Dockerfile-dev create mode 100644 cloud-basic/cctp-flowable/Dockerfile-prod create mode 100644 cloud-basic/cctp-flowable/Dockerfile-test create mode 100644 cloud-basic/cctp-flowable/Dockerfile-uat create mode 100644 cloud-basic/cctp-flowable/cctp-flowable.deployment.yaml create mode 100644 cloud-basic/cctp-flowable/docker-ctl.sh create mode 100644 cloud-basic/cctp-flowable/pom.xml create mode 100644 cloud-basic/cctp-flowable/shell/Dockerfile create mode 100644 cloud-basic/cctp-flowable/shell/docker-build.sh create mode 100644 cloud-basic/cctp-flowable/shell/docker-start.sh create mode 100644 cloud-basic/cctp-flowable/shell/nk-ms.sh create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/diagram/Edge.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/diagram/Graph.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/diagram/Identity.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/diagram/Item.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/diagram/Node.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/diagram/Point.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/WorkFlowAppRunner.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/WorkFlowApplication.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/implement/ImplementProcessCtrl.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/implement/service/ImplementProcessService.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/implement/service/ImplementProcessServiceImpl.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/sm/StateAuthQueryCtrl.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/sm/StateProcessActHistoryCtrl.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/sm/StateProcessDefCtrl.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/sm/StateProcessDeploymentCtrl.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/sm/StateProcessInstanceCtrl.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/sm/service/StateProcessActHisApiService.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/sm/service/StateProcessDefApiService.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/sm/service/StateProcessDefApiServiceImpl.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/sm/service/StateProcessDeploymentApiService.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/api/sm/service/StateProcessDeploymentApiServiceImpl.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/bus/BusConstants.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/bus/dto/ImFlowMQDto.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/bus/mq/FlowPublisher.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/bus/platform/CpLogAddDto.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/bus/platform/LogPublisher.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/bus/platform/LogRabbitMQPublisher.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/bus/receiver/PlatformMQReceiver.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/common/FlowableConstants.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/common/enums/ItemType.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/common/exception/FlowAppError.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/config/RabbitConfig.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/IpEvent.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/IpProcess.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/IpState.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/SpActHis.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/SpAction.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/SpDefEvent.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/SpDefEventAuth.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/SpDefItemExt.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/SpDefProcess.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/SpDefProcessAction.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/SpDefProcessAuth.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/SpDefState.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/entity/SpDeployment.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/IpEventRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/IpProcessRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/IpStateRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/SpActHisRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/SpActionRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/SpDefEventAuthRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/SpDefEventRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/SpDefItemExtRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/SpDefProcessActionRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/SpDefProcessAuthRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/SpDefProcessRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/SpDefStateRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/db/jpa/SpDeploymentRepository.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/dto/ip/Event.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/dto/ip/IpProcessState.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/dto/ip/State.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/dto/sm/CltDictItem.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/dto/sm/StateAuthDto.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/dto/sm/StateProcessActHisDto.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/dto/sm/StateProcessActHisQueryDto.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/dto/sm/StateProcessDefDto.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/dto/sm/StateProcessDefQueryDto.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/dto/sm/StateProcessDeploymentDto.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/dto/sm/StateProcessDeploymentQueryDto.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/dto/sm/SyncCltDictItemDto.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/engine/DefaultStateProcessEngine.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/pub/StateAuthPubQueryCtrl.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/sm/Activity.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/sm/Coordinate.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/sm/Event.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/sm/EventAuthority.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/sm/State.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/sm/StateProcessAction.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/sm/StateProcessDefinition.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/sm/StateProcessEngine.java create mode 100644 cloud-basic/cctp-flowable/src/main/java/net/northking/cctp/flowable/sm/StateProcessInstance.java create mode 100644 cloud-basic/cctp-flowable/src/main/resources/application.bak.yml create mode 100644 cloud-basic/cctp-flowable/src/main/resources/banner.txt create mode 100644 cloud-basic/cctp-flowable/src/main/resources/bootstrap.yml create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/ip_event.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/ip_process.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/ip_state.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/sp_act_his.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/sp_action.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/sp_def_event.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/sp_def_event_auth.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/sp_def_item_ext.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/sp_def_process.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/sp_def_process_action.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/sp_def_process_auth.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/sp_def_state.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/db/mysql/schema/sp_deployment.sql create mode 100644 cloud-basic/cctp-flowable/src/main/resources/logback-rabbitmq.xml create mode 100644 cloud-basic/cctp-flowable/src/test/java/net/northking/cctp/flowable/api/sm/StateProcessDefCtrlTest.java create mode 100644 cloud-basic/cctp-flowable/src/test/resources/application.yml create mode 100644 cloud-basic/cctp-flowable/src/test/resources/sm/defect01.sp.json create mode 100644 cloud-basic/cctp-flowable/testDockerfile create mode 100644 cloud-basic/cctp-maven-plugin/pom.xml create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/Constants.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/JDBCConfig.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/Messages.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/dialects/AbsDialect.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/dialects/DBDialects.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/dialects/Dialect.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/dialects/MySQLDialect.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/dialects/PostgreSQLDialect.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/entity/AttributesRef.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/entity/ColumnRef.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/entity/ForeignKeyRef.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/entity/IndexInfoRef.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/entity/JavaClassRef.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/entity/PrimaryKeyRef.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/entity/TableRef.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/util/DBUtil.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/util/StringUtil.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/analyse/util/TypeSqlToJava.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/gen/CCTPGenerator.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/gen/Constants.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/gen/GenCodeTaskEnum.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/gen/VMGenerator.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/plugin/AbsDatabaseLoadMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/plugin/DtoMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/plugin/EntityMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/plugin/HttpApiMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/plugin/JpaMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/plugin/MainMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/plugin/MybatisMapperBaseMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/plugin/MybatisMapperExtMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/plugin/MybatisMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/plugin/MybatisServiceMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/plugin/VueMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/tenant/TenantEntityMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/tenant/TenantJpaMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/java/net/northking/cctp/maven/tenant/TenantMybatisMojo.java create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/api/api-service-impl.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/api/api-service.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/api/batch-ctrl.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/api/query-ctrl.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/api/restful-ctrl.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/api/restful-dto-add.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/api/restful-dto-detail.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/api/restful-dto-query.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/api/restful-dto-update.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/config/messages_en_US.properties create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/config/messages_zh_CN.out create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/config/messages_zh_CN.properties create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/config/nkplugin.properties create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/dao/dao.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/dao/daoXml.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/dao/jpa-tenant.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/dao/jpa.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/dao/mapper.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/dao/mapperXml-tenant.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/dao/mapperXml.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/dto/dto.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/pojo/JpaEntity-tenant.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/pojo/JpaEntity.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/pojo/entity-tenant.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/pojo/entity.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/service/service.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/service/serviceImpl-tenant.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/service/serviceImpl.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/vue/add.vue.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/vue/detail.vue.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/vue/edit.vue.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/vue/entity.js.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/vue/index.vue.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/main/resources/vue/router.js.vm create mode 100644 cloud-basic/cctp-maven-plugin/src/test/java/net/northking/cctp/maven/analyse/dialects/MySQLDialectTest.java create mode 100644 cloud-basic/production-parent/README.md create mode 100644 cloud-basic/production-parent/cctp-parent/pom.xml create mode 100644 cloud-basic/production-parent/pom.xml create mode 100644 cloud-basic/sample-weed-client/pom.xml create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/Connection.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/FileSource.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/FileTemplate.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/MasterWrapper.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/VolumeWrapper.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/contect/AssignFileKeyParams.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/contect/AssignFileKeyResult.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/contect/ForceGarbageCollectionParams.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/contect/LocationResult.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/contect/LookupVolumeParams.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/contect/LookupVolumeResult.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/contect/PreAllocateVolumesParams.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/contect/PreAllocateVolumesResult.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/file/FileHandleStatus.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/http/HeaderResponse.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/http/JsonResponse.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/http/StreamResponse.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/topology/DataCenter.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/topology/DataNode.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/topology/Layout.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/topology/MasterStatus.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/topology/Rack.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/topology/ReplicaPlacement.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/topology/SystemClusterStatus.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/topology/SystemTopologyStatus.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/topology/Volume.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/core/topology/VolumeStatus.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/exception/SeaweedfsException.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/exception/SeaweedfsFileDeleteException.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/exception/SeaweedfsFileNotFoundException.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/util/ConnectionUtil.java create mode 100644 cloud-basic/sample-weed-client/src/main/java/org/lokra/seaweedfs/util/RequestPathStrategy.java create mode 100644 cloud-basic/sample-weed-client/src/test/java/org/lokra/seaweedfs/FileSystemTest.java create mode 100644 cloud-basic/sample-weed-client/src/test/java/org/lokra/seaweedfs/core/ConnectionTest.java create mode 100644 cloud-basic/sample-weed-client/src/test/java/org/lokra/seaweedfs/core/FileSourceTest.java create mode 100644 cloud-basic/sample-weed-client/src/test/java/org/lokra/seaweedfs/core/FileTemplateTest.java create mode 100644 cloud-basic/sample-weed-client/src/test/java/org/lokra/seaweedfs/core/MasterWrapperTest.java create mode 100644 cloud-basic/sample-weed-client/src/test/java/org/lokra/seaweedfs/core/VolumeWrapperTest.java create mode 100644 cloud-platform/README.md create mode 100644 cloud-platform/cctp-attachment/Dockerfile-dev create mode 100644 cloud-platform/cctp-attachment/Dockerfile-prod create mode 100644 cloud-platform/cctp-attachment/Dockerfile-test create mode 100644 cloud-platform/cctp-attachment/Dockerfile-uat create mode 100644 cloud-platform/cctp-attachment/docker-ctl.sh create mode 100644 cloud-platform/cctp-attachment/pom.xml create mode 100644 cloud-platform/cctp-attachment/shell/docker-build.sh create mode 100644 cloud-platform/cctp-attachment/shell/docker-start.sh create mode 100644 cloud-platform/cctp-attachment/shell/nk-ms.sh create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/AttachmentApplication.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/api/AttachFileCtrl.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/api/service/AttachFileService.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/api/service/AttachFileServiceImpl.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/api/service/FileService.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/api/service/FileServiceImpl.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/bus/AttachmentConsumer.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/bus/AttachmentMQConsumer.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/constant/FileConstant.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/constant/ScriptConstant.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/db/dao/AttachmentDao.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/db/entity/Attachment.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/db/impl/AttachmentServiceImpl.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/db/mapper/AttachmentMapper.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/db/service/AttachmentService.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/dto/ChunkFiles.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/dto/FileMessage.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/enums/FileError.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/enums/PlatformType.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/util/NorthKingIpaPngFix.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/util/PNGIHDRTrunk.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/util/PNGTrunk.java create mode 100644 cloud-platform/cctp-attachment/src/main/java/net/northking/cctp/attachment/util/XMLUtils.java create mode 100644 cloud-platform/cctp-attachment/src/main/resources/application.bak.yml create mode 100644 cloud-platform/cctp-attachment/src/main/resources/bootstrap.yml create mode 100644 cloud-platform/cctp-attachment/src/main/resources/db/mysql/schema/attachment.sql create mode 100644 cloud-platform/cctp-attachment/src/main/resources/logback-rabbitmq.xml create mode 100644 cloud-platform/cctp-attachment/src/main/resources/mybatis/base/Attachment.Mapper.xml create mode 100644 cloud-platform/cctp-attachment/src/main/resources/mybatis/ext/Attachment.Dao.xml create mode 100644 cloud-platform/cctp-attachment/testDockerfile create mode 100644 cloud-platform/cctp-dw/Dockerfile-dev create mode 100644 cloud-platform/cctp-dw/Dockerfile-prod create mode 100644 cloud-platform/cctp-dw/Dockerfile-test create mode 100644 cloud-platform/cctp-dw/Dockerfile-uat create mode 100644 cloud-platform/cctp-dw/README.md create mode 100644 cloud-platform/cctp-dw/cctp-dw.deployment.yaml create mode 100644 cloud-platform/cctp-dw/docker-ctl.sh create mode 100644 cloud-platform/cctp-dw/pom.xml create mode 100644 cloud-platform/cctp-dw/shell/docker-build.sh create mode 100644 cloud-platform/cctp-dw/shell/docker-start.sh create mode 100644 cloud-platform/cctp-dw/shell/nk-ms.sh create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/CCTPDwApplication.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/BugChartCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/BugGradeStatisticsQueryCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/BugLifeCycleChartQueryCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/BugOverallTendencyChartQueryCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/BugStatusStatisticsQueryCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/BugTemplateStatusBatchCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/BugTemplateStatusQueryCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/BugTemplateStatusRestfulCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/BugTendencyChartTmpQueryCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/CpProjectDetailCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/DwCaseDesignInfoQueryCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/DwPlanExecutionForHzBankCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/DwScriptQueryForHzBankCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/MobileScreenDataCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/MtCaseDesignChartQueryCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/MtCaseDesignCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/MtCaseExecChartQueryCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/MtCaseExecTrendChartQueryCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/MtLeafDesignQueryCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/MtManualExecJobCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/MtProjectOverviewCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/MtTestChartCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/MtTestPointCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/MtTestPointStatisticsQueryCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/ScreenDataCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/DwAtuCaseDesignRestfulCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/DwAtuScriptInfoRestfulCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/DwReBusComponentRestfulCtrl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuCaseDesignApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuCaseDesignApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuPlanBatchApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuPlanBatchApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuPlanEnvLinkApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuPlanEnvLinkApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuPlanInfoApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuPlanInfoApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuPlanScriptLinkApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuPlanScriptLinkApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuPlanTaskApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuPlanTaskApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuScriptInfoApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuScriptInfoApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuScriptVersionApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwAtuScriptVersionApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwReBusComponentApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/atu/service/DwReBusComponentApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugChartService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugChartServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugGradeStatisticsApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugGradeStatisticsApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugLifeCycleChartApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugLifeCycleChartApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugOverallTendencyChartApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugOverallTendencyChartApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugStatusStatisticsApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugStatusStatisticsApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugTemplateStatusApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugTemplateStatusApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugTendencyChartTmpApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/BugTendencyChartTmpApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/ChartApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/ChartApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/CpProjectDetailApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/CpProjectDetailApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/DwCaseDesignInfoApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/DwCaseDesignInfoApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtCaseDesignApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtCaseDesignApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtCaseDesignChartApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtCaseDesignChartApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtCaseExecChartApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtCaseExecChartApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtCaseExecTrendChartApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtCaseExecTrendChartApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtLeafDesignApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtLeafDesignApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtManualExecJobApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtManualExecJobApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtTestPointApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtTestPointApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtTestPointStatisticsApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/MtTestPointStatisticsApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/ProjectOverviewApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/ProjectOverviewApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/UIDwAtuPlanExecutionApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/UIDwAtuPlanExecutionApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/UIDwAtuScriptExecutionApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/UIDwAtuScriptExecutionApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/UIDwAtuStatisticsApiService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/api/service/UIDwAtuStatisticsApiServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/bus/AtuDataListener.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/bus/CaseDesginDataListener.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/bus/ExecJobDataListener.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/bus/HandleDataListener.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/bus/MQNotice.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/bus/RabbitMqListener.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/bus/TestPointDataListener.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/config/RabbitConfig.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/constant/DWBaseConstant.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/constant/DWConstant.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/constant/DWError.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/constant/MQConstant.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/BugDensityChartDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/BugGradeStatisticsDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/BugLegacyGradeDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/BugLifeCycleChartDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/BugOverallTendencyChartDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/BugStatusStatisticsDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/BugTemplateStatusDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/BugTendencyChartTmpDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/BugValidRepairRatioDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/CaseDesignCompleteDetailsDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/CpProjectDetailDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwAtuCaseDesignDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwAtuPlanBatchDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwAtuPlanEnvLinkDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwAtuPlanInfoDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwAtuPlanScriptLinkDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwAtuPlanTaskDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwAtuScriptInfoDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwAtuScriptVersionDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwCaseDesignInfoDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwManualExecDirDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwManualExecJobDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwReBusComponentDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/DwTestPointDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MidCaseDesignDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MidManualExecJobDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MidProjectInfoDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MidTestPointDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MidUserBugGradeDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MidValidExecJobDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MtCaseDesignChartDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MtCaseExecChartDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MtCaseExecOverallDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MtCaseExecPassRatioDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MtCaseExecTrendChartDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MtCaseNonExecDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MtLeafDesignDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MtTestChartDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/MtTestPointStatisticsDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/PointCompleteDetailsDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/ProgressChartPrepareDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/dao/SynBugInfoDao.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/BugDensityChart.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/BugGradeStatistics.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/BugLegacyGrade.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/BugLifeCycleChart.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/BugOverallTendencyChart.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/BugStatusStatistics.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/BugTemplateStatus.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/BugTendencyChartTmp.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/BugValidRepairRatio.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/CaseDesignCompleteDetails.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/CpProjectDetail.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwAtuCaseDesign.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwAtuPlanBatch.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwAtuPlanEnvLink.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwAtuPlanInfo.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwAtuPlanScriptLink.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwAtuPlanTask.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwAtuScriptInfo.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwAtuScriptVersion.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwCaseDesignInfo.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwManualExecDir.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwManualExecJob.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwReBusComponent.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/DwTestPoint.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MidCaseDesign.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MidManualExecJob.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MidProjectInfo.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MidTestPoint.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MidUserBugGrade.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MidValidExecJob.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MtCaseDesignChart.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MtCaseExecChart.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MtCaseExecOverall.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MtCaseExecPassRatio.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MtCaseExecTrendChart.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MtCaseNonExec.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MtLeafDesign.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MtTestChart.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/MtTestPointStatistics.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/PointCompleteDetails.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/ProgressChartPrepare.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/entity/SynBugInfo.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/BugDensityChartServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/BugGradeStatisticsServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/BugLegacyGradeServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/BugLifeCycleChartServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/BugOverallTendencyChartServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/BugStatusStatisticsServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/BugTemplateStatusServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/BugTendencyChartTmpServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/BugValidRepairRatioServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/CaseDesignCompleteDetailsServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/CpProjectDetailServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwAtuCaseDesignServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwAtuPlanBatchServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwAtuPlanEnvLinkServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwAtuPlanInfoServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwAtuPlanScriptLinkServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwAtuPlanTaskServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwAtuScriptInfoServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwAtuScriptVersionServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwCaseDesignInfoServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwManualExecDirServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwManualExecJobServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwReBusComponentServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/DwTestPointServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MidCaseDesignServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MidManualExecJobServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MidProjectInfoServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MidTestPointServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MidUserBugGradeServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MidValidExecJobServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MtCaseDesignChartServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MtCaseExecChartServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MtCaseExecOverallServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MtCaseExecPassRatioServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MtCaseExecTrendChartServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MtCaseNonExecServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MtLeafDesignServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MtTestChartServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/MtTestPointStatisticsServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/PointCompleteDetailsServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/ProgressChartPrepareServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/ProjectOverviewServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/SynBugInfoServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/UIDwAtuPlanExecutionServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/UIDwAtuScriptExecutionServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/impl/UIDwAtuStatisticsServiceImpl.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/BugDensityChartMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/BugGradeStatisticsMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/BugLegacyGradeMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/BugLifeCycleChartMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/BugOverallTendencyChartMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/BugStatusStatisticsMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/BugTemplateStatusMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/BugTendencyChartTmpMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/BugValidRepairRatioMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/CaseDesignCompleteDetailsMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/CpProjectDetailMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwAtuCaseDesignMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwAtuPlanBatchMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwAtuPlanEnvLinkMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwAtuPlanInfoMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwAtuPlanScriptLinkMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwAtuPlanTaskMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwAtuScriptInfoMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwAtuScriptVersionMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwCaseDesignInfoMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwManualExecDirMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwManualExecJobMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwReBusComponentMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/DwTestPointMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MidCaseDesignMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MidManualExecJobMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MidProjectInfoMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MidTestPointMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MidUserBugGradeMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MidValidExecJobMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MtCaseDesignChartMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MtCaseExecChartMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MtCaseExecOverallMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MtCaseExecPassRatioMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MtCaseExecTrendChartMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MtCaseNonExecMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MtLeafDesignMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MtTestChartMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/MtTestPointStatisticsMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/PointCompleteDetailsMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/ProgressChartPrepareMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/mapper/SynBugInfoMapper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/BugDensityChartService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/BugGradeStatisticsService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/BugLegacyGradeService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/BugLifeCycleChartService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/BugOverallTendencyChartService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/BugStatusStatisticsService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/BugTemplateStatusService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/BugTendencyChartTmpService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/BugValidRepairRatioService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/CaseDesignCompleteDetailsService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/CpProjectDetailService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwAtuCaseDesignService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwAtuPlanBatchService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwAtuPlanEnvLinkService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwAtuPlanInfoService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwAtuPlanScriptLinkService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwAtuPlanTaskService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwAtuScriptInfoService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwAtuScriptVersionService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwCaseDesignInfoService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwManualExecDirService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwManualExecJobService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwReBusComponentService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/DwTestPointService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MidCaseDesignService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MidManualExecJobService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MidProjectInfoService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MidTestPointService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MidUserBugGradeService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MidValidExecJobService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MtCaseDesignChartService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MtCaseExecChartService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MtCaseExecOverallService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MtCaseExecPassRatioService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MtCaseExecTrendChartService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MtCaseNonExecService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MtLeafDesignService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MtTestChartService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/MtTestPointStatisticsService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/PointCompleteDetailsService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/ProgressChartPrepareService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/ProjectOverviewService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/SynBugInfoService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/UIDwAtuPlanExecutionService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/UIDwAtuScriptExecutionService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/db/service/UIDwAtuStatisticsService.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/AxesDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugGradeStatisticsAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugGradeStatisticsDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugGradeStatisticsQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugGradeStatisticsUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugLegacyGradeGroupDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugLifeCycleChartAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugLifeCycleChartDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugLifeCycleChartQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugLifeCycleChartUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugOverallTendencyChartAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugOverallTendencyChartDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugOverallTendencyChartDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugOverallTendencyChartQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugOverallTendencyChartUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugStatusStatisticsAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugStatusStatisticsDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugStatusStatisticsQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugStatusStatisticsUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugTemplateStatusAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugTemplateStatusDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugTemplateStatusQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugTemplateStatusUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugTendencyChartTmpAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugTendencyChartTmpDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugTendencyChartTmpQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/BugTendencyChartTmpUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/CaseDesignPieDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ChargeInfoDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ChargeInfoQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ChartDataGeneQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ChartProgressQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/CltDictItem.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/CpProject.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/CpProjectDetailAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/CpProjectDetailQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/DwAtuPlanTaskSyncDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/DwCaseDesignInfoAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/DwCaseDesignInfoDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/DwCaseDesignInfoDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/DwCaseDesignInfoQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/DwCaseDesignInfoUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/FailPlanInfoDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/FirstExecuteInfoDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ManualExecJobPieDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MidCaseDesignDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MidManualExecJobDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MidProjectInfoAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MidTestPointDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ModifyInfoDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ModifyInfoQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseDesignChartAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseDesignChartDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseDesignChartQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseDesignChartUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseDesignInfoDw.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseExecChartAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseExecChartDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseExecChartQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseExecChartUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseExecTrendChartAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseExecTrendChartDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseExecTrendChartQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseExecTrendChartUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseNonExecAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseNonExecDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseNonExecQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtCaseNonExecUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtLeafDesignAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtLeafDesignDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtLeafDesignQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtLeafDesignUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtTestChartDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtTestPointStatisticsAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtTestPointStatisticsDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtTestPointStatisticsQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtTestPointStatisticsUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/MtTestPointSynDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/PlanQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/PlanQueryRspDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ProjectDataVo.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ProjectInfoDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ProjectOverviewDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ProjectOverviewQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ProjectScriptNumDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/SynTestRolesDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/SyncCltDictItemDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/TestPointPieDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/Tmp2PrepareDataDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/UIDwAtuPlanQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/UIDwAtuScriptInfoQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/ValidScriptDTO.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuCaseDesignAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuCaseDesignDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuCaseDesignQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuCaseDesignUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuDetailTmpDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuPlanExecutionDataDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuScriptExecutionDataDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuScriptExecutionDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuScriptInfoAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuScriptInfoDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuScriptInfoDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuScriptInfoQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuScriptInfoUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuScriptVersionAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuScriptVersionDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuScriptVersionQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwAtuScriptVersionUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwDataAndSumDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwOptionDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwReBusComponentAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwReBusComponentDetailDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwReBusComponentQueryDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/DwReBusComponentUpdateDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/MqSynchronizeTaskAddDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/dto/atu/ScriptSuccessQuery.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/enums/ProgressType.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/feign/CltTestTeamDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/feign/CpEnv.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/feign/HZBankFeignClient.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/feign/ManualTestFeignClient.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/feign/PlatformFeignClient.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/feign/ProjectsFeignClient.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/feign/ProjectsFeignForScheduleClient.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/feign/StatusRoleDto.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/feign/UserInfoRsp.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/schedule/MtManualCaseDesginProducer.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/schedule/MtManualExecJobProducer.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/schedule/MtManualTestPointProducer.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/schedule/ScheduleTask.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/utils/BeanHelper.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/utils/DataDealUtil.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/utils/DateDealUtils.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/utils/FileUtils.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/dw/utils/ListUtils.java create mode 100644 cloud-platform/cctp-dw/src/main/java/net/northking/cctp/platform/db/entity/CltDictItem.java create mode 100644 cloud-platform/cctp-dw/src/main/resources/application.bak.yml create mode 100644 cloud-platform/cctp-dw/src/main/resources/banner.txt create mode 100644 cloud-platform/cctp-dw/src/main/resources/bootstrap.yml create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/data/README.MD create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/README.MD create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/bug_density_chart.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/bug_grade_statistics.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/bug_legacy_grade.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/bug_life_cycle_chart.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/bug_overall_tendency_chart.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/bug_status_statistics.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/bug_template_status.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/bug_tendency_chart_tmp.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/bug_valid_repair_ratio.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/case_design_complete_details.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/cp_project_detail.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/dw_case_design_info.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/dw_manual_exec_dir.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/dw_manual_exec_job.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/dw_test_point.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mid_case_design.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mid_manual_exec_job.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mid_project_info.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mid_test_point.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mid_user_bug_grade.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mid_valid_exec_job.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mt_case_design_chart.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mt_case_exec_chart.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mt_case_exec_overall.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mt_case_exec_pass_ratio.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mt_case_exec_trend_chart.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mt_test_chart.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/mt_test_point_statistics.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/point_complete_details.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/progress_chart_prepare.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/schema/syn_bug_info.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/db/mysql/update.sql create mode 100644 cloud-platform/cctp-dw/src/main/resources/logback-rabbitmq.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/BugDensityChart.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/BugGradeStatistics.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/BugLegacyGrade.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/BugLifeCycleChart.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/BugOverallTendencyChart.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/BugStatusStatistics.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/BugTemplateStatus.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/BugTendencyChartTmp.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/BugValidRepairRatio.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/CaseDesignCompleteDetails.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/CpProjectDetail.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwAtuCaseDesign.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwAtuPlanBatch.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwAtuPlanEnvLink.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwAtuPlanInfo.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwAtuPlanScriptLink.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwAtuPlanTask.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwAtuScriptInfo.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwAtuScriptVersion.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwCaseDesignInfo.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwManualExecDir.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwManualExecJob.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwReBusComponent.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/DwTestPoint.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MidCaseDesign.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MidManualExecJob.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MidProjectInfo.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MidTestPoint.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MidUserBugGrade.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MidValidExecJob.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MtCaseDesignChart.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MtCaseExecChart.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MtCaseExecOverall.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MtCaseExecPassRatio.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MtCaseExecTrendChart.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MtCaseNonExec.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MtLeafDesign.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MtTestChart.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/MtTestPointStatistics.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/PointCompleteDetails.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/ProgressChartPrepare.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/base/SynBugInfo.Mapper.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/BugDensityChart.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/BugGradeStatistics.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/BugLegacyGrade.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/BugLifeCycleChart.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/BugOverallTendencyChart.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/BugStatusStatistics.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/BugTemplateStatus.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/BugTendencyChartTmp.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/BugValidRepairRatio.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/CaseDesignCompleteDetails.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/CpProjectDetail.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/DwAtuCaseDesign.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/DwAtuPlanBatch.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/DwAtuPlanEnvLink.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/DwAtuPlanInfo.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/DwAtuScriptInfo.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/DwAtuScriptVersion.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/DwCaseDesignInfo.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/DwManualExecDir.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/DwManualExecJob.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/DwReBusComponent.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/DwTestPoint.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MidCaseDesign.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MidManualExecJob.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MidProjectInfo.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MidTestPoint.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MidUserBugGrade.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MidValidExecJob.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MtCaseDesignChart.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MtCaseExecChart.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MtCaseExecOverall.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MtCaseExecPassRatio.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MtCaseExecTrendChart.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MtCaseNonExec.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MtLeafDesign.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MtTestChart.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/MtTestPointStatistics.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/PointCompleteDetails.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/ProgressChartPrepare.Dao.xml create mode 100644 cloud-platform/cctp-dw/src/main/resources/mybatis/ext/SynBugInfo.Dao.xml create mode 100644 cloud-platform/cctp-dw/testDockerfile create mode 100644 cloud-platform/cctp-platform/Dockerfile-dev create mode 100644 cloud-platform/cctp-platform/Dockerfile-prod create mode 100644 cloud-platform/cctp-platform/Dockerfile-test create mode 100644 cloud-platform/cctp-platform/Dockerfile-uat create mode 100644 cloud-platform/cctp-platform/README.MD create mode 100644 cloud-platform/cctp-platform/cctp-platform.deployment.yaml create mode 100644 cloud-platform/cctp-platform/docker-ctl.sh create mode 100644 cloud-platform/cctp-platform/pom.xml create mode 100644 cloud-platform/cctp-platform/shell/docker-build.sh create mode 100644 cloud-platform/cctp-platform/shell/docker-start.sh create mode 100644 cloud-platform/cctp-platform/shell/nk-ms.sh create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/PlatformApplication.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/comlibrary/CpComLibPubCtrl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/comlibrary/CpComponentLibraryRestfulCtrl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/comlibrary/CpComponentListQueryCtrl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/comlibrary/CpComponentListRestfulCtrl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/comlibrary/service/CpComponentLibraryApiService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/comlibrary/service/CpComponentLibraryApiServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/comlibrary/service/CpComponentListApiService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/comlibrary/service/CpComponentListApiServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/comlibrary/service/CpComponentParamterApiService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/comlibrary/service/CpComponentParamterApiServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/dict/service/CltDictCatalogApiService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/dict/service/CltDictCatalogApiServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/log/service/CpLogApiService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/log/service/CpLogApiServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/login/service/UserLoginService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/login/service/UserLoginServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/user/UserLoginFeignCtrl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/user/UserQueryCtrl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/user/service/UserApiService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/api/user/service/UserApiServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/bus/BusConstants.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/bus/feign/HzBankFeign.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/bus/notice/LogPublisher.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/bus/notice/LogRabbitMQPublisher.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/bus/receive/LogReceiver.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/bus/receive/SaasFuncResource.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/config/HzBankFeignConfig.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/config/RabbitConfig.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/config/SyncParamConfig.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/config/TaskSyncConfig.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/constants/ErrorMessage.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/constants/PlatformAppError.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/constants/PlatformConstants.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/dao/CpComponentLibraryDao.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/dao/CpComponentListDao.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/dao/CpComponentParamterDao.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/dao/CpLogContentDao.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/dao/CpLogContentDetailDao.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/dao/CpLogDao.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/entity/CltDictCatalog.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/entity/CltDictItem.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/entity/CpComponentLibrary.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/entity/CpComponentList.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/entity/CpComponentParamter.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/entity/CpLog.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/entity/CpLogContent.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/entity/CpLogContentDetail.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/impl/CltUserLoginServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/impl/CpComponentLibraryServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/impl/CpComponentListServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/impl/CpComponentParamterServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/impl/CpLogContentDetailServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/impl/CpLogContentServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/impl/CpLogServiceImpl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/mapper/CltDictCatalogMapper.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/mapper/CltDictItemMapper.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/mapper/CpComponentLibraryMapper.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/mapper/CpComponentListMapper.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/mapper/CpComponentParamterMapper.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/mapper/CpLogContentDetailMapper.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/mapper/CpLogContentMapper.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/mapper/CpLogMapper.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/service/CltUserLoginService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/service/CpComponentLibraryService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/service/CpComponentListService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/service/CpComponentParamterService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/service/CpLogContentDetailService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/service/CpLogContentService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/db/service/CpLogService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/attach/CpAttachAddDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/attach/CpAttachDetailDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/bus/DictItem.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/CpComLibListEngineDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/CpComLibraryTree.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/CpComponentLibraryAddDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/CpComponentLibraryDetailDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/CpComponentLibraryQueryDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/CpComponentLibraryUpdateDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/CpComponentListDetailDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/CpComponentListQueryDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/CpComponentParamterDetailDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/RecordComInfoByNameDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/RecordComParamDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/RecordComTreeDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/comlibrary/RecordComTreeQueryDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/dict/CltDictCatalogDetailDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/dict/CltDictItemDetailDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/init/process/State.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/log/CpLogAddDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/log/CpLogContentDetailDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/log/CpLogDetailDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/log/CpLogQueryDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/user/CltTestTeamDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/user/CltUserLoginDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/user/CltUserRoleDetailDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/user/OptionVO.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/user/TestGroupQueryDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/user/UserAuthorityQueryDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/user/UserAuthorityResultDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/user/UserInfoFeignDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/user/UserInfoForHzDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/user/UserQueryByDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/dto/user/UserQueryDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/feign/ApiTagService.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/feign/AttachmentFeignClient.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/pub/CltDictCatalogPubQueryCtrl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/pub/PubEnvCtrl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/pub/PubRoleCtrl.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/pub/dto/CpAttachPubAddDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/pub/dto/PubDto.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/util/InterfaceSqlUtils.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/util/LogEntity.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/util/MinioPathUtils.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/util/PageUtils.java create mode 100644 cloud-platform/cctp-platform/src/main/java/net/northking/cctp/platform/util/PwdEnCoder.java create mode 100644 cloud-platform/cctp-platform/src/main/resources/application.yml.bak create mode 100644 cloud-platform/cctp-platform/src/main/resources/banner.txt create mode 100644 cloud-platform/cctp-platform/src/main/resources/bootstrap.yml create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/clt_dict_catalog.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/clt_dict_item.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/clt_func.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/clt_func_resource.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/clt_resource.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/clt_role.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/clt_role_func.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/clt_user.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/clt_user_login.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/clt_user_role.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/cp_manage_template.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/cp_rule_collection.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/cp_template_data.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/cp_template_properties_data.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/data/interface.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_dict_catalog.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_dict_item.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_func.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_func_resource.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_org.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_org_manager.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_resource.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_role.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_role_func.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_sys_dict_catalog.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_sys_dict_item.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_user.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_user_login.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/clt_user_role.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_attach.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_feedback.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_knowledge_info.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_knowledge_tree.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_label.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_log.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_log_content.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_log_content_detail.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_manage_template.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_manage_template_layer.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_notice.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_notice_extend.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_notice_memo.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_rule_collection.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_rule_config.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_template.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_template_project_type.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_template_properties.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/schema/cp_workbench_resource.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/db/mysql/update/update.sql create mode 100644 cloud-platform/cctp-platform/src/main/resources/logback-rabbitmq.xml create mode 100644 cloud-platform/cctp-platform/src/main/resources/mybatis/base/CpComponentLibrary.Mapper.xml create mode 100644 cloud-platform/cctp-platform/src/main/resources/mybatis/base/CpComponentList.Mapper.xml create mode 100644 cloud-platform/cctp-platform/src/main/resources/mybatis/base/CpComponentParamter.Mapper.xml create mode 100644 cloud-platform/cctp-platform/src/main/resources/mybatis/base/CpLog.Mapper.xml create mode 100644 cloud-platform/cctp-platform/src/main/resources/mybatis/base/CpLogContent.Mapper.xml create mode 100644 cloud-platform/cctp-platform/src/main/resources/mybatis/ext/CpComponentLibrary.Dao.xml create mode 100644 cloud-platform/cctp-platform/src/main/resources/mybatis/ext/CpComponentList.Dao.xml create mode 100644 cloud-platform/cctp-platform/src/main/resources/mybatis/ext/CpComponentParamter.Dao.xml create mode 100644 cloud-platform/cctp-platform/src/main/resources/mybatis/ext/CpLog.Dao.xml create mode 100644 cloud-platform/cctp-platform/src/main/resources/mybatis/ext/CpLogContent.Dao.xml create mode 100644 cloud-platform/cctp-platform/src/main/resources/mybatis/ext/CpLogContentDetail.Dao.xml create mode 100644 cloud-platform/cctp-platform/testDockerfile create mode 100644 cloud-platform/cctp-saas/Dockerfile-dev create mode 100644 cloud-platform/cctp-saas/Dockerfile-prod create mode 100644 cloud-platform/cctp-saas/Dockerfile-test create mode 100644 cloud-platform/cctp-saas/Dockerfile-uat create mode 100644 cloud-platform/cctp-saas/cctp-saas.deployment.yaml create mode 100644 cloud-platform/cctp-saas/docker-ctl.sh create mode 100644 cloud-platform/cctp-saas/pom.xml create mode 100644 cloud-platform/cctp-saas/shell/docker-build.sh create mode 100644 cloud-platform/cctp-saas/shell/docker-start.sh create mode 100644 cloud-platform/cctp-saas/shell/nk-ms.sh create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/SaaSApplication.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/api/tenant/SaaSTenantQueryCtrl.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/api/tenant/SaaSTenantRestfulCtrl.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/api/tenant/service/SaaSTenantApiService.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/api/tenant/service/SaaSTenantApiServiceImpl.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/bus/BusConstants.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/config/SaaSConfiguration.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/constants/SaaSAppError.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/constants/SaaSConstants.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/db/dao/SaasTenantAdminDao.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/db/dao/SaasTenantDao.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/db/entity/SaasTenant.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/db/entity/SaasTenantAdmin.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/db/impl/SaasTenantAdminServiceImpl.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/db/impl/SaasTenantServiceImpl.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/db/mapper/SaasTenantAdminMapper.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/db/mapper/SaasTenantMapper.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/db/service/SaasTenantAdminService.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/db/service/SaasTenantService.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/announcement/SaasAnnouncementAddDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/announcement/SaasAnnouncementDetailDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/announcement/SaasAnnouncementQueryDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/announcement/SaasAnnouncementUpdateDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/app/SaaSAppAddDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/app/SaaSAppDetailDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/app/SaaSAppQueryDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/app/SaaSAppResourceAddDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/app/SaaSAppResourceDetailDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/app/SaaSAppResourceQueryDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/app/SaaSAppResourceUpdateDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/app/SaasAppUpdateDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSAppDataSourceAddDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSAppDataSourceBatchAddDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSAppDataSourceDetailDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSAppDataSourceQueryDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSAppDataSourceUpdateDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSDataSourceAddDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSDataSourceClusterAddDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSDataSourceClusterDetailDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSDataSourceClusterQueryDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSDataSourceClusterUpdateDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSDataSourceDetailDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSDataSourceQueryDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/datasource/SaaSDataSourceUpdateDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/menu/SaasTenantMenuAddDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/menu/SaasTenantMenuDetailDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/menu/SaasTenantMenuQueryDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/menu/SaasTenantMenuUpdateDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/tenant/SaaSTenantDetailDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/tenant/SaaSTenantQueryDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/tenant/SaaSTenantSoftwareDetailDto.java create mode 100644 cloud-platform/cctp-saas/src/main/java/net/northking/cctp/saas/dto/tenant/SaasTenantAdminDetailDto.java create mode 100644 cloud-platform/cctp-saas/src/main/resources/application.bak.yml create mode 100644 cloud-platform/cctp-saas/src/main/resources/banner.txt create mode 100644 cloud-platform/cctp-saas/src/main/resources/bootstrap.yml create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/data/saas_app.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/data/saas_app_data_source.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/data/saas_app_resource.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/data/saas_data_source.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/data/saas_data_source_cluster.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/data/saas_func_resource.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/data/saas_software.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/data/saas_software_app.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/data/saas_software_func.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/data/saas_tenant.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/data/saas_tenant_software.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_announcement.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_app.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_app_data_source.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_app_resource.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_data_source.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_data_source_cluster.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_func_resource.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_software.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_software_app.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_software_func.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_tenant.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_tenant_admin.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_tenant_menu.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_tenant_software.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/schema/saas_tenant_software_func.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/db/mysql/update/update.sql create mode 100644 cloud-platform/cctp-saas/src/main/resources/logback-rabbitmq.xml create mode 100644 cloud-platform/cctp-saas/src/main/resources/mybatis/base/SaasTenant.Mapper.xml create mode 100644 cloud-platform/cctp-saas/src/main/resources/mybatis/base/SaasTenantAdmin.Mapper.xml create mode 100644 cloud-platform/cctp-saas/src/main/resources/mybatis/ext/SaasTenant.Dao.xml create mode 100644 cloud-platform/cctp-saas/src/main/resources/mybatis/ext/SaasTenantAdmin.Dao.xml create mode 100644 cloud-platform/cctp-saas/testDockerfile create mode 100644 sql/atu-execute-plan/V3.0.2_dsy_add_atu_plan_20241112.sql create mode 100644 sqlBackend/atu-execute-plan/20240524/V2.5.0_lyb_alter_atu_plan_batch_20240513.sql create mode 100644 sqlBackend/atu-execute-plan/20240627/V2.6.0_wjd_clean_atu_plan20240612.sql create mode 100644 sqlBackend/atu-execute-plan/20240705/V2.7.0_cjf_add_atu_plan_20240705.sql create mode 100644 sqlBackend/atu-script-case/20231226/002_create_atu_input_data_set_20231225.sql create mode 100644 sqlBackend/atu-script-case/20231226/llc_create_atu_input_data_set_20231225.sql create mode 100644 sqlBackend/atu-script-case/20240307/cjf_create_atu_script_case_20240203.sql create mode 100644 sqlBackend/atu-script-case/20240627/V2.6.0_wjd_clean_atu_script_case_20240612.sql create mode 100644 sqlBackend/cctp-attachment/lyb_update_attachment_20240326.sql create mode 100644 sqlBackend/cctp-device-mgr/20240627/V2.6.0_wjd_clean_driver_mgr_20240612.sql create mode 100644 sqlBackend/cctp-mobile/20231223/001_create_cctp_mobile_20231225.sql create mode 100644 sqlBackend/cctp-mobile/20240307/cjf_create_cctp_mobile_20231225.sql create mode 100644 sqlBackend/cctp-mobile/20240627/V2.6.0_wjd_clean_cctp_mobile_20240612.sql create mode 100644 sqlBackend/cctp-platform/20240307/cjf_create_cctp_platform_20240203.sql create mode 100644 sqlBackend/cctp-platform/20240307/cjf_delete_clt_dict_item_20231229.sql create mode 100644 sqlBackend/cctp-platform/20240627/V2.6.0_wjd_clean_cctp_platform_20240612.sql create mode 100644 sqlBackend/cctp-projects/20240627/V2.6.0_wjd_clean_projects_20240612.sql create mode 100644 sqlBackend/cctp-saas/20231226/003_update_saas_software_func_20231219.sql create mode 100644 sqlBackend/cctp-saas/20240307/llc_update_saas_software_func_20231219.sql create mode 100644 sqlBackend/cctp-saas/20240627/V2.6.0_wjd_clean_saas_20240612.sql diff --git a/.version b/.version new file mode 100644 index 0000000..69f5d36 --- /dev/null +++ b/.version @@ -0,0 +1 @@ +V3.0.2 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..825ded5 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +统一自动化平台后端 \ No newline at end of file diff --git a/cctp-atu/README.md b/cctp-atu/README.md new file mode 100644 index 0000000..e69de29 diff --git a/cctp-atu/atu-data-mgr/Dockerfile-dev b/cctp-atu/atu-data-mgr/Dockerfile-dev new file mode 100644 index 0000000..c7ce143 --- /dev/null +++ b/cctp-atu/atu-data-mgr/Dockerfile-dev @@ -0,0 +1,40 @@ +# This is spring boot config server +# Version 2.1 + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER xiusong.xie@northking.net + +EXPOSE 8250 + +ENV APP_NAME=atu-data-mgr +ENV APP_VERSION=1.0.1-RELEASE + +ENV CCTP_HOME /home/cctp + +ARG SPACE +ARG URL +ARG SIZE +ARG PROFILE +ENV NACOS_SPACE=$SPACE +ENV NACOS_URL=$URL +ENV XMX=$SIZE +ENV APP_PROFILE=$PROFILE + +ENV JAR_FILE=${CCTP_HOME}/${APP_NAME}-${APP_VERSION}.ms.jar +ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' +#ENV JACOCO_AGENT_OPTS='-javaagent:/home/cctp/jacoco-0.8.7/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8040,address=0.0.0.0,append=true' + +VOLUME ${CCTP_HOME} + +ADD dist ${CCTP_HOME}/ +RUN chmod a+x ${CCTP_HOME}/nk-ms.sh + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +ENTRYPOINT ["sh", "-c", "java -jar -Xms${XMX} -Xmx${XMX} ${TRACE_JAVAAGENT_OPTS} -Dfile.encoding=UTF-8 -DAPP_PROFILE=${APP_PROFILE} -DNACOS_NAMESPACE=${NACOS_SPACE} -DNACOS_SERVER_URL=${NACOS_URL} -Dloader.path=.,lib ${JAR_FILE}"] + +#CMD [""] diff --git a/cctp-atu/atu-data-mgr/Dockerfile-prod b/cctp-atu/atu-data-mgr/Dockerfile-prod new file mode 100644 index 0000000..c7ce143 --- /dev/null +++ b/cctp-atu/atu-data-mgr/Dockerfile-prod @@ -0,0 +1,40 @@ +# This is spring boot config server +# Version 2.1 + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER xiusong.xie@northking.net + +EXPOSE 8250 + +ENV APP_NAME=atu-data-mgr +ENV APP_VERSION=1.0.1-RELEASE + +ENV CCTP_HOME /home/cctp + +ARG SPACE +ARG URL +ARG SIZE +ARG PROFILE +ENV NACOS_SPACE=$SPACE +ENV NACOS_URL=$URL +ENV XMX=$SIZE +ENV APP_PROFILE=$PROFILE + +ENV JAR_FILE=${CCTP_HOME}/${APP_NAME}-${APP_VERSION}.ms.jar +ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' +#ENV JACOCO_AGENT_OPTS='-javaagent:/home/cctp/jacoco-0.8.7/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8040,address=0.0.0.0,append=true' + +VOLUME ${CCTP_HOME} + +ADD dist ${CCTP_HOME}/ +RUN chmod a+x ${CCTP_HOME}/nk-ms.sh + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +ENTRYPOINT ["sh", "-c", "java -jar -Xms${XMX} -Xmx${XMX} ${TRACE_JAVAAGENT_OPTS} -Dfile.encoding=UTF-8 -DAPP_PROFILE=${APP_PROFILE} -DNACOS_NAMESPACE=${NACOS_SPACE} -DNACOS_SERVER_URL=${NACOS_URL} -Dloader.path=.,lib ${JAR_FILE}"] + +#CMD [""] diff --git a/cctp-atu/atu-data-mgr/Dockerfile-test b/cctp-atu/atu-data-mgr/Dockerfile-test new file mode 100644 index 0000000..c7ce143 --- /dev/null +++ b/cctp-atu/atu-data-mgr/Dockerfile-test @@ -0,0 +1,40 @@ +# This is spring boot config server +# Version 2.1 + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER xiusong.xie@northking.net + +EXPOSE 8250 + +ENV APP_NAME=atu-data-mgr +ENV APP_VERSION=1.0.1-RELEASE + +ENV CCTP_HOME /home/cctp + +ARG SPACE +ARG URL +ARG SIZE +ARG PROFILE +ENV NACOS_SPACE=$SPACE +ENV NACOS_URL=$URL +ENV XMX=$SIZE +ENV APP_PROFILE=$PROFILE + +ENV JAR_FILE=${CCTP_HOME}/${APP_NAME}-${APP_VERSION}.ms.jar +ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' +#ENV JACOCO_AGENT_OPTS='-javaagent:/home/cctp/jacoco-0.8.7/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8040,address=0.0.0.0,append=true' + +VOLUME ${CCTP_HOME} + +ADD dist ${CCTP_HOME}/ +RUN chmod a+x ${CCTP_HOME}/nk-ms.sh + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +ENTRYPOINT ["sh", "-c", "java -jar -Xms${XMX} -Xmx${XMX} ${TRACE_JAVAAGENT_OPTS} -Dfile.encoding=UTF-8 -DAPP_PROFILE=${APP_PROFILE} -DNACOS_NAMESPACE=${NACOS_SPACE} -DNACOS_SERVER_URL=${NACOS_URL} -Dloader.path=.,lib ${JAR_FILE}"] + +#CMD [""] diff --git a/cctp-atu/atu-data-mgr/Dockerfile-uat b/cctp-atu/atu-data-mgr/Dockerfile-uat new file mode 100644 index 0000000..c2f218f --- /dev/null +++ b/cctp-atu/atu-data-mgr/Dockerfile-uat @@ -0,0 +1,40 @@ +# This is spring boot config server +# Version 2.1 + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER xiusong.xie@northking.net + +EXPOSE 8250 + +ENV APP_NAME=atu-data-mgr +ENV APP_VERSION=1.0.1-RELEASE + +ENV CCTP_HOME /home/cctp + +ARG SPACE +ARG URL +ARG SIZE +ARG PROFILE +ENV NACOS_SPACE=$SPACE +ENV NACOS_URL=$URL +ENV XMX=$SIZE +ENV APP_PROFILE=$PROFILE + +ENV JAR_FILE=${CCTP_HOME}/${APP_NAME}-${APP_VERSION}.ms.jar +ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' +ENV JACOCO_AGENT_OPTS='-javaagent:/home/cctp/jacoco-0.8.7/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8040,address=0.0.0.0,append=true' + +VOLUME ${CCTP_HOME} + +ADD dist ${CCTP_HOME}/ +RUN chmod a+x ${CCTP_HOME}/nk-ms.sh + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +ENTRYPOINT ["sh", "-c", "java -jar -Xms${XMX} -Xmx${XMX} ${TRACE_JAVAAGENT_OPTS} ${JACOCO_AGENT_OPTS} -Dfile.encoding=UTF-8 -DAPP_PROFILE=${APP_PROFILE} -DNACOS_NAMESPACE=${NACOS_SPACE} -DNACOS_SERVER_URL=${NACOS_URL} -Dloader.path=.,lib ${JAR_FILE}"] + +#CMD [""] diff --git a/cctp-atu/atu-data-mgr/docker-ctl.sh b/cctp-atu/atu-data-mgr/docker-ctl.sh new file mode 100644 index 0000000..7d45d6f --- /dev/null +++ b/cctp-atu/atu-data-mgr/docker-ctl.sh @@ -0,0 +1,179 @@ +#!/bin/sh + +source /etc/profile + +## 应用名称 +APP_NAME=atu-data-mgr + +## 镜像版本 +VERSION=3.0-SNAPSHOT + +## 公司名称 +corporation=gzrdc + +NACOS_SPACE=UI-DEV +NACOS_URL=158.1.12.237:8848 +JVM=256M +PROFILE=dev + +## 镜像仓库配置 +DOCKER_REGISTRY=harbor.hzbtest:8443 + +##dockerfile 文件名配置 +FILE_NAME=Dockerfile +while getopts "a:v:d:f:n:u:s:p:" arg +do + case $arg in + a) + echo "set APP_NAME=$OPTARG" + APP_NAME=$OPTARG + ;; + v) + echo "VERSION=$OPTARG" + VERSION=$OPTARG + ;; + d) + echo "set DOCKER_REGISTRY=$OPTARG" + DOCKER_REGISTRY=$OPTARG + ;; + f) + echo "set FILE_NAME=$OPTARG" + FILE_NAME=$OPTARG + ;; + n) + echo "set NACOS_SPACE=$OPTARG" + NACOS_SPACE=$OPTARG + ;; + u) + echo "set NACOS_URL=$OPTARG" + NACOS_URL=$OPTARG + ;; + s) + echo "set JVM=$OPTARG" + JVM=$OPTARG + ;; + p) + echo "set PROFILE=$OPTARG" + PROFILE=$OPTARG + ;; + ?) + echo "unkown argument: $? $OPTARG " + exit 1 + ;; + esac +done + + +TAG_NAME=${DOCKER_REGISTRY}/${corporation}/${APP_NAME} +## deployment yaml +DEPLOYMENT_YAML=${APP_NAME}.deployment.yaml + +shift $((OPTIND-1)) + +clean_Container() { + ## 获取运行 容器ID + RUN_ID=$(docker ps |grep ${APP_NAME}|awk '{print $1}') + + ## 先停止容器 + if [ "${RUN_ID}" = "" ]; then + echo "Container ${APP_NAME} is not starting " + else + ## 停止 docker容器 + docker stop ${RUN_ID} + echo "Container ${APP_NAME} , ID: ${RUN_ID} is stopped " + fi + + ## 获取已停止 容器ID + STOP_ID=$(docker ps -a |grep ${APP_NAME}|awk '{print $1}') + ## 删除容器 + if [ "${STOP_ID}" = "" ]; then + echo "Container ${APP_NAME} is not exist" + else + ## 移除 docker容器 + docker rm -v ${STOP_ID} + echo "Remove container ${APP_NAME} , ID: ${STOP_ID} " + fi + +} + +clean_Image() { + ## 获取 镜像ID + IMG_ID=$(docker images |grep ${APP_NAME}|awk '{print $3}') + + if [ "${IMG_ID}" = "" ]; then + echo "Image ${TAG_NAME} is not exist " + else + ## 移除 docker镜像 + docker rmi ${TAG_NAME} + echo "Remove image ${TAG_NAME} , ID: ${IMG_ID} " + fi +} + + + get_agent(){ + ## 获取agent 文件 + mkdir -p target/dist/trace-otel/ + wget -P target/dist/trace-otel/ http://devops.hzbtest:38081/repository/raw-distribution/rdc/uts/core/hzb-otel-javaagent.jar + wget -P target/dist/trace-otel/ http://158.1.0.78:8081/repository/raw-distribution/rdc/uts/core/trace-otel.properties + sed -i "s?SUBSYS_ZZZ?SUBSYS_ATU_DATAM?g" target/dist/trace-otel/trace-otel.properties + ## 添加jacoco的agent + cp -r /home/northking/agent/jacoco-0.8.7 target/dist/ +} + + +for command in $* +do + echo "execute : ${command}" + + case "${command}" in + clean) + clean_Container + clean_Image + ;; + build) + $0 clean + mvn --update-snapshots clean package + get_agent + ## 创建镜像 + docker build --build-arg SIZE=${JVM} --build-arg PROFILE=${PROFILE} --build-arg SPACE=${NACOS_SPACE} --build-arg URL=${NACOS_URL} -f ${FILE_NAME} -t ${TAG_NAME} target/ + ;; + debug) + clean_Container + + docker run -itd --net=host --privileged=true --name ${APP_NAME} ${TAG_NAME} + sleep 2 + ## 输出容器日志 + RUN_ID=$(docker ps -a |grep ${APP_NAME}|awk '{print $1}') + docker logs -f -t ${RUN_ID} + ;; + push) + docker push ${TAG_NAME} + docker tag ${TAG_NAME} ${TAG_NAME}:${VERSION} + docker push ${TAG_NAME}:${VERSION} + docker rmi -f ${TAG_NAME} + docker rmi -f ${TAG_NAME}:${VERSION} + ;; + pull) + $0 clean + docker pull ${TAG_NAME} + ;; + deploy) + kubectl delete -f ${DEPLOYMENT_YAML} + sleep 2 + kubectl apply -f ${DEPLOYMENT_YAML} + sleep 2 + ;; + logs) + for pod in $(kubectl -n cctp get pod |grep ${APP_NAME}|awk '{print $1}') + do + echo "get logs by pod=${pod}" + kubectl -n cctp logs -f --tail=200 --follow=false ${pod} + done + ;; + *) + echo "Usage: $0 {clean|build|debug|push|deploy|logs}" + exit 1 + esac +done + +exit 0 diff --git a/cctp-atu/atu-data-mgr/logback-rabbitmq.xml b/cctp-atu/atu-data-mgr/logback-rabbitmq.xml new file mode 100644 index 0000000..3f35236 --- /dev/null +++ b/cctp-atu/atu-data-mgr/logback-rabbitmq.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level | %X{trace_id} | %X{span_id} | [%thread] %-5level %logger{36} : %msg%n + UTF-8 + + + + + + ${log_path}/${app_name}.log + + ${log_path}/${app_name}-%d{yyyy-MM-dd}.%i.log + 10 + 10MB + + true + + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level | %X{trace_id} | %X{span_id} | [%thread] %-5level %logger{36} : %msg%n + UTF-8 + + + + + + + + + { + "appName":"${app_name}", + "appInstance":"${app_instance_id}", + "date":"%d{yyyy-MM-dd HH:mm:ss.SSS}", + "thread":"[%thread]", + "level":"%-5level", + "logger":"%logger{36}", + "msg":"%msg" + } + + + ${rabbitmq_host} + 5672 + ${rabbitmq_username} + ${rabbitmq_password} + ${rabbitmq_vhost} + + false + direct + logs.direct + logback + true + false + UTF-8 + NON_PERSISTENT + + info + ACCEPT + DENY + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/pom.xml b/cctp-atu/atu-data-mgr/pom.xml new file mode 100644 index 0000000..68e0ec5 --- /dev/null +++ b/cctp-atu/atu-data-mgr/pom.xml @@ -0,0 +1,171 @@ + + + + net.northking.cctp + cctp-parent + 1.0.1-RELEASE + + 4.0.0 + + atu-data-mgr + jar + + + net.northking.cctp.dataPool.DataPoolApplication + 2.3.2 + 1.2.62 + 7.4.0 + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + org.apache.maven.plugins + maven-dependency-plugin + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + net.northking.cctp + cctp-maven-plugin + 0.0.141-RELEASE + + com.mysql.cj.jdbc.Driver + jdbc:mysql://192.168.77.26:3306/atu_data_mgr?useUnicode=true&characterEncoding=utf-8&useSSL=false + northking + northking@002987 + atu_data_mgr + atu_data_mgr + data_sets,data_set_tree,data_rule,data_resource_package + net.northking.cctp.dataPool + + + + mysql + mysql-connector-java + ${mysql.version} + + + + + + + + + com.github.mifmif + generex + 1.0.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + com.belerweb + pinyin4j + 2.5.1 + + + org.apache.poi + poi-ooxml-schemas + 4.1.2 + + + org.apache.commons + commons-lang3 + 3.12.0 + + + net.northking.cctp + cctp-commons + ${cctp-commons.version} + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + org.springframework.cloud + spring-cloud-config-client + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + mysql + mysql-connector-java + + + com.github.xiaoymin + swagger-bootstrap-ui + 1.9.5 + + + + + + + + com.squareup.okhttp3 + okhttp + 3.12.0 + + + com.googlecode.plist + dd-plist + 1.23 + + + com.alibaba + fastjson + + + org.apache-extras.beanshell + bsh + 2.0b6 + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/shell/nk-ms.sh b/cctp-atu/atu-data-mgr/shell/nk-ms.sh new file mode 100644 index 0000000..d62fe94 --- /dev/null +++ b/cctp-atu/atu-data-mgr/shell/nk-ms.sh @@ -0,0 +1,116 @@ +#!/bin/sh + +SERVER_IP=192.168.77.22 +SERVER_PORT=9090 + +NK_HOME_DEFAULT=/home/northking +PRODUCTION_NAME=cctp +APP_NAME=atu-data-mgr +APP_VERSION=3.0-SNAPSHOT +JAR_FILE=${APP_NAME}-${APP_VERSION}.ms.jar +APP_PORT=8911 + +JAVA_OPTIONS="-Xmx256M -Dfile.encoding=UTF-8 -Dloader.path=.,lib" +PORT_OPTIONS="--server.port=${APP_PORT}" + +if [ 0"$NK_HOME" = "0" ]; then + echo "NK_HOME unset, use default value : $NK_HOME_DEFAULT" + NK_HOME=${NK_HOME_DEFAULT} +fi + + +PID=$(ps aux | grep ${JAR_FILE} | grep -v grep | awk '{print $2}' ) + +check_if_process_is_running() { + if [ "$PID" = "" ]; then + return 1 + fi + ps -p $PID | grep "java" + return $? +} + +install_upgrade() { + upgrade_url="http://${SERVER_IP}:${SERVER_PORT}/${PRODUCTION_NAME}/${APP_VERSION}/${APP_NAME}" + rm -rf ${JAR_FILE} + wget ${upgrade_url}/${JAR_FILE} + + rm -rf install.list + wget ${upgrade_url}/install.list + + mkdir -p config + mkdir -p lib + + + cd config + rm -rf application.yml + wget ${upgrade_url}/config/application.yml + + cd ../lib + rm -rf * + for filename in `cat ../install.list` + do + echo ${filename} + wget http://${SERVER_IP}:${SERVER_PORT}/lib/${filename} + done + + cd .. +} + + + +case "$1" in + upgrade) + $0 stop + install_upgrade + ;; + status) + if check_if_process_is_running + then + echo -e "\033[32m $APP_NAME is running \033[0m" + else + echo -e "\033[32m $APP_NAME not running \033[0m" + fi + ;; + stop) + if ! check_if_process_is_running + then + echo -e "\033[32m $APP_NAME already stopped \033[0m" + exit 0 + fi + kill -9 $PID + echo -e "\033[32m $APP_NAME already stopped \033[0m" + ;; + start) + if [ "$PID" != "" ] && check_if_process_is_running + then + echo -e "\033[32m $APP_NAME already running \033[0m" + exit 1 + fi + nohup java -jar ${JAVA_OPTIONS} ${JAR_FILE} ${PORT_OPTIONS} > /dev/null 2>&1 & + echo -ne "\033[32m Starting \033[0m" + + if check_if_process_is_running + then + echo -e "\033[32m $APP_NAME fail \033[0m" + else + echo -e "\033[32m $APP_NAME started \033[0m" + fi + ;; + debug) + java -jar ${JAVA_OPTIONS} ${JAR_FILE} ${PORT_OPTIONS} + ;; + restart) + $0 stop + if [ $? = 1 ] + then + exit 1 + fi + $0 start + ;; + *) + echo "Usage: $0 {start|stop|restart|status|upgrade|debug}" + exit 1 +esac + + +exit 0 diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/DataPoolApplication.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/DataPoolApplication.java new file mode 100644 index 0000000..968a34b --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/DataPoolApplication.java @@ -0,0 +1,36 @@ +package net.northking.cctp.dataPool; + +import cn.gjing.tools.auth.config.EnableAuthorization; +import net.northking.cctp.common.config.EnableNKCloud; +import net.northking.cctp.common.config.EnableNKWebMvc; +import net.northking.cctp.common.s3.EnableS3; +import org.mybatis.spring.annotation.MapperScan; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@EnableDiscoveryClient +@MapperScan({"net.northking.cctp.dataPool.db.mapper", "net.northking.cctp.dataPool.db.dao"}) +@EnableNKCloud +@EnableNKWebMvc +@EnableS3 +@EnableAuthorization +@EnableTransactionManagement // 开启事务 +@EnableFeignClients(basePackages = {"net.northking.cctp.dataPool.feign", "net.northking.cctp.common.feign", "com.hzbank.testteam.autotest"}) +@ComponentScan(basePackages = {"net.northking.cctp.dataPool","com.hzbank.testteam.autotest"}) +public class DataPoolApplication { + private static final Logger logger = LoggerFactory.getLogger(DataPoolApplication.class); + + public static void main(String[] args) { + + logger.info("微服务启动----开始 ................."); + SpringApplication.run(DataPoolApplication.class, args); + logger.info("微服务启动----完成 ................."); + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/DataResourcePackageRestfulCtrl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/DataResourcePackageRestfulCtrl.java new file mode 100644 index 0000000..9aff01a --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/DataResourcePackageRestfulCtrl.java @@ -0,0 +1,81 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataRule; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.dataPool.api.dataRule.service.DataResourcePackageApiService; +import net.northking.cctp.dataPool.db.entity.DataResourcePackage; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageDetailDto; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageQueryDto; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageUpdateDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +/** + * 资源包 => Restful 类型 HTTP/HTTPS 接口 + * + * @author maven-cctp-plugin + * @since 1.0 + */ +@Api(tags = "资源包") +@RequestMapping("/v1") +@RestController +public class DataResourcePackageRestfulCtrl +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DataResourcePackageRestfulCtrl.class); + + @Autowired + private DataResourcePackageApiService apiService; + + @ApiOperation("上传资源包") + @PostMapping("/dataResourcePackage/uploadResource") + public ResultWrapper uploadResource(@RequestParam("file") MultipartFile file, + @RequestParam("proId") String proId,@RequestParam(name = "memo",required = false) String memo) { + ResultWrapper wrapper = new ResultWrapper<>(); + DataResourcePackage result = apiService.uploadResource(file,proId,memo); + return wrapper.success(result); + } + + @ApiOperation(value = "分页查询列表:公共资源表") + @PostMapping(value = "/paging/query/dataResourcePackages", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> pagingQuery( + @RequestBody @Validated QueryByPage queryByPage) + { + ResultWrapper> wrapper = new ResultWrapper<>(); + Pagination page = apiService.pagingQuery(queryByPage); + return wrapper.success(page); + } + + @ApiOperation("修改资源包说明") + @PostMapping("/dataResourcePackage/updateResource") + public ResultWrapper updateResource(@RequestBody @Validated DataResourcePackageUpdateDto update) throws IllegalAccessException { + ResultWrapper wrapper = new ResultWrapper<>(); + Integer result = apiService.updateByPK(update); + return wrapper.success(result); + } + + @ApiOperation("删除资源包") + @DeleteMapping("/dataResourcePackage/deleteResource") + public ResultWrapper deleteResource(@RequestParam("resourceId") String resourceId){ + ResultWrapper wrapper = new ResultWrapper<>(); + Integer result = apiService.deleteByPK(resourceId); + return wrapper.success(result); + } + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/DataRulePubCtrl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/DataRulePubCtrl.java new file mode 100644 index 0000000..0ba4a64 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/DataRulePubCtrl.java @@ -0,0 +1,45 @@ +package net.northking.cctp.dataPool.api.dataRule; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.dataPool.api.dataRule.service.DataRuleApiService; +import net.northking.cctp.dataPool.enums.DataPoolError; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; + +@RestController +@RequestMapping("/pub") +@Api(tags = "数据集管理无token请求") +public class DataRulePubCtrl { + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DataRulePubCtrl.class); + + @Autowired + private DataRuleApiService apiService; + + @ApiOperation(value = "执行计划根据规则名称取值") + @GetMapping(value = "/dataRule/getRuleDataByName") + public ResultWrapper getRuleDataByName(@RequestParam String ruleName,@RequestParam String proId) throws Exception + { + if (StringUtils.isBlank(ruleName) || StringUtils.isBlank(proId)) { + throw new PlatformRuntimeException(DataPoolError.PARAM_IS_MISSING); + } + ResultWrapper wrapper = new ResultWrapper<>(); + String decodeRuleName = URLDecoder.decode(ruleName, StandardCharsets.UTF_8.name()); + String result = apiService.getRuleDataByName(decodeRuleName,proId); + return wrapper.success(result); + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/DataRuleRestfulCtrl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/DataRuleRestfulCtrl.java new file mode 100644 index 0000000..97818f8 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/DataRuleRestfulCtrl.java @@ -0,0 +1,171 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataRule; + +import com.alibaba.fastjson.JSON; +import cn.gjing.tools.auth.annotation.RequiredPermissions; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.dataPool.dto.dataRule.*; +import net.northking.cctp.dataPool.api.dataRule.service.DataRuleApiService; +import net.northking.cctp.dataPool.dto.dataSets.AtuDataSetFeignDto; +import net.northking.cctp.dataPool.dto.dataSets.AtuScriptInputSetQuoteFieldDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 数据规则表 => Restful 类型 HTTP/HTTPS 接口 + * + * @author maven-cctp-plugin + * @since 1.0 + */ +@Api(tags = "数据规则表") +@RequestMapping("/v1/DataRules") +@RestController +public class DataRuleRestfulCtrl +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DataRuleRestfulCtrl.class); + + @Autowired + private DataRuleApiService apiService; + + /** + * Restful接口-post: 新增数据规则表 + * + * @param inputDto 接口数据传输对象 + * @return 主键 + */ + @ApiOperation(value = "新增:数据规则表") + @RequiredPermissions("ui-saveDataRules") + @PostMapping( + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper add( + @RequestBody @Validated DataRuleAddDto inputDto) + { + ResultWrapper wrapper = new ResultWrapper<>(); + String uuid = apiService.add(inputDto); + return wrapper.success(uuid); + } + + /** + * Restful接口-put: 更新数据规则表 + * + * @param inputDto 接口数据传输对象 + * @return 修改的记录数量 + */ + @ApiOperation(value = "更新:数据规则表") + @RequiredPermissions("ui-updateDataRules") + @PutMapping( + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper update( + @RequestBody @Validated DataRuleUpdateDto inputDto) throws IllegalAccessException + { + ResultWrapper wrapper = new ResultWrapper<>(); + Integer count = apiService.updateByPK(inputDto); + return wrapper.success(count); + } + + /** + * Restful接口-get: 获取数据规则表 + * + * @param uuid 主键 + * @return 接口数据传输对象 + */ + @ApiOperation(value = "获取:数据规则表") + @GetMapping( + value = "/{uuid}", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper findByPK( + @PathVariable("uuid") String uuid) + { + ResultWrapper wrapper = new ResultWrapper<>(); + DataRuleDetailDto dto = apiService.findByPK(uuid); + return wrapper.success(dto); + } + + /** + * Restful接口-delete: 删除数据规则表 + * + * @param uuid 主键 + * @return 删除的记录数量 + */ + @ApiOperation(value = "删除:数据规则表") + @RequiredPermissions("ui-deleteDataRules") + @DeleteMapping( + value = "/{uuid}", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper deleteByPK( + @PathVariable("uuid") String uuid) + { + ResultWrapper wrapper = new ResultWrapper<>(); + Integer count = apiService.deleteByPK(uuid); + return wrapper.success(count); + } + + /** + * 分页查询 数据规则表 列表 + * + * @param queryByPage 查询条件 + * @return 数据列表 + */ + @ApiOperation(value = "分页查询列表:数据规则表") + @RequiredPermissions("testData") + @PostMapping(value = "/paging/query/DataRules", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> pagingQuery( + @RequestBody @Validated QueryByPage queryByPage) + { + ResultWrapper> wrapper = new ResultWrapper<>(); + Pagination page = apiService.pagingQuery(queryByPage); + return wrapper.success(page); + } + + @ApiOperation("测试规则") + @PostMapping("/executeRule") + public ResultWrapper> executeRule(@RequestBody DataRuleExecuteDto dto){ + ResultWrapper> wrapper = new ResultWrapper<>(); + List result = apiService.executeRule(dto); + return wrapper.success(result); + } + + + @ApiOperation(value = "查询模糊数据集名称集合") + @PostMapping(value = "/query/queryFuzzyDataNameMap", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public Map queryFuzzyDataNameMap(@RequestBody AtuDataSetFeignDto setFeignDto){ + return apiService.queryFuzzyDataNameMap(setFeignDto); + } + + @ApiOperation(value = "查询模糊数据引用信息") + @PostMapping(value = "/query/queryFuzzyDataQuoteInfo") + public ResultWrapper queryFuzzyDataQuoteInfo(@RequestBody AtuScriptInputSetQuoteFieldDto atuScriptInputSetQuoteFieldDto){ + logger.debug(" start queryFuzzyDataQuoteInfo parmas => {}", JSON.toJSONString(atuScriptInputSetQuoteFieldDto)); + + ResultWrapper wrapper = new ResultWrapper<>(); + AtuScriptInputSetQuoteFieldDto result = apiService.queryFuzzyDataQuoteInfo(atuScriptInputSetQuoteFieldDto); + + logger.debug(" end queryFuzzyDataQuoteInfo result => {}", JSON.toJSONString(result)); + + return wrapper.success(result); + } + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataResourcePackageApiService.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataResourcePackageApiService.java new file mode 100644 index 0000000..82a0958 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataResourcePackageApiService.java @@ -0,0 +1,51 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataRule.service; + +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.db.excel.ExcelService; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.dataPool.db.entity.DataResourcePackage; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageDetailDto; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageQueryDto; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageUpdateDto; +import org.springframework.web.multipart.MultipartFile; + +/** + * 资源包Restful逻辑接口 + * @author maven-cctp-plugin + * @since 1.0 + */ +public interface DataResourcePackageApiService extends ExcelService +{ + /** + * 查询资源包列表 + * + * @param queryByPage 查询条件 + * @return 查询结果列表 + */ + Pagination pagingQuery(QueryByPage queryByPage); + + /** + * 更新资源包 + * + * @param dto 接口数据传输对象 + * @return 修改的记录数量 + */ + Integer updateByPK(DataResourcePackageUpdateDto dto) throws IllegalAccessException; + + /** + * 删除资源包 + * @param uuid 主键 + * @return 删除的记录数量 + */ + Integer deleteByPK(String uuid); + + /** + * 上传资源包 + * @return + */ + DataResourcePackage uploadResource(MultipartFile file,String proId,String memo); +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataResourcePackageApiServiceImpl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataResourcePackageApiServiceImpl.java new file mode 100644 index 0000000..1ddfc5f --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataResourcePackageApiServiceImpl.java @@ -0,0 +1,283 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataRule.service; + +import com.github.pagehelper.Page; +import com.github.pagehelper.page.PageMethod; +import net.northking.cctp.common.cache.EntityNameCache; +import net.northking.cctp.common.cache.EntityNameCatalog; +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.common.db.DefaultPagination; +import net.northking.cctp.common.db.OrderBy; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.db.annotation.DatabaseReadOnly; +import net.northking.cctp.common.db.excel.AbstractExcelService; +import net.northking.cctp.common.db.excel.ExcelHeader; +import net.northking.cctp.common.enums.FileBusinessTypeEnum; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.common.s3.NKFile; +import net.northking.cctp.common.s3.SimpleStorageService; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.dataPool.db.entity.DataResourcePackage; +import net.northking.cctp.dataPool.db.service.DataResourcePackageService; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageDetailDto; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageQueryDto; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageUpdateDto; +import net.northking.cctp.dataPool.enums.DataPoolError; +import net.northking.cctp.dataPool.utils.MinioPathUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Date; +import java.util.List; + +/** + * 资源包服务实现类 + * + * @author maven-cctp-plugin + * @since 1.0 + */ + +@Service +@ConditionalOnMissingBean(name = "DataResourcePackageApiServiceImpl") +public class DataResourcePackageApiServiceImpl extends AbstractExcelService implements DataResourcePackageApiService +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DataResourcePackageApiServiceImpl.class); + + @Autowired + private DataResourcePackageService dataResourcePackageService; + @Autowired + private MinioPathUtils pathUtils; + @Autowired + private SimpleStorageService simpleStorageService; + @Autowired + private EntityNameCache entityNameCache; + + @Override + public BasicService getService() + { + return this.dataResourcePackageService; + } + + @Override + public ExcelHeader[] excelHeaders() + { + ExcelHeader id = new ExcelHeader("id", "id", String.class); + ExcelHeader name = new ExcelHeader("资源包名称", "name", String.class); + ExcelHeader memo = new ExcelHeader("资源包描述", "memo", String.class); + ExcelHeader packageAddr = new ExcelHeader("资源包存放地址", "packageAddr", String.class); + ExcelHeader proId = new ExcelHeader("系统id", "proId", String.class); + ExcelHeader tenantId = new ExcelHeader("租户id", "tenantId", String.class); + ExcelHeader createdBy = new ExcelHeader("创建人", "createdBy", String.class); + ExcelHeader updatedBy = new ExcelHeader("更新人", "updatedBy", String.class); + ExcelHeader createdTime = new ExcelHeader("创建时间", "createdTime", Date.class); + ExcelHeader updatedTime = new ExcelHeader("更新时间", "updatedTime", Date.class); + return new ExcelHeader[]{}; + } + + /** + * Excel导入,入库之前的处理 + * @param records 从Excel读取到的记录 + * @return 待入库的记录 + */ + @Override + protected List beforeInsertBatch(List records) + { + for (DataResourcePackage record : records) + { + record.setId(UUIDUtil.create32UUID()); + } + return records; + } + + /** + * 写入Excel之前的处理
+ * 数据的特殊处理在此处加工处理 + * + * @param record 来自数据库记录 + * @return 待写入Excel的记录 + */ + @Override + protected DataResourcePackage beforeWriteExcel(DataResourcePackage record) + { + return record; + } + + //= Excel 导入导出相关代码 end =======================// + + //= 增删改查 相关代码 start ==================// + @Override + @DatabaseReadOnly + public Pagination pagingQuery(QueryByPage queryByPage) + { + DefaultPagination pagination = new DefaultPagination<>(); + handlePageParam(queryByPage); //处理分页、排序参数 + //租户隔离 + queryByPage.getQuery().setTenantId(NKSecurityContext.getTenantId()); + pagination.setPageSize(queryByPage.getPageSize()); + pagination.setPageNo(queryByPage.getPageNo()); + + Page page = PageMethod.startPage(queryByPage.getPageNo(), queryByPage.getPageSize()); + List result = dataResourcePackageService.getDataResourcePackages(queryByPage); + if (!CollectionUtils.isEmpty(result)) { + for (DataResourcePackageDetailDto data : result) { + data.setCreator(entityNameCache.translateById(EntityNameCatalog.MONSTER_USER,data.getCreatedBy())); + } + } + pagination.setRecords(result); + pagination.setRecordCount(page.getTotal()); + return pagination; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class) + public Integer updateByPK(DataResourcePackageUpdateDto dto) throws IllegalAccessException + { + DataResourcePackage oldData = dataResourcePackageService.findByPrimaryKey(dto.getId()); + if (oldData == null) { + throw new PlatformRuntimeException(DataPoolError.DATA_RESOURCE_PACKAGE_IS_NULL); + } + DataResourcePackage entity = new DataResourcePackage(); + BeanUtils.copyProperties(oldData, entity); + entity.setUpdatedTime(new Date()); + entity.setUpdatedBy(NKSecurityContext.getUserId()); + entity.setMemo(dto.getMemo()); + return this.dataResourcePackageService.updateByPrimaryKey(entity); + } + + + + @Override + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class) + public Integer deleteByPK(String uuid) + { + DataResourcePackage oldData = dataResourcePackageService.findByPrimaryKey(uuid); + if (oldData == null) { + throw new PlatformRuntimeException(DataPoolError.DATA_RESOURCE_PACKAGE_IS_NULL); + } + String oldPath = oldData.getPackageAddr(); + //删除数据 + DataResourcePackage entity = new DataResourcePackage(); + BeanUtils.copyProperties(oldData, entity); + int res = this.dataResourcePackageService.deleteByPrimaryKey(entity); + //删除文件 + deleteFile(oldPath); + return res; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class) + public DataResourcePackage uploadResource(MultipartFile file,String proId,String memo) { + logger.info("上传资源包,资源包名称:{},资源包大小:{}B", file.getOriginalFilename(), file.getSize()); + //1.获取前端传过来的文件 判断是否为空 + if (file.isEmpty()) { + //判断文件的大小是否为空 如果为空 给出提示信息提示 + throw new PlatformRuntimeException(DataPoolError.IMPORT_FILE_IS_NULL); + } + //读取文件名 + String fileName = file.getOriginalFilename(); + //获取文件名的后缀 并判断 + String suffix = fileName.substring(fileName.lastIndexOf(".")); + if (!suffix.endsWith(".jar")) { + throw new PlatformRuntimeException(DataPoolError.IMPORT_FILE_FORMART_IS_ERROR); + } + try { + DataResourcePackage query = new DataResourcePackage(); + query.setName(fileName); + List list = this.dataResourcePackageService.query(query); + boolean add = true; + DataResourcePackage dataResourcePackage = null; + String oldPath = ""; + if (!CollectionUtils.isEmpty(list)) { + //存在同名资源包则做覆盖 + dataResourcePackage = list.get(0); + oldPath = dataResourcePackage.getPackageAddr(); + add = false; + } else { + DataResourcePackage resource = new DataResourcePackage(); + resource.setId(UUIDUtil.create32UUID()); + resource.setName(fileName); + dataResourcePackage = resource; + } + try { + NKFile nkFile = simpleStorageService.upload(NKSecurityContext.getTenantId(), file, dataResourcePackage.getId(), FileBusinessTypeEnum.DATA_RUL_RESOURCE_PACKAGE); + String filePath = nkFile.getId(); + String fileId = MinioPathUtils.pathToId(NKSecurityContext.getTenantId(),filePath); + dataResourcePackage.setPackageAddr(fileId); + } catch (Exception e) { + throw new PlatformRuntimeException(DataPoolError.FILE_UPLOAD_ERROR); + } + + dataResourcePackage.setProId(proId); + dataResourcePackage.setMemo(memo); + dataResourcePackage.setCreatedBy(NKSecurityContext.getUserId()); + dataResourcePackage.setTenantId(NKSecurityContext.getTenantId()); + dataResourcePackage.setUpdatedBy(dataResourcePackage.getCreatedBy()); + dataResourcePackage.setCreatedTime(new Date()); + dataResourcePackage.setUpdatedTime(dataResourcePackage.getCreatedTime()); + if (add) { + this.dataResourcePackageService.insert(dataResourcePackage); + } else { + this.dataResourcePackageService.updateByPrimaryKey(dataResourcePackage); + //删除原文件 + if (StringUtils.hasText(oldPath)) { + deleteFile(oldPath); + } + } + logger.info("资源包上传完成,路径:{}",dataResourcePackage.getPackageAddr()); + return dataResourcePackage; + } catch (Exception e) { + logger.error("上传资源包失败:",e); + throw new PlatformRuntimeException(DataPoolError.DATA_RESOURCE_PACKAGE_UPLOAD_FAIL); + } + } + + + /** + * 处理分页查询参数 + * + * @param query + */ + private void handlePageParam(QueryByPage query) { + if (query.getPageNo() <= 0) { + query.setPageNo(1); + } + if (query.getPageSize() <= 0 || query.getPageSize() > 500) { + query.setPageSize(500); + } + OrderBy sort = query.toSqlOrderBy(); + if (sort != null && sort.isNotEmpty() && StringUtils.hasText(sort.toString())) { + PageMethod.orderBy(sort.toString()); + } + } + + /** + * 根据url删除服务器端文件 + * @param url + */ + private void deleteFile(String url) { + String[] pathData = pathUtils.idToPath(url); + try { + simpleStorageService.delete(pathData[0], "/" + pathData[1]); + } catch (Exception e) { + throw new PlatformRuntimeException(DataPoolError.FILE_DEL_ERROR); + } + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataRuleApiService.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataRuleApiService.java new file mode 100644 index 0000000..911fc6a --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataRuleApiService.java @@ -0,0 +1,80 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataRule.service; + +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.db.excel.ExcelService; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.dataPool.dto.dataRule.*; +import net.northking.cctp.dataPool.dto.dataSets.AtuDataSetFeignDto; +import net.northking.cctp.dataPool.dto.dataSets.AtuScriptInputSetQuoteFieldDto; + +import java.util.List; +import java.util.Map; + +/** + * 数据规则表Restful逻辑接口 + * @author maven-cctp-plugin + * @since 1.0 + */ +public interface DataRuleApiService extends ExcelService +{ + /** + * 查询数据规则表列表 + * + * @param queryByPage 查询条件 + * @return 查询结果列表 + */ + Pagination pagingQuery(QueryByPage queryByPage); + + /** + * 新增数据规则表 + * + * @param dto 接口数据传输对象 + * @return 主键 + */ + String add(DataRuleAddDto dto); + + /** + * 更新数据规则表 + * + * @param dto 接口数据传输对象 + * @return 修改的记录数量 + */ + Integer updateByPK(DataRuleUpdateDto dto) throws IllegalAccessException; + + /** + * 获取数据规则表 + * @param uuid 主键 + * @return 接口数据传输对象 + */ + DataRuleDetailDto findByPK(String uuid); + + /** + * 删除数据规则表 + * @param uuid 主键 + * @return 删除的记录数量 + */ + Integer deleteByPK(String uuid); + + /** + * 测试规则 + * @param dto + * @return + */ + List executeRule(DataRuleExecuteDto dto); + + /** + * 执行计划根据规则名称取值 + * @param ruleName + * @param proId + * @return + */ + String getRuleDataByName(String ruleName, String proId); + + Map queryFuzzyDataNameMap(AtuDataSetFeignDto setFeignDto); + + AtuScriptInputSetQuoteFieldDto queryFuzzyDataQuoteInfo(AtuScriptInputSetQuoteFieldDto atuScriptInputSetQuoteFieldDto); +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataRuleApiServiceImpl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataRuleApiServiceImpl.java new file mode 100644 index 0000000..147e8d8 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataRule/service/DataRuleApiServiceImpl.java @@ -0,0 +1,595 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataRule.service; + +import com.github.pagehelper.Page; +import com.github.pagehelper.page.PageMethod; +import com.mifmif.common.regex.Generex; +import net.northking.cctp.common.cache.EntityNameCache; +import net.northking.cctp.common.cache.EntityNameCatalog; +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.common.db.DefaultPagination; +import net.northking.cctp.common.db.OrderBy; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.db.annotation.DatabaseReadOnly; +import net.northking.cctp.common.db.excel.AbstractExcelService; +import net.northking.cctp.common.db.excel.ExcelHeader; +import net.northking.cctp.common.dto.CpLogAddDto; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.common.feign.MonsterLogServer; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.common.s3.SimpleStorageService; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.dataPool.bus.LogRabbitMQPublisher; +import net.northking.cctp.dataPool.constants.DataPoolConstant; +import net.northking.cctp.dataPool.db.entity.DataResourcePackage; +import net.northking.cctp.dataPool.db.entity.DataRule; +import net.northking.cctp.dataPool.db.service.DataResourcePackageService; +import net.northking.cctp.dataPool.db.service.DataRuleService; +import net.northking.cctp.dataPool.dto.dataRule.*; +import net.northking.cctp.dataPool.dto.dataSets.AtuDataSetFeignDto; +import net.northking.cctp.dataPool.dto.dataSets.AtuScriptInputSetQuoteFieldDto; +import net.northking.cctp.dataPool.enums.DataPoolError; +import net.northking.cctp.dataPool.feign.ScriptFeignClient; +import net.northking.cctp.dataPool.feign.dto.AtuInputDataSetResultDto; +import net.northking.cctp.dataPool.utils.MinioPathUtils; +import net.northking.cctp.dataPool.utils.MyUrlClassLoader; +import net.northking.cctp.dataPool.utils.ScriptUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.io.File; +import java.io.IOException; +import java.util.*; +import java.util.regex.Pattern; + +/** + * 数据规则表服务实现类 + * + * @author maven-cctp-plugin + * @since 1.0 + */ + +@Service +@ConditionalOnMissingBean(name = "DataRuleApiServiceImpl") +public class DataRuleApiServiceImpl extends AbstractExcelService implements DataRuleApiService +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DataRuleApiServiceImpl.class); + + @Autowired + private DataRuleService dataRuleService; + @Autowired + private DataResourcePackageService dataResourcePackageService; + @Autowired + private MinioPathUtils pathUtils; + @Autowired + private EntityNameCache entityNameCache; + @Autowired + private SimpleStorageService simpleStorageService; + @Autowired + private LogRabbitMQPublisher logPublisher; + @Autowired + private ScriptFeignClient scriptFeignClient; + + @Override + public BasicService getService() + { + return this.dataRuleService; + } + + @Override + public ExcelHeader[] excelHeaders() + { + ExcelHeader ruleId = new ExcelHeader("规则id", "ruleId", String.class); + ExcelHeader name = new ExcelHeader("规则名称", "name", String.class); + ExcelHeader type = new ExcelHeader("规则类型", "type", String.class); + ExcelHeader contentExpression = new ExcelHeader("正则表达式、脚本编码", "contentExpression", String.class); + ExcelHeader jarIds = new ExcelHeader("资源包集合", "jarIds", String.class); + ExcelHeader proId = new ExcelHeader("系统id", "proId", String.class); + ExcelHeader tenantId = new ExcelHeader("租户id", "tenantId", String.class); + ExcelHeader createdBy = new ExcelHeader("创建人", "createdBy", String.class); + ExcelHeader createdTime = new ExcelHeader("创建时间", "createdTime", Date.class); + ExcelHeader updatedBy = new ExcelHeader("更新人", "updatedBy", String.class); + ExcelHeader updatedTime = new ExcelHeader("更新时间", "updatedTime", Date.class); + return new ExcelHeader[]{}; + } + + /** + * Excel导入,入库之前的处理 + * @param records 从Excel读取到的记录 + * @return 待入库的记录 + */ + @Override + protected List beforeInsertBatch(List records) + { + return records; + } + + /** + * 写入Excel之前的处理
+ * 数据的特殊处理在此处加工处理 + * + * @param record 来自数据库记录 + * @return 待写入Excel的记录 + */ + @Override + protected DataRule beforeWriteExcel(DataRule record) + { + return record; + } + + //= Excel 导入导出相关代码 end =======================// + + //= 增删改查 相关代码 start ==================// + @Override + @DatabaseReadOnly + public Pagination pagingQuery(QueryByPage queryByPage) + { + DefaultPagination pagination = new DefaultPagination<>(); + DataRuleQueryDto queryDto = queryByPage.getQuery(); + //处理查询参数 + if (null != queryDto) { + DataRuleQueryDto dataRuleQueryDto = handleQueryParam(queryDto); + //无符合条件创建人 + if (null == dataRuleQueryDto) { + return pagination; + } + queryByPage.setQuery(dataRuleQueryDto); + } + //数据租户隔离 + queryByPage.getQuery().setTenantId(NKSecurityContext.getTenantId()); + handlePageParam(queryByPage); //处理分页、排序参数 + pagination.setPageSize(queryByPage.getPageSize()); + pagination.setPageNo(queryByPage.getPageNo()); + + Page page = PageMethod.startPage(queryByPage.getPageNo(), queryByPage.getPageSize()); + List result = dataRuleService.getDataRules(queryByPage); + if (!CollectionUtils.isEmpty(result)) { + for (DataRuleDetailDto data : result) { + data.setProjectName(entityNameCache.translateById(EntityNameCatalog.MONSTER_SYSTEM.name(),data.getProId())); + data.setCreator(entityNameCache.translateById(EntityNameCatalog.MONSTER_USER,data.getCreatedBy())); + data.setModifier(entityNameCache.translateById(EntityNameCatalog.MONSTER_USER,data.getUpdatedBy())); + } + } + pagination.setRecords(result); + pagination.setRecordCount(page.getTotal()); + return pagination; + } + + + + @Override + public String add(DataRuleAddDto dto) + { + logger.debug("规则重名校验"); + long startTime = System.currentTimeMillis(); + DataRule dataRule = new DataRule(); + dataRule.setName(dto.getName()); + dataRule.setProId(dto.getProId()); + List dataRuleList = dataRuleService.query(dataRule); + if (!CollectionUtils.isEmpty(dataRuleList)) { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_NAME_IS_EXSIT); + } + logger.debug("规则类型校验"); + String type = dto.getType(); + String contentExpression = dto.getContentExpression(); + if (!StringUtils.hasText(contentExpression)) { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_EXP_IS_NULL); + } + //校验是否为正确表达式 + if ("1".equals(type)) { + try { + Pattern.compile(contentExpression); + //特殊符号前反斜杠校验 @# + char[] chars = contentExpression.toCharArray(); + for (int i = 0; i < chars.length; i++) { + if (chars[i] == '@' || chars[i] == '#') { + if (i == 0 || chars[i-1] != '\\') { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_REXP_IS_VALID); + } + } + } + //生成随机字符串 + Generex generex = new Generex(contentExpression); + String genValue = generex.random(); + logger.debug("Rexp:{}, res: {}",contentExpression,genValue); + }catch (Exception e) { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_REXP_IS_VALID); + } + } + logger.debug("保存数据库数据"); + String uuid = UUIDUtil.create32UUID(); + DataRule entity = new DataRule(); + BeanUtils.copyProperties(dto, entity); + entity.setRuleId(uuid); + entity.setCreatedBy(NKSecurityContext.getUserId()); + entity.setCreatedTime(new Date()); + entity.setUpdatedBy(entity.getCreatedBy()); + entity.setUpdatedTime(entity.getCreatedTime()); + entity.setTenantId(NKSecurityContext.getTenantId()); + this.dataRuleService.insert(entity); + logger.debug("新增模糊数据完成,耗时: {}", System.currentTimeMillis() - startTime); + return uuid; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class) + public Integer updateByPK(DataRuleUpdateDto dto) throws IllegalAccessException + { + //规则存在校验 + DataRule oldRule = dataRuleService.findByPrimaryKey(dto.getRuleId()); + if (null == oldRule) { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_IS_NULL); + } + //规则同名校验 + if (!StringUtils.hasText(dto.getProId())) { + dto.setProId(oldRule.getProId()); + } + Integer count = dataRuleService.queryRuleByName(dto); + if (count > 0) { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_NAME_IS_EXSIT); + } + //规则类型校验 + String type = dto.getType(); + String contentExpression = dto.getContentExpression(); + if (!StringUtils.hasText(contentExpression)) { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_EXP_IS_NULL); + } + //校验是否为正确表达式 + if ("1".equals(type)) { + try { + Pattern.compile(contentExpression); + //特殊符号前反斜杠校验 @# + char[] chars = contentExpression.toCharArray(); + for (int i = 0; i < chars.length; i++) { + if (chars[i] == '@' || chars[i] == '#') { + if (i == 0 || chars[i-1] != '\\') { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_REXP_IS_VALID); + } + } + } + //生成随机字符串 + Generex generex = new Generex(contentExpression); + String genValue = generex.random(); + logger.debug("Rexp:{}, res: {}",contentExpression,genValue); + }catch (Exception e) { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_REXP_IS_VALID); + } + } + //修改数据规则 + DataRule entity = new DataRule(); + BeanUtils.copyProperties(oldRule, entity); + entity.setName(dto.getName()); + entity.setContentExpression(dto.getContentExpression()); + entity.setJarIds(dto.getJarIds()); + entity.setType(dto.getType()); + entity.setUpdatedBy(NKSecurityContext.getUserId()); + entity.setUpdatedTime(new Date()); + int res = this.dataRuleService.updateByPrimaryKey(entity); + return res; + } + + @Override + @DatabaseReadOnly + public DataRuleDetailDto findByPK(String uuid) + { + DataRule rule = dataRuleService.findByPrimaryKey(uuid); + if (null == rule) { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_IS_NULL); + } + DataRuleDetailDto dto = new DataRuleDetailDto(); + BeanUtils.copyProperties(rule, dto); + //封装资源包信息列表 + String jarIds = rule.getJarIds(); + if (StringUtils.hasText(jarIds)) { + String[] jarIdList = jarIds.split(","); + List idList = Arrays.asList(jarIdList); + List jarInfos = dataResourcePackageService.queryByIds(idList); + List jars = new ArrayList<>(); + for (DataResourcePackage jarInfo : jarInfos) { + DataResourcePackageInfoDto infoDto = new DataResourcePackageInfoDto(); + infoDto.setJarId(jarInfo.getId()); + infoDto.setName(jarInfo.getName()); + jars.add(infoDto); + } + dto.setJarInfoList(jars); + } + return dto; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class) + public Integer deleteByPK(String uuid) + { + DataRule rule = dataRuleService.findByPrimaryKey(uuid); + if (null == rule) { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_IS_NULL); + } + // 校验是否被引用 + //校验数据是否存在关联 + List list = new ArrayList<>(); + list.add(uuid); + List dtos = scriptFeignClient.selectLinkBySetId(list); + for (AtuInputDataSetResultDto dto : dtos) { + if (dto.getCountNum() > 0){ + throw new PlatformRuntimeException(DataPoolError.FUZZY_DATA_SET_HAS_LINK); + } + } + //删除数据规则 + int num = dataRuleService.deleteByPrimaryKey(uuid); + //记录平台日志 + CpLogAddDto cpLogAddDto = new CpLogAddDto(); + String projectName = entityNameCache.translateById(EntityNameCatalog.MONSTER_SYSTEM.name(), rule.getProId()); + cpLogAddDto.setContent("【" + DataPoolConstant.CPLOGADDDTO_CONTENT_DELETE+"模糊测试数据】系统:" + projectName + ",规则名称:" + rule.getName()); + cpLogAddDto.setModule(DataPoolConstant.CPLOGADDDTO_DATA_POOL_MANAGEMENT); + cpLogAddDto.setType(DataPoolConstant.CPLOGADDDTO_LOG_TYPE_DELETE); + MonsterLogServer.sendLogToMonster(cpLogAddDto); + logPublisher.deployLogContent(cpLogAddDto); + return num; + } + + @Override + public List executeRule(DataRuleExecuteDto dto) { + List res = new ArrayList<>(); + //规则类型校验 + String type = dto.getType(); + String contentExpression = dto.getContentExpression(); + MyUrlClassLoader loader = null; + if (!StringUtils.hasText(contentExpression)) { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_EXP_IS_NULL); + } + //正则表达式类型 + if ("1".equals(type)) { + //校验是否为正确表达式 + try { + Pattern.compile(contentExpression); + //特殊符号前反斜杠校验 @# + char[] chars = contentExpression.toCharArray(); + for (int i = 0; i < chars.length; i++) { + if (chars[i] == '@' || chars[i] == '#') { + if (i == 0 || chars[i-1] != '\\') { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_REXP_IS_VALID); + } + } + } + //表达式含Unicode需解码 + String exp = decodeExpression(chars); + Pattern.compile(exp); + //生成随机字符串 + Generex generex = new Generex(exp); + String genValue = generex.random(); + logger.debug("Rexp:{}, exp:{}, res: {}",contentExpression,exp,genValue); + res.add(genValue); + }catch (Exception e) { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_REXP_IS_VALID); + } + }else if ("0".equals(type)) { + //beanshell脚本类型 + String jarIds = dto.getJarIds(); + loader = new MyUrlClassLoader(); + if (StringUtils.hasText(jarIds)) { + //有jar包依赖 + String[] jars = jarIds.split(","); + //查询jar包路径 + for (String jar : jars) { + //跳过空串 + if (!StringUtils.hasText(jar)) { + continue; + } + //根据jar包id获取路径(同一jar包被删除后重新上传jar包id会改变) + DataResourcePackage resourcePackage = dataResourcePackageService.findByPrimaryKey(jar); + //下载jar包,并进行加载 + try { + if (Objects.nonNull(resourcePackage)) {//资源包记录存在 + if (StringUtils.hasText(resourcePackage.getPackageAddr())) { + //路径存在 + String path = resourcePackage.getPackageAddr(); + String[] result = pathUtils.idToPath(path); + File file = simpleStorageService.downloadAsFile(result[0], "/" + result[1]); + loader.addURLFile(file); + } + } + } catch (Exception e) { + logger.error("资源包加载异常", e); + throw new PlatformRuntimeException(DataPoolError.DATA_RESOURCE_PACKAGE_LOAD_FAIL); + } + } + } + try { + //执行脚本1次 + res = ScriptUtil.executesBeanShell(contentExpression,1); + if (res.contains(null)) { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_EXECUTE_RESULT_IS_NULL); + } + } catch (Exception e) { + logger.error("脚本执行异常", e); + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_EXECUTE_RESULT_IS_EXCEPTION); + }finally { + if (loader != null){ + //删除文件夹下文件 + loader.unloadJarFiles(); + try { + loader.close(); + } catch (IOException e) { + logger.error("",e); + } + } + } + }else { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_NOT_SUPPORT_TYPE); + } + return res; + } + + /** + * 将Unicode字符串解码成普通字符 + * @param chars + * @return + */ + private String decodeExpression(char[] chars) { + //存储解码后的字符串 + StringBuilder tempSb = new StringBuilder(); + for (int i = 0; i < chars.length; i++) { + //查找unicode前缀 + if (chars[i] == '\\' && i != chars.length-1 && chars[i+1] == 'u') { + StringBuilder hexSb = new StringBuilder(); //unicode中十六进制部分 + StringBuilder zeroSb = new StringBuilder(); //unicode中左位补零部分 + StringBuilder otherSb = new StringBuilder(); //不满足unicode十六进制部分 + //从第二位开始,跳过前缀直接处理十六进制(后四位) + for (int j = 2; j <= 5; j++) { + char tmpChar = chars[i + j]; + //判断当前符号是否满足十六进制条件 0-9a-f + if (checkHex(tmpChar)) { + hexSb.append(tmpChar); + }else { + //后四位中不满足条件,则左位补零凑齐四位,同时记录后续不满足字符 + zeroSb.append("0"); + otherSb.append(tmpChar); + } + } + //补零位加上十六进制位凑齐四位完整unicode码 + zeroSb.append(hexSb); + //十六进制转换成字符 + char ch = (char) Integer.parseInt(zeroSb.toString(),16); + tempSb.append(ch); + tempSb.append(otherSb); + //直接从转换后的字符开始处理 + i = i+5; + continue; + } + //非unicode编码部分则直接记录 + tempSb.append(chars[i]); + } + return tempSb.toString(); + } + + /** + * 判断当前符号是否满足十六进制条件 0-9a-fA-F + * @param c + * @return + */ + private boolean checkHex(char c) { + boolean res = false; + if ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') || (c >= '0' && c <= '9')) { + res = true; + } + return res; + } + + @Override + public String getRuleDataByName(String ruleName, String proId) { + DataRule dataRule = new DataRule(); + dataRule.setName(ruleName); + dataRule.setProId(proId); + List dataRules = dataRuleService.query(dataRule); + if (!CollectionUtils.isEmpty(dataRules)) { + DataRule tempRule = dataRules.get(0); + if (null != tempRule) { + DataRuleExecuteDto execRule = new DataRuleExecuteDto(); + BeanUtils.copyProperties(tempRule,execRule); + try { + List resultList = executeRule(execRule); + if (!CollectionUtils.isEmpty(resultList)) { + return resultList.get(0); + }else { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_EXECUTE_RESULT_IS_NULL); + } + }catch (PlatformRuntimeException e) { + throw e; + } + } + }else { + throw new PlatformRuntimeException(DataPoolError.DATA_RULE_IS_NULL); + } + return null; + } + + @Override + public Map queryFuzzyDataNameMap(AtuDataSetFeignDto setFeignDto) { + Map dataRuleNameMap = new HashMap<>(); + Set dataSetList = setFeignDto.getDataSetList(); + if (dataSetList == null || dataSetList.size() <= 0){ + logger.debug("查询的id集合为空"); + return dataRuleNameMap; + } + List dataRuleList = dataRuleService.queryByIdSet(dataSetList); + if (dataRuleList == null || dataRuleList.size() <= 0){ + logger.debug("查询的数据规则为空"); + return dataRuleNameMap; + } + for (DataRule dataRule : dataRuleList) { + dataRuleNameMap.put(dataRule.getRuleId(), dataRule.getName()); + } + return dataRuleNameMap; + } + + @Override + public AtuScriptInputSetQuoteFieldDto queryFuzzyDataQuoteInfo(AtuScriptInputSetQuoteFieldDto atuScriptInputSetQuoteFieldDto) { + AtuScriptInputSetQuoteFieldDto quoteFieldDto = new AtuScriptInputSetQuoteFieldDto(); + if (atuScriptInputSetQuoteFieldDto.getSetId() == null){ + throw new PlatformRuntimeException(DataPoolError.PARAM_IS_MISSING); + } + DataRule dataRule = dataRuleService.findByPrimaryKey(atuScriptInputSetQuoteFieldDto.getSetId()); + if (dataRule == null){ + throw new PlatformRuntimeException(DataPoolError.SETS_NO_EXISTS); + } + quoteFieldDto.setFullName(dataRule.getName()); + quoteFieldDto.setName(dataRule.getName()); + quoteFieldDto.setPath(dataRule.getName()); + quoteFieldDto.setType(DataPoolConstant.INPUT_SET_QUOTE_TYPE_FUZZY); + quoteFieldDto.setValue(DataPoolConstant.FUZZY_DATA_QUOTE_PREFIX + dataRule.getName() + DataPoolConstant.FUZZY_DATA_QUOTE_SUFFIX); + return quoteFieldDto; + } + + /** + * 处理分页查询参数 + * + * @param query + */ + private void handlePageParam(QueryByPage query) { + if (query.getPageNo() <= 0) { + query.setPageNo(1); + } + if (query.getPageSize() <= 0 || query.getPageSize() > 500) { + query.setPageSize(500); + } + OrderBy sort = query.toSqlOrderBy(); + if (sort != null && sort.isNotEmpty() && StringUtils.hasText(sort.toString())) { + PageMethod.orderBy(sort.toString()); + } + } + + /** + * 处理查询参数 + * + * @param query + * @return + */ + private DataRuleQueryDto handleQueryParam(DataRuleQueryDto query) { + DataRuleQueryDto res = new DataRuleQueryDto(); + BeanUtils.copyProperties(query, res); + //创建人查询参数修改 + String creatorName = query.getCreator(); + if (StringUtils.hasText(creatorName)) { + List creatorIds = new ArrayList<>(); + creatorIds.add(creatorName); + res.setCreatorIds(creatorIds); + } + return res; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetEnvRelCtrl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetEnvRelCtrl.java new file mode 100644 index 0000000..007d398 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetEnvRelCtrl.java @@ -0,0 +1,134 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataSets; + +import cn.gjing.tools.auth.annotation.RequiredPermissions; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.dataPool.api.dataSets.service.DataSetEnvRelApiService; +import net.northking.cctp.dataPool.dto.dataSets.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +@Api(tags = "数据集环境关联表") +@RequestMapping("/v1") +@RestController +public class DataSetEnvRelCtrl +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DataSetEnvRelCtrl.class); + + @Autowired + private DataSetEnvRelApiService apiService; + + /** + * 导出单环境下的数据集数据 + * @param dataSetEnvRelQueryDto + * @param response + */ + @ApiOperation(value = "导出Excel:数据集环境关联表") + @RequiredPermissions("ui-exportDataSetEnvRels") + @PostMapping(value = "/excel/export/DataSetEnvRels", + produces = MediaType.APPLICATION_OCTET_STREAM_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public void exportExcel( + @RequestBody @Validated DataSetEnvRelQueryDto dataSetEnvRelQueryDto, + HttpServletResponse response) + { + apiService.exportExcel(response, dataSetEnvRelQueryDto); + } + + /** + * 单环境数据导入 + * @param file + * @param dataSetId + * @param envId + * @return + */ + @ApiOperation(value = "导入Excel:单环境数据导入") + @PostMapping(value = "/excel/import/DataSetEnvRels", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public ResultWrapper importExcel( + @RequestParam("file") MultipartFile file,@RequestParam("dataSetId") String dataSetId,@RequestParam("envId") String envId,@RequestParam("tableHeaders") String tableHeaders) + { + long startTime = System.currentTimeMillis(); + ResultWrapper resultWrapper = new ResultWrapper<>(); + DataSetsSaveDto result = apiService.importExcel(file, dataSetId, envId, tableHeaders); + long endTime = System.currentTimeMillis(); + logger.info("单环境数据导入静态数据集耗时:"+(endTime - startTime)); + return resultWrapper.success(result); + } + + + /** + * 获取数据集环境关联表数据列表查询 + * + * @param queryDto 查询条件对象 + * @return DataSetsDetailDto + */ + @ApiOperation(value = "获取:数据集环境关联表") + @PostMapping( + value = "/query/list", + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> queryList( + @RequestBody DataSetEnvRelQueryDto queryDto) + { + ResultWrapper> wrapper = new ResultWrapper<>(); + List dto = apiService.queryList(queryDto); + return wrapper.success(dto); + } + + /** + * 数据集内多环境数据同时保存 + * + * @param addDto 新增数据对象信息 + * @return + */ + @ApiOperation(value = "保持:数据集内多环境数据同时保存") + @RequiredPermissions("ui-saveDataSetBatch") + @PostMapping( + value = "/save/batch", + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> saveBatch( + @RequestBody DataSetEnvRelAddDto addDto) + { + return apiService.saveBatch(addDto); + } + + @ApiOperation(value = "查询Interface") + @PostMapping(value = "/query/selectDataUrlAndTreeNameInterface", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper selectDataUrlAndTreeNameInterface(@RequestBody AtuScriptInputSetQuoteFieldDto atuScriptInputSetQuoteFieldDto){ + ResultWrapper wrapper = new ResultWrapper<>(); + return wrapper.success(apiService.selectDataUrlAndTreeName(atuScriptInputSetQuoteFieldDto)); + } + + @ApiOperation(value = "查询静态数据集对应的文件") + @PostMapping(value = "/query/getDataSetFile", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public Map queryDataSetFile(@RequestBody AtuDataSetFeignDto dto){ + return apiService.getDataSetFile(dto); + } + +} + + diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetTreeRestfulCtrl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetTreeRestfulCtrl.java new file mode 100644 index 0000000..e222d71 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetTreeRestfulCtrl.java @@ -0,0 +1,143 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataSets; + +import cn.gjing.tools.auth.annotation.RequiredPermissions; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.dataPool.api.dataSets.service.DataSetTreeApiService; +import net.northking.cctp.dataPool.dto.dataSets.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 数据集树目录表 => Restful 类型 HTTP/HTTPS 接口 + * + * @author maven-cctp-plugin + * @since 1.0 + */ +@Api(tags = "数据集树目录管理") +@RequestMapping("/v1/dataSetTree") +@RestController +public class DataSetTreeRestfulCtrl +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DataSetTreeRestfulCtrl.class); + + @Autowired + private DataSetTreeApiService apiService; + + /** + * Restful接口-post: 新增数据集树目录表 + * + * @param inputDto 接口数据传输对象 + * @return 主键 + */ + @ApiOperation(value = "新增:数据集树目录表") + @RequiredPermissions("ui-saveDataSetTree") + @PostMapping( + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper add( + @RequestBody @Validated DataSetTreeAddDto inputDto) + { + ResultWrapper wrapper = new ResultWrapper<>(); + String uuid = apiService.add(inputDto); + return wrapper.success(uuid); + } + + /** + * Restful接口-put: 更新数据集树目录表 + * + * @param inputDto 接口数据传输对象 + * @return 修改的记录数量 + */ + @ApiOperation(value = "更新:数据集树目录表") + @RequiredPermissions("ui-updateDataSetTree") + @PutMapping( + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper update( + @RequestBody @Validated DataSetTreeUpdateDto inputDto) throws IllegalAccessException + { + ResultWrapper wrapper = new ResultWrapper<>(); + Integer count = apiService.updateByPK(inputDto); + return wrapper.success(count); + } + + /** + * Restful接口-delete: 删除数据集树目录表 + * + * @param uuid 主键 + * @return 删除的记录数量 + */ + @ApiOperation(value = "删除:数据集树目录表") + @RequiredPermissions("ui-deleteDataSetTree") + @DeleteMapping( + value = "/{uuid}", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper delete( + @PathVariable("uuid") String uuid) + { + ResultWrapper wrapper = new ResultWrapper<>(); + Integer count = apiService.deleteByPK(uuid); + return wrapper.success(count); + } + + @ApiOperation(value = "根据层级查询数据集目录节点") + @PostMapping( + value = "/queryDataSetTreeByParentId", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> queryDataSetTreeByParentId( + @RequestBody @Validated DataSetTreeQueryDto dto) + { + logger.debug("start queryDataSetTreeByParentId, param:{}", JSONObject.toJSONString(dto)); + ResultWrapper> wrapper = new ResultWrapper<>(); + List res = apiService.queryDataSetTreeByParentId(dto); + logger.debug("end queryDataSetTreeByParentId"); + return wrapper.success(res); + } + + @ApiOperation(value = "根据名字模糊查询数据集目录节点") + @PostMapping( + value = "/queryDataSetTreeByName", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> queryDataSetTreeByName( + @RequestBody @Validated DataSetTreeQueryDto dto) + { + logger.debug("start queryDataSetTreeByName, param:{}", JSONObject.toJSONString(dto)); + ResultWrapper> wrapper = new ResultWrapper<>(); + List res = apiService.queryDataSetTreeByName(dto); + logger.debug("end queryDataSetTreeByName"); + return wrapper.success(res); + } + + @ApiOperation(value = "拖拽树目录") + @PostMapping( + value = "/moveDataSetTree", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper moveDataSetTree( + @RequestBody @Validated DataSetTreeMoveDto dto) + { + logger.debug("start moveDataSetTree, param:{}", JSONObject.toJSONString(dto)); + ResultWrapper wrapper = new ResultWrapper<>(); + Integer num = apiService.moveDataSetTree(dto); + logger.debug("end moveDataSetTree"); + return wrapper.success(num); + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetsPubCtrl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetsPubCtrl.java new file mode 100644 index 0000000..f2d8a22 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetsPubCtrl.java @@ -0,0 +1,29 @@ +package net.northking.cctp.dataPool.api.dataSets; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.dataPool.api.dataSets.service.DataSetEnvRelApiService; +import net.northking.cctp.dataPool.dto.dataSets.AtuScriptInputSetQuoteFieldDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/pub") +@Api(tags = "数据集管理无token请求") +public class DataSetsPubCtrl { + + @Autowired + private DataSetEnvRelApiService setEnvRelApiService; + + @ApiOperation(value = "查询单元格的引用(pub)") + @PostMapping(value = "/query/selectDataUrlAndTreeName", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public AtuScriptInputSetQuoteFieldDto selectDataUrlAndTreeName(@RequestBody AtuScriptInputSetQuoteFieldDto atuScriptInputSetQuoteFieldDto){ + return setEnvRelApiService.selectDataUrlAndTreeName(atuScriptInputSetQuoteFieldDto); + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetsRestfulCtrl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetsRestfulCtrl.java new file mode 100644 index 0000000..3537f2b --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/DataSetsRestfulCtrl.java @@ -0,0 +1,219 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataSets; + +import cn.gjing.tools.auth.annotation.RequiredPermissions; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.dataPool.api.dataSets.service.DataSetsApiService; +import net.northking.cctp.dataPool.dto.dataSets.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; + +/** + * 数据集 => Restful 类型 HTTP/HTTPS 接口 + * + * @author maven-cctp-plugin + * @since 1.0 + */ +@Api(tags = "数据集管理") +@RequestMapping("/v1/dataSets") +@RestController +public class DataSetsRestfulCtrl +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DataSetsRestfulCtrl.class); + + @Autowired + private DataSetsApiService apiService; + + @ApiOperation(value = "数据库配置保存数据集") + @PostMapping(value = "/createDataSet", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper createDataSet( + @RequestBody @Validated DataSetsAddDto inputDto) + { + ResultWrapper wrapper = new ResultWrapper<>(); + String uuid = apiService.createDataSet(inputDto); + return wrapper.success(uuid); + } + + /** + * Restful接口-post: 新增数据集 + * + * @param inputDto 接口数据传输对象 + * @return 主键 + */ + @ApiOperation(value = "新增:数据集") + @RequiredPermissions("ui-saveDataSets") + @PostMapping( + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper add( + @RequestBody @Validated DataSetsAddDto inputDto) + { + ResultWrapper wrapper = new ResultWrapper<>(); + String uuid = apiService.add(inputDto); + return wrapper.success(uuid); + } + + /** + * Restful接口-put: 更新数据集 + * + * @param inputDto 接口数据传输对象 + * @return 修改的记录数量 + */ + @ApiOperation(value = "更新:数据集") + @RequiredPermissions("ui-updateDataSets") + @PutMapping( + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper update( + @RequestBody @Validated DataSetsUpdateDto inputDto) throws IllegalAccessException + { + ResultWrapper wrapper = new ResultWrapper<>(); + Integer count = apiService.updateByPK(inputDto); + return wrapper.success(count); + } + + /** + * Restful接口-get: 获取数据集 + * + * @param uuid 主键 + * @return 接口数据传输对象 + */ + @ApiOperation(value = "获取:数据集详情") + @GetMapping( + value = "getDataSetDetail/{uuid}", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper getDataSetDetail( + @PathVariable("uuid") String uuid) + { + ResultWrapper wrapper = new ResultWrapper<>(); + DataSetsDetailDto dto = apiService.findByPK(uuid); + return wrapper.success(dto); + } + + /** + * Restful接口-delete: 删除数据集 + * + * @param uuid 主键 + * @return 删除的记录数量 + */ + @ApiOperation(value = "删除:数据集") + @RequiredPermissions("ui-deleteDataSet") + @DeleteMapping( + value = "/{uuid}", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper delete( + @PathVariable("uuid") String uuid) + { + ResultWrapper wrapper = new ResultWrapper<>(); + Integer count = apiService.deleteByPK(uuid); + return wrapper.success(count); + } + + /** + * Restful接口-post: 批量删除数据集 + * + * @param dto + * @return 成功的数量 + */ + @ApiOperation(value = "批量删除:数据集") + @RequiredPermissions("ui-deleteDataSetList") + @PostMapping( + value = "/deleteDataSets", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper deleteBatch( + @RequestBody @Validated DataSetsDeleteDto dto) + { + ResultWrapper wrapper = new ResultWrapper<>(); + Integer count = this.apiService.deleteBatch(dto); + return wrapper.success(count); + } + + /** + * 分页查询 数据集 列表 + * + * @param queryByPage 查询条件 + * @return 数据列表 + */ + @ApiOperation(value = "分页查询列表:数据集") + @RequiredPermissions("staticData") + @PostMapping(value = "/paging/query/DataSets", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> pagingQuery( + @RequestBody @Validated QueryByPage queryByPage) + { + ResultWrapper> wrapper = new ResultWrapper<>(); + Pagination page = apiService.pagingQuery(queryByPage); + return wrapper.success(page); + } + + @ApiOperation(value = "保存数据集数据") + @PostMapping(value = "/save", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper save(@RequestBody @Validated DataSetsSaveDto dto) + { + ResultWrapper wrapper = new ResultWrapper<>(); + Boolean count = this.apiService.save(dto); + return wrapper.success(count); + } + + @ApiOperation(value = "新增列校验数据集表头") + @PostMapping(value = "/checkTableHeader", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper checkTableHeader(@RequestBody @Validated ColumnCheckDto dto) + { + ResultWrapper wrapper = new ResultWrapper<>(); + Boolean count = this.apiService.checkTableHeader(dto); + return wrapper.success(count); + } + + @ApiOperation(value = "导出Excel:数据集") + @GetMapping(value = "/export/{dataSetId}", + produces = MediaType.APPLICATION_OCTET_STREAM_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public void export(@PathVariable("dataSetId") String dataSetId, HttpServletResponse response) + { + // 定义导出的Excel在客户端浏览器上提示下载的文件名,不写后缀 + logger.debug("start exportDataSet"); + String fileName = "数据集"; + apiService.exportDataSet(response, dataSetId, fileName); + logger.debug("end exportDataSet"); + } + + + + @ApiOperation(value = "下载Excel模板:数据集") + @PostMapping(value = "/downloadTemplate", + produces = MediaType.APPLICATION_OCTET_STREAM_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public void downloadTemplate(@RequestBody DataSetsSaveDto dto, + HttpServletResponse response) + { + logger.debug("start downloadTemplate"); + String fileName = "数据集模版"; + apiService.downloadTemplate(response, fileName, dto); + logger.debug("end downloadTemplate"); + } + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetEnvRelApiService.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetEnvRelApiService.java new file mode 100644 index 0000000..ef2ef4d --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetEnvRelApiService.java @@ -0,0 +1,34 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataSets.service; + +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.dataPool.dto.dataSets.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 数据集环境关联表Restful逻辑接口 + * @author maven-cctp-plugin + * @since 1.0 + */ +public interface DataSetEnvRelApiService +{ + + List queryList(DataSetEnvRelQueryDto queryDto); + + ResultWrapper> saveBatch(DataSetEnvRelAddDto addDto); + + DataSetsSaveDto importExcel(MultipartFile file, String dataSetId, String envId,String tableHeaders); + + void exportExcel(HttpServletResponse response, DataSetEnvRelQueryDto dataSetEnvRelQueryDto); + + AtuScriptInputSetQuoteFieldDto selectDataUrlAndTreeName(AtuScriptInputSetQuoteFieldDto atuScriptInputSetQuoteFieldDto); + + Map getDataSetFile(AtuDataSetFeignDto dto); +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetEnvRelApiServiceImpl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetEnvRelApiServiceImpl.java new file mode 100644 index 0000000..040a882 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetEnvRelApiServiceImpl.java @@ -0,0 +1,739 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataSets.service; + +import com.alibaba.fastjson.JSONObject; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.entity.Environment; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.exception.InvalidException; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import net.northking.cctp.common.db.SqlOrderBy; +import net.northking.cctp.common.enums.FileBusinessTypeEnum; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.common.feign.ApiAtsEnviromentFeign; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.common.s3.FileDownloadException; +import net.northking.cctp.common.s3.FileUploadException; +import net.northking.cctp.common.s3.NKFile; +import net.northking.cctp.common.s3.SimpleStorageService; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.dataPool.constants.DataPoolConstant; +import net.northking.cctp.dataPool.db.entity.DataSetEnvRel; +import net.northking.cctp.dataPool.db.service.DataSetEnvRelService; +import net.northking.cctp.dataPool.dto.dataSets.*; +import net.northking.cctp.dataPool.enums.DataPoolError; +import net.northking.cctp.dataPool.feign.AttachmentFeignClient; +import net.northking.cctp.dataPool.feign.ProjectFeignClient; +import net.northking.cctp.dataPool.utils.EnvNameUtils; +import net.northking.cctp.dataPool.utils.MinioPathUtils; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.xssf.usermodel.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 数据集环境关联表服务实现类 + * + * @author maven-cctp-plugin + * @since 1.0 + */ + +@Service +@ConditionalOnMissingBean(name = "DataSetEnvRelApiServiceImpl") +public class DataSetEnvRelApiServiceImpl implements DataSetEnvRelApiService +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DataSetEnvRelApiServiceImpl.class); + + @Autowired + private DataSetEnvRelService dataSetEnvRelService; + @Autowired + private ProjectFeignClient projectFeignClient; + @Autowired + private MinioPathUtils pathUtils; + @Autowired + private SimpleStorageService simpleStorageService; + @Autowired + private EnvNameUtils envNameUtils; + + @Autowired + private ApiAtsEnviromentFeign apiAtsEnviromentFeign; + @Autowired + private AttachmentFeignClient attachmentFeignClient; + + + @Override + @Transactional(rollbackFor = Exception.class) + public List queryList(DataSetEnvRelQueryDto queryDto) { + //返回结果集 + List dataSetsSaveDtos=new ArrayList<>(); + //根据数据集id查关联表 1 + DataSetEnvRel dataSetEnvRel=new DataSetEnvRel(); + dataSetEnvRel.setDataSetId(queryDto.getDataSetId()); + SqlOrderBy sqlOrderBy=new SqlOrderBy(); + sqlOrderBy.asc("env_id"); + List query = dataSetEnvRelService.query(dataSetEnvRel,sqlOrderBy); + //跟据系统id查关联环境 调project的feign 2 + //去project服务写feign + Long projectId = null; + try { + projectId = Long.valueOf(queryDto.getProId()); + } catch (NumberFormatException e) { + logger.error("系统Id类型转换异常"); + throw new InvalidException("系统Id类型转换异常"); + } + ResponseVO> listResponseVO = apiAtsEnviromentFeign.listByProject(projectId); + List environmentList = listResponseVO.getData(); + Map environmentMap = environmentList.stream().collect(Collectors.toMap(e -> e.getId().toString(), e -> e)); + List envIds = environmentList.stream().map(e -> e.getId().toString()).collect(Collectors.toList()); + if (environmentList.size()==0){ + //删除当前数据集全部环境关联记录 + if (query.size()!=0){ + List ids = query.stream().map(DataSetEnvRel::getId).collect(Collectors.toList()); + dataSetEnvRelService.deleteByPrimaryKeys(ids); + //是否删除文件服务器上的数据 + } + return dataSetsSaveDtos; + } + if (query.size()!=0) { + List delDsIds = new ArrayList<>(); + List noDelDs = new ArrayList<>(); + //比较1和2 + for (DataSetEnvRel d : query) { + if (!envIds.contains(d.getEnvId())) { + delDsIds.add(d.getId()); + } else { + noDelDs.add(d); + } + } + // 如果1中存在2不存的环境的话删除1中相关信息 + if (delDsIds.size() != 0) { + dataSetEnvRelService.deleteByPrimaryKeys(delDsIds); + //是否删除对应的文件服务器中的json文件 + } + // 筛选出2中存在1中不存在 + List addEnvIds = new ArrayList<>(); + if (noDelDs.size() != 0) { + List noDelEnvIds = noDelDs.stream().map(DataSetEnvRel::getEnvId).collect(Collectors.toList()); + for (String envId : envIds) { + if (!noDelEnvIds.contains(envId)) { + addEnvIds.add(envId); + } + } + if (addEnvIds.size() != 0) {//如果2中存在1中不存在的环境给1的file_addr加上赋值为与其他记录相同的头信息 + DataSetEnvRel dataSetEnvRelAdd = null; + Integer seq = noDelDs.get(noDelDs.size() - 1).getSeq(); + String fileAddr = noDelDs.get(0).getFileAddr(); + String fileAddrAdd = ""; + //获取文件数据 + JSONObject data = downloadFile(fileAddr); + DataSetsSaveDto dataSetsSaveDto = new DataSetsSaveDto(); + if (!ObjectUtils.isEmpty(data)) { + dataSetsSaveDto = data.toJavaObject(DataSetsSaveDto.class); + dataSetsSaveDto.setTableContent(null); + } + for (int i = 0; i < addEnvIds.size(); i++) { + + dataSetsSaveDto.setEnvId(addEnvIds.get(i)); + if(environmentMap.containsKey(addEnvIds.get(i))){ + dataSetsSaveDto.setEnvName(environmentMap.get(addEnvIds.get(i)).getName()); + } + dataSetsSaveDtos.add(dataSetsSaveDto); + + dataSetEnvRelAdd = new DataSetEnvRel(); + dataSetEnvRelAdd.setDataSetId(queryDto.getDataSetId()); + dataSetEnvRelAdd.setEnvId(addEnvIds.get(i)); + dataSetEnvRelAdd.setId(UUIDUtil.create32UUID()); + dataSetEnvRelAdd.setCreatedBy(NKSecurityContext.getUserId()); + dataSetEnvRelAdd.setCreatedTime(new Date()); + dataSetEnvRelAdd.setTenantId(NKSecurityContext.getTenantId()); + dataSetEnvRelAdd.setSeq(seq + i + 1); + //存储文件数据 + fileAddrAdd = uploadFile(dataSetsSaveDto, dataSetEnvRelAdd.getId(), FileBusinessTypeEnum.STATIC_DATA_SET_ENV); + dataSetEnvRelAdd.setFileAddr(fileAddrAdd); + dataSetEnvRelService.insert(dataSetEnvRelAdd); + } + } + //封装反显数据 + DataSetsSaveDto dataSetsSaveVo = null; + for (int i = 0; i < noDelDs.size(); i++) { + if (StringUtils.hasText(noDelDs.get(i).getFileAddr())) { + JSONObject data1 = downloadFile(noDelDs.get(i).getFileAddr()); + if (!ObjectUtils.isEmpty(data1)) { + dataSetsSaveVo = data1.toJavaObject(DataSetsSaveDto.class); + dataSetsSaveVo.setEnvId(noDelDs.get(i).getEnvId()); + if(environmentMap.containsKey(noDelDs.get(i).getEnvId())){ + dataSetsSaveVo.setEnvName(environmentMap.get(noDelDs.get(i).getEnvId()).getName()); + } + dataSetsSaveDtos.add(dataSetsSaveVo); + } + } + } + } + } + else{ + //反显系统关联的环境名以及环境id + DataSetsSaveDto dataSetsSaveDto = null; + for (String envId:envIds){ + dataSetsSaveDto = new DataSetsSaveDto(); + dataSetsSaveDto.setEnvId(envId); + if(environmentMap.containsKey(envId)){ + dataSetsSaveDto.setEnvName(environmentMap.get(envId).getName()); + } + dataSetsSaveDtos.add(dataSetsSaveDto); + } + } + return dataSetListSeq(envIds,dataSetsSaveDtos); + } + + @Override + public ResultWrapper> saveBatch(DataSetEnvRelAddDto addDto) { + ResultWrapper> resultWrapper=new ResultWrapper<>(); + //用projectId调project服务的feign查系统关联的环境集合 1 + List envIds = projectFeignClient.selectEnvIds(addDto.getProId()); + List resultId = saveDataEnv(envIds, addDto); + return resultWrapper.success(resultId); + } + + @Transactional(rollbackFor = Exception.class) + private List saveDataEnv(List envIds,DataSetEnvRelAddDto addDto){ + List resultId=new ArrayList<>(); + //用dataSetId查数据集环境关联表获取相关关联记录 2 + DataSetEnvRel dataSetEnvRel=new DataSetEnvRel(); + dataSetEnvRel.setDataSetId(addDto.getDataSetId()); + SqlOrderBy sqlOrderBy=new SqlOrderBy(); + sqlOrderBy.asc("seq"); + List query = dataSetEnvRelService.query(dataSetEnvRel,sqlOrderBy); + //系统未关联环境,删除当前数据集关联环境的所有记录 + if (envIds.size()==0){ + if (query.size()!=0) { + List ids = query.stream().map(DataSetEnvRel::getId).collect(Collectors.toList()); + dataSetEnvRelService.deleteByPrimaryKeys(ids); + } + throw new PlatformRuntimeException(DataPoolError.PROJECT_NO_REFER_ENV); + } + if (query.size()!=0) { + //比较1和2 + List delIds=new ArrayList<>();//系统已删除关联的环境id集合 + List noDelQuery=new ArrayList<>();//1和2中均存在的 + for (int i = 0; i { + if (StringUtils.hasText(dataSetEnvRel.getFileAddr())) { + deleteFile(dataSetEnvRel.getFileAddr()); + } + }); + List collect = delIds.stream().map(DataSetEnvRel::getId).collect(Collectors.toList()); + dataSetEnvRelService.deleteByPrimaryKeys(collect); + //是否需要补充删除文件服务器上的json文件 + } + //2和1中都存在的 改 + if (noDelQuery.size()!=0){ + Map noDelMap = noDelQuery.stream().collect(Collectors.toMap(DataSetEnvRel::getEnvId, e -> e)); + Set noDelEnvIds = noDelMap.keySet(); + Map> map = noDelQuery.stream().collect(Collectors.groupingBy(DataSetEnvRel::getEnvId)); + DataSetEnvRel update=null; + DataSetsSaveDto updateSaveDto=null; + for (DataSetEnvRelAddTmpDto d:addDto.getDataSetEnvRelAddTmpDto()) { + if (noDelEnvIds.contains(d.getEnvId())){ + update=new DataSetEnvRel(); + update.setId(map.get(d.getEnvId()).get(0).getId()); + update.setUpdatedBy(NKSecurityContext.getUserId()); + update.setUpdatedTime(new Date()); + updateSaveDto=new DataSetsSaveDto(); + updateSaveDto.setDataSetId(addDto.getDataSetId()); + updateSaveDto.setTableContent(d.getTableContent()); + updateSaveDto.setTableHeader(d.getTableHeader()); + //更新到文件服务器 + DataSetEnvRel envRel = noDelMap.get(d.getEnvId()); + if (StringUtils.hasText(envRel.getFileAddr())) { + deleteFile(envRel.getFileAddr()); + } + String path = uploadFile(updateSaveDto, update.getId(), FileBusinessTypeEnum.STATIC_DATA_SET_ENV); + update.setFileAddr(path); + //更新到表 + resultId.add(map.get(d.getEnvId()).get(0).getId()); + dataSetEnvRelService.updateByPrimaryKey(update); + } + } + } + //筛选出1中存在2不存在的 + List addEnvIds=new ArrayList<>(); + List foundIds = query.stream().map(DataSetEnvRel::getEnvId).collect(Collectors.toList()); + for (String envId:envIds) { + if (!foundIds.contains(envId)){ + addEnvIds.add(envId); + } + } + //1中存在2不存在的 加 + if (addEnvIds.size()!=0){ + Integer seq=0; + if (noDelQuery.size()!=0) { + seq = noDelQuery.get(query.size() - 1).getSeq(); + } + DataSetEnvRel dataSetEnvRelAdd=null; + DataSetsSaveDto dataSetsSaveDto=null; + for (DataSetEnvRelAddTmpDto d:addDto.getDataSetEnvRelAddTmpDto()) { + if (addEnvIds.contains(d.getEnvId())) { + dataSetEnvRelAdd = new DataSetEnvRel(); + dataSetEnvRelAdd.setEnvId(d.getEnvId()); + dataSetEnvRelAdd.setDataSetId(addDto.getDataSetId()); + dataSetEnvRelAdd.setTenantId(NKSecurityContext.getTenantId()); + dataSetEnvRelAdd.setCreatedTime(new Date()); + dataSetEnvRelAdd.setCreatedBy(NKSecurityContext.getUserId()); + String uuid = UUIDUtil.create32UUID(); + dataSetEnvRelAdd.setId(uuid); + dataSetEnvRelAdd.setSeq(++seq); + //上传数据到文件服务器 + dataSetsSaveDto = new DataSetsSaveDto(); + dataSetsSaveDto.setTableHeader(d.getTableHeader()); + dataSetsSaveDto.setTableContent(d.getTableContent()); + dataSetsSaveDto.setDataSetId(addDto.getDataSetId()); + String path = uploadFile(dataSetsSaveDto, dataSetEnvRelAdd.getId(), FileBusinessTypeEnum.STATIC_DATA_SET_ENV); + dataSetEnvRelAdd.setFileAddr(path); + //存记录到数据库 + resultId.add(uuid); + dataSetEnvRelService.insert(dataSetEnvRelAdd); + } + } + } + } + else { + //直接新增 + DataSetsSaveDto dataSetsSaveDto=null; + DataSetEnvRel dataSetEnvRelAdd=null; + Integer count=1; + for (DataSetEnvRelAddTmpDto d:addDto.getDataSetEnvRelAddTmpDto()) { + if (envIds.contains(d.getEnvId())) { + dataSetEnvRelAdd = new DataSetEnvRel(); + dataSetEnvRelAdd.setEnvId(d.getEnvId()); + dataSetEnvRelAdd.setDataSetId(addDto.getDataSetId()); + dataSetEnvRelAdd.setTenantId(NKSecurityContext.getTenantId()); + dataSetEnvRelAdd.setCreatedTime(new Date()); + dataSetEnvRelAdd.setCreatedBy(NKSecurityContext.getUserId()); + String uuid = UUIDUtil.create32UUID(); + dataSetEnvRelAdd.setId(uuid); + dataSetEnvRelAdd.setSeq(count++); + //上传数据到文件服务器 + dataSetsSaveDto = new DataSetsSaveDto(); + dataSetsSaveDto.setTableHeader(d.getTableHeader()); + dataSetsSaveDto.setTableContent(d.getTableContent()); + dataSetsSaveDto.setDataSetId(addDto.getDataSetId()); + + String path = uploadFile(dataSetsSaveDto, dataSetEnvRelAdd.getId(), FileBusinessTypeEnum.STATIC_DATA_SET_ENV); + dataSetEnvRelAdd.setFileAddr(path); + //存记录到数据库 + resultId.add(uuid); + dataSetEnvRelService.insert(dataSetEnvRelAdd); + } + } + } + return resultId; + } + + private void deleteFile(String fileAddr) { + String[] pathData = MinioPathUtils.idToPath(fileAddr); + try { + simpleStorageService.delete(pathData[0], "/" + pathData[1]); + } catch (Exception e) { + throw new PlatformRuntimeException(DataPoolError.FILE_DEL_ERROR); + } + } + + + @Override + public void exportExcel(HttpServletResponse response, DataSetEnvRelQueryDto dataSetEnvRelQueryDto) { + try { + XSSFWorkbook hssfWorkbook = getXSSFWorkbook(dataSetEnvRelQueryDto); + setResponseHeader(response); + ServletOutputStream outputStream = response.getOutputStream(); + hssfWorkbook.write(outputStream); + outputStream.flush(); + outputStream.close(); + }catch (IOException e){ + logger.error(e.getMessage()); + throw new PlatformRuntimeException(DataPoolError.FILE_DOWNLOAD_ERROR); + } + } + + @Override + public AtuScriptInputSetQuoteFieldDto selectDataUrlAndTreeName(AtuScriptInputSetQuoteFieldDto fieldDto) { + AtuScriptInputSetQuoteFieldDto dto = dataSetEnvRelService.selectDataUrlAndTreeName(fieldDto); + if (null!=dto){ + //拼接path + int row = fieldDto.getRow() + 1; + String path = dto.getFullName() + ":" + dto.getName() + "." + fieldDto.getColumn() + ".[" + row + "]"; + //获取最新value + if (StringUtils.hasText(dto.getPath())){ + JSONObject jsonObject = downloadFile(dto.getPath()); + try{ + logger.info("脚本文件内容:jsonobject:{}",jsonObject.toJSONString()); + DataSetsSaveDto dataSetsSaveDto = jsonObject.toJavaObject(DataSetsSaveDto.class); + Map> tableContent = dataSetsSaveDto.getTableContent(); + dto.setValue(tableContent.get(fieldDto.getColumn()).get(fieldDto.getRow()).getValue()); + }catch (Exception e){ + dto.setValue(null); + logger.error("文件下载转换异常,e,{}",e); + } + } + dto.setPath(path); + } + return dto; + } + + @Override + public Map getDataSetFile(AtuDataSetFeignDto dto) { + Map resultMap = new HashMap<>(); + List list = new ArrayList<>(dto.getDataSetList()); + List dataSetList = dataSetEnvRelService.getDataSetFile(list, dto.getEnvId()); + if (dataSetList != null && dataSetList.size()>0) { + for (AtuScriptInputSetQuoteFeignDto fieldDto : dataSetList) { + resultMap.put(fieldDto.getSetId(),fieldDto); + } + } + return resultMap; + } + + private XSSFWorkbook getXSSFWorkbook(DataSetEnvRelQueryDto dataSetEnvRelQueryDto) { + XSSFWorkbook workbook = new XSSFWorkbook(); + XSSFSheet sheet = workbook.createSheet("sheet1"); + XSSFCellStyle cellStyle = workbook.createCellStyle(); + cellStyle.setAlignment(HorizontalAlignment.CENTER); + XSSFCell cell = null; + + List tableHeaders = dataSetEnvRelQueryDto.getTableHeaders(); + List> tableContent = dataSetEnvRelQueryDto.getTableContent(); + + if (null != tableHeaders && tableHeaders.size() > 0) { + //表头填充 + XSSFRow row = sheet.createRow(0); + for (int i = 0; i < tableHeaders.size(); i++) { + cell = row.createCell(i); + cell.setCellValue(tableHeaders.get(i)); + cell.setCellStyle(cellStyle); + } + if (null != tableContent && tableContent.size() > 0) { + //表体填充 + for (int i = 1; i <= tableContent.size(); i++) { + XSSFRow xssfRow = sheet.createRow(i); + for (int j = 0; j < tableHeaders.size(); j++) { + cell = xssfRow.createCell(j); + Object obj = tableContent.get(i - 1).get(tableHeaders.get(j)); + if (obj != null) { + cell.setCellValue(obj.toString()); + } else { + cell.setCellValue(""); + } + cell.setCellStyle(cellStyle); + } + } + } + } + return workbook; + } + + private void setResponseHeader(HttpServletResponse response) { + try { + String fileName="导出数据集名称"; + fileName= URLEncoder.encode(fileName,"utf8"); + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/vnd.ms-excel;charset=utf-8"); + response.setHeader("Content-Disposition","attachment;filename="+fileName+".xlsx"); + }catch (Exception e){ + logger.error(e.getMessage()); + } + } + + /** + * 根据url下载文件 + * @param url + * @return + */ + private JSONObject downloadFile(String url) { + String[] resultPath = pathUtils.idToPath(url); + InputStream inputStream = null; + JSONObject scriptData = null; + try { + inputStream = simpleStorageService.downloadAsStream(resultPath[0], "/" + resultPath[1]); + scriptData = pathUtils.getFileContent(inputStream, JSONObject.class); + return scriptData; + } catch (FileDownloadException e) { + logger.error("读取原文件失败,失败原因:", e); + throw new PlatformRuntimeException(DataPoolError.FILE_DOWNLOAD_ERROR); + } finally { + if (null != inputStream) { + try { + inputStream.close(); + } catch (IOException e) { + logger.error("",e); + } + } + } + } + /** + * 上传文件 + * @param scriptJsonStr + * @return + */ + private String uploadFile(Object scriptJsonStr, String objId, FileBusinessTypeEnum businessCode) { + File file = pathUtils.objectToJsonFile(scriptJsonStr); + try { + NKFile nkFile = simpleStorageService.upload(NKSecurityContext.getTenantId(), file, objId, businessCode); + String path = pathUtils.pathToId(NKSecurityContext.getTenantId(), nkFile.getId()); + return path; + } catch (FileUploadException e) { + logger.error("上传文件出错", e); + throw new PlatformRuntimeException(DataPoolError.FILE_UPLOAD_ERROR); + } finally { + boolean delete = file.delete(); + if (!delete) { + logger.error("删除文件失败"); + } + } + } + + private List dataSetListSeq(List envList,List dtoList){ + List resultList = new ArrayList<>(); + for (String envId : envList) { + for (DataSetsSaveDto dataSetsSaveDto : dtoList) { + if (dataSetsSaveDto.getEnvId().equals(envId)){ + resultList.add(dataSetsSaveDto); + } + } + } + return resultList; + } + + @Override + public DataSetsSaveDto importExcel(MultipartFile file, String dataSetId, String envId, String tableHeader) { + DataSetsSaveDto dataSetsSaveDto = new DataSetsSaveDto(); + if (file.isEmpty()) { + throw new PlatformRuntimeException(DataPoolError.FILE_IS_NULL); + } + String name = file.getOriginalFilename(); + String[] tableHeaders = new String[0]; + int length = 0; + if (tableHeader != null && !tableHeader.equals("")) { + tableHeaders = tableHeader.split(","); + length = tableHeaders.length; + } + if (name != null && !name.equals("")) { + //表头信息列表 + String subStr = name.substring(name.lastIndexOf(".")); + if (subStr.equals(DataPoolConstant.FILE_XLS)) { + dataSetsSaveDto = analysisExcelByXLS(file, length); + } else if (subStr.equals(DataPoolConstant.FILE_XLSX)) { + dataSetsSaveDto = analysisExcelByXLSX(file, length); + } else { + throw new PlatformRuntimeException(DataPoolError.FILE_IS_NOT_EXCEL); + } + } else { + throw new PlatformRuntimeException(DataPoolError.FILE_NAME_IS_NULL); + } + + int excelSize = dataSetsSaveDto.getTableHeader().size(); + + if (length > excelSize) { + throw new PlatformRuntimeException(DataPoolError.TABLE_HEADER_SIZE_UNEQULE); + } + for (int i = 0; i < length; i++) { + //校验是否一致 + String dto = tableHeaders[i]; + DataHeaderDto headerDto = dataSetsSaveDto.getTableHeader().get(i); + if (!headerDto.getName().equals(dto)) { + throw new PlatformRuntimeException(DataPoolError.TABLE_HEADER_NAME_ERROR, i + 1, headerDto.getName(), dto); + } + } + dataSetsSaveDto.setEnvId(envId); + String envName = envNameUtils.getEnvName(envId); + dataSetsSaveDto.setEnvName(envName); + dataSetsSaveDto.setDataSetId(dataSetId); + return dataSetsSaveDto; + } + + + private DataSetsSaveDto analysisExcelByXLSX(MultipartFile file,Integer headerSize) { + DataSetsSaveDto resultDto = new DataSetsSaveDto(); + List excelHeaders = new ArrayList<>(); + Map> excelMap = new HashMap<>(); + XSSFWorkbook sheets = null; + try { + sheets = new XSSFWorkbook(file.getInputStream()); + } catch (IOException e) { + throw new PlatformRuntimeException(DataPoolError.EXCEL_FILE_READ_ERROR); + } + //获取表头信息 + XSSFSheet sheet = sheets.getSheetAt(0); + if (sheet == null) { + throw new PlatformRuntimeException(DataPoolError.EXCEL_FISRT_SHEET_NULL); + } + XSSFRow rowHeader = sheet.getRow(0); + Boolean checkTableHeader = false; + if (rowHeader != null) { + if (headerSize.equals(0)) { + checkTableHeader = true; + headerSize = Integer.parseInt(String.valueOf(rowHeader.getLastCellNum())); + } + for (int i = 0; i < headerSize; i++) { + XSSFCell cell = rowHeader.getCell(i); + if (cell != null && cell.getCellType() != CellType.BLANK) { + cell.setCellType(CellType.STRING); + DataHeaderDto headerDto = new DataHeaderDto(); + headerDto.setName(cell.getStringCellValue()); + excelHeaders.add(headerDto); + } else { + throw new PlatformRuntimeException(DataPoolError.EXCEL_HEADER_IS_NULL); + } + } + if (checkTableHeader) { + if (excelHeaders.size() > 1) { + checkTableHeader(excelHeaders); + } + } + //组装表体数据 + int rowNum = sheet.getLastRowNum() + 1; + for (int i = 1; i < rowNum; i++) { + XSSFRow row = sheet.getRow(i); + for (int j = 0; j < headerSize; j++) { + String headerName = excelHeaders.get(j).getName(); + List dtoList = excelMap.get(headerName); + if (dtoList == null || dtoList.size() == 0) { + dtoList = new ArrayList<>(); + } + XSSFCell cell = row.getCell(j); + DataContentDto contentDto = new DataContentDto(); + if (cell == null) { + contentDto.setValue(null); + } else if (cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + contentDto.setValue(sdf.format(cell.getDateCellValue())); + } else { + cell.setCellType(CellType.STRING); + contentDto.setValue(cell.getStringCellValue()); + } + dtoList.add(contentDto); + excelMap.put(headerName, dtoList); + } + } + } + resultDto.setTableHeader(excelHeaders); + resultDto.setTableContent(excelMap); + return resultDto; + } + + private DataSetsSaveDto analysisExcelByXLS(MultipartFile file,Integer headerSize) { + DataSetsSaveDto resultDto = new DataSetsSaveDto(); + List excelHeaders = new ArrayList<>(); + Map> excelMap = new HashMap<>(); + HSSFWorkbook sheets = null; + try { + sheets = new HSSFWorkbook(file.getInputStream()); + } catch (IOException e) { + throw new PlatformRuntimeException(DataPoolError.EXCEL_FILE_READ_ERROR); + } + //获取表头信息 + HSSFSheet sheet = sheets.getSheetAt(0); + if (sheet == null) { + throw new PlatformRuntimeException(DataPoolError.EXCEL_FISRT_SHEET_NULL); + } + HSSFRow rowHeader = sheet.getRow(0); + Boolean checkTableHeader = false; + if (rowHeader != null) { + if (headerSize.equals(0)) { + //校验表头是否存在重复数据 + checkTableHeader = true; + headerSize = Integer.parseInt(String.valueOf(rowHeader.getLastCellNum())); + } + for (int i = 0; i < headerSize; i++) { + HSSFCell cell = rowHeader.getCell(i); + if (cell != null && cell.getStringCellValue() != null) { + cell.setCellType(CellType.STRING); + DataHeaderDto headerDto = new DataHeaderDto(); + headerDto.setName(cell.getStringCellValue()); + excelHeaders.add(headerDto); + } else { + throw new PlatformRuntimeException(DataPoolError.EXCEL_HEADER_IS_NULL); + } + } + if (checkTableHeader) { + if (excelHeaders.size() > 1) { + checkTableHeader(excelHeaders); + } + } + //组装表体数据 + int rowNum = sheet.getLastRowNum() + 1; + for (int i = 1; i < rowNum; i++) { + HSSFRow row = sheet.getRow(i); + for (int j = 0; j < headerSize; j++) { + String headerName = excelHeaders.get(j).getName(); + List dtoList = excelMap.get(headerName); + if (dtoList == null || dtoList.size() == 0) { + dtoList = new ArrayList<>(); + } + HSSFCell cell = row.getCell(j); + DataContentDto contentDto = new DataContentDto(); + if (cell == null) { + contentDto.setValue(null); + } else if (cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + contentDto.setValue(sdf.format(cell.getDateCellValue())); + } else { + cell.setCellType(CellType.STRING); + contentDto.setValue(cell.getStringCellValue()); + } + dtoList.add(contentDto); + excelMap.put(headerName, dtoList); + } + } + } + resultDto.setTableHeader(excelHeaders); + resultDto.setTableContent(excelMap); + return resultDto; + } + + private void checkTableHeader(List excelHeaders){ + List nameList = new ArrayList<>(); + for (DataHeaderDto excelHeader : excelHeaders) { + String headerName = excelHeader.getName(); + if (nameList.contains(headerName)){ + throw new PlatformRuntimeException(DataPoolError.EXCEL_HEADER_HAS_SAME); + } + nameList.add(headerName); + } + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetTreeApiService.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetTreeApiService.java new file mode 100644 index 0000000..56f6113 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetTreeApiService.java @@ -0,0 +1,64 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataSets.service; + +import net.northking.cctp.common.db.excel.ExcelService; +import net.northking.cctp.dataPool.dto.dataSets.*; + + +import java.util.List; + +/** + * 数据集树目录表Restful逻辑接口 + * @author maven-cctp-plugin + * @since 1.0 + */ +public interface DataSetTreeApiService extends ExcelService +{ + + /** + * 新增数据集树目录表 + * + * @param dto 接口数据传输对象 + * @return 主键 + */ + String add(DataSetTreeAddDto dto); + + /** + * 更新数据集树目录表 + * + * @param dto 接口数据传输对象 + * @return 修改的记录数量 + */ + Integer updateByPK(DataSetTreeUpdateDto dto) throws IllegalAccessException; + + /** + * 删除数据集树目录表 + * @param uuid 主键 + * @return 删除的记录数量 + */ + Integer deleteByPK(String uuid); + + /** + * 根据层级查询数据集目录节点 + * @param dto + * @return + */ + List queryDataSetTreeByParentId(DataSetTreeQueryDto dto); + + /** + * 根据名字模糊查询数据集目录节点 + * @param dto + * @return + */ + List queryDataSetTreeByName(DataSetTreeQueryDto dto); + + /** + * 拖拽数据集树目录 + * @param dto + * @return + */ + Integer moveDataSetTree(DataSetTreeMoveDto dto); +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetTreeApiServiceImpl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetTreeApiServiceImpl.java new file mode 100644 index 0000000..7cf700e --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetTreeApiServiceImpl.java @@ -0,0 +1,542 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataSets.service; + +import net.northking.cctp.common.cache.EntityNameCache; +import net.northking.cctp.common.cache.EntityNameCatalog; +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.common.db.annotation.DatabaseReadOnly; +import net.northking.cctp.common.db.excel.AbstractExcelService; +import net.northking.cctp.common.db.excel.ExcelHeader; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.dataPool.db.entity.DataSetTree; +import net.northking.cctp.dataPool.db.entity.DataSets; +import net.northking.cctp.dataPool.db.service.DataSetTreeService; +import net.northking.cctp.dataPool.db.service.DataSetsService; +import net.northking.cctp.dataPool.dto.dataSets.*; +import net.northking.cctp.dataPool.enums.DataPoolError; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 数据集树目录表服务实现类 + * + * @author maven-cctp-plugin + * @since 1.0 + */ + +@Service +@ConditionalOnMissingBean(name = "DataSetTreeApiServiceImpl") +public class DataSetTreeApiServiceImpl extends AbstractExcelService implements DataSetTreeApiService +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DataSetTreeApiServiceImpl.class); + + @Autowired + private DataSetTreeService dataSetTreeService; + @Autowired + private DataSetsService dataSetService; + @Autowired + private TreeIndexNoApiService treeIndexNoApiService; + @Autowired + private EntityNameCache entityNameCache; + + //= Excel 导入导出相关代码 start ==================// + @Override + public BasicService getService() + { + return this.dataSetTreeService; + } + + @Override + public ExcelHeader[] excelHeaders() + { + ExcelHeader id = new ExcelHeader("id", "id", String.class); + ExcelHeader name = new ExcelHeader("节点名称", "name", String.class); + ExcelHeader parentId = new ExcelHeader("父节点id", "parentId", String.class); + ExcelHeader levelNo = new ExcelHeader("层级", "levelNo", Integer.class); + ExcelHeader indexNo = new ExcelHeader("序号", "indexNo", Integer.class); + ExcelHeader isLeaf = new ExcelHeader("是否叶子节点", "isLeaf", String.class); + ExcelHeader path = new ExcelHeader("路径", "path", String.class); + ExcelHeader fullName = new ExcelHeader("完整路径", "fullName", String.class); + ExcelHeader proId = new ExcelHeader("系统id", "proId", String.class); + ExcelHeader tenantId = new ExcelHeader("租户id", "tenantId", String.class); + ExcelHeader createdBy = new ExcelHeader("创建人", "createdBy", String.class); + ExcelHeader createdTime = new ExcelHeader("创建时间", "createdTime", Date.class); + ExcelHeader updatedBy = new ExcelHeader("更新人", "updatedBy", String.class); + ExcelHeader updatedTime = new ExcelHeader("更新时间", "updatedTime", Date.class); + return new ExcelHeader[]{}; + } + + /** + * Excel导入,入库之前的处理 + * @param records 从Excel读取到的记录 + * @return 待入库的记录 + */ + @Override + protected List beforeInsertBatch(List records) + { + for (DataSetTree record : records) + { + record.setId(UUIDUtil.create32UUID()); + } + return records; + } + + /** + * 写入Excel之前的处理
+ * 数据的特殊处理在此处加工处理 + * + * @param record 来自数据库记录 + * @return 待写入Excel的记录 + */ + @Override + protected DataSetTree beforeWriteExcel(DataSetTree record) + { + return record; + } + + //= Excel 导入导出相关代码 end =======================// + + //= 增删改查 相关代码 start ==================// + + + @Override + @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String add(DataSetTreeAddDto dto) + { + //判断名字是否包括/或者\ + if (dto.getName().contains("/") || dto.getName().contains("\\")) { + throw new PlatformRuntimeException(DataPoolError.TREE_NAME_VALID); + } + //设置根节点目录 + if (dto.isAddRootNode() || !StringUtils.hasText(dto.getParentId())) { + dto.setParentId("0"); + } + //获取父id,如果是根目录则父id为0 + String pid = dto.getParentId(); + //查询父节点信息 + DataSetTree dataSetTree = new DataSetTree(); + dataSetTree.setId(pid); + DataSetTree byPKParent = dataSetTreeService.findByPrimaryKey(dataSetTree); + //设置根节点的父节点 + if (byPKParent == null) { + byPKParent = new DataSetTree(); + byPKParent.setId("0"); + byPKParent.setName(""); + byPKParent.setLevelNo(0); + byPKParent.setPath("0"); + byPKParent.setFullName(""); + byPKParent.setParentId("-1"); + byPKParent.setIsLeaf("0"); + } + //非根目录创建 + //1.判断父节点是否存在数据集 + if (!"0".equals(pid)) { + DataSets tempSet = new DataSets(); + tempSet.setTreeId(byPKParent.getId()); + List existSets = dataSetService.query(tempSet); + if (!CollectionUtils.isEmpty(existSets)) { + throw new PlatformRuntimeException(DataPoolError.TREE_ADD_DATA_EXISTS); + } + } + //2.限制最多十级目录 + if (byPKParent.getLevelNo() - 10 >= 0) { + throw new PlatformRuntimeException(DataPoolError.TREE_LEVEL_LIMIT); + } + //3.判断同级是否存在重名目录 + DataSetTree setTree = new DataSetTree(); + setTree.setParentId(pid); + setTree.setName(dto.getName()); + setTree.setProId(dto.getProId()); + List setTrees = dataSetTreeService.query(setTree); + if (!CollectionUtils.isEmpty(setTrees)) { + throw new PlatformRuntimeException(DataPoolError.TREE_NAME_EXISTS); + } + //5.插入节点至数据库 + String uuid = UUIDUtil.create32UUID(); + DataSetTree newTree = new DataSetTree(); + BeanUtils.copyProperties(dto,newTree); + newTree.setId(uuid); + newTree.setIsLeaf("1"); + newTree.setCreatedBy(NKSecurityContext.getUserId()); + newTree.setCreatedTime(new Date()); + newTree.setUpdatedBy(newTree.getCreatedBy()); + newTree.setUpdatedTime(newTree.getCreatedTime()); + //新增根节点目录 + if ("0".equals(dto.getParentId())) { + newTree.setPath(uuid); + newTree.setFullName(dto.getName()); + newTree.setLevelNo(1); + } else { //新增非根节点目录 + newTree.setLevelNo(byPKParent.getLevelNo()+1); + newTree.setPath(byPKParent.getPath() + "/" + uuid); + newTree.setFullName(byPKParent.getFullName() + "/" + dto.getName()); + //6.如果父节点是叶子节点更新父节点 + if ("1".equals(byPKParent.getIsLeaf())) { + DataSetTree newParent = new DataSetTree(); + newParent.setId(dto.getParentId()); + newParent.setIsLeaf("0"); + newParent.setUpdatedBy(NKSecurityContext.getUserId()); + newParent.setUpdatedTime(newTree.getCreatedTime()); + newParent.setTenantId(byPKParent.getTenantId()); + dataSetTreeService.updateByPrimaryKey(newParent); + } + } + //获取排序值 + Integer seq = treeIndexNoApiService.genIndexNo(dto.getProId(), "ATU_DATA_MGR", 1L).get(0); + newTree.setIndexNo(seq); + newTree.setTenantId(NKSecurityContext.getTenantId()); + dataSetTreeService.insert(newTree); + return uuid; + } + + @Override + @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Integer updateByPK(DataSetTreeUpdateDto dto) throws IllegalAccessException + { + String newName = dto.getName(); + //判断目录名是否包括/或者\ + if (newName.contains("/") || newName.contains("\\")) { + throw new PlatformRuntimeException(DataPoolError.TREE_NAME_VALID); + } + //获取待改目录节点信息 + DataSetTree byPrimaryKey = dataSetTreeService.findByPrimaryKey(dto.getId()); + if (null == byPrimaryKey) { + throw new PlatformRuntimeException(DataPoolError.TREE_NO_EXISTS); + } + //获取同级目录节点信息 + DataSetTree tree = new DataSetTree(); + tree.setParentId(byPrimaryKey.getParentId()); + tree.setName(dto.getName()); + tree.setProId(byPrimaryKey.getProId()); + List broNodes = dataSetTreeService.query(tree); + if (!CollectionUtils.isEmpty(broNodes) && !broNodes.get(0).getId().equals(dto.getId())) { + throw new PlatformRuntimeException(DataPoolError.TREE_NAME_EXISTS); + } + //更新数据库数据 + DataSetTree tempTree = new DataSetTree(); + BeanUtils.copyProperties(dto,tempTree); + tempTree.setUpdatedBy(NKSecurityContext.getUserId()); + tempTree.setUpdatedTime(new Date()); + //更新namePath + String namePath = byPrimaryKey.getFullName(); + String namePathNew = ""; + DataSetTree childSetTrees = new DataSetTree(); + childSetTrees.setProId(byPrimaryKey.getProId()); + childSetTrees.setFullName(namePath); + //更新根节点名称路径 + if ("0".equals(byPrimaryKey.getParentId())) { + namePathNew = dto.getName(); + }else { + //更新非根节点名称路径 + String[] nameArr = namePath.split("/"); + namePathNew = nameArr[0]; + for (int i = 1; i < nameArr.length - 1; i++) { + namePathNew = namePathNew + "/" + nameArr[i]; + } + namePathNew = namePathNew + "/" + dto.getName(); + } + tempTree.setFullName(namePathNew); + tempTree.setTenantId(byPrimaryKey.getTenantId()); + int total = dataSetTreeService.updateByPrimaryKey(tempTree); + //同步修改所有子级节点 + total+= dataSetTreeService.updateChildNamePath(childSetTrees,namePathNew); + return total; + } + + @Override + @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Integer deleteByPK(String uuid) + { + DataSetTree byPrimaryKey = dataSetTreeService.findByPrimaryKey(uuid); + if (null == byPrimaryKey) { + return 0; + } + //判断节点是否为叶子结点 + if ("0".equals(byPrimaryKey.getIsLeaf())) { + throw new PlatformRuntimeException(DataPoolError.TREE_DEL_DIR_EXISTS); + } + //判断所选目录是否有脚本 + DataSets tempSet = new DataSets(); + tempSet.setTreeId(uuid); + List sets = dataSetService.query(tempSet); + if (!CollectionUtils.isEmpty(sets)) { + throw new PlatformRuntimeException(DataPoolError.TREE_DEL_DATA_EXISTS); + } + //删除数据库数据 + int res = dataSetTreeService.deleteByPrimaryKey(uuid); + //查询父目录是否含有其他子目录 + DataSetTree setTree = new DataSetTree(); + setTree.setParentId(byPrimaryKey.getParentId()); + List childrenNodes = dataSetTreeService.query(setTree); + //无子目录时需改为叶子结点 + if (CollectionUtils.isEmpty(childrenNodes)) { + DataSetTree newParent = new DataSetTree(); + newParent.setId(byPrimaryKey.getParentId()); + newParent.setIsLeaf("1"); + newParent.setUpdatedBy(NKSecurityContext.getUserId()); + newParent.setUpdatedTime(new Date()); + dataSetTreeService.updateByPrimaryKey(newParent); + } + return res; + } + + @Override + @DatabaseReadOnly + public List queryDataSetTreeByParentId(DataSetTreeQueryDto dto) { + List result = new ArrayList<>(); + //根据父节点查询所有子级节点 + if(!StringUtils.isEmpty(dto.getParentId())){ + DataSetTreeQueryDto setTreeQueryDto = new DataSetTreeQueryDto(); + setTreeQueryDto.setProIds(dto.getProIds()); + setTreeQueryDto.setParentId(dto.getParentId()); + //租户隔离 + setTreeQueryDto.setTenantId(NKSecurityContext.getTenantId()); + result = dataSetTreeService.selectDataSetTree(setTreeQueryDto); + for (DataSetTreeDetailDto dataSetTreeDetailDto : result) { + dataSetTreeDetailDto.setIdx(dataSetTreeDetailDto.getIndexNo()); + } + }else{ + //最外层为系统信息数组 + for (String projectId : dto.getProIds()) { + DataSetTreeDetailDto detailDto = new DataSetTreeDetailDto(); + detailDto.setId(projectId); + detailDto.setParentId(""); + detailDto.setProId(projectId); + detailDto.setName(entityNameCache.translateById(EntityNameCatalog.MONSTER_SYSTEM.name(),projectId)); + detailDto.setIsLeaf("0"); + detailDto.setLevelNo(0); + result.add(detailDto); + } + } + return result; + } + + @Override + @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Integer moveDataSetTree(DataSetTreeMoveDto dto) { + DataSetTree oldNode = dataSetTreeService.findByPrimaryKey(dto.getId()); + DataSetTree tempTree = new DataSetTree(); + if("0".equals(dto.getTargetId())) { + tempTree.setId("0"); + tempTree.setLevelNo(0); + tempTree.setIsLeaf("0"); + tempTree.setFullName(""); + }else { + tempTree = dataSetTreeService.findByPrimaryKey(dto.getTargetId()); + } + //判断拖拽后是否层数超过10级 + Integer targetLevel = tempTree.getLevelNo(); + DataSetTree queryLevel = new DataSetTree(); + queryLevel.setId(oldNode.getId()); + queryLevel.setProId(oldNode.getProId()); + int maxLevel = dataSetTreeService.countMaxLevelNo(queryLevel); + int myMaxLevel = maxLevel - oldNode.getLevelNo() + 1; + if ((targetLevel + myMaxLevel) > 10) { + throw new PlatformRuntimeException(DataPoolError.TREE_LEVEL_LIMIT); + } + int levelNo = tempTree.getLevelNo()-oldNode.getLevelNo()+1; + if(dto.getOrderSeq()==null) { + dto.setOrderSeq(0); + } + //校验是否同名 + DataSetTree check = new DataSetTree(); + check.setName(oldNode.getName()); + check.setParentId(tempTree.getId()); + check.setProId(dto.getProId()); + List sameSets = dataSetTreeService.query(check); + if(!CollectionUtils.isEmpty(sameSets) && !oldNode.getParentId().equals(tempTree.getId())){ + throw new PlatformRuntimeException(DataPoolError.TREE_NAME_EXISTS); + } + //校验是否目标节点为非叶子节点并存在用例 + DataSets exitElement = new DataSets(); + exitElement.setProId(dto.getProId()); + exitElement.setTreeId(tempTree.getId()); + if ("1".equals(tempTree.getIsLeaf()) && !CollectionUtils.isEmpty(dataSetService.query(exitElement))) { + throw new PlatformRuntimeException(DataPoolError.TREE_MOVE_DATA_EXISTS); + } + //更新节点以及子节点 + DataSetTree treeUp = new DataSetTree(); + treeUp.setId(oldNode.getId()); + treeUp.setParentId(tempTree.getId()); + treeUp.setTenantId(oldNode.getTenantId()); + dataSetTreeService.updateByPrimaryKey(treeUp); + String targetIdPath = StringUtils.hasText(tempTree.getPath()) ? (tempTree.getPath()+"/") : ""; + String targetNamePath = StringUtils.hasText(tempTree.getFullName()) ? (tempTree.getFullName()+"/") : ""; + treeUp.setPath(targetIdPath+oldNode.getId()); + treeUp.setFullName(targetNamePath+oldNode.getFullName()); + //更改顺序号 + DataSetTreeMoveDto childUp = new DataSetTreeMoveDto(); + childUp.setOrderSeq(dto.getOrderSeq()); + childUp.setProId(dto.getProId()); + treeIndexNoApiService.genIndexNo(dto.getProId(), "ATU_DATA_MGR", 1L); + dataSetTreeService.updateSeqByMove(childUp); + //替换移动节点的排序号 + DataSetTree treeUpOrder = new DataSetTree(); + treeUpOrder.setId(oldNode.getId()); + treeUpOrder.setIndexNo(dto.getOrderSeq()+1); + treeUpOrder.setTenantId(oldNode.getTenantId()); + dataSetTreeService.updateByPrimaryKey(treeUpOrder); + //子节点更改路径 + DataSetTree child = new DataSetTree(); + BeanUtils.copyProperties(childUp,child); + child.setProId(oldNode.getProId()); + child.setFullName(oldNode.getFullName()); + child.setPath(oldNode.getPath()); + child.setLevelNo(levelNo); + + //不再维护namePath,长度不够 + dataSetTreeService.updateChildIdPath(child,treeUp.getPath()); + //修改原父节点以及现父节点的叶子节点标识 + if("1".equals(tempTree.getIsLeaf())){ + DataSetTree itemTreeUp = new DataSetTree(); + itemTreeUp.setId(tempTree.getId()); + itemTreeUp.setIsLeaf("0"); + itemTreeUp.setTenantId(tempTree.getTenantId()); + dataSetTreeService.updateByPrimaryKey(itemTreeUp); + } + DataSetTree oldFaCount = new DataSetTree(); + oldFaCount.setParentId(oldNode.getParentId()); + if(CollectionUtils.isEmpty(dataSetTreeService.query(oldFaCount))){ + DataSetTree oldTreeUp = new DataSetTree(); + oldTreeUp.setId(oldNode.getParentId()); + oldTreeUp.setIsLeaf("1"); + dataSetTreeService.updateByPrimaryKey(oldTreeUp); + } + return 1; + } + + @Override + public List queryDataSetTreeByName(DataSetTreeQueryDto dto) { + DataSetTreeQueryDto queryDto = new DataSetTreeQueryDto(); + queryDto.setName(dto.getName()); + queryDto.setProIds(dto.getProIds()); + List setTreeList = dataSetTreeService.selectDataSetTree(queryDto); + if (setTreeList.size()<1) { + //无数据时多系统也需再包装一层系统级信息 + if(dto.isMoreProject()) { + return setProjectTop(setTreeList, dto.getProIds(), dto.getName()); + }else { + return setTreeList; + } + } + Map treeMap = getTreeMap(setTreeList); + List detailDtos = new ArrayList<>(); + for (String treeId : treeMap.keySet()) { + detailDtos.add(treeMap.get(treeId)); + } + List treeList = getTreeList(detailDtos); + List resList = treeList.stream().sorted(Comparator.comparing(DataSetTreeDetailDto::getIndexNo)).collect(Collectors.toList()); + //多系统包装最外层系统信息 + if(dto.isMoreProject()){ + return setProjectTop(resList,dto.getProIds(),dto.getName()); + } + return resList; + } + + private Map getTreeMap(List allList) { + Map treeMap = new HashMap<>(); + List list = new ArrayList<>(); + //查询包含的树节点id + for (int i = 0; i < allList.size(); i++) { + DataSetTreeDetailDto detailDto = allList.get(i); + String[] paths = detailDto.getPath().split("/"); + List ids = new ArrayList<>(Arrays.asList(paths)); + list.addAll(ids); + } + list = list.stream().distinct().collect(Collectors.toList()); + List treeList = dataSetTreeService.queryByIds(list); + for (DataSetTree dataSetTree : treeList) { + DataSetTreeDetailDto detailDto = new DataSetTreeDetailDto(); + BeanUtils.copyProperties(dataSetTree,detailDto); + detailDto.setIdx(dataSetTree.getIndexNo()); + if (!treeMap.containsKey(dataSetTree.getId())) { + treeMap.put(dataSetTree.getId(),detailDto); + } + } + return treeMap; + } + + private List getTreeList(List dtoList) { + List treeList = new ArrayList<>(); + for (int i = 0; i < dtoList.size(); i++) { + DataSetTreeDetailDto tree = dtoList.get(i); + //根节点生成对应树列表 + if("0".equals(tree.getParentId())){ + getSonTree(tree,dtoList); + treeList.add(tree); + } + } + return treeList; + } + + private void getSonTree(DataSetTreeDetailDto tree, List dtoList) { + List sonList = new ArrayList<>(); + for (DataSetTreeDetailDto dto : dtoList) { + if(tree.getId().equals(dto.getParentId())){ + getSonTree(dto,dtoList); + sonList.add(dto); + } + } + List reSonList = sonList.stream().sorted(Comparator.comparing(DataSetTreeDetailDto::getIndexNo)).collect(Collectors.toList()); + tree.setChildren(reSonList); + } + + private List setProjectTop(List reList,List projectIds,String name){ + List result = new ArrayList<>(); + Map> tool = new HashMap<>(); + for (DataSetTreeDetailDto oneTree : reList) { + if (tool.containsKey(oneTree.getProId())){ + tool.get(oneTree.getProId()).add(oneTree); + }else{ + List list = new ArrayList<>(); + list.add(oneTree); + tool.put(oneTree.getProId(),list); + } + } + //无系统查全部 + if (CollectionUtils.isEmpty(projectIds)) { + projectIds = new ArrayList<>(); + projectIds.addAll(tool.keySet()); + } + for (String projectId : projectIds) { + String projectName = entityNameCache.translateById(EntityNameCatalog.MONSTER_SYSTEM.name(), projectId); + //系统展示条件:1.有符合条件目录 2.无关键字筛选则都需展示 3. 有关键字筛选名称含关键字系统 + if(tool.containsKey(projectId) ||!StringUtils.hasText (name) || (StringUtils.hasText(name) && projectName.contains(name))){ + DataSetTreeDetailDto one = new DataSetTreeDetailDto(); + one.setId(projectId); + one.setIsLeaf("0"); + one.setName(projectName); + one.setLevelNo(0); + one.setParentId(""); + one.setProId(projectId); + one.setChildren(tool.get(projectId)); + //无子树则为叶子结点 + if (CollectionUtils.isEmpty(one.getChildren())) { + one.setIsLeaf("1"); + } + result.add(one); + } + } + return result; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetsApiService.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetsApiService.java new file mode 100644 index 0000000..4e00240 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetsApiService.java @@ -0,0 +1,105 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataSets.service; + +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.db.excel.ExcelService; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.dataPool.dto.dataSets.*; + +import javax.servlet.http.HttpServletResponse; + +/** + * 数据集Restful逻辑接口 + * @author maven-cctp-plugin + * @since 1.0 + */ +public interface DataSetsApiService extends ExcelService +{ + /** + * 查询数据集列表 + * + * @param queryByPage 查询条件 + * @return 查询结果列表 + */ + Pagination pagingQuery(QueryByPage queryByPage); + + /** + * 新增数据集 + * + * @param dto 接口数据传输对象 + * @return 主键 + */ + String add(DataSetsAddDto dto); + + /** + * 更新数据集 + * + * @param dto 接口数据传输对象 + * @return 修改的记录数量 + */ + Integer updateByPK(DataSetsUpdateDto dto) throws IllegalAccessException; + + /** + * 获取数据集 + * @param uuid 主键 + * @return 接口数据传输对象 + */ + DataSetsDetailDto findByPK(String uuid); + + /** + * 删除数据集 + * @param uuid 主键 + * @return 删除的记录数量 + */ + Integer deleteByPK(String uuid); + + + /** + * 批量删除 + * + * @param dto + * @return 成功的数量 + */ + Integer deleteBatch(DataSetsDeleteDto dto); + + /** + * 保存数据集数据 + * @param dto + * @return + */ + Boolean save(DataSetsSaveDto dto); + + /** + * 新增列校验列实体 + * @param dto + * @return + */ + Boolean checkTableHeader(ColumnCheckDto dto); + + /** + * 导出数据集 + * @param response + * @param dataSetId + * @param fileName + */ + void exportDataSet(HttpServletResponse response, String dataSetId, String fileName); + + + /** + * 下载数据模板 + * @param response + * @param fileName + * @param saveDto + */ + void downloadTemplate(HttpServletResponse response, String fileName, DataSetsSaveDto saveDto); + + /** + * 数据库配置保存数据集 + * @param inputDto + * @return + */ + String createDataSet(DataSetsAddDto inputDto); +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetsApiServiceImpl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetsApiServiceImpl.java new file mode 100644 index 0000000..d4e165b --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/DataSetsApiServiceImpl.java @@ -0,0 +1,765 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.api.dataSets.service; + +import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.Page; +import com.github.pagehelper.page.PageMethod; +import net.northking.cctp.common.cache.EntityNameCache; +import net.northking.cctp.common.cache.EntityNameCatalog; +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.common.db.DefaultPagination; +import net.northking.cctp.common.db.OrderBy; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.db.annotation.DatabaseReadOnly; +import net.northking.cctp.common.db.excel.AbstractExcelService; +import net.northking.cctp.common.db.excel.ExcelHeader; +import net.northking.cctp.common.dto.CpLogAddDto; +import net.northking.cctp.common.enums.FileBusinessTypeEnum; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.common.feign.MonsterLogServer; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.common.s3.FileDownloadException; +import net.northking.cctp.common.s3.FileUploadException; +import net.northking.cctp.common.s3.NKFile; +import net.northking.cctp.common.s3.SimpleStorageService; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.dataPool.bus.LogRabbitMQPublisher; +import net.northking.cctp.dataPool.db.entity.DataSetEnvRel; +import net.northking.cctp.dataPool.db.entity.DataSetTree; +import net.northking.cctp.dataPool.db.entity.DataSets; +import net.northking.cctp.dataPool.db.service.DataSetEnvRelService; +import net.northking.cctp.dataPool.db.service.DataSetTreeService; +import net.northking.cctp.dataPool.db.service.DataSetsService; +import net.northking.cctp.dataPool.dto.dataSets.*; +import net.northking.cctp.dataPool.enums.DataHeaderType; +import net.northking.cctp.dataPool.enums.DataPoolError; +import net.northking.cctp.dataPool.feign.AttachmentFeignClient; +import net.northking.cctp.dataPool.feign.ProjectFeignClient; +import net.northking.cctp.dataPool.feign.ScriptFeignClient; +import net.northking.cctp.dataPool.feign.dto.AtuInputDataSetResultDto; +import net.northking.cctp.dataPool.utils.ExcelUtils; +import net.northking.cctp.dataPool.utils.MinioPathUtils; +import org.apache.poi.ss.usermodel.Workbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.*; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * 数据集服务实现类 + * + * @author maven-cctp-plugin + * @since 1.0 + */ + +@Service +@ConditionalOnMissingBean(name = "DataSetsApiServiceImpl") +public class DataSetsApiServiceImpl extends AbstractExcelService implements DataSetsApiService +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DataSetsApiServiceImpl.class); + + @Autowired + private DataSetsService dataSetsService; + @Autowired + private DataSetTreeService dataSetTreeService; + @Autowired + private DataSetEnvRelService dataSetEnvRelService; + @Autowired + private MinioPathUtils pathUtils; + @Autowired + private SimpleStorageService simpleStorageService; + @Autowired + private EntityNameCache entityNameCache; + @Autowired + private LogRabbitMQPublisher logPublisher; + @Autowired + private ProjectFeignClient projectFeignClient; + @Autowired + private ScriptFeignClient scriptFeignClient; + @Autowired + private AttachmentFeignClient attachmentFeignClient; + //= Excel 导入导出相关代码 start ==================// + @Override + public BasicService getService() + { + return this.dataSetsService; + } + + @Override + public ExcelHeader[] excelHeaders() + { + ExcelHeader dataSetId = new ExcelHeader("数据集id", "dataSetId", String.class); + ExcelHeader name = new ExcelHeader("数据集名称", "name", String.class); + ExcelHeader description = new ExcelHeader("描述", "description", String.class); + ExcelHeader proId = new ExcelHeader("系统id", "proId", String.class); + ExcelHeader tenantId = new ExcelHeader("租户id", "tenantId", String.class); + ExcelHeader fileAddr = new ExcelHeader("文件地址", "fileAddr", String.class); + ExcelHeader treeId = new ExcelHeader("目录id", "treeId", String.class); + ExcelHeader createdBy = new ExcelHeader("创建人", "createdBy", String.class); + ExcelHeader createdTime = new ExcelHeader("创建时间", "createdTime", Date.class); + ExcelHeader updatedBy = new ExcelHeader("更新人", "updatedBy", String.class); + ExcelHeader updatedTime = new ExcelHeader("更新时间", "updatedTime", Date.class); + return new ExcelHeader[]{}; + } + + /** + * Excel导入,入库之前的处理 + * @param records 从Excel读取到的记录 + * @return 待入库的记录 + */ + @Override + protected List beforeInsertBatch(List records) + { + return records; + } + + /** + * 写入Excel之前的处理
+ * 数据的特殊处理在此处加工处理 + * + * @param record 来自数据库记录 + * @return 待写入Excel的记录 + */ + @Override + protected DataSets beforeWriteExcel(DataSets record) + { + return record; + } + + //= Excel 导入导出相关代码 end =======================// + + //= 增删改查 相关代码 start ==================// + @Override + @DatabaseReadOnly + public Pagination pagingQuery(QueryByPage query) + { + DefaultPagination pagination = new DefaultPagination(); + //目录查询参数修改 + String treeId = query.getQuery().getTreeId(); + if (StringUtils.hasText(treeId)) { + List list = dataSetTreeService.queryChildrenTreeList(treeId); + if (!CollectionUtils.isEmpty(list)) { + List groupIds = list.stream().map(item->item.getId()).collect(Collectors.toList()); + query.getQuery().setTreeId(null); + query.getQuery().setTreeIds(groupIds); + } + } + //数据集查询租户隔离 + query.getQuery().setTenantId(NKSecurityContext.getTenantId()); + //处理分页参数 + handlePageParam(query); + pagination.setPageSize(query.getPageSize()); + pagination.setPageNo(query.getPageNo()); + Page page = PageMethod.startPage(query.getPageNo(), query.getPageSize()); //开始分页 + List result = dataSetsService.queryDataSets(query); + //处理返回数据 + for (DataSetsDetailDto detailDto : result) { + //创建修改人名称 + detailDto.setCreator(entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, detailDto.getCreatedBy())); + detailDto.setModifier(entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, detailDto.getUpdatedBy())); + } + pagination.setRecords(result); + pagination.setRecordCount(page.getTotal()); + return pagination; + } + + @Override + @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String add(DataSetsAddDto dto) + { + //名称校验 + Pattern p = Pattern.compile("[\\\\/:*?\"<>|]"); + if (p.matcher(dto.getName()).find()) { + throw new PlatformRuntimeException(DataPoolError.SET_NAME_IS_VALID); + } + //所选目录校验 + DataSetTree byPrimaryKey = dataSetTreeService.findByPrimaryKey(dto.getTreeId()); + if (null == byPrimaryKey || "0".equals(byPrimaryKey.getIsLeaf())) { + throw new PlatformRuntimeException(DataPoolError.SETS_DIR_VALID); + } + + // 校验目录下名称唯一 + boolean nameUnique = checkNameUnique(dto.getName(), dto.getTreeId(), null); + if (!nameUnique){ + throw new PlatformRuntimeException(DataPoolError.SET_NAME_NO_UNIQUE, dto.getName()); + } + + //创建实体 + String uuid = UUIDUtil.create32UUID(); + DataSets entity = new DataSets(); + BeanUtils.copyProperties(dto, entity); + entity.setDataSetId(uuid); + entity.setCreatedBy(NKSecurityContext.getUserId()); + entity.setCreatedTime(new Date()); + entity.setUpdatedBy(entity.getCreatedBy()); + entity.setUpdatedTime(entity.getCreatedTime()); + entity.setTenantId(NKSecurityContext.getTenantId()); + this.dataSetsService.insert(entity); + return uuid; + } + + private boolean checkNameUnique(String name, String treeId, String id){ + DataSets dataSets = new DataSets(); + dataSets.setName(name); + dataSets.setTreeId(treeId); + List setsList = this.dataSetsService.query(dataSets); + if (setsList != null && setsList.size() > 0){ + DataSets sets = setsList.get(0); + if (!sets.getDataSetId().equals(id)){ + return Boolean.FALSE; + } + } + return Boolean.TRUE; + } + + @Override + @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Integer updateByPK(DataSetsUpdateDto dto) throws IllegalAccessException + { + //数据集存在性校验 + DataSets byPrimaryKey = dataSetsService.findByPrimaryKey(dto.getDataSetId()); + if (null == byPrimaryKey) { + throw new PlatformRuntimeException(DataPoolError.SETS_NO_EXISTS); + } + //名称校验 + Pattern p = Pattern.compile("[\\\\/:*?\"<>|]"); + if (p.matcher(dto.getName()).find()) { + throw new PlatformRuntimeException(DataPoolError.SET_NAME_IS_VALID); + } + + // 校验目录下名称唯一 + boolean nameUnique = checkNameUnique(dto.getName(), dto.getTreeId(), dto.getDataSetId()); + if (!nameUnique){ + throw new PlatformRuntimeException(DataPoolError.SET_NAME_NO_UNIQUE, dto.getName()); + } + + DataSets entity = new DataSets(); + BeanUtils.copyProperties(byPrimaryKey, entity); + entity.setUpdatedBy(NKSecurityContext.getUserId()); + entity.setDescription(dto.getDescription()); + entity.setUpdatedTime(new Date()); + entity.setName(dto.getName()); + return this.dataSetsService.updateByPrimaryKey(entity); + } + + @Override + @DatabaseReadOnly + public DataSetsDetailDto findByPK(String uuid) + { + //获取数据集 + DataSets byPrimaryKey = dataSetsService.findByPrimaryKey(uuid); + if (null == byPrimaryKey) { + throw new PlatformRuntimeException(DataPoolError.SETS_NO_EXISTS); + } + DataSetsDetailDto dto = new DataSetsDetailDto(); + BeanUtils.copyProperties(byPrimaryKey, dto); + //获取文件数据 + if (StringUtils.hasText(dto.getFileAddr())) { + JSONObject data = downloadFile(dto.getFileAddr()); + DataSetsSaveDto dataSetsSaveDto = null; + if (!ObjectUtils.isEmpty(data)) { + dataSetsSaveDto = data.toJavaObject(DataSetsSaveDto.class); + } + if (null != dataSetsSaveDto) { + dto.setTableContent(dataSetsSaveDto.getTableContent()); + dto.setTableHeader(dataSetsSaveDto.getTableHeader()); + } + } + //封装数据集信息 + dto.setCreator(entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, dto.getCreatedBy())); + dto.setModifier(entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, dto.getUpdatedBy())); + return dto; + } + + @Override + @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Integer deleteByPK(String uuid) + { + //数据集存在性校验 + DataSets byPrimaryKey = dataSetsService.findByPrimaryKey(uuid); + if (null == byPrimaryKey) { + return 0; + } + //校验数据是否存在关联 + List list = new ArrayList<>(); + list.add(uuid); + List dtos = scriptFeignClient.selectLinkBySetId(list); + for (AtuInputDataSetResultDto dto : dtos) { + if (dto.getCountNum() > 0){ + throw new PlatformRuntimeException(DataPoolError.DATA_SET_HAS_LINK); + } + } + + //删除对应文件 + String fileAddr = byPrimaryKey.getFileAddr(); + if (StringUtils.hasText(fileAddr)) { + deleteFile(fileAddr); + } + deleteDataSetEnv(byPrimaryKey); + //删除库数据 + int result = this.dataSetsService.deleteByPrimaryKey(byPrimaryKey); + //删除数据集增加平台日志 + CpLogAddDto cpLogAddDto = new CpLogAddDto(); + String projectName = entityNameCache.translateById(EntityNameCatalog.MONSTER_SYSTEM.name(), byPrimaryKey.getProId()); + cpLogAddDto.setContent("【删除静态数据】系统:" + projectName + "数据集名称:" + byPrimaryKey.getName()); + cpLogAddDto.setModule("静态数据管理"); + cpLogAddDto.setType("3"); + // 发送日志到 monster + MonsterLogServer.sendLogToMonster(cpLogAddDto); + logPublisher.deployLogContent(cpLogAddDto); + return result; + } + + private void deleteDataSetEnv(DataSets byPrimaryKey) { + DataSetEnvRel record = new DataSetEnvRel(); + record.setDataSetId(byPrimaryKey.getDataSetId()); + List dataSetEnvRels = dataSetEnvRelService.query(record); + dataSetEnvRels.forEach(dataSetEnvRel -> { + if (StringUtils.hasText(dataSetEnvRel.getFileAddr())) { + deleteFile(dataSetEnvRel.getFileAddr()); + } + }); + //删除环境数据 + List deleteIds = dataSetEnvRels.stream().map(DataSetEnvRel::getId).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(deleteIds)) { + dataSetEnvRelService.deleteByPrimaryKeys(deleteIds); + } + } + + @Override + @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Integer deleteBatch(DataSetsDeleteDto dto) + { + List setIds = dto.getSetIds(); + if (CollectionUtils.isEmpty(setIds)) { + return 0; + } + + List dtos = scriptFeignClient.selectLinkBySetId(dto.getSetIds()); + for (AtuInputDataSetResultDto resultDto : dtos) { + if (resultDto.getCountNum() > 0){ + throw new PlatformRuntimeException(DataPoolError.DATA_SET_HAS_LINK); + } + } + //删除文件 记录删除的系统和数据集 + List dataSets = dataSetsService.queryByIds(setIds); + List proIds = new ArrayList<>(); + List setNames = new ArrayList<>(); + for (DataSets dataSet : dataSets) { + if (null != dataSet) { + if (StringUtils.hasText(dataSet.getProId())) { + proIds.add(dataSet.getProId()); + } + if (StringUtils.hasText(dataSet.getName())) { + setNames.add(dataSet.getName()); + } + if (StringUtils.hasText(dataSet.getFileAddr())) { + deleteFile(dataSet.getFileAddr()); + } + } + } + //未获取到系统或数据集名称 + if (CollectionUtils.isEmpty(proIds) || CollectionUtils.isEmpty(setNames)) { + return 0; + } + for (DataSets dataSet : dataSets) { + deleteDataSetEnv(dataSet); + } + //删除数据 + Integer result = dataSetsService.deleteByIds(setIds); + //批量删除数据集增加平台日志(均为同系统 + String projectName = entityNameCache.translateById(EntityNameCatalog.MONSTER_SYSTEM.name(), proIds.get(0)); + CpLogAddDto cpLogAddDto = new CpLogAddDto(); + cpLogAddDto.setContent("【批量删除静态数据集】:系统" + projectName + ",共" + result + "条"); + cpLogAddDto.setModule("静态数据管理"); + cpLogAddDto.setType("3"); + cpLogAddDto.setContentDetails(setNames); + MonsterLogServer.sendLogToMonster(cpLogAddDto); + logPublisher.deployLogContent(cpLogAddDto); + return result; + } + + @Override + @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Boolean save(DataSetsSaveDto dto) { + //获取数据集数据 + String dataSetId = dto.getDataSetId(); + DataSets byPrimaryKey = dataSetsService.findByPrimaryKey(dataSetId); + if (null == byPrimaryKey) { + throw new PlatformRuntimeException(DataPoolError.SETS_NO_EXISTS); + } + //校验表头是否正确 + List tableHeader = dto.getTableHeader(); + List colNameList = checkColumnList(tableHeader); + //校验数据是否正确 + Map> tableContent = dto.getTableContent(); + if (!colNameList.containsAll(tableContent.keySet())) { + throw new PlatformRuntimeException(DataPoolError.HEADER_CONTENT_NO_MATCH); + } + //存储文件 + String path = null; + try { + String filePath = uploadFile(dto, byPrimaryKey.getDataSetId(), FileBusinessTypeEnum.STATIC_DATA_SET); + if (StringUtils.hasText(filePath)) { + path = filePath; + } + }catch (Exception e) { + throw new PlatformRuntimeException(DataPoolError.FILE_UPLOAD_ERROR); + } + //更新数据集数据 + DataSets dataSets = new DataSets(); + BeanUtils.copyProperties(byPrimaryKey,dataSets); + dataSets.setFileAddr(path); + dataSets.setUpdatedBy(NKSecurityContext.getUserId()); + dataSets.setUpdatedTime(new Date()); + dataSetsService.updateByPrimaryKey(dataSets); + //删除原文件 + String oldPath = byPrimaryKey.getFileAddr(); + if (StringUtils.hasText(oldPath)) { + deleteFile(oldPath); + } + return true; + } + + @Override + public Boolean checkTableHeader(ColumnCheckDto dto) { + String dataSetId = dto.getDataSetId(); + DataSets byPrimaryKey = dataSetsService.findByPrimaryKey(dataSetId); + if (null == byPrimaryKey) { + throw new PlatformRuntimeException(DataPoolError.SETS_NO_EXISTS); + } + if (null == dto.getColumnInfo()) { + throw new PlatformRuntimeException(DataPoolError.COLUMN_IS_NULL); + } + String fileAddr = byPrimaryKey.getFileAddr(); + //新增列 + if (StringUtils.hasText(fileAddr)) { + JSONObject dataInfo = downloadFile(fileAddr); + if (!ObjectUtils.isEmpty(dataInfo)) { + DataSetsSaveDto data = dataInfo.toJavaObject(DataSetsSaveDto.class); + List tableHeader = data.getTableHeader(); + List columnList = tableHeader.stream().map(item->item.getName()).collect(Collectors.toList()); + if (columnList.contains(dto.getColumnInfo().getName())) { + throw new PlatformRuntimeException(DataPoolError.COLUMN_IS_EXSITS); + } + } + } + return true; + } + + @Override + public void exportDataSet(HttpServletResponse response, String dataSetId, String fileName) { + DataSets dataSet = dataSetsService.findByPrimaryKey(dataSetId); + if (null == dataSet) { + throw new PlatformRuntimeException(DataPoolError.SETS_NO_EXISTS); + } + dataSetDownloadExecl(response, dataSet.getName()); + ServletOutputStream outputStream = null; + try { + Workbook workbook = exportDataTable(dataSet); + outputStream = response.getOutputStream(); + workbook.write(outputStream); + outputStream.flush(); + } catch (IOException e) { + logger.error("导出" + dataSet.getName() + "数据集文件失败:", e); + } finally { + if (null != outputStream) { + try { + outputStream.close(); + } catch (IOException e) { + logger.error("",e); + } + } + } + } + + @Override + public void downloadTemplate(HttpServletResponse response, String fileName, DataSetsSaveDto saveDto) { + DataSets dataSet = dataSetsService.findByPrimaryKey(saveDto.getDataSetId()); + if (null == dataSet) { + throw new PlatformRuntimeException(DataPoolError.SETS_NO_EXISTS); + } + dataSetDownloadExecl(response, dataSet.getName() + "模板"); + ServletOutputStream outputStream = null; + saveDto.setTableContent(null); + try { + Workbook workbook = ExcelUtils.exportToExcel(saveDto, dataSet.getName(), true); + outputStream = response.getOutputStream(); + workbook.write(outputStream); + outputStream.flush(); + } catch (IOException e) { + logger.error("导出" + dataSet.getName() + "模板文件失败:", e); + } finally { + if (null != outputStream) { + try { + outputStream.close(); + } catch (IOException e) { + logger.error("",e); + } + } + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class) + public String createDataSet(DataSetsAddDto inputDto) { + String setId = add(inputDto); + List headers = inputDto.getHeaders(); + List> tableData = inputDto.getTableData(); + //保存表数据 + if (!CollectionUtils.isEmpty(headers)) { + DataSetsSaveDto saveDto = new DataSetsSaveDto(); + List headerList = new ArrayList<>(); + //记录表头信息 + for (String colName : headers) { + if(!StringUtils.hasText(colName)) { + throw new PlatformRuntimeException(DataPoolError.COLUMN_IS_NULL); + } + DataHeaderDto dataHeaderDto = new DataHeaderDto(); + dataHeaderDto.setName(colName); + dataHeaderDto.setType("string"); + dataHeaderDto.setIsRepeat("1"); + headerList.add(dataHeaderDto); + } + saveDto.setTableHeader(headerList); + + // 同步至其他环境只需要表头即可 + DataSetsSaveDto syncSaveDto = new DataSetsSaveDto(); + syncSaveDto.setTableHeader(headerList); + + //记录表数据 + Map> contentList = new HashMap<>(); + for(int col = 0; col < headers.size(); col++) { + String name = headers.get(col); + List colDatas = new ArrayList<>(); + //逐行获取该列值 + for (int row = 0; row < tableData.size(); row++) { + DataContentDto contentDto = new DataContentDto(); + Map rowData = tableData.get(row); + String val = ""; + //有值替换 无值存空串 + if (rowData.containsKey(name)) { + Object value = rowData.get(name); + if (value != null && StringUtils.hasText(value.toString()) && !"null".equals(value.toString())) { + val = value.toString(); + } + } + contentDto.setValue(val); + contentDto.setTime("0"); + colDatas.add(contentDto); + } + contentList.put(name,colDatas); + } + saveDto.setTableContent(contentList); + //将数据上传文件服务器 + String path = uploadFile(saveDto, setId, FileBusinessTypeEnum.STATIC_DATA_SET); + if (StringUtils.hasText(path)) { + DataSets dataSets = new DataSets(); + dataSets.setDataSetId(setId); + dataSets.setFileAddr(path); + dataSetsService.updateByPrimaryKey(dataSets); + //更新到每个环境下 + List envIds = projectFeignClient.selectEnvIds(inputDto.getProId()); + int seq = 1; + for (String envId : envIds) { + DataSetEnvRel dataSetEnvRel = new DataSetEnvRel(); + dataSetEnvRel.setId(UUIDUtil.create32UUID());//主键 + dataSetEnvRel.setDataSetId(setId);//数据集id + dataSetEnvRel.setEnvId(envId);//环境id + // 环境相同保存标题和数据,其他环境只保存表头 + if (Objects.equals(inputDto.getEnvId(), envId)){ + String envPath = uploadFile(saveDto, dataSetEnvRel.getId(), FileBusinessTypeEnum.STATIC_DATA_SET_ENV); + dataSetEnvRel.setFileAddr(envPath);//文件路径 + }else { + String syncFilePath = uploadFile(syncSaveDto, dataSetEnvRel.getId(), FileBusinessTypeEnum.STATIC_DATA_SET_ENV); + dataSetEnvRel.setFileAddr(syncFilePath);//文件路径 + } + dataSetEnvRel.setSeq(seq);//排序 + dataSetEnvRel.setCreatedBy(NKSecurityContext.getUserId()); + dataSetEnvRel.setUpdatedBy(NKSecurityContext.getUserId()); + dataSetEnvRel.setCreatedTime(new Date()); + dataSetEnvRel.setUpdatedTime(new Date()); + dataSetEnvRel.setTenantId(NKSecurityContext.getTenantId()); + dataSetEnvRelService.insert(dataSetEnvRel); + } + }else { + throw new PlatformRuntimeException(DataPoolError.FILE_ID_ERROR); + } + } + return setId; + } + + private void dataSetDownloadExecl(HttpServletResponse response, String fileName) { + response.reset(); + response.setStatus(HttpStatus.OK.value()); + response.setCharacterEncoding("UTF-8"); + try { + fileName = URLEncoder.encode(fileName,"UTF-8"); + } catch (UnsupportedEncodingException e) { + logger.error("文件名转换编码异常", e); + } + response.setHeader("Content-Type", "application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx"); + } + + private Workbook exportDataTable(DataSets dataSet) { + String fileAddr = dataSet.getFileAddr(); + if (StringUtils.hasText(fileAddr)) { + JSONObject jsonObject = downloadFile(fileAddr); + if (!ObjectUtils.isEmpty(jsonObject)) { + DataSetsSaveDto dataInfo = jsonObject.toJavaObject(DataSetsSaveDto.class); + return ExcelUtils.exportToExcel(dataInfo, dataSet.getName(), true); + }else { + return ExcelUtils.exportToExcel(null, dataSet.getName(), true); + } + }else { + return ExcelUtils.exportToExcel(null, dataSet.getName(), true); + } + } + + /** + * 校验表头是否正确 + * @param columnList + * @return + */ + private List checkColumnList(List columnList) { + List names = new ArrayList<>(); + //校验是否存在同名列 + if (!CollectionUtils.isEmpty(columnList)) { + names = new ArrayList<>(); + for (DataHeaderDto dataHeaderDto : columnList) { + if (null == dataHeaderDto) { + throw new PlatformRuntimeException(DataPoolError.COLUMN_IS_NULL); + } + //列名称校验 + String headName = dataHeaderDto.getName(); + if (!StringUtils.hasText(headName)) { + throw new PlatformRuntimeException(DataPoolError.COLUMN_NAME_IS_NULL); + } + if (headName.length() > 30) { + throw new PlatformRuntimeException(DataPoolError.COLUMN_NAME_IS_TOO_LONG); + } + if (names.contains(headName)) { + throw new PlatformRuntimeException(DataPoolError.COLUMN_IS_EXSITS); + } + //列类型校验 + String headType = dataHeaderDto.getType(); + if (!StringUtils.hasText(headType)) { + throw new PlatformRuntimeException(DataPoolError.COLUMN_TYPE_IS_NULL); + } + String code = DataHeaderType.getCode(headType); + if (!StringUtils.hasText(code)) { + throw new PlatformRuntimeException(DataPoolError.COLUMN_TYPE_IS_WRONG); + } + names.add(headName); + } + } + return names; + } + + /** + * 处理分页查询参数 + * + * @param query + */ + private void handlePageParam(QueryByPage query) { + if (query.getPageNo() <= 0) { + query.setPageNo(1); + } + if (query.getPageSize() <= 0 || query.getPageSize() > 500) { + query.setPageSize(500); + } + OrderBy sort = query.toSqlOrderBy(); + if (sort != null && sort.isNotEmpty() && StringUtils.hasText(sort.toString())) { + PageMethod.orderBy(sort.toString()); + } + } + + /** + * 根据url下载文件 + * @param url + * @return + */ + private JSONObject downloadFile(String url) { + String[] resultPath = MinioPathUtils.idToPath(url); + InputStream inputStream = null; + JSONObject scriptData = null; + try { + inputStream = simpleStorageService.downloadAsStream(resultPath[0], "/" + resultPath[1]); + scriptData = MinioPathUtils.getFileContent(inputStream, JSONObject.class); + return scriptData; + } catch (FileDownloadException e) { + logger.error("读取原文件失败,失败原因:", e); + throw new PlatformRuntimeException(DataPoolError.FILE_DOWNLOAD_ERROR); + } finally { + if (null != inputStream) { + try { + inputStream.close(); + } catch (IOException e) { + logger.error("",e); + } + } + } + } + + /** + * 根据url删除服务器端文件 + * @param url + */ + private void deleteFile(String url) { + String[] pathData = MinioPathUtils.idToPath(url); + try { + simpleStorageService.delete(pathData[0], "/" + pathData[1]); + } catch (Exception e) { + throw new PlatformRuntimeException(DataPoolError.FILE_DEL_ERROR); + } + } + + /** + * 上传文件 + * @param scriptJsonStr + * @return + */ + private String uploadFile(Object scriptJsonStr, String objId, FileBusinessTypeEnum businessCode) { + File file = MinioPathUtils.objectToJsonFile(scriptJsonStr); + try { + NKFile nkFile = simpleStorageService.upload(NKSecurityContext.getTenantId(), file, objId, businessCode); + return MinioPathUtils.pathToId(NKSecurityContext.getTenantId(), nkFile.getId()); + } catch (FileUploadException e) { + logger.error("上传文件出错", e); + throw new PlatformRuntimeException(DataPoolError.FILE_UPLOAD_ERROR); + } finally { + boolean delete = file.delete(); + if (!delete) { + logger.error("删除文件失败"); + } + } + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/TreeIndexNoApiService.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/TreeIndexNoApiService.java new file mode 100644 index 0000000..f33712c --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/TreeIndexNoApiService.java @@ -0,0 +1,7 @@ +package net.northking.cctp.dataPool.api.dataSets.service; + +import java.util.List; + +public interface TreeIndexNoApiService { + List genIndexNo(String project, String noType, long count); +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/TreeIndexNoApiServiceImpl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/TreeIndexNoApiServiceImpl.java new file mode 100644 index 0000000..790fb14 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/api/dataSets/service/TreeIndexNoApiServiceImpl.java @@ -0,0 +1,39 @@ +package net.northking.cctp.dataPool.api.dataSets.service; + +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.common.sequence.SequenceService; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +@ConditionalOnMissingBean(name = "TreeIndexNoApiServiceImpl") +public class TreeIndexNoApiServiceImpl implements TreeIndexNoApiService{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(TreeIndexNoApiServiceImpl.class); + + @Autowired + private SequenceService sequenceService; + + @Override + public List genIndexNo(String project, String noType, long count) { + List result = new ArrayList<>(); + String suffix = "data-pool-no"; + String after = "dataPool"; + String projectId = StringUtils.isEmpty(project) ? "tenant" : project; + String key = after + ":" + NKSecurityContext.getTenantId() + ":" + suffix + ":" + projectId + ":" + noType; + long value = sequenceService.skipValue(key, (int) count); + for (long i = value; i > value - count; i--) { + result.add(0, Integer.valueOf(i+"")); + } + return result; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/bus/LogRabbitMQPublisher.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/bus/LogRabbitMQPublisher.java new file mode 100644 index 0000000..7f840fc --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/bus/LogRabbitMQPublisher.java @@ -0,0 +1,43 @@ +package net.northking.cctp.dataPool.bus; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.common.dto.CpLogAddDto; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.dataPool.constants.DataPoolConstant; +import net.northking.cctp.dataPool.enums.DataPoolError; +import org.springframework.amqp.core.MessageBuilder; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; + +@Component +public class LogRabbitMQPublisher { + @Autowired + private RabbitTemplate rabbitTemplate; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private HttpServletRequest request; + + public void deployLogContent(CpLogAddDto cpLogAddDto) { + byte[] json; + try { + cpLogAddDto.setRemoteAddr(request.getRemoteAddr()); + json = objectMapper.writeValueAsBytes(cpLogAddDto); + } catch (JsonProcessingException e) { + throw new PlatformRuntimeException(DataPoolError.INSERT_LOG_FAIL); + } + MessageBuilder mb = MessageBuilder.withBody(json); + mb.setContentType(MediaType.APPLICATION_JSON_VALUE); + mb.setHeader(DataPoolConstant.CCTP_USER_ID, NKSecurityContext.getUserId()); + mb.setHeader(DataPoolConstant.SAAS_TENANT_ID, NKSecurityContext.getTenantId()); + rabbitTemplate.send(DataPoolConstant.PLATFORM_LOG_INSERT_REQ, mb.build()); + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/constants/DataPoolConstant.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/constants/DataPoolConstant.java new file mode 100644 index 0000000..301728b --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/constants/DataPoolConstant.java @@ -0,0 +1,33 @@ +package net.northking.cctp.dataPool.constants; + +public class DataPoolConstant { + + public static final String FILE_XLSX = ".xlsx"; + + public static final String FILE_XLS = ".xls"; + + public static final String CCTP_USER_ID= "CCTP_User_ID"; + + public static final String SAAS_TENANT_ID= "SaaS_Tenant_ID"; + + public static final String PLATFORM_LOG_INSERT_REQ= "Platform.Log.Insert.REQ"; + + public static final String ADD_URL= "addURL"; + + public static final String CPLOGADDDTO_LOG_TYPE_DELETE = "3"; + public static final String CPLOGADDDTO_DATA_POOL_MANAGEMENT = "系统数据池管理"; + public static final String CPLOGADDDTO_CONTENT_DELETE = "删除"; + + public static final String FUZZY_DATA_QUOTE_PREFIX = "%{"; + + public static final String FUZZY_DATA_QUOTE_SUFFIX = "}"; + + /** + * 输入项数据集引用类型-静态数据 + */ + public static final String INPUT_SET_QUOTE_TYPE_STATIC = "1"; + /** + * 输入项数据集引用类型-模糊数据 + */ + public static final String INPUT_SET_QUOTE_TYPE_FUZZY = "2"; +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataResourcePackageDao.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataResourcePackageDao.java new file mode 100644 index 0000000..40f201c --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataResourcePackageDao.java @@ -0,0 +1,44 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.dao; + +import feign.Param; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.dataPool.db.entity.DataResourcePackage; +import net.northking.cctp.dataPool.db.mapper.DataResourcePackageMapper; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageDetailDto; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageQueryDto; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):资源包 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface DataResourcePackageDao extends DataResourcePackageMapper +{ + /** + * 条件查询资源包列表 + * @param queryByPage + * @return + */ + List getDataResourcePackages(@Param("query") QueryByPage queryByPage); + + /** + * 根据id列表查询资源包 + * @param idList + * @return + */ + List queryByIds(@Param("list") List idList); + + // ---- The End by Generator ----// + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataRuleDao.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataRuleDao.java new file mode 100644 index 0000000..da65333 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataRuleDao.java @@ -0,0 +1,53 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.dao; + +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.dataPool.db.entity.DataRule; +import net.northking.cctp.dataPool.db.mapper.DataRuleMapper; +import net.northking.cctp.dataPool.dto.dataRule.DataRuleDetailDto; +import net.northking.cctp.dataPool.dto.dataRule.DataRuleQueryDto; +import net.northking.cctp.dataPool.dto.dataRule.DataRuleUpdateDto; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Set; + +/** + * Mybatis数据库持久层(业务层):数据规则表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface DataRuleDao extends DataRuleMapper +{ + /** + * 查询同名的其他规则 + * @param dto + * @return + */ + Integer queryRuleByName(DataRuleUpdateDto dto); + + /** + * 条件查询数据规则 + * @param queryByPage + * @return + */ + List getDataRules(QueryByPage queryByPage); + + /** + * 根据id集合查询数据规则 + * @param idSet id集合 + * @return 结果集 + */ + List queryByIdSet(@Param("idSet") Set idSet); + + // ---- The End by Generator ----// + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataSetEnvRelDao.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataSetEnvRelDao.java new file mode 100644 index 0000000..d8936f3 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataSetEnvRelDao.java @@ -0,0 +1,31 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.dao; + +import net.northking.cctp.dataPool.db.mapper.DataSetEnvRelMapper; +import net.northking.cctp.dataPool.dto.dataSets.AtuScriptInputSetQuoteFeignDto; +import net.northking.cctp.dataPool.dto.dataSets.AtuScriptInputSetQuoteFieldDto; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):数据集环境关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-23 17:53:02
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface DataSetEnvRelDao extends DataSetEnvRelMapper +{ + AtuScriptInputSetQuoteFieldDto selectDataUrlAndTreeName(AtuScriptInputSetQuoteFieldDto atuScriptInputSetQuoteFieldDto); + + List getDataSetFile(@Param("list")List list, @Param("envId")String envId); + // ---- The End by Generator ----// + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataSetTreeDao.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataSetTreeDao.java new file mode 100644 index 0000000..99c5c5f --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataSetTreeDao.java @@ -0,0 +1,60 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.dao; + +import net.northking.cctp.dataPool.db.entity.DataSetTree; +import net.northking.cctp.dataPool.db.mapper.DataSetTreeMapper; +import net.northking.cctp.dataPool.dto.dataSets.DataSetTreeDetailDto; +import net.northking.cctp.dataPool.dto.dataSets.DataSetTreeMoveDto; +import net.northking.cctp.dataPool.dto.dataSets.DataSetTreeQueryDto; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):数据集树目录表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface DataSetTreeDao extends DataSetTreeMapper +{ + /** + * 修改子节点名称路径 + * @param childSetTree + * @param namePathNew + * @return + */ + int updateChildNamePath(@Param("tree") DataSetTree childSetTree, @Param("newPath") String namePathNew); + + /** + * 条件查询数据集目录节点 + * @param setTreeQueryDto + * @return + */ + List selectDataSetTree(DataSetTreeQueryDto setTreeQueryDto); + + /** + * 根据目录id查询子目录列表 + * @param treeId + * @return + */ + List queryChildrenTreeList(String treeId); + + List queryByIds(List list); + + int countMaxLevelNo(DataSetTree queryLevel); + + void updateSeqByMove(DataSetTreeMoveDto childUp); + + int updateChildIdPath(@Param("tree") DataSetTree child, @Param("newPath") String path); + + // ---- The End by Generator ----// + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataSetsDao.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataSetsDao.java new file mode 100644 index 0000000..f4354df --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/dao/DataSetsDao.java @@ -0,0 +1,50 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.dao; + +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.dataPool.db.entity.DataSets; +import net.northking.cctp.dataPool.db.mapper.DataSetsMapper; +import net.northking.cctp.dataPool.dto.dataSets.DataSetsDetailDto; +import net.northking.cctp.dataPool.dto.dataSets.DataSetsQueryDto; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):数据集 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:39
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface DataSetsDao extends DataSetsMapper +{ + // ---- The End by Generator ----// + + /** + * 条件查询数据集列表 + * @param query + * @return + */ + List queryDataSets(QueryByPage query); + + /** + * 根据id列表查询数据集 + * @param setIds + * @return + */ + List queryByIds(@Param("setIds") List setIds); + + /** + * 根据id列表批量删除 + * @param setIds + * @return + */ + Integer deleteByIds(@Param("setIds") List setIds); +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataResourcePackage.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataResourcePackage.java new file mode 100644 index 0000000..f114770 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataResourcePackage.java @@ -0,0 +1,286 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.common.db.entity.Entity; +import net.northking.cctp.common.saas.db.TenantPartition; + +import javax.validation.constraints.Size; +import java.util.Date; + + +/** + * 资源包 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "资源包") +public class DataResourcePackage extends TenantPartition implements Entity +{ + public static final String KEY_id = "id"; + public static final String KEY_name = "name"; + public static final String KEY_memo = "memo"; + public static final String KEY_packageAddr = "packageAddr"; + public static final String KEY_proId = "proId"; + public static final String KEY_tenantId = "tenantId"; + public static final String KEY_createdBy = "createdBy"; + public static final String KEY_updatedBy = "updatedBy"; + public static final String KEY_createdTime = "createdTime"; + public static final String KEY_updatedTime = "updatedTime"; + + /** + * id
+ */ + @ApiModelProperty("id") + @Size(max = 32, message="id-id: 数据长度不能 > 32" ) + private String id; + /** + * 资源包名称
+ */ + @ApiModelProperty("资源包名称") + @Size(max = 32, message="资源包名称-name: 数据长度不能 > 32" ) + private String name; + /** + * 资源包描述
+ */ + @ApiModelProperty("资源包描述") + @Size(max = 128, message="资源包描述-memo: 数据长度不能 > 128" ) + private String memo; + /** + * 资源包存放地址
+ */ + @ApiModelProperty("资源包存放地址") + @Size(max = 128, message="资源包存放地址-packageAddr: 数据长度不能 > 128" ) + private String packageAddr; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id-proId: 数据长度不能 > 32" ) + private String proId; + /** + * 租户id
+ */ + @ApiModelProperty("租户id") + @Size(max = 32, message="租户id-tenantId: 数据长度不能 > 32" ) + private String tenantId; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + @Size(max = 32, message="创建人-createdBy: 数据长度不能 > 32" ) + private String createdBy; + /** + * 更新人
+ */ + @ApiModelProperty("更新人") + @Size(max = 32, message="更新人-updatedBy: 数据长度不能 > 32" ) + private String updatedBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 更新时间
+ */ + @ApiModelProperty("更新时间") + private Date updatedTime; + + /** + * id
+ */ + public String getId() + { + return id; + } + + /** + * id
+ * + * @param id id + */ + public void setId(String id) + { + this.id = id; + } + /** + * 资源包名称
+ */ + public String getName() + { + return name; + } + + /** + * 资源包名称
+ * + * @param name 资源包名称 + */ + public void setName(String name) + { + this.name = name; + } + /** + * 资源包描述
+ */ + public String getMemo() + { + return memo; + } + + /** + * 资源包描述
+ * + * @param memo 资源包描述 + */ + public void setMemo(String memo) + { + this.memo = memo; + } + /** + * 资源包存放地址
+ */ + public String getPackageAddr() + { + return packageAddr; + } + + /** + * 资源包存放地址
+ * + * @param packageAddr 资源包存放地址 + */ + public void setPackageAddr(String packageAddr) + { + this.packageAddr = packageAddr; + } + /** + * 系统id
+ */ + public String getProId() + { + return proId; + } + + /** + * 系统id
+ * + * @param proId 系统id + */ + public void setProId(String proId) + { + this.proId = proId; + } + /** + * 租户id
+ */ + public String getTenantId() + { + return tenantId; + } + + /** + * 租户id
+ * + * @param tenantId 租户id + */ + public void setTenantId(String tenantId) + { + this.tenantId = tenantId; + } + /** + * 创建人
+ */ + public String getCreatedBy() + { + return createdBy; + } + + /** + * 创建人
+ * + * @param createdBy 创建人 + */ + public void setCreatedBy(String createdBy) + { + this.createdBy = createdBy; + } + /** + * 更新人
+ */ + public String getUpdatedBy() + { + return updatedBy; + } + + /** + * 更新人
+ * + * @param updatedBy 更新人 + */ + public void setUpdatedBy(String updatedBy) + { + this.updatedBy = updatedBy; + } + /** + * 创建时间
+ */ + public Date getCreatedTime() + { + if(createdTime != null) + { + return (Date)createdTime.clone(); + } + return null; + } + + /** + * 创建时间
+ * + * @param createdTime 创建时间 + */ + public void setCreatedTime(Date createdTime) + { + if(createdTime != null) + { + this.createdTime = (Date)createdTime.clone(); + } + } + /** + * 更新时间
+ */ + public Date getUpdatedTime() + { + if(updatedTime != null) + { + return (Date)updatedTime.clone(); + } + return null; + } + + /** + * 更新时间
+ * + * @param updatedTime 更新时间 + */ + public void setUpdatedTime(Date updatedTime) + { + if(updatedTime != null) + { + this.updatedTime = (Date)updatedTime.clone(); + } + } + + public DataResourcePackage() + { + } + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataRule.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataRule.java new file mode 100644 index 0000000..4719ab5 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataRule.java @@ -0,0 +1,312 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.common.db.entity.Entity; +import net.northking.cctp.common.saas.db.TenantPartition; + +import javax.validation.constraints.Size; +import java.util.Date; + + + + +/** + * 数据规则表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "数据规则表") +public class DataRule extends TenantPartition implements Entity +{ + public static final String KEY_ruleId = "ruleId"; + public static final String KEY_name = "name"; + public static final String KEY_type = "type"; + public static final String KEY_contentExpression = "contentExpression"; + public static final String KEY_jarIds = "jarIds"; + public static final String KEY_proId = "proId"; + public static final String KEY_tenantId = "tenantId"; + public static final String KEY_createdBy = "createdBy"; + public static final String KEY_createdTime = "createdTime"; + public static final String KEY_updatedBy = "updatedBy"; + public static final String KEY_updatedTime = "updatedTime"; + + /** + * 规则id
+ */ + @ApiModelProperty("规则id") + @Size(max = 32, message="规则id-ruleId: 数据长度不能 > 32" ) + private String ruleId; + /** + * 规则名称
+ */ + @ApiModelProperty("规则名称") + @Size(max = 32, message="规则名称-name: 数据长度不能 > 32" ) + private String name; + /** + * 规则类型
+ */ + @ApiModelProperty("规则类型") + @Size(max = 1, message="规则类型-type: 数据长度不能 > 1" ) + private String type; + /** + * 正则表达式、脚本编码
+ */ + @ApiModelProperty("正则表达式、脚本编码") + @Size(max = 65535, message="正则表达式、脚本编码-contentExpression: 数据长度不能 > 65535" ) + private String contentExpression; + /** + * 资源包集合
+ */ + @ApiModelProperty("资源包集合") + @Size(max = 1024, message="资源包集合-jarIds: 数据长度不能 > 1024" ) + private String jarIds; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id-proId: 数据长度不能 > 32" ) + private String proId; + /** + * 租户id
+ */ + @ApiModelProperty("租户id") + @Size(max = 32, message="租户id-tenantId: 数据长度不能 > 32" ) + private String tenantId; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + @Size(max = 32, message="创建人-createdBy: 数据长度不能 > 32" ) + private String createdBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 更新人
+ */ + @ApiModelProperty("更新人") + @Size(max = 32, message="更新人-updatedBy: 数据长度不能 > 32" ) + private String updatedBy; + /** + * 更新时间
+ */ + @ApiModelProperty("更新时间") + private Date updatedTime; + + /** + * 规则id
+ */ + public String getRuleId() + { + return ruleId; + } + + /** + * 规则id
+ * + * @param ruleId 规则id + */ + public void setRuleId(String ruleId) + { + this.ruleId = ruleId; + } + /** + * 规则名称
+ */ + public String getName() + { + return name; + } + + /** + * 规则名称
+ * + * @param name 规则名称 + */ + public void setName(String name) + { + this.name = name; + } + /** + * 规则类型
+ */ + public String getType() + { + return type; + } + + /** + * 规则类型
+ * + * @param type 规则类型 + */ + public void setType(String type) + { + this.type = type; + } + /** + * 正则表达式、脚本编码
+ */ + public String getContentExpression() + { + return contentExpression; + } + + /** + * 正则表达式、脚本编码
+ * + * @param contentExpression 正则表达式、脚本编码 + */ + public void setContentExpression(String contentExpression) + { + this.contentExpression = contentExpression; + } + /** + * 资源包集合
+ */ + public String getJarIds() + { + return jarIds; + } + + /** + * 资源包集合
+ * + * @param jarIds 资源包集合 + */ + public void setJarIds(String jarIds) + { + this.jarIds = jarIds; + } + /** + * 系统id
+ */ + public String getProId() + { + return proId; + } + + /** + * 系统id
+ * + * @param proId 系统id + */ + public void setProId(String proId) + { + this.proId = proId; + } + /** + * 租户id
+ */ + public String getTenantId() + { + return tenantId; + } + + /** + * 租户id
+ * + * @param tenantId 租户id + */ + public void setTenantId(String tenantId) + { + this.tenantId = tenantId; + } + /** + * 创建人
+ */ + public String getCreatedBy() + { + return createdBy; + } + + /** + * 创建人
+ * + * @param createdBy 创建人 + */ + public void setCreatedBy(String createdBy) + { + this.createdBy = createdBy; + } + /** + * 创建时间
+ */ + public Date getCreatedTime() + { + if(createdTime != null) + { + return (Date)createdTime.clone(); + } + return null; + } + + /** + * 创建时间
+ * + * @param createdTime 创建时间 + */ + public void setCreatedTime(Date createdTime) + { + if(createdTime != null) + { + this.createdTime = (Date)createdTime.clone(); + } + } + /** + * 更新人
+ */ + public String getUpdatedBy() + { + return updatedBy; + } + + /** + * 更新人
+ * + * @param updatedBy 更新人 + */ + public void setUpdatedBy(String updatedBy) + { + this.updatedBy = updatedBy; + } + /** + * 更新时间
+ */ + public Date getUpdatedTime() + { + if(updatedTime != null) + { + return (Date)updatedTime.clone(); + } + return null; + } + + /** + * 更新时间
+ * + * @param updatedTime 更新时间 + */ + public void setUpdatedTime(Date updatedTime) + { + if(updatedTime != null) + { + this.updatedTime = (Date)updatedTime.clone(); + } + } + + public DataRule() + { + } + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataSetEnvRel.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataSetEnvRel.java new file mode 100644 index 0000000..1f96eba --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataSetEnvRel.java @@ -0,0 +1,287 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.common.db.Partition; +import net.northking.cctp.common.db.entity.Entity; + +import javax.validation.constraints.Size; +import java.util.Date; + + + + +/** + * 数据集环境关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-23 17:53:02
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "数据集环境关联表") +public class DataSetEnvRel extends Partition implements Entity +{ + public static final String KEY_id = "id"; + public static final String KEY_dataSetId = "dataSetId"; + public static final String KEY_envId = "envId"; + public static final String KEY_tenantId = "tenantId"; + public static final String KEY_seq = "seq"; + public static final String KEY_createdTime = "createdTime"; + public static final String KEY_createdBy = "createdBy"; + public static final String KEY_updatedTime = "updatedTime"; + public static final String KEY_updatedBy = "updatedBy"; + public static final String KEY_fileAddr = "fileAddr"; + + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 数据集id
+ */ + @ApiModelProperty("数据集id") + @Size(max = 32, message="数据集id-dataSetId: 数据长度不能 > 32" ) + private String dataSetId; + /** + * 环境id
+ */ + @ApiModelProperty("环境id") + @Size(max = 32, message="环境id-envId: 数据长度不能 > 32" ) + private String envId; + /** + * 租户id
+ */ + @ApiModelProperty("租户id") + @Size(max = 32, message="租户id-tenantId: 数据长度不能 > 32" ) + private String tenantId; + /** + * 排序
+ */ + @ApiModelProperty("排序") + private Integer seq; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + @Size(max = 32, message="创建人-createdBy: 数据长度不能 > 32" ) + private String createdBy; + /** + * 更新时间
+ */ + @ApiModelProperty("更新时间") + private Date updatedTime; + /** + * 更新人
+ */ + @ApiModelProperty("更新人") + @Size(max = 32, message="更新人-updatedBy: 数据长度不能 > 32" ) + private String updatedBy; + /** + * 文件地址
+ */ + @ApiModelProperty("文件地址") + @Size(max = 1024, message="文件地址-fileAddr: 数据长度不能 > 1024" ) + private String fileAddr; + + /** + * 主键
+ */ + public String getId() + { + return id; + } + + /** + * 主键
+ * + * @param id 主键 + */ + public void setId(String id) + { + this.id = id; + } + /** + * 数据集id
+ */ + public String getDataSetId() + { + return dataSetId; + } + + /** + * 数据集id
+ * + * @param dataSetId 数据集id + */ + public void setDataSetId(String dataSetId) + { + this.dataSetId = dataSetId; + } + /** + * 环境id
+ */ + public String getEnvId() + { + return envId; + } + + /** + * 环境id
+ * + * @param envId 环境id + */ + public void setEnvId(String envId) + { + this.envId = envId; + } + /** + * 租户id
+ */ + public String getTenantId() + { + return tenantId; + } + + /** + * 租户id
+ * + * @param tenantId 租户id + */ + public void setTenantId(String tenantId) + { + this.tenantId = tenantId; + } + /** + * 排序
+ */ + public Integer getSeq() + { + return seq; + } + + /** + * 排序
+ * + * @param seq 排序 + */ + public void setSeq(Integer seq) + { + this.seq = seq; + } + /** + * 创建时间
+ */ + public Date getCreatedTime() + { + if(createdTime != null) + { + return (Date)createdTime.clone(); + } + return null; + } + + /** + * 创建时间
+ * + * @param createdTime 创建时间 + */ + public void setCreatedTime(Date createdTime) + { + if(createdTime != null) + { + this.createdTime = (Date)createdTime.clone(); + } + } + /** + * 创建人
+ */ + public String getCreatedBy() + { + return createdBy; + } + + /** + * 创建人
+ * + * @param createdBy 创建人 + */ + public void setCreatedBy(String createdBy) + { + this.createdBy = createdBy; + } + /** + * 更新时间
+ */ + public Date getUpdatedTime() + { + if(updatedTime != null) + { + return (Date)updatedTime.clone(); + } + return null; + } + + /** + * 更新时间
+ * + * @param updatedTime 更新时间 + */ + public void setUpdatedTime(Date updatedTime) + { + if(updatedTime != null) + { + this.updatedTime = (Date)updatedTime.clone(); + } + } + /** + * 更新人
+ */ + public String getUpdatedBy() + { + return updatedBy; + } + + /** + * 更新人
+ * + * @param updatedBy 更新人 + */ + public void setUpdatedBy(String updatedBy) + { + this.updatedBy = updatedBy; + } + /** + * 文件地址
+ */ + public String getFileAddr() + { + return fileAddr; + } + + /** + * 文件地址
+ * + * @param fileAddr 文件地址 + */ + public void setFileAddr(String fileAddr) + { + this.fileAddr = fileAddr; + } + + public DataSetEnvRel() + { + } + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataSetTree.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataSetTree.java new file mode 100644 index 0000000..a726433 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataSetTree.java @@ -0,0 +1,395 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.common.db.entity.Entity; +import net.northking.cctp.common.saas.db.TenantPartition; + +import javax.validation.constraints.Size; +import java.util.Date; + + +/** + * 数据集树目录表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "数据集树目录表") +public class DataSetTree extends TenantPartition implements Entity +{ + public static final String KEY_id = "id"; + public static final String KEY_name = "name"; + public static final String KEY_parentId = "parentId"; + public static final String KEY_levelNo = "levelNo"; + public static final String KEY_indexNo = "indexNo"; + public static final String KEY_isLeaf = "isLeaf"; + public static final String KEY_path = "path"; + public static final String KEY_fullName = "fullName"; + public static final String KEY_proId = "proId"; + public static final String KEY_tenantId = "tenantId"; + public static final String KEY_createdBy = "createdBy"; + public static final String KEY_createdTime = "createdTime"; + public static final String KEY_updatedBy = "updatedBy"; + public static final String KEY_updatedTime = "updatedTime"; + public static final String KEY_description = "description"; + + /** + * id
+ */ + @ApiModelProperty("id") + @Size(max = 32, message="id-id: 数据长度不能 > 32" ) + private String id; + /** + * 节点名称
+ */ + @ApiModelProperty("节点名称") + @Size(max = 32, message="节点名称-name: 数据长度不能 > 32" ) + private String name; + /** + * 父节点id
+ */ + @ApiModelProperty("父节点id") + @Size(max = 32, message="父节点id-parentId: 数据长度不能 > 32" ) + private String parentId; + /** + * 层级
+ */ + @ApiModelProperty("层级") + private Integer levelNo; + /** + * 序号
+ */ + @ApiModelProperty("序号") + private Integer indexNo; + /** + * 是否叶子节点
+ */ + @ApiModelProperty("是否叶子节点") + @Size(max = 1, message="是否叶子节点-isLeaf: 数据长度不能 > 1" ) + private String isLeaf; + /** + * 路径
+ */ + @ApiModelProperty("路径") + @Size(max = 1024, message="路径-path: 数据长度不能 > 1024" ) + private String path; + /** + * 完整路径
+ */ + @ApiModelProperty("完整路径") + @Size(max = 1024, message="完整路径-fullName: 数据长度不能 > 1024" ) + private String fullName; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id-proId: 数据长度不能 > 32" ) + private String proId; + /** + * 租户id
+ */ + @ApiModelProperty("租户id") + @Size(max = 32, message="租户id-tenantId: 数据长度不能 > 32" ) + private String tenantId; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + @Size(max = 32, message="创建人-createdBy: 数据长度不能 > 32" ) + private String createdBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 更新人
+ */ + @ApiModelProperty("更新人") + @Size(max = 32, message="更新人-updatedBy: 数据长度不能 > 32" ) + private String updatedBy; + /** + * 更新时间
+ */ + @ApiModelProperty("更新时间") + private Date updatedTime; + /** + * 描述
+ */ + @ApiModelProperty("描述") + @Size(max = 255, message="描述-description: 数据长度不能 > 255" ) + private String description; + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + /** + * id
+ */ + public String getId() + { + return id; + } + + /** + * id
+ * + * @param id id + */ + public void setId(String id) + { + this.id = id; + } + /** + * 节点名称
+ */ + public String getName() + { + return name; + } + + /** + * 节点名称
+ * + * @param name 节点名称 + */ + public void setName(String name) + { + this.name = name; + } + /** + * 父节点id
+ */ + public String getParentId() + { + return parentId; + } + + /** + * 父节点id
+ * + * @param parentId 父节点id + */ + public void setParentId(String parentId) + { + this.parentId = parentId; + } + /** + * 层级
+ */ + public Integer getLevelNo() + { + return levelNo; + } + + /** + * 层级
+ * + * @param levelNo 层级 + */ + public void setLevelNo(Integer levelNo) + { + this.levelNo = levelNo; + } + /** + * 序号
+ */ + public Integer getIndexNo() + { + return indexNo; + } + + /** + * 序号
+ * + * @param indexNo 序号 + */ + public void setIndexNo(Integer indexNo) + { + this.indexNo = indexNo; + } + /** + * 是否叶子节点
+ */ + public String getIsLeaf() + { + return isLeaf; + } + + /** + * 是否叶子节点
+ * + * @param isLeaf 是否叶子节点 + */ + public void setIsLeaf(String isLeaf) + { + this.isLeaf = isLeaf; + } + /** + * 路径
+ */ + public String getPath() + { + return path; + } + + /** + * 路径
+ * + * @param path 路径 + */ + public void setPath(String path) + { + this.path = path; + } + /** + * 完整路径
+ */ + public String getFullName() + { + return fullName; + } + + /** + * 完整路径
+ * + * @param fullName 完整路径 + */ + public void setFullName(String fullName) + { + this.fullName = fullName; + } + /** + * 系统id
+ */ + public String getProId() + { + return proId; + } + + /** + * 系统id
+ * + * @param proId 系统id + */ + public void setProId(String proId) + { + this.proId = proId; + } + /** + * 租户id
+ */ + public String getTenantId() + { + return tenantId; + } + + /** + * 租户id
+ * + * @param tenantId 租户id + */ + public void setTenantId(String tenantId) + { + this.tenantId = tenantId; + } + /** + * 创建人
+ */ + public String getCreatedBy() + { + return createdBy; + } + + /** + * 创建人
+ * + * @param createdBy 创建人 + */ + public void setCreatedBy(String createdBy) + { + this.createdBy = createdBy; + } + /** + * 创建时间
+ */ + public Date getCreatedTime() + { + if(createdTime != null) + { + return (Date)createdTime.clone(); + } + return null; + } + + /** + * 创建时间
+ * + * @param createdTime 创建时间 + */ + public void setCreatedTime(Date createdTime) + { + if(createdTime != null) + { + this.createdTime = (Date)createdTime.clone(); + } + } + /** + * 更新人
+ */ + public String getUpdatedBy() + { + return updatedBy; + } + + /** + * 更新人
+ * + * @param updatedBy 更新人 + */ + public void setUpdatedBy(String updatedBy) + { + this.updatedBy = updatedBy; + } + /** + * 更新时间
+ */ + public Date getUpdatedTime() + { + if(updatedTime != null) + { + return (Date)updatedTime.clone(); + } + return null; + } + + /** + * 更新时间
+ * + * @param updatedTime 更新时间 + */ + public void setUpdatedTime(Date updatedTime) + { + if(updatedTime != null) + { + this.updatedTime = (Date)updatedTime.clone(); + } + } + + public DataSetTree() + { + } + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataSets.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataSets.java new file mode 100644 index 0000000..eddcaed --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/entity/DataSets.java @@ -0,0 +1,312 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.common.db.entity.Entity; +import net.northking.cctp.common.saas.db.TenantPartition; + +import javax.validation.constraints.Size; +import java.util.Date; + + + + +/** + * 数据集 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "数据集") +public class DataSets extends TenantPartition implements Entity +{ + public static final String KEY_dataSetId = "dataSetId"; + public static final String KEY_name = "name"; + public static final String KEY_description = "description"; + public static final String KEY_proId = "proId"; + public static final String KEY_tenantId = "tenantId"; + public static final String KEY_fileAddr = "fileAddr"; + public static final String KEY_treeId = "treeId"; + public static final String KEY_createdBy = "createdBy"; + public static final String KEY_createdTime = "createdTime"; + public static final String KEY_updatedBy = "updatedBy"; + public static final String KEY_updatedTime = "updatedTime"; + + /** + * 数据集id
+ */ + @ApiModelProperty("数据集id") + @Size(max = 32, message="数据集id-dataSetId: 数据长度不能 > 32" ) + private String dataSetId; + /** + * 数据集名称
+ */ + @ApiModelProperty("数据集名称") + @Size(max = 32, message="数据集名称-name: 数据长度不能 > 32" ) + private String name; + /** + * 描述
+ */ + @ApiModelProperty("描述") + @Size(max = 255, message="描述-description: 数据长度不能 > 255" ) + private String description; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id-proId: 数据长度不能 > 32" ) + private String proId; + /** + * 租户id
+ */ + @ApiModelProperty("租户id") + @Size(max = 32, message="租户id-tenantId: 数据长度不能 > 32" ) + private String tenantId; + /** + * 文件地址
+ */ + @ApiModelProperty("文件地址") + @Size(max = 1024, message="文件地址-fileAddr: 数据长度不能 > 1024" ) + private String fileAddr; + /** + * 目录id
+ */ + @ApiModelProperty("目录id") + @Size(max = 32, message="目录id-treeId: 数据长度不能 > 32" ) + private String treeId; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + @Size(max = 32, message="创建人-createdBy: 数据长度不能 > 32" ) + private String createdBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 更新人
+ */ + @ApiModelProperty("更新人") + @Size(max = 32, message="更新人-updatedBy: 数据长度不能 > 32" ) + private String updatedBy; + /** + * 更新时间
+ */ + @ApiModelProperty("更新时间") + private Date updatedTime; + + /** + * 数据集id
+ */ + public String getDataSetId() + { + return dataSetId; + } + + /** + * 数据集id
+ * + * @param dataSetId 数据集id + */ + public void setDataSetId(String dataSetId) + { + this.dataSetId = dataSetId; + } + /** + * 数据集名称
+ */ + public String getName() + { + return name; + } + + /** + * 数据集名称
+ * + * @param name 数据集名称 + */ + public void setName(String name) + { + this.name = name; + } + /** + * 描述
+ */ + public String getDescription() + { + return description; + } + + /** + * 描述
+ * + * @param description 描述 + */ + public void setDescription(String description) + { + this.description = description; + } + /** + * 系统id
+ */ + public String getProId() + { + return proId; + } + + /** + * 系统id
+ * + * @param proId 系统id + */ + public void setProId(String proId) + { + this.proId = proId; + } + /** + * 租户id
+ */ + public String getTenantId() + { + return tenantId; + } + + /** + * 租户id
+ * + * @param tenantId 租户id + */ + public void setTenantId(String tenantId) + { + this.tenantId = tenantId; + } + /** + * 文件地址
+ */ + public String getFileAddr() + { + return fileAddr; + } + + /** + * 文件地址
+ * + * @param fileAddr 文件地址 + */ + public void setFileAddr(String fileAddr) + { + this.fileAddr = fileAddr; + } + /** + * 目录id
+ */ + public String getTreeId() + { + return treeId; + } + + /** + * 目录id
+ * + * @param treeId 目录id + */ + public void setTreeId(String treeId) + { + this.treeId = treeId; + } + /** + * 创建人
+ */ + public String getCreatedBy() + { + return createdBy; + } + + /** + * 创建人
+ * + * @param createdBy 创建人 + */ + public void setCreatedBy(String createdBy) + { + this.createdBy = createdBy; + } + /** + * 创建时间
+ */ + public Date getCreatedTime() + { + if(createdTime != null) + { + return (Date)createdTime.clone(); + } + return null; + } + + /** + * 创建时间
+ * + * @param createdTime 创建时间 + */ + public void setCreatedTime(Date createdTime) + { + if(createdTime != null) + { + this.createdTime = (Date)createdTime.clone(); + } + } + /** + * 更新人
+ */ + public String getUpdatedBy() + { + return updatedBy; + } + + /** + * 更新人
+ * + * @param updatedBy 更新人 + */ + public void setUpdatedBy(String updatedBy) + { + this.updatedBy = updatedBy; + } + /** + * 更新时间
+ */ + public Date getUpdatedTime() + { + if(updatedTime != null) + { + return (Date)updatedTime.clone(); + } + return null; + } + + /** + * 更新时间
+ * + * @param updatedTime 更新时间 + */ + public void setUpdatedTime(Date updatedTime) + { + if(updatedTime != null) + { + this.updatedTime = (Date)updatedTime.clone(); + } + } + + public DataSets() + { + } + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataResourcePackageServiceImpl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataResourcePackageServiceImpl.java new file mode 100644 index 0000000..7209acd --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataResourcePackageServiceImpl.java @@ -0,0 +1,58 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.impl; + +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.dataPool.db.dao.DataResourcePackageDao; +import net.northking.cctp.dataPool.db.service.DataResourcePackageService; +import net.northking.cctp.dataPool.db.entity.DataResourcePackage; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.saas.db.TenantEntityService; + +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageDetailDto; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageQueryDto; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.List; + + +/** + * 资源包 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "DataResourcePackageServiceImpl") +public class DataResourcePackageServiceImpl extends TenantEntityService implements DataResourcePackageService +{ + + private final DataResourcePackageDao dataResourcePackageDao; + + public DataResourcePackageServiceImpl(DataResourcePackageDao dataResourcePackageDao) {this.dataResourcePackageDao = dataResourcePackageDao;} + + public BasicDao getDao() {return dataResourcePackageDao;} + + public DataResourcePackage createEntity() { return new DataResourcePackage();} + + +// ---- The End by Generator ----// + + + @Override + public List getDataResourcePackages(QueryByPage queryByPage) { + return dataResourcePackageDao.getDataResourcePackages(queryByPage); + } + + @Override + public List queryByIds(List idList) { + return dataResourcePackageDao.queryByIds(idList); + } +} + diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataRuleServiceImpl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataRuleServiceImpl.java new file mode 100644 index 0000000..3d849ad --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataRuleServiceImpl.java @@ -0,0 +1,65 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.impl; + +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.dataPool.db.dao.DataRuleDao; +import net.northking.cctp.dataPool.db.service.DataRuleService; +import net.northking.cctp.dataPool.db.entity.DataRule; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.saas.db.TenantEntityService; + +import net.northking.cctp.dataPool.dto.dataRule.DataRuleDetailDto; +import net.northking.cctp.dataPool.dto.dataRule.DataRuleQueryDto; +import net.northking.cctp.dataPool.dto.dataRule.DataRuleUpdateDto; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; + + +/** + * 数据规则表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "DataRuleServiceImpl") +public class DataRuleServiceImpl extends TenantEntityService implements DataRuleService +{ + + private final DataRuleDao dataRuleDao; + + public DataRuleServiceImpl(DataRuleDao dataRuleDao) {this.dataRuleDao = dataRuleDao;} + + public BasicDao getDao() {return dataRuleDao;} + + public DataRule createEntity() { return new DataRule();} + + +// ---- The End by Generator ----// + + + @Override + public Integer queryRuleByName(DataRuleUpdateDto dto) { + return dataRuleDao.queryRuleByName(dto); + } + + @Override + public List getDataRules(QueryByPage queryByPage) { + return dataRuleDao.getDataRules(queryByPage); + } + + @Override + public List queryByIdSet(Set idSet) { + return dataRuleDao.queryByIdSet(idSet); + } +} + diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataSetEnvRelServiceImpl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataSetEnvRelServiceImpl.java new file mode 100644 index 0000000..626ff9a --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataSetEnvRelServiceImpl.java @@ -0,0 +1,70 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.impl; + +import net.northking.cctp.dataPool.db.dao.DataSetEnvRelDao; +import net.northking.cctp.dataPool.db.service.DataSetEnvRelService; +import net.northking.cctp.dataPool.db.entity.DataSetEnvRel; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.db.PaginationService; + +import net.northking.cctp.dataPool.dto.dataSets.AtuScriptInputSetQuoteFeignDto; +import net.northking.cctp.dataPool.dto.dataSets.AtuScriptInputSetQuoteFieldDto; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.List; + + +/** + * 数据集环境关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-23 17:53:02
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "DataSetEnvRelServiceImpl") +public class DataSetEnvRelServiceImpl extends PaginationService implements DataSetEnvRelService +{ + + private final DataSetEnvRelDao dataSetEnvRelDao; + + public DataSetEnvRelServiceImpl(DataSetEnvRelDao dataSetEnvRelDao) {this.dataSetEnvRelDao = dataSetEnvRelDao;} + + public BasicDao getDao() {return dataSetEnvRelDao;} + + public DataSetEnvRel createEntity() { return new DataSetEnvRel();} + + @Override + protected void beforeInsert(DataSetEnvRel record) { + + } + + @Override + protected void beforeUpdate(DataSetEnvRel record) { + + } + + @Override + public AtuScriptInputSetQuoteFieldDto selectDataUrlAndTreeName(AtuScriptInputSetQuoteFieldDto atuScriptInputSetQuoteFieldDto) { + return dataSetEnvRelDao.selectDataUrlAndTreeName(atuScriptInputSetQuoteFieldDto); + } + + @Override + public List getDataSetFile(List list, String envId) { + return dataSetEnvRelDao.getDataSetFile(list, envId); + } + + +// ---- The End by Generator ----// + + + + +} + diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataSetTreeServiceImpl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataSetTreeServiceImpl.java new file mode 100644 index 0000000..a7830e4 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataSetTreeServiceImpl.java @@ -0,0 +1,78 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.impl; + +import net.northking.cctp.dataPool.db.dao.DataSetTreeDao; +import net.northking.cctp.dataPool.db.service.DataSetTreeService; +import net.northking.cctp.dataPool.db.entity.DataSetTree; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.saas.db.TenantEntityService; + +import net.northking.cctp.dataPool.dto.dataSets.DataSetTreeDetailDto; +import net.northking.cctp.dataPool.dto.dataSets.DataSetTreeMoveDto; +import net.northking.cctp.dataPool.dto.dataSets.DataSetTreeQueryDto; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.List; + + +/** + * 数据集树目录表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "DataSetTreeServiceImpl") +public class DataSetTreeServiceImpl extends TenantEntityService implements DataSetTreeService +{ + private final DataSetTreeDao dataSetTreeDao; + + public DataSetTreeServiceImpl(DataSetTreeDao dataSetTreeDao) {this.dataSetTreeDao = dataSetTreeDao;} + + public BasicDao getDao() {return dataSetTreeDao;} + + public DataSetTree createEntity() { return new DataSetTree();} + + @Override + public int updateChildNamePath(DataSetTree childSetTrees, String namePathNew) { + return dataSetTreeDao.updateChildNamePath(childSetTrees, namePathNew); + } + + @Override + public List selectDataSetTree(DataSetTreeQueryDto setTreeQueryDto) { + return dataSetTreeDao.selectDataSetTree(setTreeQueryDto); + } + + @Override + public List queryChildrenTreeList(String treeId) { + return dataSetTreeDao.queryChildrenTreeList(treeId); + } + + @Override + public List queryByIds(List list) { + return dataSetTreeDao.queryByIds(list); + } + + @Override + public int countMaxLevelNo(DataSetTree queryLevel) { + return dataSetTreeDao.countMaxLevelNo(queryLevel); + } + + @Override + public void updateSeqByMove(DataSetTreeMoveDto childUp) { + dataSetTreeDao.updateSeqByMove(childUp); + } + + @Override + public int updateChildIdPath(DataSetTree child, String path) { + return dataSetTreeDao.updateChildIdPath(child, path); + } +} + diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataSetsServiceImpl.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataSetsServiceImpl.java new file mode 100644 index 0000000..493942c --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/impl/DataSetsServiceImpl.java @@ -0,0 +1,63 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.impl; + +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.dataPool.db.dao.DataSetsDao; +import net.northking.cctp.dataPool.db.service.DataSetsService; +import net.northking.cctp.dataPool.db.entity.DataSets; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.saas.db.TenantEntityService; + +import net.northking.cctp.dataPool.dto.dataSets.DataSetsDetailDto; +import net.northking.cctp.dataPool.dto.dataSets.DataSetsQueryDto; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.List; + + +/** + * 数据集 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:39
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "DataSetsServiceImpl") +public class DataSetsServiceImpl extends TenantEntityService implements DataSetsService +{ + + private final DataSetsDao dataSetsDao; + + public DataSetsServiceImpl(DataSetsDao dataSetsDao) {this.dataSetsDao = dataSetsDao;} + + public BasicDao getDao() {return dataSetsDao;} + + public DataSets createEntity() { return new DataSets();} + + +// ---- The End by Generator ----// + + + @Override + public List queryDataSets(QueryByPage query) { + return dataSetsDao.queryDataSets(query); + } + + @Override + public List queryByIds(List setIds) { + return dataSetsDao.queryByIds(setIds); + } + + @Override + public Integer deleteByIds(List setIds) { + return dataSetsDao.deleteByIds(setIds); + } +} + diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataResourcePackageMapper.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataResourcePackageMapper.java new file mode 100644 index 0000000..2ba7962 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataResourcePackageMapper.java @@ -0,0 +1,32 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.dataPool.db.entity.DataResourcePackage; + +/** + * Mybatis数据库持久层(底层):资源包 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface DataResourcePackageMapper extends BasicDao +{ + String EntityName = "DataResourcePackage"; + + String COLUMN_id = "id"; + String COLUMN_name = "name"; + String COLUMN_memo = "memo"; + String COLUMN_packageAddr = "package_addr"; + String COLUMN_proId = "pro_id"; + String COLUMN_tenantId = "tenant_id"; + String COLUMN_createdBy = "created_by"; + String COLUMN_updatedBy = "updated_by"; + String COLUMN_createdTime = "created_time"; + String COLUMN_updatedTime = "updated_time"; + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataRuleMapper.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataRuleMapper.java new file mode 100644 index 0000000..4d75639 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataRuleMapper.java @@ -0,0 +1,33 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.dataPool.db.entity.DataRule; + +/** + * Mybatis数据库持久层(底层):数据规则表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface DataRuleMapper extends BasicDao +{ + String EntityName = "DataRule"; + + String COLUMN_ruleId = "rule_id"; + String COLUMN_name = "name"; + String COLUMN_type = "type"; + String COLUMN_contentExpression = "content_expression"; + String COLUMN_jarIds = "jar_ids"; + String COLUMN_proId = "pro_id"; + String COLUMN_tenantId = "tenant_id"; + String COLUMN_createdBy = "created_by"; + String COLUMN_createdTime = "created_time"; + String COLUMN_updatedBy = "updated_by"; + String COLUMN_updatedTime = "updated_time"; + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataSetEnvRelMapper.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataSetEnvRelMapper.java new file mode 100644 index 0000000..b6424d9 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataSetEnvRelMapper.java @@ -0,0 +1,32 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.dataPool.db.entity.DataSetEnvRel; + +/** + * Mybatis数据库持久层(底层):数据集环境关联表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2023-08-23 17:53:02
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface DataSetEnvRelMapper extends BasicDao +{ + String EntityName = "DataSetEnvRel"; + + String COLUMN_id = "id"; + String COLUMN_dataSetId = "data_set_id"; + String COLUMN_envId = "env_id"; + String COLUMN_tenantId = "tenant_id"; + String COLUMN_seq = "seq"; + String COLUMN_createdTime = "created_time"; + String COLUMN_createdBy = "created_by"; + String COLUMN_updatedTime = "updated_time"; + String COLUMN_updatedBy = "updated_by"; + String COLUMN_fileAddr = "file_addr"; + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataSetTreeMapper.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataSetTreeMapper.java new file mode 100644 index 0000000..d240ce7 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataSetTreeMapper.java @@ -0,0 +1,37 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.dataPool.db.entity.DataSetTree; + +/** + * Mybatis数据库持久层(底层):数据集树目录表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface DataSetTreeMapper extends BasicDao +{ + String EntityName = "DataSetTree"; + + String COLUMN_id = "id"; + String COLUMN_name = "name"; + String COLUMN_parentId = "parent_id"; + String COLUMN_levelNo = "level_no"; + String COLUMN_indexNo = "index_no"; + String COLUMN_isLeaf = "is_leaf"; + String COLUMN_path = "path"; + String COLUMN_fullName = "full_name"; + String COLUMN_proId = "pro_id"; + String COLUMN_tenantId = "tenant_id"; + String COLUMN_createdBy = "created_by"; + String COLUMN_createdTime = "created_time"; + String COLUMN_updatedBy = "updated_by"; + String COLUMN_updatedTime = "updated_time"; + String COLUMN_description = "description"; + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataSetsMapper.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataSetsMapper.java new file mode 100644 index 0000000..81efb59 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/mapper/DataSetsMapper.java @@ -0,0 +1,33 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.dataPool.db.entity.DataSets; + +/** + * Mybatis数据库持久层(底层):数据集 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface DataSetsMapper extends BasicDao +{ + String EntityName = "DataSets"; + + String COLUMN_dataSetId = "data_set_id"; + String COLUMN_name = "name"; + String COLUMN_desc = "description"; + String COLUMN_proId = "pro_id"; + String COLUMN_tenantId = "tenant_id"; + String COLUMN_fileAddr = "file_addr"; + String COLUMN_treeId = "tree_id"; + String COLUMN_createdBy = "created_by"; + String COLUMN_createdTime = "created_time"; + String COLUMN_updatedBy = "updated_by"; + String COLUMN_updatedTime = "updated_time"; + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataResourcePackageService.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataResourcePackageService.java new file mode 100644 index 0000000..6f5c91b --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataResourcePackageService.java @@ -0,0 +1,40 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.dataPool.db.entity.DataResourcePackage; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageDetailDto; +import net.northking.cctp.dataPool.dto.dataRule.DataResourcePackageQueryDto; + +import java.util.List; + +/** + * 资源包 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface DataResourcePackageService extends BasicService +{ + /** + * 条件查询资源包列表 + * @param queryByPage + * @return + */ + List getDataResourcePackages(QueryByPage queryByPage); + + /** + * 根据id列表查询资源包 + * @param idList + * @return + */ + List queryByIds(List idList); + + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataRuleService.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataRuleService.java new file mode 100644 index 0000000..22fc709 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataRuleService.java @@ -0,0 +1,48 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.dataPool.db.entity.DataRule; +import net.northking.cctp.dataPool.dto.dataRule.DataRuleDetailDto; +import net.northking.cctp.dataPool.dto.dataRule.DataRuleQueryDto; +import net.northking.cctp.dataPool.dto.dataRule.DataRuleUpdateDto; + +import java.util.List; +import java.util.Set; + +/** + * 数据规则表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface DataRuleService extends BasicService +{ + /** + * 查询同名的其他规则 + * @param dto + * @return + */ + Integer queryRuleByName(DataRuleUpdateDto dto); + + /** + * 条件查询数据规则 + * @param queryByPage + * @return + */ + List getDataRules(QueryByPage queryByPage); + + /** + * 根据id集合查询数据规则 + * @param idSet id集合 + * @return 结果集 + */ + List queryByIdSet(Set idSet); + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataSetEnvRelService.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataSetEnvRelService.java new file mode 100644 index 0000000..4167322 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataSetEnvRelService.java @@ -0,0 +1,28 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.dataPool.db.entity.DataSetEnvRel; +import net.northking.cctp.dataPool.dto.dataSets.AtuScriptInputSetQuoteFeignDto; +import net.northking.cctp.dataPool.dto.dataSets.AtuScriptInputSetQuoteFieldDto; + +import java.util.List; + +/** + * 数据集环境关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-23 17:53:02
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface DataSetEnvRelService extends BasicService +{ + AtuScriptInputSetQuoteFieldDto selectDataUrlAndTreeName(AtuScriptInputSetQuoteFieldDto atuScriptInputSetQuoteFieldDto); + + List getDataSetFile(List list, String envId); + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataSetTreeService.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataSetTreeService.java new file mode 100644 index 0000000..a061b6f --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataSetTreeService.java @@ -0,0 +1,41 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.dataPool.db.entity.DataSetTree; +import net.northking.cctp.dataPool.dto.dataSets.DataSetTreeDetailDto; +import net.northking.cctp.dataPool.dto.dataSets.DataSetTreeMoveDto; +import net.northking.cctp.dataPool.dto.dataSets.DataSetTreeQueryDto; + +import java.util.List; + +/** + * 数据集树目录表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:38
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface DataSetTreeService extends BasicService +{ + int updateChildNamePath(DataSetTree childSetTrees, String namePathNew); + + List selectDataSetTree(DataSetTreeQueryDto setTreeQueryDto); + + List queryChildrenTreeList(String treeId); + + List queryByIds(List list); + + int countMaxLevelNo(DataSetTree queryLevel); + + void updateSeqByMove(DataSetTreeMoveDto childUp); + + int updateChildIdPath(DataSetTree child, String path); + + + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataSetsService.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataSetsService.java new file mode 100644 index 0000000..2dfe3d1 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/db/service/DataSetsService.java @@ -0,0 +1,41 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.dataPool.db.entity.DataSets; +import net.northking.cctp.dataPool.dto.dataSets.DataSetsDetailDto; +import net.northking.cctp.dataPool.dto.dataSets.DataSetsQueryDto; + +import java.util.List; + +/** + * 数据集 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-10-24 16:58:39
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface DataSetsService extends BasicService +{ + /** + * 条件查询数据集列表 + * @param query + * @return + */ + List queryDataSets(QueryByPage query); + + /** + * 根据id列表查询数据集 + * @param setIds + * @return + */ + List queryByIds(List setIds); + + Integer deleteByIds(List setIds); + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageDetailDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageDetailDto.java new file mode 100644 index 0000000..e46da7d --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageDetailDto.java @@ -0,0 +1,35 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataRule; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.dataPool.db.entity.DataResourcePackage; + +import java.io.Serializable; + +/** +* Restful接口--资源详情--数据传输对象:资源包 +* +* createdate: 2022-10-24 17:01:18
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "资源包") +public class DataResourcePackageDetailDto extends DataResourcePackage implements Serializable +{ + @ApiModelProperty("上传人") + private String creator; + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageInfoDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageInfoDto.java new file mode 100644 index 0000000..93c97ef --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageInfoDto.java @@ -0,0 +1,33 @@ +package net.northking.cctp.dataPool.dto.dataRule; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +@JsonSerialize +@ApiModel(description = "资源包信息实体") +public class DataResourcePackageInfoDto implements Serializable { + @ApiModelProperty("资源包id") + private String jarId; + + @ApiModelProperty("资源包名称") + private String name; + + public String getJarId() { + return jarId; + } + + public void setJarId(String jarId) { + this.jarId = jarId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageQueryDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageQueryDto.java new file mode 100644 index 0000000..b701c80 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageQueryDto.java @@ -0,0 +1,67 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataRule; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** +* 查询接口--数据传输对象:资源包 +* +* createdate: 2022-10-24 17:01:18
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "资源包") +public class DataResourcePackageQueryDto implements Serializable +{ + /** + * 资源包名称
+ */ + @ApiModelProperty("资源包名称") + @Size(max = 32, message="资源包名称-name: 数据长度不能 > 32" ) + private String name; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id-proId: 数据长度不能 > 32" ) + private String proId; + /** + * 租户id
+ */ + @ApiModelProperty("租户id") + @Size(max = 32, message="租户id-tenantId: 数据长度不能 > 32" ) + private String tenantId; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageUpdateDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageUpdateDto.java new file mode 100644 index 0000000..e42b1a2 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataResourcePackageUpdateDto.java @@ -0,0 +1,55 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataRule; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** +* Restful接口--更新资源--数据传输对象:资源包 +* +* createdate: 2022-10-24 17:01:18
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "资源包") +public class DataResourcePackageUpdateDto implements Serializable +{ + /** + * id
+ */ + @ApiModelProperty("id") + @Size(max = 32, message="id-id: 数据长度不能 > 32" ) + @NotBlank(message = "资源包id不能为空") + private String id; + /** + * 资源包描述
+ */ + @ApiModelProperty("资源包描述") + @Size(max = 128, message="资源包描述-memo: 数据长度不能 > 128" ) + private String memo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleAddDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleAddDto.java new file mode 100644 index 0000000..d9edd11 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleAddDto.java @@ -0,0 +1,98 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataRule; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** +* Restful接口--新增资源--数据传输对象:数据规则表 +* +* createdate: 2022-10-24 17:01:18
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据规则表") +public class DataRuleAddDto implements Serializable +{ + /** + * 规则名称
+ */ + @ApiModelProperty("规则名称") + @Size(max = 32, message="规则名称-name: 数据长度不能 > 32" ) + @NotBlank(message = "规则名称不能为空") + private String name; + /** + * 规则类型 0-脚本语言 1-正则表达式
+ */ + @ApiModelProperty("规则类型 0-脚本语言 1-正则表达式") + @Size(max = 1, message="规则类型-type: 数据长度不能 > 1" ) + @NotBlank(message = "规则类型不能为空") + private String type; + /** + * 正则表达式、脚本编码
+ */ + @ApiModelProperty("正则表达式、脚本编码") + @Size(max = 65535, message="正则表达式、脚本编码-contentExpression: 数据长度不能 > 65535" ) + private String contentExpression; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id-proId: 数据长度不能 > 32" ) + private String proId; + /** + * 资源包集合
+ */ + @ApiModelProperty("资源包集合") + @Size(max = 1024, message="资源包集合-jarIds: 数据长度不能 > 1024" ) + private String jarIds; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getContentExpression() { + return contentExpression; + } + + public void setContentExpression(String contentExpression) { + this.contentExpression = contentExpression; + } + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } + + public String getJarIds() { + return jarIds; + } + + public void setJarIds(String jarIds) { + this.jarIds = jarIds; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleDetailDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleDetailDto.java new file mode 100644 index 0000000..a85495a --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleDetailDto.java @@ -0,0 +1,66 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataRule; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.dataPool.db.entity.DataRule; + +import java.io.Serializable; +import java.util.List; + +/** +* Restful接口--资源详情--数据传输对象:数据规则表 +* +* createdate: 2022-10-24 17:01:18
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据规则表") +public class DataRuleDetailDto extends DataRule implements Serializable +{ + @ApiModelProperty("创建人名称") + private String creator; + @ApiModelProperty("修改人名称") + private String modifier; + @ApiModelProperty("系统名称") + private String projectName; + @ApiModelProperty("引用的资源包名称列表") + private List jarInfoList; + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public List getJarInfoList() { + return jarInfoList; + } + + public void setJarInfoList(List jarInfoList) { + this.jarInfoList = jarInfoList; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getModifier() { + return modifier; + } + + public void setModifier(String modifier) { + this.modifier = modifier; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleExecuteDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleExecuteDto.java new file mode 100644 index 0000000..ee28ca9 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleExecuteDto.java @@ -0,0 +1,86 @@ +package net.northking.cctp.dataPool.dto.dataRule; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; + +@JsonSerialize +@ApiModel(description = "数据规则测试实体") +public class DataRuleExecuteDto implements Serializable { + /** + * 规则名称
+ */ + @ApiModelProperty("规则名称") + @Size(max = 32, message="规则名称-name: 数据长度不能 > 32" ) + @NotBlank(message = "规则名称不能为空") + private String name; + /** + * 规则类型 0-脚本语言 1-正则表达式
+ */ + @ApiModelProperty("规则类型 0-脚本语言 1-正则表达式") + @Size(max = 1, message="规则类型-type: 数据长度不能 > 1" ) + @NotBlank(message = "规则类型不能为空") + private String type; + /** + * 正则表达式、脚本编码
+ */ + @ApiModelProperty("正则表达式、脚本编码") + @Size(max = 65535, message="正则表达式、脚本编码-contentExpression: 数据长度不能 > 65535" ) + private String contentExpression; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id-proId: 数据长度不能 > 32" ) + private String proId; + /** + * 资源包集合
+ */ + @ApiModelProperty("资源包集合") + @Size(max = 1024, message="资源包集合-jarIds: 数据长度不能 > 1024" ) + private String jarIds; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getContentExpression() { + return contentExpression; + } + + public void setContentExpression(String contentExpression) { + this.contentExpression = contentExpression; + } + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } + + public String getJarIds() { + return jarIds; + } + + public void setJarIds(String jarIds) { + this.jarIds = jarIds; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleQueryDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleQueryDto.java new file mode 100644 index 0000000..a19cca9 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleQueryDto.java @@ -0,0 +1,100 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataRule; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.List; + +/** +* 查询接口--数据传输对象:数据规则表 +* +* createdate: 2022-10-24 17:01:18
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据规则表") +public class DataRuleQueryDto implements Serializable +{ + /** + * 规则名称
+ */ + @ApiModelProperty("规则名称") + @Size(max = 32, message="规则名称-name: 数据长度不能 > 32" ) + private String name; + /** + * 规则类型
+ */ + @ApiModelProperty("规则类型") + @Size(max = 1, message="规则类型-type: 数据长度不能 > 1" ) + private String type; + /** + * 租户id
+ */ + @ApiModelProperty("租户id") + @Size(max = 32, message="租户id-tenantId: 数据长度不能 > 32" ) + private String tenantId; + + @ApiModelProperty("系统id列表") + private List proIds; + + @ApiModelProperty("创建人名称") + private String creator; + + private List creatorIds; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public List getCreatorIds() { + return creatorIds; + } + + public void setCreatorIds(List creatorIds) { + this.creatorIds = creatorIds; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getProIds() { + return proIds; + } + + public void setProIds(List proIds) { + this.proIds = proIds; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleUpdateDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleUpdateDto.java new file mode 100644 index 0000000..ba43621 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/DataRuleUpdateDto.java @@ -0,0 +1,113 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataRule; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** +* Restful接口--更新资源--数据传输对象:数据规则表 +* +* createdate: 2022-10-24 17:01:18
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据规则表") +public class DataRuleUpdateDto implements Serializable +{ + /** + * 规则id
+ */ + @ApiModelProperty("规则id") + @Size(max = 32, message="规则id-ruleId: 数据长度不能 > 32" ) + @NotBlank(message = "规则id不能为空") + private String ruleId; + /** + * 规则名称
+ */ + @ApiModelProperty("规则名称") + @Size(max = 32, message="规则名称-name: 数据长度不能 > 32" ) + @NotBlank(message = "规则名称不能为空") + private String name; + /** + * 规则类型
+ */ + @ApiModelProperty("规则类型") + @Size(max = 1, message="规则类型-type: 数据长度不能 > 1" ) + @NotBlank(message = "规则类型不能为空") + private String type; + /** + * 正则表达式、脚本编码
+ */ + @ApiModelProperty("正则表达式、脚本编码") + @Size(max = 65535, message="正则表达式、脚本编码-contentExpression: 数据长度不能 > 65535" ) + private String contentExpression; + /** + * 资源包集合
+ */ + @ApiModelProperty("资源包集合") + @Size(max = 1024, message="资源包集合-jarIds: 数据长度不能 > 1024" ) + private String jarIds; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id-proId: 数据长度不能 > 32" ) + private String proId; + + public String getRuleId() { + return ruleId; + } + + public void setRuleId(String ruleId) { + this.ruleId = ruleId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getContentExpression() { + return contentExpression; + } + + public void setContentExpression(String contentExpression) { + this.contentExpression = contentExpression; + } + + public String getJarIds() { + return jarIds; + } + + public void setJarIds(String jarIds) { + this.jarIds = jarIds; + } + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/UserQueryDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/UserQueryDto.java new file mode 100644 index 0000000..ee85d47 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataRule/UserQueryDto.java @@ -0,0 +1,35 @@ +package net.northking.cctp.dataPool.dto.dataRule; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.common.saas.db.TenantPartition; + +import java.io.Serializable; + +@JsonSerialize +@ApiModel("用户查询实体") +public class UserQueryDto extends TenantPartition implements Serializable { + @Override + public String getTenantId() { + return null; + } + + @Override + public void setTenantId(String s) { + + } + /** + * 用户中文名称
+ */ + @ApiModelProperty("用户中文名称") + private String userChnName; + + public String getUserChnName() { + return userChnName; + } + + public void setUserChnName(String userChnName) { + this.userChnName = userChnName; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/AtuDataSetFeignDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/AtuDataSetFeignDto.java new file mode 100644 index 0000000..4275aa3 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/AtuDataSetFeignDto.java @@ -0,0 +1,26 @@ +package net.northking.cctp.dataPool.dto.dataSets; + +import java.util.Set; + +public class AtuDataSetFeignDto { + //静态数据集id集合 + private Set dataSetList; + //环境id + private String envId; + + public Set getDataSetList() { + return dataSetList; + } + + public void setDataSetList(Set dataSetList) { + this.dataSetList = dataSetList; + } + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/AtuScriptInputSetQuoteFeignDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/AtuScriptInputSetQuoteFeignDto.java new file mode 100644 index 0000000..7ea8603 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/AtuScriptInputSetQuoteFeignDto.java @@ -0,0 +1,14 @@ +package net.northking.cctp.dataPool.dto.dataSets; + +public class AtuScriptInputSetQuoteFeignDto extends AtuScriptInputSetQuoteFieldDto { + + private String filePath; + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/AtuScriptInputSetQuoteFieldDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/AtuScriptInputSetQuoteFieldDto.java new file mode 100644 index 0000000..8d0ad62 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/AtuScriptInputSetQuoteFieldDto.java @@ -0,0 +1,110 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import net.northking.cctp.dataPool.constants.DataPoolConstant; + +import java.io.Serializable; + +/** +* Restful接口--更新资源--数据传输对象:脚本输入项数据集关联草稿表 +* +* createdate: 2023-08-29 10:41:06
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "脚本输入项数据集关联草稿表") +public class AtuScriptInputSetQuoteFieldDto implements Serializable +{ + private String setId;//数据集id + private String value;//指定某行列的单元格的值 + private String column;//列名 + private Integer row;//行号 + private String path;//静态数据集所在目录:静态数据集名称 + /** + * 类型,默认为1,1-静态数据,2-模糊数据 + */ + private String type = DataPoolConstant.INPUT_SET_QUOTE_TYPE_STATIC; + + private String envId; + + private String name; + private String fullName; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public String getSetId() { + return setId; + } + + public void setSetId(String setId) { + this.setId = setId; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getColumn() { + return column; + } + + public void setColumn(String column) { + this.column = column; + } + + public Integer getRow() { + return row; + } + + public void setRow(Integer row) { + this.row = row; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/ColumnCheckDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/ColumnCheckDto.java new file mode 100644 index 0000000..97e17f9 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/ColumnCheckDto.java @@ -0,0 +1,40 @@ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; + +@JsonSerialize +@ApiModel(description = "列校验实体") +public class ColumnCheckDto implements Serializable { + /** + * 数据集id
+ */ + @ApiModelProperty("数据集id") + @Size(max = 32, message="数据集id-dataSetId: 数据长度不能 > 32" ) + @NotBlank(message = "数据集id不能为空") + private String dataSetId; + + @ApiModelProperty("新增列实体") + private DataHeaderDto columnInfo; + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public DataHeaderDto getColumnInfo() { + return columnInfo; + } + + public void setColumnInfo(DataHeaderDto columnInfo) { + this.columnInfo = columnInfo; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataContentDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataContentDto.java new file mode 100644 index 0000000..c38ea74 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataContentDto.java @@ -0,0 +1,32 @@ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +@JsonSerialize +@ApiModel(description = "数据内容对象") +public class DataContentDto implements Serializable { + @ApiModelProperty("数值") + private String value; + @ApiModelProperty("被使用次数") + private String time; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataHeaderDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataHeaderDto.java new file mode 100644 index 0000000..df2a173 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataHeaderDto.java @@ -0,0 +1,42 @@ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +@JsonSerialize +@ApiModel(description = "数据集表头对象") +public class DataHeaderDto implements Serializable { + @ApiModelProperty("列名称") + private String name; + @ApiModelProperty("数据类型") + private String type; + @ApiModelProperty("数据是否支撑重复使用") + private String isRepeat; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getIsRepeat() { + return isRepeat; + } + + public void setIsRepeat(String isRepeat) { + this.isRepeat = isRepeat; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetEnvRelAddDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetEnvRelAddDto.java new file mode 100644 index 0000000..190639e --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetEnvRelAddDto.java @@ -0,0 +1,55 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.util.List; + +/** +* Restful接口--新增资源--数据传输对象:数据集环境关联表 +* +* createdate: 2023-08-23 17:55:51
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据集环境关联表") +public class DataSetEnvRelAddDto implements Serializable +{ + @ApiModelProperty("系统id") + private String proId; + @ApiModelProperty("数据集id") + private String dataSetId; + @ApiModelProperty("") + private List dataSetEnvRelAddTmpDto; + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public List getDataSetEnvRelAddTmpDto() { + return dataSetEnvRelAddTmpDto; + } + + public void setDataSetEnvRelAddTmpDto(List dataSetEnvRelAddTmpDto) { + this.dataSetEnvRelAddTmpDto = dataSetEnvRelAddTmpDto; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetEnvRelAddTmpDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetEnvRelAddTmpDto.java new file mode 100644 index 0000000..33f3a3c --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetEnvRelAddTmpDto.java @@ -0,0 +1,58 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** +* Restful接口--新增资源--数据传输对象:数据集环境关联表 +* +* createdate: 2023-08-23 17:55:51
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据集环境关联表") +public class DataSetEnvRelAddTmpDto implements Serializable +{ + @ApiModelProperty("数据表头") + private String envId; + + @ApiModelProperty("数据表头") + private List tableHeader; + + @ApiModelProperty("数据内容 key-列名 value-该列数据信息列表") + private Map> tableContent; + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public List getTableHeader() { + return tableHeader; + } + + public void setTableHeader(List tableHeader) { + this.tableHeader = tableHeader; + } + + public Map> getTableContent() { + return tableContent; + } + + public void setTableContent(Map> tableContent) { + this.tableContent = tableContent; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetEnvRelQueryDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetEnvRelQueryDto.java new file mode 100644 index 0000000..39868d5 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetEnvRelQueryDto.java @@ -0,0 +1,78 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** +* 查询接口--数据传输对象:数据集环境关联表 +* +* createdate: 2023-08-23 17:55:51
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据集环境关联表") +public class DataSetEnvRelQueryDto implements Serializable +{ + @ApiModelProperty("数据集id") + private String dataSetId; + @ApiModelProperty("系统id") + private String proId; + @ApiModelProperty("环境id") + private String envId; + + @ApiModelProperty("表头集合") + private List tableHeaders; + + @ApiModelProperty("数据信息 按行存储") + private List> tableContent; + + public List getTableHeaders() { + return tableHeaders; + } + + public void setTableHeaders(List tableHeaders) { + this.tableHeaders = tableHeaders; + } + + public List> getTableContent() { + return tableContent; + } + + public void setTableContent(List> tableContent) { + this.tableContent = tableContent; + } + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeAddDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeAddDto.java new file mode 100644 index 0000000..7d9d28c --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeAddDto.java @@ -0,0 +1,89 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** +* Restful接口--新增资源--数据传输对象:数据集树目录表 +* +* createdate: 2022-10-24 17:01:18
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据集树目录表") +public class DataSetTreeAddDto implements Serializable +{ + /** + * 节点名称
+ */ + @ApiModelProperty("节点名称") + @Size(max = 32, message="节点名称长度不能 > 32" ) + private String name; + /** + * 父节点id
+ */ + @ApiModelProperty("父节点id") + @Size(max = 32, message="父节点名称长度不能 > 32" ) + private String parentId; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id长度不能 > 32" ) + private String proId; + + @ApiModelProperty("是否新增到根节点 false-否 true-是") + private boolean addRootNode; + + @ApiModelProperty("节点描述") + private String description; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } + + public boolean isAddRootNode() { + return addRootNode; + } + + public void setAddRootNode(boolean addRootNode) { + this.addRootNode = addRootNode; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeDetailDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeDetailDto.java new file mode 100644 index 0000000..17f5200 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeDetailDto.java @@ -0,0 +1,50 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.dataPool.db.entity.DataSetTree; + +import java.io.Serializable; +import java.util.List; + +/** +* Restful接口--资源详情--数据传输对象:数据集树目录表 +* +* createdate: 2022-10-24 17:01:18
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据集树目录表") +public class DataSetTreeDetailDto extends DataSetTree implements Serializable +{ + /** + * 子节点列表
+ */ + @ApiModelProperty("子节点列表") + private List children; + + @ApiModelProperty("节点次序") + private Integer idx; + + public Integer getIdx() { + return idx; + } + + public void setIdx(Integer idx) { + this.idx = idx; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeMoveDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeMoveDto.java new file mode 100644 index 0000000..93d7826 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeMoveDto.java @@ -0,0 +1,68 @@ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; + +@JsonSerialize +@ApiModel(description = "数据集树目录表") +public class DataSetTreeMoveDto implements Serializable { + /** + * 目录ID
+ */ + @ApiModelProperty("目录ID") + @Size(max = 32, message="目录ID-id: 数据长度不能 > 32" ) + private String id; + /** + * 目标位置父节点id
+ */ + @ApiModelProperty("目标位置父节点id") + @Size(max = 32, message="目标位置父节点id-targetId: 数据长度不能 > 32" ) + private String targetId; + /** + * 系统ID
+ */ + @ApiModelProperty("系统ID") + @Size(max = 32, message="系统ID-projectId: 数据长度不能 > 32" ) + private String proId; + /** + * 目标位置前一位的顺序号 + */ + @ApiModelProperty("目标位置前一位的顺序号") + private Integer orderSeq; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTargetId() { + return targetId; + } + + public void setTargetId(String targetId) { + this.targetId = targetId; + } + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } + + public Integer getOrderSeq() { + return orderSeq; + } + + public void setOrderSeq(Integer orderSeq) { + this.orderSeq = orderSeq; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeQueryDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeQueryDto.java new file mode 100644 index 0000000..06378d1 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeQueryDto.java @@ -0,0 +1,103 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.List; + +/** +* 查询接口--数据传输对象:数据集树目录表 +* +* createdate: 2022-10-24 17:01:18
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据集树目录表") +public class DataSetTreeQueryDto implements Serializable +{ + /** + * 节点名称
+ */ + @ApiModelProperty("节点名称") + @Size(max = 32, message="节点名称-name: 数据长度不能 > 32" ) + private String name; + /** + * 父节点id
+ */ + @ApiModelProperty("父节点id") + @Size(max = 32, message="父节点id-parentId: 数据长度不能 > 32" ) + private String parentId; + + @ApiModelProperty("系统id列表") + private List proIds; + + @ApiModelProperty("是否为多系统 false-单系统 true-多系统") + private boolean moreProject; + + /** + * 路径
+ */ + @ApiModelProperty("路径") + @Size(max = 1024, message="路径-path: 数据长度不能 > 1024" ) + private String path; + + @ApiModelProperty("租户id") + @Size(max = 32, message="租户id-tenantId: 数据长度不能 > 32" ) + private String tenantId; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public boolean isMoreProject() { + return moreProject; + } + + public void setMoreProject(boolean moreProject) { + this.moreProject = moreProject; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public List getProIds() { + return proIds; + } + + public void setProIds(List proIds) { + this.proIds = proIds; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeUpdateDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeUpdateDto.java new file mode 100644 index 0000000..c8bd548 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetTreeUpdateDto.java @@ -0,0 +1,81 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** +* Restful接口--更新资源--数据传输对象:数据集树目录表 +* +* createdate: 2022-10-24 17:01:18
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据集树目录表") +public class DataSetTreeUpdateDto implements Serializable +{ + /** + * id
+ */ + @ApiModelProperty("id") + @Size(max = 32, message="id长度不能 > 32" ) + private String id; + /** + * 节点名称
+ */ + @ApiModelProperty("节点名称") + @Size(max = 32, message="节点名称长度不能 > 32" ) + private String name; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id长度不能 > 32" ) + private String proId; + /** + * 目录描述
+ */ + @ApiModelProperty("目录描述") + @Size(max = 255, message="目录描述长度不能 > 255" ) + private String description; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsAddDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsAddDto.java new file mode 100644 index 0000000..9e4b8b9 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsAddDto.java @@ -0,0 +1,119 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** +* Restful接口--新增资源--数据传输对象:数据集 +* +* createdate: 2022-10-24 17:01:19
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据集") +public class DataSetsAddDto implements Serializable +{ + /** + * 数据集名称
+ */ + @ApiModelProperty("数据集名称") + @Size(max = 30, message="数据集名称-name: 数据长度不能 > 30" ) + @NotBlank(message = "数据集名称不能为空") + private String name; + /** + * 描述
+ */ + @ApiModelProperty("描述") + @Size(max = 255, message="描述-description: 数据长度不能 > 255" ) + private String description; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id-proId: 数据长度不能 > 32" ) + @NotBlank(message = "系统id不能为空") + private String proId; + /** + * 目录id
+ */ + @ApiModelProperty("目录id") + @Size(max = 32, message="目录id-treeId: 数据长度不能 > 32" ) + @NotBlank(message = "目录id不能为空") + private String treeId; + + @ApiModelProperty("表头列表") + private List headers; + @ApiModelProperty("表数据") + private List> tableData; + + @ApiModelProperty("环境id") + private String envId; + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public List getHeaders() { + return headers; + } + + public void setHeaders(List headers) { + this.headers = headers; + } + + public List> getTableData() { + return tableData; + } + + public void setTableData(List> tableData) { + this.tableData = tableData; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } + + public String getTreeId() { + return treeId; + } + + public void setTreeId(String treeId) { + this.treeId = treeId; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsDeleteDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsDeleteDto.java new file mode 100644 index 0000000..5651f4a --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsDeleteDto.java @@ -0,0 +1,23 @@ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.util.List; + +@JsonSerialize +@ApiModel(description = "数据集删除实体") +public class DataSetsDeleteDto implements Serializable { + @ApiModelProperty("数据集id列表") + private List setIds; + + public List getSetIds() { + return setIds; + } + + public void setSetIds(List setIds) { + this.setIds = setIds; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsDetailDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsDetailDto.java new file mode 100644 index 0000000..540048a --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsDetailDto.java @@ -0,0 +1,70 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.dataPool.db.entity.DataSets; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** +* Restful接口--资源详情--数据传输对象:数据集 +* +* createdate: 2022-10-24 17:01:19
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据集") +public class DataSetsDetailDto extends DataSets implements Serializable +{ + @ApiModelProperty("创建人名称") + private String creator; + + @ApiModelProperty("修改人名称") + private String modifier; + + @ApiModelProperty("数据表头") + private List tableHeader; + + @ApiModelProperty("数据内容 key-列名 value-该列数据信息列表") + private Map> tableContent; + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getModifier() { + return modifier; + } + + public void setModifier(String modifier) { + this.modifier = modifier; + } + + public List getTableHeader() { + return tableHeader; + } + + public void setTableHeader(List tableHeader) { + this.tableHeader = tableHeader; + } + + public Map> getTableContent() { + return tableContent; + } + + public void setTableContent(Map> tableContent) { + this.tableContent = tableContent; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsQueryDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsQueryDto.java new file mode 100644 index 0000000..2583898 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsQueryDto.java @@ -0,0 +1,88 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.List; + +/** +* 查询接口--数据传输对象:数据集 +* +* createdate: 2022-10-24 17:01:19
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据集查询实体") +public class DataSetsQueryDto implements Serializable +{ + /** + * 数据集名称
+ */ + @ApiModelProperty("数据集名称") + @Size(max = 32, message="数据集名称-name: 数据长度不能 > 32" ) + private String name; + /** + * 目录id
+ */ + @ApiModelProperty("目录id") + @Size(max = 32, message="目录id-treeId: 数据长度不能 > 32" ) + private String treeId; + + @ApiModelProperty("目录id列表") + private List treeIds; + + @ApiModelProperty("系统id列表") + private List proIds; + + @ApiModelProperty("租户id") + @Size(max = 32, message="租户id-tenantId: 数据长度不能 > 32" ) + private String tenantId; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public List getTreeIds() { + return treeIds; + } + + public void setTreeIds(List treeIds) { + this.treeIds = treeIds; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTreeId() { + return treeId; + } + + public void setTreeId(String treeId) { + this.treeId = treeId; + } + + public List getProIds() { + return proIds; + } + + public void setProIds(List proIds) { + this.proIds = proIds; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsSaveDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsSaveDto.java new file mode 100644 index 0000000..039a97f --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsSaveDto.java @@ -0,0 +1,75 @@ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +@JsonSerialize +@ApiModel(description = "数据集内容实体") +public class DataSetsSaveDto implements Serializable { + /** + * 数据集id
+ */ + @ApiModelProperty("数据集id") + @Size(max = 32, message="数据集id-dataSetId: 数据长度不能 > 32" ) + @NotBlank(message = "数据集id不能为空") + private String dataSetId; + + @ApiModelProperty("环境id") + private String envId; + + @ApiModelProperty("环境名称") + private String envName; + + @ApiModelProperty("数据表头") + private List tableHeader; + + @ApiModelProperty("数据内容 key-列名 value-该列数据信息列表") + private Map> tableContent; + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public String getEnvName() { + return envName; + } + + public void setEnvName(String envName) { + this.envName = envName; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public List getTableHeader() { + return tableHeader; + } + + public void setTableHeader(List tableHeader) { + this.tableHeader = tableHeader; + } + + public Map> getTableContent() { + return tableContent; + } + + public void setTableContent(Map> tableContent) { + this.tableContent = tableContent; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsUpdateDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsUpdateDto.java new file mode 100644 index 0000000..a8bf560 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/dto/dataSets/DataSetsUpdateDto.java @@ -0,0 +1,100 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.dataPool.dto.dataSets; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** +* Restful接口--更新资源--数据传输对象:数据集 +* +* createdate: 2022-10-24 17:01:19
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "数据集") +public class DataSetsUpdateDto implements Serializable +{ + /** + * 数据集名称
+ */ + @ApiModelProperty("数据集名称") + @Size(max = 32, message="数据集名称-name: 数据长度不能 > 32" ) + @NotBlank(message = "数据集名称不能为空") + private String name; + /** + * 描述
+ */ + @ApiModelProperty("描述") + @Size(max = 255, message="描述-description: 数据长度不能 > 255" ) + private String description; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id-proId: 数据长度不能 > 32" ) + @NotBlank(message = "系统id不能为空") + private String proId; + /** + * 目录id
+ */ + @ApiModelProperty("目录id") + @Size(max = 32, message="目录id-treeId: 数据长度不能 > 32" ) + @NotBlank(message = "目录id不能为空") + private String treeId; + /** + * 数据集id
+ */ + @ApiModelProperty("数据集id") + @Size(max = 32, message="数据集id-dataSetId: 数据长度不能 > 32" ) + @NotBlank(message = "数据集id不能为空") + private String dataSetId; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } + + public String getTreeId() { + return treeId; + } + + public void setTreeId(String treeId) { + this.treeId = treeId; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/enums/DataHeaderType.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/enums/DataHeaderType.java new file mode 100644 index 0000000..3c5773b --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/enums/DataHeaderType.java @@ -0,0 +1,35 @@ +package net.northking.cctp.dataPool.enums; + +public enum DataHeaderType { + STRING("0","string"), + MAP("1","keyValue"), + BOOLEAN("2","boolean"), + ARRAY("3","array"), + JSON("4","json"), + XML("5","xml"), + HTML("6","html"); + + private String code; + private String name; + DataHeaderType(String code, String name){ + this.code = code; + this.name = name; + } + public static String getName(String code){ + for (DataHeaderType value : DataHeaderType.values()) { + if (code.equals(value.code)) { + return value.name; + } + } + return ""; + } + + public static String getCode(String name){ + for (DataHeaderType value : DataHeaderType.values()) { + if (name.equals(value.name)) { + return value.code; + } + } + return ""; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/enums/DataPoolError.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/enums/DataPoolError.java new file mode 100644 index 0000000..d0e9aa5 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/enums/DataPoolError.java @@ -0,0 +1,99 @@ +package net.northking.cctp.dataPool.enums; + +import net.northking.cctp.common.exception.PlatformError; + +/** + * 自定义异常信息 + */ +public enum DataPoolError implements PlatformError { + //目录树管理 + TREE_NAME_VALID("目录名称不可包含【/】或者【\\】"), + TREE_NO_EXISTS("当前目录不存在,请刷新列表"), + TREE_NAME_EXISTS("当前目录名称已存在"), + TREE_ADD_DATA_EXISTS("所选父目录存在数据,不可新建目录"), + TREE_DEL_DIR_EXISTS("该目录下有子目录,不允许删除!"), + TREE_DEL_DATA_EXISTS("该目录下存在数据,不允许删除!"), + TREE_LEVEL_LIMIT("超过树节点层级上限10级"), + TREE_MOVE_DATA_EXISTS("目标目录存在数据,不可拖拽"), + //数据集管理 + SET_NAME_NO_UNIQUE("数据集名称[{0}]在该目录下已存在"), + SET_NAME_IS_VALID("数据集名称不可包含特殊符号"), + SETS_DIR_VALID("所选目录不合法,请选择存在的叶子节点"), + SETS_NO_EXISTS("当前数据集不存在,请刷新列表"), + SETS_DATA_IS_NULL("数据集文件内容为空"), + COLUMN_IS_NULL("列信息为空"), + COLUMN_NAME_IS_NULL("列名不能为空"), + COLUMN_NAME_IS_TOO_LONG("列名长度不可超过30"), + COLUMN_TYPE_IS_NULL("列类型不能为空"), + COLUMN_TYPE_IS_WRONG("列类型错误!"), + COLUMN_IS_EXSITS("同名列已存在"), + HEADER_CONTENT_NO_MATCH("表头与数据不匹配"), + IMPORT_FILE_IS_NULL("导入文件为空"), + IMPORT_EXCEL_FILE_IS_TOO_LARGE("导入文件大小不可超过2M"), + IMPORT_FILE_FORMART_IS_ERROR("导入文件格式不正确"), + IMPORT_EXCEL_CELL_IS_NULL("导入文件表头列数据不能为空"), + IMPORT_COLUMN_IS_EXSITS("导入文件表头列名不能重复"), + IMPORT_COLUMN_IS_TOO_LONG("导入文件表头列名长度不能超过30"), + IMPORT_COLUMN_IS_INVALID("导入失败:当前excel为无效文件!!!"), + PROJECT_NO_REFER_ENV("新增数据失败:当前系统未关联环境!!!"), + //模糊数据管理 + DATA_RESOURCE_PACKAGE_UPLOAD_FAIL("资源包上传失败"), + DATA_RESOURCE_PACKAGE_IS_NULL("当前资源包不存在,请刷新列表"), + DATA_RULE_IS_NULL("所选规则不存在,请刷新列表"), + DATA_RULE_NAME_IS_EXSIT("同名数据规则已存在"), + DATA_RULE_EXP_IS_NULL("数据规则内容不能为空"), + DATA_RULE_REXP_IS_VALID("正则表达式语法错误,请重新检查"), + DATA_RULE_NOT_SUPPORT_TYPE("数据规则脚本暂不支持所选类型"), + DATA_RESOURCE_PACKAGE_LOAD_FAIL("数据规则资源包加载失败"), + DATA_RULE_EXECUTE_RESULT_IS_NULL("规则测试结果为null,请检查语法"), + DATA_RULE_EXECUTE_RESULT_IS_EXCEPTION("规则测试执行异常,请检查语法"), + PARAM_IS_MISSING("缺少请求参数"), + DATA_SET_HAS_LINK("当前静态数据集存在关联,删除失败!"), + FUZZY_DATA_SET_HAS_LINK("当前模糊数据存在关联,删除失败!"), + + //文件IO管理 + FILE_IS_NULL("文件不能为空!"), + FILE_UPLOAD_ERROR("文件上传失败"), + FILE_DOWNLOAD_ERROR("文件下载失败"), + FILE_READ_ERROR("读取文件内容失败"), + FILE_DEL_ERROR("文件删除失败"), + FILE_ID_ERROR("文件id有误"), + FILE_IS_NOT_EXCEL("导入异常,当前文件非正常格式的Excel文件!"), + FILE_NAME_IS_NULL("导入异常,文件名称不能为空!"), + + //excel + EXCEL_HEADER_IS_NULL("导入文件的第1列数据存在空值,请修改文件再导入!"), + EXCEL_FILE_READ_ERROR("导入失败:当前Excel为无效文件!"), + EXCEL_FISRT_SHEET_NULL("Excel文件中首个工作表为空!"), + EXCEL_NAME_IS_NULL("Excel文件名称为空,导入失败!"), + TABLE_HEADER_NAME_ERROR("导入文件中的表头字段第{0}列名称【{1}】跟前端界面字段【{2}】不一致!"), + TABLE_HEADER_SIZE_UNEQULE("导入文件中的表头字段数跟前端界面显示的不一致!"), + EXCEL_HEADER_HAS_SAME("表头存在重复数据,请修改Excel文件!"), + + //日志管理 + INSERT_LOG_FAIL("日志创建失败"); + private final Integer code; + private final String msg; + + private static final int START_CODE = 220000; + + DataPoolError(Integer code, String msg) { + this.code = code; + this.msg = msg; + } + + DataPoolError(String msg) { + this.code = ordinal() + START_CODE; + this.msg = msg; + } + + @Override + public Integer getCode() { + return code; + } + + @Override + public String getMsg() { + return msg; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/AttachmentFeignClient.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/AttachmentFeignClient.java new file mode 100644 index 0000000..cf8db24 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/AttachmentFeignClient.java @@ -0,0 +1,29 @@ +package net.northking.cctp.dataPool.feign; + +import io.swagger.annotations.ApiParam; +import net.northking.cctp.common.dto.AssociatedFilesDto; +import net.northking.cctp.common.feign.FeignCctpConfig; +import net.northking.cctp.common.http.ResultWrapper; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.Map; + +@FeignClient(name = "cctp-files", path = "/cctp-files", configuration = {FeignCctpConfig.class}) +public interface AttachmentFeignClient { + + @PostMapping(value = "/v1/update", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper update(Map file); + + @PostMapping(value = "/pub/associatedFiles") + ResultWrapper associatedFiles(@ApiParam(value = "关联文件请求对象") @RequestBody AssociatedFilesDto associatedFilesDto); + + @GetMapping(value = "/pub/deleteFileByObjIdAndBusinessCode") + void deleteFileByObjId(@RequestParam("objectId") String objectId, @RequestParam("businessCode") String businessCode); +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/ProjectFeignClient.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/ProjectFeignClient.java new file mode 100644 index 0000000..c4ff485 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/ProjectFeignClient.java @@ -0,0 +1,26 @@ +package net.northking.cctp.dataPool.feign; + +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.feign.FeignCctpConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@FeignClient(name = "cctp-projects", configuration = {FeignCctpConfig.class}, path = "/cctp-projects") +public interface ProjectFeignClient { + + @ApiOperation(value = "根据系统id查关联的环境id集合") + @PostMapping(value = "/v1/query/selectEnvIds", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + List selectEnvIds(@RequestParam("proId") String proId); + + @ApiOperation(value = "查询系统关联的环境排序") + @PostMapping(value = "/v1/query/envListSeq", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + List queryEnvListSeq(@RequestParam("proId") String proId); +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/ScriptFeignClient.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/ScriptFeignClient.java new file mode 100644 index 0000000..6aedc15 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/ScriptFeignClient.java @@ -0,0 +1,19 @@ +package net.northking.cctp.dataPool.feign; + +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.feign.FeignCctpConfig; +import net.northking.cctp.dataPool.feign.dto.AtuInputDataSetResultDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +@FeignClient(name = "atu-script-case", configuration = {FeignCctpConfig.class}, path = "/atu-script-case") +public interface ScriptFeignClient { + + @ApiOperation(value = "查询静态数据集存在关联") + @PostMapping(value = "/v1/selectLinkBySetId") + List selectLinkBySetId(@RequestBody List setId); + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/dto/AtuInputDataSetResultDto.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/dto/AtuInputDataSetResultDto.java new file mode 100644 index 0000000..dc9441d --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/feign/dto/AtuInputDataSetResultDto.java @@ -0,0 +1,25 @@ +package net.northking.cctp.dataPool.feign.dto; + + +public class AtuInputDataSetResultDto { + + private String setId; + + private Integer countNum; + + public String getSetId() { + return setId; + } + + public void setSetId(String setId) { + this.setId = setId; + } + + public Integer getCountNum() { + return countNum; + } + + public void setCountNum(Integer countNum) { + this.countNum = countNum; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/EnvNameUtils.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/EnvNameUtils.java new file mode 100644 index 0000000..2ee141d --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/EnvNameUtils.java @@ -0,0 +1,48 @@ +package net.northking.cctp.dataPool.utils; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.constants.BaseDefineDependencyConstants; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.entity.Environment; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.exception.InvalidException; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import net.northking.cctp.common.feign.ApiAtsEnviromentFeign; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class EnvNameUtils { + + private static final Logger logger = LoggerFactory.getLogger(EnvNameUtils.class); + + @Autowired + private ApiAtsEnviromentFeign apiAtsEnviromentFeign; + + public String getEnvName(String envId) { + if (StringUtils.isNotBlank(envId)) { + Long id = null; + try { + id = Long.valueOf(envId); + } catch (NumberFormatException e) { + logger.error("环境Id类型转化异常"); + throw new InvalidException("环境Id类型转化异常"); + } + List envIds = new ArrayList<>(); + envIds.add(id); + ResponseVO> responseVo = apiAtsEnviromentFeign.getEnvInfoById(envIds); + if (responseVo == null || !responseVo.getCode().equals(BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS)) { + throw new InvalidException("服务间调用获取环境信息失败"); + } + + if (responseVo.getData() != null) { + return responseVo.getData().get(0).getName(); + } + } + return null; + } + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/ExcelUtils.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/ExcelUtils.java new file mode 100644 index 0000000..81f8e52 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/ExcelUtils.java @@ -0,0 +1,207 @@ +package net.northking.cctp.dataPool.utils; + +import net.northking.cctp.dataPool.dto.dataSets.DataContentDto; +import net.northking.cctp.dataPool.dto.dataSets.DataHeaderDto; +import net.northking.cctp.dataPool.dto.dataSets.DataSetsSaveDto; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +public class ExcelUtils { + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(ExcelUtils.class); + + public static Workbook exportToExcel(DataSetsSaveDto saveDto, String sheetName, Boolean isXssf){ + Workbook workbook = null; + if (isXssf) { + workbook = new XSSFWorkbook(); + } else { + workbook = new HSSFWorkbook(); + } + //工作表 + Sheet sheet = workbook.createSheet(sheetName); + if (null == saveDto) { + return workbook; + } + List headers = saveDto.getTableHeader(); + Map> data = saveDto.getTableContent(); + //无表头则直接返回空表 + if (CollectionUtils.isEmpty(headers)) { + return workbook; + } + //表头 + Row headerRow = sheet.createRow(0); + Map columnWidth = new HashMap<>(); + //设置表头样式 + CellStyle headerStyle = getHeaderStyle(workbook); + for (int i = 0; i < headers.size(); i++) { + DataHeaderDto headerDto = headers.get(i); + if (null == headerDto) continue; + Cell cell = getHeaderCell(headerDto,headerRow,i,sheet); + String name = headerDto.getName(); + int width = name.getBytes().length * 256 + 512; + if (width > 15000) { + width = 15000; + } + columnWidth.put(i, width); + cell.setCellValue(name); + cell.setCellStyle(headerStyle); + } + //数据样式 + if (!CollectionUtils.isEmpty(data)) { + CellStyle bodyStyle = getBodyStyle(workbook); + List> rowMapList = getRowMapList(saveDto); + for (int rowNum = 0; rowNum < rowMapList.size(); rowNum++) { + Map rowMap = rowMapList.get(rowNum); + Row row = sheet.createRow(rowNum + 1); + for (int colNum = 0; colNum < headers.size(); colNum++) { + DataHeaderDto header = headers.get(colNum); + Cell cell = getBodyCell(header, rowMap,row,rowNum,colNum,columnWidth); + if (null == cell) break; + cell.setCellStyle(bodyStyle); + } + } + } + //设置列宽 + for (int i = 0; i < headers.size(); i++) { + sheet.setColumnWidth(i,columnWidth.get(i)); + } + return workbook; + } + + /** + * 获取行结构数据 + * @param dto + * @return + */ + private static List> getRowMapList(DataSetsSaveDto dto) { + List> res = new ArrayList<>(); + List tableHeader = dto.getTableHeader(); + Map> tableContent = dto.getTableContent(); + if (CollectionUtils.isEmpty(tableHeader) || CollectionUtils.isEmpty(tableContent)) { + return res; + } + List nameList = new ArrayList<>(); + int rowNum = 0; + //统计各列数据最大行数 + for (int i = 0; i < tableHeader.size(); i++) { + DataHeaderDto headerDto = tableHeader.get(i); + if (null == headerDto) continue; + nameList.add(headerDto.getName()); + List contentDtos = tableContent.get(headerDto.getName()); + //最大行数与当前列数据量比较 + rowNum = (contentDtos.size() > rowNum) ? contentDtos.size() : rowNum; + } + //整理每行数据 + for(int i = 0; i < rowNum; i++) { + Map row = new HashMap<>(); + for(int j = 0; j < nameList.size(); j++) { + String name = nameList.get(j); + List columnData = tableContent.get(name); + //如果该格无数据则存空串 + if (CollectionUtils.isEmpty(columnData) || columnData.size() <= i) { + row.put(name,""); + } else { + row.put(name, columnData.get(i).getValue()); + } + } + res.add(row); + } + return res; + } + + private static Cell getBodyCell(DataHeaderDto header, Map rowMap, Row row, int rowNum, int columnNum, Map columnWidth) { + Cell cell = null; + String type = header.getType(); + String name = header.getName(); + if (null != rowMap.get(name)) { + Object o = rowMap.get(name); + if ("boolean".equals(type)) { + cell = row.createCell(columnNum, CellType.BOOLEAN); + cell.setCellValue(Boolean.parseBoolean(o.toString())); + } else { + cell = row.createCell(columnNum, CellType.STRING); + String value = o.toString(); + Integer width = columnWidth.get(columnNum); + int newWidth = value.getBytes().length * 256 + 200; + if (newWidth > width && newWidth <= 15000) { + columnWidth.put(columnNum, newWidth); + } else if (newWidth > 15000) { + columnWidth.put(columnNum, 15000); + } + cell.setCellValue(value); + } + }else { + //未传值则存空字符串 + cell = row.createCell(columnNum, CellType.STRING); + Integer width = columnWidth.get(columnNum); + columnWidth.put(columnNum, width>200 ? width : 200); + cell.setCellValue(""); + } + return cell; + } + + private static Cell getHeaderCell(DataHeaderDto dataMap, Row row, int index,Sheet sheet) { + Cell cell = null; + String type = dataMap.getType(); + if ("date".equals(type)) { + cell = row.createCell(index, CellType.NUMERIC); + } else if ("int".equals(type)) { + cell = row.createCell(index, CellType.NUMERIC); + } else if ("boolean".equals(type)) { + cell = row.createCell(index, CellType.BOOLEAN); + } else { + cell = row.createCell(index, CellType.STRING); + } + return cell; + } + + private static CellStyle getHeaderStyle(Workbook workbook) { + CellStyle headerStyle = workbook.createCellStyle(); + headerStyle.setAlignment(HorizontalAlignment.CENTER); //水平居中 + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); //垂直居中 + headerStyle.setWrapText(true); //自动换行 + headerStyle.setBorderTop(BorderStyle.THIN); //边框 + headerStyle.setBorderBottom(BorderStyle.THIN); + headerStyle.setBorderLeft(BorderStyle.THIN); + headerStyle.setBorderRight(BorderStyle.THIN); + //字体 + Font headerFont = workbook.createFont(); + headerFont.setFontName("黑体"); + headerFont.setFontHeightInPoints((short) 14); + headerStyle.setFont(headerFont); + //背景 + headerStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + return headerStyle; + } + + private static CellStyle getBodyStyle(Workbook workbook) { + CellStyle headerStyle = workbook.createCellStyle(); + headerStyle.setAlignment(HorizontalAlignment.CENTER); //水平居中 + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); //垂直居中 + headerStyle.setWrapText(true); //自动换行 + headerStyle.setBorderTop(BorderStyle.THIN); //边框 + headerStyle.setBorderBottom(BorderStyle.THIN); + headerStyle.setBorderLeft(BorderStyle.THIN); + headerStyle.setBorderRight(BorderStyle.THIN); + //字体 + Font headerFont = workbook.createFont(); + headerFont.setFontName("宋体"); + headerFont.setFontHeightInPoints((short) 12); + headerStyle.setFont(headerFont); + return headerStyle; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/MinioPathUtils.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/MinioPathUtils.java new file mode 100644 index 0000000..5fa873f --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/MinioPathUtils.java @@ -0,0 +1,140 @@ +package net.northking.cctp.dataPool.utils; + +import com.alibaba.fastjson.JSON; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.common.s3.SimpleStorageService; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.dataPool.enums.DataPoolError; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.io.*; + +@Component +public class MinioPathUtils { + private static final Logger logger = LoggerFactory.getLogger(MinioPathUtils.class); + + private static final String TEMP_FILE_PATH = MinioPathUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + + @Autowired + private static SimpleStorageService simpleStorageService; + + public static String pathToId(String tenantId,String path){ + if (!path.startsWith("/")) { + path = "/" + path; + } + if (path.endsWith("/")) { + path = path.substring(0, path.length() - 1); + } + String str = path.replaceAll("/", "_"); + return tenantId + str; + } + + + + /** + * 第一个是租户id,第二个是文件id,第三个是文件名 + * @param fileId + * @return + */ + public static String[] idToPath(String fileId) { + String[] result = new String[3]; + if (fileId.startsWith("/") || fileId.startsWith("_")) { + fileId = fileId.substring(1); + } + if (fileId.endsWith("/") || fileId.endsWith("_")) { + fileId = fileId.substring(0, fileId.length() - 1); + } + int index = fileId.indexOf("_"); + result[0] = fileId.substring(0, index); //租户id + result[1] = fileId.substring(index + 1); //文件id + result[2] = result[1]; //文件名 + return result; + } + + public static File objectToJsonFile(T t) { + String objectStr = JSON.toJSONString(t); + byte[] bytes = new byte[0]; + try { + bytes = objectStr.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + logger.error("",e); + logger.info("数据转换二进制失败"); + } + ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); //获取脚本输入流 + File tempFilePath = new File(TEMP_FILE_PATH); + if (!tempFilePath.exists()) { + tempFilePath.mkdirs(); + } + File file = new File(TEMP_FILE_PATH + "/tempFile" + UUIDUtil.create32UUID() + ".json"); + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(file); + byte[] readBytes = new byte[1024 * 1024]; + int length = 0; + while ((length = inputStream.read(readBytes, 0, readBytes.length)) > 0) { + fileOutputStream.write(readBytes,0,length); + } + fileOutputStream.flush(); + } catch (Exception e) { + logger.error("object写入文件出错"); + }finally { + if (null != inputStream) { + try { + inputStream.close(); + } catch (IOException e) { + logger.error("",e); + } + } + if (null != fileOutputStream) { + try { + fileOutputStream.close(); + } catch (IOException e) { + logger.error("",e); + } + } + } + return file; + } + + public static T getFileContent(InputStream inputStream, Class clazz) { + InputStreamReader streamReader = null; + BufferedReader reader = null; + T t = null; + try { + streamReader = new InputStreamReader(inputStream,"UTF-8"); + reader = new BufferedReader(streamReader); + StringBuilder builder = new StringBuilder(); + String temp = ""; + while (null != (temp = reader.readLine())) { + builder.append(temp); + } + String jsonStr = builder.toString(); + if (StringUtils.hasText(jsonStr)) { + t = JSON.parseObject(JSON.parse(jsonStr).toString(), clazz); + } + } catch (IOException e) { + logger.error("读取文件内容失败"); + throw new PlatformRuntimeException(DataPoolError.FILE_READ_ERROR); + }finally { + if (null != streamReader) { + try { + streamReader.close(); + } catch (IOException e) { + logger.error("",e); + } + } + if (null != reader) { + try { + reader.close(); + } catch (IOException e) { + logger.error("",e); + } + } + } + return t; + } +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/MyUrlClassLoader.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/MyUrlClassLoader.java new file mode 100644 index 0000000..c407c98 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/MyUrlClassLoader.java @@ -0,0 +1,94 @@ +package net.northking.cctp.dataPool.utils; + +import net.northking.cctp.dataPool.constants.DataPoolConstant; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.*; +import java.util.ArrayList; +import java.util.List; + +/** + * @author zhengbang.jiang + * @date 2021/1/12 + * @since 1.0 + */ +public class MyUrlClassLoader extends URLClassLoader { + + private List cachedJarFiles = new ArrayList<>(); + + private List jarFiles = new ArrayList<>(); + + private static final Logger logger = LoggerFactory.getLogger(MyUrlClassLoader.class); + + public MyUrlClassLoader() { + super(new URL[]{}, findParentClassLoader()); + } + + private static ClassLoader findParentClassLoader() { + ClassLoader parent = net.northking.cctp.dataPool.utils.MyUrlClassLoader.class.getClassLoader(); + if (parent == null) { + parent = net.northking.cctp.dataPool.utils.MyUrlClassLoader.getSystemClassLoader(); + } + return parent; + } + + public void addURLFile(File f) throws MalformedURLException { + jarFiles.add(f); + String jarStr = "jar:" + f.toURI().toURL().toExternalForm() + "!/"; + URL file = new URL(jarStr); + try { + URLConnection uc = file.openConnection(); + if (uc instanceof JarURLConnection) { + uc.setUseCaches(true); + ((JarURLConnection) uc).getManifest(); + cachedJarFiles.add((JarURLConnection) uc); + Method method = URLClassLoader.class.getDeclaredMethod(DataPoolConstant.ADD_URL, URL.class); + URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); + boolean accessible = method.isAccessible(); + try { + if (!accessible) { + method.setAccessible(true); + } + URL url1 = file.toURI().toURL(); + method.invoke(classLoader, url1); + } catch (IllegalAccessException e) { + logger.error("",e); + } catch (MalformedURLException e) { + logger.error("",e); + } catch (InvocationTargetException e) { + logger.error("",e); + } finally { + method.setAccessible(accessible); + } + } + } catch (Exception e) { + logger.error("",e); + } + } + + public void unloadJarFiles() { + List list = new ArrayList<>(); + for (JarURLConnection url : cachedJarFiles) { + try { + list.add(url); + url.getJarFile().close(); + url = null; + } catch (Exception e) { + logger.error("",e); + } + } + cachedJarFiles.removeAll(list); + list = null; + for (File jarFile : jarFiles) { + boolean delete = jarFile.delete(); + if (!delete) { + logger.error("删除文件失败"); + } + } + } + +} diff --git a/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/ScriptUtil.java b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/ScriptUtil.java new file mode 100644 index 0000000..6d2d2fc --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/java/net/northking/cctp/dataPool/utils/ScriptUtil.java @@ -0,0 +1,30 @@ +package net.northking.cctp.dataPool.utils; + +import bsh.EvalError; +import bsh.Interpreter; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class ScriptUtil { + + + //传进脚本内容,返回执行结果 + public static Object executeBeanShell(String scriptContent) throws EvalError { + Interpreter interpreter = new Interpreter(); + Object o = interpreter.eval(scriptContent); + return o; + } + + public static List executesBeanShell(String scriptContent,Integer execNum) throws EvalError { + List values = new ArrayList(); + for (Integer i = 0; i < execNum; i++) { + values.add(executeBeanShell(scriptContent)); + + } + return values; + } + +} diff --git a/cctp-atu/atu-data-mgr/src/main/resources/application.bak.yml b/cctp-atu/atu-data-mgr/src/main/resources/application.bak.yml new file mode 100644 index 0000000..4382504 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/application.bak.yml @@ -0,0 +1,93 @@ +server: + port: 8911 + +spring: + application: + name: atu-data-mgr-cxq + cloud: + inetutils: + timeout-seconds: 10 + nacos: + discovery: + namespace: ${NACOS_NAMESPACE:CCTP_PLUS_DEV} + server-addr: ${NACOS_SERVER_URL:192.168.77.26:8848} + config: + enabled: false + namespace: ${spring.cloud.nacos.discovery.namespace} + # 配置中心地址 + server-addr: ${spring.cloud.nacos.discovery.server-addr} + # 配置文件格式 + file-extension: yml + # 长轮询的超时时间 + config-long-poll-timeout: ${NACOS_LONG_POLL_TIMEOUT:180000} + # 共享配置 + shared-configs[0]: + data_id: application-common-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + group: DEFAULT_GROUP + refresh: true + datasource: + name: Hikari-CCTP + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://192.168.77.26:3306/atu_data_mgr?allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai + username: northking + password: northking@002987 + # initialization-mode: always + # schema: classpath:db/mysql/schema/*.sql + # data: classpath:db/mysql/data/*.sql + hikari: + minimum-idle: 2 + maximum-pool-size: 5 + auto-commit: true + redis: + host: 192.168.77.26 + port: 6379 + password: northking@002987 + database: 1 + lettuce: + pool: + max-active: 2 + max-idle: 2 + rabbitmq: + host: 172.16.77.26 + port: 5672 + virtual-host: cloud + username: cloud + password: 123456 + jackson: + serialization: + write-dates-as-timestamps: true + + +logging: + config: classpath:logback-rabbitmq.xml + +mybatis: + configuration: + map-underscore-to-camel-case: true + mapper-locations: classpath*:mybatis/**/*.xml + type-aliases-package: net.northking.cctp.dataPool.db.entity + configuration-properties: + defaultSchema: atu_data_mgr + +nk: + security: + include-urls: + - "/v1/*" + swagger2: + basePackage: net.northking.cctp + title: ${spring.application.name} + description: description + version: 2.9.2 + platform: + examString: test + examObj: + ip: 110.110.110.110 + port: 9527 + + + + + + + + diff --git a/cctp-atu/atu-data-mgr/src/main/resources/banner.txt b/cctp-atu/atu-data-mgr/src/main/resources/banner.txt new file mode 100644 index 0000000..92ce84b --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/banner.txt @@ -0,0 +1,8 @@ + _ _ _ _ _ _ +| \ | | | | | | | | (_) +| \| | ___ _ __ | |_ | |__ | | __ _ _ __ __ _ +| . ` | / _ \ | '__|| __|| '_ \ | |/ /| || '_ \ / _` | +| |\ || (_) || | | |_ | | | || < | || | | || (_| | +\_| \_/ \___/ |_| \__||_| |_||_|\_\|_||_| |_| \__, | + __/ | + |___/ \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/resources/bootstrap.yml b/cctp-atu/atu-data-mgr/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..4ad391e --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/bootstrap.yml @@ -0,0 +1,112 @@ +spring: + profiles: + active: ${APP_PROFILE:dev} + application: + name: atu-data-mgr + + +--- +spring: + profiles: dev + cloud: + nacos: + discovery: + namespace: ${NACOS_NAMESPACE:UI-DEV} + server-addr: ${NACOS_SERVER_URL:158.1.12.237:8848} + config: + enabled: true + namespace: ${spring.cloud.nacos.discovery.namespace} + # 配置中心地址 + server-addr: ${spring.cloud.nacos.discovery.server-addr} + # 配置文件格式 + file-extension: yml + # 长轮询的超时时间 + config-long-poll-timeout: ${NACOS_LONG_POLL_TIMEOUT:180000} + # 共享配置 + shared-configs[0]: + data_id: application-common-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + group: DEFAULT_GROUP + refresh: true + shared-configs[1]: + data_id: ats-common-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + group: DEFAULT_GROUP + refresh: true + +--- +spring: + profiles: test + cloud: + nacos: + discovery: + namespace: ${NACOS_NAMESPACE:UI-test} + server-addr: ${NACOS_SERVER_URL:197.68.24.40:8848} + config: + enabled: true + namespace: ${spring.cloud.nacos.discovery.namespace} + # 配置中心地址 + server-addr: ${spring.cloud.nacos.discovery.server-addr} + # 配置文件格式 + file-extension: yml + # 长轮询的超时时间 + config-long-poll-timeout: ${NACOS_LONG_POLL_TIMEOUT:180000} + # 共享配置 + shared-configs[0]: + data_id: application-common-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + group: DEFAULT_GROUP + refresh: true + shared-configs[1]: + data_id: ats-common-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + group: DEFAULT_GROUP + refresh: true +--- +spring: + profiles: uat + cloud: + nacos: + discovery: + namespace: ${NACOS_NAMESPACE:UI-uat} + server-addr: ${NACOS_SERVER_URL:197.68.31.132:8848} + config: + enabled: true + namespace: ${spring.cloud.nacos.discovery.namespace} + # 配置中心地址 + server-addr: ${spring.cloud.nacos.discovery.server-addr} + # 配置文件格式 + file-extension: yml + # 长轮询的超时时间 + config-long-poll-timeout: ${NACOS_LONG_POLL_TIMEOUT:180000} + # 共享配置 + shared-configs[0]: + data_id: application-common-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + group: DEFAULT_GROUP + refresh: true + shared-configs[1]: + data_id: ats-common-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + group: DEFAULT_GROUP + refresh: true +--- +spring: + profiles: prod + cloud: + nacos: + discovery: + namespace: ${NACOS_NAMESPACE:UI-prod} + server-addr: ${NACOS_SERVER_URL:197.68.31.194:8848} + config: + enabled: true + namespace: ${spring.cloud.nacos.discovery.namespace} + # 配置中心地址 + server-addr: ${spring.cloud.nacos.discovery.server-addr} + # 配置文件格式 + file-extension: yml + # 长轮询的超时时间 + config-long-poll-timeout: ${NACOS_LONG_POLL_TIMEOUT:180000} + # 共享配置 + shared-configs[0]: + data_id: application-common-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + group: DEFAULT_GROUP + refresh: true + shared-configs[1]: + data_id: ats-common-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + group: DEFAULT_GROUP + refresh: true \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/resources/logback-rabbitmq.xml b/cctp-atu/atu-data-mgr/src/main/resources/logback-rabbitmq.xml new file mode 100644 index 0000000..3f35236 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/logback-rabbitmq.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level | %X{trace_id} | %X{span_id} | [%thread] %-5level %logger{36} : %msg%n + UTF-8 + + + + + + ${log_path}/${app_name}.log + + ${log_path}/${app_name}-%d{yyyy-MM-dd}.%i.log + 10 + 10MB + + true + + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level | %X{trace_id} | %X{span_id} | [%thread] %-5level %logger{36} : %msg%n + UTF-8 + + + + + + + + + { + "appName":"${app_name}", + "appInstance":"${app_instance_id}", + "date":"%d{yyyy-MM-dd HH:mm:ss.SSS}", + "thread":"[%thread]", + "level":"%-5level", + "logger":"%logger{36}", + "msg":"%msg" + } + + + ${rabbitmq_host} + 5672 + ${rabbitmq_username} + ${rabbitmq_password} + ${rabbitmq_vhost} + + false + direct + logs.direct + logback + true + false + UTF-8 + NON_PERSISTENT + + info + ACCEPT + DENY + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataResourcePackage.Mapper.xml b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataResourcePackage.Mapper.xml new file mode 100644 index 0000000..a2a8aec --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataResourcePackage.Mapper.xml @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + ,name + ,memo + ,package_addr + ,pro_id + ,tenant_id + ,created_by + ,updated_by + ,created_time + ,updated_time + + + + ${defaultSchema}.data_resource_package + + + + + + + + delete from + + where id = #{id,jdbcType=VARCHAR} + + + + delete from + + where id in + + #{idItem, jdbcType=VARCHAR} + + + + + delete from + + + + AND id=#{id,jdbcType=VARCHAR} + + + AND name=#{name,jdbcType=VARCHAR} + + + AND memo=#{memo,jdbcType=VARCHAR} + + + AND package_addr=#{packageAddr,jdbcType=VARCHAR} + + + AND pro_id=#{proId,jdbcType=VARCHAR} + + + AND tenant_id=#{tenantId,jdbcType=VARCHAR} + + + AND created_by=#{createdBy,jdbcType=VARCHAR} + + + AND updated_by=#{updatedBy,jdbcType=VARCHAR} + + + AND created_time=#{createdTime,jdbcType=TIMESTAMP} + + + AND updated_time=#{updatedTime,jdbcType=TIMESTAMP} + + + + + + insert into + + + + id, + + + name, + + + memo, + + + package_addr, + + + pro_id, + + + tenant_id, + + + created_by, + + + updated_by, + + + created_time, + + + updated_time, + + + + + #{id, jdbcType=VARCHAR}, + + + #{name, jdbcType=VARCHAR}, + + + #{memo, jdbcType=VARCHAR}, + + + #{packageAddr, jdbcType=VARCHAR}, + + + #{proId, jdbcType=VARCHAR}, + + + #{tenantId, jdbcType=VARCHAR}, + + + #{createdBy, jdbcType=VARCHAR}, + + + #{updatedBy, jdbcType=VARCHAR}, + + + #{createdTime, jdbcType=TIMESTAMP}, + + + #{updatedTime, jdbcType=TIMESTAMP}, + + + + + + insert into + + + id, + name, + memo, + package_addr, + pro_id, + tenant_id, + created_by, + updated_by, + created_time, + updated_time, + + values + + + #{item.id, jdbcType=VARCHAR}, + #{item.name, jdbcType=VARCHAR}, + #{item.memo, jdbcType=VARCHAR}, + #{item.packageAddr, jdbcType=VARCHAR}, + #{item.proId, jdbcType=VARCHAR}, + #{item.tenantId, jdbcType=VARCHAR}, + #{item.createdBy, jdbcType=VARCHAR}, + #{item.updatedBy, jdbcType=VARCHAR}, + #{item.createdTime, jdbcType=TIMESTAMP}, + #{item.updatedTime, jdbcType=TIMESTAMP}, + + + + + + update + + + + name = #{name, jdbcType=VARCHAR}, + + + memo = #{memo, jdbcType=VARCHAR}, + + + package_addr = #{packageAddr, jdbcType=VARCHAR}, + + + pro_id = #{proId, jdbcType=VARCHAR}, + + + created_by = #{createdBy, jdbcType=VARCHAR}, + + + updated_by = #{updatedBy, jdbcType=VARCHAR}, + + + created_time = #{createdTime, jdbcType=TIMESTAMP}, + + + updated_time = #{updatedTime, jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=VARCHAR} + AND tenant_id = #{tenantId,jdbcType=VARCHAR} + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataRule.Mapper.xml b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataRule.Mapper.xml new file mode 100644 index 0000000..9315537 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataRule.Mapper.xml @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rule_id + ,name + ,type + ,content_expression + ,jar_ids + ,pro_id + ,tenant_id + ,created_by + ,created_time + ,updated_by + ,updated_time + + + + ${defaultSchema}.data_rule + + + + + + + + delete from + + where rule_id = #{ruleId,jdbcType=VARCHAR} + + + + delete from + + where rule_id in + + #{idItem, jdbcType=VARCHAR} + + + + + delete from + + + + AND rule_id=#{ruleId,jdbcType=VARCHAR} + + + AND name=#{name,jdbcType=VARCHAR} + + + AND type=#{type,jdbcType=VARCHAR} + + + AND content_expression=#{contentExpression,jdbcType=LONGVARCHAR} + + + AND jar_ids=#{jarIds,jdbcType=VARCHAR} + + + AND pro_id=#{proId,jdbcType=VARCHAR} + + + AND tenant_id=#{tenantId,jdbcType=VARCHAR} + + + AND created_by=#{createdBy,jdbcType=VARCHAR} + + + AND created_time=#{createdTime,jdbcType=TIMESTAMP} + + + AND updated_by=#{updatedBy,jdbcType=VARCHAR} + + + AND updated_time=#{updatedTime,jdbcType=TIMESTAMP} + + + + + + insert into + + + + rule_id, + + + name, + + + type, + + + content_expression, + + + jar_ids, + + + pro_id, + + + tenant_id, + + + created_by, + + + created_time, + + + updated_by, + + + updated_time, + + + + + #{ruleId, jdbcType=VARCHAR}, + + + #{name, jdbcType=VARCHAR}, + + + #{type, jdbcType=VARCHAR}, + + + #{contentExpression, jdbcType=LONGVARCHAR}, + + + #{jarIds, jdbcType=VARCHAR}, + + + #{proId, jdbcType=VARCHAR}, + + + #{tenantId, jdbcType=VARCHAR}, + + + #{createdBy, jdbcType=VARCHAR}, + + + #{createdTime, jdbcType=TIMESTAMP}, + + + #{updatedBy, jdbcType=VARCHAR}, + + + #{updatedTime, jdbcType=TIMESTAMP}, + + + + + + insert into + + + rule_id, + name, + type, + content_expression, + jar_ids, + pro_id, + tenant_id, + created_by, + created_time, + updated_by, + updated_time, + + values + + + #{item.ruleId, jdbcType=VARCHAR}, + #{item.name, jdbcType=VARCHAR}, + #{item.type, jdbcType=VARCHAR}, + #{item.contentExpression, jdbcType=LONGVARCHAR}, + #{item.jarIds, jdbcType=VARCHAR}, + #{item.proId, jdbcType=VARCHAR}, + #{item.tenantId, jdbcType=VARCHAR}, + #{item.createdBy, jdbcType=VARCHAR}, + #{item.createdTime, jdbcType=TIMESTAMP}, + #{item.updatedBy, jdbcType=VARCHAR}, + #{item.updatedTime, jdbcType=TIMESTAMP}, + + + + + + update + + + + name = #{name, jdbcType=VARCHAR}, + + + type = #{type, jdbcType=VARCHAR}, + + + content_expression = #{contentExpression, jdbcType=LONGVARCHAR}, + + + jar_ids = #{jarIds, jdbcType=VARCHAR}, + + + pro_id = #{proId, jdbcType=VARCHAR}, + + + created_by = #{createdBy, jdbcType=VARCHAR}, + + + created_time = #{createdTime, jdbcType=TIMESTAMP}, + + + updated_by = #{updatedBy, jdbcType=VARCHAR}, + + + updated_time = #{updatedTime, jdbcType=TIMESTAMP}, + + + where rule_id = #{ruleId,jdbcType=VARCHAR} + AND tenant_id = #{tenantId,jdbcType=VARCHAR} + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataSetEnvRel.Mapper.xml b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataSetEnvRel.Mapper.xml new file mode 100644 index 0000000..af422d7 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataSetEnvRel.Mapper.xml @@ -0,0 +1,337 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + ,data_set_id + ,env_id + ,tenant_id + ,seq + ,created_time + ,created_by + ,updated_time + ,updated_by + ,file_addr + + + + ${defaultSchema}.data_set_env_rel + + + + + + + + delete from + + where id = #{id,jdbcType=VARCHAR} + + + + delete from + + where id in + + #{idItem, jdbcType=VARCHAR} + + + + + delete from + + + + + id = #{id,jdbcType=VARCHAR} + + + + AND id=#{id,jdbcType=VARCHAR} + + + AND data_set_id=#{dataSetId,jdbcType=VARCHAR} + + + AND env_id=#{envId,jdbcType=VARCHAR} + + + AND tenant_id=#{tenantId,jdbcType=VARCHAR} + + + AND seq=#{seq,jdbcType=INTEGER} + + + AND created_time=#{createdTime,jdbcType=TIMESTAMP} + + + AND created_by=#{createdBy,jdbcType=VARCHAR} + + + AND updated_time=#{updatedTime,jdbcType=TIMESTAMP} + + + AND updated_by=#{updatedBy,jdbcType=VARCHAR} + + + AND file_addr=#{fileAddr,jdbcType=VARCHAR} + + + + + + insert into + + + + id, + + + data_set_id, + + + env_id, + + + tenant_id, + + + seq, + + + created_time, + + + created_by, + + + updated_time, + + + updated_by, + + + file_addr, + + + + + #{id, jdbcType=VARCHAR}, + + + #{dataSetId, jdbcType=VARCHAR}, + + + #{envId, jdbcType=VARCHAR}, + + + #{tenantId, jdbcType=VARCHAR}, + + + #{seq, jdbcType=INTEGER}, + + + #{createdTime, jdbcType=TIMESTAMP}, + + + #{createdBy, jdbcType=VARCHAR}, + + + #{updatedTime, jdbcType=TIMESTAMP}, + + + #{updatedBy, jdbcType=VARCHAR}, + + + #{fileAddr, jdbcType=VARCHAR}, + + + + + + insert into + + + id, + data_set_id, + env_id, + tenant_id, + seq, + created_time, + created_by, + updated_time, + updated_by, + file_addr, + + values + + + #{item.id, jdbcType=VARCHAR}, + #{item.dataSetId, jdbcType=VARCHAR}, + #{item.envId, jdbcType=VARCHAR}, + #{item.tenantId, jdbcType=VARCHAR}, + #{item.seq, jdbcType=INTEGER}, + #{item.createdTime, jdbcType=TIMESTAMP}, + #{item.createdBy, jdbcType=VARCHAR}, + #{item.updatedTime, jdbcType=TIMESTAMP}, + #{item.updatedBy, jdbcType=VARCHAR}, + #{item.fileAddr, jdbcType=VARCHAR}, + + + + + + update + + + + data_set_id = #{dataSetId, jdbcType=VARCHAR}, + + + env_id = #{envId, jdbcType=VARCHAR}, + + + tenant_id = #{tenantId, jdbcType=VARCHAR}, + + + seq = #{seq, jdbcType=INTEGER}, + + + created_time = #{createdTime, jdbcType=TIMESTAMP}, + + + created_by = #{createdBy, jdbcType=VARCHAR}, + + + updated_time = #{updatedTime, jdbcType=TIMESTAMP}, + + + updated_by = #{updatedBy, jdbcType=VARCHAR}, + + + file_addr = #{fileAddr, jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=VARCHAR} + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataSetTree.Mapper.xml b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataSetTree.Mapper.xml new file mode 100644 index 0000000..17de235 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataSetTree.Mapper.xml @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + ,name + ,parent_id + ,level_no + ,index_no + ,is_leaf + ,path + ,full_name + ,pro_id + ,tenant_id + ,created_by + ,created_time + ,updated_by + ,updated_time + ,description + + + + ${defaultSchema}.data_set_tree + + + + + + + + delete from + + where id = #{id,jdbcType=VARCHAR} + + + + delete from + + where id in + + #{idItem, jdbcType=VARCHAR} + + + + + delete from + + + + AND id=#{id,jdbcType=VARCHAR} + + + AND name=#{name,jdbcType=VARCHAR} + + + AND parent_id=#{parentId,jdbcType=VARCHAR} + + + AND level_no=#{levelNo,jdbcType=INTEGER} + + + AND index_no=#{indexNo,jdbcType=INTEGER} + + + AND is_leaf=#{isLeaf,jdbcType=VARCHAR} + + + AND path=#{path,jdbcType=VARCHAR} + + + AND full_name=#{fullName,jdbcType=VARCHAR} + + + AND pro_id=#{proId,jdbcType=VARCHAR} + + + AND tenant_id=#{tenantId,jdbcType=VARCHAR} + + + AND created_by=#{createdBy,jdbcType=VARCHAR} + + + AND created_time=#{createdTime,jdbcType=TIMESTAMP} + + + AND updated_by=#{updatedBy,jdbcType=VARCHAR} + + + AND updated_time=#{updatedTime,jdbcType=TIMESTAMP} + + + AND description=#{description,jdbcType=VARCHAR} + + + + + + insert into + + + + id, + + + name, + + + parent_id, + + + level_no, + + + index_no, + + + is_leaf, + + + path, + + + full_name, + + + pro_id, + + + tenant_id, + + + created_by, + + + created_time, + + + updated_by, + + + updated_time, + + + description, + + + + + #{id, jdbcType=VARCHAR}, + + + #{name, jdbcType=VARCHAR}, + + + #{parentId, jdbcType=VARCHAR}, + + + #{levelNo, jdbcType=INTEGER}, + + + #{indexNo, jdbcType=INTEGER}, + + + #{isLeaf, jdbcType=VARCHAR}, + + + #{path, jdbcType=VARCHAR}, + + + #{fullName, jdbcType=VARCHAR}, + + + #{proId, jdbcType=VARCHAR}, + + + #{tenantId, jdbcType=VARCHAR}, + + + #{createdBy, jdbcType=VARCHAR}, + + + #{createdTime, jdbcType=TIMESTAMP}, + + + #{updatedBy, jdbcType=VARCHAR}, + + + #{updatedTime, jdbcType=TIMESTAMP}, + + + #{description, jdbcType=VARCHAR}, + + + + + + insert into + + + id, + name, + parent_id, + level_no, + index_no, + is_leaf, + path, + full_name, + pro_id, + tenant_id, + created_by, + created_time, + updated_by, + updated_time, + description, + + values + + + #{item.id, jdbcType=VARCHAR}, + #{item.name, jdbcType=VARCHAR}, + #{item.parentId, jdbcType=VARCHAR}, + #{item.levelNo, jdbcType=INTEGER}, + #{item.indexNo, jdbcType=INTEGER}, + #{item.isLeaf, jdbcType=VARCHAR}, + #{item.path, jdbcType=VARCHAR}, + #{item.fullName, jdbcType=VARCHAR}, + #{item.proId, jdbcType=VARCHAR}, + #{item.tenantId, jdbcType=VARCHAR}, + #{item.createdBy, jdbcType=VARCHAR}, + #{item.createdTime, jdbcType=TIMESTAMP}, + #{item.updatedBy, jdbcType=VARCHAR}, + #{item.updatedTime, jdbcType=TIMESTAMP}, + #{item.description, jdbcType=VARCHAR}, + + + + + + update + + + + name = #{name, jdbcType=VARCHAR}, + + + parent_id = #{parentId, jdbcType=VARCHAR}, + + + level_no = #{levelNo, jdbcType=INTEGER}, + + + index_no = #{indexNo, jdbcType=INTEGER}, + + + is_leaf = #{isLeaf, jdbcType=VARCHAR}, + + + path = #{path, jdbcType=VARCHAR}, + + + full_name = #{fullName, jdbcType=VARCHAR}, + + + pro_id = #{proId, jdbcType=VARCHAR}, + + + created_by = #{createdBy, jdbcType=VARCHAR}, + + + created_time = #{createdTime, jdbcType=TIMESTAMP}, + + + updated_by = #{updatedBy, jdbcType=VARCHAR}, + + + updated_time = #{updatedTime, jdbcType=TIMESTAMP}, + + + description = #{description, jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=VARCHAR} + AND tenant_id = #{tenantId,jdbcType=VARCHAR} + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataSets.Mapper.xml b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataSets.Mapper.xml new file mode 100644 index 0000000..ab50886 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/base/DataSets.Mapper.xml @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + data_set_id + ,name + ,description + ,pro_id + ,tenant_id + ,file_addr + ,tree_id + ,created_by + ,created_time + ,updated_by + ,updated_time + + + + ${defaultSchema}.data_sets + + + + + + + + delete from + + where data_set_id = #{dataSetId,jdbcType=VARCHAR} + + + + delete from + + where data_set_id in + + #{idItem, jdbcType=VARCHAR} + + + + + delete from + + + + AND data_set_id=#{dataSetId,jdbcType=VARCHAR} + + + AND name=#{name,jdbcType=VARCHAR} + + + AND description=#{description,jdbcType=VARCHAR} + + + AND pro_id=#{proId,jdbcType=VARCHAR} + + + AND tenant_id=#{tenantId,jdbcType=VARCHAR} + + + AND file_addr=#{fileAddr,jdbcType=VARCHAR} + + + AND tree_id=#{treeId,jdbcType=VARCHAR} + + + AND created_by=#{createdBy,jdbcType=VARCHAR} + + + AND created_time=#{createdTime,jdbcType=TIMESTAMP} + + + AND updated_by=#{updatedBy,jdbcType=VARCHAR} + + + AND updated_time=#{updatedTime,jdbcType=TIMESTAMP} + + + + + + insert into + + + + data_set_id, + + + name, + + + description, + + + pro_id, + + + tenant_id, + + + file_addr, + + + tree_id, + + + created_by, + + + created_time, + + + updated_by, + + + updated_time, + + + + + #{dataSetId, jdbcType=VARCHAR}, + + + #{name, jdbcType=VARCHAR}, + + + #{description, jdbcType=VARCHAR}, + + + #{proId, jdbcType=VARCHAR}, + + + #{tenantId, jdbcType=VARCHAR}, + + + #{fileAddr, jdbcType=VARCHAR}, + + + #{treeId, jdbcType=VARCHAR}, + + + #{createdBy, jdbcType=VARCHAR}, + + + #{createdTime, jdbcType=TIMESTAMP}, + + + #{updatedBy, jdbcType=VARCHAR}, + + + #{updatedTime, jdbcType=TIMESTAMP}, + + + + + + insert into + + + data_set_id, + name, + description, + pro_id, + tenant_id, + file_addr, + tree_id, + created_by, + created_time, + updated_by, + updated_time, + + values + + + #{item.dataSetId, jdbcType=VARCHAR}, + #{item.name, jdbcType=VARCHAR}, + #{item.description, jdbcType=VARCHAR}, + #{item.proId, jdbcType=VARCHAR}, + #{item.tenantId, jdbcType=VARCHAR}, + #{item.fileAddr, jdbcType=VARCHAR}, + #{item.treeId, jdbcType=VARCHAR}, + #{item.createdBy, jdbcType=VARCHAR}, + #{item.createdTime, jdbcType=TIMESTAMP}, + #{item.updatedBy, jdbcType=VARCHAR}, + #{item.updatedTime, jdbcType=TIMESTAMP}, + + + + + + update + + + + name = #{name, jdbcType=VARCHAR}, + + + description = #{description, jdbcType=VARCHAR}, + + + pro_id = #{proId, jdbcType=VARCHAR}, + + + file_addr = #{fileAddr, jdbcType=VARCHAR}, + + + tree_id = #{treeId, jdbcType=VARCHAR}, + + + created_by = #{createdBy, jdbcType=VARCHAR}, + + + created_time = #{createdTime, jdbcType=TIMESTAMP}, + + + updated_by = #{updatedBy, jdbcType=VARCHAR}, + + + updated_time = #{updatedTime, jdbcType=TIMESTAMP}, + + + where data_set_id = #{dataSetId,jdbcType=VARCHAR} + AND tenant_id = #{tenantId,jdbcType=VARCHAR} + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataResourcePackage.Dao.xml b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataResourcePackage.Dao.xml new file mode 100644 index 0000000..669db57 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataResourcePackage.Dao.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataRule.Dao.xml b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataRule.Dao.xml new file mode 100644 index 0000000..0355763 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataRule.Dao.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataSetEnvRel.Dao.xml b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataSetEnvRel.Dao.xml new file mode 100644 index 0000000..33ec2dd --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataSetEnvRel.Dao.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataSetTree.Dao.xml b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataSetTree.Dao.xml new file mode 100644 index 0000000..8879523 --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataSetTree.Dao.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update + + + full_name = REPLACE(full_name,#{tree.fullName},#{newPath}) + + where pro_id = #{tree.proId,jdbcType=VARCHAR} + and LOCATE(#{tree.fullName},full_name) > 0 + + + + + update + + + index_no = index_no + 1 + + where pro_id = #{proId,jdbcType=VARCHAR} + and index_no > #{orderSeq} + + + update + + + path = REPLACE(path,#{tree.path},#{newPath}) + + , level_no = level_no +#{tree.levelNo} + + + where pro_id = #{tree.proId,jdbcType=VARCHAR} + and LOCATE(#{tree.path},path) > 0 + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataSets.Dao.xml b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataSets.Dao.xml new file mode 100644 index 0000000..f55900e --- /dev/null +++ b/cctp-atu/atu-data-mgr/src/main/resources/mybatis/ext/DataSets.Dao.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + delete from + + + + AND data_set_id IN + + #{item,jdbcType=VARCHAR} + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-data-mgr/testDockerfile b/cctp-atu/atu-data-mgr/testDockerfile new file mode 100644 index 0000000..400fadb --- /dev/null +++ b/cctp-atu/atu-data-mgr/testDockerfile @@ -0,0 +1,31 @@ +# This is spring boot config server +# Version 2.1 + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER xiusong.xie@northking.net + +EXPOSE 8250 + +ENV APP_NAME=atu-data-mgr +ENV APP_VERSION=3.0-SNAPSHOT + +ENV CCTP_HOME /home/cctp + +ENV NACOS_SPACE=UI-test +ENV NACOS_URL=197.68.24.40:8848 +ENV JAR_FILE=${CCTP_HOME}/${APP_NAME}-${APP_VERSION}.ms.jar + +VOLUME ${CCTP_HOME} + +ADD dist ${CCTP_HOME}/ +RUN chmod a+x ${CCTP_HOME}/nk-ms.sh + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +ENTRYPOINT ["sh", "-c", "java -jar -Xmx256M -Dfile.encoding=UTF-8 -DNACOS_NAMESPACE=${NACOS_SPACE} -DNACOS_SERVER_URL=${NACOS_URL} -Dloader.path=.,lib ${JAR_FILE}"] + +#CMD [""] diff --git a/cctp-atu/atu-engine/atu-daemon-process/pom.xml b/cctp-atu/atu-engine/atu-daemon-process/pom.xml new file mode 100644 index 0000000..2714578 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/pom.xml @@ -0,0 +1,101 @@ + + + + net.northking.cctp.atu + atu-engine-parent + 1.0.0-RELEASE + + 4.0.0 + + atu-daemon-process + jar + + + net.northking.cctp.daemon.DaemonApplication + atu-daemon-process + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + org.springframework.boot + spring-boot-maven-plugin + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + ${start-class} + ${project-finalName} + ${project.build.directory} + + + + + repackage + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + cctp.yml + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + net.northking.cctp.atu + atu-engine-dto + 1.0.0-RELEASE + + + com.alibaba + fastjson + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.java-websocket + Java-WebSocket + 1.5.2 + + + + io.springfox + springfox-swagger2 + + + io.springfox + springfox-swagger-ui + + + com.github.xiaoymin + swagger-bootstrap-ui + + + + \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/CommandExecute.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/CommandExecute.java new file mode 100644 index 0000000..a80c221 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/CommandExecute.java @@ -0,0 +1,24 @@ +package net.northking.cctp.commands; + +import net.northking.cctp.commands.win.TaskList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class CommandExecute +{ + private static final Logger logger = LoggerFactory.getLogger(CommandExecute.class); + + public static void main(String[] args) + { + TaskList taskList = new TaskList(); + taskList.format(TaskList.Format.csv); + taskList.filter(TaskList.Result.IMAGENAME + " eq java.exe"); + List resultList = taskList.execute(); + for (TaskList.Result result : resultList) + { + logger.info(result.toString()); + } + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/OSCommand.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/OSCommand.java new file mode 100644 index 0000000..6c7441e --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/OSCommand.java @@ -0,0 +1,5 @@ +package net.northking.cctp.commands; + +public interface OSCommand +{ +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/win/TaskKill.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/win/TaskKill.java new file mode 100644 index 0000000..fbef106 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/win/TaskKill.java @@ -0,0 +1,166 @@ +package net.northking.cctp.commands.win; + +import net.northking.cctp.commands.OSCommand; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class TaskKill implements OSCommand +{ + private static final Logger logger = LoggerFactory.getLogger(TaskKill.class); + + /** + * 命令名称 + */ + private static final String COMMAND_NAME = "TASKKILL"; + + private String computer; + private String username; + private String password; + + private String pid; + private String imageName; + private boolean force = false; + private boolean killTeam = false; + private List filters = new ArrayList<>(); + + /** + * /S  指定连接到的计算机或IP地址,默认本机。 + * + * @param computer 计算机或IP地址 + */ + public void computer(String computer) + { + this.computer = computer; + } + + /** + * /u [\] 指定使用哪个用户执行这个命令。 + * + * @param username 用户 + */ + public void username(String username) + { + this.username = username; + } + + /** + * /P 为指定的用户指定密码。 + * + * @param password 密码 + */ + public void password(String password) + { + this.password = password; + } + + /** + * /PID 指定进程号 + * + * @param pid 进程号 + */ + public void pid(String pid) + { + this.pid = pid; + } + + /** + * /IM 指定镜像名称 + * + * @param imageName 镜像名称 + */ + public void imageName(String imageName) + { + this.imageName = imageName; + } + + /** + * /F 强制终止进程 + * + * @param force 是/否 + */ + public void force(boolean force) + { + this.force = force; + } + + /** + * /T 终止指定的进程和由它启用的子进程。 + * + * @param killTeam 是/否 + */ + public void killTeam(boolean killTeam) + { + this.killTeam = killTeam; + } + + + /** + * 显示一系列符合筛选器指定的进程。 + * + * @param filter 筛选器 + */ + public void filter(String filter) + { + this.filters.add(filter); + } + + private String build() + { + StringBuilder command = new StringBuilder(COMMAND_NAME); + + if (computer != null && computer.trim().length() > 0) + { + command.append(" /S ").append(computer); + } + if (username != null && username.trim().length() > 0) + { + command.append(" /u ").append(username); + } + if (password != null && password.trim().length() > 0) + { + command.append(" /P ").append(password); + } + if (pid != null && pid.trim().length() > 0) + { + command.append(" /PID ").append(pid); + } + if (imageName != null && imageName.trim().length() > 0) + { + command.append(" /IM ").append(imageName); + } + if (force) + { + command.append(" /F"); + } + if (killTeam) + { + command.append(" /T"); + } + for (String filter : filters) + { + command.append(" /FI ").append("\"").append(filter).append("\""); + } + return command.toString(); + } + + public void execute() + { + String commandStr = build(); + + try + { + logger.debug("执行命令:{}", commandStr); + Process process = Runtime.getRuntime().exec("cmd /c " + commandStr); + process.waitFor(); + } catch (IOException | InterruptedException e) + { + logger.error("使用 TASKKILL 命令终止进程时发生异常。", e); + } + } + + +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/win/TaskList.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/win/TaskList.java new file mode 100644 index 0000000..6f14bcf --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/commands/win/TaskList.java @@ -0,0 +1,226 @@ +package net.northking.cctp.commands.win; + +import net.northking.cctp.commands.OSCommand; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +public class TaskList implements OSCommand +{ + private static final Logger logger = LoggerFactory.getLogger(TaskList.class); + /** + * 命令名称 + */ + private static final String COMMAND_NAME = "TASKLIST"; + + private String computer; + private String username; + private String password; + private String module; + private boolean details = false; + private Format format; + private List filters = new ArrayList<>(); + + /** + * /S  指定连接到的计算机或IP地址,默认本机。 + * + * @param computer 计算机或IP地址 + */ + public void computer(String computer) + { + this.computer = computer; + } + + /** + * /u [\] 指定使用哪个用户执行这个命令。 + * + * @param username 用户 + */ + public void username(String username) + { + this.username = username; + } + + /** + * /P 为指定的用户指定密码。 + * + * @param password 密码 + */ + public void password(String password) + { + this.password = password; + } + + /** + * 列出调用指定的DLL模块的所有进程。如果没有指定模块名,显示每个进程加载的所有模块。 + * + * @param module 模块 + */ + public void module(String module) + { + this.module = module; + } + + /** + * 显示详细信息。 + */ + public void details(boolean details) + { + this.details = details; + } + + public void format(Format format) + { + this.format = format; + } + + /** + * 显示一系列符合筛选器指定的进程。 + * + * @param filter 筛选器 + */ + public void filter(String filter) + { + this.filters.add(filter); + } + + private String build() + { + StringBuilder command = new StringBuilder(COMMAND_NAME); + + if (computer != null && computer.trim().length() > 0) + { + command.append(" /S ").append(computer); + } + if (username != null && username.trim().length() > 0) + { + command.append(" /u ").append(username); + } + if (password != null && password.trim().length() > 0) + { + command.append(" /P ").append(password); + } + if (module != null && module.trim().length() > 0) + { + command.append(" /M ").append(module); + } + if (details) + { + command.append(" /V"); + } + if (format != null) + { + command.append(" /FO ").append(format.name()); + } + for (String filter : filters) + { + command.append(" /FI ").append("\"").append(filter).append("\""); + } + return command.toString(); + } + + public List execute() + { + List resultList = new ArrayList<>(); + String commandStr = build(); + String line; + Process process; + int lineNo = 1; + try + { + logger.debug("执行命令:{}", commandStr); + process = Runtime.getRuntime().exec("cmd /c " + commandStr); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK")); + while ((line = bufferedReader.readLine()) != null) + { + logger.debug("行-{}: {}", lineNo, line); + if (lineNo > 1) + { + resultList.add(new Result(line)); + } + lineNo++; + } + process.waitFor(); + } catch (IOException | InterruptedException e) + { + logger.error("使用 TASKLIST 命令获取进程PID时发生异常。", e); + } + + return resultList; + } + + public enum Format + { + table, + list, + csv + } + + + public class Result + { + public static final String IMAGENAME = "IMAGENAME"; + public static final String PID = "PID"; + + private final String imageName; + private final String pid; + private final String sessionName; + private final String sessionCount; + private final String memory; + + public Result(String line) + { + String[] args = line.split("\",\""); + imageName = args[0].substring(1); + pid = args[1]; + sessionName = args[2]; + sessionCount = args[3]; + memory = args[4].replace("\"", ""); + } + + public Result(String imageName, String pid, String sessionName, String sessionCount, String memory) + { + this.imageName = imageName; + this.pid = pid; + this.sessionName = sessionName; + this.sessionCount = sessionCount; + this.memory = memory; + } + + public String getImageName() + { + return imageName; + } + + public String getPid() + { + return pid; + } + + public String getSessionName() + { + return sessionName; + } + + public String getSessionCount() + { + return sessionCount; + } + + public String getMemory() + { + return memory; + } + + @Override + public String toString() + { + return "imageName=" + imageName + ", pid=" + pid + ", sessionName=" + sessionName + ", sessionCount=" + sessionCount + ", memory=" + memory; + } + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/DaemonApplication.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/DaemonApplication.java new file mode 100644 index 0000000..f3bed39 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/DaemonApplication.java @@ -0,0 +1,35 @@ +package net.northking.cctp.daemon; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.ApplicationPidFileWriter; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.scheduling.annotation.EnableScheduling; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@EnableScheduling +@EnableConfigurationProperties +@SpringBootApplication +@EnableSwagger2 +public class DaemonApplication +{ + private static final Logger logger = LoggerFactory.getLogger(DaemonApplication.class); + + public static void main(String[] args) + { + logger.info("脚本守护进程 启动----开始 ................."); + String pidFile = "daemon.pid"; + SpringApplication app = new SpringApplication(DaemonApplication.class); + // 指定PID文件 + app.addListeners(new ApplicationPidFileWriter(pidFile)); + app.run(args); + + logger.info("脚本守护进程 启动----完成 ................."); + + + } + + +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/DaemonProperties.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/DaemonProperties.java new file mode 100644 index 0000000..7405f58 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/DaemonProperties.java @@ -0,0 +1,70 @@ +package net.northking.cctp.daemon.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "daemon") +public class DaemonProperties +{ + private String home; + + private String centerUrl; + + private EngineProperties engine; + + private String initFile; + + public String getHome() + { + return home; + } + + public void setHome(String home) + { + this.home = home; + } + + public String getCenterUrl() + { + return centerUrl; + } + + public void setCenterUrl(String centerUrl) + { + this.centerUrl = centerUrl; + } + + public String getInitFile() { + return initFile; + } + + public void setInitFile(String initFile) { + this.initFile = initFile; + } + + public EngineProperties getEngine() + { + return engine; + } + + public void setEngine(EngineProperties engine) + { + this.engine = engine; + } + + public String getEngineHome() + { + return home + "/engine"; + } + + public String getDownloadHome() + { + return home + "/download"; + } + + public String getPatchHome() + { + return home + "/patch"; + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/EngineProperties.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/EngineProperties.java new file mode 100644 index 0000000..f1b9b3c --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/EngineProperties.java @@ -0,0 +1,102 @@ +package net.northking.cctp.daemon.config; + +public class EngineProperties +{ + private int port; + private String pidFile = "script-engine.pid"; + private String jarFile = "script-engine-name.txt"; + private String opsXms; + private String opsXmx; + private String opsPermSize; + private String encoding; + private String extParams; + private boolean engineTrace; + + public int getPort() + { + return port; + } + + public void setPort(int port) + { + this.port = port; + } + + public String getPidFile() + { + return pidFile; + } + + public void setPidFile(String pidFile) + { + this.pidFile = pidFile; + } + + public String getJarFile() + { + return jarFile; + } + + public void setJarFile(String jarFile) + { + this.jarFile = jarFile; + } + + public String getOpsXms() + { + return opsXms; + } + + public void setOpsXms(String opsXms) + { + this.opsXms = opsXms; + } + + public String getOpsXmx() + { + return opsXmx; + } + + public void setOpsXmx(String opsXmx) + { + this.opsXmx = opsXmx; + } + + public String getOpsPermSize() + { + return opsPermSize; + } + + public void setOpsPermSize(String opsPermSize) + { + this.opsPermSize = opsPermSize; + } + + public String getEncoding() + { + return encoding; + } + + public void setEncoding(String encoding) + { + this.encoding = encoding; + } + + public String getExtParams() + { + return extParams; + } + + public void setExtParams(String extParams) + { + this.extParams = extParams; + } + + public boolean getEngineTrace() { + return engineTrace; + } + + public void setEngineTrace(Boolean engineTrace) { + this.engineTrace = engineTrace; + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/RestTemplateConfig.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/RestTemplateConfig.java new file mode 100644 index 0000000..510357f --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/RestTemplateConfig.java @@ -0,0 +1,27 @@ +package net.northking.cctp.daemon.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig +{ + + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory factory) + { + return new RestTemplate(factory); + } + + @Bean + public ClientHttpRequestFactory simpleClientHttpRequestFactory() + { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setReadTimeout(10000);//单位为ms + factory.setConnectTimeout(10000);//单位为ms + return factory; + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/SwaggerConfiguration.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/SwaggerConfiguration.java new file mode 100644 index 0000000..78b0719 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/config/SwaggerConfiguration.java @@ -0,0 +1,36 @@ +package net.northking.cctp.daemon.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +/** + * @author xiusong.xie + * @since 2.4 + */ +@Configuration +public class SwaggerConfiguration implements WebMvcConfigurer { + /** + * 接口文档定义 + * + * @return 接口文档定义 + */ + @Bean + public Docket createRestApi() { + ApiInfo apiInfo = new ApiInfoBuilder() + .title("UI守护进程服务") + .description("这是UI守护进程服务的接口文档") + .version("1.0") + .build(); + return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()).build(); + } +} \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/DaemonEngineInfo.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/DaemonEngineInfo.java new file mode 100644 index 0000000..ec2a56e --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/DaemonEngineInfo.java @@ -0,0 +1,103 @@ +package net.northking.cctp.daemon.entity; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "daemon_engine_info") +public class DaemonEngineInfo +{ + + /** + * 引擎的版本号 + */ + @Id + private String version; + + /** + * 最新的版本号 + */ + private String upgradeVersion; + + /** + * 守护状态 + */ + private String status = DaemonStatus.INIT.name(); + + /** + * 更新包下载地址 + */ + private String downloadUrl; + + /** + * 安装包目录 + */ + private String patchDirectory; + + /** + * 补丁压缩包 + */ + private String PatchZipFile; + + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getUpgradeVersion() + { + return upgradeVersion; + } + + public void setUpgradeVersion(String lastVersion) + { + this.upgradeVersion = lastVersion; + } + + public String getPatchDirectory() + { + return patchDirectory; + } + + public void setPatchDirectory(String patchHome) + { + this.patchDirectory = patchHome; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDownloadUrl() + { + return downloadUrl; + } + + public void setDownloadUrl(String patchUrl) + { + this.downloadUrl = patchUrl; + } + + public String getPatchZipFile() + { + return PatchZipFile; + } + + public void setPatchZipFile(String patchZipFile) + { + PatchZipFile = patchZipFile; + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/DaemonStatus.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/DaemonStatus.java new file mode 100644 index 0000000..1151271 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/DaemonStatus.java @@ -0,0 +1,15 @@ +package net.northking.cctp.daemon.entity; + +/** + * 守护状态 + */ +public enum DaemonStatus +{ + INIT, + WAIT, + PREPARED_DOWNLOAD, + PREPARED_UNZIP, + PREPARED_UPGRADE, + FINISH, + RESTART; +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/ResultWrapper.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/ResultWrapper.java new file mode 100644 index 0000000..29ff46e --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/ResultWrapper.java @@ -0,0 +1,66 @@ +package net.northking.cctp.daemon.entity; + +import java.io.Serializable; + +public class ResultWrapper implements Serializable +{ + private boolean success = false; + + private String code; + + private String message; + + private Long timestamp; + + private T data; + + public boolean isSuccess() + { + return success; + } + + public void setSuccess(boolean success) + { + this.success = success; + } + + public String getCode() + { + return code; + } + + public void setCode(String code) + { + this.code = code; + } + + public String getMessage() + { + return message; + } + + public void setMessage(String message) + { + this.message = message; + } + + public Long getTimestamp() + { + return timestamp; + } + + public void setTimestamp(Long timestamp) + { + this.timestamp = timestamp; + } + + public T getData() + { + return data; + } + + public void setData(T data) + { + this.data = data; + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/ScriptEngineVersion.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/ScriptEngineVersion.java new file mode 100644 index 0000000..dd3376e --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/entity/ScriptEngineVersion.java @@ -0,0 +1,30 @@ +package net.northking.cctp.daemon.entity; + +import java.io.Serializable; + +public class ScriptEngineVersion implements Serializable +{ + private String version; + + private String downloadUrl; + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getDownloadUrl() + { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) + { + this.downloadUrl = downloadUrl; + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/repository/DaemonEngineInfoRepository.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/repository/DaemonEngineInfoRepository.java new file mode 100644 index 0000000..c2fe18f --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/repository/DaemonEngineInfoRepository.java @@ -0,0 +1,10 @@ +package net.northking.cctp.daemon.repository; + +import net.northking.cctp.daemon.entity.DaemonEngineInfo; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface DaemonEngineInfoRepository extends JpaRepository +{ +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/schedule/ScriptEngineSchedule.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/schedule/ScriptEngineSchedule.java new file mode 100644 index 0000000..4e2b3af --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/schedule/ScriptEngineSchedule.java @@ -0,0 +1,112 @@ +package net.northking.cctp.daemon.schedule; + +import com.alibaba.fastjson.JSON; +import net.northking.cctp.daemon.config.DaemonProperties; +import net.northking.cctp.daemon.service.DaemonService; +import net.northking.cctp.daemon.service.RobotProcess; +import net.northking.cctp.daemon.service.ScriptEngineProcess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + + +/** + * 守护: 脚本引擎 + */ +@Component +public class ScriptEngineSchedule +{ + private static final Logger logger = LoggerFactory.getLogger(ScriptEngineSchedule.class); + + /** + * 初始延迟时间 5 秒,单位:毫秒。(系统启动后开始算,第一次执行的时间延迟 N 毫秒) + */ + private static final long INITIAL_DELAY = 10 * 1000L; + + /** + * 上一次执行结束时间点之后 60秒再执行 + */ + public static final long FIXED_DELAY = 60 * 1000L; + + private ScriptEngineProcess scriptEngine; + private RobotProcess robotProcess; + + /** + * 配置参数 + */ + private final DaemonProperties properties; + + private final RestTemplate restTemplate; + + private final DaemonService daemonService; + + public ScriptEngineSchedule(DaemonProperties daemonProperties, RestTemplate restTemplate, DaemonService daemonService) + { + this.properties = daemonProperties; + this.restTemplate = restTemplate; + this.daemonService = daemonService; + + this.scriptEngine = new ScriptEngineProcess(daemonProperties, restTemplate, daemonService); + this.robotProcess=new RobotProcess(daemonProperties, restTemplate, daemonService); + } + + + /** + * 定时校验引擎进程状态 + */ + @Scheduled(initialDelay = INITIAL_DELAY, fixedDelay = FIXED_DELAY) + public void execute() + { + boolean check = false; + if (scriptEngine.isStarted()) + { + if (!scriptEngine.alive()) + { + check=true; + logger.info("【脚本引擎】进程 PID={} 未响应。", scriptEngine.getPid()); + scriptEngine.shutdown(); + scriptEngine.start(); + } + } else + { + check=true; + logger.info("【脚本引擎】进程 未启动。尝试启动!"); + scriptEngine.start(); + logger.info("【脚本引擎】进程 启动成功。更新引擎信息!"); + scriptEngine.alive(); + } + //校验是否时更新等待时关闭-关闭机器人并更改为更新流程继续 + if(check && daemonService.preparedWaitEngine()){ + daemonService.updateToDownload(); + } + } + + /** + * 定时校验引擎版本是否更新 + * 如果更新完成则进行重启 + */ + @Scheduled(fixedDelay = FIXED_DELAY) + public void restartEngine() + { + logger.info("引擎更新重启检查 --------- 当前状态:{}",daemonService.getInfo().getStatus()); + //查看引擎是否处于更新包解压完毕状态 + if (daemonService.preparedWaitEngine()){ + logger.info("引擎更新重启检查 ------- 检查到版本更新,jar包已下载并解压 通知引擎重启"); + //停止引擎-等待引擎守护启动新的引擎进程 + scriptEngine.stop(); + //更新状态等待引擎自己关闭重启引擎 + } + } + + /** + * 信息打印 + */ + @Scheduled(initialDelay = 3*1000, fixedDelay = FIXED_DELAY) + public void infoPrintln(){ + logger.info("常规检查 ---------- 守护进程信息打印:"+ JSON.toJSON(daemonService.getInfo())); + } + + +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/schedule/UpgradeSchedule.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/schedule/UpgradeSchedule.java new file mode 100644 index 0000000..330d4ef --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/schedule/UpgradeSchedule.java @@ -0,0 +1,263 @@ +package net.northking.cctp.daemon.schedule; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.daemon.config.DaemonProperties; +import net.northking.cctp.daemon.entity.ScriptEngineVersion; +import net.northking.cctp.daemon.service.DaemonService; +import net.northking.cctp.daemon.utils.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ContentDisposition; +import org.springframework.http.HttpMethod; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.util.StreamUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.client.RestTemplate; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * 定时检查版本并下载最新的版本 + */ +@Component +public class UpgradeSchedule +{ + private static final Logger logger = LoggerFactory.getLogger(UpgradeSchedule.class); + + /** + * 初始延迟时间 5 秒,单位:毫秒。(系统启动后开始算,第一次执行的时间延迟 N 毫秒) + */ + private static final long INITIAL_DELAY = 10 * 1000L; + + /** + * 上一次执行结束时间点之后 60秒再执行 + */ + public static final long FIXED_DELAY = 2*60 * 1000L; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + private final DaemonProperties properties; + + private final RestTemplate restTemplate; + + private final DaemonService daemonService; + + public UpgradeSchedule(DaemonProperties properties, RestTemplate restTemplate, DaemonService daemonService) + { + this.properties = properties; + this.restTemplate = restTemplate; + this.daemonService = daemonService; + } + + + /** + * 校验设备管理引擎版本是否更新 + * 如果更新则下载引擎包 + */ + @Scheduled(initialDelay = INITIAL_DELAY,fixedDelay = FIXED_DELAY) + public void upgrade() + { + logger.info("常规检查 ------------ 引擎版本更新检查"); + loadLastVersion(); + downloadLastVersion(); + unZipAppPatch(); + upgradeEngine(); + } + + + + + private void loadLastVersion() + { + if (daemonService.preparedLoadLastVersion()) + { + String centerUrl = properties.getCenterUrl(); + String url = centerUrl + "/api/cctp-device-mgr/pub/engine/release/latest"; + Map uriVariables = new HashMap<>(); + + String responseBody = restTemplate.getForObject(url, String.class, uriVariables); + logger.debug("最新版本信息,请求接口:HTTP GET {}", url); + logger.debug("收到最新版本信息报文:{}", responseBody); + try + { + ScriptEngineVersion lastVersion = objectMapper.readValue(responseBody, + new TypeReference() + { + }); + if(lastVersion==null || StringUtils.isEmpty(lastVersion.getVersion())){ + return; + } + daemonService.updateLastVersion(lastVersion); + } catch (JsonProcessingException e) + { + logger.error("获取最新版本信息失败!", e); + } + } + if(daemonService.getInfo()==null){ + String jarFile = properties.getEngineHome() + "/" + properties.getEngine().getJarFile(); + if (!new File(jarFile).exists()){ + logger.info("触发初始完整版本下载-------"); + ScriptEngineVersion initVersion = new ScriptEngineVersion(); + initVersion.setVersion("1.0.0"); + initVersion.setDownloadUrl(properties.getInitFile()); + daemonService.updateInitVersion(initVersion); + } + } + } + + private void downloadLastVersion() + { + if (daemonService.preparedDownload()) + { + String downloadUrl = daemonService.getDownloadUrl(); + downloadUrl = properties.getCenterUrl() +"/api/cctp-files/pub/download/"+ downloadUrl; + File downloadHome = new File(properties.getDownloadHome()); + downloadHome.mkdirs(); + + if (downloadUrl.length() > 0) + { + logger.debug("下载安装补丁,请求接口:{}", downloadUrl); + File patchFile = restTemplate.execute(downloadUrl, HttpMethod.GET, null, response -> + { + ContentDisposition disposition = response.getHeaders().getContentDisposition(); + String fileName = disposition.getFilename(); + File file = new File(downloadHome, fileName); + StreamUtils.copy(response.getBody(), new FileOutputStream(file)); + return file; + }); + daemonService.downloadCompleted(patchFile); + } + } + } + + private void unZipAppPatch() + { + if (daemonService.preparedUnZip()) + { + File patchFile = new File(daemonService.getUnZipFile()); + String fileName = patchFile.getName().replace(".zip", ""); + File patchHome = new File(properties.getPatchHome()); + File patchDir = new File(patchHome, fileName); + + if (patchFile.length() > 0) + { + try + { + FileUtils.unZip(patchFile, patchDir); + daemonService.unZipCompleted(patchDir.getAbsolutePath()); + logger.info("解压缩ZIP包: ZIP文件={},解压缩到目录={}", patchFile.getAbsolutePath(), patchDir.getAbsolutePath()); + } catch (IOException e) + { + logger.error("解压缩安装程序失败!", e); + } + } + } + } + + private void upgradeEngine() + { + if (daemonService.preparedUpgradeEngine()) + { + File patchDir = new File(daemonService.getPatchDirectory()); + File engineHome = new File(properties.getEngineHome()); + if (patchDir.exists() && patchDir.isDirectory()) + { + try + { + logger.info("升级脚本引擎: 补丁目录={} , 目标目录={}", patchDir, engineHome); + if(!engineHome.exists()){ + engineHome.mkdirs(); + } + FileUtils.copyFolder(patchDir, engineHome); + writeNameToFile(); + daemonService.upgradeCompleted(); + } catch (IOException e) + { + logger.error("更新引擎失败!", e); + } + } + } + } + /** + * 写出当前版本的jar名称文件 + */ + private void writeNameToFile(){ + String path = properties.getEngineHome()+ "/" + properties.getEngine().getJarFile(); + File nameFile = new File(path ); + FileWriter fw = null; + try { + fw = new FileWriter(nameFile); + String name = "atu-script-engine.jar"; + fw.write(name); + fw.flush(); + logger.info("引擎更新文件成功 引擎新版本为:{}",name); + } catch (IOException e) { + logger.error("更新引擎启动文件失败!", e); + } finally { + if (fw != null){ + try { + fw.close(); + } catch (IOException e) { + logger.error("关闭流异常:", e); + } + } + } + } + + /** + * 生成文件 + */ + private void genStartBatFile() { + String path = properties.getEngineHome(); + String filename = "atu-script-engine-"+daemonService.getInfo().getUpgradeVersion()+".jar"; + StringBuilder commandStr = new StringBuilder(); + commandStr.append("java -jar"); + commandStr.append(" -Xms").append(properties.getEngine().getOpsXms()); + commandStr.append(" -Xmx").append(properties.getEngine().getOpsXmx()); + commandStr.append(" -XX:PermSize=").append(properties.getEngine().getOpsPermSize()); + commandStr.append(" -Dloader.path=.,lib,modules"); + commandStr.append(" -Dfile.encoding=").append(properties.getEngine().getEncoding()); + commandStr.append(" -Dspring.config.location=config/application.yml"); + commandStr.append(" ").append(filename); + + String extParams = properties.getEngine().getExtParams(); + if (extParams != null) + { + commandStr.append(" ").append(extParams); + } + File nameFile = new File(path+"/start.bat"); + if(nameFile.exists()){ + boolean delete = nameFile.delete(); + logger.info("删除nameFile:{}",delete); + } + FileWriter fw = null; + try { + fw = new FileWriter(nameFile); + fw.write("@echo off\r\n"); + fw.write("chcp 65001\r\n"); + fw.write("title=执行引擎\r\n"); + fw.write(commandStr.toString()+"\r\n"); + fw.write("@pause"); + fw.flush(); + logger.info("创建新的启动文件成功"); + } catch (IOException e) { + logger.error("创建新的启动文件失败!", e); + }finally { + try { + if (fw!=null) { + fw.close(); + } + } catch (IOException e) { + logger.error("关闭流异常:", e); + } + } + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/AppLifecycle.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/AppLifecycle.java new file mode 100644 index 0000000..8900c75 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/AppLifecycle.java @@ -0,0 +1,27 @@ +package net.northking.cctp.daemon.service; + +import net.northking.cctp.commands.win.TaskList; + +import java.util.List; + +/** + * 应用程序生命周期 + */ +public abstract class AppLifecycle implements Lifecycle +{ + /** + * 根据PID查询正在运行的进程 + * + * @param pid 进程号 + * @return 进程信息 + */ + protected List findProcessByPid(String pid) + { + TaskList taskList = new TaskList(); + taskList.format(TaskList.Format.csv); + taskList.filter(TaskList.Result.PID + " eq " + pid); + return taskList.execute(); + } + + +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/DaemonService.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/DaemonService.java new file mode 100644 index 0000000..130a3bc --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/DaemonService.java @@ -0,0 +1,111 @@ +package net.northking.cctp.daemon.service; + +import net.northking.cctp.daemon.entity.DaemonEngineInfo; +import net.northking.cctp.daemon.entity.ScriptEngineVersion; +import net.northking.cctp.se.dto.ScriptEngineInfo; + +import java.io.File; + +public interface DaemonService +{ + + /** + * 引擎更新完成 + */ + void upgradeCompleted(); + + /** + * 更新引擎最新的版本号 + * + * @param lastVersion 引擎最新的版本号 + */ + void updateLastVersion(ScriptEngineVersion lastVersion); + + /** + * 获取更新文件的根目录 + * + * @return 更新文件的根目录 + */ + String getPatchDirectory(); + + /** + * 更新脚本引擎信息 + * + * @param scriptEngineInfo 脚本引擎信息 + */ + void updateEngineInfo(ScriptEngineInfo scriptEngineInfo); + + /** + * 获取下载地址 + * + * @return 下载地址 + */ + String getDownloadUrl(); + + /** + * 完成下载任务 + * + * @param file 下载的文件 + */ + void downloadCompleted(File file); + + /** + * 获取待解压缩文件 + * + * @return 待解压缩文件 + */ + String getUnZipFile(); + + /** + * 完成解压缩任务 + * + * @param unZipDir 压缩后的文件目录 + */ + void unZipCompleted(String unZipDir); + + /** + * 是否获取最新版本 + * + * @return 是否获取最新版本 + */ + boolean preparedLoadLastVersion(); + + /** + * 是否下载补丁 + * + * @return 是否下载补丁 + */ + boolean preparedDownload(); + + /** + * 是否解压缩补丁包 + * + * @return 是否解压缩补丁包 + */ + boolean preparedUnZip(); + + /** + * 是否开始更新 + * + * @return 是否开始更新 + */ + boolean preparedUpgradeEngine(); + + /** + * 是否更新完成等待重启 + * @return + */ + boolean preparedWaitEngine(); + /** + * 重启完成更新状态 + */ + void restartEngineFinish(); + + DaemonEngineInfo getInfo(); + + void updateInitVersion(ScriptEngineVersion initVersion); + + boolean startCheck(); + + void updateToDownload(); +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/DaemonServiceImpl.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/DaemonServiceImpl.java new file mode 100644 index 0000000..ceea1ba --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/DaemonServiceImpl.java @@ -0,0 +1,166 @@ +package net.northking.cctp.daemon.service; + +import net.northking.cctp.daemon.entity.DaemonEngineInfo; +import net.northking.cctp.daemon.entity.DaemonStatus; +import net.northking.cctp.daemon.entity.ScriptEngineVersion; +import net.northking.cctp.daemon.repository.DaemonEngineInfoRepository; +import net.northking.cctp.se.dto.ScriptEngineInfo; +import org.springframework.stereotype.Service; +import org.springframework.data.domain.Sort; + +import java.io.File; +import java.util.List; +import java.util.Optional; + +@Service +public class DaemonServiceImpl implements DaemonService { + private static DaemonEngineInfo DAEMON_ENGINE_INFO; + + private final DaemonEngineInfoRepository repository; + + public DaemonServiceImpl(DaemonEngineInfoRepository repository) { + this.repository = repository; + } + + @Override + public void updateLastVersion(ScriptEngineVersion lastVersion) { + if (!lastVersion.getVersion().equals(DAEMON_ENGINE_INFO.getVersion()) + && !lastVersion.getVersion().equals(DAEMON_ENGINE_INFO.getUpgradeVersion()) + && DaemonStatus.INIT.name().equals(DAEMON_ENGINE_INFO.getStatus())) { + DAEMON_ENGINE_INFO.setUpgradeVersion(lastVersion.getVersion()); + DAEMON_ENGINE_INFO.setDownloadUrl(lastVersion.getDownloadUrl()); + DAEMON_ENGINE_INFO.setStatus(DaemonStatus.WAIT.name()); + repository.save(DAEMON_ENGINE_INFO); + } + } + + @Override + public DaemonEngineInfo getInfo() { + if (DAEMON_ENGINE_INFO == null) { + Sort.Order order = new Sort.Order(Sort.Direction.DESC, "upgradeVersion"); + List list = repository.findAll(Sort.by(order)); + if (list != null && list.size() > 0) { + DAEMON_ENGINE_INFO = list.get(0); + } + } + return DAEMON_ENGINE_INFO; + } + + @Override + public void updateInitVersion(ScriptEngineVersion intVersion) { + DAEMON_ENGINE_INFO = new DaemonEngineInfo(); + DAEMON_ENGINE_INFO.setVersion(intVersion.getVersion()); + DAEMON_ENGINE_INFO.setUpgradeVersion(intVersion.getVersion()); + DAEMON_ENGINE_INFO.setDownloadUrl(intVersion.getDownloadUrl()); + DAEMON_ENGINE_INFO.setStatus(DaemonStatus.WAIT.name()); + repository.save(DAEMON_ENGINE_INFO); + } + + + @Override + public String getPatchDirectory() { + return DAEMON_ENGINE_INFO.getPatchDirectory(); + } + + @Override + public void updateEngineInfo(ScriptEngineInfo scriptEngineInfo) { + if (DAEMON_ENGINE_INFO == null) { + Optional optional = repository.findById(scriptEngineInfo.getVersion()); + if (optional.isPresent()) { + DAEMON_ENGINE_INFO = optional.get(); + } else { + DAEMON_ENGINE_INFO = new DaemonEngineInfo(); + DAEMON_ENGINE_INFO.setVersion(scriptEngineInfo.getVersion()); + DAEMON_ENGINE_INFO.setStatus(DaemonStatus.INIT.name()); + } + } else { + if (scriptEngineInfo.getVersion().equals(DAEMON_ENGINE_INFO.getVersion()) + || !DaemonStatus.INIT.name().equals(DAEMON_ENGINE_INFO.getStatus())) { + // 增加校验在版本更新途中,不更新当前数据库版本记录 + // TODO 更新引擎的信息 + } else { + DAEMON_ENGINE_INFO = new DaemonEngineInfo(); + DAEMON_ENGINE_INFO.setVersion(scriptEngineInfo.getVersion()); + DAEMON_ENGINE_INFO.setStatus(DaemonStatus.INIT.name()); + } + } + repository.save(DAEMON_ENGINE_INFO); + } + + public void upgradeCompleted() { + DAEMON_ENGINE_INFO.setStatus(DaemonStatus.FINISH.name()); + repository.save(DAEMON_ENGINE_INFO); + } + + @Override + public String getDownloadUrl() { + return DAEMON_ENGINE_INFO.getDownloadUrl(); + } + + @Override + public void downloadCompleted(File file) { + DAEMON_ENGINE_INFO.setPatchZipFile(file.getAbsolutePath()); + DAEMON_ENGINE_INFO.setStatus(DaemonStatus.PREPARED_UNZIP.name()); + repository.save(DAEMON_ENGINE_INFO); + } + + @Override + public String getUnZipFile() { + return DAEMON_ENGINE_INFO.getPatchZipFile(); + } + + @Override + public void unZipCompleted(String unZipDir) { + DAEMON_ENGINE_INFO.setPatchDirectory(unZipDir); + DAEMON_ENGINE_INFO.setStatus(DaemonStatus.PREPARED_UPGRADE.name()); + repository.save(DAEMON_ENGINE_INFO); + } + + + @Override + public void restartEngineFinish() { + if (DAEMON_ENGINE_INFO != null) { + DAEMON_ENGINE_INFO.setStatus(DaemonStatus.INIT.name()); + repository.save(DAEMON_ENGINE_INFO); + } + } + + @Override + public boolean preparedLoadLastVersion() { + return DAEMON_ENGINE_INFO != null && DaemonStatus.INIT.name().equals(DAEMON_ENGINE_INFO.getStatus()); + } + + @Override + public boolean preparedDownload() { + return DAEMON_ENGINE_INFO != null && DaemonStatus.PREPARED_DOWNLOAD.name().equals(DAEMON_ENGINE_INFO.getStatus()); + } + + @Override + public boolean preparedUnZip() { + return DAEMON_ENGINE_INFO != null && DaemonStatus.PREPARED_UNZIP.name().equals(DAEMON_ENGINE_INFO.getStatus()); + } + + @Override + public boolean preparedUpgradeEngine() { + return DAEMON_ENGINE_INFO != null && DaemonStatus.PREPARED_UPGRADE.name().equals(DAEMON_ENGINE_INFO.getStatus()); + } + + public boolean preparedWaitEngine() { + return DAEMON_ENGINE_INFO != null && DaemonStatus.WAIT.name().equals(DAEMON_ENGINE_INFO.getStatus()); + } + + + @Override + public boolean startCheck() { + return DAEMON_ENGINE_INFO == null || (DaemonStatus.INIT.name().equals(DAEMON_ENGINE_INFO.getStatus()) + || DaemonStatus.FINISH.name().equals(DAEMON_ENGINE_INFO.getStatus())); + } + + + @Override + public void updateToDownload() { + DAEMON_ENGINE_INFO.setStatus(DaemonStatus.PREPARED_DOWNLOAD.name()); + repository.save(DAEMON_ENGINE_INFO); + } +} + diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/EngineServiceStartThread.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/EngineServiceStartThread.java new file mode 100644 index 0000000..1178335 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/EngineServiceStartThread.java @@ -0,0 +1,96 @@ +package net.northking.cctp.daemon.service; + +import com.alibaba.fastjson.JSON; +import net.northking.cctp.daemon.config.DaemonProperties; +import net.northking.cctp.daemon.config.EngineProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +/** + * 异步等待任务清空掉起关闭服务进程 + */ +public class EngineServiceStartThread extends Thread{ + private static final Logger logger = LoggerFactory.getLogger(EngineServiceStartThread.class); + + /** + * 配置参数 + */ + private final DaemonProperties daemonProperties; + private final EngineProperties engineProperties; + + private final DaemonService daemonService; + + EngineServiceStartThread(DaemonProperties daemonProperties, DaemonService daemonService){ + this.daemonProperties = daemonProperties; + this.engineProperties = daemonProperties.getEngine(); + this.daemonService = daemonService; + } + + public void run(){ + //组装启动参数 + List command = new ArrayList<>(); + command.add("java"); + command.add("-jar"); + command.add("-Xms"+engineProperties.getOpsXms()); + command.add("-Xmx"+engineProperties.getOpsXmx()); + command.add("-XX:PermSize="+engineProperties.getOpsPermSize()); + if (engineProperties.getEngineTrace()) { + logger.info("添加链路追踪"); + String home = daemonProperties.getHome(); + command.add("-javaagent:"+home+"/trace-otel-ATU_ENGINE/boot/hzb-otel-javaagent.jar"); + command.add("-Dotel.javaagent.configuration-file="+home+"/trace-otel-ATU_ENGINE/config/config-ATU_ENGINE.properties"); + } + command.add("-Dloader.path=lib,modules"); + command.add("-Dfile.encoding="+engineProperties.getEncoding()); + String active = System.getProperty("spring.profiles.active"); + logger.info("守护线程启动引擎启动环境:{}",active); + command.add("-Dspring.profiles.active="+active); + command.add(getEngineName()); + + ProcessBuilder processBuilder = new ProcessBuilder().command(command); + logger.info("文件启动路径:{}",System.getProperty("user.dir")+"/"+daemonProperties.getEngineHome()); + logger.info("command集和:{}", JSON.toJSONString(command)); + processBuilder.directory(new File(System.getProperty("user.dir")+"/"+daemonProperties.getEngineHome())); + processBuilder.redirectErrorStream(true); + LineNumberReader input = null; + try { + Process process = processBuilder.start(); + input = new LineNumberReader(new InputStreamReader(process.getInputStream())); + String line = null; + while (null != (line = input.readLine())) { + logger.info("====执行引擎程序打印:{}",line); + } + int code = process.waitFor(); + logger.warn("====执行引擎程序关闭。。。,退出码:{}",code); + } catch (IOException | InterruptedException e) { + logger.error("",e); + } + } + + /** + * 从文件中获取当前的引擎jar包名称 + * @return + */ + private String getEngineName() + { + String jarName=""; + String jarFile = daemonProperties.getEngineHome() + "/" + engineProperties.getJarFile(); + try (Scanner sc = new Scanner(new FileReader(jarFile))) + { + while (sc.hasNextLine()) + { //按行读取字符串 + jarName = sc.nextLine(); + logger.info("读取到jarName:{}", jarName); + } + } catch (FileNotFoundException e) + { + logger.error("脚本引擎的jarFile文件不存在!" + e.getMessage()); + } + return jarName; + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/Lifecycle.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/Lifecycle.java new file mode 100644 index 0000000..04a0af4 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/Lifecycle.java @@ -0,0 +1,18 @@ +package net.northking.cctp.daemon.service; + +public interface Lifecycle +{ + String getPid(); + + boolean isStarted(); + + void start(); + + void stop(); + + void shutdown(); + + void restart(); + + boolean alive(); +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/LifecycleCtrl.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/LifecycleCtrl.java new file mode 100644 index 0000000..c8bbfb3 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/LifecycleCtrl.java @@ -0,0 +1,27 @@ +package net.northking.cctp.daemon.service; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 生命周期接口 + */ +@RequestMapping(value = "/v1") +@RestController +@Api(tags = "生命周期接口") +public class LifecycleCtrl +{ + /** + * 守护进程是否运行 + * @return 引擎运行信息 + */ + @ApiOperation(value = "守护进程是否运行") + @GetMapping(value = "/info") + public String info() + { + return "正在运行"; + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/RobotProcess.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/RobotProcess.java new file mode 100644 index 0000000..822ebb2 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/RobotProcess.java @@ -0,0 +1,138 @@ +package net.northking.cctp.daemon.service; + +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.daemon.config.DaemonProperties; +import net.northking.cctp.daemon.config.EngineProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; + +public class RobotProcess extends AppLifecycle{ + + private static final Logger logger = LoggerFactory.getLogger(RobotProcess.class); + + private ObjectMapper objectMapper = new ObjectMapper(); + + /** + * 配置参数 + */ + private final DaemonProperties daemonProperties; + private final EngineProperties engineProperties; + + private final RestTemplate restTemplate; + + private final DaemonService daemonService; + + private String PID; + + + public RobotProcess(DaemonProperties daemonProperties, RestTemplate restTemplate, DaemonService daemonService) + { + this.daemonProperties = daemonProperties; + this.engineProperties = daemonProperties.getEngine(); + this.restTemplate = restTemplate; + this.daemonService = daemonService; + } + + @Override + public String getPid() { + return null; + } + + @Override + public boolean isStarted() { + return false; + } + + + @Override + public void start() + { + if(daemonService.startCheck()){ + startOnWindows(); + }else{ + logger.info("robot daemon =============== 等待更新暂不启动"); + } + } + + private void startOnWindows() { + try { + String path = System.getProperty("user.dir")+"/../engine/robot/"; + Process process = Runtime.getRuntime().exec("cmd /c start /b "+path+"start.bat"); + Thread.sleep(2000); + Process killcmd = Runtime.getRuntime().exec("cmd /c start /b "+path+"startKill.bat"); + } catch (Exception e) { + logger.error("",e); + logger.info("robot daemon ======机器人启动失败"); + } + logger.info("robot daemon ======机器人启动成功"); + } + + + @Override + public void stop() { + + } + + @Override + public void shutdown() { + String path = System.getProperty("user.dir")+"/../engine/robot/stop.bat"; + try { + Process process = Runtime.getRuntime().exec("cmd /c start /b "+path); + } catch (Exception e) { + logger.error("",e); + logger.info("robot daemon ======机器人关闭失败"); + } + logger.info("robot daemon =======机器人关闭成功"); + } + + @Override + public void restart() { + try { + shutdown(); + Thread.sleep(2000); + start(); + }catch (Exception e){ + logger.error("",e); + logger.info("robot daemon ========机器人重启失败"); + } + } + @Override + public boolean alive() { + String path = "http://localhost:5590/service/"; + boolean status = false; + int num=0; + while (!status && num<5){ + long timeA = System.currentTimeMillis(); + try { + Map uriVariables = new HashMap<>(); + uriVariables.put("cmd","Ping"); + uriVariables.put("seqId","收到请回答,over"); + ResponseEntity result = restTemplate.postForEntity(path, uriVariables,String.class); + if(HttpStatus.OK.equals(result.getStatusCode())){ + status=true;//请求成功 + }else{ + num++; + Thread.sleep(1000);//如果失败则每秒重试一此 + } + logger.debug("收到机器人信息报文:{}", result.getBody()); + }catch (Exception e){ + num++; + try { + Thread.sleep(1000);//如果报错失败则每秒重试一此 + } catch (Exception e1) { + logger.error("迷",e1); + } + logger.error("机器人请求失败",e); + } + long timeB = System.currentTimeMillis(); + logger.info("机器人心跳请求第{}次,耗时:{}",num,timeB-timeA); + } + return status; + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/ScriptEngineProcess.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/ScriptEngineProcess.java new file mode 100644 index 0000000..d626a84 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/service/ScriptEngineProcess.java @@ -0,0 +1,174 @@ +package net.northking.cctp.daemon.service; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.commands.win.TaskKill; +import net.northking.cctp.daemon.config.DaemonProperties; +import net.northking.cctp.daemon.config.EngineProperties; +import net.northking.cctp.daemon.entity.ResultWrapper; +import net.northking.cctp.se.dto.ScriptEngineInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.web.client.RestTemplate; + +import java.io.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; + +public class ScriptEngineProcess extends AppLifecycle +{ + + private static final Logger logger = LoggerFactory.getLogger(ScriptEngineProcess.class); + + private ObjectMapper objectMapper = new ObjectMapper(); + + + /** + * 配置参数 + */ + private final DaemonProperties daemonProperties; + private final EngineProperties engineProperties; + + private final RestTemplate restTemplate; + + private final DaemonService daemonService; + + private String PID; + + + public ScriptEngineProcess(DaemonProperties daemonProperties, RestTemplate restTemplate, DaemonService daemonService) + { + this.daemonProperties = daemonProperties; + this.engineProperties = daemonProperties.getEngine(); + this.restTemplate = restTemplate; + this.daemonService = daemonService; + } + + + @Override + public boolean isStarted() + { + String pid = getPid(); + + if (pid == null || "".equals(pid.trim())) + { + return false; + } + return findProcessByPid(pid).size() > 0; + } + + @Override + public void start() + { + if(daemonService.startCheck()){ + startOnWindows(); + } + } + + private void startOnWindows() + { + //异步线程启动并持续打印数据 + EngineServiceStartThread thread = new EngineServiceStartThread(daemonProperties,daemonService); + thread.start(); + daemonService.restartEngineFinish(); + } + + @Override + public void stop() + { + if (!stopByHTTP()) + { + shutdown(); + } + } + + private boolean stopByHTTP() + { + String stopUrl = "http://localhost:" + engineProperties.getPort() + "/v1/stop"; + Map uriVariables = new HashMap<>(); + String body = ""; + HttpHeaders headers = new HttpHeaders(); + // TODO 设置HTTP请求头 + HttpEntity request = new HttpEntity(uriVariables, headers); + try { + String responseBody = restTemplate.postForObject(stopUrl, request, String.class, uriVariables); + }catch (Exception e){ + logger.debug("通过HTTP接口停止脚本引擎 无法停止原因:"+e.getMessage()); + logger.debug("判定进程无法使用转为强制重启 --------"); + return false; + } + // TODO 处理应答结果 + logger.debug("通过HTTP接口停止脚本引擎成功"); + return true; + } + + + @Override + public void restart() + { + stop(); + start(); + } + + @Override + public boolean alive() + { + String infoUrl = "http://localhost:" + engineProperties.getPort() + "/v1/info"; + Map uriVariables = new HashMap<>(); + + try + { + logger.debug("获取脚本引擎信息,请求接口:HTTP GET {}", infoUrl); + String responseBody = restTemplate.getForObject(infoUrl, String.class, uriVariables); + logger.debug("收到脚本引擎信息报文:{}", responseBody); + + ResultWrapper wrapper = objectMapper.readValue(responseBody, new TypeReference>() + { + }); + ScriptEngineInfo scriptEngineInfo = wrapper.getData(); + logger.info("【脚本引擎】版本号:{} ,PID={} 运行正常。", scriptEngineInfo.getVersion(), PID); + daemonService.updateEngineInfo(scriptEngineInfo); + } catch (Exception ex) + { + logger.info("脚本引擎信息获取失败", ex); + return false; + } + return true; + } + + @Override + public String getPid() + { + String pidFile = daemonProperties.getEngineHome() + "/" + engineProperties.getPidFile(); + try (Scanner sc = new Scanner(new FileReader(pidFile))) + { + while (sc.hasNextLine()) + { //按行读取字符串 + PID = sc.nextLine(); + } + } catch (FileNotFoundException e) + { + logger.error("脚本引擎的PID文件不存在!" + e.getMessage()); + } + logger.debug("获取脚本引擎的进程号:{}", PID); + return PID; + } + + @Override + public void shutdown() + { + TaskKill taskKill = new TaskKill(); + taskKill.force(true); + String pid = getPid(); + if (pid != null && pid.trim().length() > 0) + { + taskKill.pid(pid); + taskKill.execute(); + logger.debug("关闭脚本引擎,根据进程号杀掉进程:PID={}", pid); + } + } + +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/utils/FileUtils.java b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/utils/FileUtils.java new file mode 100644 index 0000000..ee1da19 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/java/net/northking/cctp/daemon/utils/FileUtils.java @@ -0,0 +1,87 @@ +package net.northking.cctp.daemon.utils; + +import java.io.*; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +public class FileUtils +{ + public static void copyFolder(File sourceFolder, File targetFolder) throws IOException + { + File[] sourceChildren = sourceFolder.listFiles(); + for (File sourceChild : sourceChildren) + { + File targetFile = new File(targetFolder, sourceChild.getName()); + if (sourceChild.isDirectory()) + { + targetFile.mkdirs(); + copyFolder(sourceChild, targetFile); + } else + { + copyFile(sourceChild, targetFile); + } + } + } + + public static void copyFile(File sourceChild, File targetFile) throws IOException + { + copy(new FileInputStream(sourceChild), new FileOutputStream(targetFile)); + } + + public static void unZip(File zipFile, File unZipDir) throws IOException + { + unZip(new ZipFile(zipFile), unZipDir); + } + + private static void unZip(ZipFile zipFile, File unZipDir) throws IOException + { + File subFile; + Enumeration entries = (Enumeration) zipFile.entries(); + if(!unZipDir.exists()){ + unZipDir.mkdirs(); + } + + while (entries.hasMoreElements()) + { + ZipEntry zipEntry = entries.nextElement(); + subFile = new File(unZipDir, zipEntry.getName()); + if (zipEntry.isDirectory()) + { + subFile.mkdirs(); + } else + { + unZipSubFile(zipFile, zipEntry, subFile); + } + } + } + + + private static void unZipSubFile(ZipFile zipFile, ZipEntry zipEntry, File subFile) throws IOException + { + copy(zipFile.getInputStream(zipEntry), new FileOutputStream(subFile)); + } + + /** + * 拷贝 + * + * @param inputStream 输入流 + * @param outputStream 输出流 + * @throws IOException 异常 + */ + private static void copy(InputStream inputStream, OutputStream outputStream) throws IOException + { + byte[] buffer = new byte[1024]; + int len; + try ( + BufferedOutputStream bos = new BufferedOutputStream(outputStream); + BufferedInputStream bis = new BufferedInputStream(inputStream) + ) + { + while ((len = bis.read(buffer)) != -1) + { + bos.write(buffer, 0, len); + } + } + } +} diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-devFront-win.yml b/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-devFront-win.yml new file mode 100644 index 0000000..d39cb83 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-devFront-win.yml @@ -0,0 +1,13 @@ +daemon: + home: ../../dist + center-url: http://158.1.12.236:8000 + init-file: 20ca9af01eae4fb2b824671b9be15a18_2022_11_29_60d01e3201254393b21c4ad536c59ca3.zip + engine: + # pid-file: script-engine.pid + # jar-file: script-engine.ms.jar + port: 6001 + ops-xms: 1024M + ops-xmx: 2048M + ops-perm-size: 256M + encoding: UTF-8 + engineTrace: true diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-prod-win.yml b/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-prod-win.yml new file mode 100644 index 0000000..1164aa4 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-prod-win.yml @@ -0,0 +1,13 @@ +daemon: + home: ../../dist + center-url: http://197.68.31.184:8000/ + init-file: 20ca9af01eae4fb2b824671b9be15a18_2022_11_29_60d01e3201254393b21c4ad536c59ca3.zip + engine: + # pid-file: script-engine.pid + # jar-file: script-engine.ms.jar + port: 6001 + ops-xms: 1024M + ops-xmx: 2048M + ops-perm-size: 256M + encoding: UTF-8 + engineTrace: false \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-test-win.yml b/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-test-win.yml new file mode 100644 index 0000000..5d4d73e --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-test-win.yml @@ -0,0 +1,13 @@ +daemon: + home: ../../dist + center-url: http://197.68.24.38:8000 + init-file: 20ca9af01eae4fb2b824671b9be15a18_2022_11_29_60d01e3201254393b21c4ad536c59ca3.zip + engine: + # pid-file: script-engine.pid + # jar-file: script-engine.ms.jar + port: 6001 + ops-xms: 1024M + ops-xmx: 2048M + ops-perm-size: 256M + encoding: UTF-8 + engineTrace: false \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-uat-win.yml b/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-uat-win.yml new file mode 100644 index 0000000..2a77122 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application-uat-win.yml @@ -0,0 +1,13 @@ +daemon: + home: ../../dist + center-url: http://197.68.31.131:8000/ + init-file: 20ca9af01eae4fb2b824671b9be15a18_2022_11_29_60d01e3201254393b21c4ad536c59ca3.zip + engine: + # pid-file: script-engine.pid + # jar-file: script-engine.ms.jar + port: 6001 + ops-xms: 1024M + ops-xmx: 2048M + ops-perm-size: 256M + encoding: UTF-8 + engineTrace: false diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application.yml b/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application.yml new file mode 100644 index 0000000..38045c4 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/application.yml @@ -0,0 +1,30 @@ +server: + port: 9528 + +management: + endpoint: + shutdown: + enabled: true + endpoints: + web: + base-path: /actuator + exposure: + include: health,shutdown + +spring: + application: + name: daemon-process + jpa: + show-sql: true + hibernate: + ddl-auto: update + database: h2 + datasource: + url: jdbc:h2:file:../../dist/.h2/daemon + username: sa + password: 123456 + driver-class-name: org.h2.Driver + h2: + console: + path: /h2 + enabled: true diff --git a/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/logback.xml b/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/logback.xml new file mode 100644 index 0000000..d5d9c47 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/src/main/resources/logback.xml @@ -0,0 +1,35 @@ + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} : %msg%n + UTF-8 + + + + + + ${log_path}/CCTP-Daemon.log + + ${log_path}/CCTP-Daemon-%d{yyyy-MM-dd}.%i.log + 10 + 10MB + + true + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} : %msg%n + UTF-8 + + + + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-daemon-process/start.bat b/cctp-atu/atu-engine/atu-daemon-process/start.bat new file mode 100644 index 0000000..ea6cec5 --- /dev/null +++ b/cctp-atu/atu-engine/atu-daemon-process/start.bat @@ -0,0 +1,6 @@ +@echo off +chcp 65001 +title=守护进程 +cd %~dp0 +java -jar -Dloader.path=lib,modules -Dfile.encoding=utf-8 -Dspring.profiles.active=devFront-win atu-daemon-process-4.0-SNAPSHOT.ms.jar +@pause \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-engine-dto/pom.xml b/cctp-atu/atu-engine/atu-engine-dto/pom.xml new file mode 100644 index 0000000..b815124 --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/pom.xml @@ -0,0 +1,23 @@ + + + + net.northking.cctp.atu + atu-engine-parent + 1.0.0-RELEASE + + 4.0.0 + + atu-engine-dto + 1.0.1-RELEASE + jar + + + + org.projectlombok + lombok + + + + \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATULog.java b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATULog.java new file mode 100644 index 0000000..880343f --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATULog.java @@ -0,0 +1,132 @@ +package net.northking.cctp.se.dto; + +import java.io.Serializable; + +/** + * 统一自动化日志 + */ +public class ATULog implements Serializable +{ + /** + * 时间戳 + */ + private long timeStamp; + + /** + * 日志级别 + */ + private String level; + + /** + * 步骤ID + */ + private String stepId; + /** + * 步骤名称 + */ + private String stepName; + + /** + * 步骤循环序号 + */ + private int stepLoopIdx; + + /** + * 组件关键字 + */ + private String componentKey; + + /** + * 组件名称 + */ + private String componentName; + + + /** + * 日志内容 + */ + private String content; + + + public String getLevel() + { + return level; + } + + public void setLevel(String level) + { + this.level = level; + } + + public long getTimeStamp() + { + return timeStamp; + } + + public void setTimeStamp(long timeStamp) + { + this.timeStamp = timeStamp; + } + + public String getStepId() + { + return stepId; + } + + public void setStepId(String stepId) + { + this.stepId = stepId; + } + + public String getStepName() + { + return stepName; + } + + public void setStepName(String stepName) + { + this.stepName = stepName; + } + + public int getStepLoopIdx() + { + return stepLoopIdx; + } + + public void setStepLoopIdx(int stepLoopIdx) + { + this.stepLoopIdx = stepLoopIdx; + } + + public String getComponentKey() + { + return componentKey; + } + + public void setComponentKey(String componentKey) + { + this.componentKey = componentKey; + } + + public String getComponentName() + { + return componentName; + } + + public void setComponentName(String componentName) + { + this.componentName = componentName; + } + + public String getContent() + { + return content; + } + + public void setContent(String content) + { + this.content = content; + } + + +} diff --git a/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATUWebSocketMessage.java b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATUWebSocketMessage.java new file mode 100644 index 0000000..4f4a11c --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATUWebSocketMessage.java @@ -0,0 +1,38 @@ +package net.northking.cctp.se.dto; + +import java.io.Serializable; + +/** + * 统一自动化WebSocket消息 + */ +public class ATUWebSocketMessage implements Serializable +{ + /** + * 指令 + */ + private String cmd; + + private T data; + + public String getCmd() + { + return cmd; + } + + public void setCmd(String cmd) + { + this.cmd = cmd; + } + + public T getData() + { + return data; + } + + public void setData(T data) + { + this.data = data; + } + + +} diff --git a/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATUWebSocketPayload.java b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATUWebSocketPayload.java new file mode 100644 index 0000000..25fbd0f --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATUWebSocketPayload.java @@ -0,0 +1,24 @@ +package net.northking.cctp.se.dto; + +import java.io.Serializable; + +/** + * 统一自动化WebSocket 加载的内容 + */ +public abstract class ATUWebSocketPayload implements Serializable +{ + /** + * 主键ID + */ + private String requestId; + + public String getRequestId() + { + return requestId; + } + + public void setRequestId(String requestId) + { + this.requestId = requestId; + } +} diff --git a/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATUWebSocketReplay.java b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATUWebSocketReplay.java new file mode 100644 index 0000000..ba3451d --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ATUWebSocketReplay.java @@ -0,0 +1,55 @@ +package net.northking.cctp.se.dto; + +import net.northking.cctp.se.script.ATUScript; + +/** + * 回放请求的参数 + */ +public class ATUWebSocketReplay extends ATUWebSocketPayload +{ + /** + * 回放类型: restart/all/from/step + */ + private String type; + + /** + * 步骤编号 + */ + private String stepId; + + /** + * 脚本 + */ + private ATUScript script; + + public String getType() + { + return type; + } + + public void setType(String type) + { + this.type = type; + } + + public String getStepId() + { + return stepId; + } + + public void setStepId(String stepId) + { + this.stepId = stepId; + } + + public ATUScript getScript() + { + return script; + } + + public void setScript(ATUScript script) + { + this.script = script; + } + +} diff --git a/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/EngineStatus.java b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/EngineStatus.java new file mode 100644 index 0000000..dbdb98c --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/EngineStatus.java @@ -0,0 +1,13 @@ +package net.northking.cctp.se.dto; + +/** + * 引擎状态枚举 + */ +public enum EngineStatus +{ + INIT, // 初始化 + LOGIN_ING, //注册中 + LOGIN_SUCCESSFULLY, // 注册登录成功 + LOGIN_FAILED, // 注册登录失败 + STOPPING; // 停止中 +} diff --git a/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ScriptEngineInfo.java b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ScriptEngineInfo.java new file mode 100644 index 0000000..b68eb42 --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/dto/ScriptEngineInfo.java @@ -0,0 +1,89 @@ +package net.northking.cctp.se.dto; + +public class ScriptEngineInfo +{ + /** + * 版本号 + */ + private String version; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 引擎ID + */ + private String engineId; + + /** + * 状态 + */ + private EngineStatus status; + + /** + * 操作系统名称 + */ + private String osName; + + /** + * 20230831 jieying.li 添加引擎的ip + */ + private String ipAddress; + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public EngineStatus getStatus() + { + return status; + } + + public void setStatus(EngineStatus status) + { + this.status = status; + } + + public String getEngineId() { + return engineId; + } + + public void setEngineId(String engineId) { + this.engineId = engineId; + } + + public String getOsName() { + return osName; + } + + public void setOsName(String osName) { + this.osName = osName; + } + + public String getIpAddress() { + return ipAddress; + } + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + +} diff --git a/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ATUScript.java b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ATUScript.java new file mode 100644 index 0000000..fa133c0 --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ATUScript.java @@ -0,0 +1,148 @@ +package net.northking.cctp.se.script; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 统一自动化测试脚本 + */ +public class ATUScript implements Serializable +{ + /** + * 脚本标识ID + */ + private String id; + + /** + * 引擎版本 + */ + private String engineVersion; + + /** + * 脚本信息 + */ + private String scriptInfo; + + /** + * 被测目标 + */ + private List testTargets = new ArrayList<>(); + + /** + * 脚本运行环境要求 + */ + private ScriptEnvironment runtime; + + /** + * 脚本全局设置 + */ + private Map globalSettings = new HashMap<>(); + + /** + * 脚本参数清单 + */ + private List variables = new ArrayList<>(); + + /** + * 脚本资源清单 + */ + private List resources = new ArrayList<>(); + + /** + * 脚本步骤清单 + */ + private List commands = new ArrayList<>(); + + public String getId() + { + return id; + } + + public void setId(String id) + { + this.id = id; + } + + public String getEngineVersion() + { + return engineVersion; + } + + public void setEngineVersion(String engineVersion) + { + this.engineVersion = engineVersion; + } + + public String getScriptInfo() + { + return scriptInfo; + } + + public void setScriptInfo(String scriptInfo) + { + this.scriptInfo = scriptInfo; + } + + public List getTestTargets() + { + return testTargets; + } + + public void setTestTargets(List testTargets) + { + this.testTargets = testTargets; + } + + public ScriptEnvironment getRuntime() + { + return runtime; + } + + public void setRuntime(ScriptEnvironment runtime) + { + this.runtime = runtime; + } + + public Map getGlobalSettings() + { + return globalSettings; + } + + public void setGlobalSettings(Map globalSettings) + { + this.globalSettings = globalSettings; + } + + public List getVariables() + { + return variables; + } + + public void setVariables(List variables) + { + this.variables = variables; + } + + public List getResources() + { + return resources; + } + + public void setResources(List resources) + { + this.resources = resources; + } + + public List getCommands() + { + return commands; + } + + public void setCommands(List commands) + { + this.commands = commands; + } +} diff --git a/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptEnvironment.java b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptEnvironment.java new file mode 100644 index 0000000..f6a0852 --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptEnvironment.java @@ -0,0 +1,8 @@ +package net.northking.cctp.se.script; + +/** + * 脚本运行环境要求 + */ +public class ScriptEnvironment +{ +} diff --git a/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptResource.java b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptResource.java new file mode 100644 index 0000000..e393310 --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptResource.java @@ -0,0 +1,8 @@ +package net.northking.cctp.se.script; + +/** + * 脚本资源 + */ +public class ScriptResource +{ +} diff --git a/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptStep.java b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptStep.java new file mode 100644 index 0000000..0e4bb3c --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptStep.java @@ -0,0 +1,74 @@ +package net.northking.cctp.se.script; + +import java.util.ArrayList; +import java.util.List; + +/** + * 脚本步骤 + */ +public class ScriptStep +{ + private String id; + + /** + * 是否注释掉 + */ + private boolean skip; + + /** + * 组件库名称 + */ + private String componentLib; + + /** + * 组件命令 + */ + private String command; + + + public boolean isSkip() { + return skip; + } + + public void setSkip(boolean skip) { + this.skip = skip; + } + + public String getComponentLib() { + return componentLib; + } + + public void setComponentLib(String componentLib) { + this.componentLib = componentLib; + } + + public String getCommand() { + return command; + } + + public void setCommand(String command) { + this.command = command; + } + + private List children = new ArrayList<>(); + + public String getId() + { + return id; + } + + public void setId(String id) + { + this.id = id; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptTarget.java b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptTarget.java new file mode 100644 index 0000000..ff91b31 --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptTarget.java @@ -0,0 +1,8 @@ +package net.northking.cctp.se.script; + +/** + * 统一自动化测试目标 + */ +public class ScriptTarget +{ +} diff --git a/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptVariable.java b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptVariable.java new file mode 100644 index 0000000..a7bd334 --- /dev/null +++ b/cctp-atu/atu-engine/atu-engine-dto/src/main/java/net/northking/cctp/se/script/ScriptVariable.java @@ -0,0 +1,54 @@ +package net.northking.cctp.se.script; + +import lombok.Data; + +import java.util.List; + +/** + * 脚本参数 + */ +@Data +public class ScriptVariable { + + /** + * 参数名称 + */ + private String name; + + /** + * 参数描述 + */ + private String desc; + + /** + * 参数类型 + */ + private String type; + + /** + * 默认值 + */ + private String defaultValue; + + /** + * 参数值 + */ + private String value; + + /** + * 是否是输入参数 + */ + private boolean input; + + /** + * 是否是输出参数 + */ + private boolean output; + + /** + * + */ + private List quoted; + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/Dockerfile b/cctp-atu/atu-engine/atu-script-engine/Dockerfile new file mode 100644 index 0000000..9d824a5 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/Dockerfile @@ -0,0 +1,25 @@ + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER jianfeng.chen@northking.net + +EXPOSE 6001 + +ENV CCTP_HOME /home/cctp + +ENV JAR_FILE=atu-script-engine.jar +#ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' + +VOLUME ${CCTP_HOME} + +ADD engine ${CCTP_HOME}/ + +ENV TZ=Asia/Shanghai + +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +RUN echo "java -jar -Xms512M -Xmx4096M -XX:+HeapDumpOnOutOfMemoryError -Dloader.path=.,lib -Dspring.profiles.active=devFront-linux ${JAR_FILE}" > /run.sh && chmod 777 /run.sh + +ENTRYPOINT ["/bin/sh", "/run.sh"] diff --git a/cctp-atu/atu-engine/atu-script-engine/Dockerfile-dev b/cctp-atu/atu-engine/atu-script-engine/Dockerfile-dev new file mode 100644 index 0000000..de16133 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/Dockerfile-dev @@ -0,0 +1,27 @@ + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER jianfeng.chen@northking.net + +EXPOSE 6001 + +ENV CCTP_HOME /home/cctp + +ENV JAR_FILE=atu-script-engine.jar +ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' + +VOLUME ${CCTP_HOME} + +ADD engine ${CCTP_HOME}/ + +ADD target/dist ${CCTP_HOME}/ + +ENV TZ=Asia/Shanghai + +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +RUN echo "java -jar -Xms512M -Xmx4096M -XX:+HeapDumpOnOutOfMemoryError -Dloader.path=.,lib -Dspring.profiles.active=devFront-linux ${JAR_FILE}" > /run.sh && chmod 777 /run.sh + +ENTRYPOINT ["/bin/sh", "/run.sh"] \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/Dockerfile-prod b/cctp-atu/atu-engine/atu-script-engine/Dockerfile-prod new file mode 100644 index 0000000..fb7714d --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/Dockerfile-prod @@ -0,0 +1,28 @@ + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER jianfeng.chen@northking.net + +EXPOSE 6001 + +ENV CCTP_HOME /home/cctp + +ENV JAR_FILE=atu-script-engine.jar +ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' + + +VOLUME ${CCTP_HOME} + +ADD engine ${CCTP_HOME}/ + +ADD target/dist ${CCTP_HOME}/ + +ENV TZ=Asia/Shanghai + +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +RUN echo "java -jar -Xms512M -Xmx4096M -XX:+HeapDumpOnOutOfMemoryError -Dloader.path=.,lib -Dspring.profiles.active=prod-linux ${JAR_FILE}" > /run.sh && chmod 777 /run.sh + +ENTRYPOINT ["/bin/sh", "/run.sh"] \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/Dockerfile-test b/cctp-atu/atu-engine/atu-script-engine/Dockerfile-test new file mode 100644 index 0000000..481df73 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/Dockerfile-test @@ -0,0 +1,27 @@ + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER jianfeng.chen@northking.net + +EXPOSE 6001 + +ENV CCTP_HOME /home/cctp + +ENV JAR_FILE=atu-script-engine.jar +ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' + +VOLUME ${CCTP_HOME} + +ADD engine ${CCTP_HOME}/ + +ADD target/dist ${CCTP_HOME}/ + +ENV TZ=Asia/Shanghai + +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +RUN echo "java -jar -Xms512M -Xmx4096M -XX:+HeapDumpOnOutOfMemoryError -Dloader.path=.,lib -Dspring.profiles.active=test-linux ${JAR_FILE}" > /run.sh && chmod 777 /run.sh + +ENTRYPOINT ["/bin/sh", "/run.sh"] \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/Dockerfile-uat b/cctp-atu/atu-engine/atu-script-engine/Dockerfile-uat new file mode 100644 index 0000000..6004446 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/Dockerfile-uat @@ -0,0 +1,27 @@ + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER jianfeng.chen@northking.net + +EXPOSE 6001 + +ENV CCTP_HOME /home/cctp + +ENV JAR_FILE=atu-script-engine.jar +ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' + +VOLUME ${CCTP_HOME} + +ADD engine ${CCTP_HOME}/ + +ADD target/dist ${CCTP_HOME}/ + +ENV TZ=Asia/Shanghai + +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +RUN echo "java -jar -Xms512M -Xmx4096M -XX:+HeapDumpOnOutOfMemoryError -Dloader.path=.,lib -Dspring.profiles.active=uat-linux ${JAR_FILE}" > /run.sh && chmod 777 /run.sh + +ENTRYPOINT ["/bin/sh", "/run.sh"] \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/docker-ctl.sh b/cctp-atu/atu-engine/atu-script-engine/docker-ctl.sh new file mode 100644 index 0000000..573ed11 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/docker-ctl.sh @@ -0,0 +1,148 @@ +#!/bin/sh + +source /etc/profile + +## 应用名称 +APP_NAME=atu-script-engine + +## 镜像版本 +VERSION=1.0.1-SNAPSHOT +APP_PORT=6001 + +## 公司名称 +corporation=gzrdc + +## 镜像仓库配置 +DOCKER_REGISTRY=harbor.hzbtest:8443 + +##dockerfile 文件名配置 + +FILE_NAME=Dockerfile + +while getopts "f:" arg +do + case $arg in + f) + echo "set FILE_NAME=$OPTARG" + FILE_NAME=$OPTARG + ;; + ?) + echo "unkown argument: $? $OPTARG " + exit 1 + ;; + esac +done + +TAG_NAME=${DOCKER_REGISTRY}/${corporation}/${APP_NAME}:${VERSION} + +logPath=/home/northking/logs + +## deployment yaml +DEPLOYMENT_YAML=${APP_NAME}.deployment.yaml + +shift $((OPTIND-1)) + +clean_Container() { + ## 获取运行 容器ID + RUN_ID=$(docker ps |grep ${APP_NAME}|awk '{print $1}') + + ## 先停止容器 + if [ "${RUN_ID}" = "" ]; then + echo "Container ${APP_NAME} is not starting " + else + ## 停止 docker容器 + docker stop ${RUN_ID} + echo "Container ${APP_NAME} , ID: ${RUN_ID} is stopped " + fi + + ## 获取已停止 容器ID + STOP_ID=$(docker ps -a |grep ${APP_NAME}|awk '{print $1}') + ## 删除容器 + if [ "${STOP_ID}" = "" ]; then + echo "Container ${APP_NAME} is not exist" + else + ## 移除 docker容器 + docker rm -v ${STOP_ID} + echo "Remove container ${APP_NAME} , ID: ${STOP_ID} " + fi + +} + +clean_Image() { + ## 获取 镜像ID + IMG_ID=$(docker images |grep ${APP_NAME}|awk '{print $3}') + + if [ "${IMG_ID}" = "" ]; then + echo "Image ${TAG_NAME} is not exist " + else + ## 移除 docker镜像 + docker rmi ${TAG_NAME} + echo "Remove image ${TAG_NAME} , ID: ${IMG_ID} " + fi +} + +get_agent(){ + ## 获取agent 文件 + mkdir -p target/dist/trace-otel/ + wget -P target/dist/trace-otel/ http://devops.hzbtest:38081/repository/raw-distribution/rdc/uts/core/hzb-otel-javaagent.jar + wget -P target/dist/trace-otel/ http://158.1.0.78:8081/repository/raw-distribution/rdc/uts/core/trace-otel.properties + sed -i "s?SUBSYS_ZZZ?SUBSYS_ATU_ENGINE?g" target/dist/trace-otel/trace-otel.properties + ## 添加jacoco的agent + #cp -r /home/northking/agent/jacoco-0.8.7 target/dist/ +} + +for command in $* +do + echo "execute : ${command}" + + case "${command}" in + clean) + clean_Container + clean_Image + ;; + build) + $0 clean + get_agent + ## 创建镜像 + docker build -f ${FILE_NAME} -t ${TAG_NAME} . + $0 debug + ;; + debug) + clean_Container + docker run -itd --net=host --name ${APP_NAME} -p ${APP_PORT}:${APP_PORT} -v ${logPath}/atu-engine:/home/cctp/logs -v /home/northking/docker/.h2/engine:/home/northking/engine/.h2/engine ${TAG_NAME} + sleep 2 + ## 输出容器日志 + RUN_ID=$(docker ps -a |grep ${APP_NAME}|awk '{print $1}') + docker logs -f -t ${RUN_ID} + ;; + push) + docker push ${TAG_NAME} + docker tag ${TAG_NAME} ${TAG_NAME}:${VERSION} + docker push ${TAG_NAME}:${VERSION} + docker rmi -f ${TAG_NAME} + docker rmi -f ${TAG_NAME}:${VERSION} + ;; + pull) + $0 clean + docker pull ${TAG_NAME} + ;; + deploy) + kubectl delete -f ${DEPLOYMENT_YAML} + sleep 2 + kubectl apply -f ${DEPLOYMENT_YAML} + sleep 2 + ;; + logs) + for pod in $(kubectl -n cctp get pod |grep ${APP_NAME}|awk '{print $1}') + do + echo "get logs by pod=${pod}" + kubectl -n cctp logs -f --tail=200 --follow=false ${pod} + done + ;; + *) + echo "Usage: $0 {clean|build|debug|push|deploy|logs}" + exit 1 + esac +done + +exit 0 diff --git a/cctp-atu/atu-engine/atu-script-engine/pom.xml b/cctp-atu/atu-engine/atu-script-engine/pom.xml new file mode 100644 index 0000000..ad3ddef --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/pom.xml @@ -0,0 +1,192 @@ + + + + net.northking.cctp.atu + atu-engine-parent + 1.0.0-RELEASE + + 4.0.0 + + atu-script-engine + 1.0.1-RELEASE + jar + + + net.northking.cctp.se.ScriptEngineApplication + atu-script-engine + 3.0.3 + 2.3.12.RELEASE + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + cctp.yml + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + ${start-class} + ${project-finalName} + ${project.build.directory} + + + + + repackage + + + + + + + + + + com.alibaba + fastjson + + + org.apache.commons + commons-lang3 + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.boot + spring-boot-starter-actuator + + + + net.northking.cctp + cctp-test-element-core + 1.0.2-SNAPSHOT + + + net.northking.cctp + cctp-commons + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.springframework.cloud + spring-cloud-openfeign-core + + + + + net.northking.cctp + cctp-test-element-core + + + net.northking.cctp.atu + atu-engine-dto + + + net.northking.cctp + atu-pc-driver + + + net.northking.cctp + atu-mobile-driver + + + io.appium + java-client + 7.6.0 + + + net.northking.cctp.atu + atu-engine-dto + + + + org.codehaus.groovy + groovy + ${groovy.version} + + + org.codehaus.groovy + groovy-datetime + ${groovy.version} + + + org.codehaus.groovy + groovy-jmx + ${groovy.version} + + + org.codehaus.groovy + groovy-json + ${groovy.version} + + + org.codehaus.groovy + groovy-jsr223 + ${groovy.version} + + + org.codehaus.groovy + groovy-templates + ${groovy.version} + + + + junit + junit + test + + + + net.northking.cctp + atu-pc-driver + 1.0.0-RELEASE + + + net.northking.cctp + atu-mobile-driver + 1.0.0-RELEASE + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.alibaba.fastjson2 + fastjson2 + 2.0.23 + + + + \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/shell/startL.sh b/cctp-atu/atu-engine/atu-script-engine/shell/startL.sh new file mode 100644 index 0000000..813fc1e --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/shell/startL.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +nohup java -jar -Xms128M -Xmx512M -XX:PermSize=128M -Dloader.path=lib,modules -Dfile.encoding=UTF-8 -Dspring.profiles.active=devFront-linux atu-script-engine.jar > /dev/null 2>&1 & diff --git a/cctp-atu/atu-engine/atu-script-engine/shell/startW.bat b/cctp-atu/atu-engine/atu-script-engine/shell/startW.bat new file mode 100644 index 0000000..3c94af7 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/shell/startW.bat @@ -0,0 +1,6 @@ +@echo off +chcp 65001 +title=执行引擎 +cd %~dp0 +java -jar -Xms128M -Xmx512M -XX:PermSize=128M -Dloader.path=lib,modules -Dfile.encoding=UTF-8 -Dspring.profiles.active=devFront-win atu-script-engine.jar +@pause \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/EngineRunner.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/EngineRunner.java new file mode 100644 index 0000000..7a4f7ac --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/EngineRunner.java @@ -0,0 +1,27 @@ +package net.northking.cctp.se; + +import net.northking.cctp.se.component.LibraryUpdateSchedule; +import net.northking.cctp.se.plan.servcie.EnginePlanInfoService; +import net.northking.cctp.se.util.SpringUtils; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +/** + *

Title: EngineRunner

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/10/13 15:43 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@Component +public class EngineRunner implements ApplicationRunner { + @Override + public void run(ApplicationArguments args) throws Exception { + SpringUtils.getBean(LibraryUpdateSchedule.class).libUpdate(); + SpringUtils.getBean(EnginePlanInfoService.class).uploadFinishedFile(); + + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/ScriptEngineApplication.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/ScriptEngineApplication.java new file mode 100644 index 0000000..3cc0522 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/ScriptEngineApplication.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. + * + */ +package net.northking.cctp.se; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.ApplicationPidFileWriter; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.scheduling.annotation.EnableScheduling; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * 脚本引擎启动类 + * + * @author : xiusong.xie + * @version : 1.0 + */ +@SpringBootApplication +@ComponentScan(value = {"net.northking.cctp.se"}) +@EnableScheduling +@EnableSwagger2 +public class ScriptEngineApplication +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(ScriptEngineApplication.class); + + public static void main(String[] args) + { + logger.info("脚本引擎 启动----------开始 ..............."); + + String pidFile = "script-engine.pid"; + SpringApplication application = new SpringApplication(ScriptEngineApplication.class); + // 指定PID文件 + application.addListeners(new ApplicationPidFileWriter(pidFile)); + application.run(args); + + logger.info("脚本引擎 启动-----------结束 ..............."); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComLibraryInfoDto.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComLibraryInfoDto.java new file mode 100644 index 0000000..76a03f3 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComLibraryInfoDto.java @@ -0,0 +1,98 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.se.component; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; + +import java.io.Serializable; + +@JsonSerialize +@ApiModel(description = "平台组件库") +public class ComLibraryInfoDto implements Serializable { + + /** + * 主键
+ */ + private String id; + /** + * 库名
+ */ + private String libraryName; + /** + * 库文件名
+ */ + private String fileName; + /** + * 库文件服务器地址
+ */ + private String filePath; + /** + * 组件库版本号
+ */ + private String libraryVersion; + /** + * 库本地地址 + */ + private String localPath; + + private String tenantId; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLibraryName() { + return libraryName; + } + + public void setLibraryName(String libraryName) { + this.libraryName = libraryName; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getLibraryVersion() { + return libraryVersion; + } + + public void setLibraryVersion(String libraryVersion) { + this.libraryVersion = libraryVersion; + } + + public String getLocalPath() { + return localPath; + } + + public void setLocalPath(String localPath) { + this.localPath = localPath; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComponentLibrary.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComponentLibrary.java new file mode 100644 index 0000000..bc771f8 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComponentLibrary.java @@ -0,0 +1,9 @@ +package net.northking.cctp.se.component; + +import net.northking.cctp.element.core.Library; + +public interface ComponentLibrary extends Library { + + void refreshThreadCache(); + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComponentManagementService.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComponentManagementService.java new file mode 100644 index 0000000..e53ac35 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComponentManagementService.java @@ -0,0 +1,31 @@ +package net.northking.cctp.se.component; + +import java.util.List; +import java.util.Map; + +public interface ComponentManagementService { + + + /** + * 创建一个独立的新的组件库实例 + * + * @param libCom + * @return + * @throws Exception + */ + ComponentLibrary newInstance(String libCom) throws Exception; + + /** + * 获取现有加载的组件库 + * + * @return key-库名,value-版本号 + */ + Map getExistMap(); + + /** + * 重新加载列表 + * + * @param updateList + */ + void reloadLibrary(List updateList); +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComponentManager.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComponentManager.java new file mode 100644 index 0000000..c410683 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/ComponentManager.java @@ -0,0 +1,46 @@ +package net.northking.cctp.se.component; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * ComponentManager + * + * @author fengxiang.zhang + * @since 1.0 + */ +@Slf4j +@Component +public class ComponentManager implements ComponentManagementService { + + @Autowired + private LibraryDefinitionManager definitionManager; + + + @Override + public ComponentLibrary newInstance(String libCom) throws Exception { + return definitionManager.newInstance(libCom); + } + + @Override + public Map getExistMap() { + return definitionManager.getLoadedLibraryJarInfo(); + } + + @Override + public void reloadLibrary(List updateList) { + for (ComLibraryInfoDto r : updateList) { + try { + log.info("------ 准备载入组件库资源:[name={}, version={}, path={}] ------", r.getLibraryName(), r.getLibraryVersion(), r.getLocalPath()); + definitionManager.reload(r.getLocalPath()); + } catch (Exception e) { + log.error(String.format("初始化组件库失败:[name=%s, version=%s, path=%s]", r.getLibraryName(), r.getLibraryVersion(), r.getLocalPath()), e); + } + } + } + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/InternalComponent.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/InternalComponent.java new file mode 100644 index 0000000..537ae3c --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/InternalComponent.java @@ -0,0 +1,21 @@ +package net.northking.cctp.se.component; + +/** + * 内置组件库名称和关键词 + */ +public interface InternalComponent { + /** + * 内部组件库名称 + */ + String NK_INTERNAL_LIB = "NK.Internal"; + interface InternalKeyword { + /** + * 脚本分组关键词 + */ + String KEYWORD_GROUP = "group"; + /** + * 调用业务组件关键词 + */ + String KEYWORD_INVOKE = "invoke"; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/LibraryDefinitionManager.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/LibraryDefinitionManager.java new file mode 100644 index 0000000..f5e6000 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/LibraryDefinitionManager.java @@ -0,0 +1,243 @@ +package net.northking.cctp.se.component; + +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.element.core.*; +import net.northking.cctp.element.core.exception.KeywordNotFoundException; +import net.northking.cctp.element.core.exception.NoSuchLibraryException; +import net.northking.cctp.element.core.keyword.KeywordArgument; +import net.northking.cctp.element.core.keyword.KeywordInfo; +import net.northking.cctp.element.core.scanner.LibraryDefinition; +import net.northking.cctp.element.core.scanner.ResourceScanner; +import net.northking.cctp.element.core.support.ThreadLevelCache; +import net.northking.cctp.element.log.Slf4jLogger; +import net.northking.cctp.element.scanner.JarResourceProvider; +import net.northking.cctp.element.system.SystemProperties; +import net.northking.cctp.element.util.Assert; +import net.northking.cctp.se.config.AtuServerConfig; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * ComponentManager + * + * @author fengxiang.zhang + * @since 1.0 + */ +@Slf4j +@Component +public class LibraryDefinitionManager implements InitializingBean { + + private static final Map registeredLibraryMap = new ConcurrentHashMap<>(8); + + @Autowired + private AtuServerConfig atuServerConfig; + + @Override + public void afterPropertiesSet() throws Exception { + String basePath = atuServerConfig.getComponentBasePath(); + if (StringUtils.isBlank(basePath)) { + basePath = SystemUtils.getUserHome().getPath(); + } + basePath = StringUtils.removeEnd(basePath, File.separator); + // 组件工作时存放文件基础目录 + System.setProperty(SystemProperties.BASE_STORAGE_DIR_KEY, basePath + File.separator + "workspace"); + } + + /** + * 重新加载组件库 + */ + public void reload(String localPath) throws Exception { + LibraryDefinition definition = load(localPath); + register(definition); + } + + /** + * 根据组件库名称获取新的组件库实例 + */ + public ComponentLibrary newInstance(String name) throws Exception { + LibraryDefinition definition = registeredLibraryMap.get(name); + if (definition == null) { + throw new NoSuchLibraryException("库未加载:" + name); + } + return newInstance(definition); + } + + /** + * 获取当前加载的库版本 + */ + public Map getLoadedLibraryJarInfo() { + Map loadedMap = new HashMap<>(); + for (Map.Entry entry : registeredLibraryMap.entrySet()) { + RegisterInfo registerInfo = entry.getValue().getRegisterInfo(); + loadedMap.put(entry.getKey(), registerInfo.getVersion()); + } + return loadedMap; + } + + /** + * 创建组件库实例 + */ + private ComponentLibrary newInstance(LibraryDefinition definition) throws Exception { + ContextInitializer initializer = new ContextInitializer(); + initializer.setLibraryDefinition(definition); + initializer.registerLogger(new Slf4jLogger()); + LibraryContext context = initializer.initialize(); + return AtuLibrary.wrapper(context.getLibrary(), context); + } + + /** + * 组件库注册 + */ + private static synchronized void register(LibraryDefinition definition) { + Assert.notNull(definition); + RegisterInfo registerInfo = definition.getRegisterInfo(); + String name = registerInfo.getName(); + LibraryDefinition old = registeredLibraryMap.put(name, definition); + if (old == null) { + log.info("库:[{}]注册成功,当前版本:{}", name, registerInfo.getVersion()); + } else { + log.info("库:[{}]变更成功,版本切换:{}->{}", name, old.getRegisterInfo().getVersion(), registerInfo.getVersion()); + } + } + + /** + * 加载组件库jar包 + */ + private LibraryDefinition load(String localPath) throws Exception { + Assert.notNull(localPath); + log.debug("------ 加载组件库资源:{}开始 ------", localPath); + JarResourceProvider provider = new JarResourceProvider(); + provider.add(localPath); + provider.initialize(); + log.debug("------ 加载组件库资源:{}结束 ------", localPath); + ResourceScanner scanner = new ResourceScanner(); + scanner.setResourceLoader(provider); + return scanner.doScan(); + } + + + public static class AtuLibrary implements ComponentLibrary { + + private Library source; + + private LibraryContext context; + + public AtuLibrary(Library source, LibraryContext context) { + this.source = source; + this.context = context; + } + + public static ComponentLibrary wrapper(Library source, LibraryContext context) { + return new AtuLibrary(source, context); + } + + @Override + public Object runKeyword(String keywordName, Map args) throws Exception { + return source.runKeyword(keywordName, args); + } + + @Override + public Object runKeyword(String keywordName, IExecuteContext context) throws Exception { + return source.runKeyword(keywordName, context); + } + + @Override + public String[] getKeywordNames() { + return source.getKeywordNames(); + } + + @Override + public String getKeywordDocumentation(String keywordName) throws KeywordNotFoundException { + return source.getKeywordDocumentation(keywordName); + } + + @Override + public List getKeywordArguments(String keywordName) throws Exception { + return source.getKeywordArguments(keywordName); + } + + /** + * Get keyword component parameters + * + * @param keywordName + * @return + * @throws Exception + */ + @Override + public Map getKeywordArgumentMap(String keywordName) throws Exception { + return source.getKeywordArgumentMap(keywordName); + } + + @Override + public String getKeywordAlias(String keywordName) throws KeywordNotFoundException { + return source.getKeywordAlias(keywordName); + } + + @Override + public boolean existKeyword(String keywordName) { + return source.existKeyword(keywordName); + } + + @Override + public List getAllKeywords() throws Exception { + return source.getAllKeywords(); + } + + @Override + public Iterator iterator() { + return source.iterator(); + } + + @Override + public void destroy() { + try { + source.destroy(); + } finally { + ThreadLevelCache.remove(); + } + } + + @Override + public String getName() { + return source.getName(); + } + + @Override + public String getChName() { + return source.getChName(); + } + + @Override + public String getVersion() { + return source.getVersion(); + } + + @Override + public Integer getType() { + return source.getType(); + } + + @Override + public String getIntro() { + return source.getIntro(); + } + + @Override + public String getChangeLog() { + return source.getChangeLog(); + } + + @Override + public void refreshThreadCache() { + context.refreshThreadCache(); + } + } + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/LibraryUpdateSchedule.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/LibraryUpdateSchedule.java new file mode 100644 index 0000000..cb47d99 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/LibraryUpdateSchedule.java @@ -0,0 +1,123 @@ +package net.northking.cctp.se.component; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.se.config.AtuServerConfig; +import net.northking.cctp.se.util.HttpUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.client.RestTemplate; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 组件库加载定时任务 + */ +@Component +public class LibraryUpdateSchedule { + + private static final Logger logger = LoggerFactory.getLogger(LibraryUpdateSchedule.class); + + private final long INITIAL_DELAY = 30*1000L; + private final long FIXED_DELAY = 2*60*1000L; + + @Autowired + private RestTemplate restTemplate; + @Autowired + private AtuServerConfig atuServerConfig; + @Autowired + private ComponentManagementService comService; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + /** + * 定时请求平台获取最新组件库清单 + * 对比本地加载的库进行组件库版本更新 + */ + @Scheduled(initialDelay = INITIAL_DELAY,fixedDelay = FIXED_DELAY) + public void libUpdate(){ + //获取最新组件库清单 + String url = atuServerConfig.getServerUrl()+atuServerConfig.getLibListUrl(); + List list = new ArrayList<>(); + try { + Map map = new HashMap<>(); + String responseBody = restTemplate.postForObject(url, map, String.class); + ResultWrapper> wrapper = objectMapper.readValue(responseBody, + new TypeReference>>(){}); + // 获取最新版本号。 + list= wrapper.getData(); + }catch (Exception e){ + logger.error("组件库清单获取失败 终止更新 失败原因-----------"+e.getMessage()); + return; + } + //获取当前已加载组件库清单 + Map existMap = comService.getExistMap(); + //对比清单获取需要更新组件库 + List updateList = comparedVersion(existMap,list); + if (updateList.size()>0){ + logger.info("组件库更新校验完毕 下载新库文件ing-----------"); + //下载组件库文件 + for (ComLibraryInfoDto info : updateList) { + //下载文件,并设置路径 + info.setLocalPath(downloadLibFile(info)); + } + //调取服务加载组件库 + logger.info("组件库下载完毕 热加载更新ing-----------"); + comService.reloadLibrary(updateList); + logger.info("组件库更新检查 ----------------- 结束"); + } + } + + /** + * 对比现有组件库,找出需要更新的组件库清单 + * @param existMap + * @param list + * @return + */ + private List comparedVersion(Map existMap, List list) { + List newList = new ArrayList<>(); + for (ComLibraryInfoDto info : list) { + String libName = info.getLibraryName(); + if(!(existMap.containsKey(libName) && info.getLibraryVersion().equals(existMap.get(libName)))){ + //未加载或者版本有变动,重新加载组件库 + newList.add(info); + } + } + return newList; + } + + private String downloadLibFile(ComLibraryInfoDto info){ + String fileId = info.getFilePath(); + String classPath = "./library/"; + File check = new File(classPath); + if(!check.exists()){ + check.mkdirs(); + } + String saveName = classPath+info.getFileName(); + File save = new File(saveName); + try { + String urlPath = info.getTenantId() + info.getFilePath().replace("/", "_"); + InputStream is = HttpUtils.download2Stream(urlPath); + FileOutputStream fos = new FileOutputStream(save); + FileCopyUtils.copy(is,fos); + fos.flush(); + is.close(); + fos.close(); + }catch (IOException e){ + logger.info("组件库:【{}】 下载失败,失败原因:{}",info.getLibraryName(),e.getMessage()); + } + logger.info("组件库【{}】下载完毕 保存路径:{}",info.getLibraryName(),save.getPath()); + return saveName; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/MdBusComponentInfoDetailDto.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/MdBusComponentInfoDetailDto.java new file mode 100644 index 0000000..ba55507 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/component/MdBusComponentInfoDetailDto.java @@ -0,0 +1,304 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.se.component; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; + +/** +* Restful接口--资源详情--数据传输对象:业务组件参数信息_编辑 +* +* createdate: 2022-10-10 16:53:15
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "业务组件列表") +public class MdBusComponentInfoDetailDto implements Serializable +{ + + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 组件名称
+ */ + @ApiModelProperty("组件名称") + private String comName; + /** + * 组件类型1-接口,2-pcbs,3-pccs,4-安卓,5-ios
+ */ + @ApiModelProperty("组件类型1-接口,2-pcbs,3-pccs,4-安卓,5-ios") + private Integer comType; + /** + * 说明
+ */ + @ApiModelProperty("说明") + private String memo; + /** + * 系统空间
+ */ + @ApiModelProperty("系统空间") + private String projectId; + /** + * 脚本内容
+ */ + @ApiModelProperty("脚本内容") + private String scriptContent; + /** + * 是否推荐使用0-推荐1-不推荐
+ */ + @ApiModelProperty("是否推荐使用0-推荐1-不推荐") + private Integer isDeprecated; + /** + * 组件复杂度
+ */ + @ApiModelProperty("组件复杂度") + private Integer complexity; + /** + * 逻辑删除0-可用1-已删除
+ */ + @ApiModelProperty("逻辑删除0-可用1-已删除") + private Integer isDeleted; + /** + * 组件版本号
+ */ + @ApiModelProperty("组件版本号") + private String comVersion; + /** + * 目录树id
+ */ + @ApiModelProperty("目录树id") + private String treeId; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + private String createdBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 修改人
+ */ + @ApiModelProperty("修改人") + private String updatedBy; + /** + * 修改时间
+ */ + @ApiModelProperty("修改时间") + private Date updatedTime; + /** + * 租户id
+ */ + @ApiModelProperty("租户id") + private String tenantId; + + @ApiModelProperty("参数json") + private String paramJson; + @ApiModelProperty("组件json") + private String comJson; + + /** + * 共享标识0-未共享,1-已共享
+ */ + @ApiModelProperty("共享标识0-未共享,1-已共享") + private Integer sharedFlag; + /** + * 负责人id
+ */ + @ApiModelProperty("负责人id") + @Size(max = 32, message="负责人id-principalId: 数据长度不能 > 32" ) + private String principalId; + + private String sharedBy; + private Date sharedTime; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getComName() { + return comName; + } + + public void setComName(String comName) { + this.comName = comName; + } + + public Integer getComType() { + return comType; + } + + public void setComType(Integer comType) { + this.comType = comType; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getScriptContent() { + return scriptContent; + } + + public void setScriptContent(String scriptContent) { + this.scriptContent = scriptContent; + } + + public Integer getIsDeprecated() { + return isDeprecated; + } + + public void setIsDeprecated(Integer isDeprecated) { + this.isDeprecated = isDeprecated; + } + + public Integer getComplexity() { + return complexity; + } + + public void setComplexity(Integer complexity) { + this.complexity = complexity; + } + + public Integer getIsDeleted() { + return isDeleted; + } + + public void setIsDeleted(Integer isDeleted) { + this.isDeleted = isDeleted; + } + + public String getComVersion() { + return comVersion; + } + + public void setComVersion(String comVersion) { + this.comVersion = comVersion; + } + + public String getTreeId() { + return treeId; + } + + public void setTreeId(String treeId) { + this.treeId = treeId; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getParamJson() { + return paramJson; + } + + public void setParamJson(String paramJson) { + this.paramJson = paramJson; + } + + public String getComJson() { + return comJson; + } + + public void setComJson(String comJson) { + this.comJson = comJson; + } + + public Integer getSharedFlag() { + return sharedFlag; + } + + public void setSharedFlag(Integer sharedFlag) { + this.sharedFlag = sharedFlag; + } + + public String getPrincipalId() { + return principalId; + } + + public void setPrincipalId(String principalId) { + this.principalId = principalId; + } + + public String getSharedBy() { + return sharedBy; + } + + public void setSharedBy(String sharedBy) { + this.sharedBy = sharedBy; + } + + public Date getSharedTime() { + return sharedTime; + } + + public void setSharedTime(Date sharedTime) { + this.sharedTime = sharedTime; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/AtuServerConfig.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/AtuServerConfig.java new file mode 100644 index 0000000..01070dc --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/AtuServerConfig.java @@ -0,0 +1,146 @@ +package net.northking.cctp.se.config; + +import lombok.Data; +import org.apache.commons.lang3.StringUtils; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 服务端相关配置 + */ +@Data +@ConfigurationProperties(prefix = "atu.server") +@Configuration +public class AtuServerConfig { + /** + * 服务端服务器地址 + */ + private String serverUrl; + /** + * 设备管理路径 + */ + private String deviceInfoPath; + /** + * 全局变量访问 + */ + private String globalVarPath; + /** + * 全局变量修改路径 + */ + private String globalVarUpdatePath; + /** + * 文件下载路径 + */ + private String fileDownloadPath; + /** + * 文件上传路径 + */ + private String fileUploadPath; + /** + * 组件库工作基础目录 + */ + private String componentBasePath; + + /** + * 设备管理注册 + */ + private String engineRegister; + + /** + * 引擎服务名称 + */ + private String engineName; + + /** + * 引擎版本号 + */ + private String engineVersion; + + /** + * 设备释放接口路径 + */ + private String deviceReleasePath; + + /** + * app下载 + */ + private String appDownloadUrl; + /** + * 组件库清单地址 + */ + private String libListUrl; + /** + * 业务组件信息地址 + */ + private String busComInfoUrl; + + private String appiumHost; + + private String appiumPort; + + private String appiumContextPath; + + private String appDownloadAddr; + /** + * 移动任务引擎批量占用设备接口 + */ + private String tryAcqurieDeviceUrl; + + /** + * pc任务引擎占用设备接口 + */ + private String pcAcqurieDeviceUrl; + + /** + * 任务取消更新结果接口 + */ + private String taskCancelResultUrl; + + /** + * 移动应用详情接口 + */ + private String appInfoUrl; + /** + * 获取模糊数据信息接口 + */ + private String ruleDataByName; + /** + * 超时释放设备接口 + */ + private String releaseDeviceBatch; + + /** + * 获取项目信息 + */ + private String projectInfo; + + /** + * 获取引用数据 + */ + private String quoteDataUrl; + + public String getQuoteDataUrl() { + return StringUtils.isBlank(quoteDataUrl) ? "/api/atu-data-mgr/pub/query/selectDataUrlAndTreeName" : this.quoteDataUrl; + } + + /** + * bs被测系统url查询地址 + */ + private String testSysUrl; +/** + * 根据token获取用户信息 + */ + private String userInfoUrl; + + public String getUserInfoUrl() { + return StringUtils.isBlank(this.userInfoUrl) ? "/api/cctp-platform/security/token/user-info" : this.userInfoUrl; + } + + private String engineSys; + + private String remotePort; + + private String remoteProtocol; + + private Boolean IsPcExecutor; +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/CacheConfiguration.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/CacheConfiguration.java new file mode 100644 index 0000000..7093ae2 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/CacheConfiguration.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 京北方信息技术股份有限公司 Corporation 2021 . All rights reserved. + * + */ +package net.northking.cctp.se.config; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import net.northking.cctp.common.cache.EntityNameCache; +import net.northking.cctp.common.cache.EntityNameRedisRepository; +import net.northking.cctp.common.saas.cache.SaaSTenantCache; +import net.northking.cctp.common.saas.cache.StaticTenantCache; +import net.northking.cctp.common.security.authorization.ResourceAuthorityCache; +import net.northking.cctp.common.security.authorization.ResourceAuthorityRedisRepository; +import net.northking.cctp.common.sequence.SequenceDistributedService; +import net.northking.cctp.common.sequence.SequenceNoneStorage; +import net.northking.cctp.common.sequence.SequenceService; +import net.northking.cctp.common.sequence.SequenceStorage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.integration.redis.util.RedisLockRegistry; + +/** + * 平台缓存配置 + * + * @author : xiusong.xie + * @version : 1.0 + */ +@Configuration +public class CacheConfiguration +{ + private static final Logger logger = LoggerFactory.getLogger(CacheConfiguration.class); + + /** + * 统一配置 redisTemplate + * + * @return redisTemplate + */ + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) + { + RedisTemplate template = new RedisTemplate<>(); + // 配置连接工厂 + template.setConnectionFactory(factory); + + //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) + Jackson2JsonRedisSerializer jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); + + + ObjectMapper om = new ObjectMapper(); + // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 + jsonRedisSerializer.setObjectMapper(om); + + // 值采用json序列化 + template.setValueSerializer(jsonRedisSerializer); + //使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + + // 设置hash key 和value序列化模式 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(jsonRedisSerializer); + template.afterPropertiesSet(); + + logger.info("注册公共组件提示:统一配置 RedisTemplate 已完成。"); + return template; + } + + /** + * 配置Spring Cache序列化方式:JSON + * + * @return RedisCacheConfiguration + */ + @Bean + public RedisCacheConfiguration redisCacheConfiguration() + { + //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) + Jackson2JsonRedisSerializer jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); + + ObjectMapper om = new ObjectMapper(); + // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + // 找不到匹配属性时忽略报错 + om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + // 不包含任何属性的bean也不报错 + om.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + // JSON序列化忽略空值(包含NULL和空字符串) + om.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); + jsonRedisSerializer.setObjectMapper(om); + logger.info("注册公共组件提示:统一配置 Spring Cache序列化方式:JSON。"); + return RedisCacheConfiguration.defaultCacheConfig() + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jsonRedisSerializer)); + } + + /** + * 基于Redis的全局锁 + * + * @return 全局锁 + */ + @Bean + public RedisLockRegistry redisLockRegistry(RedisConnectionFactory factory) + { + logger.info("注册公共组件提示:统一配置 全局锁(RedisLockRegistry) 已完成。"); + return new RedisLockRegistry(factory, "CCTP_LOCK"); + } + + /** + * 资源权限缓存 + * + * @return 资源权限缓存 + */ + @Bean + @ConditionalOnMissingBean + public ResourceAuthorityCache resourceAuthorityCache(RedisTemplate redisTemplate) + { + logger.info("注册公共组件提示:统一配置 用户权限缓存(ResourceAuthorityCache) 已完成。"); + return new ResourceAuthorityRedisRepository(redisTemplate); + } + + + /** + * 实体命名缓存 + * + * @return 实体命名缓存 + */ + @Bean + @ConditionalOnMissingBean + public EntityNameCache entityNameCache(RedisTemplate redisTemplate) + { + + logger.info("注册公共组件提示:统一配置 实体命名缓存(EntityNameCache) 已完成。"); + return new EntityNameRedisRepository(redisTemplate); + } + + /** + * 静态租户缓存 + * + * @return 静态租户缓存 + */ + @Bean + @ConditionalOnMissingBean + public SaaSTenantCache staticTenantCache() + { + return new StaticTenantCache(); + } + + + /** + * 注册:序列持久化服务 + * + * @return 序列持久化服务 + */ + @Bean + @ConditionalOnMissingBean + public SequenceStorage sequenceStorage() + { + return new SequenceNoneStorage(); + } + + /** + * 注册: 分布式序列服务 + * + * @param factory redis连接工厂 + * @param sequenceStorage 序列持久化服务 + * @return 分布式序列服务 + */ + @Bean + public SequenceService sequenceService(RedisConnectionFactory factory, SequenceStorage sequenceStorage) + { + logger.info("注册公共组件提示:统一配置 分布式序列服务(SequenceService) 已完成。"); + + return new SequenceDistributedService(factory, sequenceStorage); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/ExecutorPoolConfig.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/ExecutorPoolConfig.java new file mode 100644 index 0000000..4af873e --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/ExecutorPoolConfig.java @@ -0,0 +1,64 @@ +package net.northking.cctp.se.config; + +import com.google.common.annotations.VisibleForTesting; +import lombok.Data; +import net.northking.cctp.se.thread.ExecutorPool; +import net.northking.cctp.se.util.SpringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.io.Serializable; + +@Configuration +public class ExecutorPoolConfig { + + private static final Logger logger = LoggerFactory.getLogger(ExecutorPoolConfig.class); + + @Bean + public ExecutorPool createExecutorPool() { + ExecutorPoolProperties pp = SpringUtils.getBean(ExecutorPoolProperties.class); + ExecutorPool executorPool = new ExecutorPool(pp.getEnablePc(), pp.getPcSize(),pp.getPcCoreSize(), pp.getEnableMobile(), pp.getMobileSize(), pp.getMobileCoreSize(),pp.getEnableApi(), pp.getApiSize(),pp.getApiCoreSize()); + logger.info("执行线程池创建成功:{}", ExecutorPool.info()); + logger.info("执行引擎所在的系统:{}", System.getProperty("os.name")); + return executorPool; + } + + + @ConfigurationProperties(prefix = "atu.engine.executor-pool") + @Configuration + @Data + static + class ExecutorPoolProperties implements Serializable { + @VisibleForTesting + private Integer pcSize; + + @VisibleForTesting + private Boolean enablePc; + + @VisibleForTesting + private Integer mobileSize; + + @VisibleForTesting + private Boolean enableMobile; + + @VisibleForTesting + private Integer apiSize; + + @VisibleForTesting + private Boolean enableApi; + + @VisibleForTesting + private Integer pcCoreSize; + + @VisibleForTesting + private Integer mobileCoreSize; + + @VisibleForTesting + private Integer apiCoreSize; + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/HttpErrorHandler.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/HttpErrorHandler.java new file mode 100644 index 0000000..e9758dc --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/HttpErrorHandler.java @@ -0,0 +1,24 @@ +package net.northking.cctp.se.config; + +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.web.client.ResponseErrorHandler; + +import java.io.IOException; + +/** + * 异常返回类 + */ +public class HttpErrorHandler implements ResponseErrorHandler { + + @Override + public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException { + return true; + } + + @Override + public void handleError(ClientHttpResponse clientHttpResponse) throws IOException { + + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/MobileAutomationSelectorConfig.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/MobileAutomationSelectorConfig.java new file mode 100644 index 0000000..74d4a41 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/MobileAutomationSelectorConfig.java @@ -0,0 +1,19 @@ +package net.northking.cctp.se.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "atu.mobile-automation") +public class MobileAutomationSelectorConfig { + + private String type; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/RabbitMQConfig.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/RabbitMQConfig.java new file mode 100644 index 0000000..6b077e7 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/RabbitMQConfig.java @@ -0,0 +1,38 @@ +package net.northking.cctp.se.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.*; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitMQConfig { + private static final Logger logger = LoggerFactory.getLogger(RabbitMQConfig.class); + @Bean + public SimpleMessageListenerContainer messageContainer(ConnectionFactory connectionFactory){ + logger.info("Creating messageContainer"); + SimpleMessageListenerContainer messageContainer = new SimpleMessageListenerContainer(connectionFactory); + //messageContainer.setConcurrentConsumers(1); + //messageContainer.setMaxConcurrentConsumers(1); + messageContainer.setAutoDeclare(true); + //设置是否重回队列 + messageContainer.setDefaultRequeueRejected(false); + //自动签收 + messageContainer.setAcknowledgeMode(AcknowledgeMode.AUTO); + logger.info("MessageContainer created."); + return messageContainer; + } + @Bean + public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){ + logger.info("Creating rabbitAdmin"); + RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); + logger.info("RabbitAdmin created."); + return rabbitAdmin; + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/RabbitMQConst.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/RabbitMQConst.java new file mode 100644 index 0000000..f570d40 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/RabbitMQConst.java @@ -0,0 +1,23 @@ +package net.northking.cctp.se.config; + +public interface RabbitMQConst { + /** + * 交换机名称 + */ + String EXCHANGE_AMQ_DIRECT = "amq.direct"; + /** + * 移动类型调式连接监听 + */ + String MOBILE_DEBUG_CONNECION = "mobile.debugConnecion"; + + /** + * 调试会话监听 + */ + String ENGINE_DEBUG_SESSION_TMPL = "%s.engine.session.%s"; + /** + * 调试会话监听 + */ + String SERVER_DEBUG_SESSION_TMPL = "%s.server.session.%s"; + String QUEUE_PREFIX = "QUEUE."; + String ROUTINGKEY_PREFIX = "RK."; +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/RestTemplateConfig.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/RestTemplateConfig.java new file mode 100644 index 0000000..1a6ede1 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/RestTemplateConfig.java @@ -0,0 +1,25 @@ +package net.northking.cctp.se.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +@Configuration +@Slf4j +public class RestTemplateConfig { + + private final static int timeout = 30000; + + @Bean + public RestTemplate createRestTemplate() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + log.info("加载RestTemplate,设置连接超时时间:{}ms,读取超时时间:{}ms", timeout, timeout); + factory.setConnectTimeout(timeout); + factory.setReadTimeout(timeout); + RestTemplate template = new RestTemplate(factory); + template.setErrorHandler(new HttpErrorHandler()); + return template; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/ScheduleConfig.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/ScheduleConfig.java new file mode 100644 index 0000000..c29854f --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/ScheduleConfig.java @@ -0,0 +1,35 @@ +package net.northking.cctp.se.config; + +import org.springframework.boot.autoconfigure.batch.BatchProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; + +import java.lang.reflect.Method; +import java.util.concurrent.Executors; + +/** + * 配置schedule,改为多线程执行。 + * 防止定时任务阻塞 + */ +@Configuration +public class ScheduleConfig implements SchedulingConfigurer { + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + Method[] methods = BatchProperties.Job.class.getMethods(); + int defaultPoolSize = 10; + int corePoolSize = 0; + if (methods != null && methods.length > 0) { + for (Method method : methods) { + Scheduled annotation = method.getAnnotation(Scheduled.class); + if (annotation != null) { + corePoolSize++; + } + } + if (defaultPoolSize > corePoolSize) + corePoolSize = defaultPoolSize; + } + taskRegistrar.setScheduler(Executors.newScheduledThreadPool(corePoolSize)); + } +} \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/SwaggerConfiguration.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/SwaggerConfiguration.java new file mode 100644 index 0000000..17f5660 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/config/SwaggerConfiguration.java @@ -0,0 +1,36 @@ +package net.northking.cctp.se.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +/** + * @author xiusong.xie + * @since 2.4 + */ +@Configuration +public class SwaggerConfiguration implements WebMvcConfigurer { + /** + * 接口文档定义 + * + * @return 接口文档定义 + */ + @Bean + public Docket createRestApi() { + ApiInfo apiInfo = new ApiInfoBuilder() + .title("UI引擎服务") + .description("这是UI引擎服务的接口文档") + .version("1.0") + .build(); + return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()).build(); + } +} \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/bean/DebugerConst.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/bean/DebugerConst.java new file mode 100644 index 0000000..de28183 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/bean/DebugerConst.java @@ -0,0 +1,176 @@ +package net.northking.cctp.se.debug.bean; + +public interface DebugerConst { + /** + * sesionId + */ + String KEY_SESSIONID = "sessionId"; + /** + * requestId + */ + String KEY_REQUESTID = "requestId"; + String AUTHORIZATION = "authorization"; + String KEY_PROJECTID = "projectId"; + String KEY_TENANT_ID = "tenantId"; + + /** + * 响应相关 + */ + public interface ReplyConst{ + String KEY_CMD_REPLY = "reply"; + String KEY_CMD_LOG = "replay_log"; + String KEY_DEVICE_STATUS = "device_status"; + String KEY_REQUEST_ID = "requestId"; + String KEY_SUCCESS = "success"; + String KEY_FINISH = "finish"; + String KEY_MSG = "msg"; + String KEY_RESULT = "result"; + String KEY_STEP_ID = "stepId"; + String KEY_NEXT_STEP_ID = "nextStepId"; + String KEY_VARIABLES = "variables"; + String KEY_KEYWORD_RETURN = "keywordReturn"; + String KEY_COMMAND = "command"; + + String KEY_LOG_TIME = "time"; + String KEY_LOG_LEVEL = "level"; + String KEY_REPLY_DATA = "data"; + String MOBILE_STEP_SNAPSHOT = "mobileStepSnapshot"; + String PC_STEP_SNAPSHOT = "pcStepSnapshot"; + } + + /** + * 请求相关参数 + */ + public interface ReqConst{ + /** + * 设备使用令牌key + */ + String KEY_TOKEN = "token"; + /** + * 脚本类型key + */ + String KEY_SCRIPT_TYPE = "type"; + /** + * Device_init指令下-初始化数据key + */ + String KEY_DEVICE_INIT_DATA = "data"; + /** + * 回放指令下,回放类型key: 可选值有restart/all/from/step + */ + String KEY_REPLAY_TYPE = "type"; + /** + * 回放指令下的脚本数据key + */ + String KEY_REPLAY_SCRIPT_DATA = "scriptData"; + /** + * 回放指令下的开始回放步骤ID key + */ + String KEY_REPLAY_FROM_STEP_ID = "stepId"; + + String KEY_TITLE = "title"; + + String KEY_STEP_TYPE = "stepType"; + + String KEY_COMMAND_NAME = "commandName"; + + String KEY_TIMEOUT = "timeout"; + + String KEY_IGNORE_ERROR = "ignoreError"; + + String KEY_USE_DEFAULT_VALUE = "useDefaultValue"; + + String KEY_RES_ID = "resId"; + + String KEY_INPUTS = "inputs"; + } + + /** + * 回放类型相关参数 + */ + public interface ReplayType { + /** + * 回放重启 + */ + String TYPE_RESTART = "restart"; + /** + * 全部回放类型 + */ + String TYPE_ALL = "all"; + /** + * 从当前步骤回放 + */ + String TYPE_FROM = "from"; + /** + * 单步回放 + */ + String TYPE_STEP = "step"; + } + + /** + * 指令相关 + */ + public interface CommandConst { + /** + * 移动端通信链路创建指令,仅与引擎通信使用 + */ + String CMD_CHANNEL_CREATE = "channel_create"; + /** + * 引擎初始化指令 init + */ + String CMD_ENGINE_INIT = "init"; + + //======================设备相关指令======================= + /** + * 连接指定设备指令 device_enter + */ + String CMD_DEVICE_ENTER = "device_enter"; + /** + * 设备应用初始化 + */ + String CMD_DEVICE_INIT = "device_init"; + /** + * 退出设备使用 + */ + String CMD_DEVICE_EXIT = "device_exit"; + + //=====================录制相关指令===================== + /** + * 开始录制 + */ + String CMD_DETECT_START = "detect_start"; + /** + * 暂停录制 + */ + String CMD_DETECT_STOP = "detect_stop"; + + //==========================回放指令===================== + /** + * 开始回放指令 + */ + String CMD_REPLAY_START = "replay_start"; + /** + * 停止回放指令 + */ + String CMD_REPLAY_STOP = "replay_stop"; + + /** + * 截图 + */ + String CMD_SCREEN_SHOT = "detect_element"; + + /** + * 隐式回放 + */ + String CMD_DETECT_EXECUTE = "detect_execute"; + + /** + * 接口调试 + */ + String CMD_DEBUG_API = "debug_api"; + + /** + * socket关闭 + */ + String CMD_DESTROY = "destroy"; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/bean/DebuggerRequest.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/bean/DebuggerRequest.java new file mode 100644 index 0000000..a308a79 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/bean/DebuggerRequest.java @@ -0,0 +1,129 @@ +package net.northking.cctp.se.debug.bean; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.ToStringBuilder; + + +import java.util.HashMap; +import java.util.Map; + +public class DebuggerRequest { + /** + * 会话ID + */ + private String sessionId; + /** + * 请求指令 + */ + private String cmd; + + /** + * 请求数据 + */ + private Map data; + + /** + * 用户token + */ + private String userToken; + + private String envId; + + public String getUserToken() { + return userToken; + } + + public void setUserToken(String userToken) { + this.userToken = userToken; + } + + public DebuggerRequest sessionId(String sessionId){ + this.sessionId = sessionId; + return this; + } + public DebuggerRequest cmd(String cmd){ + this.cmd = cmd; + return this; + } + public DebuggerRequest requestId(String requestId){ + withData(DebugerConst.KEY_REQUESTID,requestId); + return this; + } + public DebuggerRequest withData(String key, Object value){ + if(null == this.data){ + data = new HashMap<>(); + } + this.data.put(key,value); + return this; + } + + public DebuggerRequest withData(Map data){ + if(null == this.data){ + data = new HashMap<>(); + } + if (this.data != null) { + this.data.putAll(data); + } + return this; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public String getCmd() { + return cmd; + } + public Object getDataValue(String key){ + if(StringUtils.isBlank(key) || null == data){ + return null; + } + return data.get(key); + } + @JsonIgnore + public String getRequestId(){ + return (String)getDataValue(DebugerConst.KEY_REQUESTID); + } + @JsonIgnore + public String getProjectId(){ + return null == getDataValue(DebugerConst.KEY_PROJECTID) ? null : (String)getDataValue(DebugerConst.KEY_PROJECTID); + } + + public void setCmd(String cmd) { + this.cmd = cmd; + } + + public Map getData() { + return data; + } + + public void setData(Map data) { + this.data = data; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("sessionId", sessionId) + .append("cmd", cmd) + .append("data", data) + .toString(); + } + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public static DebuggerRequest newRequest(){ + return new DebuggerRequest(); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/bean/DebuggerResponse.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/bean/DebuggerResponse.java new file mode 100644 index 0000000..80b7520 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/bean/DebuggerResponse.java @@ -0,0 +1,145 @@ +package net.northking.cctp.se.debug.bean; + + + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.se.util.JsonUtils; + + +import javax.websocket.Session; +import java.util.HashMap; +import java.util.Map; +@Data +@Slf4j +public class DebuggerResponse { + + private String sessionId; + private String cmd; + private Map data; + + public static DebuggerResponse newResponse(){ + return new DebuggerResponse().cmd(DebugerConst.ReplyConst.KEY_CMD_REPLY); + } + public DebuggerResponse sessionId(String sessionId){ + this.sessionId = sessionId; + return this; + } + public DebuggerResponse cmd(String cmd){ + this.cmd = cmd; + return this; + } + + public DebuggerResponse withData(String key, Object val){ + if (null == data){ + data = new HashMap<>(); + } + data.put(key,val); + return this; + } + public DebuggerResponse withResult(String key, Object val){ + if (null == data){ + data = new HashMap<>(); + } + Map ret = (Map) data.get(DebugerConst.ReplyConst.KEY_RESULT); + if (null == ret) { + ret = new HashMap<>(); + } + ret.put(key,val); + data.put(DebugerConst.ReplyConst.KEY_RESULT, ret); + return this; + } + public DebuggerResponse withResult(Map resultData){ + if (null == resultData){ + return this; + } + if (null == data){ + data = new HashMap<>(); + } + Map result = (Map) data.get(DebugerConst.ReplyConst.KEY_RESULT); + if (null == result){ + result = new HashMap<>(); + } + result.putAll(resultData); + data.put(DebugerConst.ReplyConst.KEY_RESULT, result); + return this; + } + public DebuggerResponse requestId(String requestId){ + return withData(DebugerConst.ReplyConst.KEY_REQUEST_ID,requestId); + } + public DebuggerResponse result(Map result){ + return withData(DebugerConst.ReplyConst.KEY_RESULT,result); + } + public DebuggerResponse msg(String msg){ + return withData(DebugerConst.ReplyConst.KEY_MSG,msg); + } + public DebuggerResponse finish(boolean done){ + return withData(DebugerConst.ReplyConst.KEY_FINISH,done); + } + public DebuggerResponse success(boolean success){ + return withData(DebugerConst.ReplyConst.KEY_SUCCESS,success); + } + + public DebuggerResponse log(String logContent, String logLevel, String title) { + return withData("log", logContent) + .withData("level", logLevel) + .withData("title", title) + .withData("logType", "TEXT") + .withData("time", System.currentTimeMillis()) + .withData("stepType", "basic"); + } + public DebuggerResponse withData(Map data){ + if (null == data){ + return this; + } + if (null == this.data){ + this.data = new HashMap<>(); + } + this.data.putAll(data); + return this; + } + + public DebuggerResponse send(Session session) { + if (session.isOpen()) { + send(session, sessionId, JsonUtils.toJson(this)); + } else { + log.info("session通道已关闭,发送信息失败"); + } + return this; + } + + + public static synchronized void send(Session session, String sessionId, String msg) { + if (session != null) { + try { + boolean flag = Thread.currentThread().isInterrupted(); + if(flag){ + Thread.interrupted(); + } + session.getBasicRemote().sendText(msg); + if (flag) { + Thread.currentThread().interrupt(); + } + } catch(IllegalStateException e) { + if (e.getMessage().contains("TEXT_FULL_WRITING")) { + throw new ExecuteException("发送信息失败:信息通道并发异常", e); + } + throw e; + } catch (Exception e) { + throw new ExecuteException("发送消息失败", e); + } + } + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DebugService.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DebugService.java new file mode 100644 index 0000000..72da13b --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DebugService.java @@ -0,0 +1,45 @@ +package net.northking.cctp.se.debug.service; + +import javax.websocket.Session; + +/** + * 脚本调试服务 + * @author xuyang.wang + */ +public interface DebugService { + String TYPE_MOBILE = "mobile"; + String TYPE_PC = "pc"; + String TYPE_INTERFACE = "interface"; + /** + * 创建调试会话 + * @param deviceToken + * @param session + * @return + */ + DebugSession createDebugSession(String deviceToken,String sessionType, Session session, String sessionId); + /** + * 销毁调试会话 + * @param sessionId + */ + void destroyDebugSession(String sessionId); + + /** + * 处理会话请求消息 + * @param session + * @param requestMsg + */ + void receiveRequestMsg(Session session,String requestMsg); + + /** + * 获取调试会话 + * @param sessionId + * @return + */ + DebugSession getDebugSession(String sessionId); + + /** + * 检查并清除失效的连接 + * @param type 类型 + */ + void checkAndClear(String type); +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DebugSession.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DebugSession.java new file mode 100644 index 0000000..f5b66f8 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DebugSession.java @@ -0,0 +1,68 @@ +package net.northking.cctp.se.debug.service; + + +import net.northking.cctp.se.debug.bean.DebuggerRequest; +import net.northking.cctp.se.debug.bean.DebuggerResponse; + +import javax.websocket.Session; +import java.util.concurrent.Future; +import java.util.concurrent.locks.Lock; + +public interface DebugSession extends Runnable { + /** + * 获取session type + */ + String getSessionType(); + /** + * 获取sessionId + * @return + */ + String getSessionId(); + /** + * 获取设备token + * @return + */ + String getDeviceToken(); + + /** + * 获取设备id + * @return + */ + String getDeviceId(); + + /** + * 处理请求指令 + * @param request + */ + void processRequest(DebuggerRequest request); + /** + * 发送响应 + * @param response + */ + void sendResponse(DebuggerResponse response); + + /** + * 停止当前指令 + */ + void stop(DebuggerRequest request); + + /** + * 销毁会话 + */ + void destroy(); + + /** + * 当前任务 + * @param future + */ + void setFuture(Future future); + + /** + * 断开重新连接 + * @param deviceToken + * @param session + */ + void refresh(String deviceToken, Session session); + + Lock getLock(); +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DefaultDebugSession.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DefaultDebugSession.java new file mode 100644 index 0000000..044820a --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/DefaultDebugSession.java @@ -0,0 +1,689 @@ +package net.northking.cctp.se.debug.service; + + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.element.core.DeviceDriver; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.se.debug.bean.DebugerConst; +import net.northking.cctp.se.debug.bean.DebuggerRequest; +import net.northking.cctp.se.debug.bean.DebuggerResponse; +import net.northking.cctp.se.device.bean.MobileDeviceConnection; +import net.northking.cctp.se.device.bean.PCDeviceConnection; +import net.northking.cctp.se.device.service.DeviceConnection; +import net.northking.cctp.se.device.service.DeviceConnectionService; +import net.northking.cctp.se.log.bean.ExecuteLog; +import net.northking.cctp.se.log.bean.StepLog; +import net.northking.cctp.se.script.bean.*; +import net.northking.cctp.se.script.core.*; +import net.northking.cctp.se.script.service.ScriptRuntimeExecutor; +import net.northking.cctp.se.util.JsonUtils; +import net.northking.cctp.se.util.SpringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.boot.logging.LogLevel; + +import javax.websocket.Session; +import java.util.*; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Future; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +@Slf4j +public class DefaultDebugSession implements DebugSession { + private final static String DEBUG_THREAD_NAME_TEMPLATE = "DebugThread-%s"; + public static final String DEVICE_INIT_FAIL_MSG = "初始化失败,原因:%s"; + private String deviceToken; + private Session session; + private String sessionId; + private String sessionType; + private String deviceId; + private DeviceConnection deviceConnection; + + private boolean running = true; + + private Thread thread; + + private Future future; + + private final Lock lock = new ReentrantLock(); + + private ScriptRuntimeListener listener = new ScriptRuntimeListener() { + @Override + public void doLog(IScriptRuntimeContext context, String level, String msg) { + ExecuteLog executeLog = new ExecuteLog(); + executeLog.setTime(new Date()); + executeLog.setLog(msg); + executeLog.setLevel(level); + Map logMap = new HashMap<>(); + logMap.put("cmd", DebugerConst.ReplyConst.KEY_CMD_LOG); + logMap.put(DebugerConst.KEY_SESSIONID, sessionId); + logMap.put(DebugerConst.ReplyConst.KEY_REPLY_DATA, executeLog); + sendText(JsonUtils.toJson(logMap)); + } + + @Override + public void doLog(IScriptRuntimeContext context, StepLog steplog) { + Map logMap = new HashMap<>(); + logMap.put("cmd", DebugerConst.ReplyConst.KEY_CMD_LOG); + logMap.put(DebugerConst.KEY_SESSIONID, sessionId); + logMap.put(DebugerConst.ReplyConst.KEY_REPLY_DATA, steplog); + sendText(JsonUtils.toJson(logMap)); + } + + @Override + public void doReply(IScriptRuntimeContext context, StepExecuteResult result) { + // 执行结果返回 + List childResult = result.getChildResult(); + if (childResult != null) { + result.setChildResult(null); // 调试过程中子步骤的结果对于前端没有意义 + } + HashMap replyMap = new HashMap<>(); + replyMap.put("cmd", DebugerConst.ReplyConst.KEY_CMD_REPLY); + replyMap.put(DebugerConst.KEY_SESSIONID, sessionId); + replyMap.put(DebugerConst.ReplyConst.KEY_REPLY_DATA, result); + log.debug("step_result -> {}", JsonUtils.toJson(replyMap)); + sendText(JsonUtils.toJson(replyMap)); + if (childResult != null) { + result.setChildResult(childResult); + } + } + + @Override + public void doReply(IScriptRuntimeContext context, String cmd, String level, Object obj) { + // 日志返回 + HashMap replyMap = new HashMap<>(); + replyMap.put("cmd", cmd); + replyMap.put(DebugerConst.KEY_SESSIONID, sessionId); + replyMap.put(DebugerConst.ReplyConst.KEY_REPLY_DATA, obj); + sendText(JsonUtils.toJson(replyMap)); + } + + private void sendText(String msg) { + try { + if (session.isOpen()) { + DebuggerResponse.send(session, sessionId, msg); + // 用于减缓信息推送给前端 + try { + String scriptWaitTime = SpringUtils.getProperties("nk.component.mobile.scriptWaitTime"); + Thread.sleep(StringUtils.isNoneEmpty(scriptWaitTime) ? Long.parseLong(scriptWaitTime) : 300L); + } catch (InterruptedException e) { + log.error("输出到前端的信息被打断", e); + Thread.currentThread().interrupt(); + } + } + } catch (IllegalStateException e) { + log.error("通道发生异常", e); + if (e.getMessage().contains("TEXT_FULL_WRITING")) { + throw new ExecuteException("发送信息失败:信息通道并发异常", e); + } + } catch (Exception e) { + log.error("发送执行结果失败 " + e.getMessage(), e); + } + } + }; + + + private BlockingQueue requestQueue = new LinkedBlockingQueue<>(); + + public DefaultDebugSession(String deviceToken, String sessionType, Session session, String sessionId) { + this.deviceToken = deviceToken; + this.sessionType = sessionType; + this.session = session; + this.sessionId = sessionId; + } + + @Override + public String getSessionType() { + return sessionType; + } + + @Override + public String getSessionId() { + return sessionId; + } + + @Override + public String getDeviceToken() { + return deviceToken; + } + + /** + * 获取设备id + * + * @return + */ + @Override + public String getDeviceId() { + return this.deviceId; + } + + @Override + public void processRequest(DebuggerRequest request) { + log.debug("processRequest的projectId,{}",request.getProjectId()); + requestQueue.add(request); + } + + @Override + public void sendResponse(DebuggerResponse response) { + DebuggerResponse.send(session, sessionId, JsonUtils.toJson(response)); + } + + /** + * 停止当前指令 + */ + @Override + public void stop(DebuggerRequest request) { + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.error("线程休眠被打断", e); + } + handleReplayStop(request); + } + + @Override + public void destroy() { + + log.info("Destroy the debug session:[sessionId->{}]", this.sessionId); + this.running = false; + if (null != this.future) { + this.future.cancel(false); + } + // handle_exit会关闭与机器人连接,所以多加一个条件 + if (this.deviceConnection != null && this.deviceConnection.getDeviceDriver() != null) { + try { + SpringUtils.getBean(DeviceConnectionService.class).closeDeviceConnection(deviceId); + } catch (Exception e) { + log.error("连接关闭异常", e); + } + } + //等待引擎与机器人关闭后才让调试线程跑完 + requestQueue.clear(); + DebuggerRequest closeRequest = DebuggerRequest.newRequest() + .cmd(DebugerConst.CommandConst.CMD_DESTROY) + .sessionId(sessionId); + requestQueue.add(closeRequest); + this.listener = null; + ScriptResolutionService bean = SpringUtils.getBean(ScriptResolutionService.class); + if (null != bean) { + bean.removeScriptExecutor(this.sessionId); + } + log.info("Session destroyed."); + } + + @Override + public void setFuture(Future future) { + this.future = future; + } + + /** + * 断开重新连接 + * + * @param deviceToken + * @param session + */ + @Override + public void refresh(String deviceToken, Session session) { + getLock().lock(); + try{ + this.deviceToken = deviceToken; + this.session = session; + }finally { + getLock().unlock(); + } + } + + /** + * session的锁 + * @return + */ + @Override + public Lock getLock(){ + return this.lock; + } + + @Override + public void run() { + this.thread = Thread.currentThread(); + thread.setName(String.format(DEBUG_THREAD_NAME_TEMPLATE, session.getId())); + log.info("Debug request process thread started."); + while (running) { + log.debug("Waiting for the next request ..."); + try { + DebuggerRequest request = requestQueue.take(); + log.debug("Take a request from queue to handle ..."); + handleRequest(request); + Thread.sleep(500L); + } catch (Exception e) { + log.warn("Error when handling request", e); + } + } + log.info("DebugThread exit...."); + } + + + private void handleRequest(DebuggerRequest request) { + log.debug("Begin to handle the request:{}", request); + String cmd = request.getCmd(); + if (DebugerConst.CommandConst.CMD_DEVICE_ENTER.equalsIgnoreCase(cmd)) { //连接设备处理 + handleDeviceEnter(request); + } else if (DebugerConst.CommandConst.CMD_DEVICE_EXIT.equalsIgnoreCase(cmd)) {//设备退出处理 + handleDeviceExit(request); + } else if (DebugerConst.CommandConst.CMD_DEVICE_INIT.equalsIgnoreCase(cmd)) {//应用初始化处理 + handleDeviceInit(request); + } else if (DebugerConst.CommandConst.CMD_REPLAY_START.equalsIgnoreCase(cmd)) {//回放指令处理 + handleReplayStart(request); + } else if (DebugerConst.CommandConst.CMD_SCREEN_SHOT.equalsIgnoreCase(cmd)) { //截图 + handleScreenShot(request); + } else if (DebugerConst.CommandConst.CMD_DETECT_EXECUTE.equalsIgnoreCase(cmd)) { //隐式回放 + handleDetectExecute(request); + } else if (DebugerConst.CommandConst.CMD_DESTROY.equalsIgnoreCase(cmd)) { + log.debug("等待socket关闭..."); + } else { + log.warn("无法识别的请求指令:{}", request); + doOnceResponse(request, false, String.format("无法识别的请求指令:%s", JsonUtils.toJson(request))); + } + } + + /** + * 隐式回放 + * + * @param request + */ + private void handleDetectExecute(DebuggerRequest request) { + Map executeData = request.getData(); + ScriptStep step = null; + try { + step = JSON.parseObject(JSON.toJSONString(executeData.get("step")), ScriptStep.class); + } catch (Exception e) { + log.error("脚本步骤解析出错", e); + doOnceResponse(request, false, "操作步骤解析失败"); + return; + } + if (null == deviceConnection && !DebugService.TYPE_INTERFACE.equalsIgnoreCase(sessionType)) { + ScriptExecutor scriptExecutor = SpringUtils.getBean(ScriptResolutionService.class).getScriptExecutor(sessionId); + reConnectDevice(scriptExecutor); + } + try { + Script script = new Script(); + ScriptStep[] steps = new ScriptStep[1]; + steps[0] = step; + script.setCommands(steps); + Map> resourceMap = new HashMap<>(); + script.setResources(resourceMap); + ScriptRuntimeExecutor executor = new ScriptRuntimeExecutor(request.getRequestId(), "", "", script); + executor.init(script); + DeviceDriver deviceDriver = null; + if (this.deviceConnection != null) { + deviceDriver = this.deviceConnection.getDeviceDriver(); + } + executor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_DRIVER, deviceDriver); + executor.setContextVariable(IScriptRuntimeContext.IS_DEBUG, true); + executor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_CONN, this.deviceConnection); + ScriptExecuteResult ret = new ScriptExecuteResult(); + executor.runScript(script, ret); + } catch (Exception e) { + log.error("执行步骤失败", e); + if (e instanceof ExecuteException) { + doOnceResponse(request, false, e.getMessage()); + } else { + doOnceResponse(request, false, "操作执行失败"); + } + return; + } + doOnceResponse(request, true, "操作成功"); + } + + + /** + * 截图 + * + * @param request + */ + private void handleScreenShot(DebuggerRequest request) { + if (DebugService.TYPE_INTERFACE.equalsIgnoreCase(sessionType)) { + doOnceResponse(request, false, "接口调试无需截图"); + return; + } + if (this.deviceConnection == null && !DebugService.TYPE_INTERFACE.equalsIgnoreCase(sessionType)) { + ScriptExecutor scriptExecutor = SpringUtils.getBean(ScriptResolutionService.class).getScriptExecutor(sessionId); + reConnectDevice(scriptExecutor); + } + try { + Map initData = request.getData(); + log.info("initData:{}", JSON.toJSONString(initData)); + String type = (String) initData.get("type"); + if ("image".equals(type)) { + Object params = initData.get("params"); + String s = JsonUtils.toJson(params); + Map map = JsonUtils.fromJsonString(s, Map.class); + map.put("token", request.getUserToken()); + String snapshot = null; + if (deviceConnection != null) { + snapshot = deviceConnection.snapshot(map); + } + if (StringUtils.isNotBlank(snapshot)) { + DebuggerResponse response = DebuggerResponse.newResponse().cmd(DebugerConst.ReplyConst.KEY_CMD_REPLY).sessionId(request.getSessionId()).requestId(request.getRequestId()).success(true).finish(true).msg("截图成功").withData(DebugerConst.ReplyConst.KEY_RESULT, snapshot); + sendResponse(response); + } else { + doOnceResponse(request, false, "截图失败,请稍后再试"); + } + } else { + doOnceResponse(request, false, "此操作不需要截图"); + } + } catch (Exception e) { + log.warn("截图失败", e); + doOnceResponse(request, false, "截图失败,请稍后再试"); + } + } + + /** + * 关闭设备逻辑处理 + * + * @param request + */ + private void handleDeviceExit(DebuggerRequest request) { + log.debug("Begin to handle device exit"); + // 统一到destroy方法进行关闭 + doOnceResponse(request, true, "正在退出设备"); + } + + /** + * 连接设备逻辑处理 + * + * @param request + */ + private void handleDeviceEnter(DebuggerRequest request) { + log.debug("Begin to handle device enter"); + if (StringUtils.isBlank(this.sessionId)) { + this.sessionId = request.getSessionId(); + } + //创建脚本执行器 + ScriptExecutor scriptExecutor = SpringUtils.getBean(ScriptResolutionService.class).getScriptExecutor(sessionId); + if (null == scriptExecutor) { + Map debugInfo = new HashMap<>(); + debugInfo.put("sessionId",sessionId); + debugInfo.put("request",request); + debugInfo.put("projectId",request.getProjectId()); + debugInfo.put("envId",StringUtils.isBlank(request.getEnvId()) ? "": request.getEnvId()); + //这里没有脚本,回放的时候再将脚本数据放进去 + scriptExecutor = SpringUtils.getBean(ScriptResolutionService.class).createDebugScriptRuntime(debugInfo,null); + log.debug("脚本执行器新建成功"); + log.debug("当前执行器的项目id为{}", scriptExecutor.getProjectId()); + } + scriptExecutor.setContextVariable(IScriptRuntimeContext.IS_DEBUG,true); //调试 + String deviceToken = (String) request.getDataValue(DebugerConst.ReqConst.KEY_TOKEN); + if (StringUtils.isNotBlank(deviceToken) && !DebugService.TYPE_INTERFACE.equalsIgnoreCase(sessionType)) { + try { + DeviceConnection connection = SpringUtils.getBean(DeviceConnectionService.class).createDeviceConnection(deviceToken); + this.deviceId = connection.getDeviceId(); + if (this.deviceConnection != null) { + this.deviceConnection.close(); + } + this.deviceConnection = connection; + scriptExecutor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_DRIVER,connection.getDeviceDriver()); + scriptExecutor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_CONN,this.deviceConnection); + doOnceResponse(request, true, "设备连接成功"); + log.info("设备连接成功 ----> sessionId【{}】 设备token【{}】", request.getSessionId(), deviceToken); + } catch (Exception e) { + doOnceResponse(request, false, String.format("设备连接失败,原因:%s", e.getLocalizedMessage())); + log.warn("连接设备失败", e); + log.info("设备连接失败 ----> sessionId【{}】 设备token【{}】", request.getSessionId(), deviceToken); + } + } else { + doOnceResponse(request, true, String.format("设备连接失败,原因:%s", "无效的设备token,设备token不能为空")); + log.error("设备连接失败,原因:{}", "无效的设备token,设备token不能为空"); + } + + } + + /** + * 设备初始化逻辑处理 + * + * @param request + */ + private void handleDeviceInit(DebuggerRequest request) { + log.debug("Begin to handle device init"); + if (DebugService.TYPE_INTERFACE.equalsIgnoreCase(sessionType)) { + doOnceResponse(request, true, "初始化成功"); + log.info("初始化成功 --> ----> sessionId【{}】, sessionType【{}】", sessionId, sessionType); + return; + } + if (this.deviceConnection == null && !DebugService.TYPE_INTERFACE.equalsIgnoreCase(sessionType)) { + doOnceResponse(request, false, String.format(DEVICE_INIT_FAIL_MSG, "设备连接不存在")); + log.error("初始化失败,原因:{}", "设备连接不存在"); + return; + } + try { + Map initData = request.getData(); + initData.put("debug", true); + if (DebugService.TYPE_MOBILE.equalsIgnoreCase(sessionType)) { + ScriptExecutor scriptExecutor = SpringUtils.getBean(ScriptResolutionService.class).getScriptExecutor(request.getSessionId()); + if (null != scriptExecutor) { + scriptExecutor.setContextVariable(IScriptRuntimeContext.APP_VERSION,initData.get("appVersion")); + log.debug("已经存放app版本信息:{}", initData.get("appVersion")); + } + } + if (deviceConnection != null) { + deviceConnection.initConfig(initData); + } + doOnceResponse(request, true, "初始化成功"); + log.info("初始化成功 --> ----> sessionId【{}】, sessionType【{}】", sessionId, sessionType); + } catch (Exception e) { + log.warn("设备初始化失败", e); + doOnceResponse(request, false, String.format(DEVICE_INIT_FAIL_MSG, e.getLocalizedMessage())); + throw new ExecuteException("设备初始化失败", e); + } + } + + /** + * 脚本回放逻辑处理 + * + * @param request + */ + private void handleReplayStart(DebuggerRequest request) { + log.debug("Begin to handle replay start"); + String sessionId = request.getSessionId(); + String requestId = request.getRequestId(); + String type = (String) request.getDataValue(DebugerConst.ReqConst.KEY_REPLAY_TYPE); + Object scriptData = request.getDataValue(DebugerConst.ReqConst.KEY_REPLAY_SCRIPT_DATA); + Script script = null; + if (scriptData != null) {//检查并 + try { + if (scriptData instanceof LinkedHashMap) { + script = JSON.parseObject(JSON.toJSONString(scriptData)).toJavaObject(Script.class); + } else { + script = SpringUtils.getBean(ScriptResolutionService.class).parse((String) scriptData); + } + } catch (Throwable t) { + doOnceResponse(request, false, "回放失败,脚本数据解析异常 " + t.getMessage()); + return; + } + } + if (null == script) { + doOnceResponse(request, false, "回放失败,无效的脚本数据"); + return; + } + // 创建脚本执行器 + ScriptExecutor scriptExecutor = SpringUtils.getBean(ScriptResolutionService.class).getScriptExecutor(sessionId); + log.debug("handleReplayStart的projectId,{}",request.getProjectId()); + if (null == scriptExecutor) { + Map debugInfo = new HashMap<>(); + debugInfo.put("sessionId", sessionId); + debugInfo.put("request", request); + debugInfo.put("projectId", request.getProjectId()); + debugInfo.put("envId", StringUtils.isBlank(request.getEnvId()) ? "" : request.getEnvId()); + scriptExecutor = SpringUtils.getBean(ScriptResolutionService.class).createDebugScriptRuntime(debugInfo, script); + log.debug("回放时脚本执行器新建成功"); + if (!DebugService.TYPE_INTERFACE.equalsIgnoreCase(sessionType)) { // 非接口调试需要 + if (null == deviceConnection) { + reConnectDevice(scriptExecutor); + } + scriptExecutor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_DRIVER, this.deviceConnection.getDeviceDriver()); + scriptExecutor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_CONN, this.deviceConnection); + } + }else { //设置脚本数据 + scriptExecutor.setScript(script); + log.debug("当前session[{}]执行器为{}", sessionId, scriptExecutor); + log.debug("当前执行器的项目id为{}", scriptExecutor.getProjectId()); + if (scriptExecutor.getProjectId() == null){ + scriptExecutor.setProjectId(request.getProjectId()); + } + } + scriptExecutor.setRuntimeListener(this.listener); + // 设置请求标识 + scriptExecutor.setRequestId(request.getRequestId()); + // 设置项目id + scriptExecutor.setProjectId(request.getProjectId()); + ScriptExecuteResult ret = new ScriptExecuteResult(); + try { + scriptExecutor.reset(script); + scriptExecutor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_REQUEST, request); + if (DebugerConst.ReplayType.TYPE_ALL.equalsIgnoreCase(type)) { + // 回放全部 + //scriptExecutor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_REQUEST, request); + // 需要重置参数数据 + scriptExecutor.initData(request.getData()); + scriptExecutor.runScript(script, ret); + } else if (DebugerConst.ReplayType.TYPE_FROM.equalsIgnoreCase(type)) { // 从当前步骤回放 + scriptExecutor.initData(request.getData()); + String stepId = (String) request.getDataValue(DebugerConst.ReqConst.KEY_REPLAY_FROM_STEP_ID); + ret = scriptExecutor.runStep(script, stepId, type); + } else if (DebugerConst.ReplayType.TYPE_STEP.equalsIgnoreCase(type)) { // 单步回放 + String stepId = (String) request.getDataValue(DebugerConst.ReqConst.KEY_REPLAY_FROM_STEP_ID); + ret = scriptExecutor.runStep(script, stepId, true, type); + } else if (DebugerConst.ReplayType.TYPE_RESTART.equalsIgnoreCase(type)) { // 重启浏览器并回放 + // 重启浏览器 + try { + restart(request, script); + }catch (Exception e){ + this.listener.doLog(scriptExecutor, LogLevel.ERROR.name(), e.getMessage()); + throw new ExecuteException(e.getMessage()); + } + scriptExecutor.initData(request.getData()); + scriptExecutor.runScript(script, ret); + } else { + // 未知指令,返回 + doOnceResponse(request, false, String.format("指令:【%s】是系统未知指令", type)); + } + DebuggerResponse response = buildResponse(request, true, true, "回放结束"); + sendResponse(response); + } catch (Exception e) { + // 回放失败 + log.error("回放异常",e); + if(thread.isInterrupted()){ + Thread.interrupted(); + } + sendResponse(buildResponse(request, true, false, e.getMessage())); + throw e; + } finally { + // 处理临时资源文件 + scriptExecutor.clearResource(); + } + } + + private void reConnectDevice(ScriptExecutor scriptExecutor) { + try { + DeviceConnection connection = SpringUtils.getBean(DeviceConnectionService.class).createDeviceConnection(this.deviceToken); + this.deviceId = connection.getDeviceId(); + if (scriptExecutor != null) {//如果不为空走切换设备驱动模式 + scriptExecutor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_DRIVER, connection.getDeviceDriver()); + } + this.deviceConnection = connection; + log.warn("设备驱动重新连接成功。。。。。。。。。"); + } catch (Exception e) { + log.error("",e); + } + } + + private void restart(DebuggerRequest request, Script script) { + TestTarget[] testTargets = script.getTestTargets(); + if (testTargets != null && testTargets.length > 0) { + HashMap initMap = new HashMap<>(); + TestTarget testTarget = testTargets[0]; + if (testTarget.getTargetType() != null && "web".equalsIgnoreCase(testTarget.getTargetType())) { // 后续加上枚举 + initMap.put(PCDeviceConnection.BROWSER_TYPE, testTarget.getTarget().get(PCDeviceConnection.BROWSER_TYPE)); + + initMap.put(PCDeviceConnection.PROJECT_ID, testTarget.getTarget().get(PCDeviceConnection.PROJECT_ID)); + initMap.put(PCDeviceConnection.ENV_ID, testTarget.getTarget().get(PCDeviceConnection.ENV_ID)); + initMap.put(PCDeviceConnection.SYS_NAME, testTarget.getTarget().get(PCDeviceConnection.SYS_NAME)); + + } else if (testTarget.getTargetType() != null && "mobile".equalsIgnoreCase(testTarget.getTargetType())) { + Map target = testTarget.getTarget(); + boolean isReInstall = Boolean.parseBoolean(target.get(MobileDeviceConnection.IS_REINSTALL)); + boolean isCleanData = Boolean.parseBoolean(target.get(MobileDeviceConnection.IS_CLEAN_DATA)); + boolean isAppRestart = Boolean.parseBoolean(target.get(MobileDeviceConnection.IS_APP_RESTART)); + if (isReInstall) { //卸载安装 + initMap.put("appId", target.get("appId")); + initMap.put("appVersion", target.get("appVersion")); + initMap.put("forceReInstall", isReInstall); + initMap.put("forceCleanData", isCleanData); + initMap.put("type", "2"); + } else { + if (isCleanData && !isAppRestart) { //只清除数据 + initMap.put("type", "1"); + } else if (isCleanData && isAppRestart) { //清除数据+重启应用 + initMap.put("type", "3"); + } else { //只重启应用 + initMap.put("type", "0"); + } + } + initMap.put(MobileDeviceConnection.PACKAGE_NAME, target.get(MobileDeviceConnection.PACKAGE_NAME)); + initMap.put(MobileDeviceConnection.APP_NAME, target.get(MobileDeviceConnection.APP_NAME)); + initMap.put(MobileDeviceConnection.IS_RECORD_DEVICE_PER, true); + } + this.deviceConnection.restart(initMap); + } else { + DebuggerResponse res = buildResponse(request, false, true, "缺少重启参数,不进行重启,直接回放"); + sendResponse(res); + } + } + + private void setExecutorVars(ScriptExecutor scriptExecutor, Script script) { + Variable[] variables = script.getVariables(); + + for (Variable variable : variables) { + scriptExecutor.setVariable(variable.getName(), variable.getValue()); + } + } + + private void handleReplayStop(DebuggerRequest request) { + log.debug("Begin to handle replay stop"); + ScriptExecutor scriptExecutor = SpringUtils.getBean(ScriptResolutionService.class).getScriptExecutor(sessionId); + scriptExecutor.setIgnoreError(false); + if (null != deviceConnection) { + deviceConnection.stopPlay(new HashMap<>()); + } + thread.interrupt(); + doOnceResponse(request, true, "停止回放成功"); + } + + private void doResponse(DebuggerRequest request, boolean finish, boolean success, String msg) { + DebuggerResponse response = buildResponse(request, finish, success, msg); + sendResponse(response); + } + + private void doOnceResponse(DebuggerRequest request, boolean success, String msg) { + doResponse(request, true, success, msg); + } + + private void doMoreResponse(DebuggerRequest request, boolean success, String msg) { + doResponse(request, false, success, msg); + } + + private void endMoreResponse(DebuggerRequest request, boolean success, String msg) { + doResponse(request, true, success, msg); + } + + private DebuggerResponse buildResponse(DebuggerRequest request, boolean finish, boolean success, String msg) { + return DebuggerResponse.newResponse() + .sessionId(request.getSessionId()) + .requestId(request.getRequestId()) + .finish(finish) + .success(success) + .msg(msg); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/impl/DebugServiceImpl.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/impl/DebugServiceImpl.java new file mode 100644 index 0000000..ea1811b --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/service/impl/DebugServiceImpl.java @@ -0,0 +1,214 @@ +package net.northking.cctp.se.debug.service.impl; + +import com.alibaba.fastjson.JSON; +import io.micrometer.core.instrument.util.StringUtils; +import lombok.extern.slf4j.Slf4j; + +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.se.config.AtuServerConfig; +import net.northking.cctp.se.debug.bean.DebugerConst; +import net.northking.cctp.se.debug.bean.DebuggerRequest; +import net.northking.cctp.se.debug.bean.DebuggerResponse; +import net.northking.cctp.se.debug.service.DebugService; +import net.northking.cctp.se.debug.service.DebugSession; +import net.northking.cctp.se.debug.service.DefaultDebugSession; +import net.northking.cctp.se.thread.ExecutorPool; +import net.northking.cctp.se.util.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.logging.LogLevel; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import javax.websocket.CloseReason; +import javax.websocket.Session; +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.*; +import java.util.concurrent.locks.Lock; + +@Slf4j +@Service +public class DebugServiceImpl implements DebugService { + + @Autowired + private AtuServerConfig atuServerConfig; + + private Map wsSessionMap = new ConcurrentHashMap<>(); // 好像不应该放这里 + + @Autowired + private RestTemplate restTemplate; + + @Override + public DebugSession createDebugSession(String deviceToken,String sessionType, Session session, String sessionId) { + try { + DebugSession debugSession = new DefaultDebugSession(deviceToken,sessionType,session, sessionId); + if (TYPE_PC.equalsIgnoreCase(sessionType)) { + if (ExecutorPool.isPCAvailable()) { + // pc有且只能有一个session。不允许创建新的pc session + wsSessionMap.put(sessionId, debugSession); + Future submit = ExecutorPool.getPCPool().submit(debugSession); + debugSession.setFuture(submit); + } else { + try { + DebuggerResponse.newResponse() + .sessionId(sessionId) + .finish(true).success(false) + .cmd(DebugerConst.ReplyConst.KEY_CMD_LOG).log("连接忙碌,尝试等待30秒进行连接", LogLevel.INFO.name(), "创建连接") + .send(session); + for (int i = 0; i < 30; i++) { + if (ExecutorPool.isPCAvailable()) { + // pc有且只能有一个session。不允许创建新的pc session + wsSessionMap.put(sessionId, debugSession); + Future submit = ExecutorPool.getPCPool().submit(debugSession); + debugSession.setFuture(submit); + break; + } else { + Thread.sleep(1000L); + } + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new ExecuteException("创建连接被打断"); + } + + } + } + if (TYPE_MOBILE.equalsIgnoreCase(sessionType)) { + if (ExecutorPool.isMobileAvailable()) { // 活跃线程数 < 11 + wsSessionMap.put(sessionId, debugSession); + Future submit = ExecutorPool.getMobilePool().submit(debugSession); + debugSession.setFuture(submit); + } + } + if (TYPE_INTERFACE.equalsIgnoreCase(sessionType)) { + if (ExecutorPool.isApiAvailable()) { + wsSessionMap.put(sessionId, debugSession); + Future submit = ExecutorPool.getApiPool().submit(debugSession); + debugSession.setFuture(submit); + } + } + if (wsSessionMap.containsKey(sessionId)) { + wsSessionMap.forEach((s1, d1) -> log.info("sessionId:{} -> token:{} -> type:{}", s1, d1.getDeviceToken(), d1.getSessionType())); + return debugSession; + } + } catch (Exception e) { + log.error("创建调试失败", e); + throw e; + } + return null; + } + + @Override + public void destroyDebugSession(String sessionId) { + DebugSession debugSession = wsSessionMap.get(sessionId); + if(debugSession!=null){ + Lock lock = debugSession.getLock(); + lock.lock(); + try { + wsSessionMap.remove(sessionId); + log.info("one session has been destroyed:{}", JSON.toJSONString(debugSession)); + debugSession.destroy(); + log.debug("session存活数量:{}", wsSessionMap.size()); + wsSessionMap.forEach((s1, d1) -> log.debug("sessionId:{} -> token:{} -> type:{}", s1, d1.getDeviceToken(), d1.getSessionType())); + }catch (Exception e){ + throw e; + }finally { + lock.unlock(); + } + } + } + + @Override + public void receiveRequestMsg(Session session,String requestMsg) { + DebuggerRequest request = JsonUtils.fromJsonString(requestMsg, DebuggerRequest.class); + if (null == request || StringUtils.isBlank(request.getSessionId())){ + log.warn("Invalid request msg:{}",requestMsg); + // todo: 返回前端失败日志 + return; + } + DebugSession debugSession = wsSessionMap.get(request.getSessionId()); + if (null == debugSession){ + log.warn("Session[{}] not found",request.getSessionId()); + String msg = String.format("Session[%s] 已关闭,请重新发起连接", request.getSessionId()); + try { + DebuggerResponse.newResponse() + .sessionId(request.getSessionId()) + .finish(true).success(false) + .cmd(DebugerConst.ReplyConst.KEY_CMD_LOG).log(msg, LogLevel.ERROR.name(), "连接失败") + .send(session); + DebuggerResponse.newResponse() + .sessionId(request.getSessionId()) + .finish(true) + .cmd(DebugerConst.ReplyConst.KEY_CMD_REPLY) + .msg(msg) + .success(false).send(session); + session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "通道异常关闭,手动关闭通道:sit")); + log.info(msg); + return; + } catch (IOException e) { + throw new ExecuteException(msg, e); + } + } + Object type = request.getData().get("type"); + boolean mobileFlag = false; + if (type != null) { + // 0-接口 1- b/s 2 c/s 3 安卓 4 ios + mobileFlag = "3".equalsIgnoreCase(type + "") || "4".equalsIgnoreCase(type + ""); + } + if (mobileFlag && DebugerConst.CommandConst.CMD_DEVICE_INIT.equalsIgnoreCase(request.getCmd())) { //设置应用下载的url + Map data = request.getData(); + String appId = (String) data.get("appId"); + String appDownloadUrl = atuServerConfig.getAppDownloadUrl().replace("{appId}", appId); + data.put("appDownloadUrl", atuServerConfig.getServerUrl() + appDownloadUrl); + } + // 处理replay_stop + if (DebugerConst.CommandConst.CMD_REPLAY_STOP.equalsIgnoreCase(request.getCmd())) { + debugSession.stop(request); + return; + } + debugSession.processRequest(request); + } + + /** + * 获取调试会话 + * + * @param sessionId + * @return + */ + @Override + public DebugSession getDebugSession(String sessionId) { + return this.wsSessionMap.get(sessionId); + } + + /** + * 检查并清除失效的连接 + * + * @param type 类型 + */ + @Override + public void checkAndClear(String type) { + // TODO: 本地录制不需要 + try { + wsSessionMap.forEach((s, d) -> { + if (!TYPE_INTERFACE.equalsIgnoreCase(type) && type.equalsIgnoreCase(d.getSessionType())) { // 只检查非接口类型的调试 + // 是否有效 + String deviceInfoUrl = String.format("%s%s/%s", atuServerConfig.getServerUrl(), atuServerConfig.getDeviceInfoPath(), d.getDeviceToken()); + ResponseEntity resEntity = restTemplate.getForEntity(deviceInfoUrl, ResultWrapper.class); + ResultWrapper wrapper = resEntity.getBody(); + if (wrapper != null && wrapper.isSuccess() && wrapper.getData() != null) { + if (((Map) wrapper.getData()).isEmpty()) {// token查询不了设备信息,也就是token已经失效了 + log.debug("sessionId【{}】,toke【{}】失效,进行清理操作..", s, d.getDeviceToken()); + destroyDebugSession(s); + } + } + } + }); + } catch (Exception e) { + log.error("清理失效连接失败", e); + } + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/websocket/DebugWebSocketManager.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/websocket/DebugWebSocketManager.java new file mode 100644 index 0000000..cf0322d --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debug/websocket/DebugWebSocketManager.java @@ -0,0 +1,185 @@ +package net.northking.cctp.se.debug.websocket; + +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.se.debug.bean.DebugerConst; +import net.northking.cctp.se.debug.bean.DebuggerResponse; +import net.northking.cctp.se.debug.service.DebugService; +import net.northking.cctp.se.debug.service.DebugSession; +import net.northking.cctp.se.lifecycle.EngineRuntime; +import net.northking.cctp.se.util.JsonUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.boot.logging.LogLevel; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.Map; +import java.util.concurrent.*; + +@Component +@ServerEndpoint("/debugger/{type}/{token}/{sessionId}") +public class DebugWebSocketManager implements ApplicationContextAware { + private static final Logger logger = LoggerFactory.getLogger(DebugWebSocketManager.class); + private static ApplicationContext context; + + private static Map> scheduleMap = new ConcurrentHashMap<>(); + + private String sessionId; + + private final static long DELAY = 10L; + + /** + * 服务端与引擎建立Websocket会话 + * + * @param session 会话对象 + * @param token 录制调试逻辑会话ID,由界面端生成传入 + */ + @OnOpen + public void onOpen(Session session, + @PathParam("type") String type, + @PathParam("token") String token, @PathParam("sessionId") String sessionId) throws InterruptedException { + this.sessionId = sessionId; + session.setMaxTextMessageBufferSize(10 * 1024 * 1024); + session.setMaxBinaryMessageBufferSize(10 * 1024 * 1024); + // 判断同一个sessionId是否重连 + DebugService debugService = context.getBean(DebugService.class); + String intern = this.sessionId.intern(); + + DebuggerResponse.newResponse() + .sessionId(sessionId) + .finish(true) + .cmd(DebugerConst.ReplyConst.KEY_CMD_LOG) + .success(true) + .log(String.format("正在连接执行机:%s", EngineRuntime.getRuntime().getEngineInfo().getIpAddress()), LogLevel.INFO.name(), "正在连接") + .send(session); + logger.info("收到脚本设计服务建立连接请求:[type:{},token:{},request_session_id:{}]", type, token, sessionId); + debugService.checkAndClear(type); + DebugSession debugSession = null; + if (scheduleMap.containsKey(sessionId)) { + scheduleMap.get(sessionId).cancel(false); // 取消定时任务 + scheduleMap.remove(sessionId); + debugSession = debugService.getDebugSession(this.sessionId); + // 判断是否同一个token + if (debugSession != null && debugSession.getDeviceToken().equalsIgnoreCase(token)) { + logger.info("发现通道存在,正在重连..."); + // 尝试重新连接 + tryReconnect(session, token, sessionId, debugSession); + } + if (debugSession == null) { + debugService.destroyDebugSession(this.sessionId); + } + } + if (null == debugSession) { + debugSession = debugService.createDebugSession(token, type, session, sessionId); + } + if (null == debugSession) { + try { + // 输出日志到前台 + DebuggerResponse.newResponse() + .sessionId(sessionId) + .finish(true) + .cmd(DebugerConst.ReplyConst.KEY_CMD_LOG) + .success(false) + .log("创建调试会话失败,请稍后重新连接", LogLevel.ERROR.name(), "创建连接会话") + .send(session); + // 返回失败信息 + DebuggerResponse.newResponse() + .sessionId(sessionId) + .finish(true) + .cmd(DebugerConst.ReplyConst.KEY_CMD_REPLY) + .msg("创建调试器与引擎连接失败") + .success(false).send(session); + session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "通道创建失败,手动关闭通道:sit")); + } catch (Exception e) { + logger.error("创建连接失败", e); + throw new ExecuteException("创建连接失败", e); + } + } else { + DebuggerResponse.newResponse() + .sessionId(sessionId) + .finish(true) + .cmd(DebugerConst.ReplyConst.KEY_CMD_LOG) + .success(true) + .log("创建连接会话成功", LogLevel.INFO.name(), "创建连接会话") + .send(session); + logger.info("成功建立会话[token:{}, sessionId:{}]", token, sessionId); + } + + } + + /** + * 尝试获取锁重连 + * + * @param session + * @param token + * @param sessionId + * @param debugSession + */ + private void tryReconnect(Session session, @PathParam("token") String token, @PathParam("sessionId") String sessionId, DebugSession debugSession) { + if(session!=null){ + debugSession.refresh(token, session); + logger.info("重新建立会话[token:{}, sessionId:{}]", token, sessionId); + } + } + + /** + * 关闭调试会话 + * + * @param session + */ + @OnClose + public void onClose(Session session, CloseReason reason) throws InterruptedException { + logger.info("收到关闭WS连接请求"); + logger.debug("close reason -> {}", JsonUtils.toJson(reason)); + if(null != session) { + if (reason != null && CloseReason.CloseCodes.NORMAL_CLOSURE.getCode() == reason.getCloseCode().getCode()) { // 正常退出 + context.getBean(DebugService.class).destroyDebugSession(this.sessionId); + logger.info("成功关闭调试会话"); + } else { // 不正常退出,保留10s信息,过期则摧毁 + ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); + DebugSession debugSession = context.getBean(DebugService.class).getDebugSession(this.sessionId); + logger.info("连接异常断开,{}秒后释放资源:{}", DELAY, JsonUtils.toJson(debugSession)); + ScheduledFuture schedule = scheduledExecutorService.schedule(() -> { + scheduleMap.remove(this.sessionId); + context.getBean(DebugService.class).destroyDebugSession(this.sessionId); + }, DELAY, TimeUnit.SECONDS); + if (scheduleMap.containsKey(this.sessionId)) { // 如果已经存在,那么取消原来的定时任务,重新 + scheduleMap.get(this.sessionId).cancel(false); + } + scheduleMap.put(this.sessionId, schedule); + } + } + } + + /** + * 接收页面消息 + * + * @param msg + * @param session + */ + @OnMessage + public void onMessage(String msg, Session session) { + logger.debug("收到服务端消息请求:[msg:{}]", msg); + logger.debug("消息已加入处理队列"); + context.getBean(DebugService.class).receiveRequestMsg(session, msg); + } + + @OnError + public void onError(Session session, Throwable t) { + String msg = String.format("Session Error->sessionId:%s ", session.getId()); + if (t != null) { + msg = String.format(msg + " error message: %s", t.getMessage()); + } + logger.error(msg, t); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + context = applicationContext; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/ATUDebuggerLifecycle.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/ATUDebuggerLifecycle.java new file mode 100644 index 0000000..c6779d1 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/ATUDebuggerLifecycle.java @@ -0,0 +1,257 @@ +package net.northking.cctp.se.debugger; + +import net.northking.cctp.se.dto.ATULog; +import net.northking.cctp.se.exec.ATUScriptInstance; +import net.northking.cctp.se.script.ATUScript; +import net.northking.cctp.se.script.ScriptStep; +import net.northking.cctp.se.script.ScriptVariable; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +public abstract class ATUDebuggerLifecycle implements AutomationTestDebugger +{ + /** + * 调试器ID + */ + protected String id; + + protected T nativeClient; + + protected boolean closed = false; + + public ATUDebuggerLifecycle(String id, T nativeClient) + { + this.id = id; + this.nativeClient = nativeClient; + } + + @Override + public void setNativeClient(T nativeClient) + { + this.nativeClient = nativeClient; + } + + public String getId() + { + return id; + } + + public void setId(String id) + { + this.id = id; + } + + @Override + public void close() + { + closed = true; + } + + @Override + public boolean isClosed() + { + return closed; + } + + + /** + * 执行标志,判断是否正在执行 + */ + private AtomicBoolean flagStart = new AtomicBoolean(false); + + + /** + * 停止回放的标志 + */ + protected AtomicBoolean flagStop = new AtomicBoolean(false); + + + public boolean isStarting() + { + return flagStart.get(); + } + + public boolean isStopped() + { + return !isStarting(); + } + + @Override + public void stop() + { + flagStop.set(true); + } + + /** + * 重启浏览器回放脚本 + */ + public static final String REPLAY_RESTART = "restart"; + + /** + * 从头开始回放脚本 + */ + public static final String REPLAY_ALL = "all"; + + /** + * 从指定步骤开始回放脚本 + */ + public static final String REPLAY_FROM = "from"; + + /** + * 单步回放 + */ + public static final String REPLAY_STEP = "step"; + + /** + * 回放方式 + * + * @return 回放方式 + */ + public abstract String getReplayType(); + + /** + * 指定步骤ID + * + * @return 指定步骤ID + */ + public abstract String targetStepId(); + + /** + * 脚本 + * + * @return 脚本 + */ + public abstract ATUScript getScript(); + + /** + * TODO 解析脚本 + */ + protected ATUScriptInstance analyseScript() + { + ReplayByStep.set(false); + ATUScriptInstance scriptInstance = new ATUScriptInstance(); + ATUScript script = this.getScript(); + scriptInstance.setCommands(script.getCommands()); + List variables = script.getVariables(); + Map variableMap = variables.stream() + .collect(Collectors.toMap(ScriptVariable::getName, variable -> variable)); + scriptInstance.setVariableMap(variableMap); + scriptInstance.setGlobalSettings(script.getGlobalSettings()); + scriptInstance.setId(script.getId()); + return scriptInstance; + } + + /** + * TODO 调试脚本 + */ + protected void debuggerScript(ATUScriptInstance scriptInstance) + { + for (ScriptStep scriptStep : scriptInstance.getCommands()) + { + // 遍历步骤,执行!~ + if (scriptStep.isSkip()) { // 注释则不执行 + continue; + } + debuggerScriptStep(scriptInstance, scriptStep); + } + } + + /** + * 是否开始执行 + */ + private AtomicBoolean ReplayByStep = new AtomicBoolean(false); + + /** + * 调试脚本步骤 + * + * @param scriptStep 脚本步骤 + */ + protected void debuggerScriptStep(ATUScriptInstance scriptInstance, ScriptStep scriptStep) + { + if (!ReplayByStep.get() && scriptStep.getId().equals(targetStepId())) + { + // 找到指定的步骤,从此开始回放 + ReplayByStep.set(true); + } + + if (ReplayByStep.get()) + {// 开始回放脚本的步骤 + replayScriptStep(scriptInstance, scriptStep); + } else + {// 遍历叶子步骤,递归查找 + for (ScriptStep child : scriptStep.getChildren()) + { + debuggerScriptStep(scriptInstance, child); + } + } + } + + /** + * TODO 回放脚本步骤 + * + * @param scriptInstance 脚本实例 + * @param scriptStep 脚本步骤 + */ + protected void replayScriptStep(ATUScriptInstance scriptInstance, ScriptStep scriptStep) + { + beforeReplayScriptStep(scriptStep); + Object stepResult = null; + + ATUScript subScript; // 被调用的脚本 + ATUScriptInstance subScriptInstance = new ATUScriptInstance(); // 被调用的脚本实例 + executeScript(subScriptInstance); + afterReplayScriptStep(scriptStep, stepResult); + } + + /** + * 回放脚本步骤的前置处理(脚本里的每一个步骤) + */ + protected abstract void beforeReplayScriptStep(ScriptStep scriptStep); + + /** + * 回放脚本步骤的后置处理(脚本里的每一个步骤) + */ + protected abstract void afterReplayScriptStep(ScriptStep scriptStep, Object stepResult); + + /** + * 记录日志 + */ + protected abstract void logger(ATULog atuLog); + + /** + * TODO 执行脚本实例 + * + * @param scriptInstance 脚本实例 + */ + protected void executeScript(ATUScriptInstance scriptInstance) + { + + } + + /** + * TODO 执行业务组件 + * + * @param scriptInstance 脚本实例 + * @param bizComponent 业务组件 + */ + protected void executeBizComponent(ATUScriptInstance scriptInstance, Object bizComponent) + { + + } + + /** + * TODO 执行基础组件 + * + * @param scriptInstance 脚本实例 + * @param component 基础组件 + */ + protected void executeBasicComponent(ATUScriptInstance scriptInstance, Object component) + { + + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/AutomationTestDebugger.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/AutomationTestDebugger.java new file mode 100644 index 0000000..513beec --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/AutomationTestDebugger.java @@ -0,0 +1,38 @@ +package net.northking.cctp.se.debugger; + +import java.io.Closeable; + +/** + * 自动化测试调试器 + */ +public interface AutomationTestDebugger extends Closeable +{ + /** + * 获取调试器ID + * + * @return 调试器ID + */ + String getId(); + + /** + * 设置 调试客户端 + * + * @param nativeClient 调试客户端 + */ + void setNativeClient(T nativeClient); + + /** + * 是否已经关闭 + * + * @return 是否已经关闭 + */ + boolean isClosed(); + + + /** + * 停止 + */ + void stop(); + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/InterfaceDebugger.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/InterfaceDebugger.java new file mode 100644 index 0000000..75971cb --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/InterfaceDebugger.java @@ -0,0 +1,27 @@ +package net.northking.cctp.se.debugger; + + +import net.northking.cctp.se.exec.ATUScriptInstance; + +import javax.websocket.Session; + +/** + * 接口自动化测试调试器 + */ +public class InterfaceDebugger extends WebSocketATUDebugger implements Runnable +{ + + public InterfaceDebugger(String id, Session session) + { + super(id, session); + } + + + @Override + public void run() + { + ATUScriptInstance scriptInstance = analyseScript(); + + debuggerScript(scriptInstance); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/MobileDebugger.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/MobileDebugger.java new file mode 100644 index 0000000..ecc3213 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/MobileDebugger.java @@ -0,0 +1,29 @@ +package net.northking.cctp.se.debugger; + + +import net.northking.cctp.se.exec.ATUScriptInstance; + +import javax.websocket.Session; + +/** + * 移动自动化测试调试器 + */ +public class MobileDebugger extends WebSocketATUDebugger implements Runnable +{ + + public MobileDebugger(String id, Session session) + { + super(id, session); + } + + + + @Override + public void run() + { + // 解析脚本 + ATUScriptInstance scriptInstance = analyseScript(); + // 调试脚本 + debuggerScript(scriptInstance); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/PCUIDebugger.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/PCUIDebugger.java new file mode 100644 index 0000000..1a428be --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/PCUIDebugger.java @@ -0,0 +1,40 @@ +package net.northking.cctp.se.debugger; + + +import net.northking.cctp.se.exec.ATUScriptInstance; + +import javax.websocket.Session; + +/** + * PC端UI自动化测试调试器 + */ +public class PCUIDebugger extends WebSocketATUDebugger implements Runnable +{ + + public PCUIDebugger(String id, Session session) + { + super(id, session); + } + + + /** + * TODO 重启浏览器 + */ + void restartWebBrowser() + { + } + + + @Override + public void run() + { + ATUScriptInstance scriptInstance = analyseScript(); + + if (REPLAY_RESTART.equalsIgnoreCase(getReplayType())) + { + restartWebBrowser(); + } + + debuggerScript(scriptInstance); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/WebSocketATUDebugger.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/WebSocketATUDebugger.java new file mode 100644 index 0000000..f5964ba --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/WebSocketATUDebugger.java @@ -0,0 +1,100 @@ +package net.northking.cctp.se.debugger; + + +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.se.dto.*; +import net.northking.cctp.se.script.ATUScript; +import net.northking.cctp.se.script.ScriptStep; + +import javax.websocket.Session; +import java.io.IOException; + +/** + * 基于WebSocket通讯协议的自动化测试调试器 + */ +public abstract class WebSocketATUDebugger extends ATUDebuggerLifecycle +{ + /** + * JSON 序列化工具 + */ + private static ObjectMapper objectMapper = new ObjectMapper(); + + public WebSocketATUDebugger(String id, Session nativeClient) + { + super(id, nativeClient); + } + + /** + * 推送指令结果或者日志 + * + * @param message 推送消息 + * @throws IOException 异常 + */ + public void send(Object message) + { + try + { + String text = objectMapper.writeValueAsString(message); + nativeClient.getBasicRemote().sendText(text); + } catch (IOException e) + { + // TODO 推送指令或者日志失败 + } + } + + private ATUWebSocketReplay replayRequest; + + public void replay(ATUWebSocketReplay replayRequest) + { + this.replayRequest = replayRequest; + } + + @Override + public String getReplayType() + { + return replayRequest.getType(); + } + + @Override + public String targetStepId() + { + return replayRequest.getStepId(); + } + + @Override + public ATUScript getScript() + { + return replayRequest.getScript(); + } + + + /** + * 推送日志 + * + * @param atuLog 日志 + */ + protected void logger(ATULog atuLog) + { + ATUWebSocketMessage message = new ATUWebSocketMessage(); + + message.setCmd("log"); + message.setData(atuLog); + send(message); + } + + /** + * + * @param scriptStep + */ + @Override + protected void beforeReplayScriptStep(ScriptStep scriptStep) + { + + } + + @Override + protected void afterReplayScriptStep(ScriptStep scriptStep, Object stepResult) + { + + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/endpoint/DebuggerInterfaceWebSocketServer.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/endpoint/DebuggerInterfaceWebSocketServer.java new file mode 100644 index 0000000..b023298 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/endpoint/DebuggerInterfaceWebSocketServer.java @@ -0,0 +1,218 @@ +package net.northking.cctp.se.debugger.endpoint; + +import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.se.debugger.pool.WebSocketInterfaceDebuggerPool; +import net.northking.cctp.se.dto.ATUWebSocketMessage; +import net.northking.cctp.se.dto.ATUWebSocketReplay; +import net.northking.cctp.se.script.ATUScript; +import net.northking.cctp.se.util.HttpUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Map; + +import static javax.websocket.CloseReason.CloseCodes.CANNOT_ACCEPT; + +/** + * 接口自动化测试调试器 WebSocket服务端 + */ +@Component +public class DebuggerInterfaceWebSocketServer +{ + private static final Logger logger = LoggerFactory.getLogger(DebuggerInterfaceWebSocketServer.class); + + /** + * JSON 序列化工具 + */ + private static ObjectMapper objectMapper = new ObjectMapper(); + + @OnOpen + public void onOpen( + Session session, + @PathParam("deviceToken") String deviceToken) + { + logger.info("建立连接:token="+deviceToken); + WebSocketInterfaceDebuggerPool.getInstance().createDebugger(session, deviceToken); + } + + @OnClose + public void onClose(@PathParam("deviceToken") String deviceToken) + { + WebSocketInterfaceDebuggerPool.getInstance().destroyDebugger(deviceToken); + } + + /** + * 键名: 指令类型 + */ + public static final String KEY_CMD_TYPE = "cmdType"; + + /** + * 命令: 开始回放 + */ + public static final String CMD_REPLAY_START = "replay_start"; + + /** + * 命令: 停止回放 + */ + public static final String CMD_REPLAY_STOP = "replay_stop"; + + /** + * 命令: 接口定义调试 + */ + public static final String CMD_DEBUG_API = "debug_api"; + + @OnMessage + public void onMessage( + Session session, + @PathParam("deviceToken") String deviceToken, + String text) throws JsonProcessingException + { + logger.info("收到消息:"+text); + Map requestMap = objectMapper.readValue(text, Map.class); + + String cmdType = requestMap.get(KEY_CMD_TYPE).toString(); + String data = requestMap.get("data").toString(); + if(CMD_DEBUG_API.equalsIgnoreCase(cmdType)){ + //仿真客户端-接口定义调试 + debugStart(session,deviceToken, text); + + }else if (CMD_REPLAY_START.equalsIgnoreCase(cmdType)) + {// 开始回放 + replayStart(deviceToken, text); + } else if (CMD_REPLAY_STOP.equalsIgnoreCase(cmdType)) + {// 停止回放 + replayStop(deviceToken); + } + + } + + protected void debugStart(Session session,String deviceToken, String text) throws JsonProcessingException + { + //json格式化数据 + TypeReference> typeReference = new TypeReference>() + { + }; + ATUWebSocketMessage message = objectMapper.readValue(text, typeReference); + ATUWebSocketReplay data = message.getData(); + //接口调试获取脚本资源 + String stepId = data.getStepId(); + if(StringUtils.hasText(stepId)){ + //根据地址获取脚本文件并解析脚本文件成脚本对象 + String content = null; + try { + String[] result = idToPath(stepId); + content = getFileContent(result[0], result[1]); + } catch (Exception e) { + logger.error("接口脚本信息获取异常",e); + try { + session.close(new CloseReason(CANNOT_ACCEPT,"接口脚本信息获取失败")); + } catch (IOException e1) { + logger.error("socket连接关闭异常:",e1); + } + } + + ATUScript atuScript = JSON.parseObject(content, ATUScript.class); + + //传入脚本信息 + data.setScript(atuScript); + WebSocketInterfaceDebuggerPool.getInstance().replayStart(deviceToken, data); + }else{ + //返回消息 无脚本可执行 + logger.warn("接口无可用脚本信息请检查 接口配置"); + try { + session.close(new CloseReason(CANNOT_ACCEPT,"接口无可用脚本信息请检查接口配置")); + } catch (IOException e) { + logger.error("接口调试异常:",e); + } + } + } + + protected void replayStart(String deviceToken, String text) throws JsonProcessingException + { + TypeReference> typeReference = new TypeReference>() + { + }; + ATUWebSocketMessage message = objectMapper.readValue(text, typeReference); + WebSocketInterfaceDebuggerPool.getInstance().replayStart(deviceToken, message.getData()); + + } + + protected void replayStop(String deviceToken) + { + WebSocketInterfaceDebuggerPool.getInstance().replayStop(deviceToken); + } + + + @OnError + public void onError( + Session session, + @PathParam("debuggerId") String debuggerId, + Throwable error + ) + { + + logger.error("OnError: 发生异常!【接口自动化测试调试器】= " + debuggerId, error); + + } + + private String getFileContent(String tenantId, String fileId) { + String msg = null; + if (null == fileId) { + logger.debug("文件id不存在"); + return msg; + } + try { + StringBuilder builder = new StringBuilder(); + // 修改成http下载 2023.3.1 jieying.li + InputStream is = HttpUtils.download2Stream(tenantId + fileId); + + String line; + BufferedReader read = new BufferedReader(new InputStreamReader(is)); + while((line = read.readLine())!=null){ + builder.append(line); + } + msg = builder.toString(); + } catch (Exception e) { + throw new ExecuteException(String.format("文件下载失败租户id: %s,错误信息:%s", tenantId, e.getMessage()), e); + } + return msg; + } + + /** + * 第一个是租户id,第二个是文件id,第三个是文件名 + * @param fileId + * @return + */ + private String[] idToPath(String fileId) { + String[] result = new String[3]; + if (fileId.startsWith("/") || fileId.startsWith("_")) { + fileId = fileId.substring(1); + } + if (fileId.endsWith("/") || fileId.endsWith("_")) { + fileId = fileId.substring(0, fileId.length() - 1); + } + int index = fileId.indexOf("_"); + int lastIndex = fileId.lastIndexOf("_"); + if (index <= 0 || lastIndex <= 0 || index >= lastIndex) { + logger.info("传入的id为:{}",fileId); + throw new RuntimeException("脚本信息获取失败,错误的文件id:"+fileId); + } + result[0] = fileId.substring(0, index); //租户id + result[1] = fileId.substring(index + 1).replaceAll("_","/"); //文件id + result[2] = fileId.substring(lastIndex + 1); //文件名 + return result; + } + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/endpoint/DebuggerPCUIWebSocketServer.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/endpoint/DebuggerPCUIWebSocketServer.java new file mode 100644 index 0000000..59867db --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/endpoint/DebuggerPCUIWebSocketServer.java @@ -0,0 +1,107 @@ +package net.northking.cctp.se.debugger.endpoint; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.se.debugger.pool.WebSocketPCUIDebuggerPool; +import net.northking.cctp.se.dto.ATUWebSocketMessage; +import net.northking.cctp.se.dto.ATUWebSocketReplay; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import java.util.Map; + +/** + * PC端UI自动化测试调试器 WebSocket服务端 + */ +@Component +public class DebuggerPCUIWebSocketServer +{ + private static final Logger logger = LoggerFactory.getLogger(DebuggerPCUIWebSocketServer.class); + + /** + * JSON 序列化工具 + */ + private static ObjectMapper objectMapper = new ObjectMapper(); + + + @OnOpen + public void onOpen( + Session session, + @PathParam("deviceToken") String deviceToken) + { + WebSocketPCUIDebuggerPool.getInstance().createDebugger(session, deviceToken); + } + + @OnClose + public void onClose(@PathParam("deviceToken") String deviceToken) + { + WebSocketPCUIDebuggerPool.getInstance().destroyDebugger(deviceToken); + } + + /** + * 键名: 指令类型 + */ + public static final String KEY_CMD_TYPE = "cmd"; + + /** + * 命令: 开始回放 + */ + public static final String CMD_REPLAY_START = "replay_start"; + + /** + * 命令: 停止回放 + */ + public static final String CMD_REPLAY_STOP = "replay_stop"; + + @OnMessage + public void onMessage( + Session session, + @PathParam("deviceToken") String deviceToken, + String text) throws JsonProcessingException + { + Map requestMap = objectMapper.readValue(text, Map.class); + + String cmdType = requestMap.get(KEY_CMD_TYPE).toString(); + + if (CMD_REPLAY_START.equalsIgnoreCase(cmdType)) + {// 开始回放 + replayStart(deviceToken, text); + } else if (CMD_REPLAY_STOP.equalsIgnoreCase(cmdType)) + {// 停止回放 + replayStop(deviceToken); + } + + } + + protected void replayStart(String deviceToken, String text) throws JsonProcessingException + { + TypeReference> typeReference = new TypeReference>() + { + }; + ATUWebSocketMessage message = objectMapper.readValue(text, typeReference); + WebSocketPCUIDebuggerPool.getInstance().replayStart(deviceToken, message.getData()); + + } + + protected void replayStop(String deviceToken) + { + WebSocketPCUIDebuggerPool.getInstance().replayStop(deviceToken); + } + + + @OnError + public void onError( + Session session, + @PathParam("debuggerId") String debuggerId, + Throwable error + ) + { + + logger.error("OnError: 发生异常!【PC端UI自动化测试调试器】= " + debuggerId, error); + + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/endpoint/WebSocketConfiguration.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/endpoint/WebSocketConfiguration.java new file mode 100644 index 0000000..2397f06 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/endpoint/WebSocketConfiguration.java @@ -0,0 +1,19 @@ +package net.northking.cctp.se.debugger.endpoint; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +/** + * 使用 Spring boot封装好的 WebSocket 组件 + */ +@Configuration +public class WebSocketConfiguration +{ + + @Bean + public ServerEndpointExporter serverEndpointExporter() + { + return new ServerEndpointExporter(); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketDebuggerPool.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketDebuggerPool.java new file mode 100644 index 0000000..20a861a --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketDebuggerPool.java @@ -0,0 +1,43 @@ +package net.northking.cctp.se.debugger.pool; + +import net.northking.cctp.se.dto.ATUWebSocketReplay; + +import javax.websocket.Session; +import java.io.IOException; + +/** + * 基于WebSocket通讯协议下的调试器线程池 + */ +public interface WebSocketDebuggerPool +{ + /** + * 创建调试器 + * + * @param session 会话 + * @param deviceToken 设备令牌 + */ + void createDebugger(Session session, String deviceToken) throws IOException; + + /** + * 销毁调试器 + * + * @param deviceToken 设备令牌 + */ + void destroyDebugger(String deviceToken); + + /** + * 开始回放 + * + * @param deviceToken 设备令牌 + * @param replayRequest 回放请求 + */ + void replayStart(String deviceToken, ATUWebSocketReplay replayRequest); + + /** + * 停止回放 + * + * @param deviceToken 设备令牌 + */ + void replayStop(String deviceToken); + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketInterfaceDebuggerPool.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketInterfaceDebuggerPool.java new file mode 100644 index 0000000..3e4a760 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketInterfaceDebuggerPool.java @@ -0,0 +1,118 @@ +package net.northking.cctp.se.debugger.pool; + +import net.northking.cctp.se.debugger.InterfaceDebugger; +import net.northking.cctp.se.dto.ATUWebSocketReplay; +import net.northking.cctp.se.thread.ExecutorPool; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.websocket.CloseReason; +import javax.websocket.Session; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import static javax.websocket.CloseReason.CloseCodes.CANNOT_ACCEPT; + +public class WebSocketInterfaceDebuggerPool implements WebSocketDebuggerPool +{ + public static final Logger logger = LoggerFactory.getLogger(WebSocketInterfaceDebuggerPool.class); + + private static WebSocketInterfaceDebuggerPool instance = new WebSocketInterfaceDebuggerPool(); + + private WebSocketInterfaceDebuggerPool() + { + } + + public static WebSocketInterfaceDebuggerPool getInstance() + { + return instance; + } + + /** + * 最大在线客户端数量 + */ + private static final int MAX_ONLINE_CLIENT = 10; + + + // 接口自动化线程池 + private ExecutorService executorService = new ThreadPoolExecutor(0, MAX_ONLINE_CLIENT, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue()); + private Map debuggerMap = new HashMap<>(); + + + @Override + public void createDebugger(Session session, String deviceToken) + { + //校验接口自动化线程是否开启创建 + if(!ExecutorPool.enableApi){ + try { + session.close(new CloseReason(CANNOT_ACCEPT, "接口自动化引擎连接已禁用,拒绝连接")); + } catch (IOException e) { + logger.error("拒绝创建调试器。关闭会话失败!", e); + } + } + if(MAX_ONLINE_CLIENT>=debuggerMap.size()){ + InterfaceDebugger debugger = new InterfaceDebugger(deviceToken, session); + executorService.submit(debugger); + debuggerMap.put(deviceToken,debugger); + }else + {// 拒绝创建【接口自动化测试调试器】 + try + { + session.close(new CloseReason(CANNOT_ACCEPT, "接口自动化引擎连接已到最大值,拒绝连接")); + } catch (IOException e) + { + logger.error("拒绝创建调试器。关闭会话失败!", e); + } + } + } + + @Override + public void destroyDebugger(String deviceToken) + { + if(debuggerMap.containsKey(deviceToken)){ + InterfaceDebugger debugger = debuggerMap.get(deviceToken); + debugger.close(); + debuggerMap.remove(deviceToken); + } + } + + @Override + public void replayStart(String deviceToken, ATUWebSocketReplay replayRequest) + { + if(debuggerMap.containsKey(deviceToken)){ + InterfaceDebugger debugger = debuggerMap.get(deviceToken); + if (debugger.isStopped()) + { + debugger.replay(replayRequest); + Thread debuggerThread = new Thread(debugger); + debuggerThread.setDaemon(true); + debuggerThread.start(); + } + } + + } + + @Override + public void replayStop(String deviceToken) + { + if(debuggerMap.containsKey(deviceToken)){ + InterfaceDebugger debugger = debuggerMap.get(deviceToken); + debugger.stop(); + } + } + + /** + * 访问线程池 + * @return + */ + public Map getPoolInfo(){ + return debuggerMap; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketMobileDebuggerPool.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketMobileDebuggerPool.java new file mode 100644 index 0000000..a8fec6e --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketMobileDebuggerPool.java @@ -0,0 +1,95 @@ +package net.northking.cctp.se.debugger.pool; + +import net.northking.cctp.se.debugger.MobileDebugger; +import net.northking.cctp.se.dto.ATUWebSocketReplay; +import net.northking.cctp.se.thread.ExecutorPool; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.websocket.CloseReason; +import javax.websocket.Session; +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.*; + +import static javax.websocket.CloseReason.CloseCodes.CANNOT_ACCEPT; + +public class WebSocketMobileDebuggerPool implements WebSocketDebuggerPool { + public static final Logger logger = LoggerFactory.getLogger(WebSocketMobileDebuggerPool.class); + + private static WebSocketMobileDebuggerPool instance = new WebSocketMobileDebuggerPool(); + + private WebSocketMobileDebuggerPool() { + } + + public static WebSocketMobileDebuggerPool getInstance() { + return instance; + } + + /** + * 最大在线客户端数量 + */ + private static final int MAX_ONLINE_CLIENT = 5; + + // 移动自动化线程池 + private ExecutorService executorService = new ThreadPoolExecutor(0, MAX_ONLINE_CLIENT, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue()); + + private static Map debuggerMap = new ConcurrentHashMap<>(); + + @Override + public void createDebugger(Session session, String deviceToken) { + //校验移动自动化线程是否开启创建 + if(!ExecutorPool.enableMobile){ + try { + session.close(new CloseReason(CANNOT_ACCEPT, "移动自动化引擎连接已禁用,拒绝连接")); + } catch (IOException e) { + logger.info("拒绝创建调试器。关闭会话失败!", e); + } + } + if (MAX_ONLINE_CLIENT >= debuggerMap.size()) { + MobileDebugger debugger = new MobileDebugger(deviceToken, session); // 创建线程任务 + executorService.submit(debugger); + debuggerMap.put(deviceToken, debugger); + } else { + // 超过最大连接数 + logger.info("引擎的移动自动化已达到最大连接数"); + } + } + + @Override + public void destroyDebugger(String deviceToken) { + if (debuggerMap.containsKey(deviceToken)) { + debuggerMap.get(deviceToken).close(); + } + } + + @Override + public void replayStart(String deviceToken, ATUWebSocketReplay replayRequest) { + if (debuggerMap.containsKey(deviceToken)) { + MobileDebugger debugger = debuggerMap.get(deviceToken); + if (debugger.isStopped()) { + debugger.replay(replayRequest); + Thread debuggerThread = new Thread(debugger); + debuggerThread.setDaemon(true); + debuggerThread.start(); + } + } + } + + @Override + public void replayStop(String deviceToken) { + if (debuggerMap.containsKey(deviceToken)) { + debuggerMap.get(deviceToken).stop(); + } + } + + /** + * 访问线程池 + * @return + */ + public Map getPoolInfo(){ + return debuggerMap; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketPCUIDebuggerPool.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketPCUIDebuggerPool.java new file mode 100644 index 0000000..8f40947 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/debugger/pool/WebSocketPCUIDebuggerPool.java @@ -0,0 +1,106 @@ +package net.northking.cctp.se.debugger.pool; + +import net.northking.cctp.se.debugger.PCUIDebugger; +import net.northking.cctp.se.dto.ATUWebSocketReplay; +import net.northking.cctp.se.thread.ExecutorPool; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.websocket.CloseReason; +import javax.websocket.Session; +import java.io.IOException; + +import static javax.websocket.CloseReason.CloseCodes.CANNOT_ACCEPT; + +public class WebSocketPCUIDebuggerPool implements WebSocketDebuggerPool +{ + public static final Logger logger = LoggerFactory.getLogger(WebSocketPCUIDebuggerPool.class); + + private static WebSocketPCUIDebuggerPool instance = new WebSocketPCUIDebuggerPool(); + + private WebSocketPCUIDebuggerPool() + { + } + + public static WebSocketPCUIDebuggerPool getInstance() + { + return instance; + } + + /** + * 最大在线客户端数量 + */ + private static final int MAX_ONLINE_CLIENT = 1; + + private PCUIDebugger debugger; + + + @Override + public void createDebugger(Session session, String deviceToken) + { + //校验PCUI自动化线程是否开启创建 + if(!ExecutorPool.enablePc){ + try { + session.close(new CloseReason(CANNOT_ACCEPT, "PCUI自动化引擎连接已禁用,拒绝连接")); + } catch (IOException e) { + logger.info("拒绝创建调试器。关闭会话失败!", e); + } + } + + if (debugger == null || debugger.isClosed()) + { + debugger = new PCUIDebugger(deviceToken, session); + } else if (deviceToken.equals(debugger.getId())) + { + debugger.setNativeClient(session); + } else + {// 拒绝创建【PC端UI自动化测试调试器】 + try + { + session.close(new CloseReason(CANNOT_ACCEPT, "")); + } catch (IOException e) + { + logger.error("拒绝创建调试器。关闭会话失败!", e); + } + } + } + + @Override + public void destroyDebugger(String deviceToken) + { + if (debugger.getId().equals(deviceToken)) + { + debugger.close(); + } + } + + @Override + public void replayStart(String deviceToken, ATUWebSocketReplay replayRequest) + { + if (debugger.isStopped()) + { + debugger.replay(replayRequest); + Thread debuggerThread = new Thread(debugger); + debuggerThread.setDaemon(true); + debuggerThread.start(); + } + + } + + @Override + public void replayStop(String deviceToken) + { + if (debugger.getId().equals(deviceToken)) + { + debugger.stop(); + } + } + + /** + * 访问线程池 + * @return + */ + public PCUIDebugger getPoolInfo(){ + return debugger; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/AbstractDeviceConnection.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/AbstractDeviceConnection.java new file mode 100644 index 0000000..a132a96 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/AbstractDeviceConnection.java @@ -0,0 +1,69 @@ +package net.northking.cctp.se.device.bean; + +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.element.core.DeviceDriver; +import net.northking.cctp.se.device.service.DeviceConnection; + +import java.util.Map; + +@SuppressWarnings("ALL") +@Slf4j +public abstract class AbstractDeviceConnection implements DeviceConnection { + protected String deviceToken; + protected DeviceDriver deviceDriver; + protected DeviceInfo deviceInfo; + + public AbstractDeviceConnection(String deviceToken,DeviceInfo deviceInfo) throws Exception{ + this.deviceToken = deviceToken; + this.deviceInfo = deviceInfo; + initDriver(); + } + @Override + public String getDeviceId() { + return deviceInfo.getDeviceId(); + } + + @Override + public DeviceDriver getDeviceDriver() { + return deviceDriver; + } + + @Override + public DeviceInfo getDeviceInfo() { + return deviceInfo; + } + + @Override + public void close() { + deviceDriver.destroy(); + log.debug("AbstractDeviceConnection.close:设备【{}】的driver释放",deviceInfo.getDeviceId()); + deviceDriver = null; + } + + @Override + public String getDeviceToken() { + return deviceToken; + } + + protected abstract void initDriver() throws Exception; + + @Override + public String snapshotAllScreen(String userToken, String taskId) { + return null; + } + + @Override + public boolean reconnect() { + return false; + } + + @Override + public void recordDevicePer(Map params) { + + } + + @Override + public DevicePerInfo stopRecordDevicePer() { + return null; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/AndroidMobileDeviceDriver.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/AndroidMobileDeviceDriver.java new file mode 100644 index 0000000..4bcf730 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/AndroidMobileDeviceDriver.java @@ -0,0 +1,48 @@ +package net.northking.cctp.se.device.bean; + +import cn.hutool.core.lang.UUID; +import io.appium.java_client.android.AndroidDriver; +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.element.core.DeviceDriver; +import org.openqa.selenium.Capabilities; +import org.openqa.selenium.WebElement; + +import java.net.URL; +import java.util.concurrent.Future; + +@Slf4j +public class AndroidMobileDeviceDriver extends AndroidDriver implements DeviceDriver { + + private Future future; + + public AndroidMobileDeviceDriver(URL remoteAddress, Capabilities desiredCapabilities) { + super(remoteAddress,desiredCapabilities); + log.info("Mobile androidDriver created --> [appium-session-id:{},address:{},capability:{}]", getSessionId(), remoteAddress, desiredCapabilities); + } + + @Override + public void destroy() { + try { + this.quit(); + } catch (Exception e) { + log.warn("driver有问题。。。。。"); + } + if (null != this.future) { + future.cancel(true); + this.future = null; + } + log.info("androidDriver driver destroyed. "); + } + + @Override + public void setFuture(Future future) { + this.future = future; + } + + @Override + public Future getFuture() { + return this.future; + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/AppPerInfo.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/AppPerInfo.java new file mode 100644 index 0000000..17b3f75 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/AppPerInfo.java @@ -0,0 +1,44 @@ +package net.northking.cctp.se.device.bean; + +public class AppPerInfo { + + private String appPackage; + + private long appInstallTime; //app安装时间/ms + + private long appActiveTime; //app启动时间/ms + + private String appPerInfoAddress; //app具体的数据三个List + + public String getAppPackage() { + return appPackage; + } + + public void setAppPackage(String appPackage) { + this.appPackage = appPackage; + } + + public long getAppInstallTime() { + return appInstallTime; + } + + public void setAppInstallTime(long appInstallTime) { + this.appInstallTime = appInstallTime; + } + + public long getAppActiveTime() { + return appActiveTime; + } + + public void setAppActiveTime(long appActiveTime) { + this.appActiveTime = appActiveTime; + } + + public String getAppPerInfoAddress() { + return appPerInfoAddress; + } + + public void setAppPerInfoAddress(String appPerInfoAddress) { + this.appPerInfoAddress = appPerInfoAddress; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/DebuggerDeviceInfo.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/DebuggerDeviceInfo.java new file mode 100644 index 0000000..5bcb60a --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/DebuggerDeviceInfo.java @@ -0,0 +1,253 @@ +package net.northking.cctp.se.device.bean; + +import java.util.Map; + +public class DebuggerDeviceInfo { + + /** + * 创建driver + */ + private String deviceId; + + private String platform; + + private String systemVersion; + + /** + * 初始化应用 + */ + private String appId; + + private String appPackage; + + private String downloadAppUrl; + + private String appVersion; + + private boolean reInstall; + + private boolean cleanData; + + private String appName; + + private String appPath; + + + + /** + * 截图 + * @return + */ + private Integer length; + + private Integer width; + + private String resolution; + + private Integer x; + + private Integer y; + + private Integer screenLength; + + private Integer screenWidth; + + /** + * 用户token + */ + private String userToken; + + private String tenantId; + + private String taskId; + /** + * 是否保存视频 + */ + private Boolean save; + + public String getUserToken() { + return userToken; + } + + public void setUserToken(String userToken) { + this.userToken = userToken; + } + + public Integer getLength() { + return length; + } + + public void setLength(Integer length) { + this.length = length; + } + + public Integer getWidth() { + return width; + } + + public void setWidth(Integer width) { + this.width = width; + } + + public String getResolution() { + return resolution; + } + + public void setResolution(String resolution) { + this.resolution = resolution; + } + + public Integer getX() { + return x; + } + + public void setX(Integer x) { + this.x = x; + } + + public Integer getY() { + return y; + } + + public void setY(Integer y) { + this.y = y; + } + + public Integer getScreenLength() { + return screenLength; + } + + public void setScreenLength(Integer screenLength) { + this.screenLength = screenLength; + } + + public Integer getScreenWidth() { + return screenWidth; + } + + public void setScreenWidth(Integer screenWidth) { + this.screenWidth = screenWidth; + } + + public String getAppVersion() { + return appVersion; + } + + public void setAppVersion(String appVersion) { + this.appVersion = appVersion; + } + + public boolean isReInstall() { + return reInstall; + } + + public void setReInstall(boolean reInstall) { + this.reInstall = reInstall; + } + + public boolean isCleanData() { + return cleanData; + } + + public void setCleanData(boolean cleanData) { + this.cleanData = cleanData; + } + + private Map otherInfo; //创建driver的时候others选项 + + public Map getOtherInfo() { + return otherInfo; + } + + public void setOtherInfo(Map otherInfo) { + this.otherInfo = otherInfo; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getPlatform() { + return platform; + } + + public void setPlatform(String platform) { + this.platform = platform; + } + + public String getSystemVersion() { + return systemVersion; + } + + public void setSystemVersion(String systemVersion) { + this.systemVersion = systemVersion; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppPackage() { + return appPackage; + } + + public void setAppPackage(String appPackage) { + this.appPackage = appPackage; + } + + public String getDownloadAppUrl() { + return downloadAppUrl; + } + + public void setDownloadAppUrl(String downloadAppUrl) { + this.downloadAppUrl = downloadAppUrl; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public Boolean getSave() { + return save; + } + + public void setSave(Boolean save) { + this.save = save; + } + + public String getAppPath() { + return appPath; + } + + public void setAppPath(String appPath) { + this.appPath = appPath; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/DeviceInfo.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/DeviceInfo.java new file mode 100644 index 0000000..43b9472 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/DeviceInfo.java @@ -0,0 +1,30 @@ +package net.northking.cctp.se.device.bean; + +import lombok.Data; + +import java.util.Map; + +@Data +public class DeviceInfo{ + private String deviceId; // 设备id + + private boolean mobile = false; // 是否移动设备 + + private String deviceName; // 设备名称 + + private String connectAddress; // 连接地址,移动-appium的ip,pc-设备ip + + private String port; // 端口 + + private String platform; // 设备平台 + + private String systemVersion; // 移动设备版本 + + private String wdaAddress; + + private String resolution; //分辨率 + + private int forwardPort; //android在appium自动化时的adb转发端口 + + private Map otherInfo; +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/DevicePerInfo.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/DevicePerInfo.java new file mode 100644 index 0000000..34b7838 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/DevicePerInfo.java @@ -0,0 +1,44 @@ +package net.northking.cctp.se.device.bean; + +public class DevicePerInfo { + + private String deviceId; + + private String caseId; + + private AppPerInfo appPerInfo; + + private String devicePerInfoAddress; + + public String getCaseId() { + return caseId; + } + + public void setCaseId(String caseId) { + this.caseId = caseId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public AppPerInfo getAppPerInfo() { + return appPerInfo; + } + + public void setAppPerInfo(AppPerInfo appPerInfo) { + this.appPerInfo = appPerInfo; + } + + public String getDevicePerInfoAddress() { + return devicePerInfoAddress; + } + + public void setDevicePerInfoAddress(String devicePerInfoAddress) { + this.devicePerInfoAddress = devicePerInfoAddress; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/IosMobileDeviceDriver.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/IosMobileDeviceDriver.java new file mode 100644 index 0000000..7773d4a --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/IosMobileDeviceDriver.java @@ -0,0 +1,47 @@ +package net.northking.cctp.se.device.bean; + +import io.appium.java_client.ios.IOSDriver; +import net.northking.cctp.element.core.DeviceDriver; +import org.openqa.selenium.Capabilities; +import org.openqa.selenium.WebElement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URL; +import java.util.concurrent.Future; + +public class IosMobileDeviceDriver extends IOSDriver implements DeviceDriver { + + private Future future; + + private final Logger logger = LoggerFactory.getLogger(IosMobileDeviceDriver.class); + + public IosMobileDeviceDriver(URL remoteAddress, Capabilities desiredCapabilities) { + super(remoteAddress, desiredCapabilities); + logger.info("Mobile iosDriver created --> [address:{},capability:{}]", remoteAddress, desiredCapabilities); + } + + @Override + public void destroy() { + try { + this.quit(); + } catch (Exception e) { + logger.warn("driver有问题"); + } + if (null != this.future) { + this.future.cancel(true); + this.future = null; + } + logger.info("iosDriver driver destroyed. "); + } + + @Override + public void setFuture(Future future) { + this.future = future; + } + + @Override + public Future getFuture() { + return this.future; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/MobileDeviceConnection.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/MobileDeviceConnection.java new file mode 100644 index 0000000..d8e488d --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/MobileDeviceConnection.java @@ -0,0 +1,998 @@ +package net.northking.cctp.se.device.bean; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ; +import io.appium.java_client.AppiumDriver; +import io.appium.java_client.TouchAction; +import io.appium.java_client.android.AndroidDriver; +import io.appium.java_client.android.nativekey.AndroidKey; +import io.appium.java_client.android.nativekey.KeyEvent; +import io.appium.java_client.ios.IOSDriver; +import io.appium.java_client.touch.WaitOptions; +import io.appium.java_client.touch.offset.PointOption; +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.element.core.DeviceDriver; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.element.core.exception.ParamMistakeException; +import net.northking.cctp.mobile.driver.constans.AutomationRequestCmd; +import net.northking.cctp.mobile.driver.driver.MobileDriver; +import net.northking.cctp.mobile.driver.entity.CmdAutomationRequest; +import net.northking.cctp.mobile.driver.entity.CmdAutomationResponse; +import net.northking.cctp.se.config.AtuServerConfig; +import net.northking.cctp.se.config.MobileAutomationSelectorConfig; +import net.northking.cctp.se.util.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.StopWatch; +import org.openqa.selenium.SessionNotCreatedException; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.net.MalformedURLException; +import java.net.URL; +import java.time.Duration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.Future; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + +import static io.appium.java_client.remote.AndroidMobileCapabilityType.*; +import static io.appium.java_client.remote.IOSMobileCapabilityType.USE_PREBUILT_WDA; +import static io.appium.java_client.remote.IOSMobileCapabilityType.WEB_DRIVER_AGENT_URL; +import static io.appium.java_client.remote.MobileCapabilityType.*; +import static org.openqa.selenium.remote.CapabilityType.PLATFORM_NAME; + +@Slf4j +public class MobileDeviceConnection extends AbstractDeviceConnection { + + private static final String APP_DOWNLOAD_URL = "http://%s/engine/downloadApp"; + + private static final String RECORD_DEVICE_PER = "http://%s/engine/recordDevicePer"; + + private static final String STOP_RECORD_DEVICE_PER = "http://%s/engine/stopRecordDevicePer"; + + private final Integer defaultUpperPort = 8808; + + private String remoteAddress; + + private static final int VALUE_NEW_COMMAND_TIMEOUT = 240; + + private static final int PER_CONNECT_TIMEOUT = 1000; + private static final int PER_READ_TIMEOUT = 1000; + + private static final String USE_XCTESTRUN_FILE = "useXctestrunFile"; + + private static final String SKIP_LOG_CAPTURE = "skipLogCapture"; + + private MobileDriverKeepThread keepThread; + + public static final String PACKAGE_NAME = "appPackage"; + public static final String APP_NAME = "appName"; + public static final String IS_REINSTALL = "forceReInstall"; + public static final String IS_CLEAN_DATA = "forceCleanData"; + public static final String IS_APP_RESTART = "restartApp"; + public static final String IS_RECORD_DEVICE_PER = "debug"; + + private DevicePerInfo devicePerInfo; + + private boolean isRecord; + + public MobileDeviceConnection(String deviceToken, DeviceInfo deviceInfo) throws Exception { + super(deviceToken, deviceInfo); + } + + @Override + protected void initDriver() { + log.info("start init device[{}] driver..........", deviceInfo.getDeviceId()); + this.remoteAddress = deviceInfo.getConnectAddress() + ":" + (null == deviceInfo.getPort() ? defaultUpperPort : deviceInfo.getPort()); + log.info("remote-address上位机地址信息:{}", remoteAddress); + try { + this.deviceDriver = connectDevice(); + initKeepDriverThread(); + } catch (ExecuteException e) { + throw e; + } catch (Exception e) { + log.error("设备【{}】创建driver失败", deviceInfo.getDeviceId(), e); + throw new ExecuteException("创建设备连接失败"); + } + } + + private void initKeepDriverThread() { + this.keepThread = new MobileDriverKeepThread(this.deviceDriver, VALUE_NEW_COMMAND_TIMEOUT - 10, deviceInfo.getDeviceId()); + this.keepThread.start(); + } + + private DeviceDriver connectDevice() { + Map otherInfo = deviceInfo.getOtherInfo(); + String appiumHost = deviceInfo.getConnectAddress(); + Integer appiumPort = Integer.parseInt(otherInfo.get("appiumPort")); + String appiumContextPath = otherInfo.get("appiumContextPath"); + URL appiumServerUrl = null; + try { + appiumServerUrl = new URL(String.format("http://%s:%d%s", appiumHost, appiumPort, appiumContextPath)); + log.info("连接上位机的appium服务地址:{}", appiumServerUrl); + } catch (MalformedURLException e) { + log.error("appium-server地址有误:{}", String.format("http://%s:%d%s", appiumHost, appiumPort, appiumContextPath)); + } + DeviceDriver driver = null; + if ("0".equalsIgnoreCase(deviceInfo.getPlatform()) || "android".equalsIgnoreCase(deviceInfo.getPlatform())) { + driver = createAndroidDriver(appiumServerUrl, appiumHost + ":8808", deviceInfo.getDeviceId(), null); + } else if ("1".equalsIgnoreCase(deviceInfo.getPlatform()) || "ios".equalsIgnoreCase(deviceInfo.getPlatform())) { + driver = createIosDriver(appiumServerUrl, deviceInfo, null); + } + if (driver != null) { + log.info("Driver for device[{}] created successfully.", deviceInfo.getDeviceId()); + } else { + log.error("Driver获取为空,设备连接失败"); + throw new ExecuteException("设备驱动创建失败,请稍后再试"); + } + return driver; + } + + private DeviceDriver createIosDriver(URL appiumServerUrl, DeviceInfo deviceInfo, Map others) { + MobileAutomationSelectorConfig selectorConfig = SpringUtils.getBean(MobileAutomationSelectorConfig.class); + log.info("拿到的自动化类型:{}", selectorConfig.getType()); + if ("appium".equals(selectorConfig.getType())) { //appium的方式 + IosMobileDeviceDriver driver = null; + DesiredCapabilities capabilities = initIosCapabilities(deviceInfo, others); + try { + driver = new IosMobileDeviceDriver(appiumServerUrl, capabilities); + } catch (SessionNotCreatedException e) { + log.error("设备未连接到上位机", e); + throw new ExecuteException("设备未接到上位机"); + } catch (WebDriverException e) { + log.warn("设备【{}】Driver创建失败,重新试一次", deviceInfo.getDeviceId(), e); + try { + Thread.sleep(1500); + } catch (InterruptedException interruptedException) { + log.warn("设备【{}】移除应用时driver出现问题,重新执行。。。。。", deviceInfo.getDeviceId()); + throw new ExecuteException("执行取消"); + } + driver = new IosMobileDeviceDriver(appiumServerUrl, capabilities); + } catch (Exception e) { + log.error("Driver获取失败,设备连接失败", e); + throw new ExecuteException("设备驱动创建失败,请稍后再试"); + } + return driver; + } else { //自研方式 + MobileDeviceDriver driver = null; + try { + driver = new MobileDeviceDriver(this.remoteAddress, deviceInfo.getDeviceId(), "ios"); + } catch (Exception e) { + log.error("设备【{}】创建MobileDriver失败,地址:{}", deviceInfo.getDeviceId(), this.remoteAddress, e); + throw new ExecuteException("设备驱动创建失败,请稍后再试"); + } + return driver; + } + } + + private DesiredCapabilities initIosCapabilities(DeviceInfo deviceInfo, Map others) { + DesiredCapabilities desiredCapabilities = new DesiredCapabilities(); + desiredCapabilities.setCapability(DEVICE_NAME, deviceInfo.getDeviceId()); //设备id + desiredCapabilities.setCapability(UDID, deviceInfo.getDeviceId()); //设备id + desiredCapabilities.setCapability(PLATFORM_NAME, "iOS"); //ios + desiredCapabilities.setCapability(PLATFORM_VERSION, deviceInfo.getSystemVersion()); + desiredCapabilities.setCapability("appium:noSign", true); + desiredCapabilities.setCapability("appium:skipServerInstallation", false); + desiredCapabilities.setCapability("appium:skipUnlock", true); + boolean noReset = true; + boolean unicodeKeyboard = false; + boolean resetKeyboard = true; + if (others != null) { + String value = others.get(UNICODE_KEYBOARD); + if (StringUtils.isNotBlank(value)) { + unicodeKeyboard = value.equalsIgnoreCase("true"); + } + value = others.get(NO_RESET); + if (StringUtils.isNotBlank(value)) { + noReset = value.equalsIgnoreCase("true"); + } + value = others.get(RESET_KEYBOARD); + if (StringUtils.isNotBlank(value)) { + resetKeyboard = value.equalsIgnoreCase("true"); + } + } + String wdaUrl = deviceInfo.getWdaAddress(); + if (others != null) { + String value = others.get(WEB_DRIVER_AGENT_URL); + if (StringUtils.isNotBlank(value)) { + wdaUrl = value; + } + value = others.get(NO_RESET); + if (StringUtils.isNotBlank(value)) { + noReset = value.equalsIgnoreCase("true"); + } + } + log.debug("Set ", wdaUrl); + desiredCapabilities.setCapability(WEB_DRIVER_AGENT_URL, wdaUrl); + desiredCapabilities.setCapability(NO_RESET, noReset); + desiredCapabilities.setCapability(NEW_COMMAND_TIMEOUT, VALUE_NEW_COMMAND_TIMEOUT); + desiredCapabilities.setCapability(USE_PREBUILT_WDA, false); + desiredCapabilities.setCapability(USE_XCTESTRUN_FILE, false); + desiredCapabilities.setCapability(SKIP_LOG_CAPTURE, true); + desiredCapabilities.setCapability(UNICODE_KEYBOARD, unicodeKeyboard); + desiredCapabilities.setCapability(RESET_KEYBOARD, resetKeyboard); + log.debug("set wdaUrl:{},deviceName-[{}],udid-[{}],platformName-[{}],appium:noSign-[{}],appium:skipServerInstallation-[{}],appium:skipUnlock-[{}]," + + "unicodeKeyboard-[{}],noReset-[{}],resetKeyboard-[{}],newCommandTimeout-[{}],", wdaUrl, deviceInfo.getDeviceId(), + "android", true, false, true, unicodeKeyboard, noReset, resetKeyboard, VALUE_NEW_COMMAND_TIMEOUT); + return desiredCapabilities; + } + + private AndroidMobileDeviceDriver createAndroidDriver(URL appiumServerUrl, String upperUrl, String deviceId, Map others) { + DesiredCapabilities capabilities = initAndroidCapabilities(deviceId, others); + AndroidMobileDeviceDriver driver = null; + try { + driver = new AndroidMobileDeviceDriver(appiumServerUrl, capabilities); + } catch (SessionNotCreatedException e) { + log.error("Driver创建失败,设备连接失败", e); + String errorMessage = String.format("the local port #%s is busy", deviceInfo.getForwardPort()); + String epermMsg = "eperm"; + if (e.getMessage().contains(errorMessage) || e.getMessage().toLowerCase().contains(epermMsg)) { + log.warn("设备【{}】adb转发的端口【{}】被占用了,释放了重新来", deviceId, deviceInfo.getForwardPort()); + boolean success = AndroidUtil.releaseAdbForwardPort(this.remoteAddress, deviceId); + if (success) { + driver = new AndroidMobileDeviceDriver(appiumServerUrl, capabilities); + } else { + log.warn("设备【{}】adb转发的端口【{}】被占用了,没有释放成功", deviceId, deviceInfo.getForwardPort()); + } + } + } catch (WebDriverException e) { + log.warn("设备【{}】Driver创建失败,重新试一次", deviceId, e); + try { + Thread.sleep(1500); + } catch (InterruptedException interruptedException) { + log.warn("设备【{}】移除应用时driver出现问题,重新执行。。。。。", deviceInfo.getDeviceId()); + throw new ExecuteException("执行取消"); + } + driver = new AndroidMobileDeviceDriver(appiumServerUrl, capabilities); + } catch (Exception e) { + log.error("设备驱动创建失败", e); + } + return driver; + } + +// private AndroidMobileDeviceDriver createAndroidDriver(URL appiumServerUrl, String deviceId, Map others) { +// AndroidMobileDeviceDriver driver = null; +// DesiredCapabilities capabilities = initAndroidCapabilities(deviceId, others); +// try { +// driver = new AndroidMobileDeviceDriver(appiumServerUrl, capabilities); +// return driver; +// } catch (SessionNotCreatedException e) { +// log.error("设备未连接到上位机", e); +// throw new ExecuteException("设备无法初始化,请将设备重新拔插后再试"); +// } catch (WebDriverException e) { +// log.warn("设备【{}】Driver创建失败,重新试一次", deviceId, e); +// try { +// Thread.sleep(1500); +// } catch (InterruptedException interruptedException) { +// log.warn("设备【{}】移除应用时driver出现问题,重新执行。。。。。", deviceInfo.getDeviceId()); +// throw new ExecuteException("执行取消"); +// } +// driver = new AndroidMobileDeviceDriver(appiumServerUrl, capabilities); +// } catch (Exception e) { +// log.error("设备驱动创建失败", e); +// } +// return driver; +// } + + private DesiredCapabilities initAndroidCapabilities(String deviceId, Map others) { + DesiredCapabilities desiredCapabilities = new DesiredCapabilities(); + desiredCapabilities.setCapability(DEVICE_NAME, deviceId); //设备id + desiredCapabilities.setCapability(UDID, deviceId); //设备id + desiredCapabilities.setCapability(PLATFORM_NAME, "android"); //android + desiredCapabilities.setCapability("appium:noSign", true); + desiredCapabilities.setCapability("appium:skipServerInstallation", false); + desiredCapabilities.setCapability("appium:skipUnlock", true); + desiredCapabilities.setCapability("appium:systemPort", deviceInfo.getForwardPort()); + boolean noReset = true; + boolean unicodeKeyboard = false; + boolean resetKeyboard = true; + if (others != null) { + String value = others.get(UNICODE_KEYBOARD); + if (StringUtils.isNotBlank(value)) { + unicodeKeyboard = value.equalsIgnoreCase("true"); + } + value = others.get(NO_RESET); + if (StringUtils.isNotBlank(value)) { + noReset = value.equalsIgnoreCase("true"); + } + value = others.get(RESET_KEYBOARD); + if (StringUtils.isNotBlank(value)) { + resetKeyboard = value.equalsIgnoreCase("true"); + } + } + desiredCapabilities.setCapability(UNICODE_KEYBOARD, unicodeKeyboard); + desiredCapabilities.setCapability(RESET_KEYBOARD, resetKeyboard); + desiredCapabilities.setCapability(NO_RESET, noReset); + desiredCapabilities.setCapability(NEW_COMMAND_TIMEOUT, VALUE_NEW_COMMAND_TIMEOUT); + log.debug("set deviceName-[{}],udid-[{}],platformName-[{}],appium:noSign-[{}],appium:skipServerInstallation-[{}],appium:skipUnlock-[{}]," + + "unicodeKeyboard-[{}],noReset-[{}],resetKeyboard-[{}],newCommandTimeout-[{}],", deviceId, deviceId, + "android", true, false, true, unicodeKeyboard, noReset, resetKeyboard, VALUE_NEW_COMMAND_TIMEOUT); + return desiredCapabilities; + } + + /** + *

初始化应用

+ * + * @param config + */ + @Override + public void initConfig(Map config) { + if (null == this.deviceDriver) { + throw new ExecuteException("设备连接有误,请重新连接设备"); + } + if (this.deviceDriver instanceof MobileDriver) { + log.debug("设备【{}】采取自研自动化....................",this.deviceInfo.getDeviceId()); + initApplicationByCustom(config); //todo:性能数据未获取 + } else { + log.debug("设备【{}】采取appium自动化....................",this.deviceInfo.getDeviceId()); + initApplicationByAppium(config); + } + } + + //自己设计的自动化方式 + private void initApplicationByCustom(Map config) { + MobileDriver mobileDriver = (MobileDriver) this.deviceDriver; + String token = UUID.randomUUID().toString(); + CmdAutomationRequest builder = CmdAutomationRequest.builder(AutomationRequestCmd.INIT_APP, token, config); + mobileDriver.send(JSON.toJSONString(builder)); + try { + boolean success = false; + mobileDriver.getSocketClient().semaphore = new Semaphore(0); + mobileDriver.getSocketClient().setToken(token); + if (mobileDriver.getSocketClient().semaphore.tryAcquire(300, TimeUnit.SECONDS)) { + CmdAutomationResponse response = mobileDriver.getSocketClient().getResponse(); + if (token.equals(response.getStepToken())) { + success = response.isSuccess(); + } else { + log.error("收到回来的消息token:{},发过去的token:{}。对不上,收到的内容:{}", response.getStepToken(), token, JSON.toJSONString(response)); + } + log.debug("应用初始化结果:{}", success); + if (!success) { + throw new ExecuteException("应用初始化失败"); + } + } else { + throw new ExecuteException("初始化应用超时"); + } + } catch (InterruptedException e) { + log.warn("用户取消初始化应用"); + throw new ExecuteException("取消应用初始化"); + } + } + //采用appium的方式 + private void initApplicationByAppium(Map config) { + boolean recordDevicePer = (boolean) config.get("debug"); + if (!recordDevicePer) { + //开启监控设备的性能 + this.isRecord = true; + devicePerInfo = new DevicePerInfo(); + AppPerInfo appPerInfo = new AppPerInfo(); + devicePerInfo.setAppPerInfo(appPerInfo); + devicePerInfo.setCaseId((String) config.get("caseId")); + } + String deviceId = this.deviceInfo.getDeviceId(); + boolean reInstall = false; + boolean cleanData = false; + if (null != config.get("forceCleanData")) { + cleanData = (boolean) config.get("forceCleanData"); + } + if (null != config.get("forceReInstall")) { + reInstall = (boolean) config.get("forceReInstall"); + } + String appId = (String) config.get("appId"); + if (appId == null) { + throw new ExecuteException("无匹配该平台的应用,无法初始化"); + } + Map appDetail = getAppDetail(appId); + if (null == appDetail) { + throw new ExecuteException("app应用已被删除,无法初始化"); + } + String appUrl = (String) appDetail.get("appUrl"); + String appPackage = (String) appDetail.get("packageName"); + String appVersion = (String) appDetail.get("buildVersion"); + String appName = appUrl.substring(appUrl.lastIndexOf("_") + 1); + long t2 = System.currentTimeMillis(); + if(this.deviceDriver instanceof AndroidDriver) { + // 回到桌面 + pressHome(); + } + try { + // 安装方式,重新安装的逻辑:1.清除应用的缓存和用户数据 2.安装应用(adb -s install -r|-d ) + boolean appInstalled = isAppInstalled(appPackage); + if (reInstall || cleanData) { + if (appInstalled) { + log.info("Begin to clear data: app[{}] from device[{}]...", appPackage, deviceId); + cleanData(deviceId, appPackage); + } else { + log.info("App[{}] on device[{}] is not installed.", appPackage, deviceId); + } + } + if (!appInstalled) { + log.info("设备[{}]没有安装应用[{}],准备安装...", deviceId, appPackage); + installApp(deviceId, appId, appName, appPackage); + } else { + log.info("device[{}] already install app[{}]...", deviceId, appPackage); + // 设备已安装,查看版本 + String oldPackageCode = AndroidUtil.getOldPackageCode(deviceInfo.getConnectAddress() + ":" + (null == deviceInfo.getPort() ? defaultUpperPort : deviceInfo.getPort()), deviceId, appPackage, this.deviceInfo.getPlatform()); + log.info("install app version[{}],app in device version[{}] ===========> rewrite", appVersion, oldPackageCode); + if (!appVersion.equalsIgnoreCase(oldPackageCode)) { + installApp(deviceId, appId, appName, appPackage); + } else { + log.info("App[{}] on device[{}] already exists ===========> active", appPackage, deviceId); + } + if (reInstall) { + installApp(deviceId, appId, appName, appPackage); + log.info("App[{}] on device[{}] already exists ===========> reInstall", appPackage, deviceId); + } + } + long t3 = System.currentTimeMillis(); + log.debug("卸载安装应用全过程耗时:{}", (t3 - t2) / 1000); + if (!isAppInstalled(appPackage)) { + log.error("设备【{}】安装应用【{}】失败", deviceId, appPackage); + throw new ExecuteException("安装应用失败"); + } + activateApp(appPackage); + } catch (Exception e) { + log.error("应用初始化失败", e); + if (e instanceof ExecuteException) { + throw e; + } + throw new ExecuteException("初始化应用失败"); + } + try { + if (!recordDevicePer) { + Map params = new HashMap<>(); + params.put("tenantId", config.get("tenantId")); + params.put("caseId", config.get("caseId")); + params.put("appPackage", appPackage); + //发送记录设备性能通知 + recordDevicePer(params); + } + } catch (Exception e) { + log.error("记录设备性能数据失败", e); + //性能数据报错不影响执行 +// throw new ExecuteException("记录设备性能数据失败"); + } + log.info("自动化执行环境【app:{},device:{}】准备就绪", appPackage, deviceId); + } + + private Map getAppDetail(String appId) { + Map data = null; + try { + AtuServerConfig config = SpringUtils.getBean(AtuServerConfig.class); + RestTemplate restTemplate = new RestTemplate(); + String url = config.getServerUrl() + config.getAppInfoUrl() + "?appId=" + appId; + ResponseEntity result = restTemplate.getForEntity(url, ResultWrapper.class); + if (HttpStatus.OK.equals(result.getStatusCode())) { + ResultWrapper wrapper = result.getBody(); + if (wrapper.isSuccess()) { + data = (Map) wrapper.getData(); + } + } + } catch (Exception e2) { + log.error("app信息获取失败:", e2); + } + return data; + } + + private void activateApp(String appPackage) { + if (Thread.currentThread().isInterrupted()) { + log.warn("设备【{}】启动app时前停止。。。。。。。。。。", deviceInfo.getDeviceId()); + throw new ExecuteException("执行停止"); + } + StopWatch watchAppActive = null; + if (isRecord) { + watchAppActive = new StopWatch(); + watchAppActive.start(); + } + if (this.deviceDriver instanceof MobileDriver) { + log.debug("设备【{}】采取自研自动化....................",this.deviceInfo.getDeviceId()); + String uuid = this.deviceInfo.getDeviceId(); + IosUtil.activeApp(uuid, appPackage, remoteAddress); + } else { + log.debug("设备【{}】采取appium自动化....................",this.deviceInfo.getDeviceId()); + AppiumDriver driver = (AppiumDriver) this.deviceDriver; + try { + String uuid = (String) driver.getCapabilities().getCapability(UDID); + if (driver instanceof AndroidDriver) { + AndroidUtil.activeApp(uuid, appPackage, remoteAddress); + } else if (driver instanceof IOSDriver) { + IosUtil.activeApp(uuid, appPackage, remoteAddress); + } + } finally { + if (isRecord && null != watchAppActive) { + watchAppActive.stop(); + long time = watchAppActive.getTime(TimeUnit.MILLISECONDS); + log.debug("启动app耗时:{}ms", time); + devicePerInfo.getAppPerInfo().setAppActiveTime(time); + } + } + } + + } + + private void pressHome() { + AndroidDriver driver = (AndroidDriver) this.deviceDriver; + try { + log.info("回到桌面"); + driver.pressKey(new KeyEvent(AndroidKey.HOME)); + } catch (WebDriverException e) { + log.warn("设备【{}】回到桌面时driver出现问题,重新执行。。。。。", deviceInfo.getDeviceId()); + try { + Thread.sleep(1000); + } catch (InterruptedException interruptedException) { + log.warn("设备【{}】移除应用前停止。。。。。", deviceInfo.getDeviceId()); + throw new ExecuteException("执行取消"); + } + try { + reconnect(); + driver = (AndroidDriver) this.deviceDriver; + driver.pressKey(new KeyEvent(AndroidKey.HOME)); + } catch (Exception exception) { + log.error("设备【{}】回到桌面失败", deviceInfo.getDeviceId(), exception); + } + } + } + + private boolean removeApp(String appPackage) { + if (Thread.currentThread().isInterrupted()) { + log.warn("启动app时前停止。。。。。。。。。。"); + throw new ExecuteException("执行停止"); + } + if ("0".equals(deviceInfo.getPlatform())) { //android + AndroidDriver driver = (AndroidDriver) this.deviceDriver; + boolean removeApp = false; + try { + log.info("删除应用前回到桌面"); + driver.pressKey(new KeyEvent(AndroidKey.HOME)); + removeApp = driver.removeApp(appPackage); + } catch (WebDriverException e) { + log.warn("设备【{}】移除应用时driver出现问题,重新执行。。。。。", deviceInfo.getDeviceId()); + try { + Thread.sleep(1000); + } catch (InterruptedException interruptedException) { + log.warn("设备【{}】移除应用前停止。。。。。", deviceInfo.getDeviceId()); + throw new ExecuteException("执行取消"); + } + reconnect(); + driver = (AndroidDriver) this.deviceDriver; + driver.pressKey(new KeyEvent(AndroidKey.HOME)); + removeApp = driver.removeApp(appPackage); + } + return removeApp; + } else { //ios + return IosUtil.removeApp(this.remoteAddress, deviceInfo.getDeviceId(), appPackage); + } + } + + ; + + private boolean isAppInstalled(String appPackage) { + if (Thread.currentThread().isInterrupted()) { + log.warn("设备【{}】判断是否安装app前停止。。。。。。。。。。", deviceInfo.getDeviceId()); + throw new ExecuteException("执行停止"); + } + if ("0".equals(deviceInfo.getPlatform())) { //android + AppiumDriver driver = (AppiumDriver) this.deviceDriver; + boolean appInstalled = false; + try { + appInstalled = driver.isAppInstalled(appPackage); + } catch (WebDriverException e) { + log.warn("设备【{}】在判断包【{}】是否安装时,driver出现问题,重新执行。。。。。", deviceInfo.getDeviceId(), appPackage); + try { + Thread.sleep(1000); + } catch (InterruptedException interruptedException) { + log.warn("设备【{}】判断是否安装app前停止。。。。。。。。。。", deviceInfo.getDeviceId()); + throw new ExecuteException("执行停止"); + } + appInstalled = driver.isAppInstalled(appPackage); + } + return appInstalled; + } else { //ios + return IosUtil.isAppInstalled(this.remoteAddress, deviceInfo.getDeviceId(), appPackage); + } + } + + /** + *

清除数据

+ * + * @param deviceId + * @param appPackage + * @return + */ + private boolean cleanData(String deviceId, String appPackage) { + if (Thread.currentThread().isInterrupted()) { + log.warn("启动app时前停止。。。。。。。。。。"); + throw new ExecuteException("执行停止"); + } + if ("0".equals(deviceInfo.getPlatform())) { + return AndroidUtil.cleanAppData(deviceInfo.getConnectAddress() + ":" + (null == deviceInfo.getPort() ? defaultUpperPort : deviceInfo.getPort()), deviceId, appPackage); + } + return true; + } + + + /** + * 安装app + * + * @param deviceId + * @param appId + * @param appName + * @param packageName + */ + private void installApp(String deviceId, String appId, String appName, String packageName) { + StopWatch watchAppInstall = null; + if (isRecord) { + watchAppInstall = new StopWatch(); + watchAppInstall.start(); + } + String appPath = ""; + log.info("Begin to download app[{}] to upperComputer...", appName); + SimpleClientHttpRequestFactory downloadFactory = new SimpleClientHttpRequestFactory(); + downloadFactory.setConnectTimeout(15000); + downloadFactory.setReadTimeout(600000); + RestTemplate downLoadRestTemplate = new RestTemplate(downloadFactory); + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setAppId(appId); +// String appType = this.deviceDriver instanceof AndroidDriver ? "apk" : "ipa";//平台 + info.setAppName(appName); + HttpEntity entity = new HttpEntity<>(info); + if (Thread.currentThread().isInterrupted()) { + log.warn("下载app时前停止。。。。。。。。。。"); + throw new ExecuteException("执行停止"); + } + long t1 = System.currentTimeMillis(); + try { + ResponseEntity responseEntity = downLoadRestTemplate.exchange(String.format(APP_DOWNLOAD_URL, deviceInfo.getConnectAddress() + ":" + (null == deviceInfo.getPort() ? defaultUpperPort : deviceInfo.getPort())), HttpMethod.POST, entity, String.class); + appPath = responseEntity.getBody(); + } catch (Exception e) { + log.error("应用包【{}】下载失败", appName, e); + throw new ExecuteException("程序包下载失败"); + } + long t2 = System.currentTimeMillis(); + log.debug("单独下载应用耗时:{}", (t2 - t1) / 1000); + log.info("download app finish,start install ............"); + if (Thread.currentThread().isInterrupted()) { + log.warn("安装app时前停止。。。。。。。。。。"); + throw new ExecuteException("执行停止"); + } + try { + boolean isOk = false; + boolean isIOS = this.deviceDriver instanceof IOSDriver; + boolean isAndroid = this.deviceDriver instanceof AndroidDriver; + String platform = null; + if (null != deviceInfo) { + platform = deviceInfo.getPlatform(); + } + if (null == platform) { + if (isAndroid) { + platform = "0"; + } else if (isIOS) { + platform = "1"; + } + log.debug("设备信息未获取到平台,直接根据驱动判断平台(1-IOS 0-安卓):{}", platform); + } + try { + if (isAndroid) { + isOk = AndroidUtil.installApp(this.remoteAddress, deviceId, appPath, platform, packageName); + } else if (isIOS) { + isOk = IosUtil.installApp(this.remoteAddress, deviceId, appPath, platform); + } else { + log.warn("driver类型未知,安装应用失败!"); + } + long t3 = System.currentTimeMillis(); + log.debug("单独安装应用耗时:{}", (t3 - t2) / 1000); + } catch (Exception e) { + log.warn("设备【{}】安装应用【{}】出现异常,重试一次。。。", deviceId, packageName, e); + try { + Thread.sleep(1500); + } catch (InterruptedException interruptedException) { + log.warn("设备【{}】安装app【{}】时用户取消操作。。。。。", deviceId, packageName); + return; + } + t1 = System.currentTimeMillis(); + try { + ResponseEntity responseEntity = downLoadRestTemplate.exchange(String.format(APP_DOWNLOAD_URL, deviceInfo.getConnectAddress() + ":" + (null == deviceInfo.getPort() ? defaultUpperPort : deviceInfo.getPort())), HttpMethod.POST, entity, String.class); + appPath = responseEntity.getBody(); + } catch (Exception e2) { + log.error("应用包【{}】下载失败", appName, e2); + throw new ExecuteException("程序包下载失败"); + } + t2 = System.currentTimeMillis(); + log.debug("单独下载应用耗时:{}", (t2 - t1) / 1000); + log.info("download app finish,start install ............"); + if (isAndroid) { + // 回到桌面 + pressHome(); + isOk = AndroidUtil.installApp(this.remoteAddress, deviceId, appPath, platform, packageName); + } else if (isIOS) { + isOk = IosUtil.installApp(this.remoteAddress, deviceId, appPath, platform); + } else { + log.warn("driver类型未知,安装应用失败!"); + } + } +// if (this.deviceDriver instanceof AndroidDriver) { +// AppiumDriver driver = (AppiumDriver) this.deviceDriver; +// try { +// driver.installApp(appPath); +// } catch (WebDriverException e) { +// log.warn("设备【{}】安装应用【{}】出现异常,重试一次。。。", deviceId, packageName, e); +// try { +// Thread.sleep(1500); +// } catch (InterruptedException interruptedException) { +// log.warn("设备【{}】安装app【{}】时用户取消操作。。。。。", deviceId, packageName); +// return; +// } +// driver.installApp(appPath); +// } +// } else if (this.deviceDriver instanceof IOSDriver) { +// boolean isOk = false; +// try { +// isOk = IosUtil.installApp(this.remoteAddress, deviceId, appPath); +// } catch (Exception e) { +// log.warn("设备【{}】安装应用【{}】出现异常,重试一次。。。", deviceId, packageName, e); +// try { +// Thread.sleep(1500); +// } catch (InterruptedException interruptedException) { +// log.warn("设备【{}】安装app【{}】时用户取消操作。。。。。", deviceId, packageName); +// return; +// } +// isOk = IosUtil.installApp(this.remoteAddress, deviceId, appPath); +// } +// } + } finally { + if (isRecord && null != watchAppInstall) { + watchAppInstall.stop(); + long time = watchAppInstall.getTime(TimeUnit.MILLISECONDS); + log.debug("下载安装app总耗时:{}ms", time); + devicePerInfo.getAppPerInfo().setAppInstallTime(time); + } + } + log.info("App[{}] on device[{}] installed successfully.", packageName, deviceId); + } + + + @Override + public void startRecord() { + if ("0".equals(deviceInfo.getPlatform())) { + AndroidUtil.startRecord(this.remoteAddress, deviceInfo.getDeviceId(), deviceInfo.getOtherInfo().get("taskId"),deviceInfo.getOtherInfo().get("tenantId")); + } else { + IosUtil.startRecord(this.remoteAddress, deviceInfo.getDeviceId(), deviceInfo.getOtherInfo().get("taskId"), deviceInfo.getOtherInfo().get("tenantId"),deviceInfo.getResolution()); + } + } + + @Override + public String stopRecord(Map initData) { + String result = null; + if (ObjectUtil.isNull(initData.get("tenantId"))) { + throw new RuntimeException("租户编号不能为空"); + } + if (ObjectUtil.isNull(initData.get("save"))) { + throw new RuntimeException("视频保存标识不能为空"); + } + if ("0".equals(deviceInfo.getPlatform())) { + result = AndroidUtil.stopRecord(this.remoteAddress, deviceInfo.getDeviceId(), initData); + } else { + result = IosUtil.stopRecord(this.remoteAddress, deviceInfo.getDeviceId(), initData); + } + return result; + } + + @Override + public void startLog() { + + } + + @Override + public String stopLog() { + return null; + } + + @Override + public String snapshot(Map initData) { + return MobileUtil.snapshot(this.remoteAddress, deviceInfo.getPlatform(), initData); + } + +// @Override +// public String snapshotAllScreen(String tenantId) { +// return AndroidUtil.snapshotAllScreen(this.remoteAddress, deviceInfo, tenantId); +// } + + /** + * 回放准备手机环境 + * + * @param config 参数 + */ + @Override + public void restart(Map config) { + String type = (String) config.get("type"); + switch (type) { + case "0": //重启应用 + appRestart((String) config.get(PACKAGE_NAME), (String) config.get(APP_NAME)); + break; + case "1": //清除数据 + cleanData(this.deviceInfo.getDeviceId(), (String) config.get(PACKAGE_NAME)); + activateApp((String) config.get(PACKAGE_NAME)); + break; + case "2": //卸载重装 + initConfig(config); + break; + case "3": //清楚数据,重启应用 + cleanData(this.deviceInfo.getDeviceId(), (String) config.get(PACKAGE_NAME)); + appRestart((String) config.get(PACKAGE_NAME), (String) config.get(APP_NAME)); + break; + default: + log.warn("未知回放参数:{}", type); + break; + } + } + + + /** + * 重新启动App + * + * @param appPackage + */ + private void appRestart(String appPackage, String appName) { + if (Thread.currentThread().isInterrupted()) { + log.warn("设备【{}】启动app时前停止。。。。。。。。。。", deviceInfo.getDeviceId()); + throw new ExecuteException("执行停止"); + } + boolean appInstalled = isAppInstalled(appPackage); + if (!appInstalled) { + throw new ExecuteException(String.format("应用【%s】未安装", appName)); + } + + if (this.deviceDriver instanceof MobileDriver) { + log.debug("设备【{}】采取自研自动化重新启动App....................",this.deviceInfo.getDeviceId()); + String uuid = this.deviceInfo.getDeviceId(); + IosUtil.terminateApp(uuid, appPackage, remoteAddress); + } else { + log.debug("设备【{}】采取appium自动化....................",this.deviceInfo.getDeviceId()); + AppiumDriver deviceDriver = (AppiumDriver) this.deviceDriver; + if (deviceDriver instanceof AndroidDriver) { + try { + deviceDriver.terminateApp(appPackage); + } catch (WebDriverException e) { + log.warn("设备【{}】在关闭应用【{}】时,driver出现问题,重新执行。。。。。", deviceInfo.getDeviceId(), appPackage); + try { + Thread.sleep(1000); + } catch (InterruptedException interruptedException) { + log.warn("设备【{}】关闭app前停止。。。。。。。。。。", deviceInfo.getDeviceId()); + throw new ExecuteException("执行停止"); + } + deviceDriver.terminateApp(appPackage); + } + } else if (deviceDriver instanceof IOSDriver) { + String uuid = (String) deviceDriver.getCapabilities().getCapability(UDID); + IosUtil.terminateApp(uuid, appPackage, remoteAddress); + } + } + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + log.warn("设备【{}】启动app前停止。。。。。。。。。。", deviceInfo.getDeviceId()); + throw new ExecuteException("执行停止"); + } + activateApp(appPackage); + } + + /** + * 停止回放 + * + * @param config 参数 + */ + @Override + public void stopPlay(Map config) { + log.info("正在停止回放。。。"); + Future future = this.deviceDriver.getFuture(); + if (null != future) { + future.cancel(true); + } + } + + @Override + public void close() { + super.close(); + this.keepThread.interrupt(); + } + + @Override + public boolean reconnect() { + this.keepThread.interrupt(); + if (this.deviceDriver != null) { + this.deviceDriver.destroy(); + log.debug("MobileDeviceConnection.reconnect:设备【{}-{}】的driver释放",deviceInfo.getDeviceId(), deviceInfo.getConnectAddress()); + this.deviceDriver = null; + } + initDriver(); + if (null != this.deviceDriver) { + return true; + } + return false; + } + + @Override + public void recordDevicePer(Map params) { + //通知上位机开始获取设备和应用的性能数据 + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setConnectTimeout(PER_CONNECT_TIMEOUT); + factory.setReadTimeout(PER_READ_TIMEOUT); + RestTemplate restTemplate = new RestTemplate(factory); + params.put("platform", deviceInfo.getPlatform()); + params.put("deviceId", deviceInfo.getDeviceId()); + HttpEntity> entity = new HttpEntity<>(params); + try { + ResponseEntity responseEntity = restTemplate.exchange(String.format(RECORD_DEVICE_PER, deviceInfo.getConnectAddress() + ":" + (null == deviceInfo.getPort() ? defaultUpperPort : deviceInfo.getPort())), HttpMethod.POST, entity, Boolean.class); + Boolean success = responseEntity.getBody(); + if (success) { + log.debug("上位机开启记录设备【{}】性能数据", deviceInfo.getDeviceId()); + } else { + throw new ExecuteException("开启监控设备性能失败"); + } + } catch (ExecuteException e) { + throw e; + } catch (Exception e) { + log.error("开启监控设备性能失败", e); + throw new ExecuteException("开启监控设备性能失败"); + } + + } + + @Override + public DevicePerInfo stopRecordDevicePer() { + log.debug("是否开启录屏:{}", isRecord); + if (isRecord) { //开启录屏 + //通知上位机开始获取设备和应用的性能数据 + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setConnectTimeout(PER_CONNECT_TIMEOUT); + factory.setReadTimeout(PER_READ_TIMEOUT); + RestTemplate restTemplate = new RestTemplate(factory); + HashMap params = new HashMap(); + params.put("caseId", devicePerInfo.getCaseId()); + params.put("platform", deviceInfo.getPlatform()); + params.put("deviceId", deviceInfo.getDeviceId()); + HttpEntity> entity = new HttpEntity<>(params); + try { + ResponseEntity responseEntity = restTemplate.exchange(String.format(STOP_RECORD_DEVICE_PER, deviceInfo.getConnectAddress() + ":" + (null == deviceInfo.getPort() ? defaultUpperPort : deviceInfo.getPort())), HttpMethod.POST, entity, String[].class); + String[] result = responseEntity.getBody(); + if (result != null && result.length == 2) { + log.debug("上位机停止记录设备【{}】性能数据成功,app数据地址:{},设备数据地址:{}", deviceInfo.getDeviceId(), result[1], result[0]); + devicePerInfo.setDevicePerInfoAddress(result[0]); + devicePerInfo.getAppPerInfo().setAppPerInfoAddress(result[1]); + } else { + log.debug("上位机停止记录设备【{}】性能数据失败", deviceInfo.getDeviceId()); + devicePerInfo.setDevicePerInfoAddress(""); + devicePerInfo.getAppPerInfo().setAppPerInfoAddress(""); + } + } catch (Exception e) { + log.debug("上位机停止记录设备【{}】性能数据失败", deviceInfo.getDeviceId()); + devicePerInfo.setDevicePerInfoAddress(""); + devicePerInfo.getAppPerInfo().setAppPerInfoAddress(""); + } + } + return devicePerInfo; + } + @Override + public String snapshotAllScreen(String tenantId, String taskId) { + return AndroidUtil.snapshotAllScreen(this.remoteAddress, deviceInfo, tenantId,taskId); + + } +} \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/MobileDeviceDriver.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/MobileDeviceDriver.java new file mode 100644 index 0000000..ee85985 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/MobileDeviceDriver.java @@ -0,0 +1,37 @@ +package net.northking.cctp.se.device.bean; + +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.element.core.DeviceDriver; +import net.northking.cctp.mobile.driver.driver.MobileDriver; + +import java.net.URISyntaxException; +import java.util.concurrent.Future; + +@Slf4j +public class MobileDeviceDriver extends MobileDriver implements DeviceDriver { + + + public MobileDeviceDriver(String upperUrl, String deviceId, String type) throws URISyntaxException { + super(upperUrl, deviceId, type); + } + + @Override + public void destroy() { + try { + log.debug("进入destroy方法"); + super.destroyDriver(); + } catch (Exception e) { + log.error("destroy失败,e:", e); + } + } + + @Override + public void setFuture(Future future) { + + } + + @Override + public Future getFuture() { + return null; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/MobileDriverKeepThread.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/MobileDriverKeepThread.java new file mode 100644 index 0000000..d86ea14 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/MobileDriverKeepThread.java @@ -0,0 +1,46 @@ +package net.northking.cctp.se.device.bean; + +import io.appium.java_client.AppiumDriver; +import net.northking.cctp.element.core.DeviceDriver; +import org.openqa.selenium.ScreenOrientation; +import org.openqa.selenium.WebElement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MobileDriverKeepThread extends Thread{ + + private DeviceDriver driver; + + private Logger logger = LoggerFactory.getLogger(MobileDriverKeepThread.class); + + private int waitTime; + + private String deviceId; + + public MobileDriverKeepThread(DeviceDriver driver, int waitTime,String deviceId) { + this.driver = driver; + this.waitTime = waitTime; + this.deviceId = deviceId; + } + + @Override + public void run() { + while (!isInterrupted()) { + if (driver instanceof MobileDeviceDriver) { + MobileDeviceDriver deviceDriver = (MobileDeviceDriver) driver; + deviceDriver.send("ping"); + } else { + AppiumDriver deviceDriver = (AppiumDriver) driver; + deviceDriver.getOrientation(); + } + logger.info("设备【{}】的driver存活。。。。。。。。。。。。",deviceId); + try { + Thread.sleep(50 * 1000); + } catch (InterruptedException e) { + break; + } + } + logger.info("设备【{}】driver守护线程已终止.......................................",this.deviceId); + } + +} \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/PCDeviceConnection.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/PCDeviceConnection.java new file mode 100644 index 0000000..f75e6a5 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/PCDeviceConnection.java @@ -0,0 +1,405 @@ +package net.northking.cctp.se.device.bean; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.common.enums.FileBusinessTypeEnum; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.pc.driver.dto.EngineResultDto; +import net.northking.cctp.pc.driver.socket.PCDriver; +import net.northking.cctp.se.file.Attachment; +import net.northking.cctp.se.util.HttpUtils; +import net.northking.cctp.se.util.JsonUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpEntity; + +import java.io.File; +import java.net.MalformedURLException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + +@Slf4j +public class PCDeviceConnection extends AbstractDeviceConnection { + + public static final int DEFAULT_TIMEOUT = 31; + + public static final String TENANT_ID = "tenantId"; + public static final String ENV_TYPE = "envType"; + public static final String BROWSER_TYPE = "browserType"; + public static final String PROJECT_ID = "projectId"; + public static final String ENV_ID = "envId"; + public static final String SYS_NAME = "sysName"; + public static final String URL = "url"; + public static final String TEST_SYS_ADDRESS = "testSysAddress"; + public static final String DEVICE_ID = "deviceId"; + public static String userName = "deviceId"; + public static String password = "deviceId"; + private int width = 1366; // 默认分辨率 宽 + private int height = 768; // 默认分辨率 高 + + private String remoteIp = null; // 本机ip + private String remotePort; // 远程默认端口 + private String remoteType; // 默认为rdp协议 + + private String testSysRemoteAddress; + + public PCDeviceConnection(String deviceToken,DeviceInfo deviceInfo) throws Exception{ + super(deviceToken,deviceInfo); + if (deviceInfo.getOtherInfo().get("width") != null && deviceInfo.getOtherInfo().get("height") != null) { + this.width = Integer.parseInt(deviceInfo.getOtherInfo().get("width")); + this.height = Integer.parseInt(deviceInfo.getOtherInfo().get("height")); + } + if (deviceInfo.getOtherInfo().get("userName") != null && deviceInfo.getOtherInfo().get("password") != null) { + this.userName = deviceInfo.getOtherInfo().get("userName"); + this.password = deviceInfo.getOtherInfo().get("password"); + } + this.testSysRemoteAddress = deviceInfo.getOtherInfo().get(TEST_SYS_ADDRESS); + } + + @Override + protected void initDriver() throws MalformedURLException { + // 创建webSocket连接 + if (ObjectUtil.isNull(this.deviceInfo)){ + throw new RuntimeException("设备信息不存在"); + } + String address = this.deviceInfo.getConnectAddress(); + if (StrUtil.isBlank(address)){ + throw new RuntimeException("设备地址信息不存在"); + } + this.deviceDriver = new PCDeviceDriver(address); + } + + @Override + public void initConfig(Map config) { + // 初始化pc执行环境 + log.info("初始化pc执行环境..."); + int envType = EnvType.CS.code; + if (config.get(PCDeviceConnection.PROJECT_ID) != null + && config.get(PCDeviceConnection.ENV_ID) != null){ + envType = EnvType.BS.code; + } + + log.info("pc执行环境类型 => {}", envType); + // 是否调试,默认false + boolean debug = false; + + if(null != config.get("debug")){ + debug = (Boolean) config.get("debug"); + } + Map initEnvMap = new HashMap<>(5); + String cmd = "InitEnv"; + initEnvMap.put("cmd", cmd); + initEnvMap.put("seqId", IdUtil.simpleUUID()); + initEnvMap.put("envType", envType); + // 判断B/S + if (envType == EnvType.BS.code) { + // 默认是ie + int browserType = 1; + if (ObjectUtil.isNotNull(config.get(BROWSER_TYPE))) { + browserType = Integer.parseInt(config.get(BROWSER_TYPE).toString()); + } + Object projectIdObj = config.get(PROJECT_ID); + if (projectIdObj == null || StrUtil.isBlankIfStr(projectIdObj)){ + throw new ExecuteException("获取被测系统地址参数[ " + PROJECT_ID +" ]为空"); + } + Object envIdObj = config.get(ENV_ID); + if (envIdObj == null || StrUtil.isBlankIfStr(envIdObj)){ + throw new ExecuteException("获取被测系统地址参数[ " + ENV_ID +" ]为空"); + } + Object sysNameObj = config.get(SYS_NAME); + if (sysNameObj == null || StrUtil.isBlankIfStr(sysNameObj)){ + throw new ExecuteException("获取被测系统地址参数[ " + SYS_NAME +" ]为空"); + } + String url = getSysUrl(config); + if (StrUtil.isBlank(url)){ + throw new ExecuteException("获取的被测系统地址为空"); + } + log.debug("浏览器打开网址:{},浏览器类型为:{}", url, browserType); + initEnvMap.put("browserType", browserType); + initEnvMap.put("url", url); + } + initEnvMap.put("debug", debug); + + initEnvMap.put("width", width); + initEnvMap.put("height", height); + initEnvMap.put("userName", this.userName); + initEnvMap.put("password", this.password); + + // 增加字段适配RDPProxy + initEnvMap.put("remoteIp",this.deviceInfo.getOtherInfo().get("remoteIp")); + initEnvMap.put("remotePort",this.deviceInfo.getOtherInfo().get("remotePort")); + initEnvMap.put("remoteType",StringUtils.lowerCase(this.deviceInfo.getOtherInfo().get("remoteType"))); + + // 增加是否截图字段:takeScreen 0-不截图 1-全截图 2-异常截图 + if (debug) { + initEnvMap.put("takeScreen", 0); + } else { + int flag = 0; + if (config.get("takeScreen") != null) { + try { + flag = Integer.parseInt(config.get("takeScreen").toString()); + } catch (Exception e) { + log.error("初始化参数takeScreen异常:{}", config.get("takeScreen"), e); + } + } + initEnvMap.put("takeScreen", flag); + } + + // 发送webSocket消息至PC执行机 + log.info("pc init env send => " + JSONUtil.toJsonStr(initEnvMap)); + commonSendAndReturn(cmd, initEnvMap, (PCDriver) this.deviceDriver); + } + + private String getSysUrl(Map config){ + Map params = new HashMap<>(); + params.put("projectId", config.get(PROJECT_ID).toString()); + params.put("envId", config.get(ENV_ID).toString()); + params.put("sysName", config.get(SYS_NAME).toString()); + log.debug("查询被测系统URL参数 => {}", JSONUtil.toJsonStr(params)); + HttpEntity> entity = new HttpEntity<>(params); + ResultWrapper result = null; + try { + result = HttpUtils.doPost(testSysRemoteAddress, entity, ResultWrapper.class); + }catch (Exception e){ + log.error("根据项目环境和系统名称获取被测系统url异常", e); + } + if (result == null){ + throw new ExecuteException("获取被测系统地址失败"); + } + if (!result.isSuccess()) { + throw new ExecuteException("获取被测系统地址失败,"+ result.getMessage()); + } + if (result.getData() == null) { + throw new ExecuteException("获取被测系统地址失败,该环境下的被测系统地址为空,请检查"); + } + return result.getData().toString(); + } + + @Override + public void restart(Map config){ + // 默认是ie + int browserType = 1; + String url = ""; + if (CollUtil.isNotEmpty(config)){ + if (ObjectUtil.isNotNull(config.get(BROWSER_TYPE))){ + browserType = Integer.parseInt(config.get(BROWSER_TYPE).toString()); + } + url = getSysUrl(config); + } + Map restartMap = new HashMap<>(4); + String cmd = "RestartBrowser"; + restartMap.put("cmd", cmd); + restartMap.put("seqId", IdUtil.simpleUUID()); + restartMap.put("browserType", browserType); + restartMap.put("url", url); + + // 发送webSocket消息至PC执行机 + log.info("pc restart browser send => " + JSONUtil.toJsonStr(restartMap)); + commonSendAndReturn(cmd, restartMap, (PCDriver) this.deviceDriver); + } + + @Override + public void startRecord() { + Map recordingMap = new HashMap<>(2); + String cmd = "Recording"; + recordingMap.put("cmd", cmd); + recordingMap.put("seqId", IdUtil.simpleUUID()); + recordingMap.put("switch", "on"); + // 发送webSocket消息至PC执行机 + log.info("pc recording send => " + JSONUtil.toJsonStr(recordingMap)); + commonSendAndReturn(cmd, recordingMap, (PCDriver) this.deviceDriver); + } + + @Override + public String stopRecord(Map initData) { + if (ObjectUtil.isNull(initData.get(TENANT_ID))){ + throw new RuntimeException("租户编号不能为空"); + } + if (ObjectUtil.isNull(initData.get("save"))){ + throw new RuntimeException("视频保存标识不能为空"); + } + Map recordingMap = new HashMap<>(2); + String cmd = "Recording"; + recordingMap.put("cmd", cmd); + recordingMap.put("seqId", IdUtil.simpleUUID()); + recordingMap.put("switch", "off"); + // 发送webSocket消息至PC执行机 + log.info("pc recording send => " + JSONUtil.toJsonStr(recordingMap)); + String offResult = commonSendAndReturn(cmd, recordingMap, (PCDriver) this.deviceDriver); + if (StrUtil.isBlank(offResult)){ + log.error("offResult => " + JSONUtil.toJsonStr(offResult)); + throw new RuntimeException("停止录制组件结果异常"); + } + Boolean save = (Boolean) initData.get("save"); + if (!save){ + log.info("无需保存视频文件"); + return ""; + } + EngineResultDto engineResult = JSONUtil.toBean(offResult, EngineResultDto.class); + String localPath = engineResult.getValue(); + log.debug("localPath = " + localPath); + if (StrUtil.isEmpty(localPath)) { + throw new RuntimeException("视频地址不能为空"); + } + File file = FileUtil.newFile(localPath); + if (FileUtil.isEmpty(file)) { + throw new RuntimeException("视频文件不能为空"); + } + String tenantId = initData.get(TENANT_ID).toString(); + try { + // 改成http上传 2023.3.1 jieying.li +// NKFile nkFile = simpleStorageService.upload(tenantId, FileUtil.newFile(localPath), true); + Attachment upload = HttpUtils.upload(localPath, tenantId, (String) initData.get("taskId"), FileBusinessTypeEnum.PC_TASK_VIDEO.getCode()); + if (ObjectUtil.isNull(upload) || StringUtils.isBlank(upload.getId())){ + throw new RuntimeException("视频文件上传信息为空"); + } + return upload.getUrlPath(); + }catch (Exception e){ + log.error("文件上传失败", e); + throw new RuntimeException(e.getMessage()); + } + } + + @Override + public void startLog() { + + } + + @Override + public String stopLog() { + return null; + } + + @Override + public String snapshot(Map initData) { + if (ObjectUtil.isNull(initData.get(TENANT_ID))){ + throw new RuntimeException("租户编号不能为空"); + } + Map takeScreenMap = new HashMap<>(2); + String cmd = "EngineTakeScreen"; + takeScreenMap.put("cmd", cmd); + takeScreenMap.put("seqId", IdUtil.simpleUUID()); + // 发送webSocket消息至PC执行机 + log.info("pc snapshot send => " + JSONUtil.toJsonStr(takeScreenMap)); + String takeScreenResult = commonSendAndReturn(cmd, takeScreenMap, (PCDriver) this.deviceDriver); + if (StrUtil.isBlank(takeScreenResult)){ + log.error("takeScreenResult => " + JSONUtil.toJsonStr(takeScreenResult)); + throw new RuntimeException("截图组件结果异常"); + } + EngineResultDto engineResult = JSONUtil.toBean(takeScreenResult, EngineResultDto.class); + String localPath = engineResult.getValue(); + log.debug("localPath = " + localPath); + if (StrUtil.isEmpty(localPath)) { + throw new RuntimeException("截图地址不能为空"); + } + String tenantId = initData.get(TENANT_ID).toString(); + try { + log.debug("截图上传入参tenantId:{}",tenantId); + log.debug("截图上传入参initData:{}", JSONObject.toJSONString(initData)); + log.debug("截图入参taskId,{}", initData.get("taskId")); + String filename = localPath.substring(localPath.lastIndexOf("\\") + 1); + Attachment upload = HttpUtils.upload(localPath, tenantId, (String)initData.get("taskId"), FileBusinessTypeEnum.PC_TASK_SCREENSHOT.getCode()); + if (ObjectUtil.isNull(upload) || StringUtils.isBlank(upload.getId())){ + throw new RuntimeException("截图文件上传信息为空"); + } + return upload.getUrlPath(); + }catch (Exception e){ + log.error("截图上传失败", e); + throw new RuntimeException(e.getMessage()); + } + } + + @Override + public String snapshotAllScreen(String tenantId, String taskId) { + Map dataMap = new HashMap<>(); + dataMap.put(TENANT_ID, tenantId); + dataMap.put("taskId",taskId); + return snapshot(dataMap); + } + + @Override + public void stopPlay(Map config){ + Map stopPlayMap = new HashMap<>(2); + String cmd = "StopPlay"; + stopPlayMap.put("cmd", cmd); + stopPlayMap.put("seqId", IdUtil.simpleUUID()); + // 发送webSocket消息至PC执行机 + log.info("pc stopPlay send => " + JSONUtil.toJsonStr(stopPlayMap)); + commonSendAndReturn(cmd, stopPlayMap, (PCDriver) this.deviceDriver); + } + + /** + * 通用发送与返回结果处理 + * @param params 发送参数 + * @param pcDriver 驱动 + * @return 结果 + */ + private static String commonSendAndReturn(String cmd, Map params, PCDriver pcDriver){ + try { + pcDriver.semaphore = new Semaphore(0); + pcDriver.send(JSONUtil.toJsonStr(params)); + if (!pcDriver.semaphore.tryAcquire(DEFAULT_TIMEOUT, TimeUnit.SECONDS)) { + throw new RuntimeException("指令[" + cmd + "]执行超时"); + } + if (StrUtil.isBlank(pcDriver.resResult)) { + throw new RuntimeException("指令[" + cmd + "]执行结果为空"); + } + EngineResultDto engineResult = JSONUtil.toBean(pcDriver.resResult, EngineResultDto.class); + log.debug("receive robot result to engine -> {}", JsonUtils.toJson(engineResult)); + String requestId = params.get("seqId").toString() + "-" + cmd; + String resultId = engineResult.getSeqId() + "-" + engineResult.getCmd(); + if (requestId.equals(resultId)) { + if (!engineResult.getState().equals(0)) { + throw new RuntimeException(engineResult.getMsg()); + } else { + return JSONUtil.toJsonStr(engineResult); + } + } else { + log.debug("requestId != resultId"); + log.info("请求与响应不对应,再获取一次"); + if (!pcDriver.semaphore.tryAcquire(DEFAULT_TIMEOUT, TimeUnit.SECONDS)) { + throw new RuntimeException("指令[" + cmd + "]执行超时"); + } + if (StrUtil.isBlank(pcDriver.resResult)) { + throw new RuntimeException("指令[" + cmd + "]执行结果为空"); + } + engineResult = JSONUtil.toBean(pcDriver.resResult, EngineResultDto.class); + log.debug("receive robot another result to engine -> {}", JsonUtils.toJson(engineResult)); + } + return JSONUtil.toJsonStr(engineResult); + }catch (Exception e){ + log.error("通讯发生异常", e); + throw new RuntimeException(e.getMessage()); + } + } + + public enum EnvType { + BS(1, "B/S环境"), + CS(2, "C/S环境"); + + private final Integer code; + + private final String msg; + + EnvType(Integer code, String msg) { + this.code = code; + this.msg = msg; + } + + public Integer getCode() { + return code; + } + + public String getMsg() { + return msg; + } + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/PCDeviceDriver.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/PCDeviceDriver.java new file mode 100644 index 0000000..542ef1a --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/bean/PCDeviceDriver.java @@ -0,0 +1,77 @@ +package net.northking.cctp.se.device.bean; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.element.core.DeviceDriver; +import net.northking.cctp.pc.driver.dto.EngineResultDto; +import net.northking.cctp.pc.driver.socket.PCDriver; + +import javax.websocket.CloseReason; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +/** + *

Title: PCDeviceDriver

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/11/07 + *

Copyright: NorthKing@RPA(C)2020 版权

+ */ +@Slf4j +public class PCDeviceDriver extends PCDriver implements DeviceDriver { + + public static final int DEFAULT_TIMEOUT = 31; + + public PCDeviceDriver(String address) { + super(address); + } + + @SneakyThrows + @Override + public void destroy() { + log.info(" PC driver destroyed ... "); + Map completeMap = new HashMap<>(2); + String cmd = "Complete"; + completeMap.put("cmd", cmd); + completeMap.put("seqId", IdUtil.simpleUUID()); + // 发送webSocket消息至PC执行机 + log.info("pc complete send => " + JSONUtil.toJsonStr(completeMap)); + try { + this.send(JSONUtil.toJsonStr(completeMap)); + if (!this.semaphore.tryAcquire(DEFAULT_TIMEOUT, TimeUnit.SECONDS)) { + throw new RuntimeException("指令[" + cmd + "]执行超时"); + } + if (StrUtil.isBlank(this.resResult)) { + throw new RuntimeException("指令[" + cmd + "]执行结果为空"); + } + EngineResultDto engineResult = JSONUtil.toBean(this.resResult, EngineResultDto.class); + if (!engineResult.getState().equals(0)){ + throw new RuntimeException(engineResult.getMsg()); + } + log.info("clear execute env result => " + JSONUtil.toJsonStr(engineResult)); + }catch (Exception e){ + throw new RuntimeException(e.getMessage()); + } + log.info("clean script execute env success .... "); + // 关闭和机器人的连接 + this.webSocketClient.close(CloseReason.CloseCodes.NORMAL_CLOSURE.getCode(), "关闭与机器人的连接"); + } + + //这两个是手机端使用的,PC不需要实现 + @Override + public void setFuture(Future future) { + + } + + @Override + public Future getFuture() { + return null; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/service/DeviceConnection.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/service/DeviceConnection.java new file mode 100644 index 0000000..2d3fb77 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/service/DeviceConnection.java @@ -0,0 +1,102 @@ +package net.northking.cctp.se.device.service; + +import net.northking.cctp.element.core.DeviceDriver; +import net.northking.cctp.se.device.bean.DeviceInfo; +import net.northking.cctp.se.device.bean.DevicePerInfo; + +import java.util.Map; + +public interface DeviceConnection { + /** + * 获取设备ID + * @return + */ + String getDeviceId(); + + /** + * 获取devicetoken + * @return + */ + String getDeviceToken(); + /** + * 获取设备驱动 + * @return + */ + DeviceDriver getDeviceDriver(); + /** + * 获取关联设备信息 + * @return + */ + DeviceInfo getDeviceInfo(); + + /** + * 销毁连接 + */ + void close(); + /** + * 响应设备初始化事件 + * @param config + */ + void initConfig(Map config); + /** + * 启动录屏 + */ + void startRecord(); + /** + * 停止录屏 + * @return 录屏文件地址或文件服务器文件ID + */ + String stopRecord(Map initData); + /** + * 启动日志采集 + */ + void startLog(); + /** + * 停止日志采集 + * @return 日志文件地址或文件服务器文件ID + */ + String stopLog(); + /** + * 截取屏幕操作 + * @return 截图文件地址 + * @param initData + */ + String snapshot(Map initData); + + /** + * 截全屏 + * @param userToken 用戶token,截圖時上傳到文件服務器需要 + * @return + */ + String snapshotAllScreen(String userToken, String taskId); + + /** + * 重启 + * @param config 参数 + */ + void restart(Map config); + + /** + * 停止回放 + * @param config 参数 + */ + void stopPlay(Map config); + + /** + * 重新连接driver + */ + boolean reconnect(); + + /** + * 记录设备性能 + * @param params + */ + void recordDevicePer(Map params); + + + /** + * 停止记录设备性能 + * @return + */ + DevicePerInfo stopRecordDevicePer(); +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/service/DeviceConnectionService.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/service/DeviceConnectionService.java new file mode 100644 index 0000000..addecad --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/service/DeviceConnectionService.java @@ -0,0 +1,36 @@ +package net.northking.cctp.se.device.service; + + +import net.northking.cctp.se.device.bean.DeviceInfo; + + +/** + * 设备连接管理服务 + */ +public interface DeviceConnectionService { + + /** + * 根据设备token从服务端获取设备信息 + * @param deviceToken + * @return + */ + DeviceInfo loadDeviceInfo(String deviceToken); + /** + * 创建设备连接 + * @param deviceToken + * @return + */ + DeviceConnection createDeviceConnection(String deviceToken) throws Exception; + /** + * 销毁设备连接 + * @param deviceId + */ + void closeDeviceConnection(String deviceId); + + /** + * 将设备连接对象移除集合 + * + * @param deviceId + */ + DeviceConnection removeFromMap(String deviceId); +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/service/impl/DeviceConnectionManager.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/service/impl/DeviceConnectionManager.java new file mode 100644 index 0000000..43a4b08 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/device/service/impl/DeviceConnectionManager.java @@ -0,0 +1,166 @@ +package net.northking.cctp.se.device.service.impl; + +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.se.config.AtuServerConfig; +import net.northking.cctp.se.device.bean.DeviceInfo; +import net.northking.cctp.se.device.bean.MobileDeviceConnection; +import net.northking.cctp.se.device.bean.PCDeviceConnection; +import net.northking.cctp.se.device.service.DeviceConnection; +import net.northking.cctp.se.device.service.DeviceConnectionService; +import net.northking.cctp.se.util.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Slf4j +@Component +public class DeviceConnectionManager implements DeviceConnectionService { + private Map deviceConnectionMap = new ConcurrentHashMap<>(); + + @Autowired + private AtuServerConfig atuServerConfig; + + @Autowired + private RestTemplate restTemplate; + + /** + * 根据设备token从服务端获取设备信息 + * @param deviceToken + * @return + */ + public DeviceInfo loadDeviceInfo(String deviceToken) { + String url = atuServerConfig.getServerUrl() + atuServerConfig.getDeviceInfoPath() + deviceToken; + ResponseEntity resEntity = restTemplate.getForEntity(url, Map.class); + Map resultBody = resEntity.getBody(); + DeviceInfo deviceInfo = new DeviceInfo(); + if (resultBody != null && (boolean)resultBody.get("success") && resultBody.get("data") != null) { // 请求成功,获取到设备信息 + Map data = (Map) resultBody.get("data"); + log.info("设备【token-{}】请求结果:{}", deviceToken, JsonUtils.toJson(data)); + if (data.get("cdMobileDevice") != null) { // 是移动设备 + deviceInfo.setMobile(true); + deviceInfo.setConnectAddress(((Map)(data.get("cdDeviceCtrl"))).get("ctrlIp").toString()); // 上位机ip + deviceInfo.setDeviceId(((Map)(data.get("cdMobileDevice"))).get("id").toString()); // 设备id + deviceInfo.setPlatform(((Map)(data.get("cdMobileDevice"))).get("platform").toString()); + deviceInfo.setSystemVersion(((Map)(data.get("cdMobileDevice"))).get("platformVersion").toString()); + deviceInfo.setResolution(((Map)(data.get("cdDeviceModel"))).get("resolution").toString()); + deviceInfo.setPort(((Map)(data.get("cdDeviceCtrl"))).get("ctrlPort").toString()); + if ("1".equals(deviceInfo.getPlatform())) { //ios + Map deviceMap = (Map) data.get("deviceInfo"); + Object wdaUrl = deviceMap.get("wdaUrl"); + if (null != wdaUrl) { + deviceInfo.setWdaAddress(wdaUrl + ""); + } + } else if ("0".equals(deviceInfo.getPlatform())){ //android + Map deviceMap = (Map) data.get("deviceInfo"); + Object forwardPort = deviceMap.get("forwardPort"); + log.debug("拿到设备【{}】在上位机用于adb转发的端口:{}",deviceInfo.getDeviceId(),forwardPort); + deviceInfo.setForwardPort(Integer.parseInt(forwardPort+"")); + } + } else { // pc设备 + deviceInfo.setMobile(false); + Map pcInfo = (Map) (data.get("cdPcDevice")); + deviceInfo.setConnectAddress(pcInfo.get("ipAddr").toString() + ":5589"); + deviceInfo.setDeviceId(pcInfo.get("id").toString()); + if (null == deviceInfo.getOtherInfo()) { + deviceInfo.setOtherInfo(new HashMap<>()); + } + deviceInfo.getOtherInfo().put("width", pcInfo.get("width") != null ? pcInfo.get("width").toString():"1366"); + deviceInfo.getOtherInfo().put("height", pcInfo.get("height") != null ? pcInfo.get("height").toString():"768"); + // 增加查询被测系统的服务地址 + deviceInfo.getOtherInfo().put("testSysAddress", atuServerConfig.getServerUrl() + atuServerConfig.getTestSysUrl()); + // 增加获取PC设备windows账号密码,用于任务执行的时候自动解锁 + deviceInfo.getOtherInfo().put("userName", data.get("account") != null ? data.get("account").toString() : null); + deviceInfo.getOtherInfo().put("password", data.get("pwd") != null ? data.get("pwd").toString() : null); + // RDPProxy 增加配置 + deviceInfo.getOtherInfo().put("remoteIp", pcInfo.get("ipAddr") != null ? pcInfo.get("ipAddr").toString() : null); + deviceInfo.getOtherInfo().put("remotePort", pcInfo.get("remotePort") != null ? pcInfo.get("remotePort").toString() : "3389"); + deviceInfo.getOtherInfo().put("remoteType", pcInfo.get("remoteProtocol") != null ? pcInfo.get("remoteProtocol").toString() : "rdp"); + } + } + return deviceInfo; + } + + + + @Override + public DeviceConnection createDeviceConnection(String deviceToken) throws Exception { + DeviceInfo deviceInfo = loadDeviceInfo(deviceToken); + DeviceConnection deviceConnection = null; + if (deviceInfo.isMobile()){ // 移动 + Map otherInfo = deviceInfo.getOtherInfo(); + if (null == otherInfo) { + otherInfo = new HashMap<>(); + } + //todo:直接从设备信息里面拿 + otherInfo.put("appiumPort", atuServerConfig.getAppiumPort()); + otherInfo.put("appiumContextPath", atuServerConfig.getAppiumContextPath()); + deviceInfo.setOtherInfo(otherInfo); + deviceConnection = new MobileDeviceConnection(deviceToken,deviceInfo); + + + }else{ // pc脚本 + deviceConnection = new PCDeviceConnection(deviceToken,deviceInfo); + } + deviceConnectionMap.put(deviceInfo.getDeviceId(),deviceConnection); + return deviceConnection; + } + + + + @Override + public void closeDeviceConnection(String deviceId) { + DeviceConnection deviceConnection = deviceConnectionMap.remove(deviceId); + if (deviceConnection!=null){ + deviceConnection.close(); + String deviceToken = deviceConnection.getDeviceToken(); + releaseDevice(deviceToken); + } + } + + /** + * 将设备连接信息移除 + * @param deviceId + */ + @Override + public DeviceConnection removeFromMap(String deviceId) { + return deviceConnectionMap.remove(deviceId); + } + + + /** + * 调用服务端释放设备 + * @param deviceToken + */ + private void releaseDevice(String deviceToken){ + log.info("Release device by deviceToken[{}]",deviceToken); + // 释放设备 + String releaseUrl = atuServerConfig.getServerUrl() + atuServerConfig.getDeviceReleasePath() + deviceToken; + try { + ResponseEntity resultEntity = restTemplate.getForEntity(releaseUrl, ResultWrapper.class); + if (HttpStatus.OK.equals(resultEntity.getStatusCode())) { + ResultWrapper body = resultEntity.getBody(); + if (body.isSuccess()) { + if ((boolean) body.getData()) { + log.info("设备退出成功。。。。。"); + return; + } + } + } + //todo:先报错,后面做容错处理 + throw new ExecuteException("退出设备失败"); + } catch (RestClientException e) { + log.error("释放设备【{}】失败", deviceToken, e); + } catch (ExecuteException e) { + throw e; + } + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/ATUScriptInstance.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/ATUScriptInstance.java new file mode 100644 index 0000000..009fa13 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/ATUScriptInstance.java @@ -0,0 +1,75 @@ +package net.northking.cctp.se.exec; + +import net.northking.cctp.se.script.ScriptStep; +import net.northking.cctp.se.script.ScriptVariable; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 统一自动化测试脚本实例 + */ +public class ATUScriptInstance +{ + /** + * 脚本标识ID + */ + private String id; + + /** + * 脚本全局设置 + */ + private Map globalSettings = new HashMap<>(); + + /** + * 脚本参数清单 + */ + private Map variableMap = new HashMap<>(); + + /** + * 脚本步骤清单 + */ + private List commands = new ArrayList<>(); + + public String getId() + { + return id; + } + + public void setId(String id) + { + this.id = id; + } + + public Map getGlobalSettings() + { + return globalSettings; + } + + public void setGlobalSettings(Map globalSettings) + { + this.globalSettings = globalSettings; + } + + public Map getVariableMap() + { + return variableMap; + } + + public void setVariableMap(Map variableMap) + { + this.variableMap = variableMap; + } + + public List getCommands() + { + return commands; + } + + public void setCommands(List commands) + { + this.commands = commands; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/AtuExecThread.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/AtuExecThread.java new file mode 100644 index 0000000..b186941 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/AtuExecThread.java @@ -0,0 +1,13 @@ +package net.northking.cctp.se.exec; + +public interface AtuExecThread extends Runnable{ + + String TYPE_PC = "1"; + String TYPE_MOBILE = "2"; + String TYPE_INTERFACE = "3"; + + /** + * 终止任务 + */ + void destroy(String caseId); +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/DefaultExecThread.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/DefaultExecThread.java new file mode 100644 index 0000000..5093a49 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/DefaultExecThread.java @@ -0,0 +1,1057 @@ +package net.northking.cctp.se.exec; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.common.enums.FileBusinessTypeEnum; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.element.core.exception.AssertException; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.se.config.AtuServerConfig; +import net.northking.cctp.se.debug.bean.DebugerConst; +import net.northking.cctp.se.device.bean.DevicePerInfo; +import net.northking.cctp.se.device.bean.PCDeviceConnection; +import net.northking.cctp.se.device.service.DeviceConnection; +import net.northking.cctp.se.device.service.DeviceConnectionService; +import net.northking.cctp.se.dto.ScriptEngineInfo; +import net.northking.cctp.se.exec.constant.AtuExecConstant; +import net.northking.cctp.se.file.Attachment; +import net.northking.cctp.se.lifecycle.EngineRuntime; +import net.northking.cctp.se.log.bean.StepLog; +import net.northking.cctp.se.plan.AtuTaskExecHeartbeatSchedule; +import net.northking.cctp.se.plan.bean.AutoTask; +import net.northking.cctp.se.plan.bean.QuoteData; +import net.northking.cctp.se.plan.bean.TaskExecResult; +import net.northking.cctp.se.plan.servcie.PlanDeviceService; +import net.northking.cctp.se.script.bean.Script; +import net.northking.cctp.se.script.bean.ScriptStep; +import net.northking.cctp.se.script.bean.TestTarget; +import net.northking.cctp.se.script.bean.Variable; +import net.northking.cctp.se.script.core.*; +import net.northking.cctp.se.util.HttpUtils; +import net.northking.cctp.se.util.JsonUtils; +import net.northking.cctp.se.util.RegexUtils; +import net.northking.cctp.se.util.SpringUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.amqp.AmqpException; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.BeanUtils; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.util.CollectionUtils; +import org.springframework.web.client.RestTemplate; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.*; + +@Slf4j +public class DefaultExecThread implements AtuExecThread{ + + private final static String TASK_THREAD_NAME_TEMPLATE = "ExecThread-%s"; + public static final String DEVICE_INIT_FAIL_MSG = "初始化失败,原因:%s"; + + private DeviceConnection deviceConnection; + + private ScriptExecutor scriptExecutor; + + private boolean running = false; + + private Thread thread; + + private String deviceToken; + + private AutoTask task; + + private RabbitTemplate rabbitTemplate; + + private RestTemplate restTemplate; + + private boolean startRecordFlag = false; + + public DefaultExecThread(AutoTask task, String deviceToken,boolean running, RabbitTemplate rabbitTemplate) { + this.task = task; + this.deviceToken = deviceToken; + this.running = running; + this.rabbitTemplate = rabbitTemplate; + restTemplate = SpringUtils.getBean(RestTemplate.class); + } + + private ScriptRuntimeListener listener = new ScriptRuntimeListener() { + + @Override + public void doLog(IScriptRuntimeContext context, String level, String msg) { + + } + + @Override + public void doLog(IScriptRuntimeContext context, StepLog steplog) { + + } + + @Override + public void doReply(IScriptRuntimeContext context, StepExecuteResult result) { + updateTaskResult(result); + } + + @Override + public void doReply(IScriptRuntimeContext context, String cmd, String level, Object obj) { + + } + }; + + private void startRecord() { + if (!this.startRecordFlag && this.deviceConnection != null) { + try { + this.deviceConnection.startRecord(); + this.startRecordFlag = true; + log.info("开启录屏成功"); + } catch (Exception e) { + log.error("开启录屏失败", e); + } + } + } + + + @Override + public void destroy(String taskId) { + log.debug("Destroy the task:[taskId->{}]",taskId); + //任务取消更新结果 + boolean isFinish = sendCancelResult(taskId); + + this.scriptExecutor = null; + this.running = false; + try { + if (!isFinish) { + thread.interrupt(); + } + } catch (Exception e) { + log.error("线程中断异常:",e); + } + + if (this.deviceConnection != null) { + try { + this.deviceConnection.close(); + } catch(Exception e) { + log.error("任务:"+taskId+"终止断开连接异常"); + } + } + if (deviceToken != null) { + //释放设备 + releaseDevice(deviceToken); + } + this.listener = null; + log.debug("task destroyed."); + } + + private void destroyWhenTaskFinish(String taskId) { + log.debug("Destroy the finished task:[taskId->{}]",taskId); + + this.scriptExecutor = null; + this.running = false; + + if (this.deviceConnection != null) { + this.deviceConnection.close(); + } + this.listener = null; + log.debug("finished task destroyed."); + } + + private boolean sendCancelResult(String taskId) { + try { + log.debug("任务取消更新步骤结果。。。"); + ScriptStep step = (ScriptStep)this.scriptExecutor.getCurrentStep(); // // todo: 没有开始执行,导致取消任务时候空指针 + if (step == null) { + try{ + Thread.sleep(500); + } catch (InterruptedException e) { + log.error("睡眠被打断。"); + } + step = (ScriptStep)this.scriptExecutor.getCurrentStep(); + } + StepExecuteResult stepResult = createStepResult(step, taskId); + updateTaskResult(stepResult); + + log.debug("任务取消更新结果。。。"); + String fileId = uploadScriptResult(); + try { + AtuServerConfig config = SpringUtils.getBean(AtuServerConfig.class); + String url = config.getServerUrl() + config.getTaskCancelResultUrl(); + Map paramMap = new HashMap<>(); + paramMap.put("taskId",taskId); + paramMap.put("filePath",fileId); + ResponseEntity result = restTemplate.postForEntity(url, paramMap, ResultWrapper.class); + if(HttpStatus.OK.equals(result.getStatusCode())){ + log.debug("任务取消更新结果成功。。。"); + } + }catch (Exception e2){ + log.error("终止任务,结果更新失败:",e2); + } + } catch (Exception e) { + log.error("任务终止信息更新失败:",e); + return true; + } + return false; + } + + private StepExecuteResult createStepResult(ScriptStep step,String requestId) { + StepExecuteResult stepResult = new StepExecuteResult(); + stepResult.setRetId(UUIDUtil.create32UUID()); + stepResult.setSuccess(false); + stepResult.setMsg("任务已取消"); + stepResult.setStepId(step.getId()); + stepResult.setRequestId(requestId); + stepResult.getResult().put(DebugerConst.ReplyConst.KEY_STEP_ID, step.getId()); + stepResult.setFinish(true); + return stepResult; + } + + @Override + public void run() { + try { + this.thread = Thread.currentThread(); + thread.setName(String.format(TASK_THREAD_NAME_TEMPLATE,task.getTaskId().substring(0,4))); + log.debug("Task exec process thread started."); + log.debug("任务信息:"+JsonUtils.toJson(task)); + TaskExecResult execResult = initResultMsg(); + //变更任务状态为执行中 + updateExecResult(execResult,AtuExecConstant.TASK_START,""); + + Script script = null; + try { + script = initScript(execResult); + } catch (Exception e) { + log.error("脚本初始化失败:",e); + //释放设备 + releaseDevice(deviceToken); + } + + try { + //脚本执行逻辑处理 + handleAutoTask(execResult, script); + //断开连接 + destroyWhenTaskFinish(task.getTaskId()); + } catch (Exception e) { + log.error("执行异常", e); + } finally { + //释放设备 调整设备token的释放时间。 + releaseDevice(deviceToken); + } + } catch (Exception e) { + log.error("执行任务出现异常", e); + } finally { + // 用于处理运行后的对象处理 + SpringUtils.getBean(PlanDeviceService.class).removeExecThread(task.getTaskId()); + SpringUtils.getBean(ScriptResolutionService.class).removeScriptExecutor(task.getTaskId()); + SpringUtils.getBean(DeviceConnectionService.class).removeFromMap(task.getDeviceId()); + } + } + + + private void releaseDevice(String deviceToken) { + if(StringUtils.isNotBlank(deviceToken)){ + AtuServerConfig atuServerConfig = SpringUtils.getBean(AtuServerConfig.class); + String releaseUrl = atuServerConfig.getServerUrl() + atuServerConfig.getDeviceReleasePath()+deviceToken; + try { + ResponseEntity resultEntity = restTemplate.getForEntity(releaseUrl, ResultWrapper.class); + if (HttpStatus.OK.equals(resultEntity.getStatusCode())) { + ResultWrapper bodyResult = resultEntity.getBody(); + if (bodyResult.isSuccess()) { + if ((boolean) bodyResult.getData()) { + log.debug("设备退出成功。。。。。"); + } + }else{ + log.warn("设备释放异常:"+JsonUtils.toJson(bodyResult)); + } + }else{ + log.warn("设备释放异常:"+JsonUtils.toJson(resultEntity)); + } + } catch (Exception e1) { + log.error("设备退出异常:",e1); + try { + String queueName = AtuExecConstant.ENGINE_RELEASE; + String[] tokens = {deviceToken}; + rabbitTemplate.send(queueName,new Message(JSON.toJSONString(Arrays.asList(tokens)).getBytes())); + } catch (AmqpException e) { + log.error("设备退出重试异常:",e); + } + } + } + } + + private Script initScript(TaskExecResult execResult){ + Script script = null; + try { + String scriptPath = task.getScriptPath(); + script = getScriptInfo(scriptPath); + if (null == script){ + //执行失败,无效的脚本数据 + throw new ExecuteException("执行失败,无效的脚本数据"); + } + + //设置失败不继续执行 + Map globalSettings = script.getGlobalSettings(); + if(CollectionUtils.isEmpty(globalSettings)){ + globalSettings = new HashMap<>(); + } + globalSettings.put(DebugerConst.ReqConst.KEY_IGNORE_ERROR, false); + script.setGlobalSettings(globalSettings); + // 处理是否使用默认值:useDefaultValue + boolean useDefaultValue = false; + if (globalSettings.containsKey(DebugerConst.ReqConst.KEY_USE_DEFAULT_VALUE)) { + useDefaultValue = (boolean) globalSettings.get(DebugerConst.ReqConst.KEY_USE_DEFAULT_VALUE); + } else { + globalSettings.put(DebugerConst.ReqConst.KEY_USE_DEFAULT_VALUE, useDefaultValue); + } + Map caseParams = task.getCaseParams(); + Variable[] variables = script.getVariables(); + Map inputParamMap = new HashMap<>(); + if(variables!=null&&variables.length>0){ + for (Variable vb:variables) { + String name = vb.getName(); + // 传入外部参数到脚本中 + if(!CollectionUtils.isEmpty(caseParams)&&caseParams.containsKey(name)){ + String actualData = null; + if (caseParams.get(name) instanceof Map) { + // 获取引用数据 + log.debug("单元格数据:{}", caseParams.get(name)); + actualData = getQuoteData((Map)caseParams.get(name)); + } else if (caseParams.get(name) instanceof String) { + actualData = (String) caseParams.get(name); + log.debug("脚本变量名称 -> {}, value -> {}", name, caseParams.get(name)); + // 模糊数据 + if (RegexUtils.containFuzzyVar(actualData)) { + List fuzzyList = RegexUtils.extractFuzzyVar(actualData); + if (!fuzzyList.isEmpty()) { + //调用模糊数据接口 + for (String fuzzy : fuzzyList) { + String fuzzyValue = getRuleDataByName(fuzzy, task.getProjectId()); + log.debug("fuzz -> {} value -> {}", fuzzy, fuzzyValue); + actualData = RegexUtils.replace(actualData, fuzzy, fuzzyValue, RegexUtils.VarType.FUZZY); + } + } + log.debug("after replace fuzzy data -> {}", actualData); + } + } else { + actualData = String.valueOf(caseParams.get(name)); + } + // 处理是否使用默认值 + if (!useDefaultValue || StringUtils.isNotBlank(actualData)) { // 不用默认值 或者 使用默认值但是实际值不为空 + vb.setValue(actualData); + vb.setDefaultValue(actualData); + } + inputParamMap.put(name, vb.getDefaultValue()); + } + //设置脚本输出项 + if(vb.isOutput()){ + execResult.getOutputs().put(name,""); + } + } + log.debug("脚本输入项:{}", JsonUtils.toJson(variables)); + log.debug("脚本输出项:{}", JsonUtils.toJson(execResult.getOutputs())); + script.setVariables(variables); + // 发送队列更新输入参数 + updateTaskInputParam(inputParamMap); + } + + } catch (Exception e) { + log.error("脚本信息初始化失败:",e); + updateExecResult(execResult,AtuExecConstant.TASK_FAIL,"脚本信息初始化失败:"+e.getMessage()); + throw new ExecuteException("脚本信息初始化失败:"+e); + } + return script; + } + + private String getQuoteData(Map quote) { + ResponseEntity resEntity = null; + try { + QuoteData quoteData = BeanUtil.toBean(quote, QuoteData.class); + quoteData.setEnvId(task.getEnvId()); + AtuServerConfig config = SpringUtils.getBean(AtuServerConfig.class); + String url = config.getServerUrl() + config.getQuoteDataUrl(); + log.debug("环境信息:{}", task.getEnvId()); + resEntity = restTemplate.postForEntity(url, quoteData, QuoteData.class); + if (resEntity.getStatusCode() == HttpStatus.OK) { + QuoteData body = resEntity.getBody(); + if (body != null) { + return body.getValue(); + } + } + } catch (Exception e) { + if (resEntity != null) { + log.error("响应状态信息:{}", JsonUtils.toJson(resEntity.getStatusCode())); + } + log.error("引用数据转化失败", e); + } + return null; + } + + + //脚本步骤结果更新 + private void updateTaskResult(Object msg) { + log.info("将脚本步骤结果保存成文件..."); + log.debug("任务信息是否为null:{}", !Objects.isNull(task)); + if(!this.thread.isInterrupted() && !Objects.isNull(task)){ + //脚本步骤结果写入文件 + FileWriter writer = null; + try { + String message = JsonUtils.toJson(msg); + String replace = message.replace("executed", "isExecuted"); + log.debug("脚本步骤结果写入文件:"+replace); + String fileName = task.getTenantId()+"_"+task.getTaskId()+".txt"; + String rootPath = System.getProperty("user.dir"); + String filePath = rootPath+"/tmp"; + File file = new File(filePath); + if(!file.exists()){ + file.mkdirs(); + } + File stepFile = new File(filePath+"/"+fileName); + writer = new FileWriter(stepFile,true); + writer.write(replace+"\n"); + writer.flush(); + } catch (Exception e) { + log.error("步骤结果保存失败;",e); + }finally { + if (writer != null){ + try { + writer.close(); + } catch (IOException e) { + log.error("",e); + } + } + } + }else{ + log.debug("任务线程已取消不更新步骤结果。。。。"); + } + } + + /** + * 更新任务的输入参数信息 + * @param paramMap + */ + private void updateTaskInputParam(Map paramMap) { + try { + AutoTask update = new AutoTask(); + update.setCaseType(this.task.getCaseType()); + update.setTaskId(this.task.getTaskId()); + update.setCaseParams(paramMap); + log.debug("更新任务的输入参数信息:{}", JsonUtils.toJson(update)); + RabbitTemplate rabbitTemplate = SpringUtils.getBean(RabbitTemplate.class); + rabbitTemplate.convertAndSend(AtuExecConstant.TASK_INPUT_PARAM_UPDATE, JsonUtils.toJson(update)); + } catch (Exception e) { + log.error("更新任务输入参数失败", e); + } + } + + /** + * 更新任务状态 + */ + private void updateExecResult(TaskExecResult result,String type,String message) { + result.setStatus(type); + if (this.thread.isInterrupted()) { + result.setStatus(AtuExecConstant.TASK_CANCEL); + result.setMessage("线程中断,执行取消"); + } + result.resetCurrentTime(); + if (StringUtils.isNotBlank(message)) { + result.setMessage(message); + } + if (!AtuExecConstant.TASK_START.equalsIgnoreCase(type)) { + String fileId = uploadScriptResult(); + if (null != fileId) { + result.setFilePath(fileId); + } + } + log.debug("任务信息更新:" + JsonUtils.toJson(result)); + try { + RabbitTemplate rabbitTemplate = SpringUtil.getBean(RabbitTemplate.class); + rabbitTemplate.convertAndSend(AtuExecConstant.TASK_EXEC_RESULT, JsonUtils.toJson(result)); + + if (!AtuExecConstant.TASK_START.equalsIgnoreCase(type) && !AtuExecConstant.TASK_RETRY.equals(type)) { + log.debug("清理正在执行中任务数据"); + AtuTaskExecHeartbeatSchedule.execTaskMap.remove(result.getTaskId()); + } + } catch (Exception e) { + log.error("任务状态信息更新失败;", e); + } + + } + + private String uploadScriptResult(){ + File tempFile = null; + String fileId = null; + try { + String fileName = task.getTenantId()+"_"+task.getTaskId()+".txt"; + String rootPath = System.getProperty("user.dir"); + String filePath = rootPath+"/tmp/"+fileName; + tempFile = new File(filePath); + if(!tempFile.exists()){ + return fileId; + } + } catch (Exception e) { + log.error("生成临时文件失败!", e); + } + try { + log.debug("正在上传结果文件"); + // 需要改成http上传 jieying.li 2023.3.1 + if (tempFile != null && tempFile.exists()) { + Attachment attachment = HttpUtils.upload(tempFile.getAbsolutePath(), task.getTenantId(), task.getTaskId(), FileBusinessTypeEnum.TASK_EXECUTE_RESULT.getCode()); + if (attachment != null) { + fileId = attachment.getId(); + } + } + if (StringUtils.isNotBlank(fileId)) { + log.debug("文件上传成功,返回id:{}", fileId); + } + if (tempFile != null) { + boolean delete = tempFile.delete(); + log.info("删除 tempFile:{}",delete); + } + }catch (Exception e) { + log.error("文件上传失败", e); + } + return fileId; + } + + private TaskExecResult initResultMsg(){ + TaskExecResult result = new TaskExecResult(); + BeanUtils.copyProperties(task,result); + //获取引擎信息 + EngineRuntime engineRuntime = EngineRuntime.getRuntime(); + ScriptEngineInfo info = engineRuntime.getEngineInfo(); + result.setDeviceId(task.getDeviceId()); + result.setEngineId(info.getEngineId()); + return result; + } + + + private void handleAutoTask(TaskExecResult execResult,Script script){ + Map screenMap = new HashMap<>(); + screenMap.put("tenantId",task.getTenantId()); + screenMap.put("deviceToken",deviceToken); + try { + String taskType = task.getTaskType(); + log.debug("任务类型:"+taskType); + if(TYPE_PC.equalsIgnoreCase(taskType)||TYPE_MOBILE.equalsIgnoreCase(taskType)){ + //初始化设备连接 + handleDeviceEnter(execResult); + } + //开始执行脚本 + handleExecScriptStart(screenMap,execResult,script); + } catch (Exception e) { + log.error("脚本执行结束异常:",e); + //停止录屏 + boolean flag = false; + if(Integer.parseInt(task.getScreenRecordSet())!=0){ + flag = true; + } + if(this.deviceConnection!=null){ + try { + screenMap.put("save",flag); + screenMap.put("tenantId",task.getTenantId()); + screenMap.put("taskId",task.getTaskId()); + String record = this.deviceConnection.stopRecord(screenMap); + if(record!=null){ + execResult.setVideoPath(record); + } + } catch (Exception e2) { + log.error("停止录屏失败!",e2); + } + + /** + * 停止手机获取app和手机性能数据 + */ + try { + if(deviceConnection!=null&&(!this.thread.isInterrupted())){ + DevicePerInfo devicePerInfo = deviceConnection.stopRecordDevicePer(); + if(devicePerInfo != null){ + execResult.setDevicePerInfo(devicePerInfo); + } + } + } catch (Exception e2) { + log.error("停止手机获取app和手机性能失败:",e2); + } + } + if (!this.thread.isInterrupted()) { + updateExecResult(execResult, AtuExecConstant.TASK_FAIL, "脚本执行异常,原因:" + e.getMessage()); + } + } + } + + + /** + * 连接设备逻辑处理 + * + */ + private void handleDeviceEnter(TaskExecResult execResult) { + log.debug("Begin to handle device enter"); + if(StringUtils.isNotBlank(deviceToken)){ + try{ + + DeviceConnection connection = SpringUtils.getBean(DeviceConnectionService.class).createDeviceConnection(deviceToken); + if (this.scriptExecutor!=null ){//如果不为空则切换设备驱动模式 +// scriptExecutor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_DRIVER,connection.getDeviceDriver()); + this.scriptExecutor.setCurrentTaskId(task.getTaskId()); + } + if (this.deviceConnection!=null){ + this.deviceConnection.close(); + } + if(null == connection){ + log.warn("创建连接失败!"); + Thread.sleep(2000); + throw new ExecuteException("创建设备连接失败"); + } + Thread.sleep(2000); + this.deviceConnection = connection; + if(Integer.parseInt(task.getScreenRecordSet())!=0){ + Map otherInfo = deviceConnection.getDeviceInfo().getOtherInfo(); + if (null == otherInfo) { + otherInfo = new HashMap<>(); + } + otherInfo.put("taskId",task.getTaskId()); + otherInfo.put("tenantId", task.getTenantId()); + deviceConnection.getDeviceInfo().setOtherInfo(otherInfo); + } + log.debug("设备连接成功 ----> 设备token【{}】",deviceToken); + }catch (Exception e){ + log.error("连接设备失败",e); + log.debug("设备连接失败 ----> 设备token【{}】",deviceToken); + try { + Thread.sleep(2000); + } catch (Exception ex) { + log.debug(""); + } + throw new ExecuteException("设备连接失败", e); + } + } + } + + /** + * mobile设备初始化逻辑处理 + */ + private void handleMobileDeviceInit(String taskType) { + log.debug("Begin to handle mobile device init"); + + if (this.deviceConnection == null){ + log.error("初始化失败,原因:移动设备连接不存在"); + throw new ExecuteException("初始化失败,原因:移动设备连接不存在"); + } + // 开启移动设备录屏 + startRecord(); + try { + Map initData = new HashMap<>(); + initData.put("deviceId",task.getDeviceId()); + initData.put("tenantId", task.getTenantId()); + initData.put("caseId", task.getTaskId()); + initData.put("debug", false); + if(StringUtils.isNotBlank(task.getAppId())){ + String appId = task.getAppId(); + initData.put("appId",appId); + String appDownloadUrl = task.getAppDownloadUrl().replace("{appId}", appId); + initData.put("appDownloadUrl", appDownloadUrl); + + } + initData.put("forceCleanData",false); + initData.put("forceReInstall",false); + if(StringUtils.isNotBlank(task.getAppSet())){ + //清楚数据 + if("1".equalsIgnoreCase(task.getAppSet())){ + initData.put("forceCleanData",true); + } + //卸载安装 + if("2".equalsIgnoreCase(task.getAppSet())){ + initData.put("forceReInstall",true); + } + //清楚数据卸载安装 + if("3".equalsIgnoreCase(task.getAppSet())){ + initData.put("forceReInstall",true); + initData.put("forceCleanData",true); + } + } + log.debug("初始化app参数:-----> "+JsonUtils.toJson(initData)); + deviceConnection.initConfig(initData); + log.debug("移动应用初始化成功 --> ----> taskType【{}】, 设备token【{}】", taskType, deviceToken); + }catch (Exception e){ + log.warn("移动应用初始化失败",e); + if (e instanceof ExecuteException) { + throw e; + } + throw new ExecuteException("移动应用初始化失败", e); + } + } + + private Map getAppDetail(String appId){ + Map data = new HashMap<>(); + try { + AtuServerConfig config = SpringUtils.getBean(AtuServerConfig.class); + String url = config.getServerUrl() + config.getAppInfoUrl() +"?appId="+appId; + ResponseEntity result = restTemplate.getForEntity(url,ResultWrapper.class); + if(HttpStatus.OK.equals(result.getStatusCode())){ + ResultWrapper wrapper = result.getBody(); + if(wrapper.isSuccess()){ + data = (Map)wrapper.getData(); + } + } + }catch (Exception e2){ + log.error("app信息获取失败:",e2); + } + log.info("获取到app的参数详情:{}",JSON.toJSONString(data)); + return data; + } + + /** + * PC设备初始化逻辑处理 + */ + private void handlePcDeviceInit(TestTarget[] targets,int count) { + log.debug("Begin to handle pc device init"); + Map initData = new HashMap<>(); + boolean isBs = false; + if(targets.length>0){ + TestTarget target = targets[0]; + String targetType = target.getTargetType(); + if("web".equalsIgnoreCase(targetType)){ + log.debug("BS端pc应用初始化"); + isBs = true; + initData.put(PCDeviceConnection.PROJECT_ID, target.getTarget().get("projectId")); + initData.put(PCDeviceConnection.SYS_NAME, target.getTarget().get("sysName")); + } + } + if (this.deviceConnection == null){ + log.error("初始化失败,原因:{}", "pc设备连接不存在"); + throw new ExecuteException("初始化失败,原因:pc设备连接不存在"); + } + try { + initData.put(PCDeviceConnection.ENV_ID, task.getEnvId()); + initData.put(PCDeviceConnection.DEVICE_ID,task.getDeviceId()); + initData.put(PCDeviceConnection.BROWSER_TYPE,task.getBrowserType()); + + // 增加是否截图字段:takeScreen 0-不截图 1-全截图 2-异常截图 + initData.put("takeScreen", task.getScreenshotSet()); + log.debug("初始化数据:{}", initData); + if(count>0 && isBs){ + //重试 + deviceConnection.restart(initData); + }else{ + deviceConnection.initConfig(initData); + } + // 开启pc录屏 + startRecord(); + log.debug("PC应用初始化成功 --> ----> 设备token【{}】", deviceToken); + }catch (Exception e){ + String errorMsg = "PC应用初始化失败"; + log.warn(errorMsg,e); + if (e.getMessage() != null) { + errorMsg = errorMsg + "," + e.getMessage(); + } + throw new ExecuteException(errorMsg, e); + } + } + + /** + * 脚本执行逻辑处理 + */ + private void handleExecScriptStart(Map screenMap,TaskExecResult result,Script script){ + log.debug("开始解析执行脚本。。。。"); + if(StringUtils.isBlank(task.getScriptPath())){ + throw new ExecuteException("脚本地址为空无法获取脚本!"); + } + //录屏保存标识 + boolean stopRecord = false; + if(1==Integer.parseInt(task.getScreenRecordSet())){ + stopRecord = true; + } + + //设置重试次数 + int retry = 1; + if(task.getFailRetryNum()>0){ + retry = task.getFailRetryNum()+1; + } + if (AtuExecConstant.TASK_RETRY_STRATEGY_PACKAGE.equals(task.getRetryStrategy())) { // 重试策略如果是失败任务打包重试,那么重试次数应该为0,由计划执行完一轮后统一下发 + retry = 1; + } + // 创建脚本执行器 + boolean snapshot = false; + boolean errorSnapshot = false; + //全部截图 + if(1 == Integer.parseInt(task.getScreenshotSet())){ + snapshot = true; + errorSnapshot = true; + } + //失败截图 + if(2 == Integer.parseInt(task.getScreenshotSet())){ + errorSnapshot = true; + } + this.scriptExecutor = SpringUtils.getBean(ScriptResolutionService.class).getScriptExecutor(task.getTaskId()); + if (null == scriptExecutor){ + Map taskInfo = new HashMap<>(); +// taskInfo.put("scheduleId",task.getBatchId()); + taskInfo.put("scheduleId",task.getTaskId()); // 使用taskId + taskInfo.put("projectId",task.getProjectId()); + taskInfo.put("snapshot",snapshot); + taskInfo.put("errorSnapshot", errorSnapshot); + if (StringUtils.isNotBlank(task.getEnvId())) { + taskInfo.put("envId", task.getEnvId()); + } + scriptExecutor = SpringUtils.getBean(ScriptResolutionService.class).createTaskScriptRuntime(taskInfo,script); + scriptExecutor.setRuntimeListener(this.listener); + } + if (!TYPE_INTERFACE.equalsIgnoreCase(task.getTaskType())) { + scriptExecutor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_DRIVER,this.deviceConnection.getDeviceDriver()); + scriptExecutor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_CONN,this.deviceConnection); + scriptExecutor.setContextVariable(IScriptRuntimeContext.KEY_TASK_TENANT,task.getTenantId()); + } + scriptExecutor.setRequestId(task.getTaskId()); // 设置请求标识id + scriptExecutor.setContextVariable(IScriptRuntimeContext.IS_DEBUG,false); + scriptExecutor.setContextVariable(IScriptRuntimeContext.SNAPSHOT,snapshot); + scriptExecutor.setContextVariable(IScriptRuntimeContext.ERROR_SNAPSHOT,errorSnapshot); + //查询应用详情 + if (TYPE_MOBILE.equalsIgnoreCase(task.getTaskType())) { + Map appDetail = getAppDetail(task.getAppId()); + scriptExecutor.setContextVariable(IScriptRuntimeContext.APP_VERSION, appDetail.get("buildVersion")); //app版本 + } else { + log.debug("不是移动端执行,无需设置应用版本。。。。。。。。。。。。"); + } + ScriptExecuteResult executeResult = null; + //结果中展示重试次数 + int count = 0; + for (int j = 0; j < retry; j++) { + Script copyScript = ObjectUtil.cloneByStream(script); + count = j; + if(j>0){ + log.debug("第["+j+"]次重试执行脚本"); + } + try { + //初始化结果文件 + try { + String fileName = task.getTenantId()+"_"+task.getTaskId()+".txt"; + String rootPath = System.getProperty("user.dir"); + String filePath = rootPath+"/tmp/"+fileName; + File tempFile = new File(filePath); + boolean delete = tempFile.delete(); + log.info("删除 tempFile:{}",delete); + } catch (Exception e) { + log.error("文件初始化删除失败:",e); + } + executeResult = new ScriptExecuteResult(); + if(!this.thread.isInterrupted()){ + String taskType = task.getTaskType(); + log.debug("任务类型:"+taskType); + //初始化设备连接 + if(TYPE_MOBILE.equalsIgnoreCase(taskType)){ + //移动应用初始化 + handleMobileDeviceInit(taskType); + }else if(TYPE_PC.equalsIgnoreCase(taskType)){ + //初始化PC应用 + handlePcDeviceInit(copyScript.getTestTargets(),count); + } + + // 开始执行全部 + scriptExecutor.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_REQUEST, task.getCaseParams()); + // 需要重置参数数据 + scriptExecutor.reset(copyScript); + // 传入外部参数到脚本中 + + + executeResult = scriptExecutor.runScript(copyScript, executeResult); + + //判断是否重试 + if (executeResult.getResultStatus()==0) { + break; + } + }else{ + break; + } + } catch (AssertException ae) { + //断言失败 + log.error("第["+j+"]次执行任务断言失败:",ae); + if(StringUtils.isBlank(executeResult.getResultMsg())){ + executeResult.setResultMsg(ae.getMessage()); + } + executeResult.setResultStatus(2); + // 更新结果到计划服务,新增一条执行记录,用于记录任务重试 + retryExecuteCheck(j + 1 < retry, result, AtuExecConstant.TASK_ASSERT_FAIL); + }catch (Exception e) { + //执行失败 + log.error("第["+j+"]次执行任务执行失败:",e); + if(StringUtils.isBlank(executeResult.getResultMsg())){ + String msg = "任务执行失败"; + if (StringUtils.isNotBlank(e.getMessage())){ + msg = msg + ",失败原因:"+e.getMessage(); + } + executeResult.setResultMsg(msg); + } + executeResult.setResultStatus(1); + // 更新结果到计划服务,新增一条执行记录,用于记录任务重试 + retryExecuteCheck(j + 1 < retry, result, AtuExecConstant.TASK_ASSERT_FAIL); + } + } + try { + if (task.getRetryStrategy() != null && AtuExecConstant.TASK_RETRY_STRATEGY_PACKAGE.equals(task.getRetryStrategy())) { + count = task.getCurrentRetryNum(); + } + if(null==executeResult){ + if (!this.thread.isInterrupted()) { + updateExecResult(result, AtuExecConstant.TASK_FAIL, "自动重试次数:" + count + ";任务执行失败,无结果返回或未执行。"); + } + }else{ + if ((executeResult.getResultStatus()!=0) && (2 == Integer.parseInt(task.getScreenRecordSet()))) { + //出错保存录屏 + stopRecord = true; + } + if(2==executeResult.getResultStatus()){ + //断言失败增加截图 + log.debug("断言失败步骤截图!~"); + try { + DeviceConnection deviceConnection = (DeviceConnection)scriptExecutor.getContextVariable(IScriptRuntimeContext.KEY_CURRENT_CONN); + String tenantId = scriptExecutor.getContextVariable(IScriptRuntimeContext.KEY_TASK_TENANT).toString(); + String imageUrl = deviceConnection.snapshotAllScreen(tenantId, task.getTaskId()); + //放入断言失败结果中 + result.setImageUrl(imageUrl); + } catch (Exception e) { + log.error("断言失败步骤截图失败:",e); + } + } + //执行结束向结果中传递输出参数 + Map outputs = result.getOutputs(); + if(!CollectionUtils.isEmpty(outputs)){ + List stepResults = executeResult.getStepExecuteResults(); + if(!CollectionUtils.isEmpty(stepResults)){ + StepExecuteResult finalStep = stepResults.get(stepResults.size() - 1); + Map variables = (Map)finalStep.getResult().get("variables"); + for (String name:outputs.keySet()) { + try { + String value = variables.get(name); + if(null!=value){ + outputs.put(name,value); + } + } catch (Exception e) { + log.error("输出参数{}获取值异常",name,e); + } + } + } + } + try { + screenMap.put("save",stopRecord); + screenMap.put("tenantId",task.getTenantId()); + screenMap.put("taskId",task.getTaskId()); + if(deviceConnection!=null&&(!this.thread.isInterrupted())){ + //休眠2秒等待视频结束完成 + Thread.sleep(2000); + String videoPath = deviceConnection.stopRecord(screenMap); + if(null!=videoPath){ + result.setVideoPath(videoPath); + } + } + } catch (Exception e) { + log.error("停止录屏失败:",e); + } + /** + * 停止手机获取app和手机性能数据 + */ + try { + log.debug("停止手机获取app和手机性能数据"); + if(deviceConnection!=null&&(!this.thread.isInterrupted())){ + DevicePerInfo devicePerInfo = deviceConnection.stopRecordDevicePer(); + if(devicePerInfo != null){ + result.setDevicePerInfo(devicePerInfo); + } + } + } catch (Exception e) { + log.error("停止手机获取app和手机性能失败:",e); + } + String resultMsg = ""; + if(0!=executeResult.getResultStatus()){ + resultMsg = "自动重试次数:"+count+";"+executeResult.getResultMsg(); + } + if (!this.thread.isInterrupted()) { + updateExecResult(result, Integer.toString(executeResult.getResultStatus() + 2), resultMsg); + } + } + + }catch(Exception e){ + //捕获异常信息不往上抛 前面则抛出方便上层停止录屏 + log.error("执行任务异常:", e); + if (!this.thread.isInterrupted()) { + updateExecResult(result, AtuExecConstant.TASK_FAIL, "自动重试次数:" + count + ";任务执行结果返回失败,请检查引擎结果返回"); + } + + } + } + + /** + * 单条任务重试检查 + * @param result + */ + private void retryExecuteCheck(boolean forFlag, TaskExecResult result, String resultStatus) { + if (!forFlag) { + return; + } + try { + result.setNeedRetry(true); + if ((task.getRetryStrategy() != null && AtuExecConstant.TASK_RETRY_STRATEGY_SINGLE.equals(task.getRetryStrategy())) || (task.getFailRetryNum() > 0 && StringUtils.isBlank(task.getRetryStrategy()))) { // 单条重试,兼容以前没有但是重试次数不为0 + log.debug("发送信息到平台保存记录,准备重试..."); + updateExecResult(result, resultStatus, ""); + } + } catch (Exception e) { + log.error("新增任务[{}]执行记录失败", task.getTaskId(), e); + } finally { + result.setNeedRetry(false); + } + } + + private Script getScriptInfo(String scriptPath){ + AtuServerConfig config = SpringUtils.getBean(AtuServerConfig.class); + String url = config.getServerUrl() + config.getFileDownloadPath() + scriptPath; + log.debug("请求获取脚本地址:{}", url); + try { + ResponseEntity resultEntity = restTemplate.getForEntity(url, byte[].class); + if (HttpStatus.OK.equals(resultEntity.getStatusCode())) { + byte[] content = resultEntity.getBody(); + String msg = new String(content, StandardCharsets.UTF_8); + Script script = JSON.parseObject(msg).toJavaObject(Script.class); + return script; + } + } catch (Exception e) { + log.error("获取脚本信息失败:",e); + } + return null; + } + + private String getRuleDataByName(String ruleName,String proId){ + try { + AtuServerConfig config = SpringUtils.getBean(AtuServerConfig.class); + String ruleNameEncode = URLEncoder.encode(ruleName, StandardCharsets.UTF_8.name()); + String url = config.getServerUrl() + config.getRuleDataByName() + "?ruleName="+ruleNameEncode+"&proId="+proId; + ResponseEntity resultEntity = restTemplate.getForEntity(url, ResultWrapper.class); + if (HttpStatus.OK.equals(resultEntity.getStatusCode())) { + ResultWrapper bodyResult = resultEntity.getBody(); + if (bodyResult != null && bodyResult.isSuccess()) { + String data = (String) bodyResult.getData(); + return data; + } else { + log.debug("获取模糊数据失败,返回信息:{}", JsonUtils.toJson(bodyResult)); + if(bodyResult==null){ + throw new ExecuteException("获取模糊数据失败,返回信息: "+JsonUtils.toJson(bodyResult)); + }else{ + throw new ExecuteException(bodyResult.getMessage()); + } + } + } else { + log.debug("获取模糊数据失败 请求状态:{},{}", resultEntity.getStatusCode(), JsonUtils.toJson(resultEntity.getBody())); + throw new ExecuteException(resultEntity.getStatusCode().name()); + } + } catch (Exception e) { + log.error("获取模糊测试数据失败:",e); + throw new ExecuteException(e.getMessage()); + } + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/constant/AtuExecConstant.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/constant/AtuExecConstant.java new file mode 100644 index 0000000..8bd9b5c --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/exec/constant/AtuExecConstant.java @@ -0,0 +1,46 @@ +package net.northking.cctp.se.exec.constant; + +public class AtuExecConstant { + + /** + * 接口任务队列名称 + */ + public static final String INTERFACE_QUEUE_NAME = "atu.task.interface"; + + /** + * 执行任务状态 + */ + public static final String TASK_START = "1"; + public static final String TASK_SUCCESS = "2"; + public static final String TASK_FAIL= "3"; + public static final String TASK_ASSERT_FAIL = "4"; + public static final String TASK_CANCEL = "5"; + + public static final String TASK_RETRY = "10"; + + public static final String TASK_RETRY_STRATEGY_PACKAGE = "1"; + public static final String TASK_RETRY_STRATEGY_SINGLE = "2"; + + /** + * 任务结果队列 + */ + public static final String TASK_EXEC_RESULT = "execute.plan.task.exec.result"; + /** + * 任务步骤结果队列 + */ + public static final String TASK_STEP_EXEC_RESULT = "execute.plan.task.step.exec.result"; + + /** + * 引擎释放设备队列 + */ + public static final String ENGINE_RELEASE = "execute.engine.release"; + /** + * 根据设备id释放的队列 + */ + public static final String ENGINE_RELEASE_ID = "execute.engine.release.id"; + + /** + * 更新任务输入参数的队列 + */ + public static final String TASK_INPUT_PARAM_UPDATE = "execute.plan.task.input_param.update"; +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/file/Attachment.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/file/Attachment.java new file mode 100644 index 0000000..979bdec --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/file/Attachment.java @@ -0,0 +1,12 @@ +package net.northking.cctp.se.file; + +import lombok.Data; + +@Data +public class Attachment { + + private String urlPath; + + private String id; + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/DaemonProcess.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/DaemonProcess.java new file mode 100644 index 0000000..0fbca0b --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/DaemonProcess.java @@ -0,0 +1,140 @@ +package net.northking.cctp.se.lifecycle; + +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.se.lifecycle.entity.AppLifecycle; +import net.northking.cctp.se.lifecycle.win.TaskKill; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; + +@Component +public class DaemonProcess extends AppLifecycle { + + private static final Logger logger = LoggerFactory.getLogger(DaemonProcess.class); + + private ObjectMapper objectMapper = new ObjectMapper(); + + private String PID; + private final RestTemplate restTemplate; + + public DaemonProcess(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + @Override + public boolean isStarted() + { + String pid = getPid(); + + if (pid == null || "".equals(pid.trim())) + { + return false; + } + return findProcessByPid(pid).size() > 0; + } + + @Override + public void start() + { + try{ + String path = System.getProperty("user.dir")+"/../daemon/start.bat"; + String command = "cmd /c start "+path; + logger.info("启动【脚本引擎】,执行命令:{}", command); + Process process = Runtime.getRuntime().exec(command); + process.waitFor(); + }catch (Exception e){ + logger.error("启动守护进程发生异常!", e); + } + } + + @Override + public void stop() + { + shutdown(); + } + + + @Override + public void restart() + { + stop(); + start(); + } + + private int aliveCount = 0; + + private boolean count() { + boolean flag = aliveCount % 15 == 0; + if (flag) { + aliveCount = 0; + } + return flag; + } + + @Override + public boolean alive() + { + String infoUrl = "http://localhost:9528/v1/info"; + Map uriVariables = new HashMap<>(); + + try + { + boolean flag = count(); + if (flag) { + logger.debug("获取脚本引擎信息,请求接口:HTTP GET {}", infoUrl); + } + String responseBody = restTemplate.getForObject(infoUrl, String.class, uriVariables); + if (flag) { + logger.debug("收到脚本引擎信息报文:{}", responseBody); + logger.info("守护进程 ,PID={} 运行正常。",PID); + } + aliveCount++; + } catch (Exception ex) + { + logger.info("脚本引擎信息获取失败: "+ ex.getMessage()); + return false; + } + return true; + } + + @Override + public String getPid() + { + String pidFile = System.getProperty("user.dir")+"/../daemon/daemon.pid"; + try (Scanner sc = new Scanner(new FileReader(pidFile))) + { + while (sc.hasNextLine()) + { //按行读取字符串 + PID = sc.nextLine(); + } + } catch (FileNotFoundException e) + { + logger.error("守护进程的PID文件不存在!" + e.getMessage()); + } + if (count()) { + logger.debug("获取守护进程的进程号:{}", PID); + } + return PID; + } + + @Override + public void shutdown() + { + TaskKill taskKill = new TaskKill(); + taskKill.force(true); + String pid = getPid(); + if (pid != null && pid.trim().length() > 0) + { + taskKill.pid(pid); + taskKill.execute(); + logger.debug("关闭进程,根据进程号杀掉进程:PID={}", pid); + } + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/EngineDestroy.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/EngineDestroy.java new file mode 100644 index 0000000..4360169 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/EngineDestroy.java @@ -0,0 +1,18 @@ +package net.northking.cctp.se.lifecycle; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.PreDestroy; + +public class EngineDestroy +{ + private static final Logger logger = LoggerFactory.getLogger(EngineDestroy.class); + + @PreDestroy + public void destroy() + { + // TODO 资源销毁 + logger.info("临死之前我想说两句!"); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/EngineRegisterService.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/EngineRegisterService.java new file mode 100644 index 0000000..9e99724 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/EngineRegisterService.java @@ -0,0 +1,264 @@ +package net.northking.cctp.se.lifecycle; + +import com.alibaba.fastjson.JSON; +import com.sun.management.OperatingSystemMXBean; +import net.northking.cctp.se.config.AtuServerConfig; +import net.northking.cctp.se.dto.ScriptEngineInfo; +import net.northking.cctp.se.lifecycle.entity.CdEngineInfo; +import net.northking.cctp.se.lifecycle.entity.CdEngineInfoRegisterDto; +import net.northking.cctp.se.lifecycle.entity.CdEngineInfoResultDto; +import net.northking.cctp.se.lifecycle.entity.CdPcDevice; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.AmqpTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.Enumeration; + +/** + * 引擎启动注册 + */ +@Component +public class EngineRegisterService { + private static final Logger logger = LoggerFactory.getLogger(EngineRegisterService.class); + + @Autowired + private AtuServerConfig atuServerConfig; + + @Autowired + private RestTemplate restTemplate; + + @Autowired + private AmqpTemplate amqpTemplate; + + @Value("${server.port}") + private String port; + + @Value("${atu.server.engineSys}") + private String engineSys; + + private static final String localhostIp = "127.0.0.1"; + /** + * 启动时注册至平台设备管理 + * @return 设备ID + */ + public CdEngineInfoResultDto register(ScriptEngineInfo engineInfo){ + int num = 1; + boolean status = false; + CdEngineInfoResultDto registerInfo = new CdEngineInfoResultDto(); + logger.info("引擎信息 获取----------------"); + CdEngineInfoRegisterDto dto = new CdEngineInfoRegisterDto(); + try { + if("windows".equals(engineSys)){//PC端 + //获取并组装引擎信息 + setEngInfo(dto); + //获取并组装pc机器信息 + setPcInfo(dto,engineInfo); + } + if("linux".equals(engineSys)){ //linux执行机 + setEngInfoLinux(dto); + //获取并组装pc机器信息 + setPcInfoLinux(dto,engineInfo); + } + if (dto.getCdPcDevice() != null && dto.getCdPcDevice().getIpAddr() != null) { + engineInfo.setIpAddress(dto.getCdPcDevice().getIpAddr()); + } + }catch (Exception e){ + logger.info("获取引擎信息报错,停止注册----------", e); + throw new RuntimeException("停止注册"); + } + logger.info("引擎信息打印:"+ JSON.toJSONString(dto)); + String url = atuServerConfig.getServerUrl()+atuServerConfig.getEngineRegister(); + while (!status){ + logger.info("引擎注册 第{}次 开始------",num); + try { + ResponseEntity result = restTemplate.postForEntity(url,dto, CdEngineInfoResultDto.class); + if(HttpStatus.OK.equals(result.getStatusCode())){ + status=true;//注册成功 + } + registerInfo=result.getBody(); + }catch (Exception e){ + logger.info("失败原因-----------"+e.getMessage()); + } + logger.info("引擎注册 第{}次 结果------{}",num,status?"成功":"失败"); + if(!status){ + try { + logger.info("引擎注册 第{}次 等待30s--------------",num); + Thread.sleep(3000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + logger.error("",e); + } + } + num++; + } + logger.info("引擎注册 结束------"); + return registerInfo; + } + + private void setPcInfoLinux(CdEngineInfoRegisterDto dto, ScriptEngineInfo engineInfo) throws Exception{ + CdPcDevice pcInfo = new CdPcDevice(); + pcInfo.setIpAddr(getLinuxIp()); + if (atuServerConfig.getIsPcExecutor()) { + pcInfo.setDeviceName(InetAddress.getLocalHost().getHostName()); + pcInfo.setDomainName("设备域名"); + pcInfo.setOsArch(System.getProperty("os.arch")); + pcInfo.setOsName(System.getProperty("os.name")); + pcInfo.setRamSize(getMemory()); + if (!StringUtils.isBlank(atuServerConfig.getRemoteProtocol())) { + pcInfo.setRemoteProtocol(atuServerConfig.getRemoteProtocol()); + } + if (!StringUtils.isBlank(atuServerConfig.getRemotePort())) { + pcInfo.setRemotePort(atuServerConfig.getRemotePort()); + } + + } + engineInfo.setOsName(System.getProperty("os.name")); + dto.setCdPcDevice(pcInfo); + } + + private void setEngInfoLinux(CdEngineInfoRegisterDto dto) { + CdEngineInfo engInfo = new CdEngineInfo(); + engInfo.setEngineName(atuServerConfig.getEngineName()); + engInfo.setIpAddr(getLinuxIp()); + engInfo.setIpPort(port); + engInfo.setRunningRelease(atuServerConfig.getEngineVersion()); + engInfo.setEngineDesc("引擎描述"); + engInfo.setIsPcExecutor(atuServerConfig.getIsPcExecutor()); + dto.setCdEngineInfo(engInfo); + } + + + /** + * 设置引擎信息 + * @param dto + */ + private void setEngInfo(CdEngineInfoRegisterDto dto) throws Exception { + CdEngineInfo engInfo = new CdEngineInfo(); + engInfo.setEngineName(atuServerConfig.getEngineName()); + engInfo.setIpAddr(getWindowsAddress()); + engInfo.setIpPort(port); + engInfo.setRunningRelease(atuServerConfig.getEngineVersion()); + engInfo.setEngineDesc("引擎描述"); + engInfo.setIsPcExecutor(atuServerConfig.getIsPcExecutor()); + dto.setCdEngineInfo(engInfo); + } + + /** + * 设置pc机器信息 + * @param dto + */ + private void setPcInfo(CdEngineInfoRegisterDto dto,ScriptEngineInfo engineInfo)throws Exception { + CdPcDevice pcInfo = new CdPcDevice(); + pcInfo.setDeviceName(InetAddress.getLocalHost().getHostName()); + pcInfo.setDomainName("设备域名"); + pcInfo.setIpAddr(getWindowsAddress()); + pcInfo.setMacAddr(getMacAddress()); + pcInfo.setOsArch(System.getProperty("os.arch")); + pcInfo.setOsName(System.getProperty("os.name")); + pcInfo.setRamSize(getMemory()); + if (!StringUtils.isBlank(atuServerConfig.getRemoteProtocol())) { + pcInfo.setRemoteProtocol(atuServerConfig.getRemoteProtocol()); + } + if (!StringUtils.isBlank(atuServerConfig.getRemotePort())) { + pcInfo.setRemotePort(atuServerConfig.getRemotePort()); + } + dto.setCdPcDevice(pcInfo); + engineInfo.setOsName(pcInfo.getOsName()); + } + + /** + * 获取机器mac地址 + * @return + * @throws Exception + */ + private String getMacAddress() throws Exception { + byte[] macByte = NetworkInterface.getByInetAddress(InetAddress.getLocalHost()).getHardwareAddress(); + StringBuilder sb = new StringBuilder(); + for (byte b : macByte) { + sb.append("-"); + //吧byte转化为正整数 + String num = Integer.toHexString(b & 0xFF); + sb.append(num.length()==1?0+num:num); + } + return sb.toString().toUpperCase().substring(1); + } + + /** + * 获取机器内存大小 + * @return + */ + private String getMemory(){ + OperatingSystemMXBean mx = (OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean(); + int mb = 1024*1024; + return (mx.getTotalPhysicalMemorySize() / mb)+"M"; + } + + private String getLinuxIp(){ + String ip = localhostIp; + try { + for (Enumeration en = NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){ + NetworkInterface intf = en.nextElement(); + String name = intf.getName(); + if(!name.contains("docker") && !name.contains("lo")){ + for (Enumeration ipAddr = intf.getInetAddresses();ipAddr.hasMoreElements();){ + InetAddress add = ipAddr.nextElement(); + if (!add.isLoopbackAddress()) { + String address = add.getHostAddress().toString(); + if(!address.contains("::") && ! address.contains("0:0:") && !address.contains("fe80")){ + ip=address; + } + } + } + } + } + }catch (Exception e){ + logger.error("======linuxIP地址获取失败:",e); + } + logger.info("执行引擎ip -> {}", ip); + return ip; + } + + private String getWindowsAddress() { + InetAddress candidateAddress = null; + try { + Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); + while (networkInterfaces.hasMoreElements()) { + NetworkInterface iface = networkInterfaces.nextElement(); + for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements(); ) { + InetAddress inetAddr = inetAddrs.nextElement(); + if (!inetAddr.isLoopbackAddress()) { + if (inetAddr.isSiteLocalAddress()) { + candidateAddress = inetAddr; + } + if (candidateAddress == null) { + candidateAddress = inetAddr; + } + + } + } + } + + if (candidateAddress==null) { + candidateAddress = InetAddress.getLocalHost(); + } + } catch (Exception e) { + logger.error("",e); + } + String hostAddress = null; + if (candidateAddress != null) { + hostAddress = candidateAddress.getHostAddress(); + } + return hostAddress; + } + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/EngineRuntime.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/EngineRuntime.java new file mode 100644 index 0000000..2e8c29f --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/EngineRuntime.java @@ -0,0 +1,56 @@ +package net.northking.cctp.se.lifecycle; + +import net.northking.cctp.se.dto.EngineStatus; +import net.northking.cctp.se.dto.ScriptEngineInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 引擎运行时 + */ +public class EngineRuntime +{ + public static final Logger logger = LoggerFactory.getLogger(EngineRuntime.class); + + + /** + * 单例 + */ + private static EngineRuntime INSTANCE = new EngineRuntime(); + + /** + * 引擎的信息 + */ + private ScriptEngineInfo engineInfo; + + /** + * 私有化构造函数,实现单例模式 + */ + private EngineRuntime() + { + engineInfo = new ScriptEngineInfo(); + engineInfo.setStatus(EngineStatus.INIT); + //设置引擎注册默认开启三个线程池的可用标识 + String osName = System.getProperty("os.name"); + } + + /** + * 获取引擎运行时信息(单例模式) + * + * @return 引擎运行时 + */ + public static EngineRuntime getRuntime() + { + return INSTANCE; + } + + /** + * 获取引擎详细信息 + * + * @return 引擎详细信息 + */ + public ScriptEngineInfo getEngineInfo() + { + return engineInfo; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/LifecycleCtrl.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/LifecycleCtrl.java new file mode 100644 index 0000000..c7f93be --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/LifecycleCtrl.java @@ -0,0 +1,126 @@ +package net.northking.cctp.se.lifecycle; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.se.dto.EngineStatus; +import net.northking.cctp.se.dto.ScriptEngineInfo; +import net.northking.cctp.se.lifecycle.entity.ThreadPoolAllowDto; +import net.northking.cctp.se.thread.ExecutorPool; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; + +/** + * 生命周期接口 + */ +@RequestMapping(value = "/v1") +@RestController +@Api(tags = "生命周期接口") +public class LifecycleCtrl +{ + private static final Logger logger = LoggerFactory.getLogger(LifecycleCtrl.class); + @Autowired + private RestTemplate restTemplate; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private RabbitTemplate rabbitTemplate; + + @Autowired + private RedisTemplate redisTemplate; + + + /** + * 获取引擎运行信息 + * + * @return 引擎运行信息 + */ + @ApiOperation(value = "获取引擎运行信息") + @GetMapping(value = "/info") + public ResultWrapper info() + { + ResultWrapper wrapper = new ResultWrapper<>(); + EngineRuntime engineRuntime = EngineRuntime.getRuntime(); + ScriptEngineInfo info = engineRuntime.getEngineInfo(); + wrapper.success(info); + return wrapper; + } + + /** + * 获取redis指定Key的数据 + * + * @return 引擎运行信息 + */ + @ApiOperation(value = "获取redis指定Key的数据") + @GetMapping(value = "/getRedisKey/{key}") + public ResultWrapper getRedisKey(@PathVariable("key") String key) + { + ResultWrapper wrapper = new ResultWrapper<>(); + Object info = redisTemplate.opsForValue().get(key); + wrapper.success(info); + return wrapper; + } + + /** + * 启用/禁用引擎 + * + * @return 操作结果 + */ + @ApiOperation(value = "启用/禁用引擎") + @PostMapping(value = "/manage", + produces = MediaType.APPLICATION_JSON_VALUE, + consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultWrapper manage(ThreadPoolAllowDto target) + { + //直接修改三个线程的开关标识 + ResultWrapper wrapper = new ResultWrapper<>(); + EngineRuntime engineRuntime = EngineRuntime.getRuntime(); + ScriptEngineInfo info = engineRuntime.getEngineInfo(); + if(EngineStatus.STOPPING.equals(info.getStatus())){ + logger.info("引擎正在关闭中,无法操作线程启用禁用,请等待重启------"); + throw new RuntimeException("引擎正在关闭中,无法操作线程启用禁用,请等待重启------"); + } + if (target.getInterfaceAllow()!=null) { + ExecutorPool.enableApi = target.getInterfaceAllow(); + } + if (target.getMobileAllow()!=null) { + ExecutorPool.enableMobile = target.getMobileAllow(); + } + if (target.getPcuiAllow()!=null) { + ExecutorPool.enablePc = target.getPcuiAllow(); + } + wrapper.success(true); + return wrapper; + } + + /** + * 停止引擎 + * + * @return 操作结果 + */ + @ApiOperation(value = "停止引擎") + @PostMapping(value = "/stop", + produces = MediaType.APPLICATION_JSON_VALUE, + consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultWrapper stop(@RequestParam(required = false, value = "enforce", defaultValue = "false")boolean enforce) + { + //先关闭线程创建准许 + EngineRuntime engineRuntime = EngineRuntime.getRuntime(); + ScriptEngineInfo info = engineRuntime.getEngineInfo(); + ExecutorPool.stopAll(); + logger.info("停止引擎准备 任务创建允许关闭----------"); + StopServerThread stopThread = new StopServerThread(restTemplate,objectMapper,rabbitTemplate, enforce); + stopThread.start(); + logger.info("停止引擎异步掉起 等待任务池情况,接口返回成功,并关闭----------"); + return new ResultWrapper<>().success(); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/LifecycleSchedule.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/LifecycleSchedule.java new file mode 100644 index 0000000..cae05e5 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/LifecycleSchedule.java @@ -0,0 +1,136 @@ +package net.northking.cctp.se.lifecycle; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.se.config.AtuServerConfig; +import net.northking.cctp.se.dto.EngineStatus; +import net.northking.cctp.se.dto.ScriptEngineInfo; +import net.northking.cctp.se.lifecycle.constant.MQConstant; +import net.northking.cctp.se.lifecycle.entity.CdEngineInfoResultDto; +import net.northking.cctp.se.lifecycle.entity.HeartbeatInfoDto; +import net.northking.cctp.se.thread.ExecutorPool; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.MessageBuilder; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 定时计划 + */ +@Component +public class LifecycleSchedule +{ + + private static final Logger logger = LoggerFactory.getLogger(LifecycleSchedule.class); + @Autowired + private EngineRegisterService engineRegisterService; + @Autowired + private RabbitTemplate rabbitTemplate; + @Autowired + private AtuServerConfig atuServerConfig; + @Autowired + private ObjectMapper objectMapper; + @Autowired + private DaemonProcess daemonProcess; + + @Value("${atu.server.daemonFlag:true}") + private boolean daemonFlag; + + /** + * TODO 登录逻辑 + * 初始延迟时间 2 秒,间隔 30秒 + */ + @Scheduled(initialDelay = 2 * 1000L, fixedDelay = 30 * 1000L) + public void login() + { + EngineRuntime engineRuntime = EngineRuntime.getRuntime(); + ScriptEngineInfo engineInfo = engineRuntime.getEngineInfo(); + + if (EngineStatus.INIT.equals(engineInfo.getStatus()) || + EngineStatus.LOGIN_FAILED.equals(engineInfo.getStatus())) + { + //注册 状态改为注册中 + engineInfo.setStatus(EngineStatus.LOGIN_ING); + CdEngineInfoResultDto registerInfo = engineRegisterService.register(engineInfo); + //注册完成,更新引擎信息 + engineInfo.setDeviceId(registerInfo.getDeviceId()); + engineInfo.setEngineId(registerInfo.getEngineId()); + engineInfo.setVersion(atuServerConfig.getEngineVersion()); + engineInfo.setStatus(EngineStatus.LOGIN_SUCCESSFULLY); + } + } + + /** + * 心跳逻辑 + * 初始延迟时间 10 秒,间隔 60秒 + */ + @Scheduled(initialDelay = 10 * 1000L, fixedDelay = 60 * 1000L) + public void heartbeat() + { + EngineRuntime engineRuntime = EngineRuntime.getRuntime(); + ScriptEngineInfo engineInfo = engineRuntime.getEngineInfo(); + if (EngineStatus.LOGIN_SUCCESSFULLY.equals(engineInfo.getStatus())) + { + //登录成功后发送心跳 + //心跳信息包括设备id + logger.debug("引擎状态正常,发送心跳。。。。"); + HeartbeatInfoDto dto = new HeartbeatInfoDto(); + dto.setEngineId(engineInfo.getEngineId()); + dto.setEngineVersion(engineInfo.getVersion()); + // 增加引擎线程池线程使用情况 + Map info = ExecutorPool.info(); + logger.debug("ExecutorPool info:{}",info); + dto.setExecutePoolInfo(info); + deployNotice(dto); + }else{ + logger.info("心跳 引擎信息 未注册 不发送心跳----"); + } + } + + private void deployNotice(Object object) { + byte[] json; + try{ + logger.debug("引擎发送心跳信息到缓存,心跳信息:object:{}", JSONObject.toJSONString(object)); + json = objectMapper.writeValueAsBytes(object); + MessageBuilder mb = MessageBuilder.withBody(json); + mb.setContentType(MediaType.APPLICATION_JSON_VALUE); + rabbitTemplate.send(MQConstant.ENGINE_HEARTBEAT,mb.build()); + }catch (Exception e){ + logger.error("mq消息解析失败:",e); + } + } + + /** + * 守护进程管理 + * 初始延迟时间 10 秒,间隔 60秒 + */ + @Scheduled(fixedDelay = 60 * 1000L) + public void daemonProcessProtect() + { + if(!daemonFlag){ + return; + } + if (daemonProcess.isStarted()) + { + if (!daemonProcess.alive()) + { + logger.info("【守护进程】进程 PID={} 未响应。", daemonProcess.getPid()); + daemonProcess.shutdown(); + daemonProcess.start(); + } + } else + { + logger.info("【脚本引擎】进程 未启动。尝试启动!"); + daemonProcess.start(); + logger.info("【脚本引擎】进程 启动成功。更新引擎信息!"); + daemonProcess.alive(); + } + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/StopServerThread.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/StopServerThread.java new file mode 100644 index 0000000..d853643 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/StopServerThread.java @@ -0,0 +1,88 @@ +package net.northking.cctp.se.lifecycle; + +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.se.dto.ScriptEngineInfo; +import net.northking.cctp.se.lifecycle.constant.MQConstant; +import net.northking.cctp.se.lifecycle.entity.HeartbeatInfoDto; +import net.northking.cctp.se.thread.ExecutorPool; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.MessageBuilder; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.http.MediaType; +import org.springframework.web.client.RestTemplate; + +/** + * 异步等待任务清空掉起关闭服务进程 + */ +public class StopServerThread extends Thread{ + private static final Logger logger = LoggerFactory.getLogger(LifecycleSchedule.class); + + private final RestTemplate restTemplate; + private final ObjectMapper objectMapper; + private final RabbitTemplate rabbitTemplate; + + private boolean enforce = false; + + StopServerThread(RestTemplate restTemplate,ObjectMapper objectMapper,RabbitTemplate rabbitTemplate, boolean enforce){ + this.restTemplate = restTemplate; + this.objectMapper = objectMapper; + this.rabbitTemplate = rabbitTemplate; + this.enforce = enforce; + } + + public void run(){ + //等待现有线程池任务全部清空 + boolean flag =true; + while(flag){ + //pcui线程 + boolean pcui = ExecutorPool.getPCPool().getActiveCount() == 0; + //mobile线程池 + boolean mob = ExecutorPool.getMobilePool().getActiveCount() == 0; + //interface线程池 + boolean inter = ExecutorPool.getApiPool().getActiveCount() == 0; + if(this.enforce || (pcui && mob && inter)){ + flag=false; + logger.info("检查到没有运行的任务,关闭服务。"); + }else{ + logger.info("引擎等待关闭,等待任务完成:pcui任务数:{} ,移动任务数:{},接口任务数:{}", + ExecutorPool.getPCPool().getActiveCount(), + ExecutorPool.getMobilePool().getActiveCount(), + ExecutorPool.getApiPool().getActiveCount() + ); + try { + // 每5秒钟查看任务情况 + Thread.sleep(5L*1000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + logger.error("休眠异常", e); + } + } + } + // + // 关闭前发送心跳 + EngineRuntime engineRuntime = EngineRuntime.getRuntime(); + ScriptEngineInfo engineInfo = engineRuntime.getEngineInfo(); + HeartbeatInfoDto dto = new HeartbeatInfoDto(); + dto.setEngineId(engineInfo.getEngineId()); + dto.setEngineVersion(engineInfo.getVersion()); + dto.setEngineStatus("3"); + deployNotice(dto); + //服务停止 + logger.info("停止服务准备已完成 服务关闭 ----------"); + + System.exit(0); + } + + private void deployNotice(Object object) { + byte[] json; + try{ + json = objectMapper.writeValueAsBytes(object); + MessageBuilder mb = MessageBuilder.withBody(json); + mb.setContentType(MediaType.APPLICATION_JSON_VALUE); + rabbitTemplate.send(MQConstant.ENGINE_HEARTBEAT,mb.build()); + }catch (Exception e){ + logger.info("mq消息解析失败:"+e.getMessage()); + } + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/constant/MQConstant.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/constant/MQConstant.java new file mode 100644 index 0000000..a61dfac --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/constant/MQConstant.java @@ -0,0 +1,17 @@ +package net.northking.cctp.se.lifecycle.constant; + +/** + * 引擎队列交换机名称定义 + */ +public class MQConstant { + /** + * 引擎心跳 + */ + public static final String ENGINE_HEARTBEAT = "engine.heartbeat"; + + /** + * 任务执行心跳 + */ + public static final String TASK_EXEC_HEARTBEAT_QUEUE = "plan.task.exec.heartbeat"; + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/AppLifecycle.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/AppLifecycle.java new file mode 100644 index 0000000..47d9032 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/AppLifecycle.java @@ -0,0 +1,28 @@ +package net.northking.cctp.se.lifecycle.entity; + + +import net.northking.cctp.se.lifecycle.win.TaskList; + +import java.util.List; + +/** + * 应用程序生命周期 + */ +public abstract class AppLifecycle implements Lifecycle +{ + /** + * 根据PID查询正在运行的进程 + * + * @param pid 进程号 + * @return 进程信息 + */ + protected List findProcessByPid(String pid) + { + TaskList taskList = new TaskList(); + taskList.format(TaskList.Format.csv); + taskList.filter(TaskList.Result.PID + " eq " + pid); + return taskList.execute(); + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdEngineInfo.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdEngineInfo.java new file mode 100644 index 0000000..b6273a8 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdEngineInfo.java @@ -0,0 +1,66 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.se.lifecycle.entity; + +import io.swagger.annotations.ApiModelProperty; + +import lombok.Data; + +import java.util.Date; + + +/** + * 执行引擎信息 + */ +@Data +public class CdEngineInfo +{ + /** + * 主键id
+ */ + private String id; + /** + * 引擎名称
+ */ + private String engineName; + /** + * pc设备id
+ */ + private String deviceId; + /** + * ip地址
+ */ + private String ipAddr; + /** + * 端口 + */ + private String ipPort; + /** + * 引擎版本
+ */ + private String runningRelease; + /** + * 注册时间
+ */ + private Date registedTime; + /** + * 启用/禁用
+ */ + @ApiModelProperty("启用/禁用") + private Boolean enabled; + /** + * 引擎状态
+ */ + private String engineStatus; + /** + * 引擎描述
+ */ + private String engineDesc; + + private Date lastHeartbeatTime; + + private Boolean isPcExecutor; + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdEngineInfoRegisterDto.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdEngineInfoRegisterDto.java new file mode 100644 index 0000000..7b50a73 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdEngineInfoRegisterDto.java @@ -0,0 +1,35 @@ +package net.northking.cctp.se.lifecycle.entity; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +@JsonSerialize +public class CdEngineInfoRegisterDto { + + /** + * 引擎信息 + */ + private CdEngineInfo cdEngineInfo; + + /** + * pc设备信息 + */ + private CdPcDevice cdPcDevice; + + public CdEngineInfo getCdEngineInfo() { + return cdEngineInfo; + } + + public void setCdEngineInfo(CdEngineInfo cdEngineInfo) { + this.cdEngineInfo = cdEngineInfo; + } + + public CdPcDevice getCdPcDevice() { + return cdPcDevice; + } + + public void setCdPcDevice(CdPcDevice cdPcDevice) { + this.cdPcDevice = cdPcDevice; + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdEngineInfoResultDto.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdEngineInfoResultDto.java new file mode 100644 index 0000000..3da0157 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdEngineInfoResultDto.java @@ -0,0 +1,27 @@ +package net.northking.cctp.se.lifecycle.entity; + +import io.swagger.annotations.ApiModelProperty; + +public class CdEngineInfoResultDto { + @ApiModelProperty("引擎id") + private String engineId; + + @ApiModelProperty("设备id") + private String deviceId; + + public String getEngineId() { + return engineId; + } + + public void setEngineId(String engineId) { + this.engineId = engineId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdPcDevice.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdPcDevice.java new file mode 100644 index 0000000..ec1d0e4 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/CdPcDevice.java @@ -0,0 +1,53 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.se.lifecycle.entity; + +import lombok.Data; + + +/** + * PC设备管理 + */ +@Data +public class CdPcDevice +{ + + /** + * 主键id
+ */ + private String id; + /** + * 设备名称
+ */ + private String deviceName; + /** + * 设备域名
+ */ + private String domainName; + /** + * ip地址
+ */ + private String ipAddr; + /** + * mac地址
+ */ + private String macAddr; + /** + * 操作系统架构
+ */ + private String osArch; + /** + * 操作系统
+ */ + private String osName; + /** + * 内存容量
+ */ + private String ramSize; + + private String remoteProtocol; + + private String remotePort; +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/HeartbeatInfoDto.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/HeartbeatInfoDto.java new file mode 100644 index 0000000..c0f853d --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/HeartbeatInfoDto.java @@ -0,0 +1,59 @@ +package net.northking.cctp.se.lifecycle.entity; + +import java.util.Map; + +/** + * 心跳信息 + */ +public class HeartbeatInfoDto { + /** + * 引擎ID + */ + private String engineId; + /** + * 引擎版本 + */ + private String engineVersion; + + /** + * 设备状态 + */ + private String engineStatus; + + /** + * 执行池信息 + */ + private Map executePoolInfo; + + public String getEngineId() { + return engineId; + } + + public void setEngineId(String engineId) { + this.engineId = engineId; + } + + public String getEngineVersion() { + return engineVersion; + } + + public void setEngineVersion(String engineVersion) { + this.engineVersion = engineVersion; + } + + public String getEngineStatus() { + return engineStatus; + } + + public void setEngineStatus(String engineStatus) { + this.engineStatus = engineStatus; + } + + public Map getExecutePoolInfo() { + return executePoolInfo; + } + + public void setExecutePoolInfo(Map executePoolInfo) { + this.executePoolInfo = executePoolInfo; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/Lifecycle.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/Lifecycle.java new file mode 100644 index 0000000..b2af45b --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/Lifecycle.java @@ -0,0 +1,18 @@ +package net.northking.cctp.se.lifecycle.entity; + +public interface Lifecycle +{ + String getPid(); + + boolean isStarted(); + + void start(); + + void stop(); + + void shutdown(); + + void restart(); + + boolean alive(); +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/ThreadPoolAllowDto.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/ThreadPoolAllowDto.java new file mode 100644 index 0000000..bb49632 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/entity/ThreadPoolAllowDto.java @@ -0,0 +1,48 @@ +package net.northking.cctp.se.lifecycle.entity; + +/** + * 线程池是否启用请求参数实体类 + */ +public class ThreadPoolAllowDto { + /** + * 是否启用PCUI执行器 + * @return + */ + private Boolean pcuiAllow; + + /** + * 是否启用移动端执行器 + * @return + */ + private Boolean mobileAllow; + + /** + * 是否启用接口执行器 + * @return + */ + private Boolean interfaceAllow; + + public Boolean getPcuiAllow() { + return pcuiAllow; + } + + public void setPcuiAllow(Boolean pcuiAllow) { + this.pcuiAllow = pcuiAllow; + } + + public Boolean getMobileAllow() { + return mobileAllow; + } + + public void setMobileAllow(Boolean mobileAllow) { + this.mobileAllow = mobileAllow; + } + + public Boolean getInterfaceAllow() { + return interfaceAllow; + } + + public void setInterfaceAllow(Boolean interfaceAllow) { + this.interfaceAllow = interfaceAllow; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/CommandExecute.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/CommandExecute.java new file mode 100644 index 0000000..0bfe4d2 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/CommandExecute.java @@ -0,0 +1,23 @@ +package net.northking.cctp.se.lifecycle.win; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class CommandExecute +{ + private static final Logger logger = LoggerFactory.getLogger(CommandExecute.class); + + public static void main(String[] args) + { + TaskList taskList = new TaskList(); + taskList.format(TaskList.Format.csv); + taskList.filter(TaskList.Result.IMAGENAME + " eq java.exe"); + List resultList = taskList.execute(); + for (TaskList.Result result : resultList) + { + logger.info(result.toString()); + } + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/OSCommand.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/OSCommand.java new file mode 100644 index 0000000..13eddbd --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/OSCommand.java @@ -0,0 +1,5 @@ +package net.northking.cctp.se.lifecycle.win; + +public interface OSCommand +{ +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/TaskKill.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/TaskKill.java new file mode 100644 index 0000000..24f750f --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/TaskKill.java @@ -0,0 +1,165 @@ +package net.northking.cctp.se.lifecycle.win; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class TaskKill implements OSCommand +{ + private static final Logger logger = LoggerFactory.getLogger(TaskKill.class); + + /** + * 命令名称 + */ + private static final String COMMAND_NAME = "TASKKILL"; + + private String computer; + private String username; + private String password; + + private String pid; + private String imageName; + private boolean force = false; + private boolean killTeam = false; + private List filters = new ArrayList<>(); + + /** + * /S  指定连接到的计算机或IP地址,默认本机。 + * + * @param computer 计算机或IP地址 + */ + public void computer(String computer) + { + this.computer = computer; + } + + /** + * /u [\] 指定使用哪个用户执行这个命令。 + * + * @param username 用户 + */ + public void username(String username) + { + this.username = username; + } + + /** + * /P 为指定的用户指定密码。 + * + * @param password 密码 + */ + public void password(String password) + { + this.password = password; + } + + /** + * /PID 指定进程号 + * + * @param pid 进程号 + */ + public void pid(String pid) + { + this.pid = pid; + } + + /** + * /IM 指定镜像名称 + * + * @param imageName 镜像名称 + */ + public void imageName(String imageName) + { + this.imageName = imageName; + } + + /** + * /F 强制终止进程 + * + * @param force 是/否 + */ + public void force(boolean force) + { + this.force = force; + } + + /** + * /T 终止指定的进程和由它启用的子进程。 + * + * @param killTeam 是/否 + */ + public void killTeam(boolean killTeam) + { + this.killTeam = killTeam; + } + + + /** + * 显示一系列符合筛选器指定的进程。 + * + * @param filter 筛选器 + */ + public void filter(String filter) + { + this.filters.add(filter); + } + + private String build() + { + StringBuilder command = new StringBuilder(COMMAND_NAME); + + if (computer != null && computer.trim().length() > 0) + { + command.append(" /S ").append(computer); + } + if (username != null && username.trim().length() > 0) + { + command.append(" /u ").append(username); + } + if (password != null && password.trim().length() > 0) + { + command.append(" /P ").append(password); + } + if (pid != null && pid.trim().length() > 0) + { + command.append(" /PID ").append(pid); + } + if (imageName != null && imageName.trim().length() > 0) + { + command.append(" /IM ").append(imageName); + } + if (force) + { + command.append(" /F"); + } + if (killTeam) + { + command.append(" /T"); + } + for (String filter : filters) + { + command.append(" /FI ").append("\"").append(filter).append("\""); + } + return command.toString(); + } + + public void execute() + { + String commandStr = build(); + + try + { + logger.debug("执行命令:{}", commandStr); + Process process = Runtime.getRuntime().exec("cmd /c " + commandStr); + process.waitFor(); + } catch (IOException | InterruptedException e) + { + logger.error("使用 TASKKILL 命令终止进程时发生异常。", e); + } + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/TaskList.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/TaskList.java new file mode 100644 index 0000000..578902b --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/lifecycle/win/TaskList.java @@ -0,0 +1,232 @@ +package net.northking.cctp.se.lifecycle.win; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +public class TaskList implements OSCommand +{ + private static final Logger logger = LoggerFactory.getLogger(TaskList.class); + /** + * 命令名称 + */ + private static final String COMMAND_NAME = "TASKLIST"; + + private String computer; + private String username; + private String password; + private String module; + private boolean details = false; + private Format format; + private static boolean startFlag = true; + private List filters = new ArrayList<>(); + + /** + * /S  指定连接到的计算机或IP地址,默认本机。 + * + * @param computer 计算机或IP地址 + */ + public void computer(String computer) + { + this.computer = computer; + } + + /** + * /u [\] 指定使用哪个用户执行这个命令。 + * + * @param username 用户 + */ + public void username(String username) + { + this.username = username; + } + + /** + * /P 为指定的用户指定密码。 + * + * @param password 密码 + */ + public void password(String password) + { + this.password = password; + } + + /** + * 列出调用指定的DLL模块的所有进程。如果没有指定模块名,显示每个进程加载的所有模块。 + * + * @param module 模块 + */ + public void module(String module) + { + this.module = module; + } + + /** + * 显示详细信息。 + */ + public void details(boolean details) + { + this.details = details; + } + + public void format(Format format) + { + this.format = format; + } + + /** + * 显示一系列符合筛选器指定的进程。 + * + * @param filter 筛选器 + */ + public void filter(String filter) + { + this.filters.add(filter); + } + + private String build() + { + StringBuilder command = new StringBuilder(COMMAND_NAME); + + if (computer != null && computer.trim().length() > 0) + { + command.append(" /S ").append(computer); + } + if (username != null && username.trim().length() > 0) + { + command.append(" /u ").append(username); + } + if (password != null && password.trim().length() > 0) + { + command.append(" /P ").append(password); + } + if (module != null && module.trim().length() > 0) + { + command.append(" /M ").append(module); + } + if (details) + { + command.append(" /V"); + } + if (format != null) + { + command.append(" /FO ").append(format.name()); + } + for (String filter : filters) + { + command.append(" /FI ").append("\"").append(filter).append("\""); + } + return command.toString(); + } + + public List execute() + { + List resultList = new ArrayList<>(); + String commandStr = build(); + String line; + Process process; + int lineNo = 1; + try + { + if (startFlag) { + logger.debug("执行命令:{}", commandStr); + } + process = Runtime.getRuntime().exec("cmd /c " + commandStr); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK")); + while ((line = bufferedReader.readLine()) != null) + { + if (startFlag) { + logger.debug("行-{}: {}", lineNo, line); + } + if (lineNo > 1) + { + resultList.add(new Result(line)); + } + lineNo++; + } + startFlag = false; + process.waitFor(); + } catch (IOException | InterruptedException e) + { + logger.error("使用 TASKLIST 命令获取进程PID时发生异常。", e); + } + + return resultList; + } + + public enum Format + { + table, + list, + csv + } + + + public class Result + { + public static final String IMAGENAME = "IMAGENAME"; + public static final String PID = "PID"; + + private final String imageName; + private final String pid; + private final String sessionName; + private final String sessionCount; + private final String memory; + + public Result(String line) + { + String[] args = line.split("\",\""); + imageName = args[0].substring(1); + pid = args[1]; + sessionName = args[2]; + sessionCount = args[3]; + memory = args[4].replace("\"", ""); + } + + public Result(String imageName, String pid, String sessionName, String sessionCount, String memory) + { + this.imageName = imageName; + this.pid = pid; + this.sessionName = sessionName; + this.sessionCount = sessionCount; + this.memory = memory; + } + + public String getImageName() + { + return imageName; + } + + public String getPid() + { + return pid; + } + + public String getSessionName() + { + return sessionName; + } + + public String getSessionCount() + { + return sessionCount; + } + + public String getMemory() + { + return memory; + } + + @Override + public String toString() + { + return "imageName=" + imageName + ", pid=" + pid + ", sessionName=" + sessionName + ", sessionCount=" + sessionCount + ", memory=" + memory; + } + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/log/bean/ExecuteLog.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/log/bean/ExecuteLog.java new file mode 100644 index 0000000..9687c88 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/log/bean/ExecuteLog.java @@ -0,0 +1,36 @@ +package net.northking.cctp.se.log.bean; + +import lombok.Data; + +import java.util.Date; + +/** + * 执行日志类 + */ +@Data +public class ExecuteLog { + + private Date time; + + private String level; + + private String stepName; + + private String cmpt; + + private String cmptName; + + private String log; + + private Progress progress; + + @Data + static class Progress { + private int idx; + + private String input; + + private String execResult; + } + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/log/bean/StepLog.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/log/bean/StepLog.java new file mode 100644 index 0000000..ffd3c75 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/log/bean/StepLog.java @@ -0,0 +1,52 @@ +package net.northking.cctp.se.log.bean; + +import lombok.Data; +import org.springframework.boot.logging.LogLevel; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + * 步骤执行日志 + */ +@Data +public class StepLog { + + private String stepId; + + private Date time; + + private String level; + + private String title; + + private String cmpt; + + private String cmptName; + + private String stepType; + + private String log; + + private String logType = LogType.TEXT.name(); // text, image + + private List resources = new ArrayList<>(); + + public StepLog(String level, String title, String stepType, String cmpt) { + this.time = new Date(); + if (StringUtils.isEmpty(level)) { + level = LogLevel.INFO.name(); + } + this.level = level; + this.title = title; + this.stepType = stepType; + this.cmpt = cmpt; + } + + public static enum LogType { + TEXT, IMAGE + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/AtuPlanTaskSchedule.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/AtuPlanTaskSchedule.java new file mode 100644 index 0000000..4a573ee --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/AtuPlanTaskSchedule.java @@ -0,0 +1,373 @@ +package net.northking.cctp.se.plan; + +import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.annotations.VisibleForTesting; +import com.rabbitmq.client.GetResponse; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.se.config.AtuServerConfig; +import net.northking.cctp.se.dto.ScriptEngineInfo; +import net.northking.cctp.se.exec.constant.AtuExecConstant; +import net.northking.cctp.se.lifecycle.EngineRuntime; +import net.northking.cctp.se.plan.bean.AutoTask; +import net.northking.cctp.se.plan.bean.EnginePlanInfo; +import net.northking.cctp.se.plan.servcie.EnginePlanInfoService; +import net.northking.cctp.se.plan.servcie.PlanDeviceService; +import net.northking.cctp.se.thread.ExecutorPool; +import net.northking.cctp.se.util.JsonUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.AmqpException; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.web.client.RestTemplate; + +import java.util.*; + + +/** + * 定时获取任务执行 + */ +@Component +public class AtuPlanTaskSchedule { + + private static final Logger logger = LoggerFactory.getLogger(AtuPlanTaskSchedule.class); + @VisibleForTesting + private String TYPE_MOBILE = "2"; + @VisibleForTesting + private String TYPE_PC = "1"; + @VisibleForTesting + private String TYPE_INTERFACE = "3"; + + @Autowired + private EnginePlanInfoService enginePlanInfoService; + + @Autowired + private RestTemplate restTemplate; + + @Autowired + private AtuServerConfig atuServerConfig; + + @Autowired + private RabbitAdmin rabbitAdmin; + + @Autowired + private RabbitTemplate rabbitTemplate; + + @Autowired + private PlanDeviceService planDeviceService; + + @Autowired + private ObjectMapper om; + + /** + * 定时获取移动端空闲设备检查空闲后占用并领取任务 + */ + @Scheduled(initialDelay = 30 * 1000,fixedDelay = 30 * 1000) + public void sendTask2MobileDevice(){ + // 判断是否有可用线程 + if (!ExecutorPool.enableMobile){ + logger.error("未开启移动执行线程"); + return; + } + + List list = new ArrayList<>(); + try { + list = enginePlanInfoService.queryAllDeviceId(TYPE_MOBILE); + logger.debug("委托执行的设备数量:{}", list.size()); + } catch (Exception e) { + logger.error("引擎获取执行设备信息失败设备:",e); + } + if(list.size()>0){ + for (String taskDeviceId : list) { + logger.debug("移动线程池执行情况: {}", ExecutorPool.getMobilePool().getActiveCount() + "/" + + ExecutorPool.getMobilePool().getCorePoolSize()); + if (!ExecutorPool.isMobileAvailable()){ + logger.error("移动线程池中可执行线程已占满"); + return; + } + //获取引擎注册后的设备id + EngineRuntime engineRuntime = EngineRuntime.getRuntime(); + ScriptEngineInfo info = engineRuntime.getEngineInfo(); + Map paramMap = new HashMap<>(); + paramMap.put("id",info.getEngineId()); + List tryAcqurieDeviceIdList = Collections.singletonList(taskDeviceId); + paramMap.put("deviceList",tryAcqurieDeviceIdList); + paramMap.put("type","1"); + paramMap.put("userBy","engine"); + String url = atuServerConfig.getServerUrl() + atuServerConfig.getTryAcqurieDeviceUrl(); + try { + ResponseEntity result = restTemplate.postForEntity(url, paramMap, ResultWrapper.class); + if(HttpStatus.OK.equals(result.getStatusCode())){ + ResultWrapper deviceResult = result.getBody(); + if (deviceResult != null && deviceResult.isSuccess()) { + List> body = (List>)deviceResult.getData(); + if(!CollectionUtils.isEmpty(body)){ + logger.debug("移动任务请求占用成功移动端设备信息:"+JSON.toJSONString(body)); + for (int i = 0; i < body.size(); i++) { + Map deviceMap = body.get(i); + String deviceId = deviceMap.get("id"); + String deviceToken = deviceMap.get("token"); + //获取设备对应的一条计划信息 + boolean isUsed = getTaskFromQueue(deviceId, deviceToken,TYPE_MOBILE); + if(!isUsed){ + //无任务 释放设备 + logger.debug("无任务释放移动端设备:"+deviceId); + releaseDevice(deviceToken); + } + } + } + } + + } + }catch (Exception e){ + logger.error("请求占用设备失败,原因:",e); + //释放所有设备 + releaseDevices(e, info.getEngineId(), tryAcqurieDeviceIdList); + } + } + } + } + + /** + * 引擎领取pc任务 + */ + @Scheduled(initialDelay = 20 * 1000,fixedDelay = 20 * 1000) + public void sendTask2PcDevice(){ + //获取引擎注册后的设备id + EngineRuntime engineRuntime = EngineRuntime.getRuntime(); + ScriptEngineInfo info = engineRuntime.getEngineInfo(); + String deviceId = info.getDeviceId(); + String engineId = info.getEngineId(); + List batchList = enginePlanInfoService.queryInfoByDeviceId(deviceId,TYPE_PC); + if(!CollectionUtils.isEmpty(batchList)){ + logger.debug("存在PC类型的委托任务共{}条", batchList.size()); + if(batchList.size()>0){ + Map paramMap = new HashMap<>(); + List list = new ArrayList<>(); + list.add(deviceId); + paramMap.put("id",engineId); + paramMap.put("deviceList",list); + paramMap.put("type","2"); + paramMap.put("userBy","engine"); + //判断设备是否空闲 + String url = atuServerConfig.getServerUrl() + atuServerConfig.getTryAcqurieDeviceUrl(); + try { + ResponseEntity resultEntity = restTemplate.postForEntity(url, paramMap, ResultWrapper.class); + logger.debug("pc任务请求设备使用结果:"+ JSON.toJSONString(resultEntity)); + if (HttpStatus.OK.equals(resultEntity.getStatusCode())) { + ResultWrapper deviceResult = resultEntity.getBody(); + if (deviceResult!= null && deviceResult.isSuccess()) { + List> body = (List>) deviceResult.getData(); + if (!CollectionUtils.isEmpty(body)) { + Map deviceMap = body.get(0); + String deviceToken = deviceMap.get("token"); + logger.debug("设备token:" + deviceToken); + logger.debug("当前设备{}占用成功。", deviceId); + boolean isUsed = getTaskFromQueue(deviceId, deviceToken, TYPE_PC); + if (!isUsed) { + //设备无任务可领 + logger.debug("无任务释放PC设备:" + deviceId); + releaseDevice(deviceToken); + } + } + } + } + } catch (Exception e) { + logger.error("设备请求占用异常:",e); + releaseDevices(e, info.getEngineId(), list); + } + } + } + } + + private void releaseDevices(Exception e, String engineId, List deviceIds) { + //释放所有设备 + String errorMsg = e.getMessage(); + if (errorMsg.contains("Read timed out")) { + int count = 0; + Map requestMap = new HashMap<>(); + requestMap.put("id", engineId); + requestMap.put("deviceList", deviceIds); + while (count++ < 50) { + try { + logger.debug("pc任务请求占用设备超时处理===="); + //请求超时释放请求设备 + String urlRelease = atuServerConfig.getServerUrl() + atuServerConfig.getReleaseDeviceBatch(); + ResponseEntity entity = restTemplate.postForEntity(urlRelease, requestMap, ResultWrapper.class); + if (HttpStatus.OK == entity.getStatusCode()) { + count += 50; + } + Thread.sleep(2000); + } catch (Exception innerE) { + // todo: 增加发送队列 + logger.error("超时释放设备失败:", innerE); + logger.debug("使用队列方式释放使用的设备:{}", requestMap); + try { + rabbitTemplate.convertAndSend(AtuExecConstant.ENGINE_RELEASE_ID, new Message(om.writeValueAsBytes(requestMap))); + count += 50; + } catch (JsonProcessingException jpe) { + logger.error("释放设备失败", jpe); + } + } + } + } + } + + /** + * 引擎领取接口任务 + */ + @Scheduled(initialDelay = 30 * 1000,fixedDelay = 5 * 1000) + public void sendTask2ApiDevice(){ + //获取引擎注册后的设备id + EngineRuntime engineRuntime = EngineRuntime.getRuntime(); + ScriptEngineInfo info = engineRuntime.getEngineInfo(); + String deviceId = info.getDeviceId(); + //领取任务 + getTaskFromQueue(deviceId,null,TYPE_INTERFACE); + } + + + /** + * 每日一时,引擎清理不存在队列的任务 + */ + @Scheduled(cron = "0 0 1 * * ?") + public void clearNoQueueTask(){ + //获取所有任务 + List batchList = enginePlanInfoService.queryAllPlanInfo(); + if(!CollectionUtils.isEmpty(batchList)){ + //清楚队列不存在的任务 + logger.info("清除队列不存在的本地任务-----开始"); + for (EnginePlanInfo info : batchList) { + String queueName = info.getQueueName(); + Properties properties = rabbitAdmin.getQueueProperties(queueName); + if(null == properties){ + logger.debug("队列["+queueName+"]不存在。。。"); + //队列不存在 删除该类型批次信息 + enginePlanInfoService.deletePlanInfoById(info.getId()); + } + } + logger.info("清除队列不存在的本地任务-----结束"); + } + + } + + + /** + * 释放设备 + */ + private void releaseDevice(String deviceToken){ + String releaseUrl = atuServerConfig.getServerUrl() + atuServerConfig.getDeviceReleasePath()+deviceToken; + try { + ResponseEntity resultEntity = restTemplate.getForEntity(releaseUrl, ResultWrapper.class); + if (HttpStatus.OK.equals(resultEntity.getStatusCode())) { + ResultWrapper bodyResult = resultEntity.getBody(); + if (bodyResult.isSuccess()) { + if ((boolean) bodyResult.getData()) { + logger.debug("设备退出成功。。。。。"); + } + }else{ + logger.warn("设备释放异常:"+JSON.toJSONString(bodyResult)); + } + }else{ + logger.warn("设备释放异常:"+JSON.toJSONString(resultEntity)); + } + } catch (Exception e1) { + //设备释放异常重新处理 + logger.error("设备退出异常:",e1); + try { + String queueName = AtuExecConstant.ENGINE_RELEASE; + Properties properties = rabbitAdmin.getQueueProperties(queueName); + if(null == properties){ + //声明设备释放队列 + org.springframework.amqp.core.Queue queue = new org.springframework.amqp.core.Queue(queueName); + rabbitAdmin.declareQueue(); + } + String[] tokens = {deviceToken}; + rabbitTemplate.convertAndSend(queueName,new Message(JSON.toJSONString(Arrays.asList(tokens)).getBytes())); + } catch (AmqpException e) { + logger.error("设备退出重试异常:",e); + } + } + } + + + /** + * 根据设备id查询一条队列信息从中获取任务 + */ + private boolean getTaskFromQueue(String deviceId,String deviceToken,String type){ + boolean flag = false;//设备是否继续占用标识 + List batchList = enginePlanInfoService.queryInfoByDeviceId(deviceId,type); + if(!CollectionUtils.isEmpty(batchList)){ + for (int i = 0; i < batchList.size(); i++) { + EnginePlanInfo planInfo = batchList.get(i); + String queueName = planInfo.getQueueName(); + Properties properties = rabbitAdmin.getQueueProperties(queueName); + if(null == properties){ + logger.debug("队列["+queueName+"]不存在。。。"); + //队列不存在 删除该类型批次信息 + enginePlanInfoService.removeEnginePlanByType(planInfo.getBatchId(),type); + planDeviceService.removeBatchInfo(planInfo.getBatchId()); + }else{ + String browserType = "0"; + if(TYPE_INTERFACE.equalsIgnoreCase(type)||TYPE_MOBILE.equalsIgnoreCase(type)){ + flag = planDeviceService.isEnableAcceptTask(type); + }else{ + flag = true; + browserType = planInfo.getBrowserType(); + } + if(flag){ + try { + logger.debug("开始从队列{" + queueName + "}中获取一条任务"); + String finalBrowserType = browserType; + Boolean execute = rabbitTemplate.execute(channel -> { + GetResponse response = channel.basicGet(queueName, true); + if (response != null) { + byte[] body = response.getBody(); + String msg = new String(body); + logger.debug("计划任务信息:{}", msg); + try { + AutoTask task = JsonUtils.fromJsonString(msg, AutoTask.class); + task.setDeviceId(deviceId); + task.setTaskType(type); + task.setBrowserType(finalBrowserType); + task.setAppDownloadUrl(atuServerConfig.getServerUrl() + atuServerConfig.getAppDownloadUrl()); + logger.debug("任务信息:" + JSON.toJSONString(task)); + planDeviceService.sendTask2Exec(task, deviceToken); + AtuTaskExecHeartbeatSchedule.execTaskMap.put(task.getTaskId(), task.getCaseType()); + return true; + } catch (Exception e) { + logger.debug("消息处理异常,回滚至队列中,消息为:{}", msg); + rabbitTemplate.convertAndSend(queueName, msg); + throw new ExecuteException("获取队列任务并推送执行异常, " + e.getMessage()); + } + }else{ + logger.debug("队列[{}]中无任务信息,修改该委托顺序", queueName); + enginePlanInfoService.updatePlanInfoSort(planInfo.getId()); + } + return false; + }); + flag = execute == null ? false : execute; + if (flag) { + break; + } + }catch (Exception e){ + logger.error("任务领取失败:",e); + flag = false; + } + } + } + } + } + return flag; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/AtuTaskExecHeartbeatSchedule.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/AtuTaskExecHeartbeatSchedule.java new file mode 100644 index 0000000..0fb260e --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/AtuTaskExecHeartbeatSchedule.java @@ -0,0 +1,55 @@ +package net.northking.cctp.se.plan; + + +import cn.hutool.json.JSONUtil; +import net.northking.cctp.se.lifecycle.constant.MQConstant; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.concurrent.ConcurrentHashMap; + +@Component +public class AtuTaskExecHeartbeatSchedule { + + private static final Logger logger = LoggerFactory.getLogger(AtuTaskExecHeartbeatSchedule.class); + + @Autowired + private RabbitAdmin rabbitAdmin; + + @Autowired + private RabbitTemplate rabbitTemplate; + + /** + * 记录正在执行中的任务,key:任务id,value:任务类型 + */ + public static ConcurrentHashMap execTaskMap = new ConcurrentHashMap<>(); + + @PostConstruct + public void init(){ + Queue queue = new Queue(MQConstant.TASK_EXEC_HEARTBEAT_QUEUE); + rabbitAdmin.declareQueue(queue); + } + + /** + * 发送任务执行心跳 + */ + @Scheduled(initialDelay = 10 * 1000,fixedDelay = 60 * 1000) + public void sendTaskExecHeartbeat(){ + if (execTaskMap.size() <= 0){ + logger.debug("无正在执行的任务..."); + return; + } + try { + rabbitTemplate.convertAndSend(MQConstant.TASK_EXEC_HEARTBEAT_QUEUE, JSONUtil.toJsonStr(execTaskMap)); + } catch (Exception e) { + logger.error("发送任务执行心跳异常"); + } + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/AutomationTestPlanCtrl.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/AutomationTestPlanCtrl.java new file mode 100644 index 0000000..48e78bd --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/AutomationTestPlanCtrl.java @@ -0,0 +1,80 @@ +package net.northking.cctp.se.plan; + +import io.swagger.annotations.Api; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.se.plan.bean.EnginePlanQuery; +import net.northking.cctp.se.plan.servcie.EnginePlanInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +/** + * 自动化测试计划:委托、移除 + */ +@RequestMapping(value = "/v1") +@RestController +@Api(tags = "自动化测试计划:委托、移除") +public class AutomationTestPlanCtrl +{ + + private final EnginePlanInfoService apiService; + + public AutomationTestPlanCtrl(EnginePlanInfoService apiService){ + this.apiService = apiService; + } + + + @Autowired + private AtuPlanTaskSchedule schedule; + /** + * TODO 委托执行计划 + * + * @param requestBody + * @param request + * @param response + * @return + */ + @PostMapping(value = "/plan/entrust", + produces = MediaType.APPLICATION_JSON_VALUE, + consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultWrapper entrust(@RequestBody EnginePlanQuery requestBody, + HttpServletRequest request, + HttpServletResponse response + ) + { + ResultWrapper wrapper = new ResultWrapper<>(); + Integer integer = apiService.entrustEnginPlan(requestBody); + return wrapper.success(integer); + } + + /** + * TODO 移除执行计划 + * + * @param batchId + * @param request + * @param response + * @return + */ + @PostMapping(value = "/plan/remove", + produces = MediaType.APPLICATION_JSON_VALUE, + consumes = MediaType.APPLICATION_JSON_VALUE) + public ResultWrapper remove(@RequestBody + String batchId, + HttpServletRequest request, + HttpServletResponse response + ) + { + ResultWrapper wrapper = new ResultWrapper<>(); + Integer integer = apiService.removeEnginePlan(batchId); + return wrapper.success(integer); + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/AutoTask.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/AutoTask.java new file mode 100644 index 0000000..a83d351 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/AutoTask.java @@ -0,0 +1,243 @@ +package net.northking.cctp.se.plan.bean; + +import java.util.Map; + +public class AutoTask { + + private String taskId; + + private String batchId; + + private String planId; + + private String caseId; + + private String caseType; + + private String scriptPath; + + private Map caseParams; + + /** + * 应用设置;1-清除数据,2-卸载安装,3-清除并卸载 + */ + private String appSet; + + /** + * 录屏设置;0-不保存,1-全部保存,2-出错保存 + */ + private String screenRecordSet; + + /** + * 截图设置;0-不保存,1-全部保存,2-出错保存 + */ + private String screenshotSet; + + private int failRetryNum; + + /** + * 失败重试策略 + */ + private String retryStrategy; + + /** + * 当前重试次数 + */ + private int currentRetryNum; + + private String appId; + + private String projectId; + + private String tenantId; + + //引擎中获取 + private String deviceId; + + /** + * 1-pc,2-mobile,3-interface + */ + private String taskType; + + /** + * pc设备浏览器类型(0-无,1-IE,2-chrome,3-firefox,4-edge) + */ + private String browserType; + /** + * 移动引用下载路径 + */ + private String appDownloadUrl; + + /** + * 环境id + */ + private String envId; + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getCaseId() { + return caseId; + } + + public void setCaseId(String caseId) { + this.caseId = caseId; + } + + public String getCaseType() { + return caseType; + } + + public void setCaseType(String caseType) { + this.caseType = caseType; + } + + public String getScriptPath() { + return scriptPath; + } + + public void setScriptPath(String scriptPath) { + this.scriptPath = scriptPath; + } + + public Map getCaseParams() { + return caseParams; + } + + public void setCaseParams(Map caseParams) { + this.caseParams = caseParams; + } + + public String getAppSet() { + return appSet; + } + + public void setAppSet(String appSet) { + this.appSet = appSet; + } + + public String getScreenRecordSet() { + return screenRecordSet; + } + + public void setScreenRecordSet(String screenRecordSet) { + this.screenRecordSet = screenRecordSet; + } + + public String getScreenshotSet() { + return screenshotSet; + } + + public void setScreenshotSet(String screenshotSet) { + this.screenshotSet = screenshotSet; + } + + public int getFailRetryNum() { + return failRetryNum; + } + + public void setFailRetryNum(int failRetryNum) { + this.failRetryNum = failRetryNum; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getTaskType() { + return taskType; + } + + public void setTaskType(String taskType) { + this.taskType = taskType; + } + + public String getBrowserType() { + return browserType; + } + + public void setBrowserType(String browserType) { + this.browserType = browserType; + } + + public String getAppDownloadUrl() { + return appDownloadUrl; + } + + public void setAppDownloadUrl(String appDownloadUrl) { + this.appDownloadUrl = appDownloadUrl; + } + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public String getRetryStrategy() { + return retryStrategy; + } + + public void setRetryStrategy(String retryStrategy) { + this.retryStrategy = retryStrategy; + } + + public int getCurrentRetryNum() { + return currentRetryNum; + } + + public void setCurrentRetryNum(int currentRetryNum) { + this.currentRetryNum = currentRetryNum; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/EnginePlanInfo.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/EnginePlanInfo.java new file mode 100644 index 0000000..e5b636a --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/EnginePlanInfo.java @@ -0,0 +1,142 @@ +package net.northking.cctp.se.plan.bean; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Date; + +@Entity +@Table(name = "engine_plan_info") +public class EnginePlanInfo { + /** + * 主键 + */ + @Id + private String id; + + /** + * 计划主键 + */ + private String planId; + + /** + * 批次主键 + */ + private String batchId; + + /** + * 队列类型 + */ + private String type; + + /** + * 队列名称 + */ + private String queueName; + + /** + * 优先级(0-低,1-高) + */ + private String priority; + + /** + * 设备编号 + */ + private String deviceId; + + /** + * pc设备浏览器类型(1-IE,2-chrome,3-firefox,4-edge) + */ + private String browserType; + + /** + * 任务创建时间 + */ + private Date createdTime; + + /** + * 委托排序 + */ + private Long sort; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getQueueName() { + return queueName; + } + + public void setQueueName(String queueName) { + this.queueName = queueName; + } + + public String getPriority() { + return priority; + } + + public void setPriority(String priority) { + this.priority = priority; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getBrowserType() { + return browserType; + } + + public void setBrowserType(String browserType) { + this.browserType = browserType; + } + + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public Long getSort() { + return sort; + } + + public void setSort(Long sort) { + this.sort = sort; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/EnginePlanQuery.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/EnginePlanQuery.java new file mode 100644 index 0000000..65800af --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/EnginePlanQuery.java @@ -0,0 +1,98 @@ +package net.northking.cctp.se.plan.bean; + +import java.util.List; + +public class EnginePlanQuery { + + /** + * 主键 + */ + private String id; + + /** + * 计划主键 + */ + private String planId; + + /** + * 批次主键 + */ + private String batchId; + + /** + * 队列类型 + */ + private String type; + + /** + * 队列名称 + */ + private String queueName; + + /** + * 优先级(0-低,1-高) + */ + private String priority; + + /** + * 设备编号集合 + */ + private List deviceList; + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getQueueName() { + return queueName; + } + + public void setQueueName(String queueName) { + this.queueName = queueName; + } + + public String getPriority() { + return priority; + } + + public void setPriority(String priority) { + this.priority = priority; + } + + public List getDeviceList() { + return deviceList; + } + + public void setDeviceList(List deviceList) { + this.deviceList = deviceList; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/PlanDeviceInfo.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/PlanDeviceInfo.java new file mode 100644 index 0000000..fccac1d --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/PlanDeviceInfo.java @@ -0,0 +1,30 @@ +package net.northking.cctp.se.plan.bean; + +public class PlanDeviceInfo { + + /** + * 设备编号 + */ + private String deviceId; + + /** + * 浏览器类型(1-IE,2-chrome,3-firefox,4-edge)pc设备必填 + */ + private String browserType; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getBrowserType() { + return browserType; + } + + public void setBrowserType(String browserType) { + this.browserType = browserType; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/QuoteData.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/QuoteData.java new file mode 100644 index 0000000..5bb7e9b --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/QuoteData.java @@ -0,0 +1,45 @@ +package net.northking.cctp.se.plan.bean; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + * 引用静态数据 + */ + +@Data +@Setter +@Getter +public class QuoteData { + + /** + * 静态数据id + */ + private String setId; + + /** + * 单元格值 + */ + private String value; + + /** + * 列名 + */ + private String column; + + /** + * 行号 + */ + private int row; + + /** + * 静态数据路径 + */ + private String tip; + + /** + * 环境id + */ + private String envId; +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/TaskExecResult.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/TaskExecResult.java new file mode 100644 index 0000000..4a29907 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/bean/TaskExecResult.java @@ -0,0 +1,61 @@ +package net.northking.cctp.se.plan.bean; + +import lombok.Data; +import net.northking.cctp.se.device.bean.DevicePerInfo; + +import java.util.HashMap; +import java.util.Map; + +/** + * 任务执行结果信息 + */ +@Data +public class TaskExecResult { + + private String planId; + + private String batchId; + + private String taskId; + + private String caseId; + + private String caseType; + + private String appId; + + //任务状态 1-开始执行,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时 + private String status; + + private boolean needRetry; + + private String message; + + private String currentTime; + + //引擎中获取 + private String engineId; + + private String deviceId; + + private String videoPath; + + private String filePath; + + //断言失败截图 + private String imageUrl; + + //输出参数 + private Map outputs = new HashMap<>(); + + + /** + * 设备性能数据地址 + */ + private DevicePerInfo devicePerInfo; + + public void resetCurrentTime(){ + this.currentTime = Long.toString(System.currentTimeMillis()); + } + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/EnginePlanInfoService.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/EnginePlanInfoService.java new file mode 100644 index 0000000..0f67c48 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/EnginePlanInfoService.java @@ -0,0 +1,54 @@ +package net.northking.cctp.se.plan.servcie; + +import net.northking.cctp.se.plan.bean.EnginePlanInfo; +import net.northking.cctp.se.plan.bean.EnginePlanQuery; + +import java.util.List; + +public interface EnginePlanInfoService { + /** + * 委托计划 + */ + Integer entrustEnginPlan(EnginePlanQuery planParam); + + /** + * 移除计划批次 + */ + Integer removeEnginePlan(String batchId); + + /** + * 根据类型移除计划批次 + */ + void removeEnginePlanByType(String batchId,String type); + + /** + * 根据设备id获取计划批次信息 + */ + List queryInfoByDeviceId(String deviceId,String type); + + /** + * 获取所有设备id + */ + List queryAllDeviceId(String type); + + /** + * 获取所有计划批次信息 + */ + List queryAllPlanInfo(); + + /** + * 根据id删除计划批次信息 + */ + void deletePlanInfoById(String id); + + /** + * 上传未完成的执行结果文件 + */ + void uploadFinishedFile(); + + /** + * 更新计划顺序 + * @param id 计划id + */ + void updatePlanInfoSort(String id); +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/EnginePlanInfoServiceImpl.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/EnginePlanInfoServiceImpl.java new file mode 100644 index 0000000..a0ff6b9 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/EnginePlanInfoServiceImpl.java @@ -0,0 +1,187 @@ +package net.northking.cctp.se.plan.servcie; + +import com.alibaba.fastjson.JSON; +import net.northking.cctp.common.enums.FileBusinessTypeEnum; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.se.config.AtuServerConfig; +import net.northking.cctp.se.file.Attachment; +import net.northking.cctp.se.plan.bean.EnginePlanInfo; +import net.northking.cctp.se.plan.bean.EnginePlanQuery; +import net.northking.cctp.se.plan.bean.PlanDeviceInfo; +import net.northking.cctp.se.repository.EnginePlanInfoRepository; +import net.northking.cctp.se.util.HttpUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.web.client.RestTemplate; + +import java.io.File; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class EnginePlanInfoServiceImpl implements EnginePlanInfoService { + + private static final Logger logger = LoggerFactory.getLogger(EnginePlanInfoServiceImpl.class); + + @Autowired + private EnginePlanInfoRepository repository; + + @Autowired + private PlanDeviceService planDeviceService; + + @Autowired + private AtuServerConfig atuServerConfig; + + @Override + public Integer entrustEnginPlan(EnginePlanQuery planParam) { + logger.debug("任务计划委托开始。。。。。。。"); + List deviceIdList = planParam.getDeviceList(); + int count = 0; + if(CollectionUtils.isEmpty(deviceIdList)){ + return count; + } + logger.debug("任务计划委托信息 ------>: "+ JSON.toJSONString(planParam)); + try { + for (int i = 0; i < deviceIdList.size(); i++) { + PlanDeviceInfo s = deviceIdList.get(i); + EnginePlanInfo info = new EnginePlanInfo(); + BeanUtils.copyProperties(planParam,info); + info.setId(UUIDUtil.create32UUID()); + info.setDeviceId(s.getDeviceId()); + if(StringUtils.isNotBlank(s.getBrowserType())){ + info.setBrowserType(s.getBrowserType()); + } + info.setCreatedTime(new Date()); + info.setSort(0l); + repository.save(info); + count++; + } + } catch (Exception e) { + logger.error("委托计划失败:",e); + } + logger.debug("任务计划委托结束。。。。。。。"); + return count; + } + + @Override + public Integer removeEnginePlan(String batchId) { + try { + repository.deletePlanInfoByBatchId(batchId); + + planDeviceService.stopRunningExec(batchId); + } catch (Exception e) { + logger.error("移除计划批次信息失败:",e); + return 0; + } + return 1; + } + + @Override + public void removeEnginePlanByType(String batchId, String type) { + try { + repository.removeEnginePlanByType(batchId,type); + } catch (Exception e) { + logger.error("移除类型为:"+type+"的计划批次信息失败:",e); + } + } + + @Override + public List queryInfoByDeviceId(String deviceId,String type) { + List info = null; + try { + info = repository.getOneInfoByDeviceId(deviceId,type); + } catch (Exception e) { + logger.error("查询计划批次信息失败:",e); + } + return info; + } + + @Override + public List queryAllDeviceId(String type) { + return repository.getAllDeviceId(type); + } + + @Override + public List queryAllPlanInfo() { + return repository.selectAllPlanInfo(); + } + + @Override + public void deletePlanInfoById(String id) { + repository.deleteById(id); + } + + @Override + public void uploadFinishedFile() { + + logger.debug("检查是否存在未上传的任务结果文件开始。。。。"); + try { + String rootPath = System.getProperty("user.dir"); + String filePath = rootPath + File.separator + "tmp"; + logger.debug("未完成的结果文件路径:{}", filePath); + File file = new File(filePath); + if(!file.exists()){ + return; + } + RestTemplate restTemplate = new RestTemplate(); + String url = atuServerConfig.getServerUrl() + atuServerConfig.getTaskCancelResultUrl(); + if(file.isDirectory()){ + File[] listFiles = file.listFiles(); + if(listFiles.length>0){ + logger.debug("检查存在未上传的任务结果文件个数: "+listFiles.length); + for (int i = 0; i < listFiles.length; i++) { + File taskFile = listFiles[i]; + if (taskFile.isDirectory()) { + // 如果时文件夹跳过 + continue; + } + try { + String name = taskFile.getName(); + String fileName = name.substring(0, name.length() - 4); + String[] split = fileName.split("_"); + String tenantId = split[0]; + String taskId = split[1]; + String fileId = null; + Map paramMap = new HashMap<>(); + + Attachment upload = HttpUtils.upload(taskFile.getAbsolutePath(), tenantId, taskId, FileBusinessTypeEnum.TASK_EXECUTE_RESULT.getCode()); + if (upload != null && StringUtils.isNotBlank(upload.getId())) { + fileId = upload.getId(); + } + boolean delete = taskFile.delete(); + logger.info("删除 taskFile:{}",delete); + paramMap.put("taskId",taskId); + paramMap.put("filePath",fileId); + if(null!=fileId){ + ResponseEntity fileResult = restTemplate.postForEntity(url, paramMap, ResultWrapper.class); + if(HttpStatus.OK.equals(fileResult.getStatusCode())){ + logger.debug("任务结果文件补充上传成功。。。"); + } + } + }catch (Exception e2){ + logger.error("任务结果文件补充上传失败:",e2); + } + } + } + } + } catch (Exception e) { + logger.error("校验未上传文件失败:",e); + } + logger.debug("检查是否存在未上传的任务结果文件结束。。。。"); + } + + @Override + public void updatePlanInfoSort(String id) { + repository.updatePlanInfoSort(id); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/PlanDeviceService.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/PlanDeviceService.java new file mode 100644 index 0000000..38feb67 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/PlanDeviceService.java @@ -0,0 +1,20 @@ +package net.northking.cctp.se.plan.servcie; + +import net.northking.cctp.se.plan.bean.AutoTask; + +public interface PlanDeviceService { + + String TYPE_PC = "1"; + String TYPE_MOBILE = "2"; + String TYPE_INTERFACE = "3"; + + void sendTask2Exec(AutoTask task,String deviceToken); + + void stopRunningExec(String batchId); + + boolean isEnableAcceptTask(String type); + + void removeBatchInfo(String batchId); + + void removeExecThread(String taskId); +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/PlanDeviceServiceImpl.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/PlanDeviceServiceImpl.java new file mode 100644 index 0000000..ed2d315 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/plan/servcie/PlanDeviceServiceImpl.java @@ -0,0 +1,153 @@ +package net.northking.cctp.se.plan.servcie; + +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.se.exec.DefaultExecThread; +import net.northking.cctp.se.plan.bean.AutoTask; +import net.northking.cctp.se.thread.ExecutorPool; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +@Service +public class PlanDeviceServiceImpl implements PlanDeviceService { + + /** + * 日志 + */ + private static final Logger logger = LoggerFactory.getLogger(PlanDeviceServiceImpl.class); + + private Map threadMap = new ConcurrentHashMap<>(); + + private Map> batchMap = new HashMap<>(); + + @Autowired + private RabbitTemplate rabbitTemplate; + + private final static Lock lock = new ReentrantLock(true); + + @Override + public void sendTask2Exec(AutoTask task, String deviceToken) { + + DefaultExecThread thread = new DefaultExecThread(task,deviceToken,true,this.rabbitTemplate); + threadMap.put(task.getTaskId(),thread); + lock.lock(); + try { + Set castSet = batchMap.get(task.getBatchId()); + if(CollectionUtils.isEmpty(castSet)){ + castSet = new HashSet<>(); + castSet.add(task.getTaskId()); + batchMap.put(task.getBatchId(),castSet); + }else{ + castSet.add(task.getTaskId()); + } + } catch (Exception e) { + logger.error("暂存线程信息失败:",e); + } finally { + lock.unlock(); + } + String type = task.getTaskType(); + if(TYPE_PC.equalsIgnoreCase(type)){ + try { + for (int i = 0; i < 30; i++) { + if (ExecutorPool.isPCAvailable()) { + ExecutorPool.getPCPool().submit(thread); + logger.debug("任务提交执行,终止循环"); + break; + } else { + if (i == 0) { + logger.debug("设备处于忙碌,最长等待30秒。。。"); + } + Thread.sleep(1000L); + if (i == 25){ + throw new ExecuteException("设备过于忙碌无法释放"); + } + } + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new ExecuteException("获取线程被打断"); + } + } + if(TYPE_MOBILE.equalsIgnoreCase(type) && ExecutorPool.isMobileAvailable()){ + ExecutorPool.getMobilePool().submit(thread); + } + if(TYPE_INTERFACE.equalsIgnoreCase(type) && ExecutorPool.isApiAvailable()){ + ExecutorPool.getApiPool().submit(thread); + } + + } + + @Override + public void stopRunningExec(String batchId) { + lock.lock(); + try { + Set castSet = batchMap.get(batchId); + if(!CollectionUtils.isEmpty(castSet)){ + for (String next : castSet) { + DefaultExecThread execThread = threadMap.remove(next); + if (execThread != null) { + execThread.destroy(next); + } + } + } + } catch (Exception e) { + logger.error("终止任务执行失败:",e); + } finally { + lock.unlock(); + batchMap.remove(batchId); + } + } + + /** + * 校验引擎是否可接受任务 + */ + @Override + public boolean isEnableAcceptTask(String type) { + if(TYPE_INTERFACE.equalsIgnoreCase(type)){ + return ExecutorPool.isApiAvailable(); + } + if(TYPE_MOBILE.equalsIgnoreCase(type)){ + return ExecutorPool.isMobileAvailable(); + } + return false; + } + + @Override + public void removeBatchInfo(String batchId) { + lock.lock(); + try { + Set castSet = batchMap.get(batchId); + if(!CollectionUtils.isEmpty(castSet)){ + for (String next : castSet) { + threadMap.remove(next); + } + } + } catch (Exception e) { + logger.error("终止任务执行失败:",e); + } finally { + lock.unlock(); + batchMap.remove(batchId); + } + } + + @Override + public void removeExecThread(String taskId) { + lock.lock(); + try { + threadMap.remove(taskId); + } catch (Exception e) { + logger.error("移除任务执行线程失败", e); + } finally { + lock.unlock(); + } + } + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/repository/EnginePlanInfoRepository.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/repository/EnginePlanInfoRepository.java new file mode 100644 index 0000000..7808e40 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/repository/EnginePlanInfoRepository.java @@ -0,0 +1,42 @@ +package net.northking.cctp.se.repository; + +import net.northking.cctp.se.plan.bean.EnginePlanInfo; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Repository +public interface EnginePlanInfoRepository extends JpaRepository { + + @Query(value = "select * from engine_plan_info where device_id = :deviceId and type = :type order by priority desc , sort asc , created_time asc" + ,nativeQuery = true) + List getOneInfoByDeviceId(@Param("deviceId") String deviceId,@Param("type") String type); + + @Transactional + @Modifying + @Query(value="delete from engine_plan_info where batch_id = :batchId",nativeQuery = true) + void deletePlanInfoByBatchId(@Param("batchId") String batchId); + + @Transactional + @Modifying + @Query(value = "delete from engine_plan_info where batch_id = :batchId and type = :type",nativeQuery = true) + void removeEnginePlanByType(@Param("batchId") String batchId,@Param("type") String type); + + @Query(value = "select distinct device_id from engine_plan_info where type = :type" + ,nativeQuery = true) + List getAllDeviceId(@Param("type") String type); + + @Query(value = "select * from engine_plan_info where 1 = 1" + ,nativeQuery = true) + List selectAllPlanInfo(); + + @Transactional + @Modifying + @Query(value = "update engine_plan_info set sort = sort + 1 where id = :id",nativeQuery = true) + void updatePlanInfoSort(@Param("id") String id); +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/LogicStepType.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/LogicStepType.java new file mode 100644 index 0000000..9a871e5 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/LogicStepType.java @@ -0,0 +1,21 @@ +package net.northking.cctp.se.script.bean; + +public enum LogicStepType { + + _if, + _if_condition, + _if_true, + _else_if, + _else, + _for, + _break; + + public static LogicStepType get(String type) { + for (LogicStepType value : values()) { + if (value.name().equals(type)) { + return value; + } + } + return null; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/Script.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/Script.java new file mode 100644 index 0000000..347ada4 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/Script.java @@ -0,0 +1,55 @@ +package net.northking.cctp.se.script.bean; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * 脚本对象 + * @author xuyang.wang + */ +@Data +@NoArgsConstructor +public class Script implements Serializable { + /** + * 脚本ID + */ + private String id; + /** + * 引擎版本 + */ + private String engineVersion; + /** + * 脚本信息 + */ + private Map scriptInfo; + /** + * 被测对象信息 + */ + private TestTarget[] testTargets; + /** + * 脚本运行环境 + */ + private ScriptRuntime runtime; + /** + * 全局设置 + */ + private Map globalSettings; + /** + * 脚本变量信息 + */ + private Variable[] variables; + /** + * 脚本资源信息 + */ + private Map> resources; + /** + * 脚本步骤信息 + */ + private ScriptStep[] commands; + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/ScriptResource.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/ScriptResource.java new file mode 100644 index 0000000..dafbc37 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/ScriptResource.java @@ -0,0 +1,41 @@ +package net.northking.cctp.se.script.bean; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * 脚本资源对象 + * @author xuyang.wang + */ +@Data +public class ScriptResource implements Serializable { + /** + * 资源ID + */ + private String resId; + /** + * 资源版本 + */ + private String resVersion; + /** + * 资源地址 + */ + private String resUri; + /** + * 资源类型 + */ + private String resType; + + /** + * 资源名称 + */ + private String resName; + + /** + * 资源扩展信息 + */ + private Map resExt; + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/ScriptRuntime.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/ScriptRuntime.java new file mode 100644 index 0000000..722a2e4 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/ScriptRuntime.java @@ -0,0 +1,23 @@ +package net.northking.cctp.se.script.bean; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 脚本运行 + * @author xuyang.wang + */ +@Data +public class ScriptRuntime implements Serializable { + /** + * 可运行的操作系统,如果为空或者any表示不限制 + */ + private String[] os; + /** + * + */ + private String osArch; + private String cpuArch; + private String[] browser; +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/ScriptStep.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/ScriptStep.java new file mode 100644 index 0000000..27e5252 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/ScriptStep.java @@ -0,0 +1,141 @@ +package net.northking.cctp.se.script.bean; + +import lombok.Data; +import net.northking.cctp.element.core.IScriptStep; +import net.northking.cctp.element.core.exception.ExecuteException; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 脚本步骤对象 + * @author xuyang.wang + */ +@Data +public class ScriptStep implements IScriptStep, Serializable { + /** + * 步骤Id + */ + private String id; + /** + * 是否跳过步骤 + */ + private boolean skip; + /** + * 出错继续下一步 + */ + private boolean ignoreError; + /** + * 调用组件库 + */ + private String componentLib; + /** + * 调用组件命令 + */ + private String command; + /** + * 步骤操作对象 + */ + private List targets; + /** + * 步骤输出对象 + */ + private Map output; + /** + * 步骤变量 + */ + private Map args; + /** + * 步骤标题 + */ + private String title; + /** + * 步骤缩略图 + */ + private String imgUri; + /** + * 子步骤 + */ + private ScriptStep[] children; + /** + * if步骤map + */ + private Map> ifStepMap; + /** + * + */ + private String ifStep; + /** + * 可执行的子步骤 + */ + private List childSteps; + + /** + * 是否最后一步 + */ + private boolean finalStep; + + /** + * 父步骤的下一步 + */ + private String parentNextStepId; + + /** + * 扩展属性 + */ + private Map extAttrs; + + /** + * 输入参数 + */ + private Map inputMap = new HashMap<>(); + + public String getExtAttr(String attrKey) { + if (this.extAttrs != null && this.extAttrs.containsKey(attrKey) + && this.extAttrs.get(attrKey) != null) { + return this.extAttrs.get(attrKey).toString(); + } + return null; + } + + public String getArg(String argKey) { + if (this.args != null && this.args.containsKey(argKey) + && this.args.get(argKey) != null) { + return this.args.get(argKey); + } + return null; + } + + public void addChildStep(ScriptStep child) { + if (null == this.childSteps) { + this.childSteps = new ArrayList<>(); + } + this.childSteps.add(child); + } + + /** + * 添加if组件的步骤 + * + * @param key + * @param children + */ + public void addIfStep(String key, ScriptStep children) { + if (StringUtils.isBlank(key)) { + return; + } + try { + LogicStepType type = LogicStepType.valueOf(children.getCommand().toLowerCase()); + if (ifStepMap == null) { + ifStepMap = new HashMap<>(); + } + ifStepMap.computeIfAbsent(type.name(), k -> new ArrayList<>()); + ifStepMap.get(type.name()).add(children); + } catch (Exception e) { + throw new ExecuteException(String.format("组件 %s 不属于if的子组件", key)); + } + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/StepTarget.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/StepTarget.java new file mode 100644 index 0000000..2987d18 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/StepTarget.java @@ -0,0 +1,27 @@ +package net.northking.cctp.se.script.bean; + +import lombok.Data; +import net.northking.cctp.element.core.IStepTarget; + +import java.io.Serializable; + +/** + * 步骤操作对象 + * @author xuyang.wang + */ +@Data +public class StepTarget implements IStepTarget, Serializable { + /** + * 元素查找方式 + */ + private String using; + /** + * 定位表达式 + */ + private String value; + /** + * 备选Or必选 + */ + private String strategy; +} + diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/TestTarget.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/TestTarget.java new file mode 100644 index 0000000..5916498 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/TestTarget.java @@ -0,0 +1,12 @@ +package net.northking.cctp.se.script.bean; + +import lombok.Data; +import net.northking.cctp.element.core.ITestTarget; + +import java.io.Serializable; +import java.util.Map; +@Data +public class TestTarget implements ITestTarget, Serializable { + private String targetType; + private Map target; +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/Variable.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/Variable.java new file mode 100644 index 0000000..72d93a7 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/Variable.java @@ -0,0 +1,45 @@ +package net.northking.cctp.se.script.bean; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 脚本变量对象 + * @author xuyang.wang + */ +@Data +public class Variable implements Serializable { + /** + * 变量名称 + */ + private String name; + /** + * 变量描述 + */ + private String desc; + /** + * 变量默认值 + */ + private String defaultValue; + /** + * 变量类型 + */ + private String type; + /** + * 变量实际值 + */ + private String value; + /** + * 是否为输入项 + */ + private boolean input; + /** + * 是否为输出项 + */ + private boolean output; + /** + * 引用变量步骤ID + */ + private String[] quoted; +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/VariableDto.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/VariableDto.java new file mode 100644 index 0000000..674b2f9 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/bean/VariableDto.java @@ -0,0 +1,23 @@ +package net.northking.cctp.se.script.bean; + +import lombok.Data; + +@Data +public class VariableDto { + private String name; + + private String value; + + private String projectId; + + private String scriptId; + + private String defaultValue; + + private boolean variableType; // 全局变量 false | 脚本变量 true + + private boolean exist = true; + + private String dataType; +} + diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/IScriptRuntimeContext.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/IScriptRuntimeContext.java new file mode 100644 index 0000000..18ee197 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/IScriptRuntimeContext.java @@ -0,0 +1,53 @@ +package net.northking.cctp.se.script.core; + + +import net.northking.cctp.element.core.IExecuteContext; +import net.northking.cctp.se.debug.bean.DebuggerRequest; +import net.northking.cctp.se.script.bean.Variable; + +/** + * 脚本运行时上下文接口 + */ +public interface IScriptRuntimeContext extends IExecuteContext { + String KEY_CURRENT_REQUEST = "__currentRequest"; + String KEY_CURRENT_STEP = "__currentStep"; + String KEY_CURRENT_DRIVER = "__deviceDriver"; + String KEY_CURRENT_CONN = "__deviceConnection"; + String KEY_TASK_TENANT = "__tenantId"; + String KEY_FOR_CURRENT_INDEX = "__forCurrentIndex"; + String KEY_ENV_ID = "__envId"; + String APP_VERSION = "__appVersion"; + String IS_DEBUG = "__isDebug"; + String SNAPSHOT = "__snapshot"; + String ERROR_SNAPSHOT = "__errorSnapshot"; + DebuggerRequest getCurrentRequest(); + /** + * 脚本运行过程中是否截屏 + * @return + */ + boolean isSnapshot(); + /** + * 脚本运行过程中是否录屏 + * @return + */ + boolean isRecord(); + /** + * 脚本运行过程中是否采集移动设备日志 + */ + boolean isSaveMobileSyslog(); + + /** + * 获取变量定义 + * @param key + * @return + */ + Variable getVariableInfo(String key); + + /** + * 设置上下文变量 + * @param key + * @param object + */ + void setContextVariable(String key,Object object); + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptExecuteResult.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptExecuteResult.java new file mode 100644 index 0000000..970b039 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptExecuteResult.java @@ -0,0 +1,49 @@ +package net.northking.cctp.se.script.core; + +import lombok.Data; +import net.northking.cctp.se.script.bean.Script; + +import java.util.ArrayList; +import java.util.List; + +/** + * 脚本执行结果 + */ +@Data +public class ScriptExecuteResult { + /** + * 关联脚本 + */ + private Script script; + /** + * 如果录屏,录屏文件地址 + */ + private String recordUrl; + /** + * 如果采集日志,日志文件存储地址 + */ + private String logUrl; + /** + * 脚本步骤执行结果 + */ + private List stepExecuteResults = new ArrayList<>(); + /** + * 脚本执行开始时间 + */ + private long startTime; + /** + * 脚本执行结束时间 + */ + private long endTime; + /** + * 脚本执行结果状态:0-正常执行成功结束,1-执行异常结束,2-断言失败结束,3-用户终止结束 + */ + private int resultStatus; + /** + * 脚本执行结果信息 + */ + private String resultMsg; + public void addStepResult(StepExecuteResult stepExecuteResult){ + stepExecuteResults.add(stepExecuteResult); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptExecutor.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptExecutor.java new file mode 100644 index 0000000..10c0a9e --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptExecutor.java @@ -0,0 +1,96 @@ +package net.northking.cctp.se.script.core; + + +import net.northking.cctp.se.script.bean.Script; + +import java.util.Map; + +/** + * 脚本执行器以及运行时上下文 + */ +public interface ScriptExecutor extends IScriptRuntimeContext{ + /** + * 脚本运行标识:任务ID或者调试会话ID + * @return + */ + String getRuntimeIdentifier(); + /** + * 初始化数据 + */ + void initData(Map data); + /** + * 运行脚本 + * @param script + */ + ScriptExecuteResult runScript(Script script, ScriptExecuteResult ret); + + /** + * 初始化脚本信息 + * @param script + */ + void init(Script script); + /** + * 重置 + */ + void reset(Script script); + /** + * 添加脚本运行监听器 + */ + void setRuntimeListener(ScriptRuntimeListener listener); + + /** + * 从制定步骤开始回放 + * @param script + * @param scriptStepId + * @return + */ + ScriptExecuteResult runStep(Script script, String scriptStepId, String replayType); + + /** + * 单步执行 + * @param script + * @param scriptStepId + * @return + */ + ScriptExecuteResult runStep(Script script, String scriptStepId, boolean oneStepFlag, String replayType); + + /** + * 设置请求标志id + * @param requestId + */ + void setRequestId(String requestId); + + /** + * 清理临时资源文件 + */ + void clearResource(); + + /** + * + * @param ignoreError + */ + void setIgnoreError(boolean ignoreError); + + /** + * 设置脚本数据 + * @param script + */ + void setScript(Script script); + + /** + * 设置任务Id + * @param taskId 任务Id + */ + void setCurrentTaskId(String taskId); + + /** + * 设置项目id + * @param projectId 项目id + */ + void setProjectId(String projectId); + + /** + * 获取项目id + */ + String getProjectId(); +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptResolutionService.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptResolutionService.java new file mode 100644 index 0000000..cb05fb1 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptResolutionService.java @@ -0,0 +1,60 @@ +package net.northking.cctp.se.script.core; + +import net.northking.cctp.se.script.bean.Script; + +import java.util.Map; + +/** + * 脚本解析服务 + * @author xuyang.wang + */ +public interface ScriptResolutionService { + /** + * 解析脚本 + * @param scriptJson + * @return + */ + Script parse(String scriptJson); + /** + * 是否可运行,判断本地环境是否满足脚本运行环境要求 + * @param script + * @return + */ + boolean isRunnable(Script script); + /** + * 准备脚本依赖资源 + * @param script + */ + void prepareScriptResources(Script script); + + /** + * 获取脚本执行器 + * @param identifier + * @return + */ + ScriptExecutor getScriptExecutor(String identifier); + + /** + * 移除 + * @param identifier + * @return + */ + ScriptExecutor removeScriptExecutor(String identifier); + + /** + * 创建调试脚本运行引擎 + * @param debugInfo + * @param script + * @return + */ + ScriptExecutor createDebugScriptRuntime(Map debugInfo, Script script); + + /** + * 创建自动化任务脚本运行引擎 + * @param taskInfo + * @param script + * @return + */ + ScriptExecutor createTaskScriptRuntime(Map taskInfo, Script script); + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptRuntimeListener.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptRuntimeListener.java new file mode 100644 index 0000000..587024e --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/ScriptRuntimeListener.java @@ -0,0 +1,16 @@ +package net.northking.cctp.se.script.core; + +import net.northking.cctp.se.log.bean.StepLog; + +/** + * 脚本运行时监听器 + */ +public interface ScriptRuntimeListener { + void doLog(IScriptRuntimeContext context, String level, String msg); + + void doLog(IScriptRuntimeContext context, StepLog steplog); + + void doReply(IScriptRuntimeContext context,StepExecuteResult result); + + void doReply(IScriptRuntimeContext context, String cmd, String level, Object obj); +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/StepExecuteResult.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/StepExecuteResult.java new file mode 100644 index 0000000..fb1618d --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/core/StepExecuteResult.java @@ -0,0 +1,61 @@ +package net.northking.cctp.se.script.core; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import net.northking.cctp.se.script.bean.ScriptStep; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 步骤执行结果 + */ +@Data +public class StepExecuteResult { + private String retId; // 步骤执行结果id + private String scriptId; // 脚本id + private String stepId; // 步骤id + private ScriptStep step; // 步骤信息 + + /** + * 调用组件库 + */ + private String componentLib; + /** + * 调用组件命令 + */ + private String command; + + private String nextStepId; // 下一步骤id + private boolean success; // 执行结果 + private boolean isExecuted; // 是否已经执行了 + private String msg; // + private boolean finish; // + private String actualImgUri; // 实际截图地址 + private String imgUri; // 截图地址 + private String requestId; + + private String inputMsg; + private List childResult; + private long executeTime; + private Object keywordReturn; + @JsonIgnore + private boolean afterLogicExec; + + private Map result = new HashMap<>(); + + private Map paramMap = new HashMap<>(); + + private Map output = new HashMap<>(); + + private String outputMsg; + + public void addChildResult(StepExecuteResult stepResult) { + if (childResult == null) { + childResult = new ArrayList<>(); + } + childResult.add(stepResult); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/service/ScriptResolutionServiceImpl.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/service/ScriptResolutionServiceImpl.java new file mode 100644 index 0000000..9724a0a --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/service/ScriptResolutionServiceImpl.java @@ -0,0 +1,149 @@ +package net.northking.cctp.se.script.service; + +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.se.script.bean.Script; +import net.northking.cctp.se.script.bean.ScriptRuntime; +import net.northking.cctp.se.script.core.ScriptExecutor; +import net.northking.cctp.se.script.core.ScriptResolutionService; +import net.northking.cctp.se.util.JsonUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 脚本准备服务 + */ +@Slf4j +@Service +public class ScriptResolutionServiceImpl implements ScriptResolutionService { + private Map scriptExecutorMap = new ConcurrentHashMap<>(); + @Override + public Script parse(String scriptJson) { + log.info("Parsing the script json string"); + return JsonUtils.fromJsonString(scriptJson,Script.class); + } + + @Override + public void prepareScriptResources(Script script) { + log.info("Preparing the script resource ..."); + + log.info("Script resources prepared."); + } + + @Override + public ScriptExecutor getScriptExecutor(String identifier) { + return scriptExecutorMap.get(identifier); + } + + /** + * 移除 + * + * @param identifier + * @return + */ + @Override + public ScriptExecutor removeScriptExecutor(String identifier) { + return scriptExecutorMap.remove(identifier); + } + + @Override + public ScriptExecutor createDebugScriptRuntime(Map debugInfo, Script script) { + if (debugInfo==null){ + log.warn("Invalid debugInfo"); + return null; + } + String identifier = (String)debugInfo.get("sessionId"); + String projectId = (String)debugInfo.get("projectId"); + String envId = (String) debugInfo.get("envId"); + ScriptExecutor executor = new ScriptRuntimeExecutor(identifier, projectId, envId, script); + scriptExecutorMap.put(identifier,executor); + return executor; + } + + @Override + public ScriptExecutor createTaskScriptRuntime(Map taskInfo, Script script) { + if (taskInfo==null || script == null){ + log.warn("Invalid debugInfo or script"); + return null; + } + String identifier = (String)taskInfo.get("scheduleId"); + String projectId = (String)taskInfo.get("projectId"); + boolean snapshot = (boolean)taskInfo.get("snapshot"); + boolean errorSnapshot = (boolean)taskInfo.get("errorSnapshot"); + String envId = null; + if (null != taskInfo.get("envId")) { + envId = (String) taskInfo.get("envId"); + } + ScriptExecutor executor = new ScriptRuntimeExecutor(identifier,projectId, envId,script,errorSnapshot,snapshot); + + scriptExecutorMap.put(identifier,executor); + return executor; + } + + + @Override + public boolean isRunnable(Script script) { + log.info("Check the script whether is runnable ..."); + if(null == script){ + return false; + } + ScriptRuntime requiredRuntime = script.getRuntime(); + if (null == requiredRuntime){//说明对运行环境无要求 + return true; + } + if(!checkOS(requiredRuntime)){//如果操作系统不满足要求 + return false; + } + if (!checkOSArch(requiredRuntime)){//如果OS Arch不满足要求 + return false; + } + if (!checkCpuArch(requiredRuntime)){//如果CPU Arch不满足要求 + return false; + } + return true; + } + + private boolean checkOS(ScriptRuntime runtime) { + log.info("Check the OS ..."); + String[] os = runtime.getOs(); + if (null == os || os.length ==0 || Arrays.binarySearch(os,"any")==-1){ + return true; + } + String sysOS = System.getProperty("os"); + boolean ret = Arrays.binarySearch(os,sysOS) > -1; + if (!ret){ + log.warn("Required OS:{},actual OS:{}",Arrays.toString(os),sysOS); + } + return ret; + } + private boolean checkOSArch(ScriptRuntime runtime) { + log.info("Check the OSArch ..."); + String osArch = runtime.getOsArch(); + if (StringUtils.isBlank(osArch) || "any".equalsIgnoreCase(osArch)){ + return true; + } + String sysOSArch = System.getProperty("osArch"); + boolean ret = osArch.equalsIgnoreCase(sysOSArch); + if (!ret){ + log.warn("Required OS Arch:{},actual OS Arch:{}",osArch,sysOSArch); + } + return ret; + } + + private boolean checkCpuArch(ScriptRuntime runtime) { + log.info("Check the CpuArch ..."); + String cpuArch = runtime.getCpuArch(); + if (StringUtils.isBlank(cpuArch) || "any".equalsIgnoreCase(cpuArch)){ + return true; + } + String sysCpuArch = System.getProperty("cpuArch"); + boolean ret = cpuArch.equalsIgnoreCase(sysCpuArch); + if (!ret){ + log.warn("Required CPU Arch:{},actual CPU Arch:{}",cpuArch,sysCpuArch); + } + return ret; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/service/ScriptRuntimeExecutor.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/service/ScriptRuntimeExecutor.java new file mode 100644 index 0000000..48e317f --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/script/service/ScriptRuntimeExecutor.java @@ -0,0 +1,2057 @@ +package net.northking.cctp.se.script.service; + + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.common.enums.FileBusinessTypeEnum; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.element.core.IExecuteContext; +import net.northking.cctp.element.core.IScriptStep; +import net.northking.cctp.element.core.ITestTarget; +import net.northking.cctp.element.core.exception.AssertException; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.element.core.exception.KeywordNotFoundException; +import net.northking.cctp.element.core.keyword.KeywordArgument; +import net.northking.cctp.element.core.type.LibraryConstant; +import net.northking.cctp.se.component.ComponentLibrary; +import net.northking.cctp.se.component.ComponentManagementService; +import net.northking.cctp.se.component.InternalComponent; +import net.northking.cctp.se.component.MdBusComponentInfoDetailDto; +import net.northking.cctp.se.config.AtuServerConfig; +import net.northking.cctp.se.debug.bean.DebugerConst; +import net.northking.cctp.se.debug.bean.DebuggerRequest; +import net.northking.cctp.se.device.bean.DeviceInfo; +import net.northking.cctp.se.device.service.DeviceConnection; +import net.northking.cctp.se.file.Attachment; +import net.northking.cctp.se.lifecycle.EngineRuntime; +import net.northking.cctp.se.log.bean.StepLog; +import net.northking.cctp.se.script.bean.*; +import net.northking.cctp.se.script.core.*; +import net.northking.cctp.se.util.*; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.openqa.selenium.WebDriverException; +import org.springframework.boot.logging.LogLevel; +import org.springframework.context.ApplicationContext; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.util.CollectionUtils; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import java.io.*; +import java.lang.reflect.InvocationTargetException; +import java.util.*; + +/** + * 脚本执行器 + */ +@Slf4j +public class ScriptRuntimeExecutor implements ScriptExecutor { + private String identifier; + private String projectId; //项目ID,用于获取或更新项目级全局变量值 + private String tenantId; // 通过projectId获取,用于 + private String envId; // 环境id + private ApplicationContext applicationContext; + private Script script; + private boolean record; + private boolean saveSysLog; // 保存系统日志,计划执行可能用上 + private boolean snapshot; // 是否截图 + private boolean errorSnapshot; // 错误异常发生后截图 + private String requestId; // 请求标志id + private String currentStepTitle; // 当前步骤名称 + private String currentStepType; // 当前步骤类型 + private String currentStepId; // 当前步骤的id + private ScriptStep nextStep; + + private String startStepId; // 第一步的id + private boolean startFlag; // 如果startStepId找到,那么设置成true + private boolean singleStepRelay; // 是否但不会放 + private String replayType = DebugerConst.ReplayType.TYPE_ALL; + + private StepLog stepLog; // 步骤日志内容 + private Map scriptStepMap = new HashMap<>(); + + private ScriptRuntimeExecutor parentContext; // 父级执行器 + + private Map variables = new HashMap<>(); // 变量列表 + private Map projectGlobalVars = new HashMap<>(); // 项目全局变量 + private Map dependScriptResourceMap = new HashMap<>(); // 依赖 + private Map variableMap = new HashMap<>(); // 脚本变量信息 + private Map globalVarmap = new HashMap<>(); // 全局变量信息 + @VisibleForTesting + private List commands = new ArrayList<>(); + + private Map contextVars = new HashMap<>(); // 上下文变量集合 + private Map libraryInstanceMap = new HashMap<>(); // + private Map sonExecutorMap = new HashMap<>(); + private ScriptRuntimeListener listener; + private String currentTaskId; + + public ScriptRuntimeExecutor(String identifier, String projectId, String envId, Script script) { + this(identifier, projectId, script, false, false, false); + } + + private String resourcePathPrefix = "resource" + File.separator; + + public ScriptRuntimeExecutor(String identifier, String projectId, Script script, boolean record, boolean saveSysLog, boolean snapshot) { + this.identifier = identifier; + this.projectId = projectId; + this.script = script; + this.record = record; + this.saveSysLog = saveSysLog; + this.snapshot = snapshot; + applicationContext = SpringUtils.getContext(); + } + + public ScriptRuntimeExecutor(String identifier, String projectId, String envId, + Script script, boolean errorSnapshot, + boolean snapshot, ScriptRuntimeListener listener, ScriptRuntimeExecutor parent) { + this.identifier = identifier; + this.projectId = projectId; + this.envId = envId; + this.script = script; + this.errorSnapshot = errorSnapshot; + this.snapshot = snapshot; + this.saveSysLog = false; + applicationContext = SpringUtils.getContext(); + this.listener = listener; + this.parentContext = parent; + } + + public ScriptRuntimeExecutor(String identifier, String projectId, String envId, + Script script, boolean errorSnapshot, boolean snapshot) { + this.identifier = identifier; + this.projectId = projectId; + this.envId = envId; + this.script = script; + this.errorSnapshot = errorSnapshot; + this.snapshot = snapshot; + this.saveSysLog = false; + applicationContext = SpringUtils.getContext(); + } + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public void setCurrentTaskId(String taskId) { + this.currentTaskId = taskId; + } + + public ScriptRuntimeExecutor getParent() { + return parentContext; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + @Override + public String getRuntimeIdentifier() { + return identifier; + } + + public Script getScript() { + return script; + } + + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + + public void setParentContext(ScriptRuntimeExecutor parentContext) { + this.parentContext = parentContext; + } + + public void setLibraryInstanceMap(Map libraryInstanceMap) { + this.libraryInstanceMap = libraryInstanceMap; + } + + /** + * 数据初始化,业务调用 + * + * @param data + */ + @Override + public void initData(Map data) { + + } + + private void initVariables(Variable[] vars) { + log.info("Init variables ..."); + if (vars != null && vars.length > 0) { + for (Variable var : vars) { + variableMap.put(var.getName(), var); + if (StringUtils.isBlank(var.getValue())) { // 如果变量的value不为空,也就是直接获取value 单步回放用到 + var.setValue(var.getDefaultValue()); + } + variables.put(var.getName(), var.getValue()); + } + } + log.info("Init variables 完成,最终结果:variableMap ----->{}", JsonUtils.toJson(variableMap)); + log.info("Init variables 完成,最终结果:variables ----->{}", JsonUtils.toJson(variables)); + } + + private void initGlobalSetting() { + script.getGlobalSettings(); + } + + /** + * 初始化脚本信息 + * + * @param script + */ + @Override + public void init(Script script) { + try { + doLog(LogLevel.INFO.name(), String.format("正在使用执行机:%s",EngineRuntime.getRuntime().getEngineInfo().getIpAddress())); + initVariables(script.getVariables()); // 初始化变量 + initScriptResources(script.getResources()); // 初始化脚本资源 + initScriptSteps(script.getCommands()); // 初始化脚本步骤 + initTenant(); + initEnv(); // 初始化环境信息 + this.nextStep = null; + } catch (Exception e) { + log.error("初始化异常", e); + // 输出失败日志,reply_log + doLog(LogLevel.ERROR.name(), e.getMessage()); + // 输出解析失败日志, reply + StepExecuteResult result = new StepExecuteResult(); + result.setSuccess(false); + result.setExecuted(true); + result.setFinish(true); + result.setMsg(e.getMessage()); + result.setRequestId(requestId); + result.setRetId(UUIDUtil.create32UUID()); + result.setScriptId(script.getId()); + if (null != getCurrentRequest() && null != getCurrentRequest().getData().get(DebugerConst.ReqConst.KEY_REPLAY_FROM_STEP_ID)) { + result.setStepId(getCurrentRequest().getData().get(DebugerConst.ReqConst.KEY_REPLAY_FROM_STEP_ID).toString()); + result.getResult().put(DebugerConst.ReplyConst.KEY_STEP_ID, result.getStepId()); + } + doReply(result); + + throw e; + } + } + + private void initEnv() { + setContextVariable(KEY_ENV_ID, this.envId); + } + + /** + * 设置租户信息 + */ + private void initTenant() { + if (ObjectUtils.isNotEmpty(getContextVariable(IScriptRuntimeContext.KEY_TASK_TENANT))) { + this.tenantId = (String)getContextVariable(IScriptRuntimeContext.KEY_TASK_TENANT); + } else { + // 通过projectId获取 + AtuServerConfig config = SpringUtils.getBean(AtuServerConfig.class); + String url = config.getServerUrl() + config.getProjectInfo(); + RestTemplate restTemplate = new RestTemplate(); + try { + ResultWrapper> wrapper = restTemplate.getForObject(url, ResultWrapper.class, this.projectId); + if (wrapper != null && wrapper.isSuccess() && wrapper.getData() != null) { + if (wrapper.getData().containsKey("tenantId") && wrapper.getData().get("tenantId") != null) { + this.tenantId = (String)wrapper.getData().get("tenantId"); + } + } + log.debug("请求项目信息:{}", JsonUtils.toJson(wrapper)); + } catch (Exception e) { + log.error("请求获取项目信息失败", e); + } + } + log.debug("initTenant的projectId:{}",projectId); + setContextVariable(IScriptRuntimeContext.KEY_TASK_TENANT, this.tenantId); + } + + /** + * 获取脚本资源 + * 通过resource字段,预先将资源下载到本地 + */ + private void initScriptResources(Map> resources) { +// Map> resources = script.getResources(); + for (List resourceList : resources.values()) { + for (ScriptResource resource : resourceList) { + dependScriptResourceMap.put(resource.getResId(), resource); + } + } + log.info("initScriptResources完成,最终结果:dependScriptResourceMap ----->{}", JsonUtils.toJson(dependScriptResourceMap)); +// doLog("初始化脚本资源成功"); + } + + /** + * @param resource + */ + private File resourceDownload(ScriptResource resource) { + AtuServerConfig config = SpringUtils.getBean(AtuServerConfig.class); + RestTemplate restTemplate = new RestTemplate(); + //根据业务组件id获取最新业务组件的信息 + String busComInfoUrl = config.getServerUrl()+config.getBusComInfoUrl(); + MdBusComponentInfoDetailDto dto = new MdBusComponentInfoDetailDto(); + try { + String responseBody = restTemplate.postForObject(busComInfoUrl, resource.getResId(), String.class); + ResultWrapper wrapper = objectMapper.readValue(responseBody, + new TypeReference>(){}); + // 获取业务组件信息 + dto= wrapper.getData(); + }catch (Exception e){ + log.error("业务组件信息获取失败 终止更新 失败原因-----------"+e.getMessage()); + } + // 如果业务组件版本有更新则获取最新的业务组件 + if (dto != null && !dto.getComVersion().equals(resource.getResVersion())) { + resource.setResName(dto.getComName()); + resource.setResUri(dto.getScriptContent()); + resource.setResVersion(dto.getComVersion()); + } + String url = config.getServerUrl() + config.getFileDownloadPath() + resource.getResUri(); + ResponseEntity resultEntity = null; + try { + resultEntity = restTemplate.getForEntity(url, byte[].class); + } catch (HttpClientErrorException e) { + if (HttpStatus.NOT_FOUND == e.getStatusCode()) { + throw new ExecuteException("下载脚本资源失败,脚本已被删除或者脚本不存在", e); + } + throw new ExecuteException("下载脚本资源失败", e); + } + String filename = resource.getResUri(); + File targetFile = new File(resourcePathPrefix + this.identifier + File.separator + resource.getResType() + File.separator + filename); + if (HttpStatus.OK.equals(resultEntity.getStatusCode())) { + HttpHeaders headers = resultEntity.getHeaders(); + String originName = headers.get("Content-Disposition").get(0).split("=", 2)[1]; // 获取文件名字,attachment;filename=xxxx.xxx + File parentFile = targetFile.getParentFile(); + if (!parentFile.exists()) { // 父级目录不存在 + parentFile.mkdirs(); + } + byte[] content = resultEntity.getBody(); + FileOutputStream fos = null; + try { + fos = new FileOutputStream(targetFile); + fos.write(content); + fos.flush(); + } catch (IOException e) { + log.error("资源文件【{}】-【{}】写入失败", filename, originName, e); + // todo: doLog or doReply + } finally { + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + log.error("关闭文件输出流失败", e); + // todo: doLog or doReply + } + } + } + log.error("资源文件【{}】写到本地成功,路径:{}", filename,targetFile.getAbsolutePath()); + } else { + log.error("资源文件【{}】下载不成功", filename); + } + return targetFile; + } + + private void initScriptSteps(ScriptStep[] steps) { + try { + log.info("Init script steps ..."); + if (steps != null && steps.length > 0) { + for (int i = 0; i < steps.length; i++) { + ScriptStep step = steps[i]; + if (!step.isSkip()) { // 判断是否步骤已被注释 + if (InternalComponent.InternalKeyword.KEYWORD_GROUP.equalsIgnoreCase(step.getCommand()) && step.getChildren().length == 0) { + log.debug("分区【{}】内容为空,不加入到步骤集合中。。。", step.getExtAttr(DebugerConst.ReqConst.KEY_COMMAND_NAME)); + } else { + if (null == parentContext) { // 顶层脚本 + if (i + 1 >= steps.length) { // 最后一步 + step.setFinalStep(true); + } else { + ScriptStep nextStep = steps[i + 1]; + step.setParentNextStepId(nextStep.getId()); + } + } + commands.add(step); + initScriptStep(step); + } + } + } + log.info("script设置完成,该脚本准备的环境如下:commands:{}", JsonUtils.toJson(commands)); + log.info("script设置完成,该脚本准备的环境如下:dependScriptResourceMap:{}", JsonUtils.toJson(dependScriptResourceMap)); + log.info("script设置完成,该脚本准备的环境如下:sonExecutorMap:{}", sonExecutorMap.size()); + } + } catch (Exception e) { + throw new ExecuteException(e.getMessage(), e); + } + if (parentContext == null) { + doLog(LogLevel.INFO.name(), String.format("正在使用执行机:%s",EngineRuntime.getRuntime().getEngineInfo().getIpAddress()) + "\n初始化脚本步骤成功"); + } + } + + private void initScriptStep(ScriptStep scriptStep) { + try { + ScriptStep stepClone = ObjectUtil.cloneByStream(scriptStep); + scriptStepMap.put(scriptStep.getId(), stepClone); + // 接口组件输入的初始化 + String input = scriptStep.getArgs().get(DebugerConst.ReqConst.KEY_INPUTS); + if (StringUtils.isNotBlank(input)) { + Map inputMap = JsonUtils.readMap(input, String.class); + scriptStep.getInputMap().putAll(inputMap); + } + if (InternalComponent.NK_INTERNAL_LIB.equalsIgnoreCase(scriptStep.getComponentLib())) { // 是否内部组件 + if (scriptStep.getChildren() != null && scriptStep.getChildren().length > 0) { // 分区 + initChildren(scriptStep, stepClone); + } else { // 业务组件 + analyseBizCmpt(scriptStep); + } + } else { + // 当前步骤是一个基础组件,处理组件库实例Library + addLibrary2Map(scriptStep); + // 解析逻辑组件 + if (scriptStep.getChildren() != null && scriptStep.getChildren().length > 0) { + initChildren(scriptStep, stepClone); + } + // 将commandName添加到tile,组件使用 pc组件用到 + if (StringUtils.isNotBlank(scriptStep.getExtAttr(DebugerConst.ReqConst.KEY_COMMAND_NAME))) { + scriptStep.getArgs().put(DebugerConst.ReqConst.KEY_TITLE, scriptStep.getExtAttr(DebugerConst.ReqConst.KEY_COMMAND_NAME)); + } + } + } catch (Exception e) { + String msg = String.format("步骤【%s】初始化失败 %s ", scriptStep.getExtAttr(DebugerConst.ReqConst.KEY_COMMAND_NAME), e.getMessage()); + log.error("初始化步骤失败,e,{}",e); + throw new ExecuteException(msg, e); + } + } + + private void initChildren(ScriptStep scriptStep, ScriptStep stepClone) { + ScriptStep[] children = stepClone.getChildren(); + for (int i = 0; i < children.length; i++) { + ScriptStep child = children[i]; + if (!child.isSkip()) { + stepClone.addChildStep(child); + // 判断是否最后一步 + scriptStep.addChildStep(child); + // 处理if elseIF的子步骤 + if (LogicStepType._if.name().equalsIgnoreCase(scriptStep.getCommand()) + || LogicStepType._else_if.name().equalsIgnoreCase(scriptStep.getCommand())) { + scriptStep.addIfStep(scriptStep.getCommand(), child); + } + initScriptStep(child); + } + } + } + + /** + * 解析业务组件 + * 下载 + * 参数 + * 步骤 + * 业务步骤 + * + * @param scriptStep + */ + private void analyseBizCmpt(ScriptStep scriptStep) { + String resId = scriptStep.getArgs().get(DebugerConst.ReqConst.KEY_RES_ID); + if (StringUtils.isNotBlank(resId)) { + ScriptResource resource = dependScriptResourceMap.get(resId); + if (resource != null) { // 资源信息存在 + if (StringUtils.isNotBlank(resource.getResName())) { + scriptStep.getArgs().put(DebugerConst.ReqConst.KEY_COMMAND_NAME, resource.getResName()); + } + File resourceFile = resourceDownload(resource); + if (resourceFile.exists() && resourceFile.length() > 0) { + // 读取文件 + String scriptStr = readFile(resourceFile); + log.debug("resId -> {}读取到了脚本文件:{}", resId,scriptStr); + Object parse = JSON.parse(scriptStr); + JSONObject json = JSON.parseObject(parse.toString()); + Script bizScript = json.toJavaObject(Script.class); + // 创建子执行器 + ScriptRuntimeExecutor sonExecutor = new ScriptRuntimeExecutor(identifier, projectId, envId, bizScript, errorSnapshot, snapshot, this.listener, this); + sonExecutor.setLibraryInstanceMap(this.libraryInstanceMap); + sonExecutor.setRequestId(this.requestId); + sonExecutor.init(bizScript); +// log.debug("analyse stepId -> {}, requestId -> {}", scriptStep.getId(), sonExecutor.getRequestId()); + sonExecutorMap.put(scriptStep.getId(), sonExecutor); + } else { + log.debug("resId -> {}没有写入对应的resourceFile", resId); + } + } else { + log.debug("resId -> {}, 没有拿到ScriptResource", resId); + } + } + // 由于业务组件的args没有inputs字段,参数直接放到args下,特殊处理,但是做法不安全 + Map args = scriptStep.getArgs(); + for (String key : args.keySet()) { + if (DebugerConst.ReqConst.KEY_RES_ID.equalsIgnoreCase(key)) { + continue; + } + scriptStep.getInputMap().put(key, args.get(key)); + } + } + + /** + * @param resourceFile + * @return + */ + private String readFile(File resourceFile) { + InputStream is = null; + try { + is = new FileInputStream(resourceFile); + return IoUtil.readUtf8(is); + } catch (Exception e) { + throw new ExecuteException(String.format("读取资源【%s】文件失败", resourceFile.getName()), e); + } finally { + IoUtil.closeIfPosible(is); + } + } + + /** + * 清理执行过程中产生的业务组件、接口调用等脚本调用的资源文件 + */ + @Override + public void clearResource() { + File directory = new File(resourcePathPrefix + this.identifier); + delete(directory); + } + + private void delete(File directory) { + if (directory.exists()) { + for (File file : directory.listFiles()) { + if (file.isDirectory()) { + delete(file); + } else { + if (!file.delete()) { + log.debug("资源文件删除失败 -> {}", directory.getAbsolutePath()); + } + } + } + if (!directory.delete()) { + log.debug("资源文件删除失败 -> {}", directory.getAbsolutePath()); + } + } + } + + private void addLibrary2Map(ScriptStep scriptStep) { + if (scriptStep != null) { + String componentLib = scriptStep.getComponentLib(); + if (!InternalComponent.NK_INTERNAL_LIB.equalsIgnoreCase(componentLib)) { + try { + if (!libraryInstanceMap.containsKey(componentLib)) { + ComponentLibrary library = + SpringUtils.getBean(ComponentManagementService.class) + .newInstance(componentLib); + library.refreshThreadCache(); + libraryInstanceMap.put(componentLib, library); + } else { + libraryInstanceMap.get(componentLib).refreshThreadCache(); + } + } catch (Exception e) { + log.error("组件库实例创建失败"); + throw new ExecuteException("组件库实例创建失败 " + e.getMessage(), e); + } + } + } + } + + /** + * 处理步骤的参数变量 + * + * @param scriptStep + */ + private void extractVariables(ScriptStep scriptStep, Map argumentMap) { + //输入参数-> 通过服务端获取替换 步骤里边 + Map args = scriptStep.getArgs(); // 步骤的参数 + if (args != null) { + for (String arg : args.keySet()) { + KeywordArgument keywordArgument = argumentMap.get(arg); // 通过参数命名获取关键字的对应的输入参数 + String expression = args.get(arg); + if (keywordArgument == null || !keywordArgument.isExpression()) { + expression = variableReplace(expression); + } + // 替换 + args.put(arg, expression); + } + // 统一处理timeout问题 + if (!args.containsKey(DebugerConst.ReqConst.KEY_TIMEOUT)) { + args.put(DebugerConst.ReqConst.KEY_TIMEOUT, String.valueOf(getGlobalTimeout())); + } + } + // 步骤的操作对象中value变量的处理 + List targets = scriptStep.getTargets(); + if (targets != null) { + for (StepTarget target : targets) { + String expression = target.getValue(); + expression = variableReplace(expression); + target.setValue(expression); + } + } + } + + /** + * @param expression + * @return + */ + @VisibleForTesting + private int invokeTimes = 0; + + private String variableReplace(String expression) { + if (StringUtils.isBlank(expression)) { + return expression; + } + invokeTimes++; + // 全局参数 + if (RegexUtils.containGlobalVar(expression)) { + Set globalVars = RegexUtils.extractGlobalVar(expression); + // 请求服务端并替换 + expression = requestAndReplace(globalVars, false, expression); + } + // 脚本参数 + if (RegexUtils.containScriptVar(expression)) { + Set scriptVars = RegexUtils.extractScriptVar(expression); + //从上下文替换 从Variable获取 + for (String sv : scriptVars) { + String value = variables.get(sv); + String format = String.format("${%s}", sv); + if (null != value) { + expression = expression.replace(format, value); + } + } + if (RegexUtils.containGlobalVar(expression) || RegexUtils.containScriptVar(expression)) { + if (invokeTimes <= 5) { // 可能存在互相引用导致无限递归,目前暂定最多5次 + expression = variableReplace(expression); + } + } + } + invokeTimes = 0; + return expression; + } + + /** + * 请求服务获取变量值 + * + * @param vars 变量名集合 + * @param isScriptVar 是否脚本变量,true 脚本变量 | false 全局变量 + * @param expression + * @return + */ + private String requestAndReplace(Set vars, boolean isScriptVar, String expression) { + for (String varName : vars) { + String value = getGlobalVarFromServer(isScriptVar, varName); + String format; + if (isScriptVar) { + format = String.format("${%s}", varName); + } else { + format = String.format("#{%s}", varName); + } + expression = expression.replace(format, null != value ? value : ""); + } + return expression; + } + + /** + * 通过服务器获取全局参数 + * @param isScriptVar + * @param varName + * @return + */ + private String getGlobalVarFromServer(boolean isScriptVar, String varName) { + AtuServerConfig config = SpringUtils.getBean(AtuServerConfig.class); + RestTemplate restTemplate = new RestTemplate(); + String url = config.getServerUrl() + config.getGlobalVarPath(); + VariableDto param = new VariableDto(); + param.setName(varName); + param.setProjectId(projectId); + param.setVariableType(isScriptVar); + if (isScriptVar) { // 如果是脚本变量,那么需要增加脚本id + param.setScriptId(script.getId()); + } + log.debug("全局参数请求地址:{},全局参数请求内容:{}", url, JsonUtils.toJson(param)); + ResponseEntity resEntity = restTemplate.postForEntity(url, param, VariableDto.class); + if (HttpStatus.OK.equals(resEntity.getStatusCode())) { + if (resEntity.getBody() != null) { + if (resEntity.getBody().isExist()) { + globalVarmap.put(varName, resEntity.getBody()); + return resEntity.getBody().getValue(); + } else { + throw new ExecuteException(String.format("全局参数[%s]已被删除", varName)); + } + } + } + return null; + } + + private void clear() { + scriptStepMap.clear(); + variables.clear(); + variableMap.clear(); + projectGlobalVars.clear(); + globalVarmap.clear(); + dependScriptResourceMap.clear(); + commands.clear(); + libraryInstanceMap.clear(); + clearResource(); + } + + private int getGlobalTimeout() { + Object timeout = script.getGlobalSettings().get(DebugerConst.ReqConst.KEY_TIMEOUT); + if (timeout instanceof Integer) { + return (Integer) timeout; + } + return 30; + } + + private boolean getGlobalIgnoreError() { + Map globalSettings = script.getGlobalSettings(); + if (null != globalSettings) { + Object ignoreError = globalSettings.get(DebugerConst.ReqConst.KEY_IGNORE_ERROR); + if (ignoreError instanceof Boolean) { + return (Boolean) ignoreError; + } + } + return false; + } + + @Override + public void setIgnoreError(boolean ignoreError) { + script.getGlobalSettings().put(DebugerConst.ReqConst.KEY_IGNORE_ERROR, ignoreError); + } + + @Override + public void setScript(Script script) { + this.script = script; + } + + @Override + public ScriptExecuteResult runScript(Script script, ScriptExecuteResult ret) { + startFlag = true; // 直接回放 + this.replayType = DebugerConst.ReplayType.TYPE_ALL; + if (null == ret) { + ret = new ScriptExecuteResult(); + } + ret.setStartTime(System.currentTimeMillis()); + if (saveSysLog) { // 如果需要采集应用日志,启动采集日志操作 + log.info("开始启动采集日志"); + doLog(LogLevel.INFO.name(), "已启动日志采集功能"); + } + try { + // 执行步骤 + executeSteps(script, ret); + } catch (AssertException | ExecuteException e) { + throw e; + } catch (Exception e) { + throw new ExecuteException(e.getMessage(), e); + } finally { + if (saveSysLog) {// 如果需要采集应用日志,结束采集日志操作,并上传文件 + log.info("结束采集日志"); + } + // 返回结果 + ret.setEndTime(System.currentTimeMillis()); + } + return ret; + } + + private void executeSteps(Script script, ScriptExecuteResult ret) { + StepExecuteResult stepResult = null; + ScriptStep step = null; + log.debug("最终解析出来的脚本步骤为:{}",JsonUtils.toJson(commands)); + for (int i = 0; i < commands.size(); i++) { + try { + ScriptStep originStep = commands.get(i); + step = ObjectUtil.cloneByStream(originStep); + stepResult = createStepResult(step, commands, i + 1); // 脚本步骤 + ret.addStepResult(stepResult); + // 执行步骤 + executeStep(step, ret, stepResult); + if (null == parentContext && startFlag && nextStep == null) { + if (i + 1 <= commands.size() -1) { + nextStep = commands.get(i + 1); + } + } + if (Thread.currentThread().isInterrupted()) { // 停止 + throw new ExecuteException("执行被停止"); + } + } catch (Exception e) { + if (getGlobalIgnoreError()) { + log.error("ignoreError -> 【{}】,继续执行", getGlobalIgnoreError()); + log.error(e.getMessage(), e); + } else { + if (stepResult == null) { + stepResult = new StepExecuteResult(); + stepResult.setScriptId(script.getId()); + stepResult.setStepId(null != step ? step.getId() : null); + stepResult.setMsg(e.getMessage()); + stepResult.getResult().put(DebugerConst.ReplyConst.KEY_STEP_ID, stepResult.getStepId()); + } + if (e instanceof AssertException) { + // 断言异常 + doLog(LogLevel.ERROR, e.getMessage()); + throw (AssertException) e; + } else { + if (null == parentContext && Thread.currentThread().isInterrupted()) { + doLog(LogLevel.ERROR, "执行被停止了..."); + } + throw new ExecuteException(e.getMessage(), e); + } + } + } finally { + if (startFlag && step != null + && !InternalComponent.InternalKeyword.KEYWORD_GROUP.equalsIgnoreCase(step.getCommand())) { + doReply(stepResult); + } + initCurrentParams(); + } + if (startFlag && singleStepRelay) { + replyNextStep(nextStep); + this.singleStepRelay = false; + this.nextStep = null; + break; + } + } + // 销毁 + if (null == parentContext) { + destroyLibraryInstance(); + } + if (Thread.currentThread().isInterrupted()) { // 中断后恢复 + Thread.interrupted(); + } + } + + public void initCurrentParams() { + currentStepTitle = null; + currentStepType = null; + currentStepId = null; + } + + /** + * 增加当前步骤返回 + * + * @param step + */ + private void replyNextStep(ScriptStep step) { + if (step == null) { + return; + } + if (null == parentContext && startFlag) { + HashMap replyMap = new HashMap<>(); + replyMap.put(DebugerConst.KEY_REQUESTID, this.requestId); + replyMap.put(DebugerConst.ReplyConst.KEY_STEP_ID, step.getId()); + boolean logicFlag = LogicStepType._if.name().equals(step.getCommand()) || LogicStepType._for.name().equals(step.getCommand()); + if (step.getChildSteps() != null && !step.getChildSteps().isEmpty() + && !logicFlag) { + replyMap.put(DebugerConst.ReplyConst.KEY_STEP_ID, step.getChildSteps().get(0).getId()); + } + doReply("reply_current_step", LogLevel.INFO.name(), replyMap); + } + } + + private StepExecuteResult createStepResult(ScriptStep step, List steps, int nextIdx) { + StepExecuteResult stepResult = createStepResult(step); + // 确定个最后一步 + return stepResult; + } + + private StepExecuteResult createStepResult(ScriptStep step) { + StepExecuteResult stepResult = new StepExecuteResult(); + stepResult.setCommand(step.getCommand()); + stepResult.setComponentLib(step.getComponentLib()); + stepResult.setScriptId(script.getId()); + stepResult.setRetId(UUIDUtil.create32UUID()); + stepResult.setSuccess(true); + stepResult.setRequestId(requestId); + stepResult.setStepId(step.getId()); + stepResult.getResult().put(DebugerConst.ReplyConst.KEY_STEP_ID, step.getId()); + stepResult.getResult().put(DebugerConst.ReplyConst.KEY_VARIABLES, variables); + stepResult.getResult().put(DebugerConst.ReplyConst.KEY_COMMAND, step.getCommand()); + currentStepTitle = step.getExtAttr(DebugerConst.ReqConst.KEY_TITLE); + currentStepType = step.getExtAttr(DebugerConst.ReqConst.KEY_STEP_TYPE); + currentStepId = step.getId(); + return stepResult; + } + + /** + * 销毁执行器的组件库实例 + */ + private void destroyLibraryInstance() { + if (libraryInstanceMap.size() > 0) { + for (String key : libraryInstanceMap.keySet()) { + libraryInstanceMap.get(key).destroy(); + } + } + } + + + /** + * 运行脚本步骤 + * + * @param step 脚本步骤信息 + * @param scriptExecuteResult 脚本执行结果 + * @param stepResult 步骤执行结果 + */ + private void executeStep(ScriptStep step, ScriptExecuteResult scriptExecuteResult, StepExecuteResult stepResult) { + log.debug("Executing script step[id:{},skip:{},component:{},keyword:{}]", step.getId(), step.isSkip(), step.getComponentLib(), step.getCommand()); + if (step.isSkip()) { // 步骤被注释,不执行 + log.info("Step[id:{}] skipped", step.getId()); + return; + } + + String comLib = step.getComponentLib(); // 库名 + String keyword = step.getCommand(); // 关键字 + + boolean enterChildren = false; + try { + + if (Thread.currentThread().isInterrupted()) { // 判断是否有中止标志 + throw new ExecuteException("执行被停止"); + } + if (InternalComponent.NK_INTERNAL_LIB.equalsIgnoreCase(comLib)) { + if (step.getChildSteps() != null && !step.getChildSteps().isEmpty()) { // 分区 + enterChildren = true; + } + if (InternalComponent.InternalKeyword.KEYWORD_INVOKE.equalsIgnoreCase(keyword)) { // 业务组件或者接口 + log.info("执行业务组件Step[id:{}]", step.getId()); + if (sonExecutorMap.containsKey(step.getId())) { + if (null == parentContext && !startFlag) { // 顶层脚本 + if (DebugerConst.ReplayType.TYPE_FROM.equalsIgnoreCase(this.replayType) + || DebugerConst.ReplayType.TYPE_STEP.equalsIgnoreCase(this.replayType)) { + startFlag = startStepId.equalsIgnoreCase(step.getId()); + if (!startFlag) { + return; + } + } + } + replyNextStep(step); + ScriptRuntimeExecutor sonExecutor = sonExecutorMap.get(step.getId()); + // 变量,将子步骤的所需要的变量进行赋值,步骤的输入参数 -> 子步骤的变量 映射 + Map inputMap = step.getInputMap(); + if (inputMap.size() > 0) { + for (String input : inputMap.keySet()) { + sonExecutor.setVariable(input, variableReplace(inputMap.get(input))); + } + } + // 上下文变量 + for (String key : contextVars.keySet()) { + sonExecutor.setContextVariable(key, contextVars.get(key)); + } + try { + ScriptExecuteResult sonScriptResult = new ScriptExecuteResult(); + // 将子脚本的执行结果 + stepResult.setChildResult(sonScriptResult.getStepExecuteResults()); + // 执行 + sonExecutor.runScript(sonExecutor.getScript(), sonScriptResult); + // 子脚本执行完成 + // 添加接口的请求和响应信息 + addInterfaceResult(step, stepResult, sonScriptResult); + // 将子步骤的输出赋值到父步骤的对应的值 + Map outputMap = step.getOutput(); + if (outputMap.size() > 0) { + for (String output : outputMap.keySet()) { + String sonOutput = sonExecutor.variables.get(output); + String placeholder = outputMap.get(output); + if (RegexUtils.containScriptVar(placeholder)) { + Set scriptVar = RegexUtils.extractScriptVar(placeholder); + if (scriptVar.size() == 1) { + for (String key : scriptVar) { + if (!variables.containsKey(key)) { // 如果脚本变量没有对应的参数,报错 + String format = String.format("输出项的参数【%s】未被定义", placeholder); + throw new ExecuteException(format); + } + setVariable(key, sonOutput); + stepResult.getOutput().put(key, sonOutput); + } + } else { // 输出项的参数多于一个占位符,不符合 + throw new ExecuteException(String.format("输出项的参数【%s】不符合规范", placeholder)); + } + } + } + } + } catch (AssertException e) { + stepResult.setSuccess(false); + throw e; + } catch (Exception e) { + stepResult.setSuccess(false); + throw e; + } finally { + stepResult.setExecuted(true); + } + }else { + log.info("Step[id:{}]没有获取到Executor", step.getId()); + } + } + } else { + log.info("执行基础组件Step[id:{}]", step.getId()); + Object ret = null; // 执行返回 + try { + // from step方式重放 加上开始判断 + if (!startFlag) { + if (StringUtils.isNotBlank(startStepId)) { + startFlag = startStepId.equalsIgnoreCase(step.getId()); + } else { + startFlag = true; + } + } + if (startFlag) { + replyNextStep(step); + ret = doExecuteScriptStep(comLib, keyword, step, stepResult); + enterChildren = executeLogicCmpt(step, stepResult); + } + } catch (WebDriverException wde) { + log.warn("driver失效了,准备重新创建。。。。。"); + boolean isSuccess = false; + for (int i = 0; i < 3; i++) { + try { + isSuccess = ((DeviceConnection) this.getContextVariable(IScriptRuntimeContext.KEY_CURRENT_CONN)).reconnect(); + } catch (Exception ex) { + log.error("创建驱动失败,次数:{}", i + 1, ex); + } + if (isSuccess) { + break; + } + } + if (isSuccess) { + //重新更新driver + this.setContextVariable(IScriptRuntimeContext.KEY_CURRENT_DRIVER,((DeviceConnection)this.getContextVariable(IScriptRuntimeContext.KEY_CURRENT_CONN)).getDeviceDriver()); + ret = doExecuteScriptStep(comLib, keyword, step, stepResult); + } + } + } + log.info("Step[id:{}]执行完毕", step.getId()); + // 循环作为逻辑组件的循环 + while (enterChildren) { + // 执行子步骤 + List childSteps = step.getChildSteps(); + StepExecuteResult childStepResult = null; + stepResult.setExecuted(true); + stepResult.setAfterLogicExec(true); + if (childSteps != null && childSteps.size() > 0) { + for (int i = 0; i < childSteps.size(); i++) { + ScriptStep childStep = childSteps.get(i); + try { + childStepResult = createStepResult(childStep, childSteps, i + 1); + if (stepResult.getChildResult() == null) { + stepResult.setChildResult(new ArrayList<>()); + } + childStepResult.setStepId(childStep.getId()); + stepResult.getChildResult().add(childStepResult); + executeStep(childStep, scriptExecuteResult, childStepResult); + if (Thread.currentThread().isInterrupted()) { // 停止 + throw new ExecuteException("执行被停止"); + } + } catch (AssertException e) { + throw e; + } catch (ExecuteException e) { + throw new ExecuteException("子步骤执行失败 " + e.getMessage(), e); + } finally { + if (startFlag && childStepResult != null) { + doReply(childStepResult); + } + } + if (null == parentContext && startFlag && this.singleStepRelay && !isLogic(step.getComponentLib(), step.getCommand())) { // 顶层 单步回放 停止 + if (i + 1 < childSteps.size()) { + nextStep = childSteps.get(i + 1); + } + break; + } + } + } + // 再次执行逻辑组件 + enterChildren = executeLogicCmpt(step, stepResult); + } + } catch (AssertException e) { + stepResult.setMsg(e.getMessage()); + scriptExecuteResult.setResultStatus(2); + throw e; + } catch (Exception e) { + stepResult.setMsg(String.format("步骤执行失败:%s", e.getMessage())); + stepResult.setSuccess(false); + // TODO: 出错继续执行 + throw new ExecuteException(e.getMessage(), e); + } + } + + /** + * 如果当前步骤是顶层脚本并且是接口,那么给步骤的执行结果加上接口请求和返回信息 + * http和socket统一处理,result增加字段:interface + * TODO: 用到常量需要找个地方统一管理 + * + * @param step 当前执行的步骤 + * @param stepResult 步骤结果 + * @param sonScriptResult 子步骤的结果集 + */ + private void addInterfaceResult(ScriptStep step, StepExecuteResult stepResult, ScriptExecuteResult sonScriptResult) { + if (null == parentContext && "interface".equalsIgnoreCase(step.getExtAttr(DebugerConst.ReqConst.KEY_STEP_TYPE))) { + JSONObject keywordReturn = new JSONObject(); + for (StepExecuteResult childResult : sonScriptResult.getStepExecuteResults()) { + if ("NK.Interface".equalsIgnoreCase(childResult.getComponentLib())) { + if ("httpRequest".equalsIgnoreCase(childResult.getCommand())) { // http的处理方式 + keywordReturn = ObjectUtil.cloneByStream((JSONObject) childResult.getKeywordReturn()); + if (keywordReturn.containsKey("context")) { + keywordReturn.put("response", keywordReturn.get("context")); + } + } else if ("socketRequest".equalsIgnoreCase(childResult.getCommand())) { // socket的处理方式 + keywordReturn = ObjectUtil.cloneByStream((JSONObject) childResult.getKeywordReturn()); + if (keywordReturn.containsKey("context")) { + JSONObject context = (JSONObject)keywordReturn.get("context"); + JSONObject response = new JSONObject(); + response.put("body", context); + keywordReturn.put("response", response); + } + } + keywordReturn.remove("context"); + } + } + if (!keywordReturn.isEmpty()) { + stepResult.getResult().put("interface", keywordReturn); + } + } + } + + /** + * 逻辑组件的执行 + * + * @param step + * @param stepResult + * @return + */ + public boolean executeLogicCmpt(ScriptStep step, StepExecuteResult stepResult){ + // if组件和for组件处理 + String command = step.getCommand(); + // + LogicStepType logicStepType = LogicStepType.get(command); + if (null == logicStepType) { + return false; + } + if (StringUtils.isBlank(step.getIfStep())) { + step.setIfStep(command); + } + String ifStep = step.getIfStep(); + // for逻辑 + if(LogicStepType._for.name().equalsIgnoreCase(command)) { + boolean forFlag = (boolean)stepResult.getKeywordReturn(); + int idx = 0; + if (step.getArg(KEY_FOR_CURRENT_INDEX) != null) { + idx = Integer.parseInt(step.getArg(KEY_FOR_CURRENT_INDEX)); + } else { + step.getArgs().put(KEY_FOR_CURRENT_INDEX, String.valueOf(idx)); + } + if (forFlag && idx > 0) { + StepExecuteResult forResult = createStepResult(step); + stepResult.addChildResult(forResult); + doExecuteScriptStep(step.getComponentLib(), command, step, forResult); + forFlag = (boolean) forResult.getKeywordReturn(); + } + if (forFlag) { // 继续 + step.setChildSteps(ObjectUtil.cloneByStream(scriptStepMap.get(step.getId()).getChildSteps())); + step.getArgs().put(KEY_FOR_CURRENT_INDEX, String.valueOf(++idx)); + setContextVariable(KEY_FOR_CURRENT_INDEX, Integer.valueOf(step.getArg(KEY_FOR_CURRENT_INDEX))); + } else { // 退出循环 + contextVars.remove(KEY_FOR_CURRENT_INDEX); + step.getArgs().remove(KEY_FOR_CURRENT_INDEX); + } + return forFlag; + } + + // if 逻辑 + if (stepResult.isAfterLogicExec()) { + List childResultList = stepResult.getChildResult(); + // 已经执行过了childSteps内容 + switch (Objects.requireNonNull(logicStepType)) { // command指令 + case _if: + if (LogicStepType._if_true.name().equals(ifStep) || LogicStepType._else.name().equals(ifStep)) { + // if已完成,退出if + return false; + } + if (LogicStepType._if_condition.name().equals(ifStep) || LogicStepType._else_if.name().equals(ifStep)) { + if (childResultList != null && !childResultList.isEmpty()) { + StepExecuteResult last = childResultList.get(childResultList.size() - 1); + if (LogicStepType._else_if.name().equals(ifStep) + && last.getKeywordReturn() instanceof Boolean && (boolean) last.getKeywordReturn()) { + // else_if 的结果为true,else_if已经结束,退出if + return false; + } + stepResult.setKeywordReturn(last.getKeywordReturn()); + step.getArgs().put("mode", "1"); // 设置成简单模式 + stepResult.setAfterLogicExec(false); // 重新设置if为未执行 + } + } else { + return false; // if已经执行完成,退出if + } + // if_condition 和 else_if 后续还要跑具体 + break; + case _if_condition: + if (childResultList == null || childResultList.isEmpty()) { // 获取最后一步的返回设置 _if_condition的返回keywordReturn + // 没有步骤结果则报错 + throw new ExecuteException("condition没有可查看的步骤结果"); + } + StepExecuteResult last = childResultList.get(childResultList.size() - 1); + if (last.getOutput().values().size() != 1) { + // 输出参数错误 + throw new ExecuteException(String.format("步骤 %s 内必须有且只有一个输出参数,且为布尔值", step.getExtAttr(DebugerConst.ReqConst.KEY_COMMAND_NAME))); + } + Object o = last.getOutput().values().toArray()[0]; + if (null != o && ("true".equalsIgnoreCase(o.toString()) || "false".equalsIgnoreCase(o.toString()))) { + // 将输出参数设置为condition的返回keywordReturn + stepResult.setKeywordReturn(Boolean.parseBoolean(o.toString())); + } else { + throw new ExecuteException(String.format("步骤 %s 内的判断条件最后一步的输出参数无法转换为布尔值", step.getExtAttr(DebugerConst.ReqConst.KEY_COMMAND_NAME))); + } + return false; + case _if_true: + // true内组件已经执行完,退出true + return false; + case _else_if: + if (LogicStepType._if_true.name().equalsIgnoreCase(ifStep)) { // else_if 已经执行完了 + stepResult.setKeywordReturn(true); // 用于if的判断,else_if已经行完 + return false; + } + if (LogicStepType._if_condition.name().equalsIgnoreCase(ifStep)) { + StepExecuteResult conditionResult = stepResult.getChildResult().get(stepResult.getChildResult().size() - 1); + boolean elseIfCondition = (boolean) conditionResult.getKeywordReturn(); + stepResult.setKeywordReturn(elseIfCondition); + if (!elseIfCondition) { + return false; // else_if的条件结果不通过,返回继续if的 + } + } + stepResult.setAfterLogicExec(false); + step.getArgs().put("mode", "1"); // 设置成简单模式 + break; + case _else: + // else内组件已经执行,退出else + return false; + default: + // 默认返回false + return false; + } + } + if(!stepResult.isAfterLogicExec()) { + // 还没执行childSteps内容 + switch (Objects.requireNonNull(logicStepType)) { + case _if: + Object ifReturn = stepResult.getKeywordReturn(); + step.setChildSteps(new ArrayList<>()); + if (!(ifReturn instanceof Boolean)) { // if的结果是布尔值 + // todo: + return false; + } + String ifMode = step.getArgs().get("mode"); + if (StringUtils.isNotBlank(ifMode) && "2".equals(ifMode)) { + // 高级模式 + step.setIfStep(LogicStepType._if_condition.name()); + List ifConditionSteps = step.getIfStepMap().get(LogicStepType._if_condition.name()); + if (ifConditionSteps == null || ifConditionSteps.isEmpty()) { + throw new ExecuteException("condition内没有可以执行的组件"); + } + step.getChildSteps().addAll(ifConditionSteps); + return true; + } else { + // 都处理成简单模式 + if ((boolean) ifReturn) { // 判断if的结果 + step.setIfStep(LogicStepType._if_true.name()); + List trueSteps = step.getIfStepMap().get(LogicStepType._if_true.name()); + step.getChildSteps().addAll(trueSteps); + return true; // 进入 + } + // 判断是否有else_if + if (step.getIfStepMap().containsKey(LogicStepType._else_if.name()) + && !CollectionUtils.isEmpty(step.getIfStepMap().get(LogicStepType._else_if.name()))) { + step.setIfStep(LogicStepType._else_if.name()); + ScriptStep elseIfStep = step.getIfStepMap().get(LogicStepType._else_if.name()).get(0); + step.getChildSteps().add(elseIfStep); + step.getIfStepMap().get(LogicStepType._else_if.name()).remove(elseIfStep); // 可能有多个else_if,执行一次替换一次 + return true; // 进入while循环 + } + // 判断是否有else + if (step.getIfStepMap().containsKey(LogicStepType._else.name()) + && !CollectionUtils.isEmpty(step.getIfStepMap().get(LogicStepType._else.name()))) { + step.setIfStep(LogicStepType._else.name()); + List elseSteps = step.getIfStepMap().get(LogicStepType._else.name()); + step.getChildSteps().addAll(elseSteps); + return true; // 进入while循环 + } + } + return false; // 啥都没有,不进入while循环 + case _else_if: + Object elseIfReturn = stepResult.getKeywordReturn(); + step.setChildSteps(new ArrayList<>()); + if (!(elseIfReturn instanceof Boolean)) { + return false; + } + String elseMod = step.getArgs().get("mode"); + if (StringUtils.isNotBlank(elseMod) && "2".equals(elseMod)) { + // todo: 高级模式 + step.setIfStep(LogicStepType._if_condition.name()); + List elseIfConditionSteps = step.getIfStepMap().get(LogicStepType._if_condition.name()); + if (elseIfConditionSteps == null || elseIfConditionSteps.isEmpty()) { + throw new ExecuteException("condition内没有可以执行的组件"); + } + step.getChildSteps().addAll(elseIfConditionSteps); + return true; + } else { + // todo: 统一处理成简单模式 + if ((boolean) elseIfReturn) { // else_if的判断结果为true + step.setIfStep(LogicStepType._if_true.name()); + List elseTrueSteps = step.getIfStepMap().get(LogicStepType._if_true.name()); + step.getChildSteps().addAll(elseTrueSteps); + return true; // 进入循环 + } else { + step.setIfStep(LogicStepType._else_if.name()); + return false; + } + } + case _else: + // 直接进入循环 + return true; + default: + return false; + } + } + return false; + } + + /** + * 判断该组件是否为逻辑组件,需要执行逻辑控制 + * + * @param comLib 库名 + * @param keyword 关键字 + * @return true 是逻辑组件 | false 不是逻辑组件 + */ + private boolean isLogic(String comLib, String keyword) { + if (StringUtils.isBlank(keyword)) { + return false; + } + LogicStepType logicStepType = LogicStepType.get(keyword); + return null != logicStepType; + } + + private Object doExecuteScriptStep(String comLib, String keyword, ScriptStep step, StepExecuteResult stepRet) { + setContextVariable(KEY_CURRENT_STEP, step); + this.setVariable(DebugerConst.ReplyConst.MOBILE_STEP_SNAPSHOT, null); + // 执行前时间 + long startTime = System.currentTimeMillis(); + try { + // 获取库实例 + ComponentLibrary cmptLib = libraryInstanceMap.get(comLib); + if (cmptLib.getType() != null && cmptLib.getType() == LibraryConstant.LIB_TYPE_PCBS){ + log.debug("pc组件执行清除组件截图地址..."); + this.variables.remove(DebugerConst.ReplyConst.PC_STEP_SNAPSHOT); + } + // 步骤执行日志 + stepLog = new StepLog(LogLevel.INFO.name(), currentStepTitle, currentStepType, keyword); + stepLog.setCmptName(cmptLib.getKeywordAlias(keyword)); + // 执行前的日志、参数输出 + stepLogBeforeExecute(keyword, stepRet, cmptLib); + // 对args里的参数进行处理 + extractVariables(step, cmptLib.getKeywordArgumentMap(keyword)); + if (LogicStepType._for.name().equalsIgnoreCase(keyword)) { + if (step.getArg(KEY_FOR_CURRENT_INDEX) == null) { + step.getArgs().put(KEY_FOR_CURRENT_INDEX, String.valueOf(0)); + } + setContextVariable(KEY_FOR_CURRENT_INDEX, Integer.valueOf(step.getArg(KEY_FOR_CURRENT_INDEX))); + } + // 执行关键字 + Object result = null; + try { + result = cmptLib.runKeyword(keyword, this); + } catch (Exception e){ + if (e instanceof AssertException) { + log.info("是否截图参数snapshot:{}", snapshot); + log.info("是否截图参数errorSnapshot:{}", errorSnapshot); + log.info("keyword:{}", keyword); + if (keyword.contains("assertElement") && errorSnapshot) { + snapshot(stepRet,errorSnapshot,"断言失败截图"); + } + throw new AssertException("断言失败,找不到目标元素"); + } + throw e; + } + + //截图 + snapshot(stepRet, cmptLib); + + // 计划步骤执行后等待 + Object isDebugObj = contextVars.get("__isDebug"); + boolean isDebug = false; + if (null == isDebugObj) { + log.warn("isDebug获取为空!!"); + } else { + isDebug = (boolean) isDebugObj; + } + if (!isDebug) { + try { + String planWaitTime = SpringUtils.getProperties("nk.component.mobile.planWaitTime"); + log.debug("planWaitTime:{}", planWaitTime); + Thread.sleep(StringUtils.isNoneEmpty(planWaitTime) ? Long.parseLong(planWaitTime) : 100L); + } catch (InterruptedException e) { + log.error("计划步骤执行后等待被打断", e); + Thread.currentThread().interrupt(); + } + } + + if (keyword.contains("screenShot") || snapshot) { + String contentSnapshotPath = this.getVariableValue(DebugerConst.ReplyConst.MOBILE_STEP_SNAPSHOT); + if (StringUtils.isNotBlank(contentSnapshotPath)) { + stepRet.setActualImgUri(contentSnapshotPath); + } + } + + // 执行后日志输出与处理 + String outputMsg = stepLogAfterExecute(keyword, stepRet, cmptLib); + + if (result != null) { + outputMsg = outputMsg + String.format(",方法返回值【%s】", JSON.toJSONString(result, true)); + stepRet.getOutput().put(DebugerConst.ReplyConst.KEY_KEYWORD_RETURN, result); + stepRet.setKeywordReturn(result); + // 截图处理 + snapshotCmptAfterExecute(keyword, stepRet, result); + } + log.debug(outputMsg); + stepRet.setOutputMsg(outputMsg); + basicCmptReply(); + assertCmptAfterExecute(keyword, stepRet, result); + return result; + } catch (AssertException e) { + stepRet.setSuccess(false); + throw e; + } catch (WebDriverException e) { + //driver失效了,丢出去重新创建一个driver再执行一遍 + log.error("与appium的driver失效..."); + throw e; + } catch (Exception e) { + log.error("=========失败原因:{}", e.getMessage(), e); + snapshot(stepRet, errorSnapshot, "步骤执行失败截图"); + if (e.getCause() instanceof WebDriverException) { + throw (WebDriverException)e.getCause(); + } + stepRet.setSuccess(false); + // 如果是断言组件执行失败也算是断言失败 TODO: 之后根据需求再细化 + if (keyword.startsWith("assert")) { + // 抛断言异常异常 + log.error("断言失败", e); + String msg = "断言失败,实际结果与预期结果不符"; + doLog(LogLevel.ERROR, msg); + throw new AssertException(msg); + } else { + String msg = ""; + if (e instanceof NullPointerException) { + msg = "执行失败:组件无法执行"; + } else { + msg = String.format("正在使用执行机:%s,执行失败:%s", EngineRuntime.getRuntime().getEngineInfo().getIpAddress() + "\n", e.getMessage()==null?"参数获取失败":e.getMessage()); + } + doLog(LogLevel.ERROR, msg); + throw new ExecuteException(String.format("组件库[%s],关键字[%s]执行失败,可能原因:%s", comLib, keyword, e.getMessage()==null?"参数获取失败":e.getMessage()), e); + } + } finally { + stepRet.setExecuted(true); + stepRet.setExecuteTime(System.currentTimeMillis() - startTime); + } + } + + private void snapshot(StepExecuteResult stepRet, ComponentLibrary cmptLib){ + if (!snapshot){ + log.debug("不需要截图"); + return; + } + // pc端组件截图,优先使用组件内部截图,若无截图再调用指令截图 + if (cmptLib.getType() != null && cmptLib.getType() == LibraryConstant.LIB_TYPE_PCBS){ + String stepSnapshot = this.getVariableValue(DebugerConst.ReplyConst.PC_STEP_SNAPSHOT); + if (StrUtil.isNotBlank(stepSnapshot)){ + try { + String tenantId = this.getContextVariable(IScriptRuntimeContext.KEY_TASK_TENANT).toString(); + log.debug("pc snapshot localPath = " + stepSnapshot); + log.debug("tenantId = " + tenantId); + if (StrUtil.isNotEmpty(tenantId) && StrUtil.isNotEmpty(stepSnapshot)){ + Attachment upload = HttpUtils.upload(stepSnapshot, tenantId, currentTaskId, FileBusinessTypeEnum.PC_TASK_SCREENSHOT.getCode()); + if (ObjectUtil.isNull(upload) || StringUtils.isBlank(upload.getId())) { + throw new RuntimeException("截图文件上传信息为空"); + } + log.debug("截图文件上传结果,{}", JSON.toJSONString(upload)); + stepRet.setActualImgUri(upload.getUrlPath()); + return; + } + } catch (Exception e) { + log.error("获取步骤执行时截图失败", e); + } + } + log.debug("组件内无截图或上传截图失败,重新截一张图"); + } + snapshot(stepRet, snapshot, "步骤执行后截图"); + } + + /** + * 业务组件/接口调用内,基础组件执行后 + * + */ + private void basicCmptReply() { + if (null != parentContext) { + HashMap map = new HashMap<>(); + map.put(DebugerConst.KEY_REQUESTID, requestId); + map.put(DebugerConst.ReplyConst.KEY_SUCCESS, true); + if (listener != null) { + listener.doReply(this, DebugerConst.ReplyConst.KEY_CMD_REPLY, LogLevel.INFO.name(), map); + } + } + } + + private void stepLogBeforeExecute(String keyword, StepExecuteResult stepRet, ComponentLibrary cmptLib) throws Exception { + // 获取关键字的参数列表 + List keywordArguments = cmptLib.getKeywordArguments(keyword); + Map dataBus = getDataBusFromContext(this, keywordArguments); + String inputMsg = String.format("正在使用执行机:%s,运行组件:库:【%s】,版本【%s】,组件【%s】,参数【%s】", + EngineRuntime.getRuntime().getEngineInfo().getIpAddress() + "\n", cmptLib.getName(), cmptLib.getVersion(), keyword, getKeywordParams(dataBus, keywordArguments)); + // 输出日志 replay_log + doLog(LogLevel.INFO, inputMsg); + log.debug(" ------> {}组件执行前的参数列表 -> {}", keyword, JsonUtils.toJson(stepRet.getResult().get(DebugerConst.ReplyConst.KEY_VARIABLES))); + //设置组件入参 任务计划用 + getKeywordParams2Map(dataBus, keywordArguments, stepRet); + } + + /** + * 组件执行后日志输出 + * + * @param keyword + * @param stepRet + * @param cmptLib + * @return + */ + private String stepLogAfterExecute(String keyword, StepExecuteResult stepRet, ComponentLibrary cmptLib) { + String outputMsg = String.format("正在使用执行机:%s,组件运行结果:库:【%s】,版本【%s】,组件【%s】,脚本变量【%s】", + EngineRuntime.getRuntime().getEngineInfo().getIpAddress() + "\n", cmptLib.getName(), cmptLib.getVersion(), keyword, +// JsonUtils.toJson(stepRet.getResult().get(DebugerConst.ReplyConst.KEY_VARIABLES))); + JSON.toJSONString(stepRet.getResult().get(DebugerConst.ReplyConst.KEY_VARIABLES), true)); + if (!projectGlobalVars.isEmpty()) { + outputMsg = String.format(outputMsg + ",全局变量【%s】", JSON.toJSONString(projectGlobalVars, true)); + } + doLog(LogLevel.DEBUG, outputMsg); + return outputMsg; + } + + /** + * 截图组件执行后的处理 + * @param keyword + * @param stepRet + * @param result + */ + private void snapshotCmptAfterExecute(String keyword, StepExecuteResult stepRet, Object result) { + stepRet.getResult().put(DebugerConst.ReplyConst.KEY_KEYWORD_RETURN, result); + // 执行关键字 + if ("takeScreen".equalsIgnoreCase(keyword)) { + // 上传截图 + log.debug("上传截图入参:result,{}",result); + log.debug("上传截图入参:__tenantId,{}",this.getContextVariable(IScriptRuntimeContext.KEY_TASK_TENANT).toString()); + log.debug("上传截图入参:currentTaskId,{}",currentTaskId); + log.debug("上传截图入参:code,{}",FileBusinessTypeEnum.PC_TASK_SCREENSHOT.getCode()); + Attachment upload = HttpUtils.upload(result.toString(), this.getContextVariable(IScriptRuntimeContext.KEY_TASK_TENANT).toString(), currentTaskId, FileBusinessTypeEnum.PC_TASK_SCREENSHOT.getCode()); + if (null != upload && StringUtils.isNotBlank(upload.getUrlPath())) { + String uploadMsg = "截图成功"; + stepLog.setLogType(StepLog.LogType.IMAGE.name()); + stepLog.getResources().add(upload.getUrlPath()); + doLog(LogLevel.INFO, uploadMsg); + stepLog.setLogType(StepLog.LogType.TEXT.name()); + stepLog.getResources().clear(); + } + } + } + + /** + * 截图 + * + * @param stepRet 步骤结果 + */ + private void snapshot(StepExecuteResult stepRet, boolean snapshotFlag, String msg) { + if (!snapshotFlag) { + return; + } + log.info(msg); + + String contentSnapshotPath = this.getVariableValue(DebugerConst.ReplyConst.MOBILE_STEP_SNAPSHOT); + if (StringUtils.isNotBlank(contentSnapshotPath)) { + stepRet.setActualImgUri(contentSnapshotPath); + } else { + try { + DeviceConnection deviceConnection = (DeviceConnection) this.getContextVariable(IScriptRuntimeContext.KEY_CURRENT_CONN); + String tenantId = this.getContextVariable(IScriptRuntimeContext.KEY_TASK_TENANT).toString(); + String imageUrl = deviceConnection.snapshotAllScreen(tenantId, currentTaskId); + stepRet.setActualImgUri(imageUrl); + } catch (Exception ex) { + log.error("截图失败:", ex); + } + } + } + + /** + * 断言组件执行后的处理 + * + * @param keyword + * @param stepRet + * @param result + */ + private void assertCmptAfterExecute(String keyword, StepExecuteResult stepRet, Object result) { + // 如果时断言组件,判断result是否布尔值,抛出异常 + if (keyword.startsWith("assert") && result instanceof Boolean) { + if ((boolean) result) { + stepRet.setMsg("断言成功"); + } else { + // 抛断言异常异常 + String assertMsg = "断言失败,实际结果与预期结果不符"; + throw new AssertException(assertMsg); + } + } + } + + @Override + public void reset(Script script) { + clear(); + this.script = script; + init(this.script); + } + + @Override + public void setRuntimeListener(ScriptRuntimeListener listener) { + log.debug("Setting runtime listener"); + this.listener = listener; + } + + private void doLog(String level, String msg) { + if (listener != null) { + listener.doLog(this, level, msg); + } + } + + private void doLog(LogLevel logLevel, String msg) { + if (listener != null && this.stepLog != null) { + this.stepLog.setLevel(logLevel.name()); + this.stepLog.setLog(msg); + this.stepLog.setStepId(this.currentStepId); + listener.doLog(this, this.stepLog); + } + } + + private void doReply(StepExecuteResult result) { + if (listener != null && null == parentContext) { + listener.doReply(this, result); + } + } + + private void doReply(String cmd, String logLevel, Object obj) { + if (listener != null && null == parentContext) { + listener.doReply(this, cmd, logLevel, obj); + } + } + + /** + * 从指定步骤回放 + * + * @param script + * @param scriptStepId + * @return + */ + @Override + public ScriptExecuteResult runStep(Script script, String scriptStepId, String replayType) { + return runStep(script, scriptStepId, false, replayType); + } + + /** + * 从指定步骤回放 + * + * @param script + * @param scriptStepId + * @param oneStepFlag true 单步回放 | false 从制定步骤开始回放 + * @return + */ + @Override + public ScriptExecuteResult runStep(Script script, String scriptStepId, boolean oneStepFlag, String replayType) { + this.startStepId = scriptStepId; + this.startFlag = false; + this.singleStepRelay = oneStepFlag; + if (this.singleStepRelay) { + findStep(scriptStepId); + } + this.replayType = replayType; + ScriptExecuteResult ret = new ScriptExecuteResult(); // 脚本执行结果 + ret.setStartTime(System.currentTimeMillis()); + // 执行步骤 + try { + executeSteps(script, ret); + } catch (Exception e) { + throw e; + } finally { + ret.setEndTime(System.currentTimeMillis()); + } + return ret; + } + + private void findStep(String scriptStepId){ + ScriptStep replayStep = null; + for (ScriptStep step : commands) { + if (scriptStepId.equalsIgnoreCase(step.getId())){ + return; + } + if (CollectionUtils.isEmpty(step.getChildSteps())) { + // 没有子步骤,不是if或者for + continue; + } + replayStep = findChildStep(step, scriptStepId); + if (replayStep != null){ + break; + } + } + if (replayStep != null) { + commands.clear(); + commands.add(replayStep); + } + } + + private ScriptStep findChildStep(ScriptStep step, String scriptStepId){ + for (ScriptStep childStep : step.getChildSteps()) { + if (scriptStepId.equalsIgnoreCase(childStep.getId())){ + return childStep; + } + if (!CollectionUtils.isEmpty(childStep.getChildSteps())){ + ScriptStep grandStep = findChildStep(childStep, scriptStepId); + if (grandStep != null){ + return grandStep; + } + } + } + return null; + } + + @Override + public DebuggerRequest getCurrentRequest() { + return (DebuggerRequest) getContextVariable(KEY_CURRENT_REQUEST); + } + + @Override + public boolean isSnapshot() { + return snapshot; + } + + @Override + public boolean isRecord() { + return record; + } + + @Override + public boolean isSaveMobileSyslog() { + return saveSysLog; + } + + /** + * 获取变量 + * @param key + */ + public Object getParameter(String key) { + return null; + } + + /** + * 设置变量:脚本变量 | 全局变量 + * @param key ${a} | #{b} + * @param value 具体值 + */ + public void setParameter(String key, Object value) { + // 判断参数类型 + boolean scriptType = RegexUtils.containScriptVar(key); + if (scriptType) { + } + } + + @Override + public Variable getVariableInfo(String key) { + return variableMap.get(key); + } + + @Override + public void setVariable(String key, String val) { + variables.put(key, val); + } + + /** + * + * @param key + * @return + */ + @Override + public String getVariable(String key) { + // 变量转换 + IScriptStep currentStep = getCurrentStep(); + String value = currentStep.getArgs().get(key); + return variableReplace(value); + } + + /** + * 获取变量对应的值 + * + * @param var + * @return + */ + @Override + public String getVariableValue(String var) { + return variables.get(var); + } + + @Override + public void setProjectGlobalVariable(String key, String val) { + projectGlobalVars.put(key, val); + // update the server side project global var + updateGlobalVar(key, val); + } + + /** + * 更新服务端的全局变量 + * @param name + * @param val + */ + private void updateGlobalVar(String name, String val) { + RestTemplate restTemplate = new RestTemplate(); + VariableDto updateDto = new VariableDto(); + updateDto.setVariableType(false); + updateDto.setProjectId(projectId); + updateDto.setValue(val); + updateDto.setName(name); + AtuServerConfig config = SpringUtils.getBean(AtuServerConfig.class); + String url = config.getServerUrl() + config.getGlobalVarUpdatePath(); + try { + log.debug("准备更新全局变量,请求内容:{},", JsonUtils.toJson(updateDto)); + ResponseEntity resEntity = restTemplate.postForEntity(url, updateDto, ResultWrapper.class); + if (HttpStatus.OK == resEntity.getStatusCode()) { + ResultWrapper wrapper = resEntity.getBody(); + if (null == wrapper || !wrapper.isSuccess()) { + throw new ExecuteException(String.format("更新全局变量[%s]失败", name)); + } + log.debug("全局变量更新成功 name -> {} value -> {}", name, val); + } else { + throw new ExecuteException(String.format("请求异常 请求状态信息:%s", resEntity.getStatusCode())); + } + } catch (RestClientException e) { + throw new ExecuteException("请求异常", e); + } catch (ExecuteException e) { + throw e; + } catch (Exception e) { + log.error("更新全局变量{}失败", name, e); + throw e; + } + + } + + /** + * 通过全局变量名称获取值 + * + * @param key + * @return + */ + @Override + public String getProjectGlobalVariable(String key) { + String value = getGlobalVarFromServer(false, key); + if (value != null) { + projectGlobalVars.put(key, value); + } + return projectGlobalVars.get(key); + } + + @Override + public T getService(Class aClass) { + return applicationContext.getBean(aClass); + } + + @Override + public String[] getAllContextNames() { + return contextVars.keySet().toArray(new String[contextVars.size()]); + } + + @Override + public Object getContextVariable(String key) { + return contextVars.get(key); + } + + @Override + public void setContextVariable(String key, Object o) { + contextVars.put(key, o); + } + + @Override + public IExecuteContext getParentContext() { + return parentContext; + } + + @Override + public IScriptStep getCurrentStep() { + return (ScriptStep) getContextVariable(KEY_CURRENT_STEP); + } + + /** + * 获取测试目标信息 + * + * @return + */ + @Override + public ITestTarget[] getTestTarget() { + return this.script.getTestTargets(); + } + + /** + * 获取变量定义类型 + * + * @param key 变量名称 + * @param global 是否全局变量 + * @return + */ + @Override + public String getVariableType(String key, boolean global) { + if (global && globalVarmap.containsKey(key) && globalVarmap.get(key).getDataType() != null) { + return globalVarmap.get(key).getDataType(); + } else if (!global && variableMap.containsKey(key) && variableMap.get(key).getType() != null) { + return variableMap.get(key).getType(); + } + return "string"; + } + + /** + * 获取配置 + * + * @param name 配置名称 例:spring.application.name + * @return + */ + @Override + public String getProperty(String name) { + return SpringUtils.getBean(Environment.class).getProperty(name); + } + + /** + * 获取配置,如果没有返回传入的默认值 + * + * @param name 配置名称 + * @param defaultValue 默认值 + * @return + */ + @Override + public String getProperty(String name, String defaultValue) { + return SpringUtils.getBean(Environment.class).getProperty(name, defaultValue); + } + + /** + * 获取设备信息 + * + * @return + */ + @Override + public Map getDeviceInfo() { + DeviceConnection deviceConnection = (DeviceConnection) this.getContextVariable(IScriptRuntimeContext.KEY_CURRENT_CONN); + DeviceInfo deviceInfo = deviceConnection.getDeviceInfo(); + Map map = JSONObject.parseObject(JSONObject.toJSONString(deviceInfo), Map.class); + return map; + } + + /** + * 执行表达式 + * + * @param expression + */ + @Override + public Object evalExpression(String expression) { + // 处理表达式所包含的变量 + return ArgumentUtil.evalExpression(this, expression); + } + + private Map getDataBusFromContext(IExecuteContext context, List arguments) throws KeywordNotFoundException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { + Map dataBus = new HashMap<>(); + String name; + for (KeywordArgument argument : arguments) { + name = argument.getName(); + switch (argument.getScope()) { + case ARGS: { + IScriptStep step = context.getCurrentStep(); + dataBus.put(name, step.getArgs().get(name)); + break; + } + case STEP: { + IScriptStep step = context.getCurrentStep(); + Object value = step.getClass().getMethod("get" + StringUtils.capitalize(name)).invoke(step); + dataBus.put(name, value); + break; + } + case VARIABLES: { + dataBus.put(name, context.getVariable(name)); + break; + } + case CONTEXT: { + dataBus.put(name, context.getContextVariable(name)); + break; + } + case OUTPUT: { + IScriptStep step = context.getCurrentStep(); + Map map = step.getOutput(); + dataBus.put(name, map.get(name)); + break; + } + } + } + return dataBus; + } + + public String getKeywordParams(Map dataBus, List arguments) throws Exception { + StringBuffer sb = new StringBuffer(); + sb.append("{"); + int i = 1, size = arguments.size(); + for (KeywordArgument argument : arguments) { + sb.append(argument.getComment()).append("(").append(argument.getName()).append(")="); + sb.append(argument.isHideSensitive() ? "******" : object2String(dataBus.get(argument.getName()))); + if (i < size) { + sb.append(", "); + } + i++; + } + sb.append("}"); + return sb.toString(); + } + + /** + * 设置步骤 + * + * @param dataBus + * @param arguments + * @param stepRet + * @throws Exception + */ + public void getKeywordParams2Map(Map dataBus, List arguments, StepExecuteResult stepRet) throws Exception { + Map paramMap = new HashMap<>(); + stepRet.setParamMap(paramMap); + Map variables = (Map) stepRet.getResult().get("variables"); + log.debug("getKeywordParams2Map -> {}", JsonUtils.toJson(variables)); + for (KeywordArgument argument : arguments) { + String value = object2String(dataBus.get(argument.getName())); + if (RegexUtils.containScriptVar(value)) { + String var = value.substring(2, value.length() - 1); + log.debug("------> value ------> {}, var ----> {}", value, var); + if (variables.containsKey(var) && null != variables.get(var)) { + value = var + "=" + variables.get(var).toString(); + } + } + paramMap.put(argument.getName(), value); + } + } + + private static String object2String(Object object) { + if (object == null) { + return "null"; + } + return StringUtils.abbreviate(object.toString(), 500); + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/thread/ExecutorPool.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/thread/ExecutorPool.java new file mode 100644 index 0000000..91278db --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/thread/ExecutorPool.java @@ -0,0 +1,163 @@ +package net.northking.cctp.se.thread; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 执行线程池 + * + */ +public class ExecutorPool { + + private final static Map statusMap = new ConcurrentHashMap<>(); + + private static int PC_Max_Thread_Pool_Size = 1; + + private static int Mobile_Max_Thread_Pool_Size = 8; + + private static int Api_Max_Thread_Pool_Size = 10; + + private static int PC_Core_Thread_Pool_Size = 1; + + private static int Mobile_Core_Thread_Pool_Size = 8; + + private static int Api_Core_Thread_Pool_Size = 10; + + public static boolean enablePc = true; + + public static boolean enableMobile = true; + + public static boolean enableApi = true; + + /** + * PC是单线程池 + */ + private static ThreadPoolExecutor PC_POOL; + /** + * 移动自动化多线程池 + */ + private static ThreadPoolExecutor MOBILE_POOL; + + /** + * 接口自动化多线程池 + */ + private static ThreadPoolExecutor API_POOL; + + /** + * 初始化线程池 + * @param enablePc + * @param pcSize + * @param enableMobile + * @param mobileSize + * @param enableApi + * @param apiSize + */ + public ExecutorPool(Boolean enablePc, Integer pcSize,Integer pcCoreSize, + Boolean enableMobile, Integer mobileSize, Integer mobileCoreSize, + Boolean enableApi, Integer apiSize ,Integer apiCoreSize) { + if (null != enablePc) { + ExecutorPool.enablePc = enablePc; + } + if (null != enableMobile) { + ExecutorPool.enableMobile = enableMobile; + } + if (null != enableApi) { + ExecutorPool.enableApi = enableApi; + } + if (null != pcSize) { + PC_Max_Thread_Pool_Size = pcSize; + } + if (null != mobileSize) { + Mobile_Max_Thread_Pool_Size = mobileSize; + } + if (null != apiSize) { + Api_Max_Thread_Pool_Size = apiSize; + } + if (null != pcCoreSize) { + PC_Core_Thread_Pool_Size = pcCoreSize; + } + if (null != mobileCoreSize) { + Mobile_Core_Thread_Pool_Size = mobileCoreSize; + } + if (null != apiCoreSize) { + Api_Core_Thread_Pool_Size = apiCoreSize; + } + PC_POOL = new ThreadPoolExecutor(PC_Core_Thread_Pool_Size, PC_Max_Thread_Pool_Size, + 0L, TimeUnit.SECONDS, + new LinkedBlockingQueue()); + MOBILE_POOL = new ThreadPoolExecutor(Mobile_Core_Thread_Pool_Size, Mobile_Max_Thread_Pool_Size, + 0L, TimeUnit.SECONDS, + new LinkedBlockingQueue()); + API_POOL = new ThreadPoolExecutor(Api_Core_Thread_Pool_Size, Api_Max_Thread_Pool_Size, + 10L, TimeUnit.SECONDS, + new LinkedBlockingQueue()); + } + + public static boolean isPCAvailable() { + return enablePc && PC_POOL.getActiveCount() < PC_Max_Thread_Pool_Size; + } + + public static boolean isMobileAvailable() { + return enableMobile && MOBILE_POOL.getActiveCount() < Mobile_Max_Thread_Pool_Size; + } + + public static boolean isApiAvailable() { + return enableApi && API_POOL.getActiveCount() < Api_Max_Thread_Pool_Size; + } + + public static ThreadPoolExecutor getPCPool() { + return PC_POOL; + } + + public static ThreadPoolExecutor getMobilePool() { + return MOBILE_POOL; + } + + public static ThreadPoolExecutor getApiPool() { + return API_POOL; + } + + /** + * 获取各个线程池正在运行的线程数量 + * @return + */ + public static Map status() { + if (enablePc)statusMap.put("pc", PC_POOL.getActiveCount()); + if(enableMobile)statusMap.put("mobile", MOBILE_POOL.getActiveCount()); + if(enableApi)statusMap.put("api", API_POOL.getActiveCount()); + return statusMap; + } + + /** + * 获取线程池信息 + * @return + */ + public static Map info() { + LinkedHashMap map = new LinkedHashMap<>(); + map.put("enablePC", enablePc); + map.put("pcThread", PC_Max_Thread_Pool_Size); + if (enablePc)map.put("pc_thread_active", PC_POOL.getActiveCount()); + map.put("enableMobile", enableMobile); + map.put("mobileThread", Mobile_Max_Thread_Pool_Size); + if(enableMobile)map.put("mobile_thread_active", MOBILE_POOL.getActiveCount()); + map.put("enableApi", enableApi); + map.put("apiThread", Api_Max_Thread_Pool_Size); + if(enableApi)map.put("api_thread_active", API_POOL.getActiveCount()); + return map; + } + + /** + * 线程不再接收新的任务 + * + */ + public static void stopAll() { + ExecutorPool.enablePc = false; + ExecutorPool.enableMobile = false; + ExecutorPool.enableApi = false; + } + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/AndroidUtil.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/AndroidUtil.java new file mode 100644 index 0000000..6e84d4a --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/AndroidUtil.java @@ -0,0 +1,170 @@ +package net.northking.cctp.se.util; + +import com.alibaba.fastjson.JSON; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.se.device.bean.DebuggerDeviceInfo; +import net.northking.cctp.se.device.bean.DeviceInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpEntity; + +import java.util.Map; + +public class AndroidUtil { + + private static final Logger logger = LoggerFactory.getLogger(AndroidUtil.class); + + private static final String CLEAN_APP_DATA_URL = "http://%s/engine/cleanData"; + private static final String GET_PACKAGE_VERSION_URL = "http://%s/engine/getPackageVersion"; + private static final String ALL_SCREEN_SHOT_URL = "http://%s/engine/uploadShotAllScreen"; + private static final String START_RECORD_URL = "http://%s/engine/startRecord"; + private static final String END_RECORD_URL = "http://%s/engine/endRecord"; + private static final String INSTALL_APP = "http://%s/engine/installApp"; + private static final String ACTIVE_APP = "http://%s/engine/activeApp"; + private static final String RELEASE_ADB_FORWARD_PORT = "http://%s/engine/releaseAdbForwardPort"; + + public static boolean releaseAdbForwardPort(String remoteAddress,String deviceId){ + try { + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(deviceId); + HttpEntity entity = new HttpEntity<>(info); + return HttpUtils.doPost(String.format(RELEASE_ADB_FORWARD_PORT, remoteAddress),entity, Boolean.class); + } catch (Exception e) { + logger.error("清除数据失败,原因:{}",e); + return false; + } + } + + public static boolean cleanAppData(String remoteAddress,String deviceId,String appPackage){ + try { + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(deviceId); + info.setAppPackage(appPackage); + HttpEntity entity = new HttpEntity<>(info); + return HttpUtils.doPost(String.format(CLEAN_APP_DATA_URL, remoteAddress),entity, Boolean.class); + } catch (Exception e) { + logger.error("清除数据失败,原因:{}",e); + return false; + } + } + + /** + * 获取手机应用版本号 + * @param deviceId + * @param appPackage + * @return + */ + public static String getOldPackageCode(String remoteAddress,String deviceId,String appPackage,String platform){ + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(deviceId); + info.setAppPackage(appPackage); + info.setPlatform(platform); + HttpEntity entity = new HttpEntity<>(info); + try { + return HttpUtils.doPost(String.format(GET_PACKAGE_VERSION_URL, remoteAddress),entity, String.class); + } catch (Exception e) { + logger.error("获取应用版本号失败,原因:{}",e); + return ""; + } + } + + public static String startRecord(String remoteAddress,String deviceId,String taskId,String tenantId){ + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(deviceId); + info.setPlatform("0"); + info.setTenantId(tenantId); + logger.info("移动任务开启录屏,任务id:{}, tenantId:{}", taskId, tenantId); + info.setTaskId(taskId); + logger.info("录屏参数:{}", JSON.toJSONString(info)); + HttpEntity entity = new HttpEntity<>(info); + String result = null; + try { + result = HttpUtils.doPost(String.format(START_RECORD_URL, remoteAddress), entity, String.class); + } catch (Exception e) { + logger.error("开启录屏失败",e); + } + return result; + } + + public static String stopRecord(String remoteAddress, String deviceId,Map initData) { + String tenantId = (String)initData.get("tenantId"); + Boolean save = (Boolean) initData.get("save"); + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(deviceId); + String taskId = (String)initData.get("taskId"); + logger.info("移动任务结束录屏,任务id:"+taskId); + info.setTaskId(taskId); + info.setTenantId(tenantId); + info.setSave(save); + logger.info("结束录屏参数:{}", JSON.toJSONString(info)); + HttpEntity entity = new HttpEntity<>(info); + String result = null; + try { + result = HttpUtils.doPost(String.format(END_RECORD_URL, remoteAddress), entity, String.class); + } catch (Exception e) { + logger.error("移动任务结束录屏失败",e); + } + return result; + } + + + + public static String snapshotAllScreen(String remoteAddress, DeviceInfo deviceInfo, String tenantId, String taskId) { + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setPlatform(deviceInfo.getPlatform()); + info.setDeviceId(deviceInfo.getDeviceId()); + info.setResolution(deviceInfo.getResolution()); + info.setTenantId(tenantId); //租户id + info.setTaskId(taskId); + logger.info("参数:{}", JSON.toJSONString(info)); + HttpEntity entity = new HttpEntity<>(info); + String result = null; + try { + result = HttpUtils.doPost(String.format(ALL_SCREEN_SHOT_URL, remoteAddress), entity, String.class); + } catch (Exception e) { + logger.error("截图失败",e); + } + return result; + } + + public static boolean installApp(String remoteAddress, String deviceId, String appPath,String platform, String packageName) { + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(deviceId); + info.setAppPath(appPath); + info.setPlatform(platform); + info.setAppPackage(packageName); + HttpEntity entity = new HttpEntity<>(info); + Boolean isOk = HttpUtils.doInstall(String.format(INSTALL_APP, remoteAddress), entity); + if (!isOk) { + logger.warn("设备【{}】安装应用失败。。。。", deviceId); + throw new ExecuteException("安装App出错"); + } + return true; + } + + public static boolean activeApp(String uuid, String appPackage, String remoteAddress) { + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(uuid); + info.setAppPackage(appPackage); + info.setPlatform("0"); + HttpEntity entity = new HttpEntity<>(info); + Boolean isOk = false; + try { + isOk = HttpUtils.doPost(String.format(ACTIVE_APP, remoteAddress), entity, Boolean.class); + } catch (Exception e) { + logger.error("设备【{}】启动应用失败", uuid,e); + try { + Thread.sleep(1000); + } catch (InterruptedException interruptedException) { + logger.warn("设备【{}】关闭app前停止。。。。。。。。。。", uuid); + throw new ExecuteException("执行停止"); + } + isOk = HttpUtils.doPost(String.format(ACTIVE_APP, remoteAddress), entity, Boolean.class); + } + logger.debug("启动应用结果:{}", isOk); + if (!isOk) { + throw new ExecuteException("启动应用失败"); + } + return true; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/ArgumentUtil.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/ArgumentUtil.java new file mode 100644 index 0000000..f7b273f --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/ArgumentUtil.java @@ -0,0 +1,180 @@ +package net.northking.cctp.se.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import lombok.extern.slf4j.Slf4j; +import net.northking.cctp.element.core.IExecuteContext; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.element.core.keyword.KeywordArgument; +import org.apache.commons.lang3.StringUtils; +import org.codehaus.groovy.jsr223.GroovyScriptEngineImpl; + +import javax.script.Bindings; +import javax.script.ScriptContext; +import javax.script.ScriptEngine; +import java.math.BigDecimal; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +@Slf4j +public class ArgumentUtil { + + private static ScriptEngine engine = new GroovyScriptEngineImpl(); + + /** + * 处理组件参数值 + * todo: 可删掉 + */ + public static String handle(KeywordArgument argument, IExecuteContext context, String text) { + Set globalVar = RegexUtils.extractGlobalVar(text); + Set scriptVar = RegexUtils.extractScriptVar(text); + String value; + if (!argument.isExpression()) { + for (String var : scriptVar) { + value = context.getVariableValue(var); + text = StringUtils.replace(text, "${" + var + "}", value); + } + for (String var : globalVar) { + value = context.getProjectGlobalVariable(var); + text = StringUtils.replace(text, "${" + var + "}", value); + } + return text; + } + return text; + } + + /** + * 执行表达式参数,形如:${var1} + "a" + #{g_var1} + */ + public static Object evalExpression(IExecuteContext context, String text) { + Set globalVar = RegexUtils.extractGlobalVar(text); + Set scriptVar = RegexUtils.extractScriptVar(text); + String expression = text; + String value; + log.debug("开始处理表达式:{}", expression); + for (String var : scriptVar) { + value = context.getVariableValue(var); + if (value == null) { + value = var; + } + Object restoreVar = restoreVarType(context, var, value, false); + log.debug("表达式处理前:{}",expression); + expression = StringUtils.replace(expression, "${" + var + "}", JSON.toJSONString(restoreVar)); + } + for (String var : globalVar) { + value = context.getProjectGlobalVariable(var); + if (value == null) { + value = var; + } + Object restoreVar = restoreVarType(context, var, value, true); + log.debug("表达式处理前:{}",expression); + expression = StringUtils.replace(expression, "#{" + var + "}", JSON.toJSONString(restoreVar)); + } + log.debug("表达式处理后:{}", expression); + Map vars = new HashMap<>(); + try { + return evalExpression(vars, expression); + } catch (Exception e) { + throw new ExecuteException("表达式执行失败:" + text); + } + } + + public static Object evalExpression(Map vars, String expression) throws Exception { + try { + ExpressionSimpleBindings bindings = new ExpressionSimpleBindings(vars); + engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE); + Object result = engine.eval(expression); + return result; + } catch (Exception e) { + log.error("表达式错误,可能存在未声明的变量:" + expression, e); + throw e; + } + } + + private static Object restoreVarType(IExecuteContext context, String var, String value, boolean isGlobal) { + String restoreVar = context.getVariableType(var, isGlobal); + switch (restoreVar) { + case "boolean": + return Boolean.parseBoolean(value); + case "number": + return new BigDecimal(value); + case "object": + return JSON.parse(value); + case "array": + return JSONArray.parse(value); + default: + return value; + } + } + + public static class ExpressionSimpleBindings implements Bindings { + + private Map map; + + public ExpressionSimpleBindings(Map map) { + this.map = map; + } + + @Override + public Object put(String name, Object value) { + return map.put(name, value); + } + + @Override + public void putAll(Map toMerge) { + map.putAll(toMerge); + } + + @Override + public void clear() { + map.clear(); + } + + @Override + public Set keySet() { + return map.keySet(); + } + + @Override + public Collection values() { + return map.values(); + } + + @Override + public Set> entrySet() { + return map.entrySet(); + } + + @Override + public int size() { + return map.size(); + } + + @Override + public boolean isEmpty() { + return map.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return map.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return map.containsValue(value); + } + + public Object get(Object key) { + return map.get(key); + } + + @Override + public Object remove(Object key) { + return map.remove(key); + } + } + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/ControlTarget.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/ControlTarget.java new file mode 100644 index 0000000..3854585 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/ControlTarget.java @@ -0,0 +1,38 @@ +package net.northking.cctp.se.util; + +import java.io.Serializable; + +public class ControlTarget implements Serializable { + private String using; //类型 + + private String value; //值 + + private String strategy; //优先级 + + public ControlTarget() { + } + + public String getUsing() { + return using; + } + + public void setUsing(String using) { + this.using = using; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getStrategy() { + return strategy; + } + + public void setStrategy(String strategy) { + this.strategy = strategy; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/ElementUtil.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/ElementUtil.java new file mode 100644 index 0000000..4eec06a --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/ElementUtil.java @@ -0,0 +1,409 @@ +package net.northking.cctp.se.util; + +import com.alibaba.fastjson.JSON; +import io.appium.java_client.AppiumDriver; +import io.appium.java_client.TouchAction; +import io.appium.java_client.android.AndroidDriver; +import io.appium.java_client.ios.IOSDriver; +import io.appium.java_client.touch.WaitOptions; +import io.appium.java_client.touch.offset.PointOption; +import net.northking.cctp.element.core.exception.EnvironmentException; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.element.core.exception.ParamMistakeException; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; +import java.util.stream.Collectors; + +/** + * 元素操作 + */ +public class ElementUtil { + + + private static final Logger logger = LoggerFactory.getLogger(ElementUtil.class); + + private static final ExecutorService executorService = Executors.newFixedThreadPool(20); + + private static final String sendKeysUrl = "http://127.0.0.1:{wdaPort}/wda/cctpInput"; + + private static final String windowsUrl = "http://127.0.0.1:{wdaPort}/window/size"; + + /** + * 查找控件 + * @param driver 设备驱动 + * @param controlTargets 控件的属性 + * @param timeout 超时 + * @param waitTimeout 默认超时时间 + * @param more 是否支持查询到多个 + * @param address 选择第几个 + * @param waitStatus 是否等待界面稳定 + * @param swipe 是否滑动 + * @param swipeCount 滑动次数 + * @return + */ + public static WebElement findElement(AppiumDriver driver, + List controlTargets, + Integer timeout, + Integer waitTimeout, + boolean more, + Integer address, + boolean waitStatus, + String swipe, + Integer swipeCount){ + if (null == driver) { + logger.error("driver获取失败"); + throw new EnvironmentException("设备自动化驱动连接已断开,请检查驱动程序是否正常"); + } + //是否等待界面稳定 + WebElement webElement = null; + if (timeout > 120 || timeout <= 0) { + timeout = waitTimeout; + } + List webElements = findElementsByXpath(driver,controlTargets,swipe,swipeCount,timeout); + if (webElements == null) { + return null; + } + if (webElements.size() == 1) {//匹配到单个元素 + webElement = webElements.get(0); + } else if (webElements.size() > 1) {//匹配到多个元素 + if (more) { + if (address <= webElements.size()) { + webElement = webElements.get(address - 1); + } else { + return null; + } + } else { + return null; + } + } + + if (null != webElement) { + logger.debug("查找到的元素名字是:{}", webElement.getText()); + } + return webElement; + } + /** + * 查找控件, + * ①当有必选时,必须满足必选,找到多个才满足可选 + * ②当无必选时,可选只需要满足一个即可 + * ③忽略不需要考虑进去 + * ④priority 0-忽略,1-必选,2-可选 + * @param driver + * @param controlTargets + * @param swipe + * @param swipeCount + * @param timeout + * @return + */ + public static List findElementsByXpath(AppiumDriver driver, List controlTargets, String swipe,Integer swipeCount,Integer timeout){ + //转换查询条件为xpath + String[] xpath = targetToXpath(driver,controlTargets); + //开始查找控件 + List webElements = findElements(driver,xpath,swipe,swipeCount,timeout); + return webElements; + } + + private static String[] targetToXpath(AppiumDriver driver, List controlTargets) { + String text = "@text="; + String id = "@resource-id="; + String elementClass = "@class="; + if (driver instanceof IOSDriver) { + text = "@label="; + id = "@name="; + elementClass = "@type="; + } + int flag = 0; + List concatList = new ArrayList<>(); + List selectList = new ArrayList<>(); + String[] xpath = new String[3]; //xpath数组 0-必选 xpath 1-拼接必选 xpath 2-可选 xpath + for (ControlTarget controlTarget : controlTargets) { + if ("0".equals(controlTarget.getStrategy())) { //忽略 + flag++; + } else if ("1".equals(controlTarget.getStrategy())) { //必选 + if ("xpath".equals(controlTarget.getUsing())) { + xpath[0] = controlTarget.getValue(); + } else if ("id".equals(controlTarget.getUsing())) { + concatList.add(id + "'" + controlTarget.getValue() + "'"); + } else if ("class".equals(controlTarget.getUsing())) { + concatList.add(elementClass + "'" + (driver instanceof IOSDriver?"XCUIElementType" + controlTarget.getValue():controlTarget.getValue())+ "'"); + } else { + concatList.add(text + "'" + controlTarget.getValue() + "'"); + } + } else { //可选 + if ("xpath".equals(controlTarget.getUsing())) { + xpath[2] = controlTarget.getValue(); + } else if ("id".equals(controlTarget.getUsing())) { + selectList.add("//*[" + id + "'" + controlTarget.getValue() + "']"); + } else if ("class".equals(controlTarget.getUsing())) { + selectList.add("//*[" + elementClass + "'" + controlTarget.getValue() + "']"); + } else { + selectList.add("//*[" + text + "'" + controlTarget.getValue() + "']"); + } + } + } + if (flag >= 4) { + throw new ParamMistakeException("查找控件的策略都为忽略,无法精准定位到控件"); + } + if (!CollectionUtils.isEmpty(concatList)) { //必选 + xpath[1] = "//*[" + concatList.stream().collect(Collectors.joining(" and ")) + "]"; + } + if (!CollectionUtils.isEmpty(selectList)) { //可选 + if (StringUtils.hasText(xpath[2])) { + xpath[2] = xpath[2] + "|"; + } + xpath[2] = (null != xpath[2]?xpath[2]:"") + selectList.stream().collect(Collectors.joining(" | ")); + } + logger.info("实际 xpath:{}",xpath[0]); + logger.info("连接 xpath:{}",xpath[1]); + logger.info("可选 xpath:{}",xpath[2]); + return xpath; + } + + private static List findElements(AppiumDriver driver, String[] xpath, String swipe, Integer swipeCount, Integer timeout) { + int stepTimeout = timeout; + //每屏查找时间 + if (!"0".equals(swipe)) { + stepTimeout = timeout / (swipeCount+1); + } + //开始查找 + int stepTimeoutFinal = stepTimeout; + Future> futureTask = executorService.submit(() -> { + int num = 1; + List elements = null; + do { + driver.manage().timeouts().implicitlyWait(stepTimeoutFinal, TimeUnit.SECONDS); + long startTime = System.currentTimeMillis(); + if (StringUtils.hasText(xpath[0])) { //xpath必选 + logger.info("xpath是必选,xpath:{}", xpath[0]); + elements = driver.findElementsByXPath(xpath[0]); + if (!CollectionUtils.isEmpty(elements)) { //必选xpath有找到元素 + logger.info("查找到{}个控件", elements.size()); + Long spendTime = System.currentTimeMillis() - startTime; //必选xpath查找元素耗时 + driver.manage().timeouts().implicitlyWait(stepTimeoutFinal * 1000 - spendTime, TimeUnit.MILLISECONDS); //设置剩下的超时时间 + if (StringUtils.hasText(xpath[1])) { //其他的条件也存在必选 + logger.info("其他也存在必选的条件,组装成xpath:{}", xpath[1]); + List concatElements = driver.findElementsByXPath(xpath[1]); + if (!CollectionUtils.isEmpty(concatElements)) { //其他的必选条件查找到控件,合并 + logger.info("其他必选条件查到{}个元素", concatElements.size()); + elements = mergeWebElement(elements, concatElements); + logger.info("合并完成之后一共{}个元素", elements.size()); + //合并之后元素不为空 + Long spendTime2 = System.currentTimeMillis() - startTime; + if (!CollectionUtils.isEmpty(elements)) { + if (StringUtils.hasText(xpath[2])) { //有可选,再继续查可选 + driver.manage().timeouts().implicitlyWait(stepTimeoutFinal * 1000 - spendTime2 / 1000, TimeUnit.MILLISECONDS); + List selectElements = driver.findElementsByXPath(xpath[2]); + if (!CollectionUtils.isEmpty(selectElements)) { //找到了就合并 + List mergeElements = mergeWebElement(elements, selectElements); + if (null != mergeElements) { //合并完成,不是空,就返回 + elements = mergeElements; + } + } + } + } else { //为空没必要再查下去,把时间睡下去 + Thread.sleep(stepTimeoutFinal * 1000 - spendTime2); + } + } else { //其他必选条件没有查找到元素 + logger.info("其他必选条件没有查找到元素"); + elements = null; + logger.debug("总共查找耗时:{}s", (System.currentTimeMillis() - startTime) / 1000); + } + } else { //不存在其他必选条件,看看是否有可选条件 + if (StringUtils.hasText(xpath[2])) { //有可选条件 + List selectElements = driver.findElementsByXPath(xpath[2]); + if (!CollectionUtils.isEmpty(selectElements)) { + List mergeWebElements = mergeWebElement(elements, selectElements); + if (!CollectionUtils.isEmpty(mergeWebElements)) { + elements = mergeWebElements; + } + } + } + } + } else { //xpath必选没有找到元素 + logger.debug("xpath必选没有找到元素,查找时间 :{}s", (System.currentTimeMillis() - startTime) / 1000); + } + } else { //xpath不是必选 + if (StringUtils.hasText(xpath[1])) { //其他条件存在必选 + long startTimeFind = System.currentTimeMillis(); + elements = driver.findElementsByXPath(xpath[1]); + logger.info("找控件所需时间:{}ms",System.currentTimeMillis() - startTimeFind); + if (!CollectionUtils.isEmpty(elements)) { //其他必选条件有找到 + logger.info("其他必选条件找到{}个元素", elements.size()); + if (StringUtils.hasText(xpath[2])) { + logger.info("有可选条件,xpath:{}", xpath[2]); + long spendTime = System.currentTimeMillis() - startTime; + driver.manage().timeouts().implicitlyWait(stepTimeoutFinal * 1000 - spendTime, TimeUnit.MILLISECONDS); + List selectElements = driver.findElementsByXPath(xpath[2]); + if (!CollectionUtils.isEmpty(selectElements)) { + List mergeElement = mergeWebElement(elements, selectElements); + if (!CollectionUtils.isEmpty(mergeElement)) { + elements = mergeElement; + } + } + } + } else { + logger.info("其他得必选条件没找到元素,共计耗时:{}", (System.currentTimeMillis() - startTime) / 1000); + } + } else { //其他条件也不是必选,那么全是可选 + logger.info("没有必选条件,全是可选条件,xpath:{}", xpath[2]); + elements = driver.findElementsByXPath(xpath[2]); + } + } + + if (!CollectionUtils.isEmpty(elements)) { + logger.info("最终符合条件的元素有{}个", elements.size()); + for (int i = 0; i < elements.size(); i++) { + WebElement element = elements.get(i); + logger.info("第{}个元素名字:{},位置x:{},y:{}", i + 1, element.getText(), element.getRect().getX(), element.getRect().getY()); + } + return elements; + } + if ("0".equals(swipe)) { //不滑屏,直接返回找不到 + logger.warn("不滑屏,没找到控件"); + return null; + } + num++; + } while (num <= swipeCount); + logger.warn("找了一圈都没找到元素"); + return null; + }); + try { + List webElements = futureTask.get(500, TimeUnit.SECONDS); + return webElements; + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + logger.error("查找元素中断:",e); + } catch (ExecutionException e) { + logger.error("查找元素失败:",e); + } catch (TimeoutException e) { + logger.error("查找元素超时:",e); + futureTask.cancel(true); + } + return null; + } + + private static List mergeWebElement(List elements, List concatElements) { + List webElements = new ArrayList<>(); + for (WebElement element : elements) { + for (WebElement concatElement : concatElements) { + long start = System.currentTimeMillis(); + if (element.getLocation().getX() == concatElement.getLocation().getX() + && element.getLocation().getY() == concatElement.getLocation().getY() + ) { + webElements.add(element); + break; + } + logger.info("对比一个控件耗时:{}ms",System.currentTimeMillis() - start); + } + } + return webElements; + } + + + /** + *

查找页面上存在的文本

+ * @param driver driver链接 + * @param text 查找的文本 + * @param type 类型0-等于,1-包含contain + * @return 查到包含文本的所有控件 + */ + public static List findElementsByText(AppiumDriver driver,String text,String type){ + if (null == driver) { + logger.error("driver获取为空"); + throw new EnvironmentException("设备自动化驱动连接已断开,请检查驱动程序是否正常"); + } + String s = ""; + if (driver instanceof AndroidDriver) { + if ("0".equals(type)) { + s = "//*[@text = '" + text + "']"; + } else { + s = "//*[@contain = '" + text + "']"; + } + } else if (driver instanceof IOSDriver) { + s = "//*[@label = '" + text + "']"; + } + logger.debug("xpath匹配:{}.", s); + List elements = null; + try { + elements = driver.findElements(By.xpath(s)); + } catch (Exception e) { + logger.error("查找文本控件出错", e); + throw new ExecuteException("查找文本控件出错"); + } + return null; + } + + + + + public static void elementSwipe(WebElement element,String direction, AppiumDriver driver, Integer size) { + int width = driver.manage().window().getSize().width; + int height = driver.manage().window().getSize().height; + int x1=element.getLocation().x; + int y1=element.getLocation().y; + try { + if (driver instanceof IOSDriver ){ + String rect=element.getAttribute("rect"); + PointMessage pointMessage= JSON.parseObject(rect,PointMessage.class); + x1=pointMessage.getX()+ pointMessage.getWidth()/2; + y1=pointMessage.getY()+ pointMessage.getHeight()/2; + } + }catch (Exception e){ + logger.error("获取ios控件位置异常",e); + throw new ExecuteException("获取ios控件位置失败"); + } + int x2, y2; + if ("up".equalsIgnoreCase(direction)) { + x2 = x1 ; + y2 = y1 - size; + y2 = height / 100; + } else if ("down".equalsIgnoreCase(direction)) { + x2 = x1; + y2 = y1 + size; + y2 = height * 99 / 100; + } else if ("left".equalsIgnoreCase(direction)) { + x2 = x1 - size; + y2 =y1; + } else if ("right".equalsIgnoreCase(direction)) { + x2 = x1 + size; + x2 = width * 99 / 100; + y2 =y1; + } else { + throw new ParamMistakeException("滑动方向仅支持:up、down、left、right"); + } + logger.debug("开始节点x:{} y:{},结束节点x:{},y:{}",x1,y1,x2,y2); + new TouchAction(driver).press(PointOption.point(x1, y1)) + .waitAction(WaitOptions.waitOptions(Duration.ofSeconds(200))) + .moveTo(PointOption.point(x2, y2)) + .release().perform(); + } + + public static void elementSwipe(WebElement element,String direction, AppiumDriver driver) { + int width = driver.manage().window().getSize().width; + int height = driver.manage().window().getSize().height; + //默认左右滑屏滑动屏幕的4/5 + int size = width * 4 / 5; + if ("up".equals(direction) || "down".equals(direction)) { + size = height * 3 / 5; + } + elementSwipe(element, direction, driver, size); + } + + private static void enhancedClearText(WebElement element) { + element.clear(); + String content = element.getText(); + long start = content.length(); + if (start > 0) { + logger.warn("当前控件文本无法清空"); + } + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/HttpUtils.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/HttpUtils.java new file mode 100644 index 0000000..63e7971 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/HttpUtils.java @@ -0,0 +1,198 @@ +package net.northking.cctp.se.util; + +import cn.hutool.core.io.IoUtil; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.se.config.AtuServerConfig; +import net.northking.cctp.se.file.Attachment; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.FileSystemResource; +import org.springframework.http.*; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.http.converter.FormHttpMessageConverter; +import org.springframework.http.converter.ResourceHttpMessageConverter; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RequestCallback; +import org.springframework.web.client.ResponseExtractor; +import org.springframework.web.client.RestTemplate; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.URI; +import java.util.Arrays; +import java.util.Map; + +public class HttpUtils { + + private static final RestTemplate restTemplate; + + private static final RestTemplate downLoadRestTemplate; + + private static final Logger logger = LoggerFactory.getLogger(HttpUtils.class); + + static { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setConnectTimeout(30000); + factory.setReadTimeout(30000); + restTemplate = new RestTemplate(factory); + + SimpleClientHttpRequestFactory downloadFactory = new SimpleClientHttpRequestFactory(); + downloadFactory.setConnectTimeout(15000); + downloadFactory.setReadTimeout(600000); + downLoadRestTemplate = new RestTemplate(downloadFactory); + } + + public static T doPost(URI uri, HttpEntity httpEntity, Class responseType){ + ResponseEntity response = null; + try { + response = restTemplate.exchange(uri, HttpMethod.POST, httpEntity, responseType); + } catch (Exception e) { + logger.error("请求出错,地址:{},原因:{}",uri.getPath(),e); + throw new ExecuteException(String.format("http请求【%s】出错", uri.getPath())); + } + return response.getBody(); + } + + public static T doPost(String url, HttpEntity httpEntity, Class responseType){ + ResponseEntity response = null; + try { + response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, responseType); + } catch (Exception e) { + logger.error("请求出错,地址:{},原因:{}",url,e); + throw new ExecuteException(String.format("http请求【%s】出错", url)); + } + return response.getBody(); + } + + public static T doGet(URI uri, Class responseType){ + ResponseEntity response = null; + try { + response = restTemplate.exchange(uri, HttpMethod.GET, null, responseType); + } catch (Exception e) { + logger.error("请求出错,地址:{},原因:{}",uri.getPath(),e); + throw new ExecuteException(String.format("http请求【%s】出错", uri.getPath())); + } + return response.getBody(); + } + + public static T doGet(String url, Class responseType){ + + ResponseEntity response = null; + try { + response = restTemplate.exchange(url, HttpMethod.GET, null, responseType); + } catch (Exception e) { + logger.error("请求出错,地址:{},原因:{}",url,e); + throw new ExecuteException(String.format("http请求【%s】出错", url)); + } + return response.getBody(); + } + + public static void downloadFileToLocal(String sourceUrl,String targetDir,String fileName){ + final String[] installAddr = {""}; + RequestCallback callback = request -> request.getHeaders().setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM, MediaType.ALL)); + ResponseExtractor responseExtractor = clientHttpResponse -> { + File appFile = new File(targetDir + "/" + fileName); + InputStream inputStream = clientHttpResponse.getBody(); + FileOutputStream outputStream = new FileOutputStream(appFile); + byte[] data = new byte[1024 * 1024]; + int length = 0; + while ((length = inputStream.read(data, 0, data.length)) > 0) { + outputStream.write(data, 0, length); + } + installAddr[0] = appFile.getAbsolutePath(); + return appFile; + }; + downLoadRestTemplate.execute(sourceUrl, HttpMethod.GET, callback, responseExtractor); + } + + public static boolean doInstall(String url, HttpEntity httpEntity){ + ResponseEntity response = null; + try { + response = downLoadRestTemplate.exchange(url, HttpMethod.POST, httpEntity, Boolean.class); + } catch (Exception e) { + logger.error("请求出错,地址:{},原因:{}",url,e); + throw new ExecuteException(String.format("http请求【%s】出错", url)); + } + return response.getBody(); + } + + + /** + * 上传资源 + * @param filePath + * @param tenantId + * @return + */ + public static Attachment upload(String filePath, String tenantId, String objId, String businessCode) { + if (StringUtils.isBlank(tenantId)) { + throw new ExecuteException("上传资源失败:缺少租户信息"); + } + if (StringUtils.isBlank(filePath)) { + throw new ExecuteException("上传资源失败:文件地址为空"); + } + RestTemplate template = new RestTemplate(); + AtuServerConfig config = SpringUtils.getBean(AtuServerConfig.class); + String url = config.getServerUrl() + config.getFileUploadPath(); + LinkedMultiValueMap multipartMap = new LinkedMultiValueMap<>(); + multipartMap.add("file", new FileSystemResource(filePath)); + multipartMap.add("tenantId", tenantId); + multipartMap.add("objId", objId); + multipartMap.add("businessCode", businessCode); + FormHttpMessageConverter converter = new FormHttpMessageConverter(); + converter.addPartConverter(new ResourceHttpMessageConverter()); + template.getMessageConverters().add(converter); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + HttpEntity> httpEntity = new HttpEntity<>(multipartMap, headers); + Attachment result = null; + try { + ResultWrapper> wrapper = template.postForObject(url, httpEntity, ResultWrapper.class); + if (null != wrapper && wrapper.isSuccess()) { + if (wrapper.getData() != null) { + result = new Attachment(); + if (wrapper.getData().containsKey("id") && wrapper.getData().get("id") != null) { + result.setId(wrapper.getData().get("id").toString()); + } + if (wrapper.getData().containsKey("urlPath") && wrapper.getData().get("urlPath") != null) { + result.setUrlPath(wrapper.getData().get("urlPath").toString()); + } + } + } else { + throw new ExecuteException("上传资源失败"); + } + } catch (ExecuteException e) { + throw e; + } catch (Exception e) { + throw new ExecuteException("上传资源失败:" + e.getMessage(), e); + } + return result; + } + + public static InputStream download2Stream(String resource) { + if (StringUtils.isBlank(resource)) { + throw new ExecuteException("下载资源失败:文件地址为空"); + } + RestTemplate template = new RestTemplate(); + AtuServerConfig config = SpringUtils.getBean(AtuServerConfig.class); + String url = config.getServerUrl() + config.getFileDownloadPath() + resource; + ResponseEntity resultEntity = null; + try { + resultEntity = restTemplate.getForEntity(url, byte[].class); + } catch (HttpClientErrorException e) { + if (HttpStatus.NOT_FOUND == e.getStatusCode()) { + throw new ExecuteException("下载失败", e); + } + throw new ExecuteException("下载失败", e); + } + if (resultEntity.getBody() == null) { + throw new ExecuteException("下载内容为空"); + } + return IoUtil.toStream(resultEntity.getBody()); + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/IosUtil.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/IosUtil.java new file mode 100644 index 0000000..06ab567 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/IosUtil.java @@ -0,0 +1,163 @@ +package net.northking.cctp.se.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import net.northking.cctp.element.core.exception.ExecuteException; +import net.northking.cctp.se.device.bean.DebuggerDeviceInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpEntity; + +import java.util.Map; + +public class IosUtil { + + private static final Logger logger = LoggerFactory.getLogger(IosUtil.class); + + private static final String IS_APP_INSTALLED = "http://%s/engine/isAppInstalled"; + private static final String REMOVE_APP = "http://%s/engine/removeApp"; + private static final String INSTALL_APP = "http://%s/engine/installApp"; + private static final String ACTIVE_APP = "http://%s/engine/activeApp"; + private static final String TERMINATE_APP = "http://%s/engine/terminateApp"; + private static final String ALL_SCREEN_SHOT_URL = "http://%s/engine/uploadShotAllScreen"; + private static final String START_RECORD_URL = "http://%s/engine/startRecord"; + private static final String END_RECORD_URL = "http://%s/engine/endRecord"; + + public static boolean isAppInstalled(String remoteAddress, String deviceId, String appPackage) { + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(deviceId); + info.setAppPackage(appPackage); + HttpEntity entity = new HttpEntity<>(info); + try { + return HttpUtils.doPost(String.format(IS_APP_INSTALLED, remoteAddress), entity, Boolean.class); + } catch (Exception e) { + logger.error("设备【{}】查询app是否安装出错", deviceId, e); + try { + Thread.sleep(1000); + } catch (InterruptedException interruptedException) { + logger.warn("设备【{}】判断是否安装app前停止。。。。。。。。。。", deviceId); + throw new ExecuteException("执行停止"); + } + return HttpUtils.doPost(String.format(IS_APP_INSTALLED, remoteAddress), entity, Boolean.class); + } + } + + public static boolean removeApp(String remoteAddress, String deviceId, String appPackage) { + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(deviceId); + info.setAppPackage(appPackage); + HttpEntity entity = new HttpEntity<>(info); + try { + return HttpUtils.doPost(String.format(REMOVE_APP, remoteAddress), entity, Boolean.class); + } catch (Exception e) { + logger.error("卸载应用出错", e); + throw new ExecuteException("卸载设备上App出错"); + } + } + + public static boolean installApp(String remoteAddress, String deviceId, String appPath,String platform) { + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(deviceId); + info.setAppPath(appPath); + info.setPlatform(platform); + logger.debug("ios install info:{}",JSONObject.toJSONString(info)); + HttpEntity entity = new HttpEntity<>(info); + Boolean isOk = HttpUtils.doInstall(String.format(INSTALL_APP, remoteAddress), entity); + if (!isOk) { + logger.warn("设备【{}】安装应用失败。。。。", deviceId); + throw new ExecuteException("安装App出错"); + } + return true; + } + + public static boolean activeApp(String uuid, String appPackage, String remoteAddress) { + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(uuid); + info.setAppPackage(appPackage); + info.setPlatform("1"); + HttpEntity entity = new HttpEntity<>(info); + Boolean isOk = false; + try { + isOk = HttpUtils.doPost(String.format(ACTIVE_APP, remoteAddress), entity, Boolean.class); + } catch (Exception e) { + logger.error("设备【{}】启动应用失败", uuid,e); + try { + Thread.sleep(1000); + } catch (InterruptedException interruptedException) { + logger.warn("设备【{}】关闭app前停止。。。。。。。。。。", uuid); + throw new ExecuteException("执行停止"); + } + isOk = HttpUtils.doPost(String.format(ACTIVE_APP, remoteAddress), entity, Boolean.class); + } + logger.debug("启动应用结果:{}", isOk); + if (!isOk) { + throw new ExecuteException("启动应用失败"); + } + return true; + } + + public static boolean terminateApp(String uuid, String appPackage, String remoteAddress) { + Boolean isOk = false; + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(uuid); + info.setAppPackage(appPackage); + HttpEntity entity = new HttpEntity<>(info); + try { + isOk = HttpUtils.doPost(String.format(TERMINATE_APP, remoteAddress), entity, Boolean.class); + } catch (Exception e) { + logger.error("设备【{}】关闭应用失败,重试一次", uuid,e); + try { + Thread.sleep(1000); + } catch (InterruptedException interruptedException) { + logger.warn("设备【{}】关闭app前停止。。。。。。。。。。", uuid); + throw new ExecuteException("执行停止"); + } + isOk = HttpUtils.doPost(String.format(TERMINATE_APP, remoteAddress), entity, Boolean.class); + } + logger.debug("关闭应用结果:{}", isOk); + if (!isOk) { +// throw new ExecuteException("关闭应用失败"); + } + return true; + } + + + public static String startRecord(String remoteAddress, String deviceId, String taskId, String tenantId,String resolution) { + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setDeviceId(deviceId); + info.setPlatform("1"); + info.setTenantId(tenantId); + logger.info("移动任务开启录屏,任务id:{}, tenantId:{}", taskId, tenantId); + info.setTaskId(taskId); + info.setResolution(resolution); + logger.info("录屏参数:{}", JSON.toJSONString(info)); + HttpEntity entity = new HttpEntity<>(info); + String result = null; + try { + result = HttpUtils.doPost(String.format(START_RECORD_URL, remoteAddress), entity, String.class); + } catch (Exception e) { + logger.error("开启录屏失败", e); + } + return result; + } + + public static String stopRecord(String remoteAddress, String deviceId, Map initData) { + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + Boolean save = (Boolean) initData.get("save"); + info.setDeviceId(deviceId); + info.setPlatform("1"); + logger.info("移动任务结束录屏,任务id:" + initData.get("taskId")); + info.setTaskId(initData.get("taskId").toString()); + info.setTenantId(initData.get("tenantId").toString()); + info.setSave(save); + logger.info("结束录屏参数:{}", JSON.toJSONString(info)); + HttpEntity entity = new HttpEntity<>(info); + String result = null; + try { + result = HttpUtils.doPost(String.format(END_RECORD_URL, remoteAddress), entity, String.class); + } catch (Exception e) { + logger.error("结束录屏失败", e); + } + return result; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/JsonUtils.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/JsonUtils.java new file mode 100644 index 0000000..65e6dbd --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/JsonUtils.java @@ -0,0 +1,89 @@ +package net.northking.cctp.se.util; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Map; + + +public class JsonUtils { + private final static Logger logger = LoggerFactory.getLogger(JsonUtils.class); + private static ObjectMapper objectMapper = new ObjectMapper(); + private static final MapTypeReference MAP_TYPE = new MapTypeReference(); + private static final ListTypeReference LIST_TYPE = new ListTypeReference(); + static { + objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT); + objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); + } + + public static String toJson(T obj){ + String ret = null; + if (null != obj){ + try{ + ret = objectMapper.writeValueAsString(obj); + }catch (Exception e){ + logger.error("Error when parse obj to Json",e); + } + } + return ret; + } + public static Map readMap(String jsonString,Class valTypeClazz){ + Map obj = null; + if (!StringUtils.isEmpty(jsonString)){ + try{ + obj = (Map)objectMapper.readValue(jsonString,MAP_TYPE); + }catch (Exception e){ + logger.error("Error when parse map from jsonString",e); + } + } + return obj; + } + public static List readList(String jsonString,Class clazz){ + List obj = null; + if (!StringUtils.isEmpty(jsonString)){ + try{ + obj = (List) objectMapper.readValue(jsonString,LIST_TYPE); + }catch (Exception e){ + logger.error("Error when parse list from jsonString",e); + } + } + return obj; + } + public static T fromJsonString(String jsonString, TypeReference valTypeRef){ + T obj = null; + if (!StringUtils.isEmpty(jsonString) && null != valTypeRef){ + try{ + obj = objectMapper.readValue(jsonString,valTypeRef); + + }catch (Exception e){ + logger.error("Error when parse obj from jsonString",e); + } + } + return obj; + } + public static T fromJsonString(String jsonString,Class clazz){ + T obj = null; + if (!StringUtils.isEmpty(jsonString) && null !=clazz ){ + try{ + obj = objectMapper.readValue(jsonString,clazz); + }catch (Exception e){ + logger.error("Error when parse obj from jsonString",e); + } + } + return obj; + } + private static class ListTypeReference extends TypeReference> { + private ListTypeReference() { + } + } + + private static class MapTypeReference extends TypeReference> { + private MapTypeReference() { + } + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/MobileUtil.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/MobileUtil.java new file mode 100644 index 0000000..85ed487 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/MobileUtil.java @@ -0,0 +1,40 @@ +package net.northking.cctp.se.util; + +import com.alibaba.fastjson.JSON; +import net.northking.cctp.se.device.bean.DebuggerDeviceInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpEntity; + +import java.util.Map; + +public class MobileUtil { + + private final static Logger logger = LoggerFactory.getLogger(MobileUtil.class); + + private static final String SCREEN_SHOT_URL = "http://%s/engine/getScreenShot"; + + public static String snapshot(String remoteAddress, String platform, Map initData) { + DebuggerDeviceInfo info = new DebuggerDeviceInfo(); + info.setPlatform(platform); + info.setDeviceId((String) initData.get("deviceId")); + info.setLength((Integer) initData.get("width")); //长 + info.setWidth((Integer) initData.get("height")); //宽 + info.setResolution((String) initData.get("resolution")); + info.setX((Integer) initData.get("x")); + info.setY((Integer) initData.get("y")); + info.setScreenLength((Integer) initData.get("screenWidth")); //长 + info.setScreenWidth((Integer) initData.get("screenHeight")); //宽 + info.setUserToken((String) initData.get("token")); //用户FeignCctpConfigtoken + info.setTaskId(initData.containsKey("taskId") && initData.get("taskId") != null ? initData.get("taskId").toString() : null); //任务Id + logger.info("参数:{}", JSON.toJSONString(info)); + HttpEntity entity = new HttpEntity<>(info); + String result = null; + try { + result = HttpUtils.doPost(String.format(SCREEN_SHOT_URL, remoteAddress), entity, String.class); + } catch (Exception e) { + logger.error("截图失败",e); + } + return result; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/PointMessage.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/PointMessage.java new file mode 100644 index 0000000..4d7fe7a --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/PointMessage.java @@ -0,0 +1,41 @@ +package net.northking.cctp.se.util; + + +public class PointMessage { + private int x; + private int y; + private int width; + private int height; + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/RegexUtils.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/RegexUtils.java new file mode 100644 index 0000000..f0b26a2 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/RegexUtils.java @@ -0,0 +1,96 @@ +package net.northking.cctp.se.util; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Slf4j +public class RegexUtils { + private final static String GLOBAL_VAR_REGEX = "#\\{([^}]*)\\}"; + private final static String SCRIPT_VAR_REGEX = "\\$\\{([^}]*)\\}"; + private final static String FUZZY_VAR_REGEX = "%\\{([^}]*)}"; + private final static Pattern GLOBAL_VAR_PATTERN = Pattern.compile(GLOBAL_VAR_REGEX); + private final static Pattern SCRIPT_VAR_PATTERN = Pattern.compile(SCRIPT_VAR_REGEX); + private final static Pattern FUZZY_VAR_PATTERN = Pattern.compile(FUZZY_VAR_REGEX); + + private RegexUtils(){} + + public static boolean containGlobalVar(String str){ + return GLOBAL_VAR_PATTERN.matcher(str).find(); + } + public static Set extractGlobalVar(String str){ + Set ret = new HashSet<>(); + Matcher matcher = GLOBAL_VAR_PATTERN.matcher(str); + while(matcher.find()){ + String group = matcher.group(); + String var = group.substring(2,group.length()-1); + ret.add(var); + log.debug("find global var expr,expr:{},var:{}",group,var); + } + return ret; + } + public static boolean containScriptVar(String str){ + return SCRIPT_VAR_PATTERN.matcher(str).find(); + } + public static Set extractScriptVar(String str){ + Set ret = new HashSet<>(); + Matcher matcher = SCRIPT_VAR_PATTERN.matcher(str); + while(matcher.find()){ + String group = matcher.group(); + String var = group.substring(2,group.length()-1); + ret.add(var); + log.debug("find script var expr,expr:{},var:{}",group,var); + } + return ret; + } + public static boolean containFuzzyVar(String str){ + return FUZZY_VAR_PATTERN.matcher(str).find(); + } + public static List extractFuzzyVar(String str){ + List ret = new ArrayList<>(); + Matcher matcher = FUZZY_VAR_PATTERN.matcher(str); + while(matcher.find()){ + String group = matcher.group(); + String var = group.substring(2,group.length()-1); + ret.add(var); + log.debug("find fuzzy var expr,expr:{},var:{}",group,var); + } + return ret; + } + + public static String replace(String expression, String varName, String value, VarType varType) { + if (StringUtils.isBlank(expression) || StringUtils.isBlank(varName) || null == varType) { + return expression; + } + switch (varType) { + case GLOBAL: + if (containGlobalVar(expression)) { + String with = "#{" + varName + "}"; + expression = expression.replace(with, value); + } + break; + case SCRIPT: + if (containScriptVar(expression)) { + String with = "${" + varName + "}"; + expression = expression.replace(with, value); + } + break; + case FUZZY: + if (containFuzzyVar(expression)) { + String with = "%\\{" + varName + "}"; + expression = expression.replaceFirst(with, value); + } + break; + } + return expression; + } + + public enum VarType { + GLOBAL, SCRIPT, FUZZY + } + + +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/SpringUtils.java b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/SpringUtils.java new file mode 100644 index 0000000..db4e8d7 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/java/net/northking/cctp/se/util/SpringUtils.java @@ -0,0 +1,28 @@ +package net.northking.cctp.se.util; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class SpringUtils implements ApplicationContextAware { + private static ApplicationContext context; + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + context = applicationContext; + } + + public static ApplicationContext getContext(){ + return context; + } + + public static T getBean(Class clazz){ + return context.getBean(clazz); + } + + public static String getProperties(String key){ + String property = context.getEnvironment().getProperty(key); + return property; + } +} diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-devFront-linux.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-devFront-linux.yml new file mode 100644 index 0000000..b1a887a --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-devFront-linux.yml @@ -0,0 +1,103 @@ +spring: + rabbitmq: + addresses: 158.1.12.238:5672 + virtual-host: cloud + username: cctp + password: northking + redis: + cluster: + nodes: 158.1.81.42:16379,158.1.81.43:16380,158.1.83.161:16381,158.1.81.42:16382,158.1.81.43:16383,158.1.83.161:16384 + password: root + database: 1 + lettuce: + pool: + max-active: 5 + max-idle: 5 +atu: + server: + IsPcExecutor: false + engineName: 开发环境引擎 + engineSys: linux + daemonFlag: false + local-debug: false + engineVersion: 1.1.0 + serverUrl: http://158.1.12.236:8000 + appiumHost: 172.16.77.25 + appiumPort: 4723 + appiumContextPath: /wd/hub + deviceInfoPath: /api/cctp-device-mgr/pub/device/info/ + globalVarPath: /api/atu-script-case/pub/variable/query + globalVarUpdatePath: /api/atu-script-case/pub/variable/update + fileDownloadPath: /api/cctp-files/pub/download/ + fileUploadPath: /api/cctp-files/pub/upload + engineRegister: /api/cctp-device-mgr/pub/engine/register + deviceReleasePath: /api/cctp-device-mgr/pub/device/release/ + appDownloadUrl: /api/atu-script-case/pub/file/downloadApp/{appId} + libListUrl: /api/cctp-platform/pub/library/getLibListByEngine + tryAcqurieDeviceUrl: /api/cctp-device-mgr/pub/deviceList/apply/remote + pcAcqurieDeviceUrl: /api/cctp-device-mgr/pub/pc/device/remote + taskCancelResultUrl: /api/atu-execute-plan/pub/execPlan/updateTaskExecFile + appInfoUrl: /api/atu-script-case/pub/apps/getAppDetail + ruleDataByName: /api/atu-data-mgr/pub/dataRule/getRuleDataByName + quoteDataUrl: /api/atu-data-mgr/pub/query/selectDataUrlAndTreeName + releaseDeviceBatch: /api/cctp-device-mgr/pub/deviceList/release + projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} + testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl + busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName + engine: + executor-pool: + pcSize: 1 + pcCoreSize: 1 + enablePc: true + mobileSize: 10 + mobileCoreSize: 10 + enableMobile: true + apiSize: 15 + apiCoreSize: 15 + enableApi: true + scheduler: + daemon: + enabled: true + heartbeat: + enabled: true + login: + enabled: true + mobileAutomation: + type: jbf +nk: + component: + mobile: + useNewOcr: true + uploadScreenAddress: engine/uploadShotAllScreen + getWindowsScale: engine/getWindowsScale #获取屏幕缩放比 + shotAllScreenAddress: engine/shotAllScreen + handleApp: engine/activeApp + execShellAddress: engine/execShell + findPicAddress: http://158.1.20.76:5000/WebAPI/findImageInImage #图片查找(新ocr) + #findPicAddress: http://197.68.31.137:5000/WebAPI/findImageInImage #图片查找(旧openai) + ocrAddress: http://158.1.18.34:5000/WebAPI/FindTextCoordinateByOcr #ocr地址 + #ocrGetCode: http://192.168.0.45:5000/WebAPI/VerificationCode #ocr识别验证码地址 + ocrGetText: http://158.1.20.76:5000/WebAPI/GetTextByOcr #ocr识别文字地址 + mobileShotAddress: engine/getScreenShotToBase64 #截图返回base64 + getCurrentMessage: engine/getCurrentMessage #获取当前手机最新短信验证 + ocrGetAllTextNum: http://158.1.20.76:5000/rpa_v2 #ocr识别所有字符的位置 + ocrGetKeyBoard: http://158.1.20.76:5000/keyboard_v2 #ocr安全键盘 + getSafeKeyBoardNum: http://158.1.20.76:5000/keyboard_v2 + ocrGetCode: http://158.1.20.76:5000/yzm_v2 #ocr识别验证码地址 + hzBankOcrAddress: http://197.68.24.38:9283/gateway/spring-ocrcloud-platform/OCRA0001 #杭州银行行内ocr nginx地址 + ocrGetTextDirectionText: http://158.1.20.76:5000/direction_v2 #ocr识别指定文字指定方向的数值内容 + matchingThreshold: 0.5 #图像识别阈值 + ocrGetTableColValue: http://158.1.20.76:5000/table_v2 #ocr获取表格列内容 + ocrGetMoneyValue: http://158.1.20.76:5000/rpa_amount_v2 #ocr获取金额 + ocrGetClickTextDirectionText: http://158.1.20.76:5000/find_v2 #ocr指定文字指定方向指定第几个指定内容文本 + searchFrequency: 2 #元素查找次数 + findTime: 2 #xpath每次查找时间,秒 + scriptWaitTime: 100 #脚本步骤执行后等待时间,毫秒 + planWaitTime: 100 #计划步骤执行后等待时间,毫秒 + database: + execSqlAddress: /api/cctp-projects/pub/CpProjectEnvDss/execute #数据库组建执行SQL的请求地址 + pc: + tryTime: 3 +logging: + level: + net.northking: debug diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-devFront-uos.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-devFront-uos.yml new file mode 100644 index 0000000..3331455 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-devFront-uos.yml @@ -0,0 +1,88 @@ +spring: + rabbitmq: + addresses: 197.68.24.40:5672 + virtual-host: cloud + username: cctp + password: northking + redis: + cluster: + nodes: 158.1.81.42:16479,158.1.81.43:16480,158.1.83.161:16481,158.1.81.42:16482,158.1.81.43:16483,158.1.83.161:16484 + password: root + database: 0 + lettuce: + pool: + max-active: 5 + max-idle: 5 +atu: + server: + IsPcExecutor: true + engineName: 测试环境测试引擎 + engineSys: linux + remoteProtocol: vnc + remotePort: 5900 + daemonFlag: false + engineVersion: 1.1.0 + serverUrl: http://197.68.24.38:8000 + appiumHost: 172.16.77.25 + appiumPort: 4723 + appiumContextPath: /wd/hub + deviceInfoPath: /api/cctp-device-mgr/pub/device/info/ + globalVarPath: /api/atu-script-case/pub/variable/query + globalVarUpdatePath: /api/atu-script-case/pub/variable/update + fileDownloadPath: /api/cctp-files/pub/download/ + fileUploadPath: /api/cctp-files/pub/upload + engineRegister: /api/cctp-device-mgr/pub/engine/register + deviceReleasePath: /api/cctp-device-mgr/pub/device/release/ + appDownloadUrl: /api/atu-script-case/pub/file/downloadApp/{appId} + libListUrl: /api/cctp-platform/pub/library/getLibListByEngine + tryAcqurieDeviceUrl: /api/cctp-device-mgr/pub/deviceList/apply/remote + pcAcqurieDeviceUrl: /api/cctp-device-mgr/pub/pc/device/remote + taskCancelResultUrl: /api/atu-execute-plan/pub/execPlan/updateTaskExecFile + appInfoUrl: /api/atu-script-case/pub/apps/getAppDetail + ruleDataByName: /api/atu-data-mgr/pub/dataRule/getRuleDataByName + releaseDeviceBatch: /api/cctp-device-mgr/pub/deviceList/release + projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} + testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl + busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName + engine: + executor-pool: + pcSize: 1 + enablePc: true + mobileSize: 25 + enableMobile: false + apiSize: 15 + enableApi: true + mobileAutomation: + type: jbf +nk: + component: + mobile: + useNewOcr: true + uploadScreenAddress: engine/uploadShotAllScreen + shotAllScreenAddress: engine/shotAllScreen + handleApp: engine/activeApp + execShellAddress: engine/execShell + findPicAddress: http://197.68.31.137:5000/WebAPI/findImageInImage #图片查找 + ocrAddress: http://197.68.31.137:5000/WebAPI/FindTextCoordinateByOcr #ocr地址 + #ocrGetCode: http://197.68.31.137:5000/WebAPI/VerificationCode #ocr识别验证码地址 + ocrGetText: http://197.68.31.137:5000/WebAPI/GetTextByOcr #ocr识别文字地址 + mobileShotAddress: engine/getScreenShotToBase64 #截图返回base64 + getCurrentMessage: engine/getCurrentMessage #获取当前手机最新短信验证码 + getWindowsScale: engine/getWindowsScale #获取屏幕缩放比 + ocrGetAllTextNum: http://197.68.24.38:5000/rpa_v2 #ocr识别所有字符的位置 + ocrGetKeyBoard: http://197.68.24.38:5000/keyboard_v2 #ocr安全键盘 + getSafeKeyBoardNum: http://197.68.24.38:5000/keyboard_v2 + ocrGetCode: http://197.68.24.38:5000/yzm_v2 #ocr识别验证码地址 + hzBankOcrAddress: http://197.68.24.38:9283/gateway/spring-orccloud-platform/OCRA0001 #杭州银行ocr请求ngnix地址 + mtchingThreshold: 0.5 #图像识别阈值 + ocrGetTableColValue: http://197.68.24.38:5000/table_v2 #ocr获取表哥列内容 + ocrGetMoneyValue: http://197.68.24.38:5000/rpa_amount_v2 #ocr获取金额 + ocrGetClickTextDirectionText: http://158.1.20.76:5000/find_v2 #ocr指定文字指定方向指定第几个指定内容文本 + earchFrequency: 2 #元素查找次数 + database: + execSqlAddress: /api/cctp-projects/pub/CpProjectEnvDss/execute #数据库组建执行SQL的请求地址 + pc: + tryTime: 3 #重试次数 +logging: + level: + net.northking: debug diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-devFront-win.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-devFront-win.yml new file mode 100644 index 0000000..d922974 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-devFront-win.yml @@ -0,0 +1,93 @@ +spring: + rabbitmq: + host: 158.1.12.238 + port: 5672 + virtual-host: cloud + username: cctp + password: northking + redis: + cluster: + nodes: 158.1.81.42:16379,158.1.81.43:16380,158.1.83.161:16381,158.1.81.42:16382,158.1.81.43:16383,158.1.83.161:16384 + password: root + database: 1 + lettuce: + pool: + max-active: 5 + max-idle: 5 +atu: + server: + engineName: 开发环境测试引擎 + IsPcExecutor: true + engineSys: windows + daemonFlag: true + remoteProtocol: RDP + remotePort: 3389 + engineVersion: 1.1.0 + serverUrl: http://158.1.12.236:8000 + appiumHost: 172.16.77.25 + appiumPort: 4723 + appiumContextPath: /wd/hub + deviceInfoPath: /api/cctp-device-mgr/pub/device/info/ + globalVarPath: /api/atu-script-case/pub/variable/query + globalVarUpdatePath: /api/atu-script-case/pub/variable/update + fileDownloadPath: /api/cctp-files/pub/download/ + fileUploadPath: /api/cctp-files/pub/upload + engineRegister: /api/cctp-device-mgr/pub/engine/register + deviceReleasePath: /api/cctp-device-mgr/pub/device/release/ + appDownloadUrl: /api/atu-script-case/pub/file/downloadApp/{appId} + libListUrl: /api/cctp-platform/pub/library/getLibListByEngine + tryAcqurieDeviceUrl: /api/cctp-device-mgr/pub/deviceList/apply/remote + pcAcqurieDeviceUrl: /api/cctp-device-mgr/pub/pc/device/remote + taskCancelResultUrl: /api/atu-execute-plan/pub/execPlan/updateTaskExecFile + appInfoUrl: /api/atu-script-case/pub/apps/getAppDetail + ruleDataByName: /api/atu-data-mgr/pub/dataRule/getRuleDataByName + releaseDeviceBatch: /api/cctp-device-mgr/pub/deviceList/release + projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} + testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl + busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName + engine: + executor-pool: + pcSize: 1 + pcCoreSize: 1 + enablePc: true + mobileSize: 25 + mobileCoreSize: 25 + enableMobile: false + apiSize: 15 + apiCoreSize: 15 + enableApi: true + mobileAutomation: + type: jbf +nk: + component: + mobile: + useNewOcr: true + shotAllScreenAddress: engine/shotAllScreen + uploadScreenAddress: engine/uploadShotAllScreen + handleApp: engine/activeApp + execShellAddress: engine/execShell + findPicAddress: http://158.1.18.34:5000/WebAPI/findImageInImage #图片查找 + ocrAddress: http://158.1.18.34:5000/WebAPI/FindTextCoordinateByOcr #ocr地址 + #ocrGetCode: http://158.1.18.34:5000/WebAPI/VerificationCode #ocr识别验证码地址 + ocrGetCode: http://158.58.160.183:8000/yzm_v2 #ocr识别验证码地址 + ocrGetText: http://158.1.18.34:5000/WebAPI/GetTextByOcr #ocr识别文字地址 + mobileShotAddress: engine/getScreenShotToBase64 #截图返回base64 + getCurrentMessage: engine/getCurrentMessage #获取当前手机最新短信验证码 + getWindowsScale: engine/getWindowsScale #获取手机屏幕 + ocrGetAllTextNum: http://158.58.160.183:8000/rpa_v2 + ocrGetKeyBoard: http://158.58.160.183:8000/keyboard_v2 + getSafeKeyBoardNum: http://158.58.160.183:8000/keyboard_v2 + hzBankOcrAddress: http://197.68.24.38:9283/gateway/spring-ocrcloud-platform/OCRA0001 #杭州银行OCR请求nginx地址 + ocrGetTextDirectionText: http://158.58.160.183:8000/direction_v2 #ocr识别指定文字指定方向的数值内容 + matchingThreshold: 0.5 #图像识别阈值 + ocrGetTableColValue: http://158.58.160.183:8000/table_v2 #ocr获取表格列内容 + ocrGetMoneyValue: http://158.58.160.183:8000/rpa_amount_v2 #ocr获取金额 + scriptWaitTime: 100 #脚本步骤执行后等待时间,毫秒 + planWaitTime: 400 #计划步骤执行后等待时间,毫秒 + database: + execSqlAddress: /api/cctp-projects/pub/CpProjectEnvDss/execute #数据库组建执行SQL的请求地址 + pc: + tryTime: 3 #重试次数 +logging: + level: + net.northking: debug \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-prod-linux.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-prod-linux.yml new file mode 100644 index 0000000..14e5a28 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-prod-linux.yml @@ -0,0 +1,101 @@ +spring: + rabbitmq: + addresses: 197.68.31.194:5672,197.68.31.195:5672,197.68.31.196:5672 + virtual-host: cloud + username: cctp + password: northking + redis: + cluster: + nodes: 197.68.31.191:16379,197.68.31.192:16380,197.68.31.193:16381,197.68.31.191:16382,197.68.31.192:16383,197.68.31.193:16384 + password: root + database: 1 + lettuce: + pool: + max-active: 5 + max-idle: 5 +atu: + server: + IsPcExecutor: false + engineName: 生产环境引擎 + engineSys: linux + daemonFlag: false + local-debug: false + engineVersion: 1.1.0 + serverUrl: http://197.68.31.184:8000 + appiumHost: 172.16.77.25 + appiumPort: 4723 + appiumContextPath: /wd/hub + deviceInfoPath: /api/cctp-device-mgr/pub/device/info/ + globalVarPath: /api/atu-script-case/pub/variable/query + globalVarUpdatePath: /api/atu-script-case/pub/variable/update + fileDownloadPath: /api/cctp-files/pub/download/ + fileUploadPath: /api/cctp-files/pub/upload + engineRegister: /api/cctp-device-mgr/pub/engine/register + deviceReleasePath: /api/cctp-device-mgr/pub/device/release/ + appDownloadUrl: /api/atu-script-case/pub/file/downloadApp/{appId} + libListUrl: /api/cctp-platform/pub/library/getLibListByEngine + tryAcqurieDeviceUrl: /api/cctp-device-mgr/pub/deviceList/apply/remote + pcAcqurieDeviceUrl: /api/cctp-device-mgr/pub/pc/device/remote + taskCancelResultUrl: /api/atu-execute-plan/pub/execPlan/updateTaskExecFile + appInfoUrl: /api/atu-script-case/pub/apps/getAppDetail + ruleDataByName: /api/atu-data-mgr/pub/dataRule/getRuleDataByName + quoteDataUrl: /api/atu-data-mgr/pub/query/selectDataUrlAndTreeName + releaseDeviceBatch: /api/cctp-device-mgr/pub/deviceList/release + projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} + testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl + busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName + engine: + executor-pool: + pcSize: 1 + pcCoreSize: 1 + enablePc: false + mobileSize: 25 + mobileCoreSize: 25 + enableMobile: true + apiSize: 15 + apiCoreSize: 15 + enableApi: true + scheduler: + daemon: + enabled: true + heartbeat: + enabled: true + login: + enabled: true + mobileAutomation: + type: jbf +nk: + component: + mobile: + useNewOcr: true + uploadScreenAddress: engine/uploadShotAllScreen + getWindowsScale: engine/getWindowsScale #获取屏幕缩放比 + shotAllScreenAddress: engine/shotAllScreen + handleApp: engine/activeApp + execShellAddress: engine/execShell + findPicAddress: http://197.68.31.184:5000/WebAPI/findImageInImage #图片查找 + ocrAddress: http://197.68.31.209:5000/WebAPI/FindTextCoordinateByOcr #ocr地址 + #ocrGetCode: http://197.68.31.209:5000/WebAPI/VerificationCode #ocr识别验证码地址 + ocrGetText: http://197.68.31.184:5000/WebAPI/GetTextByOcr #ocr识别文字地址 + mobileShotAddress: engine/getScreenShotToBase64 #截图返回base64 + getCurrentMessage: engine/getCurrentMessage #获取当前手机最新短信验证 + ocrGetAllTextNum: http://197.68.31.184:5000/rpa_v2 #ocr识别所有字符的位置 + ocrGetKeyBoard: http://197.68.31.184:5000/keyboard_v2 #ocr安全键盘 + getSafeKeyBoardNum: http://197.68.31.184:5000/keyboard_v2 + ocrGetCode: http://197.68.31.184:5000/yzm_v2 #ocr识别验证码地址 + hzBankOcrAddress: http://197.68.31.184:9283/gateway/spring-ocrcloud-platform/OCRA0001 #杭州银行OCR请求nginx地址 + ocrGetTextDirectionText: http://197.68.31.184:5000/direction_v2 #ocr识别指定文字指定方向的内容 + matchingThreshold: 0.5 #图像识别阈值 + ocrGetTableColValue: http://197.68.31.184:5000/table_v2 #ocr获取表格列内容 + ocrGetMoneyValue: http://197.68.31.184:5000/rpa_amount_v2 #ocr获取金额 + ocrGetClickTextDirectionText: http://197.68.31.184:5000/find_v2 #ocr指定文字指定方向指定第几个指定内容文本 + searchFrequency: 2 #元素查找次数 + findTime: 3 #xpath每次查找时间,秒 + pc: + tryTime: 3 #重试次数 + database: + execSqlAddress: /api/cctp-projects/pub/CpProjectEnvDss/execute #数据库组建执行SQL的请求地址 +logging: + level: + net.northking: debug + diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-prod-uos.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-prod-uos.yml new file mode 100644 index 0000000..a914d83 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-prod-uos.yml @@ -0,0 +1,88 @@ +spring: + rabbitmq: + addresses: 197.68.24.40:5672 + virtual-host: cloud + username: cctp + password: northking + redis: + cluster: + nodes: 158.1.81.42:16479,158.1.81.43:16480,158.1.83.161:16481,158.1.81.42:16482,158.1.81.43:16483,158.1.83.161:16484 + password: root + database: 0 + lettuce: + pool: + max-active: 5 + max-idle: 5 +atu: + server: + IsPcExecutor: true + engineName: 生产环境引擎 + engineSys: linux + remoteProtocol: vnc + remotePort: 5900 + daemonFlag: false + engineVersion: 1.1.0 + serverUrl: http://197.68.24.38:8000 + appiumHost: 172.16.77.25 + appiumPort: 4723 + appiumContextPath: /wd/hub + deviceInfoPath: /api/cctp-device-mgr/pub/device/info/ + globalVarPath: /api/atu-script-case/pub/variable/query + globalVarUpdatePath: /api/atu-script-case/pub/variable/update + fileDownloadPath: /api/cctp-files/pub/download/ + fileUploadPath: /api/cctp-files/pub/upload + engineRegister: /api/cctp-device-mgr/pub/engine/register + deviceReleasePath: /api/cctp-device-mgr/pub/device/release/ + appDownloadUrl: /api/atu-script-case/pub/file/downloadApp/{appId} + libListUrl: /api/cctp-platform/pub/library/getLibListByEngine + tryAcqurieDeviceUrl: /api/cctp-device-mgr/pub/deviceList/apply/remote + pcAcqurieDeviceUrl: /api/cctp-device-mgr/pub/pc/device/remote + taskCancelResultUrl: /api/atu-execute-plan/pub/execPlan/updateTaskExecFile + appInfoUrl: /api/atu-script-case/pub/apps/getAppDetail + ruleDataByName: /api/atu-data-mgr/pub/dataRule/getRuleDataByName + releaseDeviceBatch: /api/cctp-device-mgr/pub/deviceList/release + projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} + testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl + busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName + engine: + executor-pool: + pcSize: 1 + enablePc: true + mobileSize: 25 + enableMobile: false + apiSize: 15 + enableApi: true + mobileAutomation: + type: jbf +nk: + component: + mobile: + useNewOcr: true + uploadScreenAddress: engine/uploadShotAllScreen + shotAllScreenAddress: engine/shotAllScreen + handleApp: engine/activeApp + execShellAddress: engine/execShell + findPicAddress: http://197.68.31.137:5000/WebAPI/findImageInImage #图片查找 + ocrAddress: http://197.68.31.137:5000/WebAPI/FindTextCoordinateByOcr #ocr地址 + #ocrGetCode: http://197.68.31.137:5000/WebAPI/VerificationCode #ocr识别验证码地址 + ocrGetText: http://197.68.31.137:5000/WebAPI/GetTextByOcr #ocr识别文字地址 + mobileShotAddress: engine/getScreenShotToBase64 #截图返回base64 + getCurrentMessage: engine/getCurrentMessage #获取当前手机最新短信验证码 + getWindowsScale: engine/getWindowsScale #获取屏幕缩放比 + ocrGetAllTextNum: http://197.68.24.38:5000/rpa_v2 #ocr识别所有字符的位置 + ocrGetKeyBoard: http://197.68.24.38:5000/keyboard_v2 #ocr安全键盘 + getSafeKeyBoardNum: http://197.68.24.38:5000/keyboard_v2 + ocrGetCode: http://197.68.24.38:5000/yzm_v2 #ocr识别验证码地址 + hzBankOcrAddress: http://197.68.24.38:9283/gateway/spring-orccloud-platform/OCRA0001 #杭州银行ocr请求ngnix地址 + mtchingThreshold: 0.5 #图像识别阈值 + ocrGetTableColValue: http://197.68.24.38:5000/table_v2 #ocr获取表哥列内容 + ocrGetMoneyValue: http://197.68.24.38:5000/rpa_amount_v2 #ocr获取金额 + ocrGetClickTextDirectionText: http://158.1.20.76:5000/find_v2 #ocr指定文字指定方向指定第几个指定内容文本 + earchFrequency: 2 #元素查找次数 + database: + execSqlAddress: /api/cctp-projects/pub/CpProjectEnvDss/execute #数据库组建执行SQL的请求地址 + pc: + tryTime: 3 #重试次数 +logging: + level: + net.northking: debug diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-prod-win.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-prod-win.yml new file mode 100644 index 0000000..2a72e43 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-prod-win.yml @@ -0,0 +1,93 @@ +spring: + rabbitmq: + addresses: 197.68.31.194:5672,197.68.31.195:5672,197.68.31.196:5672 + virtual-host: cloud + username: cctp + password: northking + redis: + cluster: + nodes: 197.68.31.191:16379,197.68.31.192:16380,197.68.31.193:16381,197.68.31.191:16382,197.68.31.192:16383,197.68.31.193:16384 + password: root + database: 1 + lettuce: + pool: + max-active: 5 + max-idle: 5 +atu: + server: + IsPcExecutor: true + engineName: 生产环境测试引擎 + engineSys: windows + daemonFlag: true + remoteProtocol: DRP + remotePort: 3389 + engineVersion: 1.1.0 + serverUrl: http://197.68.31.184:8000/ + appiumHost: 158.58.160.160 + appiumPort: 4723 + appiumContextPath: /wd/hub + deviceInfoPath: /api/cctp-device-mgr/pub/device/info/ + globalVarPath: /api/atu-script-case/pub/variable/query + globalVarUpdatePath: /api/atu-script-case/pub/variable/update + fileDownloadPath: /api/cctp-files/pub/download/ + fileUploadPath: /api/cctp-files/pub/upload + engineRegister: /api/cctp-device-mgr/pub/engine/register + deviceReleasePath: /api/cctp-device-mgr/pub/device/release/ + appDownloadUrl: /api/atu-script-case/pub/file/downloadApp/{appId} + libListUrl: /api/cctp-platform/pub/library/getLibListByEngine + tryAcqurieDeviceUrl: /api/cctp-device-mgr/pub/deviceList/apply/remote + pcAcqurieDeviceUrl: /api/cctp-device-mgr/pub/pc/device/remote + taskCancelResultUrl: /api/atu-execute-plan/pub/execPlan/updateTaskExecFile + appInfoUrl: /api/atu-script-case/pub/apps/getAppDetail + ruleDataByName: /api/atu-data-mgr/pub/dataRule/getRuleDataByName + quoteDataUrl: /api/atu-data-mgr/pub/query/selectDataUrlAndTreeName + releaseDeviceBatch: /api/cctp-device-mgr/pub/deviceList/release + projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} + testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl + busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName + engine: + executor-pool: + pcSize: 1 + pcCoreSize: 1 + enablePc: true + mobileSize: 25 + mobileCoreSize: 25 + enableMobile: false + apiSize: 15 + apiCoreSize: 15 + enableApi: true + mobileAutomation: + type: appium +nk: + component: + mobile: + useNewOcr: true + shotAllScreenAddress: engine/shotAllScreen + uploadScreenAddress: engine/uploadShotAllScreen + handleApp: engine/activeApp + execShellAddress: engine/execShell + findPicAddress: http://197.68.31.184:5000/WebAPI/findImageInImage #图片查找 + ocrAddress: http://197.68.31.201:5000/WebAPI/FindTextCoordinateByOcr #ocr地址 + ocrGetText: http://197.68.31.201:5000/WebAPI/GetTextByOcr #ocr识别文字地址 + mobileShotAddress: engine/getScreenShotToBase64 #截图返回base64 + getCurrentMessage: engine/getCurrentMessage #获取当前手机最新短信验证码 + getWindowsScale: engine/getWindowsScale #获取屏幕缩放比 + ocrGetAllTextNum: http://197.68.31.184:5000/rpa_v2 #ocr识别所有字符的位置 + ocrGetKeyBoard: http://197.68.31.184:5000/keyboard_v2 #ocr安全键盘 + getSafeKeyBoardNum: http://197.68.31.184:5000/keyboard_v2 + ocrGetCode: http://197.68.31.184:5000/yzm_v2 #ocr识别验证码地址 + hzBankOcrAddress: http://197.68.31.184:9283/gateway/spring-ocrcloud-platform/OCRA0001 #杭州银行OCR请求nginx地址 + ocrGetTextDirectionText: http://197.68.31.184:5000/direction_v2 #ocr识别指定文字指定方向的内容 + matchingThreshold: 0.5 #图像识别阈值 + ocrGetTableColValue: http://197.68.31.184:5000/table_v2 #ocr获取表格列内容 + ocrGetMoneyValue: http://197.68.31.184:5000/rpa_amount_v2 #ocr获取金额 + ocrGetClickTextDirectionText: http://197.68.31.184:5000/find_v2 #ocr指定文字指定方向指定第几个指定内容文本 + searchFrequency: 2 #元素查找次数 + findTime: 3 #xpath每次查找时间,秒 + pc: + tryTime: 3 #重试次数 + database: + execSqlAddress: /api/cctp-projects/pub/CpProjectEnvDss/execute #数据库组建执行SQL的请求地址 +logging: + level: + net.northking: debug \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-test-linux.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-test-linux.yml new file mode 100644 index 0000000..0544803 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-test-linux.yml @@ -0,0 +1,104 @@ +spring: + rabbitmq: + addresses: 197.68.24.40:5672 + virtual-host: cloud + username: cctp + password: northking + redis: + cluster: + nodes: 158.1.81.42:16479,158.1.81.43:16480,158.1.83.161:16481,158.1.81.42:16482,158.1.81.43:16483,158.1.83.161:16484 + password: root + database: 0 + lettuce: + pool: + max-active: 5 + max-idle: 5 +atu: + server: + engineName: 测试环境引擎 + engineSys: linux + remoteProtocol: RDP + remotePort: 3389 + IsPcExecutor: false + daemonFlag: false + local-debug: false + engineVersion: 1.1.0 + serverUrl: http://197.68.24.38:8000 + appiumHost: 172.16.77.25 + appiumPort: 4723 + appiumContextPath: /wd/hub + deviceInfoPath: /api/cctp-device-mgr/pub/device/info/ + globalVarPath: /api/atu-script-case/pub/variable/query + globalVarUpdatePath: /api/atu-script-case/pub/variable/update + fileDownloadPath: /api/cctp-files/pub/download/ + fileUploadPath: /api/cctp-files/pub/upload + engineRegister: /api/cctp-device-mgr/pub/engine/register + deviceReleasePath: /api/cctp-device-mgr/pub/device/release/ + appDownloadUrl: /api/atu-script-case/pub/file/downloadApp/{appId} + libListUrl: /api/cctp-platform/pub/library/getLibListByEngine + tryAcqurieDeviceUrl: /api/cctp-device-mgr/pub/deviceList/apply/remote + pcAcqurieDeviceUrl: /api/cctp-device-mgr/pub/pc/device/remote + taskCancelResultUrl: /api/atu-execute-plan/pub/execPlan/updateTaskExecFile + appInfoUrl: /api/atu-script-case/pub/apps/getAppDetail + ruleDataByName: /api/atu-data-mgr/pub/dataRule/getRuleDataByName + quoteDataUrl: /api/atu-data-mgr/pub/query/selectDataUrlAndTreeName + releaseDeviceBatch: /api/cctp-device-mgr/pub/deviceList/release + projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} + testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl + busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName + engine: + executor-pool: + pcSize: 1 + pcCoreSize: 1 + enablePc: true + mobileSize: 10 + mobileCoreSize: 10 + enableMobile: true + apiSize: 15 + apiCoreSize: 15 + enableApi: true + scheduler: + daemon: + enabled: false + heartbeat: + enabled: true + login: + enabled: true + mobileAutomation: + type: jbf +nk: + component: + mobile: + useNewOcr: true + uploadScreenAddress: engine/uploadShotAllScreen + getWindowsScale: engine/getWindowsScale #获取屏幕缩放比 + shotAllScreenAddress: engine/shotAllScreen + handleApp: engine/activeApp + execShellAddress: engine/execShell + findPicAddress: http://197.68.24.38:5000/WebAPI/findImageInImage #图片查找 + ocrAddress: http://197.68.31.137:5000/WebAPI/FindTextCoordinateByOcr #ocr地址 + #ocrGetCode: http://197.68.31.137:5000/WebAPI/VerificationCode #ocr识别验证码地址 + ocrGetText: http://197.68.31.137:5000/WebAPI/GetTextByOcr #ocr识别文字地址 + ocrGetTextDirectionText: http://197.68.24.38:5000/direction_v2 #ocr识别指定文字指定方向的内容 + mobileShotAddress: engine/getScreenShotToBase64 #截图返回base64 + getCurrentMessage: engine/getCurrentMessage #获取当前手机最新短信验证 + ocrGetAllTextNum: http://197.68.24.38:5000/rpa_v2 #ocr识别所有字符的位置 + ocrGetKeyBoard: http://197.68.24.38:5000/keyboard_v2 #ocr安全键盘 + getSafeKeyBoardNum: http://197.68.24.38:5000/keyboard_v2 + ocrGetCode: http://197.68.24.38:5000/yzm_v2 #ocr识别验证码地址 + hzBankOcrAddress: http://197.68.24.38:9283/gateway/spring-ocrcloud-platform/OCRA0001 #杭州银行OCR请求nginx地址 + mtchingThreshold: 0.5 #图像识别阈值 + ocrGetTableColValue: http://197.68.24.38:5000/table_v2 #ocr获取表格列内容 + ocrGetMoneyValue: http://197.68.24.38:5000/rpa_amount_v2 #ocr获取金额 + ocrGetClickTextDirectionText: http://197.68.24.38:5000/find_v2 #ocr指定文字指定方向指定第几个指定内容文本 + searchFrequency: 2 #元素查找次数 + findTime: 2 #元素查找次数 + scriptWaitTime: 100 #脚本步骤执行后等待时间,毫秒 + planWaitTime: 400 #计划步骤执行后等待时间,毫秒 + database: + execSqlAddress: /api/cctp-projects/pub/CpProjectEnvDss/execute #数据库组建执行SQL的请求地址 + pc: + tryTime: 3 #重试次数 +logging: + level: + net.northking: debug \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-test-uos.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-test-uos.yml new file mode 100644 index 0000000..3331455 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-test-uos.yml @@ -0,0 +1,88 @@ +spring: + rabbitmq: + addresses: 197.68.24.40:5672 + virtual-host: cloud + username: cctp + password: northking + redis: + cluster: + nodes: 158.1.81.42:16479,158.1.81.43:16480,158.1.83.161:16481,158.1.81.42:16482,158.1.81.43:16483,158.1.83.161:16484 + password: root + database: 0 + lettuce: + pool: + max-active: 5 + max-idle: 5 +atu: + server: + IsPcExecutor: true + engineName: 测试环境测试引擎 + engineSys: linux + remoteProtocol: vnc + remotePort: 5900 + daemonFlag: false + engineVersion: 1.1.0 + serverUrl: http://197.68.24.38:8000 + appiumHost: 172.16.77.25 + appiumPort: 4723 + appiumContextPath: /wd/hub + deviceInfoPath: /api/cctp-device-mgr/pub/device/info/ + globalVarPath: /api/atu-script-case/pub/variable/query + globalVarUpdatePath: /api/atu-script-case/pub/variable/update + fileDownloadPath: /api/cctp-files/pub/download/ + fileUploadPath: /api/cctp-files/pub/upload + engineRegister: /api/cctp-device-mgr/pub/engine/register + deviceReleasePath: /api/cctp-device-mgr/pub/device/release/ + appDownloadUrl: /api/atu-script-case/pub/file/downloadApp/{appId} + libListUrl: /api/cctp-platform/pub/library/getLibListByEngine + tryAcqurieDeviceUrl: /api/cctp-device-mgr/pub/deviceList/apply/remote + pcAcqurieDeviceUrl: /api/cctp-device-mgr/pub/pc/device/remote + taskCancelResultUrl: /api/atu-execute-plan/pub/execPlan/updateTaskExecFile + appInfoUrl: /api/atu-script-case/pub/apps/getAppDetail + ruleDataByName: /api/atu-data-mgr/pub/dataRule/getRuleDataByName + releaseDeviceBatch: /api/cctp-device-mgr/pub/deviceList/release + projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} + testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl + busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName + engine: + executor-pool: + pcSize: 1 + enablePc: true + mobileSize: 25 + enableMobile: false + apiSize: 15 + enableApi: true + mobileAutomation: + type: jbf +nk: + component: + mobile: + useNewOcr: true + uploadScreenAddress: engine/uploadShotAllScreen + shotAllScreenAddress: engine/shotAllScreen + handleApp: engine/activeApp + execShellAddress: engine/execShell + findPicAddress: http://197.68.31.137:5000/WebAPI/findImageInImage #图片查找 + ocrAddress: http://197.68.31.137:5000/WebAPI/FindTextCoordinateByOcr #ocr地址 + #ocrGetCode: http://197.68.31.137:5000/WebAPI/VerificationCode #ocr识别验证码地址 + ocrGetText: http://197.68.31.137:5000/WebAPI/GetTextByOcr #ocr识别文字地址 + mobileShotAddress: engine/getScreenShotToBase64 #截图返回base64 + getCurrentMessage: engine/getCurrentMessage #获取当前手机最新短信验证码 + getWindowsScale: engine/getWindowsScale #获取屏幕缩放比 + ocrGetAllTextNum: http://197.68.24.38:5000/rpa_v2 #ocr识别所有字符的位置 + ocrGetKeyBoard: http://197.68.24.38:5000/keyboard_v2 #ocr安全键盘 + getSafeKeyBoardNum: http://197.68.24.38:5000/keyboard_v2 + ocrGetCode: http://197.68.24.38:5000/yzm_v2 #ocr识别验证码地址 + hzBankOcrAddress: http://197.68.24.38:9283/gateway/spring-orccloud-platform/OCRA0001 #杭州银行ocr请求ngnix地址 + mtchingThreshold: 0.5 #图像识别阈值 + ocrGetTableColValue: http://197.68.24.38:5000/table_v2 #ocr获取表哥列内容 + ocrGetMoneyValue: http://197.68.24.38:5000/rpa_amount_v2 #ocr获取金额 + ocrGetClickTextDirectionText: http://158.1.20.76:5000/find_v2 #ocr指定文字指定方向指定第几个指定内容文本 + earchFrequency: 2 #元素查找次数 + database: + execSqlAddress: /api/cctp-projects/pub/CpProjectEnvDss/execute #数据库组建执行SQL的请求地址 + pc: + tryTime: 3 #重试次数 +logging: + level: + net.northking: debug diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-test-win.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-test-win.yml new file mode 100644 index 0000000..2d0a014 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-test-win.yml @@ -0,0 +1,92 @@ +spring: + rabbitmq: + addresses: 197.68.24.40:5672 + virtual-host: cloud + username: cctp + password: northking + redis: + cluster: + nodes: 158.1.81.42:16479,158.1.81.43:16480,158.1.83.161:16481,158.1.81.42:16482,158.1.81.43:16483,158.1.83.161:16484 + password: root + database: 0 + lettuce: + pool: + max-active: 5 + max-idle: 5 +atu: + server: + IsPcExecutor: true + engineName: 测试环境执行引擎 + engineSys: windows + remoteProtocol: RDP + remotePort: 3389 + daemonFlag: true + engineVersion: 1.1.0 + serverUrl: http://197.68.24.38:8000 + appiumHost: 172.16.77.25 + appiumPort: 4723 + appiumContextPath: /wd/hub + deviceInfoPath: /api/cctp-device-mgr/pub/device/info/ + globalVarPath: /api/atu-script-case/pub/variable/query + globalVarUpdatePath: /api/atu-script-case/pub/variable/update + fileDownloadPath: /api/cctp-files/pub/download/ + fileUploadPath: /api/cctp-files/pub/upload + engineRegister: /api/cctp-device-mgr/pub/engine/register + deviceReleasePath: /api/cctp-device-mgr/pub/device/release/ + appDownloadUrl: /api/atu-script-case/pub/file/downloadApp/{appId} + libListUrl: /api/cctp-platform/pub/library/getLibListByEngine + tryAcqurieDeviceUrl: /api/cctp-device-mgr/pub/deviceList/apply/remote + pcAcqurieDeviceUrl: /api/cctp-device-mgr/pub/pc/device/remote + taskCancelResultUrl: /api/atu-execute-plan/pub/execPlan/updateTaskExecFile + appInfoUrl: /api/atu-script-case/pub/apps/getAppDetail + ruleDataByName: /api/atu-data-mgr/pub/dataRule/getRuleDataByName + releaseDeviceBatch: /api/cctp-device-mgr/pub/deviceList/release + projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} + testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl + busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName + engine: + executor-pool: + pcSize: 1 + pcCoreSize: 1 + enablePc: true + mobileSize: 25 + mobileCoreSize: 25 + enableMobile: false + apiSize: 15 + apiCoreSize: 15 + enableApi: true + mobileAutomation: + type: jbf +nk: + component: + mobile: + useNewOcr: true + uploadScreenAddress: engine/uploadShotAllScreen + shotAllScreenAddress: engine/shotAllScreen + handleApp: engine/activeApp + execShellAddress: engine/execShell + findPicAddress: http://197.68.24.38:5000/WebAPI/findImageInImage #图片查找 + ocrAddress: http://197.68.31.137:5000/WebAPI/FindTextCoordinateByOcr #ocr地址 + #ocrGetCode: http://197.68.31.137:5000/WebAPI/VerificationCode #ocr识别验证码地址 + ocrGetText: http://197.68.31.137:5000/WebAPI/GetTextByOcr #ocr识别文字地址 + ocrGetTextDirectionText: http://197.68.24.38:5000/direction_v2 #ocr识别指定文字指定方向的内容 + mobileShotAddress: engine/getScreenShotToBase64 #截图返回base64 + getCurrentMessage: engine/getCurrentMessage #获取当前手机最新短信验证码 + getWindowsScale: engine/getWindowsScale #获取屏幕缩放比 + ocrGetAllTextNum: http://197.68.24.38:5000/rpa_v2 #ocr识别所有字符的位置 + ocrGetKeyBoard: http://197.68.24.38:5000/keyboard_v2 #ocr安全键盘 + getSafeKeyBoardNum: http://197.68.24.38:5000/keyboard_v2 + ocrGetCode: http://197.68.24.38:5000/yzm_v2 #ocr识别验证码地址 + hzBankOcrAddress: http://197.68.24.38:9283/gateway/spring-ocrcloud-platform/OCRA0001 #杭州银行OCR请求nginx地址 + matchingThreshold: 0.5 #图像识别阈值 + ocrGetTableColValue: http://197.68.24.38:5000/table_v2 #ocr获取表格列内容 + ocrGetMoneyValue: http://197.68.24.38:5000/rpa_amount_v2 #ocr获取金额 + scriptWaitTime: 100 #脚本步骤执行后等待时间,毫秒 + planWaitTime: 400 #计划步骤执行后等待时间,毫秒 + database: + execSqlAddress: /api/cctp-projects/pub/CpProjectEnvDss/execute #数据库组建执行SQL的请求地址 + pc: + tryTime: 3 #重试次数 +logging: + level: + net.northking: debug \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-uat-linux.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-uat-linux.yml new file mode 100644 index 0000000..cc540aa --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-uat-linux.yml @@ -0,0 +1,104 @@ +spring: + rabbitmq: + addresses: 197.68.31.132:5672,197.68.31.133:5672 + virtual-host: cloud + username: cctp + password: northking + redis: + cluster: + nodes: 197.68.31.131:16579,197.68.31.131:16580,197.68.31.132:16581,197.68.31.132:16582,197.68.31.133:16579,197.68.31.133:16580 + password: root + database: 0 + lettuce: + pool: + max-active: 5 + max-idle: 5 +atu: + server: + engineName: 验证环境引擎 + engineSys: linux + remoteProtocol: RDP + remotePort: 3389 + IsPcExecutor: false + daemonFlag: false + local-debug: false + engineVersion: 1.1.0 + serverUrl: http://197.68.31.131:8000 + appiumHost: 172.16.77.25 + appiumPort: 4723 + appiumContextPath: /wd/hub + deviceInfoPath: /api/cctp-device-mgr/pub/device/info/ + globalVarPath: /api/atu-script-case/pub/variable/query + globalVarUpdatePath: /api/atu-script-case/pub/variable/update + fileDownloadPath: /api/cctp-files/pub/download/ + fileUploadPath: /api/cctp-files/pub/upload + engineRegister: /api/cctp-device-mgr/pub/engine/register + deviceReleasePath: /api/cctp-device-mgr/pub/device/release/ + appDownloadUrl: /api/atu-script-case/pub/file/downloadApp/{appId} + libListUrl: /api/cctp-platform/pub/library/getLibListByEngine + tryAcqurieDeviceUrl: /api/cctp-device-mgr/pub/deviceList/apply/remote + pcAcqurieDeviceUrl: /api/cctp-device-mgr/pub/pc/device/remote + taskCancelResultUrl: /api/atu-execute-plan/pub/execPlan/updateTaskExecFile + appInfoUrl: /api/atu-script-case/pub/apps/getAppDetail + ruleDataByName: /api/atu-data-mgr/pub/dataRule/getRuleDataByName + quoteDataUrl: /api/atu-data-mgr/pub/query/selectDataUrlAndTreeName + releaseDeviceBatch: /api/cctp-device-mgr/pub/deviceList/release + projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} + testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl + busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName + engine: + executor-pool: + pcSize: 1 + pcCoreSize: 1 + enablePc: false + mobileSize: 25 + mobileCoreSize: 25 + enableMobile: true + apiSize: 15 + apiCoreSize: 15 + enableApi: true + scheduler: + daemon: + enabled: false + heartbeat: + enabled: true + login: + enabled: true + mobileAutomation: + type: jbf +nk: + component: + mobile: + useNewOcr: true + uploadScreenAddress: engine/uploadShotAllScreen + getWindowsScale: engine/getWindowsScale #获取屏幕缩放比 + shotAllScreenAddress: engine/shotAllScreen + handleApp: engine/activeApp + execShellAddress: engine/execShell + findPicAddress: http://197.68.31.131:5000/WebAPI/findImageInImage #图片查找 + ocrAddress: http://197.68.27.23:5000/WebAPI/FindTextCoordinateByOcr #ocr地址 + #ocrGetCode: http://197.68.27.23:5000/WebAPI/VerificationCode #ocr识别验证码地址 + ocrGetText: http://197.68.27.23:5000/WebAPI/GetTextByOcr #ocr识别文字地址 + mobileShotAddress: engine/getScreenShotToBase64 #截图返回base64 + getCurrentMessage: engine/getCurrentMessage #获取当前手机最新短信验证 + ocrGetAllTextNum: http://197.68.31.131:5000/rpa_v2 #ocr识别所有字符的位置 + ocrGetKeyBoard: http://197.68.31.131:5000/keyboard_v2 #ocr安全键盘 + getSafeKeyBoardNum: http://197.68.31.131:5000/keyboard_v2 + ocrGetCode: http://197.68.31.131:5000/yzm_v2 #ocr识别验证码地址 + hzBankOcrAddress: http://197.68.31.131:9283/gateway/spring-ocrcloud-platform/OCRA0001 #杭州银行OCR请求nginx地址 + ocrGetTextDirectionText: http://197.68.31.131:5000/direction_v2 #ocr识别指定文字指定方向的内容 + matchingThreshold: 0.5 #图像识别阈值 + ocrGetTableColValue: http://197.68.31.131:5000/table_v2 #ocr获取表格列内容 + ocrGetMoneyValue: http://197.68.31.131:5000/rpa_amount_v2 #ocr获取金额 + ocrGetClickTextDirectionText: http://197.68.31.131:5000/find_v2 #ocr指定文字指定方向指定第几个指定内容文本 + searchFrequency: 2 #元素查找次数 + findTime: 3 #xpath每次查找时间,秒 + scriptWaitTime: 100 #脚本步骤执行后等待时间,毫秒 + planWaitTime: 400 #计划步骤执行后等待时间,毫秒 + pc: + tryTime: 3 #重试次数 + database: + execSqlAddress: /api/cctp-projects/pub/CpProjectEnvDss/execute #数据库组建执行SQL的请求地址 +logging: + level: + net.northking: debug \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-uat-uos.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-uat-uos.yml new file mode 100644 index 0000000..2bb9a0b --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-uat-uos.yml @@ -0,0 +1,104 @@ +spring: + rabbitmq: + addresses: 197.68.24.40:5672 + virtual-host: cloud + username: cctp + password: northking + redis: + cluster: + nodes: 158.1.81.42:16479,158.1.81.43:16480,158.1.83.161:16481,158.1.81.42:16482,158.1.81.43:16483,158.1.83.161:16484 + password: root + database: 0 + lettuce: + pool: + max-active: 5 + max-idle: 5 +atu: + server: + engineName: 验证环境引擎 + engineSys: linux + remoteProtocol: vnc + remotePort: 5900 + IsPcExecutor: true + daemonFlag: false + local-debug: false + engineVersion: 1.1.0 + serverUrl: http://197.68.24.38:8000 + appiumHost: 172.16.77.25 + appiumPort: 4723 + appiumContextPath: /wd/hub + deviceInfoPath: /api/cctp-device-mgr/pub/device/info/ + globalVarPath: /api/atu-script-case/pub/variable/query + globalVarUpdatePath: /api/atu-script-case/pub/variable/update + fileDownloadPath: /api/cctp-files/pub/download/ + fileUploadPath: /api/cctp-files/pub/upload + engineRegister: /api/cctp-device-mgr/pub/engine/register + deviceReleasePath: /api/cctp-device-mgr/pub/device/release/ + appDownloadUrl: /api/atu-script-case/pub/file/downloadApp/{appId} + libListUrl: /api/cctp-platform/pub/library/getLibListByEngine + tryAcqurieDeviceUrl: /api/cctp-device-mgr/pub/deviceList/apply/remote + pcAcqurieDeviceUrl: /api/cctp-device-mgr/pub/pc/device/remote + taskCancelResultUrl: /api/atu-execute-plan/pub/execPlan/updateTaskExecFile + appInfoUrl: /api/atu-script-case/pub/apps/getAppDetail + ruleDataByName: /api/atu-data-mgr/pub/dataRule/getRuleDataByName + quoteDataUrl: /api/atu-data-mgr/pub/query/selectDataUrlAndTreeName + releaseDeviceBatch: /api/cctp-device-mgr/pub/deviceList/release + projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} + testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl + busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName + engine: + executor-pool: + pcSize: 1 + pcCoreSize: 1 + enablePc: true + mobileSize: 25 + mobileCoreSize: 25 + enableMobile: false + apiSize: 15 + apiCoreSize: 15 + enableApi: true + scheduler: + daemon: + enabled: false + heartbeat: + enabled: true + login: + enabled: true + mobileAutomation: + type: jbf +nk: + component: + mobile: + useNewOcr: true + uploadScreenAddress: engine/uploadShotAllScreen + getWindowsScale: engine/getWindowsScale #获取屏幕缩放比 + shotAllScreenAddress: engine/shotAllScreen + handleApp: engine/activeApp + execShellAddress: engine/execShell + findPicAddress: http://197.68.31.137:5000/WebAPI/findImageInImage #图片查找 + ocrAddress: http://197.68.31.137:5000/WebAPI/FindTextCoordinateByOcr #ocr地址 + #ocrGetCode: http://197.68.31.137:5000/WebAPI/VerificationCode #ocr识别验证码地址 + ocrGetText: http://197.68.31.137:5000/WebAPI/GetTextByOcr #ocr识别文字地址 + mobileShotAddress: engine/getScreenShotToBase64 #截图返回base64 + getCurrentMessage: engine/getCurrentMessage #获取当前手机最新短信验证码 + ocrGetAllTextNum: http://197.68.24.38:5000/rpa_v2 #ocr识别所有字符的位置 + ocrGetKeyBoard: http://197.68.24.38:5000/keyboard_v2 #ocr安全键盘 + getSafeKeyBoardNum: http://197.68.24.38:5000/keyboard_v2 + ocrGetCode: http://197.68.24.38:5000/yzm_v2 #ocr识别验证码地址 + hzBankOcrAddress: http://197.68.24.38:9283/gateway/spring-orccloud-platform/OCRA0001 #杭州银行ocr请求ngnix地址 + ocrGetTextDirectionText: http://197.68.31.131:5000/direction_v2 #ocr识别指定文字指定方向的内容 + mtchingThreshold: 0.5 #图像识别阈值 + ocrGetTableColValue: http://197.68.24.38:5000/table_v2 #ocr获取表哥列内容 + ocrGetMoneyValue: http://197.68.24.38:5000/rpa_amount_v2 #ocr获取金额 + ocrGetClickTextDirectionText: http://158.1.20.76:5000/find_v2 #ocr指定文字指定方向指定第几个指定内容文本 + earchFrequency: 2 #元素查找次数 + findTime: 3 #xpath每次查找时间,秒 + scriptWaitTime: 100 #脚本步骤执行后等待时间,毫秒 + planWaitTime: 400 #计划步骤执行后等待时间,毫秒 + pc: + tryTime: 3 #重试次数 + database: + execSqlAddress: /api/cctp-projects/pub/CpProjectEnvDss/execute #数据库组建执行SQL的请求地址 +logging: + level: + net.northking: debug \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-uat-win.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-uat-win.yml new file mode 100644 index 0000000..d964f66 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application-uat-win.yml @@ -0,0 +1,94 @@ +spring: + rabbitmq: + addresses: 197.68.31.132:5672,197.68.31.133:5672 + virtual-host: cloud + username: cctp + password: northking + redis: + cluster: + nodes: 197.68.31.131:16579,197.68.31.131:16580,197.68.31.132:16581,197.68.31.132:16582,197.68.31.133:16579,197.68.31.133:16580 + password: root + database: 0 + lettuce: + pool: + max-active: 5 + max-idle: 5 +atu: + server: + IsPcExecutor: true + engineName: 验证环境引擎 + engineSys: windows + remoteProtocol: RDP + remotePort: 3389 + daemonFlag: true + engineVersion: 1.1.0 + serverUrl: http://197.68.31.131:8000 + appiumHost: 172.16.77.25 + appiumPort: 4723 + appiumContextPath: /wd/hub + deviceInfoPath: /api/cctp-device-mgr/pub/device/info/ + globalVarPath: /api/atu-script-case/pub/variable/query + globalVarUpdatePath: /api/atu-script-case/pub/variable/update + fileDownloadPath: /api/cctp-files/pub/download/ + fileUploadPath: /api/cctp-files/pub/upload + engineRegister: /api/cctp-device-mgr/pub/engine/register + deviceReleasePath: /api/cctp-device-mgr/pub/device/release/ + appDownloadUrl: /api/atu-script-case/pub/file/downloadApp/{appId} + libListUrl: /api/cctp-platform/pub/library/getLibListByEngine + tryAcqurieDeviceUrl: /api/cctp-device-mgr/pub/deviceList/apply/remote + pcAcqurieDeviceUrl: /api/cctp-device-mgr/pub/pc/device/remote + taskCancelResultUrl: /api/atu-execute-plan/pub/execPlan/updateTaskExecFile + appInfoUrl: /api/atu-script-case/pub/apps/getAppDetail + ruleDataByName: /api/atu-data-mgr/pub/dataRule/getRuleDataByName + releaseDeviceBatch: /api/cctp-device-mgr/pub/deviceList/release + projectInfo: /api/cctp-projects/pub/project/query/info?projectId={projectId} + testSysUrl: /api/cctp-projects/pub/CpProjectEnvSyss/querySysUrl + busComInfoUrl: /api/atu-script-case/pub/busCom/findBusComName + engine: + executor-pool: + pcSize: 1 + pcCoreSize: 1 + enablePc: true + mobileSize: 25 + mobileCoreSize: 25 + enableMobile: false + apiSize: 15 + apiCoreSize: 15 + enableApi: true + mobileAutomation: + type: jbf +nk: + component: + mobile: + useNewOcr: true + uploadScreenAddress: engine/uploadShotAllScreen + shotAllScreenAddress: engine/shotAllScreen + handleApp: engine/activeApp + execShellAddress: engine/execShell + findPicAddress: http://197.68.24.38:5000/WebAPI/findImageInImage #图片查找 + ocrAddress: http://197.68.27.23:5000/WebAPI/FindTextCoordinateByOcr #ocr地址 + ocrGetText: http://197.68.27.23:5000/WebAPI/GetTextByOcr #ocr识别文字地址 + ocrGetTextDirectionText: http://197.68.31.131:5000/direction_v2 #ocr识别指定文字指定方向的内容 + mobileShotAddress: engine/getScreenShotToBase64 #截图返回base64 + getCurrentMessage: engine/getCurrentMessage #获取当前手机最新短信验证码 + getWindowsScale: engine/getWindowsScale #获取屏幕缩放比 + ocrGetAllTextNum: http://197.68.31.131:5000/rpa_v2 #ocr识别所有字符的位置 + ocrGetKeyBoard: http://197.68.31.131:5000/keyboard_v2 #ocr安全键盘 + getSafeKeyBoardNum: http://197.68.31.131:5000/keyboard_v2 + ocrGetCode: http://197.68.31.131:5000/yzm_v2 #ocr识别验证码地址 + hzBankOcrAddress: http://197.68.31.131:9283/gateway/spring-ocrcloud-platform/OCRA0001 #杭州银行OCR请求nginx地址 + matchingThreshold: 0.5 #图像识别阈值 + ocrGetTableColValue: http://197.68.31.131:5000/table_v2 #ocr获取表格列内容 + ocrGetMoneyValue: http://197.68.31.131:5000/rpa_amount_v2 #ocr获取金额 + ocrGetClickTextDirectionText: http://197.68.31.131:5000/find_v2 #ocr指定文字指定方向指定第几个指定内容文本 + searchFrequency: 2 #元素查找次数 + findTime: 3 #xpath每次查找时间,秒 + scriptWaitTime: 100 #脚本步骤执行后等待时间,毫秒 + planWaitTime: 400 #计划步骤执行后等待时间,毫秒 + database: + execSqlAddress: /api/cctp-projects/pub/CpProjectEnvDss/execute #数据库组建执行SQL的请求地址 + pc: + tryTime: 3 #重试次数 +logging: + level: + net.:northking: debug \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application.yml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application.yml new file mode 100644 index 0000000..c014a65 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/application.yml @@ -0,0 +1,35 @@ +server: + port: 6001 +spring: + application: + name: atu-engine + profiles: + active: devFront-win #运行环境 + jackson: + serialization: + write-dates-as-timestamps: true + jpa: + show-sql: false + hibernate: + ddl-auto: update + database: h2 + datasource: + url: jdbc:h2:file:../../dist/.h2/engine + username: engine + password: 123456 + driver-class-name: org.h2.Driver + h2: + console: + path: /h2 + enabled: true + settings: + trace: false + web-allow-others: true +management: + endpoints: + web: + exposure: + include: "*" + endpoint: + shutdown: + enabled: true \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/main/resources/logback.xml b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/logback.xml new file mode 100644 index 0000000..e9e9539 --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/main/resources/logback.xml @@ -0,0 +1,35 @@ + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level | %X{trace_id} | %X{span_id} | [%thread] %logger{36} : %msg%n + UTF-8 + + + + + + ${log_path}/cctp-engine.log + + ${log_path}/cctp-engine-%d{yyyy-MM-dd}.%i.log + 10 + 10MB + + true + + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level | %X{trace_id} | %X{span_id} | [%thread] %logger{36} : %msg%n + UTF-8 + + + + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-engine/atu-script-engine/src/test/java/net/northing/cctp/se/util/RegexUtilsTests.java b/cctp-atu/atu-engine/atu-script-engine/src/test/java/net/northing/cctp/se/util/RegexUtilsTests.java new file mode 100644 index 0000000..fb8b37b --- /dev/null +++ b/cctp-atu/atu-engine/atu-script-engine/src/test/java/net/northing/cctp/se/util/RegexUtilsTests.java @@ -0,0 +1,43 @@ +package net.northing.cctp.se.util; + + +import net.northking.cctp.se.util.RegexUtils; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.util.Set; + +@RunWith(JUnit4.class) +public class RegexUtilsTests { + private String testData = "password of #{username} is ${pwd}"; + private String testData2 = "password of username is pwd"; + @Test + public void testContainGlobalVar(){ + Assert.assertTrue(RegexUtils.containGlobalVar(testData)); + Assert.assertFalse(RegexUtils.containGlobalVar(testData2)); + } + @Test + public void testContainScriptVar(){ + Assert.assertTrue(RegexUtils.containScriptVar(testData)); + Assert.assertFalse(RegexUtils.containScriptVar(testData2)); + } + @Test + public void testExtractScriptVar(){ + Set ret = RegexUtils.extractScriptVar(testData); + Assert.assertEquals(1,ret.size()); + Assert.assertTrue(ret.contains("pwd")); + ret = RegexUtils.extractScriptVar(testData2); + Assert.assertEquals(0,ret.size()); + } + @Test + public void testExtractGlobalVar(){ + Set ret = RegexUtils.extractGlobalVar(testData); + Assert.assertEquals(1,ret.size()); + Assert.assertTrue(ret.contains("username")); + ret = RegexUtils.extractGlobalVar(testData2); + Assert.assertEquals(0,ret.size()); + } + +} diff --git a/cctp-atu/atu-engine/pom.xml b/cctp-atu/atu-engine/pom.xml new file mode 100644 index 0000000..995c057 --- /dev/null +++ b/cctp-atu/atu-engine/pom.xml @@ -0,0 +1,96 @@ + + + + net.northking.cctp + cctp-parent + 1.0.1-RELEASE + + 4.0.0 + + net.northking.cctp.atu + atu-engine-parent + 1.0.0-RELEASE + + pom + + + atu-script-engine + atu-daemon-process + atu-engine-dto + + + + + hzbank + release + http://devops.hzbtest:38081/repository/hzbank-maven-group-public + + + + + 1.0.2-RELEASE + 1.0.0-RELEASE + 1.2.62 + 7.6.0 + 2.9.2 + 1.9.6 + + + + + + net.northking.cctp + cctp-test-element-core + ${cctp-test-element-core.version} + + + net.northking.cctp + cctp-commons + ${cctp-commons.version} + + + net.northking.cctp + cctp-commons + ${cctp-commons.version} + + + net.northking.cctp.atu + atu-engine-dto + ${project.version} + + + + io.appium + java-client + ${appium-client.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + + + io.springfox + springfox-swagger-ui + ${springfox-swagger.version} + + + io.springfox + springfox-swagger2 + ${springfox-swagger.version} + + + com.github.xiaoymin + swagger-bootstrap-ui + ${swagger-bootstrap-ui.version} + + + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/Dockerfile-dev b/cctp-atu/atu-execute-plan/Dockerfile-dev new file mode 100644 index 0000000..14718c8 --- /dev/null +++ b/cctp-atu/atu-execute-plan/Dockerfile-dev @@ -0,0 +1,40 @@ +# This is spring boot config server +# Version 2.1 + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER xiusong.xie@northking.net + +EXPOSE 8250 + +ENV APP_NAME=atu-execute-plan +ENV APP_VERSION=1.0.1-RELEASE + +ENV CCTP_HOME /home/cctp + +ARG SPACE +ARG URL +ARG SIZE +ARG PROFILE +ENV NACOS_SPACE=$SPACE +ENV NACOS_URL=$URL +ENV XMX=$SIZE +ENV APP_PROFILE=$PROFILE + +ENV JAR_FILE=${CCTP_HOME}/${APP_NAME}-${APP_VERSION}.ms.jar +ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' +#ENV JACOCO_AGENT_OPTS='-javaagent:/home/cctp/jacoco-0.8.7/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8040,address=0.0.0.0,append=true' + +VOLUME ${CCTP_HOME} + +ADD dist ${CCTP_HOME}/ +RUN chmod a+x ${CCTP_HOME}/nk-ms.sh + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +ENTRYPOINT ["sh", "-c", "java -jar -Xms${XMX} -Xmx${XMX} ${TRACE_JAVAAGENT_OPTS} -Dfile.encoding=UTF-8 -DAPP_PROFILE=${APP_PROFILE} -DNACOS_NAMESPACE=${NACOS_SPACE} -DNACOS_SERVER_URL=${NACOS_URL} -Dloader.path=.,lib ${JAR_FILE}"] + +#CMD [""] diff --git a/cctp-atu/atu-execute-plan/Dockerfile-prod b/cctp-atu/atu-execute-plan/Dockerfile-prod new file mode 100644 index 0000000..a59eab4 --- /dev/null +++ b/cctp-atu/atu-execute-plan/Dockerfile-prod @@ -0,0 +1,40 @@ +# This is spring boot config server +# Version 2.1 + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER xiusong.xie@northking.net + +EXPOSE 8250 + +ENV APP_NAME=atu-execute-plan +ENV APP_VERSION=1.0.1-RELEASE + +ENV CCTP_HOME /home/cctp + +ARG SPACE +ARG URL +ARG SIZE +ARG PROFILE +ENV NACOS_SPACE=$SPACE +ENV NACOS_URL=$URL +ENV XMX=$SIZE +ENV APP_PROFILE=$PROFILE + +ENV JAR_FILE=${CCTP_HOME}/${APP_NAME}-${APP_VERSION}.ms.jar +ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' +# ENV JACOCO_AGENT_OPTS='-javaagent:/home/cctp/jacoco-0.8.7/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8040,address=0.0.0.0,append=true' + +VOLUME ${CCTP_HOME} + +ADD dist ${CCTP_HOME}/ +RUN chmod a+x ${CCTP_HOME}/nk-ms.sh + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +ENTRYPOINT ["sh", "-c", "java -jar -Xms${XMX} -Xmx${XMX} ${TRACE_JAVAAGENT_OPTS} -Dfile.encoding=UTF-8 -DAPP_PROFILE=${APP_PROFILE} -DNACOS_NAMESPACE=${NACOS_SPACE} -DNACOS_SERVER_URL=${NACOS_URL} -Dloader.path=.,lib ${JAR_FILE}"] + +#CMD [""] diff --git a/cctp-atu/atu-execute-plan/Dockerfile-test b/cctp-atu/atu-execute-plan/Dockerfile-test new file mode 100644 index 0000000..a59eab4 --- /dev/null +++ b/cctp-atu/atu-execute-plan/Dockerfile-test @@ -0,0 +1,40 @@ +# This is spring boot config server +# Version 2.1 + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER xiusong.xie@northking.net + +EXPOSE 8250 + +ENV APP_NAME=atu-execute-plan +ENV APP_VERSION=1.0.1-RELEASE + +ENV CCTP_HOME /home/cctp + +ARG SPACE +ARG URL +ARG SIZE +ARG PROFILE +ENV NACOS_SPACE=$SPACE +ENV NACOS_URL=$URL +ENV XMX=$SIZE +ENV APP_PROFILE=$PROFILE + +ENV JAR_FILE=${CCTP_HOME}/${APP_NAME}-${APP_VERSION}.ms.jar +ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' +# ENV JACOCO_AGENT_OPTS='-javaagent:/home/cctp/jacoco-0.8.7/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8040,address=0.0.0.0,append=true' + +VOLUME ${CCTP_HOME} + +ADD dist ${CCTP_HOME}/ +RUN chmod a+x ${CCTP_HOME}/nk-ms.sh + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +ENTRYPOINT ["sh", "-c", "java -jar -Xms${XMX} -Xmx${XMX} ${TRACE_JAVAAGENT_OPTS} -Dfile.encoding=UTF-8 -DAPP_PROFILE=${APP_PROFILE} -DNACOS_NAMESPACE=${NACOS_SPACE} -DNACOS_SERVER_URL=${NACOS_URL} -Dloader.path=.,lib ${JAR_FILE}"] + +#CMD [""] diff --git a/cctp-atu/atu-execute-plan/Dockerfile-uat b/cctp-atu/atu-execute-plan/Dockerfile-uat new file mode 100644 index 0000000..8ac40c2 --- /dev/null +++ b/cctp-atu/atu-execute-plan/Dockerfile-uat @@ -0,0 +1,40 @@ +# This is spring boot config server +# Version 2.1 + +FROM openjdk:8u212-jdk-alpine + +MAINTAINER xiusong.xie@northking.net + +EXPOSE 8250 + +ENV APP_NAME=atu-execute-plan +ENV APP_VERSION=1.0.1-RELEASE + +ENV CCTP_HOME /home/cctp + +ARG SPACE +ARG URL +ARG SIZE +ARG PROFILE +ENV NACOS_SPACE=$SPACE +ENV NACOS_URL=$URL +ENV XMX=$SIZE +ENV APP_PROFILE=$PROFILE + +ENV JAR_FILE=${CCTP_HOME}/${APP_NAME}-${APP_VERSION}.ms.jar +ENV TRACE_JAVAAGENT_OPTS='-javaagent:/home/cctp/trace-otel/hzb-otel-javaagent.jar -Dotel.javaagent.configuration-file=/home/cctp/trace-otel/trace-otel.properties' +ENV JACOCO_AGENT_OPTS='-javaagent:/home/cctp/jacoco-0.8.7/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8040,address=0.0.0.0,append=true' + +VOLUME ${CCTP_HOME} + +ADD dist ${CCTP_HOME}/ +RUN chmod a+x ${CCTP_HOME}/nk-ms.sh + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR ${CCTP_HOME} + +ENTRYPOINT ["sh", "-c", "java -jar -Xms${XMX} -Xmx${XMX} ${TRACE_JAVAAGENT_OPTS} ${JACOCO_AGENT_OPTS} -Dfile.encoding=UTF-8 -DAPP_PROFILE=${APP_PROFILE} -DNACOS_NAMESPACE=${NACOS_SPACE} -DNACOS_SERVER_URL=${NACOS_URL} -Dloader.path=.,lib ${JAR_FILE}"] + +#CMD [""] diff --git a/cctp-atu/atu-execute-plan/docker-ctl.sh b/cctp-atu/atu-execute-plan/docker-ctl.sh new file mode 100644 index 0000000..b6fef68 --- /dev/null +++ b/cctp-atu/atu-execute-plan/docker-ctl.sh @@ -0,0 +1,177 @@ +#!/bin/sh + +source /etc/profile + +## 应用名称 +APP_NAME=atu-execute-plan + +## 镜像版本 +VERSION=3.0-SNAPSHOT + +## 公司名称 +corporation=gzrdc + +NACOS_SPACE=UI-DEV +NACOS_URL=158.1.12.237:8848 +JVM=1024M +PROFILE=dev + +## 镜像仓库配置 +DOCKER_REGISTRY=harbor.hzbtest:8443 + +##dockerfile 文件名配置 + +FILE_NAME=Dockerfile +while getopts "a:v:d:f:n:u:s:p:" arg +do + case $arg in + a) + echo "set APP_NAME=$OPTARG" + APP_NAME=$OPTARG + ;; + v) + echo "VERSION=$OPTARG" + VERSION=$OPTARG + ;; + d) + echo "set DOCKER_REGISTRY=$OPTARG" + DOCKER_REGISTRY=$OPTARG + ;; + f) + echo "set FILE_NAME=$OPTARG" + FILE_NAME=$OPTARG + ;; + n) + echo "set NACOS_SPACE=$OPTARG" + NACOS_SPACE=$OPTARG + ;; + u) + echo "set NACOS_URL=$OPTARG" + NACOS_URL=$OPTARG + ;; + s) + echo "set JVM=$OPTARG" + JVM=$OPTARG + ;; + p) + echo "set PROFILE=$OPTARG" + PROFILE=$OPTARG + ;; + ?) + echo "unkown argument: $? $OPTARG " + exit 1 + ;; + esac +done + + +TAG_NAME=${DOCKER_REGISTRY}/${corporation}/${APP_NAME} +## deployment yaml +DEPLOYMENT_YAML=${APP_NAME}.deployment.yaml + +shift $((OPTIND-1)) + +clean_Container() { + ## 获取运行 容器ID + RUN_ID=$(docker ps |grep ${APP_NAME}|awk '{print $1}') + + ## 先停止容器 + if [ "${RUN_ID}" = "" ]; then + echo "Container ${APP_NAME} is not starting " + else + ## 停止 docker容器 + docker stop ${RUN_ID} + echo "Container ${APP_NAME} , ID: ${RUN_ID} is stopped " + fi + + ## 获取已停止 容器ID + STOP_ID=$(docker ps -a |grep ${APP_NAME}|awk '{print $1}') + ## 删除容器 + if [ "${STOP_ID}" = "" ]; then + echo "Container ${APP_NAME} is not exist" + else + ## 移除 docker容器 + docker rm -v ${STOP_ID} + echo "Remove container ${APP_NAME} , ID: ${STOP_ID} " + fi + +} + +clean_Image() { + ## 获取 镜像ID + IMG_ID=$(docker images |grep ${APP_NAME}|awk '{print $3}') + + if [ "${IMG_ID}" = "" ]; then + echo "Image ${TAG_NAME} is not exist " + else + ## 移除 docker镜像 + docker rmi ${TAG_NAME} + echo "Remove image ${TAG_NAME} , ID: ${IMG_ID} " + fi +} +get_agent(){ + ## 获取agent 文件 + mkdir -p target/dist/trace-otel/ + wget -P target/dist/trace-otel/ http://devops.hzbtest:38081/repository/raw-distribution/rdc/uts/core/hzb-otel-javaagent.jar + wget -P target/dist/trace-otel/ http://158.1.0.78:8081/repository/raw-distribution/rdc/uts/core/trace-otel.properties + sed -i "s?SUBSYS_ZZZ?SUBSYS_ATU_EP?g" target/dist/trace-otel/trace-otel.properties + ## 添加jacoco的agent + cp -r /home/northking/agent/jacoco-0.8.7 target/dist/ +} + +for command in $* +do + echo "execute : ${command}" + + case "${command}" in + clean) + clean_Container + clean_Image + ;; + build) + $0 clean + mvn --update-snapshots clean package + get_agent + ## 创建镜像 + docker build --build-arg SIZE=${JVM} --build-arg PROFILE=${PROFILE} --build-arg SPACE=${NACOS_SPACE} --build-arg URL=${NACOS_URL} -f ${FILE_NAME} -t ${TAG_NAME} target/ + ;; + debug) + clean_Container + + docker run -itd --net=host --privileged=true --name ${APP_NAME} ${TAG_NAME} + sleep 2 + ## 输出容器日志 + RUN_ID=$(docker ps -a |grep ${APP_NAME}|awk '{print $1}') + docker logs -f -t ${RUN_ID} + ;; + push) + docker push ${TAG_NAME} + docker tag ${TAG_NAME} ${TAG_NAME}:${VERSION} + docker push ${TAG_NAME}:${VERSION} + docker rmi -f ${TAG_NAME} + docker rmi -f ${TAG_NAME}:${VERSION} + ;; + pull) + $0 clean + docker pull ${TAG_NAME} + ;; + deploy) + kubectl delete -f ${DEPLOYMENT_YAML} + sleep 2 + kubectl apply -f ${DEPLOYMENT_YAML} + sleep 2 + ;; + logs) + for pod in $(kubectl -n cctp get pod |grep ${APP_NAME}|awk '{print $1}') + do + echo "get logs by pod=${pod}" + kubectl -n cctp logs -f --tail=200 --follow=false ${pod} + done + ;; + *) + echo "Usage: $0 {clean|build|debug|push|deploy|logs}" + exit 1 + esac +done + +exit 0 diff --git a/cctp-atu/atu-execute-plan/pom.xml b/cctp-atu/atu-execute-plan/pom.xml new file mode 100644 index 0000000..5e61ca3 --- /dev/null +++ b/cctp-atu/atu-execute-plan/pom.xml @@ -0,0 +1,200 @@ + + + + net.northking.cctp + cctp-parent + 1.0.1-RELEASE + + 4.0.0 + + atu-execute-plan + jar + + + + net.northking.cctp.executePlan.ExecutePlanApplication + 2.3.2 + 5.8.15 + 3.12.0 + 3.14.9 + 4.1.2 + 1.4 + 2.0.23 + 5.5.9 + 5.2.0 + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + org.apache.maven.plugins + maven-dependency-plugin + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + net.northking.cctp + cctp-maven-plugin + 0.0.141-RELEASE + + com.mysql.cj.jdbc.Driver + jdbc:mysql://192.168.77.26:3306/atu_execute_plan?useUnicode=true&characterEncoding=utf-8&useSSL=false + northking + northking@002987 + atu_execute_plan + atu_execute_plan + atu_plan_script_link_md + net.northking.cctp.executePlan + + + + mysql + mysql-connector-java + ${mysql.version} + + + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + org.springframework.cloud + spring-cloud-config-client + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.springframework.boot + spring-boot-starter-validation + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + mysql + mysql-connector-java + + + com.squareup.okhttp3 + okhttp + ${okhttp.version} + + + org.quartz-scheduler + quartz + ${quartz.version} + + + cn.hutool + hutool-all + ${hutool.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + net.northking.cctp + cctp-commons + ${cctp-commons.version} + + + + org.springframework.boot + spring-boot-starter-mail + + + com.alibaba.fastjson2 + fastjson2 + ${fastjson2.version} + + + + + org.apache.poi + poi + ${poi.version} + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + org.apache.poi + ooxml-schemas + ${ooxml-schemas.version} + + + org.projectlombok + lombok + + + org.apache.httpcomponents + httpmime + 4.5.11 + + + + + com.itextpdf + itextpdf + ${itextpdf.version} + + + com.itextpdf + itext-asian + ${itext-asian.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/shell/nk-ms.sh b/cctp-atu/atu-execute-plan/shell/nk-ms.sh new file mode 100644 index 0000000..f61bb4c --- /dev/null +++ b/cctp-atu/atu-execute-plan/shell/nk-ms.sh @@ -0,0 +1,116 @@ +#!/bin/sh + +SERVER_IP=192.168.77.22 +SERVER_PORT=9090 + +NK_HOME_DEFAULT=/home/northking +PRODUCTION_NAME=cctp +APP_NAME=atu-execute-plan +APP_VERSION=3.0-SNAPSHOT +JAR_FILE=${APP_NAME}-${APP_VERSION}.ms.jar +APP_PORT=8300 + +JAVA_OPTIONS="-Xmx256M -Dfile.encoding=UTF-8 -Dloader.path=.,lib" +PORT_OPTIONS="--server.port=${APP_PORT}" + +if [ 0"$NK_HOME" = "0" ]; then + echo "NK_HOME unset, use default value : $NK_HOME_DEFAULT" + NK_HOME=${NK_HOME_DEFAULT} +fi + + +PID=$(ps aux | grep ${JAR_FILE} | grep -v grep | awk '{print $2}' ) + +check_if_process_is_running() { + if [ "$PID" = "" ]; then + return 1 + fi + ps -p $PID | grep "java" + return $? +} + +install_upgrade() { + upgrade_url="http://${SERVER_IP}:${SERVER_PORT}/${PRODUCTION_NAME}/${APP_VERSION}/${APP_NAME}" + rm -rf ${JAR_FILE} + wget ${upgrade_url}/${JAR_FILE} + + rm -rf install.list + wget ${upgrade_url}/install.list + + mkdir -p config + mkdir -p lib + + + cd config + rm -rf application.yml + wget ${upgrade_url}/config/application.yml + + cd ../lib + rm -rf * + for filename in `cat ../install.list` + do + echo ${filename} + wget http://${SERVER_IP}:${SERVER_PORT}/lib/${filename} + done + + cd .. +} + + + +case "$1" in + upgrade) + $0 stop + install_upgrade + ;; + status) + if check_if_process_is_running + then + echo -e "\033[32m $APP_NAME is running \033[0m" + else + echo -e "\033[32m $APP_NAME not running \033[0m" + fi + ;; + stop) + if ! check_if_process_is_running + then + echo -e "\033[32m $APP_NAME already stopped \033[0m" + exit 0 + fi + kill -9 $PID + echo -e "\033[32m $APP_NAME already stopped \033[0m" + ;; + start) + if [ "$PID" != "" ] && check_if_process_is_running + then + echo -e "\033[32m $APP_NAME already running \033[0m" + exit 1 + fi + nohup java -jar ${JAVA_OPTIONS} ${JAR_FILE} ${PORT_OPTIONS} > /dev/null 2>&1 & + echo -ne "\033[32m Starting \033[0m" + + if check_if_process_is_running + then + echo -e "\033[32m $APP_NAME fail \033[0m" + else + echo -e "\033[32m $APP_NAME started \033[0m" + fi + ;; + debug) + java -jar ${JAVA_OPTIONS} ${JAR_FILE} ${PORT_OPTIONS} + ;; + restart) + $0 stop + if [ $? = 1 ] + then + exit 1 + fi + $0 start + ;; + *) + echo "Usage: $0 {start|stop|restart|status|upgrade|debug}" + exit 1 +esac + + +exit 0 diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/ExecutePlanApplication.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/ExecutePlanApplication.java new file mode 100644 index 0000000..6e17dda --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/ExecutePlanApplication.java @@ -0,0 +1,48 @@ +package net.northking.cctp.executePlan; + +import cn.gjing.tools.auth.config.EnableAuthorization; +import net.northking.cctp.common.config.EnableNKCloud; +import net.northking.cctp.common.config.EnableNKWebMvc; +import net.northking.cctp.common.s3.EnableS3; +import org.mybatis.spring.annotation.MapperScan; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + *

Title: ExecutePlanApplication

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/02 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@SpringBootApplication +@EnableDiscoveryClient +@MapperScan({"net.northking.cctp.executePlan.db.mapper", "net.northking.cctp.executePlan.db.dao"}) +@EnableNKCloud +@EnableNKWebMvc +@EnableS3 +@EnableAuthorization +@EnableTransactionManagement // 开启事务 +@EnableFeignClients(basePackages = {"net.northking.cctp.executePlan.feign", "net.northking.cctp.common.feign", "com.hzbank.testteam.autotest"}) +@ComponentScan(basePackages = {"net.northking.cctp.executePlan","com.hzbank.testteam.autotest"}) +public class ExecutePlanApplication { + + private static final Logger logger = LoggerFactory.getLogger(ExecutePlanApplication.class); + + public static void main(String[] args) { + logger.info("执行计划微服务启动----开始 ................."); + + SpringApplication.run(ExecutePlanApplication.class, args); + + logger.info("执行计划微服务启动----完成 ................."); + + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoBatchCtrl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoBatchCtrl.java new file mode 100644 index 0000000..eda7b8c --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoBatchCtrl.java @@ -0,0 +1,70 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api; + +import cn.gjing.tools.auth.annotation.RequiredPermissions; +import cn.hutool.json.JSONUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.executePlan.api.service.AtuPlanInfoApiService; +import net.northking.cctp.executePlan.api.service.AtuPlanTaskApiService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 执行计划表 => Restful 类型 HTTP/HTTPS 接口 + * + * @author maven-cctp-plugin + * @since 1.0 + */ +@Api(tags = "执行计划表") +@RequestMapping("/v1/batch/execPlan") +@RestController +public class AtuPlanInfoBatchCtrl +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(AtuPlanInfoBatchCtrl.class); + + @Autowired + private AtuPlanInfoApiService apiService; + + @Autowired + private AtuPlanTaskApiService taskApiService; + + /** + * Restful接口-post: 批量克隆执行计划表 + * + * @param batch 集合 + * @return 成功的数量 + */ + @RequiredPermissions("ui-clonePlan") + @ApiOperation(value = "批量克隆:执行计划表") + @PostMapping( + value = "/clone", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper clonePlan( + @RequestBody @Validated List batch) + { + logger.info("start clonePlan: params =======> " + JSONUtil.toJsonStr(batch)); + + ResultWrapper wrapper = new ResultWrapper<>(); + Integer count = this.apiService.clonePlan(batch); + + logger.info("end clonePlan "); + + return wrapper.success(count); + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoPubCtrl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoPubCtrl.java new file mode 100644 index 0000000..009c219 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoPubCtrl.java @@ -0,0 +1,108 @@ +package net.northking.cctp.executePlan.api; + +import cn.hutool.json.JSONUtil; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.executePlan.api.service.AtuPlanBatchApiService; +import net.northking.cctp.executePlan.api.service.AtuPlanInfoApiService; +import net.northking.cctp.executePlan.api.service.AtuPlanTaskApiService; +import net.northking.cctp.executePlan.dto.planBatch.AtuExceptionCase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + *

Title: AtuPlanInfoPubCtrl

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/27 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@Api(tags = "执行计划表") +@RequestMapping("/pub") +@RestController +public class AtuPlanInfoPubCtrl { + + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(AtuPlanInfoPubCtrl.class); + + @Autowired + private AtuPlanTaskApiService taskApiService; + + @Autowired + private AtuPlanInfoApiService planInfoApiService; + + @Autowired + private AtuPlanBatchApiService planBatchApiService; + + /** + * 更新任务执行结果文件 + * @param params 参数 {“taskId”:"", "filePath": ""} + * @return 结果 + */ + @ApiOperation(value = "更新任务执行结果文件") + @PostMapping(value = "/execPlan/updateTaskExecFile") + public ResultWrapper updateTaskExecFile(@RequestBody Map params){ + logger.info("start updateTaskExecFile: params =======> " + JSONUtil.toJsonStr(params)); + + ResultWrapper wrapper = new ResultWrapper<>(); + Boolean result = taskApiService.updateTaskExecFile(params); + + logger.info("end updateTaskExecFile "); + + return wrapper.success(result); + } + + /** + * 判断用例集是否被执行计划引用 + * @param params 用例集id集合 + * @return 结果 + */ + @ApiOperation(value = "判断用例集是否被执行计划引用") + @PostMapping(value = "/execPlan/isUse") + public Boolean isUse(@RequestBody List params){ + logger.info("start isUse: params =======> " + JSONUtil.toJsonStr(params)); + Boolean result = planInfoApiService.isUse(params); + logger.info("end isUse "); + return result; + } + + /** + * 批次用例推送通知 + * @param exceptionCaseList 异常用例数据 + * @return 结果 + */ + @ApiOperation(value = "批次用例推送通知") + @PostMapping(value = "/execPlan/casePushNotice") + public ResultWrapper casePushNotice(@Validated @RequestBody List exceptionCaseList){ + + logger.info("start casePushNotice: params =======> " + JSONUtil.toJsonStr(exceptionCaseList)); + + ResultWrapper wrapper = new ResultWrapper<>(); + Boolean result = planBatchApiService.casePushNotice(exceptionCaseList); + + logger.info("end casePushNotice "); + + return wrapper.success(result); + } + @ApiOperation(value = "执行计划报告清除") + @GetMapping("/execPlan/clearPlanReport") + public ResponseVO clearPlanReport(){ + logger.info("start clearPlanReport "); + ResponseVO responseVO = planBatchApiService.clearPlanReport(); + logger.info("end clearPlanReport "); + return responseVO; + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoQueryCtrl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoQueryCtrl.java new file mode 100644 index 0000000..3f8c02f --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoQueryCtrl.java @@ -0,0 +1,313 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api; + +import cn.gjing.tools.auth.annotation.RequiredPermissions; +import cn.hutool.json.JSONUtil; +import com.hzbank.testteam.autotest.dependencies.authDependency.constants.AuthDependencyConstants; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.constants.BaseDefineDependencyConstants; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.dto.AdvancedQueryOptions; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.executePlan.api.service.AtuPlanBatchApiService; +import net.northking.cctp.executePlan.api.service.AtuPlanInfoApiService; +import net.northking.cctp.executePlan.api.service.AtuPlanTaskApiService; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.dto.planBatch.AtuBatchTaskPageDto; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchPageDto; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchQueryDto; +import net.northking.cctp.executePlan.dto.planBatch.BatchScriptReportDto; +import net.northking.cctp.executePlan.dto.planInfo.*; +import net.northking.cctp.executePlan.dto.planScript.*; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskPageDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskQueryDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +@Api(tags = "执行计划表") +@RequestMapping("/v1") +@RestController +public class AtuPlanInfoQueryCtrl +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(AtuPlanInfoQueryCtrl.class); + + @Autowired + private AtuPlanInfoApiService planApiService; + + @Autowired + private AtuPlanBatchApiService batchApiService; + + @Autowired + private AtuPlanTaskApiService taskApiService; + + + /** + * 分页查询 执行计划表 列表 + * + * @param queryByPage 查询条件 + * @return 数据列表 + */ + @ApiOperation(value = "分页查询列表:执行计划表") + @RequiredPermissions("taskPlan") + @PostMapping(value = "/paging/query/execPlan", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> pagingQueryPlan( + @RequestBody @Validated QueryByPage queryByPage) + { + logger.info("start pagingQueryPlan: params =======> " + JSONUtil.toJsonStr(queryByPage)); + + ResultWrapper> wrapper = new ResultWrapper<>(); + Pagination page = planApiService.pagingQuery(queryByPage); + + logger.info("end pagingQueryPlan"); + + return wrapper.success(page); + } + + /** + * 分页查询 执行批次表 列表 + * + * @param queryByPage 查询条件 + * @return 数据列表 + */ + @RequiredPermissions("ui-queryPlanLog") + @ApiOperation(value = "分页查询列表:执行批次表") + @PostMapping(value = "/paging/query/execPlan/batch", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> pagingQueryBatch( + @RequestBody @Validated QueryByPage queryByPage) + { + logger.info("start pagingQueryBatch: params =======> " + JSONUtil.toJsonStr(queryByPage)); + + ResultWrapper> wrapper = new ResultWrapper<>(); + Pagination page = batchApiService.pagingQuery(queryByPage); + + logger.info("end pagingQueryBatch"); + + return wrapper.success(page); + } + + + /** + * 分页查询 执行任务表 列表 + * + * @param queryByPage 查询条件 + * @return 数据列表 + */ + @ApiOperation(value = "分页查询列表:执行任务表") + @PostMapping(value = "/paging/query/execPlan/task", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> pagingQueryTask( + @RequestBody @Validated QueryByPage queryByPage) + { + logger.info("start pagingQueryTask: params =======> " + JSONUtil.toJsonStr(queryByPage)); + + ResultWrapper> wrapper = new ResultWrapper<>(); + Pagination page = taskApiService.pagingQuery(queryByPage); + + logger.info("end pagingQueryTask"); + + return wrapper.success(page); + } + + @ApiOperation(value = "查询设备关联软件与设备") + @GetMapping(value = "/query/execPlan/queryAppAndDevice/{planId}") + public ResultWrapper queryAppAndDevice(@PathVariable("planId") String planId){ + ResultWrapper wrapper = new ResultWrapper<>(); + AtuPlanInfoAppAndDeviceDto dto = this.planApiService.queryPlanAppAndDevice(planId); + return wrapper.success(dto); + } + + @ApiOperation(value = "计划启用禁用") + @PostMapping(value = "/update/execPlan/enable") + public ResultWrapper updatePlanEnable(@RequestParam("planId") String planId,@RequestParam("enable")Boolean enable){ + ResultWrapper wrapper = new ResultWrapper<>(); + AtuPlanInfo atuPlanInfo = new AtuPlanInfo(); + atuPlanInfo.setEnabled(enable); + atuPlanInfo.setId(planId); + Integer result = this.planApiService.updatePlanEnable(atuPlanInfo); + return wrapper.success(result); + } + + @RequiredPermissions("ui-planTaskLive") + @ApiOperation(value = "查询任务直播或视频") + @GetMapping(value = "/query/planTask/live/{taskId}") + public ResultWrapper>> queryTaskLive(@PathVariable("taskId") String taskId) { + ResultWrapper>> wrapper = new ResultWrapper<>(); + List> map = this.planApiService.queryTaskLive(taskId); + return wrapper.success(map); + } + + + @RequiredPermissions("ui-queryPlanBatchReport") + @ApiOperation(value = "计划批次报告") + @GetMapping(value = "/query/planBatch/report/{batchId}") + public ResultWrapper queryPlanBatchReport(@PathVariable String batchId){ + ResultWrapper wrapper = new ResultWrapper<>(); + BatchScriptReportDto result = this.planApiService.queryPlanBatchReport(batchId); + return wrapper.success(result); + } + + @ApiOperation("导出:导出执行结果") + @RequiredPermissions("ui-exportPlanBatchReport") + @GetMapping("/export/batchExecResult/{batchId}") + public void exportBatchExecResult(HttpServletResponse response, @PathVariable String batchId) { + logger.info("start exportBatchExecResult: batchId =======> " + batchId); + this.planApiService.exportBatchExecResult(response, batchId); + logger.info("end exportBatchExecResult"); + } + + @RequiredPermissions("ui-reportExport") + @ApiOperation("导出:导出报告") + @PostMapping("/export/batchReport") + public void exportBatchReport(HttpServletResponse response, @RequestBody AtuPlanExportDto exportDto) { + logger.info("start exportBatchReport: params =======> " + JSONUtil.toJsonStr(exportDto)); + this.planApiService.exportBatchReport(response, exportDto); + logger.info("end exportBatchReport"); + } + + @ApiOperation(value = "根据批次id查询任务详情") + @PostMapping(value = "/paging/query/execPlan/batchId", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper pagingQueryTaskByBatchId( + @RequestBody @Validated QueryByPage queryByPage) { + ResultWrapper wrapper = new ResultWrapper<>(); + AtuBatchTaskPageDto atuBatchTaskPageDto = this.batchApiService.queryPlanByBatch(queryByPage); + return wrapper.success(atuBatchTaskPageDto); + } + + @ApiOperation(value = "计划保存脚本") + @PostMapping(value = "/save/plan/byScript") + public ResultWrapper selectScriptByPlan(@RequestBody AtuPlanScriptDto dto){ + ResultWrapper wrapper = new ResultWrapper<>(); + String result = planApiService.selectScriptByPlan(dto); + return wrapper.success(result); + } + + + @RequiredPermissions(value = {"ui-savePlanData","ui-addPlanData"}) + @ApiOperation(value = "保存计划数据") + @PostMapping(value = "/save/planData") + public ResultWrapper savePlanData(@RequestBody @Validated AtuPlanInfoAddDto inputDto) { + ResultWrapper wrapper = new ResultWrapper<>(); + String result = planApiService.savePlanData(inputDto); + return wrapper.success(result); + } + + @ApiOperation(value = "查询计划关联的脚本") + @GetMapping(value = "/page/query/linkMd/{planId}") + public ResultWrapper queryLinkMd( + @PathVariable("planId") String planId){ + ResultWrapper wrapper = new ResultWrapper<>(); + AtuPlanScriptResultDto resultDto = planApiService.queryLinkMdPage(planId); + return wrapper.success(resultDto); + } + + @ApiOperation(value = "删除计划关联脚本") + @PostMapping(value = "/delete/script/linkMd") + @RequiredPermissions(value = {"ui-savePlanData","ui-addPlanData"}) + public ResultWrapper deleteMdLink(@RequestBody AtuPlanScriptDeleteDto deleteDto) { + ResultWrapper wrapper = new ResultWrapper<>(); + Integer integer = planApiService.deletePlanScriptLinkMd(deleteDto); + return wrapper.success(integer); + } + + @ApiOperation(value = "feign调用:根据计划id查询关联脚本id") + @GetMapping(value = "/feign/query/scriptList/{planId}") + public ResultWrapper> queryScriptLinkByPlan(@PathVariable("planId") String planId){ + ResultWrapper> wrapper = new ResultWrapper<>(); + List result = planApiService.queryPlanScriptList(planId); + return wrapper.success(result); + } + + @ApiOperation(value = "设置计划状态") + @GetMapping(value = "/status/update/{planId}") + public ResultWrapper updatePlanStatus(@PathVariable("planId") String planId){ + ResultWrapper wrapper = new ResultWrapper<>(); + Integer result = planApiService.updatePlanStatus(planId); + return wrapper.success(result); + } + + @ApiOperation(value = "根据脚本id查询是否有关联") + @PostMapping(value = "/check/scriptByPlan") + public Boolean checkScript(@RequestBody List ids){ + return planApiService.checkScript(ids); + } + + @ApiOperation(value = "分页查询计划内关联的脚本") + @PostMapping(value = "/page/plan/scriptLink") + public ResultWrapper queryPlanScriptPage(@RequestBody QueryByPage queryByPage){ + ResultWrapper wrapper = new ResultWrapper<>(); + AtuPlanScriptPageDto result = planApiService.queryScriptPage(queryByPage); + return wrapper.success(result); + } + + @ApiOperation(value = "计划内保存勾选的脚本") + @PostMapping(value = "/save/plan/scriptList") + public ResultWrapper savePlanScript(@RequestBody AtuPlanScriptSaveDto dto){ + ResultWrapper wrapper = new ResultWrapper<>(); + String result = planApiService.savePlanScript(dto); + return wrapper.success(result); + } + + @ApiOperation(value = "计划分配负责人") + @PostMapping(value = "/update/plan/principal") + public ResultWrapper updatePrincipal(@RequestBody AtuPlanPrincipalDto dto){ + ResultWrapper wrapper = new ResultWrapper<>(); + String result = planApiService.updatePrincipal(dto); + return wrapper.success(result); + } + + @ApiOperation(value = "根据脚本id查询用例集是否有关联") + @PostMapping(value = "/check/dataSet") + public Boolean checkDataSetUsedByScriptIdList(@RequestBody List scriptIdList){ + return planApiService.checkDataSetUsedByScriptIdList(scriptIdList); + } + + @ApiOperation(value = "分页查询:前置计划列表") + @PostMapping(value = "/page/query/upFrontPlan") + public ResultWrapper> pageUpFrontPlan(@RequestBody QueryByPage queryByPage){ + ResultWrapper> wrapper = new ResultWrapper<>(); + Pagination result = planApiService.pageUpFrontPlan(queryByPage); + return wrapper.success(result); + } + + @ApiOperation(value = "获取高级查询相关配置数据:创建人,更新人,责任人") + @GetMapping(value = "/plan/advancedQueryOptions") + public ResponseVO advancedQueryOptions( + @ApiParam(value = "系统ID", required = true, example = "36602691803153920") + @RequestHeader(AuthDependencyConstants.REQUEST_HEADER_PROJECT_ID) String projectId) { + logger.debug("start advancedQueryOptions"); + ResponseVO responseVO = new ResponseVO<>(); + AdvancedQueryOptions result = planApiService.advancedQueryOptions(projectId); + responseVO.setCode(BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS); + responseVO.setData(result); + responseVO.setMessage("获取成功"); + logger.debug("end advancedQueryOptions"); + return responseVO; + } +} + + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoRestfulCtrl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoRestfulCtrl.java new file mode 100644 index 0000000..e856ab7 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/AtuPlanInfoRestfulCtrl.java @@ -0,0 +1,229 @@ +/* + * Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. + * + */ +package net.northking.cctp.executePlan.api; + +import cn.gjing.tools.auth.annotation.RequiredPermissions; +import cn.hutool.json.JSONUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.executePlan.api.service.AtuPlanBatchApiService; +import net.northking.cctp.executePlan.api.service.AtuPlanInfoApiService; +import net.northking.cctp.executePlan.api.service.AtuPlanTaskApiService; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.dto.planBatch.BatchRetryDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanInfoDetailDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanRunDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskDetailDto; +import net.northking.cctp.executePlan.dto.planTask.AtuTaskSendBugDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.integration.redis.util.RedisLockRegistry; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * 执行计划表 => Restful 类型 HTTP/HTTPS 接口 + * + * @author maven-cctp-plugin + * @since 1.0 + */ +@Api(tags = "执行计划表") +@RequestMapping("/v1/execPlan") +@RestController +public class AtuPlanInfoRestfulCtrl { + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(AtuPlanInfoRestfulCtrl.class); + + @Autowired + private AtuPlanInfoApiService planApiService; + + @Autowired + private AtuPlanBatchApiService batchApiService; + + @Autowired + private AtuPlanTaskApiService taskApiService; + + @Autowired + private RedisLockRegistry redisLockRegistry; + + /** + * Restful接口-get: 获取执行计划表 + * + * @param planId 主键 + * @return 接口数据传输对象 + */ + @ApiOperation(value = "获取:执行计划表") + @GetMapping( + value = "/{planId}", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper findPlanByPK( + @PathVariable("planId") String planId) { + logger.info("start findByPK: planId =======> " + planId); + + ResultWrapper wrapper = new ResultWrapper<>(); + AtuPlanInfoDetailDto dto = planApiService.findByPK(planId); + + logger.info("end findByPK"); + + return wrapper.success(dto); + } + + /** + * Restful接口-delete: 删除执行计划表 + * + * @param planId 主键 + * @return 删除的记录数量 + */ + @RequiredPermissions("ui-deletePlan") + @ApiOperation(value = "删除:执行计划表") + @DeleteMapping( + value = "/{planId}", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper deletePlanByPK( + @PathVariable("planId") String planId) { + logger.info("start deleteByPK: planId =======> " + planId); + + ResultWrapper wrapper = new ResultWrapper<>(); + Integer count = planApiService.deleteByPK(planId); + + logger.info("end deleteByPK"); + + return wrapper.success(count); + } + + /** + * Restful接口-get: 计划设备是否离线 + * + * @param planId 主键 + * @return 结果 + */ + @ApiOperation(value = "校验计划设备是否离线") + @GetMapping( + value = "/checkDeviceOffline", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> checkDeviceOffline( + @RequestParam("planId") String planId, @RequestParam("batchId") String batchId) { + logger.info("start checkDeviceOffline: planId => {}, batchId => {}", planId, batchId); + + Map result = planApiService.checkDeviceOffline(planId, batchId); + + logger.info("end checkDeviceOffline"); + + return new ResultWrapper>().success(result); + } + + /** + * Restful接口-get: 计划执行 + * + * @param atuPlanRunDto 执行参数 + * @return 结果 + */ + @RequiredPermissions(value = {"ui-execPlan"}) + @ApiOperation(value = "计划立即执行") + @PostMapping( + value = "/run", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper run(@Validated @RequestBody AtuPlanRunDto atuPlanRunDto) { + logger.info("start run: params =======> " + JSONUtil.toJsonStr(atuPlanRunDto)); + + atuPlanRunDto.setExecutedBy(NKSecurityContext.getUserId()); + atuPlanRunDto.setTriggerType(PlanConstant.TRIGGER_TYPE_MANUAL); + planApiService.run(atuPlanRunDto); + + logger.info("end run"); + + return new ResultWrapper<>().success(); + } + + /** + * Restful接口-get: 计划批次停止 + * + * @param batchId 主键 + * @return 结果 + */ + @RequiredPermissions("ui-stopPlanBatch") + @ApiOperation(value = "计划立即停止") + @GetMapping( + value = "/batch/stop/{batchId}", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper stop( + @PathVariable("batchId") String batchId) { + logger.info("start stop: batchId =======> " + batchId); + + ResultWrapper wrapper = new ResultWrapper<>(); + Boolean flag = taskApiService.stop(batchId); + + logger.info("end stop"); + + return wrapper.success(flag); + } + + /** + * Restful接口-get: 获取任务详情 + * + * @param taskId 主键 + * @return 接口数据传输对象 + */ + @RequiredPermissions("ui-queryPlanTask") + @ApiOperation(value = "获取:任务详情") + @GetMapping( + value = "/task/{taskId}", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper findTaskById( + @PathVariable("taskId") String taskId) { + logger.info("start findTaskById: taskId =======> " + taskId); + + ResultWrapper wrapper = new ResultWrapper<>(); + AtuPlanTaskDetailDto dto = taskApiService.findTaskDetailById(taskId); + + logger.info("end findTaskById"); + + return wrapper.success(dto); + } + + /** + * 任务重试 + * + * @param retryDto 任务id集合 + * @return 结果 + */ + @RequiredPermissions("ui-planTaskRetry") + @ApiOperation(value = "任务重试") + @PostMapping("/taskRetry") + public ResultWrapper taskRetry(@Validated @RequestBody BatchRetryDto retryDto) { + + logger.info("start taskRetry: retryDto =======> " + JSONUtil.toJsonStr(retryDto)); + + ResultWrapper wrapper = new ResultWrapper<>(); + Boolean result = taskApiService.taskRetry(retryDto); + + logger.info("end taskRetry"); + + return wrapper.success(result); + } + + @ApiOperation(value = "根据任务id查询任务发送缺陷信息") + @GetMapping("/querySendBugTaskInfo/{taskId}") + public ResultWrapper querySendBugTaskInfo(@PathVariable("taskId") String taskId) { + + logger.info("start querySendBugTaskInfo: taskId =======> {}", taskId); + + ResultWrapper wrapper = new ResultWrapper<>(); + AtuTaskSendBugDto result = taskApiService.querySendBugTaskInfo(taskId); + + logger.info("end querySendBugTaskInfo"); + + return wrapper.success(result); + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/AtuExecplanTagQueryCtrl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/AtuExecplanTagQueryCtrl.java new file mode 100644 index 0000000..35fcc4a --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/AtuExecplanTagQueryCtrl.java @@ -0,0 +1,58 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api.execplanTag; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.constants.BaseDefineDependencyConstants; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.dto.TagDto; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import cn.gjing.tools.auth.annotation.RequiredPermissions; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.executePlan.api.execplanTag.service.AtuExecplanTagApiService; +import net.northking.cctp.executePlan.constants.MsgConstant; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import java.util.List; + +@Api(tags = "执行计划标签表") +@RequestMapping("/v1") +@RestController +public class AtuExecplanTagQueryCtrl +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(AtuExecplanTagQueryCtrl.class); + + @Autowired + private AtuExecplanTagApiService apiService; + + + @RequiredPermissions("ui-queryPlanTag") + @ApiOperation(value = "获取执行计划引用的标签列表") + @GetMapping("/queryExecplanTag/{execplanId}") + public ResponseVO> queryExecplanTag(@PathVariable("execplanId") String execplanId) + { + logger.debug("start queryExecplanTag, execplanId:{}", execplanId); + ResponseVO> responseVO = new ResponseVO<>(); + List tagDtos = apiService.queryExecplanTag(execplanId); + logger.debug("end queryExecplanTag"); + responseVO.setCode(BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS); + responseVO.setData(tagDtos); + responseVO.setMessage(MsgConstant.RESPONSE_VO_GET_EXE_PLAN_LAB_SUCCESSFULLY); + return responseVO; + } + + +} + + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/AtuExecplanTagRestfulCtrl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/AtuExecplanTagRestfulCtrl.java new file mode 100644 index 0000000..0c2d8cd --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/AtuExecplanTagRestfulCtrl.java @@ -0,0 +1,82 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api.execplanTag; + +import cn.gjing.tools.auth.annotation.RequiredPermissions; +import com.alibaba.fastjson.JSONObject; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.constants.BaseDefineDependencyConstants; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.executePlan.api.execplanTag.service.AtuExecplanTagApiService; +import net.northking.cctp.executePlan.dto.execplanTag.AtuExecplanTagAddDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 执行计划标签表 => Restful 类型 HTTP/HTTPS 接口 + * + * @author maven-cctp-plugin + * @since 1.0 + */ +@Api(tags = "执行计划标签表") +@RequestMapping("/v1/AtuExecplanTags") +@RestController +public class AtuExecplanTagRestfulCtrl +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(AtuExecplanTagRestfulCtrl.class); + + @Autowired + private AtuExecplanTagApiService apiService; + + /** + * 给执行计划批量打标签 + * @param addDto + * @return + */ + @RequiredPermissions("ui-addPlanTagList") + @ApiOperation(value = "给执行计划批量打标签") + @PostMapping(value = "/addExecplanTagList", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseVO addExecplanTagList(@RequestBody @Validated AtuExecplanTagAddDto addDto) + { + logger.debug("start addExecplanTagList, param:{}", JSONObject.toJSONString(addDto)); + + ResponseVO responseVO = apiService.addExecplanTagList(addDto); + logger.debug("end addExecplanTagList, count:{}", responseVO.getData()); + return responseVO; + } + + /** + * Restful接口-delete: 删除执行计划标签 + * + * @param execplanId 执行计划Id + * @param tagId 标签Id + * @return + */ + @ApiOperation(value = "删除:执行计划标签表") + @DeleteMapping( + value = "/deleteByExecplanIdAndTagId", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseVO deleteByExecplanIdAndTagId( + @RequestParam String execplanId, @RequestParam Long tagId) + { + logger.debug("start deleteByExecplanIdAndTagId, execplanId:{}, tagId:{}", execplanId, tagId); + ResponseVO responseVO = new ResponseVO<>(); + Integer count = apiService.deleteByExecplanIdAndTagId(execplanId,tagId); + logger.debug("end deleteByExecplanIdAndTagId, count:{}", count); + responseVO.setCode(BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS); + responseVO.setData(count); + return responseVO; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/service/AtuExecplanTagApiService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/service/AtuExecplanTagApiService.java new file mode 100644 index 0000000..004288b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/service/AtuExecplanTagApiService.java @@ -0,0 +1,41 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api.execplanTag.service; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.dto.TagDto; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import net.northking.cctp.executePlan.dto.execplanTag.AtuExecplanTagAddDto; + +import java.util.List; + +/** + * 执行计划标签表Restful逻辑接口 + * @author maven-cctp-plugin + * @since 1.0 + */ +public interface AtuExecplanTagApiService +{ + + /** + * 给执行计划批量打标签 + * @param addDto + * @return + */ + ResponseVO addExecplanTagList(AtuExecplanTagAddDto addDto); + /** + * 根据执行计划id查询标签 + * @param execplanId + * @return + */ + List queryExecplanTag(String execplanId); + + /** + * 删除执行计划标签表 + * @param execplanId ,tagId 主键 + * @return 删除的记录数量 + */ + Integer deleteByExecplanIdAndTagId(String execplanId,Long tagId); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/service/AtuExecplanTagApiServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/service/AtuExecplanTagApiServiceImpl.java new file mode 100644 index 0000000..e2c0ac3 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/execplanTag/service/AtuExecplanTagApiServiceImpl.java @@ -0,0 +1,125 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api.execplanTag.service; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.constants.BaseDefineDependencyConstants; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.dto.TagDto; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.exception.InvalidException; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.form.TagForm; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.executePlan.constants.MsgConstant; +import net.northking.cctp.executePlan.db.dao.AtuPlanInfoDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.dto.execplanTag.AtuExecplanTagAddDto; +import net.northking.cctp.executePlan.exception.ExecPlanError; +import net.northking.cctp.executePlan.feign.ApiTagService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; + +/** + * 执行计划标签表服务实现类 + * + * @author maven-cctp-plugin + * @since 1.0 + */ + +@Service +@ConditionalOnMissingBean(name = "AtuExecplanTagApiServiceImpl") +public class AtuExecplanTagApiServiceImpl implements AtuExecplanTagApiService +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(AtuExecplanTagApiServiceImpl.class); + + + @Autowired + private AtuPlanInfoDao atuPlanInfoDao; + + @Autowired + private ApiTagService apiTagService; + + + @Override + public ResponseVO addExecplanTagList(AtuExecplanTagAddDto addDto) { + //获取参数 + List execplanIdList = addDto.getExecplanIdList(); + List tagNameList = addDto.getTagNameList(); + //校验参数是否为空 + if (CollectionUtils.isEmpty(execplanIdList)) { + throw new PlatformRuntimeException(ExecPlanError.EXECPLAN_ID_IS_NULL); + } + //获取执行计划信息 + List execplanInfoList = atuPlanInfoDao.queryPlanInfoByIds(execplanIdList); + Integer num = 0; + StringBuilder sb = new StringBuilder(); + for (AtuPlanInfo item : execplanInfoList) { + TagForm form = new TagForm(); + form.setObjectId(item.getId()); + form.setTags(tagNameList); + form.setType(4); // UI计划 + try { + form.setProjectId(Long.valueOf(item.getProjectId())); + } catch (NumberFormatException e) { + logger.error("系统Id转为Long类型异常,执行计划Id:{}, 执行计划系统Id:{}", item.getId(), item.getProjectId(), e); + } + ResponseVO responseVO = apiTagService.saveTags(form); + if (BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS.equals(responseVO.getCode())) { + num ++; + } else { + sb.append(item.getPlanName()).append(","); + } + } + ResponseVO responseVO = new ResponseVO<>(); + if (!num.equals(execplanInfoList.size())){ + responseVO.setCode(BaseDefineDependencyConstants.RESPONSE_CODE_INVALID_REFRESH); + responseVO.setData(num); + sb.setLength(sb.length() - 1); + String msg = MsgConstant.RESPONSE_VO_EXECUTE_PLAN +":" + sb + MsgConstant.RESPONSE_VO_ADD_TAGS_FAILURE; + responseVO.setMessage(msg); + } else { + responseVO.setCode(BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS); + responseVO.setData(num); + responseVO.setMessage(MsgConstant.RESPONSE_VO_ADD_TAGS_SUCCESSFULLY); + } + return responseVO; + } + + @Override + public List queryExecplanTag(String execplanId) { + //判断执行计划是否存在 + AtuPlanInfo atuPlanInfo = atuPlanInfoDao.findByPrimaryKey(execplanId); + if (null == atuPlanInfo) { + throw new InvalidException(BaseDefineDependencyConstants.RESPONSE_CODE_INVALID_REFRESH, "该执行计划不存在或已被删除"); + } + return apiTagService.listTagByObjectId(execplanId); + } + + @Override + public Integer deleteByExecplanIdAndTagId(String execplanId, Long tagId) { + //判断删除参数是否存在 + if(StringUtils.isEmpty(execplanId)||StringUtils.isEmpty(tagId)){ + throw new PlatformRuntimeException(ExecPlanError.DELETE_EXECPLANTAG_ERROR); + } + AtuPlanInfo atuPlanInfo = atuPlanInfoDao.findByPrimaryKey(execplanId); + if (null == atuPlanInfo || atuPlanInfo.getDeleted()) { + throw new InvalidException(BaseDefineDependencyConstants.RESPONSE_CODE_INVALID_REFRESH, "该执行计划不存在或已被删除"); + } + ResponseVO responseVO = apiTagService.removeById(tagId); + if (!BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS.equals(responseVO.getCode())) { + throw new InvalidException("删除标签失败"); + } + return 1; + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanBatchApiService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanBatchApiService.java new file mode 100644 index 0000000..f89cabe --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanBatchApiService.java @@ -0,0 +1,89 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api.service; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.db.excel.ExcelService; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatch; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.dto.planBatch.AtuBatchTaskPageDto; +import net.northking.cctp.executePlan.dto.planBatch.AtuExceptionCase; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchPageDto; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchQueryDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskQueryDto; + +import java.util.List; + +/** + * 计划执行批次表Restful逻辑接口 + * @author maven-cctp-plugin + * @since 1.0 + */ +public interface AtuPlanBatchApiService extends ExcelService +{ + /** + * 查询计划执行批次表列表 + * + * @param queryByPage 查询条件 + * @return 查询结果列表 + */ + Pagination pagingQuery(QueryByPage queryByPage); + + + /** + * 根据id查询计划批次信息 + * @param uuid 批次id + * @return 批次信息 + */ + AtuPlanBatch findByPrimaryKey(String uuid); + + + + /** + * 更新计划执行批次表 + * + * @param entity 接口数据传输对象 + * @return 修改的记录数量 + */ + Integer updateByEntity(AtuPlanBatch entity); + + /** + * 更新缓存批次统计数据 + * @param planTask 任务信息 {"batchId":"", "status":"", "startTime":""} + */ + void updateCacheBatchSumData(AtuPlanTask planTask); + + /** + * 批次用例推送通知 + * @param exceptionCaseList 异常用例数据 + * @return 结果 + */ + Boolean casePushNotice(List exceptionCaseList); + + /** + * 批次任务超时处理 + * @param batchId 批次号 + * @param lastOfflineTime 设备离线时间 + */ + void processBatchTaskTimeout(String batchId, Long lastOfflineTime); + + + AtuBatchTaskPageDto queryPlanByBatch(QueryByPage queryByPage); + + + /** + * 初始化计划批次号至缓存 + * @return true or false + */ + Boolean initPlanBatchNumToCache(); + + /** + * 清理计划报告 + * @return + */ + ResponseVO clearPlanReport(); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanBatchApiServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanBatchApiServiceImpl.java new file mode 100644 index 0000000..01e11e9 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanBatchApiServiceImpl.java @@ -0,0 +1,648 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api.service; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.BetweenFormatter; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.thread.ExecutorBuilder; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.constants.BaseDefineDependencyConstants; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.exception.InvalidException; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import net.northking.cctp.common.cache.EntityNameCache; +import net.northking.cctp.common.cache.EntityNameCatalog; +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.db.excel.AbstractExcelService; +import net.northking.cctp.common.db.excel.ExcelHeader; +import net.northking.cctp.common.dto.AssociatedFilesDto; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.common.s3.FileDownloadException; +import net.northking.cctp.common.s3.SimpleStorageService; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.executePlan.constants.MsgConstant; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.constants.RabbitConstant; +import net.northking.cctp.executePlan.constants.RedisConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatch; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.db.entity.AtuPlanSceneCaseTask; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.db.service.*; +import net.northking.cctp.executePlan.dto.planBatch.AtuBatchTaskPageDto; +import net.northking.cctp.executePlan.dto.planBatch.AtuExceptionCase; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchPageDto; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchQueryDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskPageDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskQueryDto; +import net.northking.cctp.executePlan.dto.planTask.StepExecuteResult; +import net.northking.cctp.executePlan.feign.AttachmentFeignClient; +import net.northking.cctp.executePlan.utils.MinioPathUtils; +import org.apache.commons.lang.StringUtils; +import org.lokra.seaweedfs.exception.SeaweedfsFileNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.AmqpTemplate; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.io.ClassPathResource; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.PostConstruct; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.stream.Collectors; + +/** + * 计划执行批次表服务实现类 + * + * @author maven-cctp-plugin + * @since 1.0 + */ + +@Service +@ConditionalOnMissingBean(name = "AtuPlanBatchApiServiceImpl") +@RefreshScope +public class AtuPlanBatchApiServiceImpl extends AbstractExcelService implements AtuPlanBatchApiService +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(AtuPlanBatchApiServiceImpl.class); + + @Autowired + private AtuPlanBatchService atuPlanBatchService; + + @Autowired + private AtuPlanInfoService atuPlanInfoService; + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private AtuPlanTaskService planTaskService; + + @Autowired + private AtuPlanBatchDeviceLinkService planBatchDeviceLinkService; + + @Autowired + private AtuPlanTaskApiService atuPlanTaskApiService; + + @Autowired + private AmqpTemplate amqpTemplate; + + + @Value("${atu.plan.taskTimeout}") + private long taskTimeout; + + @Value("${atu.plan.planReportSaveDay}") + private Long planReportSaveDay; + + @Autowired + private EntityNameCache entityNameCache; + + @Autowired + private SimpleStorageService simpleStorageService; + + @Autowired + private AtuPlanSceneCaseTaskService atuPlanSceneCaseTaskService; + + @Autowired + private AttachmentFeignClient attachmentFeignClient; + /** + * 1分钟的毫秒数 + */ + public static final long MINUTE_MILLISECOND = 60000; + + public static final int EXECUTOR_CORE_POOL_SIZE = 2 * 2 + 2; + public static final int EXECUTOR_MAX_POOL_SIZE = 20; + public static final int EXECUTOR_LINKED_BLOCKING_SIZE = 50; + + private static final ExecutorService executor = ExecutorBuilder.create() + .setCorePoolSize(EXECUTOR_CORE_POOL_SIZE) + .setMaxPoolSize(EXECUTOR_MAX_POOL_SIZE) + .setWorkQueue(new LinkedBlockingDeque<>(EXECUTOR_LINKED_BLOCKING_SIZE)) + .build(); + + private static final DefaultRedisScript BATCH_SCRIPT_SUM_DATA_SCRIPT; + + static { + BATCH_SCRIPT_SUM_DATA_SCRIPT = new DefaultRedisScript<>(); + BATCH_SCRIPT_SUM_DATA_SCRIPT.setLocation(new ClassPathResource("/lua/batchScriptSumDataCache.lua")); + BATCH_SCRIPT_SUM_DATA_SCRIPT.setResultType(Boolean.class); + } + + @PostConstruct + public void init(){ + logger.debug("初始化计划批次号至缓存中 --- start ---"); + this.initPlanBatchNumToCache(); + logger.debug("初始化计划批次号至缓存中 --- end ---"); + } + + //= Excel 导入导出相关代码 start ==================// + @Override + public BasicService getService() + { + return this.atuPlanBatchService; + } + + @Override + public ExcelHeader[] excelHeaders() + { + ExcelHeader id = new ExcelHeader("主键", "id", String.class); + ExcelHeader planId = new ExcelHeader("计划主键", "planId", String.class); + ExcelHeader batch = new ExcelHeader("任务批次", "batch", Integer.class); + ExcelHeader status = new ExcelHeader("状态;0-等待中,1-执行中,2-已完成,3-已取消", "status", String.class); + ExcelHeader startTime = new ExcelHeader("调度开始时间", "startTime", Date.class); + ExcelHeader endTime = new ExcelHeader("调度结束时间", "endTime", Date.class); + ExcelHeader taskTotal = new ExcelHeader("任务总数", "taskTotal", Integer.class); + ExcelHeader successNum = new ExcelHeader("成功任务数", "successNum", Integer.class); + ExcelHeader execFailNum = new ExcelHeader("执行失败数", "execFailNum", Integer.class); + ExcelHeader assertFailNum = new ExcelHeader("断言失败数", "assertFailNum", Integer.class); + ExcelHeader timeoutNum = new ExcelHeader("超时任务数", "timeoutNum", Integer.class); + ExcelHeader cancelNum = new ExcelHeader("取消任务数", "cancelNum", Integer.class); + ExcelHeader successRate = new ExcelHeader("成功率", "successRate", String.class); + ExcelHeader createdTime = new ExcelHeader("创建时间", "createdTime", Date.class); + + return new ExcelHeader[]{}; + } + + /** + * Excel导入,入库之前的处理 + * @param records 从Excel读取到的记录 + * @return 待入库的记录 + */ + @Override + protected List beforeInsertBatch(List records) + { + for (AtuPlanBatch record : records) + { + record.setId(UUIDUtil.create32UUID()); + } + return records; + } + + /** + * 写入Excel之前的处理
+ * 数据的特殊处理在此处加工处理 + * + * @param record 来自数据库记录 + * @return 待写入Excel的记录 + */ + @Override + protected AtuPlanBatch beforeWriteExcel(AtuPlanBatch record) + { + return record; + } + + //= Excel 导入导出相关代码 end =======================// + + //= 增删改查 相关代码 start ==================// + @Override + public Pagination pagingQuery(QueryByPage queryByPage) + { + long queryStartTime = System.currentTimeMillis(); + Pagination query = this.atuPlanBatchService.pagingQuery(queryByPage); + AtuPlanInfo planInfo = this.atuPlanInfoService.findByPrimaryKey(queryByPage.getQuery().getPlanId()); + long queryEndTime = System.currentTimeMillis(); + logger.info("查询分页信息耗时:" + (queryEndTime - queryStartTime)); + long startCreateData = System.currentTimeMillis(); + for (AtuPlanBatchPageDto dto : query.getRecords()) { + getCacheScriptStatusData(dto); + dto.setPlanName(planInfo.getPlanName()); + dto.setScreenRecordSet(planInfo.getScreenRecordSet()); + dto.setExecutedBy(entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, dto.getExecutedBy())); + dto.setElapsedTime("-"); + if (dto.getStartTime() != null && dto.getEndTime() != null){ + dto.setElapsedTime(DateUtil.formatBetween(dto.getEndTime().getTime() - dto.getStartTime().getTime(), + BetweenFormatter.Level.MILLISECOND)); + } + } + long endCreateData = System.currentTimeMillis(); + logger.info("组装数据耗时:" + (endCreateData - startCreateData)); + return query; + } + + /** + * 获取缓存中脚本统计数据 + * @param dto 批次信息 + */ + private void getCacheScriptStatusData(AtuPlanBatchPageDto dto){ + String clusterKeyPrefix = RedisConstant.CLUSTER_KEY_PREFIX + dto.getId().substring(0,4) + + RedisConstant.CLUSTER_KEY_SUFFIX; + String scriptSumKey = clusterKeyPrefix + RedisConstant.BATCH_SCRIPT_SUM_KEY + dto.getId(); + Map sumDataCacheMap = redisTemplate.opsForHash().entries(scriptSumKey); + Object startTimeObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.BATCH_START_TIME); + if (startTimeObj != null && dto.getStartTime() == null) { + dto.setStartTime(DateUtil.parse(DateUtil.format(new Date(Long.parseLong(startTimeObj.toString())), PlanConstant.DATETIME_FORMAT))); + } + Object successObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.TASK_EXECUTE_SUCCESS_STATUS); + if (successObj != null) { + dto.setSuccessNum(Integer.parseInt(successObj.toString())); + } + Object execFailObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.TASK_EXECUTE_FAIL_STATUS); + if (execFailObj != null) { + dto.setExecFailNum(Integer.parseInt(execFailObj.toString())); + } + Object cancelObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.TASK_CANCEL_STATUS); + int cancelNum = 0; + if (cancelObj != null){ + cancelNum = Integer.parseInt(cancelObj.toString()); + dto.setCancelNum(cancelNum); + } + Object timeoutObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.TASK_TIMEOUT_STATUS); + if (timeoutObj != null){ + dto.setTimeoutNum(Integer.parseInt(timeoutObj.toString())); + } + Object totalObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.SCRIPT_TOTAL); + int totalNum = 0; + if (totalObj != null) { + totalNum = Integer.parseInt(totalObj.toString()); + dto.setScriptNum(totalNum); + } + Object runningObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.TASK_START_EXECUTE_STATUS); + Object waitingObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.TASK_WAIT_EXECUTE_STATUS); + if (totalObj != null && runningObj != null && waitingObj != null){ + + int waitingNum = Integer.parseInt(waitingObj.toString()); + int runningNum = Integer.parseInt(runningObj.toString()); + boolean isBegin = waitingNum != 0 || runningNum != 0; + if (isBegin && totalNum >= waitingNum){ + if (totalNum == waitingNum){ + dto.setStatus(PlanConstant.BATCH_WAITING_STATUS); + }else { + dto.setStatus(PlanConstant.BATCH_EXECUTING_STATUS); + } + // 批次正在执行中设置已有的批次结束时间为null,避免计算耗时 + dto.setEndTime(null); + }else{ + if (waitingNum == 0 && runningNum == 0){ + dto.setStatus(PlanConstant.BATCH_FINISH_STATUS); + } + if (cancelNum > 0){ + dto.setStatus(PlanConstant.BATCH_CANCEL_STATUS); + } + } + } + } + + @Override + public AtuPlanBatch findByPrimaryKey(String uuid) { + return this.atuPlanBatchService.findByPrimaryKey(uuid); + } + + @Override + public Integer updateByEntity(AtuPlanBatch entity){ + return this.atuPlanBatchService.updateByEntity(entity); + } + + @Override + public void updateCacheBatchSumData(AtuPlanTask planTask) { + logger.debug("批次脚本统计"); + String clusterPrefix = RedisConstant.CLUSTER_KEY_PREFIX + planTask.getBatchId().substring(0,4) + + RedisConstant.CLUSTER_KEY_SUFFIX; + List keys = new ArrayList<>(); + keys.add(clusterPrefix + RedisConstant.BATCH_SCRIPT_STATUS_KEY + planTask.getBatchId()); + keys.add(clusterPrefix + RedisConstant.BATCH_SCRIPT_SUM_KEY + planTask.getBatchId()); + keys.add(clusterPrefix + RedisConstant.BATCH_SCRIPT_TASK_KEY + planTask.getBatchId() + ":" + planTask.getScriptId()); + keys.add(clusterPrefix + PlanConstant.BATCH_START_TIME); + keys.add(clusterPrefix + PlanConstant.TASK_WAIT_EXECUTE_STATUS); + keys.add(clusterPrefix + PlanConstant.TASK_START_EXECUTE_STATUS); + keys.add(clusterPrefix + planTask.getScriptId()); + keys.add(clusterPrefix + planTask.getId()); + keys.add(clusterPrefix); + redisTemplate.execute(BATCH_SCRIPT_SUM_DATA_SCRIPT, keys, planTask.getStartTime(),Integer.parseInt(planTask.getStatus())); + } + + @Override + public Boolean casePushNotice(List exceptionCaseList) { + if (CollUtil.isEmpty(exceptionCaseList)){ + return true; + } + for (AtuExceptionCase atuExceptionCase : exceptionCaseList) { + // 生成失败任务 + AtuPlanTask planTask = new AtuPlanTask(); + BeanUtil.copyProperties(atuExceptionCase, planTask); + planTask.setId(IdUtil.simpleUUID()); + planTask.setStatus(PlanConstant.TASK_EXECUTE_FAIL_STATUS); + planTask.setStartTime(System.currentTimeMillis()); + planTask.setEndTime(System.currentTimeMillis()); + planTask.setCreatedTime(new Date()); + planTaskService.insert(planTask); + + String scriptTaskKey = RedisConstant.BATCH_SCRIPT_TASK_KEY + planTask.getBatchId() + ":" + planTask.getScriptId(); + String clusterPrefix = RedisConstant.CLUSTER_KEY_PREFIX + planTask.getBatchId().substring(0, 4) + RedisConstant.CLUSTER_KEY_SUFFIX; + redisTemplate.opsForHash().put(clusterPrefix + scriptTaskKey, clusterPrefix + planTask.getId(), planTask.getId()); + + // 任务开始 + planTask.setStatus(PlanConstant.TASK_START_EXECUTE_STATUS); + updateCacheBatchSumData(planTask); + + // 任务结束 + planTask.setStatus(PlanConstant.TASK_EXECUTE_FAIL_STATUS); + updateCacheBatchSumData(planTask); + } + return true; + } + + @Override + public void processBatchTaskTimeout(String batchId, Long lastOfflineTime){ + logger.debug("查询批次【{}】未完成的任务集合", batchId); + List planTaskList = planTaskService.queryUnfinishedTaskByBatchId(batchId); + if (CollUtil.isEmpty(planTaskList)) { + logger.debug("批次【{}】任务已全部完成", batchId); + return; + } + // 是否有在线设备 + logger.debug("判断批次【{}】是否有在线", batchId); + + // 转换成毫秒数 + long timeout = taskTimeout * MINUTE_MILLISECOND; // 最大超时间 + long currentTime = System.currentTimeMillis(); // 当前时间 + logger.debug("判断是否超过{}分钟 => {}",taskTimeout , timeout); + boolean timeoutFlag = currentTime - lastOfflineTime > timeout; + Integer totalDeviceCount = planBatchDeviceLinkService.countDeviceByBatchId(batchId); + + if (!timeoutFlag || totalDeviceCount > 1) { // 没有超时的情况下,检查设备是否都离线 + Integer onlineCount = planBatchDeviceLinkService.countOnlineDeviceByBatchId(batchId); + if (ObjectUtil.isNotNull(onlineCount)){ + logger.debug("部分设备在线,在线设备数量为:{}", onlineCount); + return; + } + logger.debug("批次【{}】所有设备都离线", batchId); + } + // 超过20分钟,将该批次未完成的任务修改为超时 + for (AtuPlanTask planTask : planTaskList) { + if (timeoutFlag){ + logger.debug("任务超过{}分钟,更新任务为超时",taskTimeout); + // 超过20分钟则更新任务表 + if (ObjectUtil.isNull(planTask.getStartTime())){ + // 任务还未开始,将任务创建时间设为任务开始时间 + planTask.setStartTime(System.currentTimeMillis()); + planTask.setStatus(PlanConstant.TASK_START_EXECUTE_STATUS); + this.updateCacheBatchSumData(planTask); + } + + planTask.setStatus(PlanConstant.TASK_TIMEOUT_STATUS); + planTask.setEndTime(System.currentTimeMillis()); + planTask.setErrorMsg(MsgConstant.DEV_OFFLINE_TIMEOUT); + planTaskService.updateByPrimaryKey(planTask); + + this.updateCacheBatchSumData(planTask); + }else{ + logger.debug("不超过{}分钟则计算还差多久到{}分钟", taskTimeout, taskTimeout); + // 不超过20分钟则计算还差多久到20分钟 + long delayTime = lastOfflineTime + timeout - currentTime; + logger.debug("任务还差【{}】 秒超时,加入到延迟队列中", NumberUtil.decimalFormat("#", NumberUtil.div(delayTime, 1000))); + // 发送至延迟队列 + amqpTemplate.convertAndSend(RabbitConstant.TASK_TIMEOUT_DELAY_EXCHANGE_NAME, + RabbitConstant.TASK_TIMEOUT_DELAY_ROUTING_KEY, + planTask.getId(), delayMessage ->{ + // 设置发送消息的延迟时间 + delayMessage.getMessageProperties().setDelay((int) delayTime); + return delayMessage; + }); + } + } + } + + @Override + public AtuBatchTaskPageDto queryPlanByBatch(QueryByPage queryByPage) { + AtuBatchTaskPageDto pageDto = new AtuBatchTaskPageDto(); + Pagination query = atuPlanTaskApiService.pagingQuery(queryByPage); + pageDto.setTaskPage(query); + AtuPlanInfo planInfo = this.atuPlanInfoService.findByPrimaryKey(queryByPage.getQuery().getPlanId()); + AtuPlanBatch atuPlanBatch = this.atuPlanBatchService.findByPrimaryKey(queryByPage.getQuery().getBatchId()); + AtuPlanBatchPageDto dto = new AtuPlanBatchPageDto(); + BeanUtils.copyProperties(atuPlanBatch,dto); + + String clusterKeyPrefix = RedisConstant.CLUSTER_KEY_PREFIX + dto.getId().substring(0,4) + + RedisConstant.CLUSTER_KEY_SUFFIX; + String scriptSumKey = clusterKeyPrefix + RedisConstant.BATCH_SCRIPT_SUM_KEY + dto.getId(); + Object startTimeObj = redisTemplate.opsForHash().get(scriptSumKey, clusterKeyPrefix + PlanConstant.BATCH_START_TIME); + if (startTimeObj != null){ + dto.setStartTime(DateUtil.parse(DateUtil.format(new Date(Long.parseLong(startTimeObj.toString())), PlanConstant.DATETIME_FORMAT))); + } + + Object successObj = redisTemplate.opsForHash().get(scriptSumKey, clusterKeyPrefix + PlanConstant.TASK_EXECUTE_SUCCESS_STATUS); + if (successObj != null){ + dto.setSuccessNum(Integer.parseInt(successObj.toString())); + } + + Object execFailObj = redisTemplate.opsForHash().get(scriptSumKey, clusterKeyPrefix + PlanConstant.TASK_EXECUTE_FAIL_STATUS); + if (execFailObj != null){ + dto.setExecFailNum(Integer.parseInt(execFailObj.toString())); + } + + Object assertFailObj = redisTemplate.opsForHash().get(scriptSumKey, clusterKeyPrefix + PlanConstant.TASK_ASSERT_FAIL_STATUS); + if (assertFailObj != null){ + dto.setAssertFailNum(Integer.parseInt(assertFailObj.toString())); + } + + Object cancelObj = redisTemplate.opsForHash().get(scriptSumKey, clusterKeyPrefix + PlanConstant.TASK_CANCEL_STATUS); + int cancelNum = 0; + if (cancelObj != null){ + cancelNum = Integer.parseInt(cancelObj.toString()); + dto.setCancelNum(cancelNum); + } + + Object timeoutObj = redisTemplate.opsForHash().get(scriptSumKey, clusterKeyPrefix + PlanConstant.TASK_TIMEOUT_STATUS); + if (timeoutObj != null){ + dto.setTimeoutNum(Integer.parseInt(timeoutObj.toString())); + } + Object totalObj = redisTemplate.opsForHash().get(scriptSumKey, clusterKeyPrefix + PlanConstant.TASK_TOTAL); + Object runningObj = redisTemplate.opsForHash().get(scriptSumKey, clusterKeyPrefix + PlanConstant.TASK_START_EXECUTE_STATUS); + Object waitingObj = redisTemplate.opsForHash().get(scriptSumKey, clusterKeyPrefix + PlanConstant.TASK_WAIT_EXECUTE_STATUS); + if (totalObj != null && runningObj != null && waitingObj != null){ + int totalNum = Integer.parseInt(totalObj.toString()); + int waitingNum = Integer.parseInt(waitingObj.toString()); + int runningNum = Integer.parseInt(runningObj.toString()); + boolean isBegin = waitingNum != 0 || runningNum != 0; + if (isBegin && totalNum > waitingNum){ + dto.setStatus(PlanConstant.BATCH_EXECUTING_STATUS); + } + if (waitingNum == 0 && runningNum == 0){ + dto.setStatus(PlanConstant.BATCH_FINISH_STATUS); + } + if (cancelNum > 0){ + dto.setStatus(PlanConstant.BATCH_CANCEL_STATUS); + } + } + + dto.setPlanName(planInfo.getPlanName()); + dto.setScreenRecordSet(planInfo.getScreenRecordSet()); + //批次信息 + pageDto.setBatchDto(dto); + return pageDto; + } + + @Override + public Boolean initPlanBatchNumToCache() { + String endTime = DateUtil.now(); + int count = atuPlanBatchService.countPlanMaxBatch(endTime); + if (count <= 0){ + logger.debug("无计划批次信息需要初始化"); + return true; + } + int totalBatches = NumberUtil.ceilDiv(count, PlanConstant.EXECUTOR_MAX_PROCESS_NUM); + for (int i = 0; i < totalBatches; i++) { + int fromIndex = i * PlanConstant.EXECUTOR_MAX_PROCESS_NUM; + int toIndex = Math.min(fromIndex + PlanConstant.EXECUTOR_MAX_PROCESS_NUM, count); + executor.execute(() -> { + List planBatchSubList = atuPlanBatchService.queryPlanMaxBatchNumList(endTime, fromIndex, toIndex); + for (AtuPlanBatch planBatch : planBatchSubList) { + redisTemplate.opsForValue().setIfAbsent(RedisConstant.PLAN_BATCH_NUM_KEY + planBatch.getPlanId(), + planBatch.getBatch()); + } + }); + } + return true; + } + + @Override + public ResponseVO clearPlanReport() { + if (planReportSaveDay == null) { + throw new InvalidException("报告保存天数没有配置"); + } +// if (planReportSaveDay < 30) { +// throw new InvalidException("报告保存天数必须大于30天"); +// } + new Thread(() -> { + try { + logger.info("开始清理..."); + LocalDateTime localDateTime = LocalDateTime.now().minusDays(planReportSaveDay); + List batchList = atuPlanBatchService.queryNeedClearBatch(localDateTime); + List batchIds = batchList.stream().map(AtuPlanBatch::getId).collect(Collectors.toList()); + List taskList = planTaskService.queryTasksByBatchIds(batchIds); + // 删除任务以及附件信息 + List deletedFilePath = new ArrayList<>(); + List sceneCaseTaskIdList = new ArrayList<>(); + logger.info("开始处理任务附件"); + taskList.forEach(task -> { + if (task.getCaseType().equals("5")) { + sceneCaseTaskIdList.add(task.getId()); + } + String perDataPath = task.getPerDataPath(); + if (StringUtils.isNotBlank(perDataPath)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(perDataPath)[1]); + } + String videoUrl = task.getVideoUrl(); + if (StringUtils.isNotBlank(videoUrl)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(videoUrl)[1]); + } + String execResultFile = task.getExecResultFile(); + if (StringUtils.isNotBlank(execResultFile)) { + deletedFilePath.add(execResultFile); + getActualImagePath(deletedFilePath, execResultFile, task.getBatchId(), batchIds); + } + }); + List atuPlanSceneCaseTaskList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(sceneCaseTaskIdList)) { + atuPlanSceneCaseTaskList = atuPlanSceneCaseTaskService.querySceneCaseTasksByTaskIds(sceneCaseTaskIdList); + logger.info("开始处理场景任务附件"); + atuPlanSceneCaseTaskList.forEach(atuPlanSceneCaseTask -> { + String videoUrl = atuPlanSceneCaseTask.getVideoUrl(); + if (StringUtils.isNotBlank(videoUrl)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(videoUrl)[1]); + } + String perDataPath = atuPlanSceneCaseTask.getPerDataPath(); + if (StringUtils.isNotBlank(perDataPath)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(perDataPath)[1]); + } + String execResultFile = atuPlanSceneCaseTask.getExecResultFile(); + if (StringUtils.isNotBlank(execResultFile)) { + deletedFilePath.add(execResultFile); + String taskId = atuPlanSceneCaseTask.getTaskId(); + String currentBatchId = taskList.stream().filter(t -> t.getId().equals(taskId)).map(AtuPlanTask::getBatchId).findFirst().get(); + getActualImagePath(deletedFilePath, execResultFile, currentBatchId, batchIds); + } + }); + } + logger.info("开始处理批次附件"); + batchList.forEach(atuPlanBatch -> { + String perDataPath = atuPlanBatch.getPerDataPath(); + if (StringUtils.isNotBlank(perDataPath)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(perDataPath)[1]); + } + }); + atuPlanBatchService.updateAttachmentClearStatusByIds(batchIds); + // 删除文件 + logger.info("开始请求文件服务,附件关联为-1"); + if (!CollectionUtils.isEmpty(deletedFilePath)) { + AssociatedFilesDto associatedFilesDto = new AssociatedFilesDto(); + associatedFilesDto.setObjId("-1"); + associatedFilesDto.setFileIds(deletedFilePath); + attachmentFeignClient.associatedFiles(associatedFilesDto); + } + } catch (Exception e) { + logger.error("文件处理异常", e); + } + }).start(); + ResponseVO responseVO = new ResponseVO<>(); + responseVO.setCode(BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS); + responseVO.setMessage("正在进行清理"); + return responseVO; + } + + /** + * 获取实际截图地址 + * @param deletedFilePath 待删除文件地址 + * @param execResultFile 执行结果文件地址 + * @param currentBatchId 当前任务批次id + * @param batchIds 本次清理的批次集合,发生异常时需要从集合中移除当前批次Id + */ + private void getActualImagePath(List deletedFilePath, String execResultFile, String currentBatchId, List batchIds) { + InputStream inputStream = null; + try { + inputStream = simpleStorageService.downloadAsStream(NKSecurityContext.getTenantId(), execResultFile); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + List actualImgUriList = new ArrayList<>(); + String line = null; + while ((line = bufferedReader.readLine()) != null) { + StepExecuteResult stepExecuteResult = JSONUtil.toBean(line, StepExecuteResult.class); + String actualImgUri = stepExecuteResult.getActualImgUri(); + if (StringUtils.isNotBlank(actualImgUri)) { + try { + actualImgUriList.add("/" + MinioPathUtils.idToPath(actualImgUri)[1]); + } catch (Exception e) { + logger.error("实际截图文件路径异常:{}", actualImgUri, e); + } + } + } + deletedFilePath.addAll(actualImgUriList); + } catch (FileDownloadException e) { + logger.error("文件下载异常", e); + if (e.getCause() instanceof SeaweedfsFileNotFoundException) { + logger.info("文件不存在,标记清除"); + } else { + batchIds.remove(currentBatchId); + } + } catch (IOException e) { + logger.error("文件流读取异常", e); + batchIds.remove(currentBatchId); + } + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanInfoApiService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanInfoApiService.java new file mode 100644 index 0000000..ce953b4 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanInfoApiService.java @@ -0,0 +1,192 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api.service; + +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.db.excel.ExcelService; +import net.northking.cctp.common.dto.AdvancedQueryOptions; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.dto.planBatch.BatchAppInfoDto; +import net.northking.cctp.executePlan.dto.planBatch.BatchScriptReportDto; +import net.northking.cctp.executePlan.dto.planInfo.*; +import net.northking.cctp.executePlan.dto.planScript.*; +import net.northking.cctp.executePlan.pub.dto.TestPlanScriptExecutionDetailDTO; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 执行计划表Restful逻辑接口 + * @author maven-cctp-plugin + * @since 1.0 + */ +public interface AtuPlanInfoApiService extends ExcelService +{ + /** + * 查询执行计划表列表 + * + * @param queryByPage 查询条件 + * @return 查询结果列表 + */ + Pagination pagingQuery(QueryByPage queryByPage); + + + + /** + * 获取执行计划表 + * @param uuid 主键 + * @return 接口数据传输对象 + */ + AtuPlanInfoDetailDto findByPK(String uuid); + + /** + * 删除执行计划表 + * @param uuid 主键 + * @return 删除的记录数量 + */ + Integer deleteByPK(String uuid); + + /** + * 计划执行 + * @param atuPlanRunDto 执行参数 + */ + void run(AtuPlanRunDto atuPlanRunDto); + + /** + * 批量克隆 + * + * @param batch 集合 + * @return 成功的数量 + */ + Integer clonePlan(List batch); + + /** + * 校验计划设备是否离线 + * @param planId 计划Id + * @param batchId 批次ID + */ + Map checkDeviceOffline(String planId, String batchId); + + /** + * 更新计划下一次执行时间 + * @param planInfo 计划信息 + * @return 更新结果 + */ + Boolean updatePlanNextRunTime(AtuPlanInfo planInfo); + + String clonePlanInfo(String planId); + + AtuPlanInfoAppAndDeviceDto queryPlanAppAndDevice(String planId); + + + Integer updatePlanEnable(AtuPlanInfo atuPlanInfo); + + List> queryTaskLive(String taskId); + + Boolean isUse(List params); + + + /** + * 创建委托信息 + * @param planId 计划ID + * @param priority 优先级 + * @param batchId 批次ID + * @param hasOfflineDevice 是否含有离线设备 + * @param caseMap 类型集合 + * @param isRetry 是否重试 + */ + void handlePlanDevice(String planId, String priority, String batchId, + boolean hasOfflineDevice, Map caseMap, boolean isRetry); + + /** + * 根据批次id查询计划信息 + * @param batchId 批次id + * @return 计划信息 + */ + AtuPlanInfo findByBatchId(String batchId); + + /** + * 处理判断自动化类型 + * @param scriptType 脚本类型 + * @param caseMap 自动化类型 + */ + void handleAutoType(String scriptType, Map caseMap); + + String selectScriptByPlan(AtuPlanScriptDto dto); + + String savePlanScript(AtuPlanScriptSaveDto dto); + + String savePlanData(AtuPlanInfoAddDto dto); + + AtuPlanScriptResultDto queryLinkMdPage(String planId); + + Integer deletePlanScriptLinkMd(AtuPlanScriptDeleteDto dto); + + List queryPlanScriptList(String planId); + + Integer updatePlanStatus(String planId); + + Boolean checkScript(List ids); + + AtuPlanScriptPageDto queryScriptPage(QueryByPage queryByPage); + + /** + * 计划批次报告查询 + * @param batchId 批次id + * @return 结果 + */ + BatchScriptReportDto queryPlanBatchReport(String batchId); + + String updatePrincipal(AtuPlanPrincipalDto dto); + + /** + * 导出执行结果 + * @param response 返回体 + * @param batchId 批次号 + */ + void exportBatchExecResult(HttpServletResponse response, String batchId); + + /** + * 导出报告 + * @param response 返回体 + * @param exportDto 导出参数 + */ + void exportBatchReport(HttpServletResponse response, AtuPlanExportDto exportDto); + + /** + * 根据最后批次id更新计划状态 + * @param lastBatchId 最后批次id + * @param planStatus 计划状态 + * @return 结果 + */ + int updateStatusByLastBatchId(String lastBatchId, String planStatus); + + /** + * 下载app性能文件数据 + * @param tenantId 租户id + * @param filePath 文件地址 + * @return 结果集 + */ + List downloadAppProInfoList(String tenantId, String filePath); + + /** + * 校验数据集是否被计划使用 + * @param scriptIdList + * @return + */ + Boolean checkDataSetUsedByScriptIdList(List scriptIdList); + + Pagination pageUpFrontPlan(QueryByPage queryByPage); + + /** + * ATS获取执行计划中脚本执行情况 + * @return + */ + List scriptExecutionDetail(); + + AdvancedQueryOptions advancedQueryOptions(String projectId); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanInfoApiServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanInfoApiServiceImpl.java new file mode 100644 index 0000000..6101f57 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanInfoApiServiceImpl.java @@ -0,0 +1,3356 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api.service; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.BetweenFormatter; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.thread.ExecutorBuilder; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.ExcelWriter; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson2.JSON; +import com.github.pagehelper.page.PageMethod; +import com.google.common.collect.Sets; +import com.hzbank.testteam.autotest.dependencies.authDependency.utils.RequestUtil; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.constants.BaseDefineDependencyConstants; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.dto.TagDto; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.entity.Environment; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.exception.InvalidException; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import com.hzbank.testteam.autotest.dependencies.monsterDependency.dto.TestGroupDTO; +import com.hzbank.testteam.autotest.dependencies.monsterDependency.dto.TestGroupUserDTO; +import com.hzbank.testteam.autotest.dependencies.monsterDependency.dto.UserDTO; +import com.itextpdf.text.*; +import com.itextpdf.text.pdf.*; +import net.northking.cctp.common.cache.EntityNameCache; +import net.northking.cctp.common.cache.EntityNameCatalog; +import net.northking.cctp.common.db.*; +import net.northking.cctp.common.db.annotation.DatabaseReadOnly; +import net.northking.cctp.common.db.annotation.DatabaseWriteOnly; +import net.northking.cctp.common.db.excel.AbstractExcelService; +import net.northking.cctp.common.db.excel.ExcelHeader; +import net.northking.cctp.common.dto.AdvancedQueryOptions; +import net.northking.cctp.common.dto.AssociatedFilesDto; +import net.northking.cctp.common.dto.CpLogAddDto; +import net.northking.cctp.common.dto.UserOptions; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.common.feign.ApiAtsEnviromentFeign; +import net.northking.cctp.common.feign.MonsterCommonFeignClient; +import net.northking.cctp.common.feign.MonsterLogServer; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.common.s3.FileDownloadException; +import net.northking.cctp.common.s3.SimpleStorageService; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.executePlan.api.third.feilang.dto.FeiLangUserDto; +import net.northking.cctp.executePlan.bus.log.LogPublisher; +import net.northking.cctp.executePlan.config.WebhookConfig; +import net.northking.cctp.executePlan.constants.*; +import net.northking.cctp.executePlan.db.entity.*; +import net.northking.cctp.executePlan.db.service.*; +import net.northking.cctp.executePlan.dto.planBatch.*; +import net.northking.cctp.executePlan.dto.planEntrust.AtuEntrustMsgDto; +import net.northking.cctp.executePlan.dto.planEntrust.DeviceListDto; +import net.northking.cctp.executePlan.dto.planEntrust.EngineInfoListDto; +import net.northking.cctp.executePlan.dto.planEntrust.EntrustDeviceDto; +import net.northking.cctp.executePlan.dto.planInfo.*; +import net.northking.cctp.executePlan.dto.planScript.*; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanInputDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanInputQueryDto; +import net.northking.cctp.executePlan.dto.planTask.AtuScriptDetailDto; +import net.northking.cctp.executePlan.dto.planTask.ScriptInputFileDto; +import net.northking.cctp.executePlan.enums.MobilePlatformEnum; +import net.northking.cctp.executePlan.exception.ExecPlanError; +import net.northking.cctp.executePlan.feign.*; +import net.northking.cctp.executePlan.feign.dto.*; +import net.northking.cctp.executePlan.pub.dto.ScriptFirstExecutionDTO; +import net.northking.cctp.executePlan.pub.dto.TestPlanScriptExecutionDetailDTO; +import net.northking.cctp.executePlan.quartz.ScheduleUtils; +import net.northking.cctp.executePlan.utils.EnvNameUtils; +import net.northking.cctp.executePlan.utils.MinioPathUtils; +import net.northking.cctp.executePlan.utils.PercentageCalculatorUtil; +import org.apache.commons.lang.StringUtils; +import org.quartz.CronExpression; +import org.quartz.Scheduler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.AmqpAdmin; +import org.springframework.amqp.core.AmqpTemplate; +import org.springframework.amqp.core.Queue; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.time.LocalDate; +import java.util.List; +import java.util.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * 执行计划表服务实现类 + * + * @author maven-cctp-plugin + * @since 1.0 + */ + +@Service +public class AtuPlanInfoApiServiceImpl extends AbstractExcelService implements AtuPlanInfoApiService +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(AtuPlanInfoApiServiceImpl.class); + + @Autowired + private AtuPlanInfoService atuPlanInfoService; + + @Autowired + private PlatformFeignClient platformFeignClient; + + @Autowired + private ApiMonsterCommonService monsterCommonService; + + @Autowired + private AtuPlanBatchService atuPlanBatchService; + + @Autowired + private AtuPlanScriptLinkService planScriptLinkService; + + @Autowired + private AtuPlanDeviceLinkService atuPlanDeviceLinkService; + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private AtuPlanAppLinkService atuPlanAppLinkService; + + @Autowired + private AtuPlanTaskApiService atuPlanTaskApiService; + + @Autowired + private AtuPlanSceneCaseTaskService atuPlanSceneCaseTaskService; + + @Autowired + private AtuPlanBatchDeviceLinkService atuPlanBatchDeviceLinkService; + + @Autowired + private AmqpAdmin amqpAdmin; + + @Autowired + private ScriptCaseFeignClient scriptCaseFeignClient; + + @Autowired + private AmqpTemplate amqpTemplate; + + @Autowired + private PublicFeignClient publicFeignClient; + + @Autowired + private DeviceFeignClient deviceFeignClient; + + @Autowired + private WebhookConfig webhookConfig; + + @Autowired + private SchedulerFactoryBean factoryBean; + + @Autowired + private EntityNameCache entityNameCache; + + @Autowired + private LogPublisher logPublisher; + + @Autowired + private AtuPlanEnvLinkService planEnvLinkService; + + @Autowired + private SimpleStorageService simpleStorageService; + + @Autowired + private AtuPlanScriptLinkMdService planScriptLinkMdService; + + + @Autowired + private EnvNameUtils envNameUtils; + + @Autowired + private ApiMonsterDictService apiMonsterDictService; + + @Autowired + private ApiTagService apiTagService; + + @Autowired + private ApiAtsEnviromentFeign apiAtsEnviromentFeign; + + @Autowired + MonsterCommonFeignClient monsterCommonFeignClient; + @Autowired + private AttachmentFeignClient attachmentFeignClient; + /** + * 单次删除最大数量 + */ + public static final int DELETE_MAX_NUM = 500; + + public static final int EXECUTOR_CORE_POOL_SIZE = 2 * 2 + 2; + public static final int EXECUTOR_MAX_POOL_SIZE = 20; + public static final int EXECUTOR_LINKED_BLOCKING_SIZE = 50; + + private static final ExecutorService executor = ExecutorBuilder.create() + .setCorePoolSize(EXECUTOR_CORE_POOL_SIZE) + .setMaxPoolSize(EXECUTOR_MAX_POOL_SIZE) + .setWorkQueue(new LinkedBlockingDeque<>(EXECUTOR_LINKED_BLOCKING_SIZE)) + .build(); + + public AtuPlanInfoApiServiceImpl() { + } + + @Override + public BasicService getService() + { + return this.atuPlanInfoService; + } + + @Override + public ExcelHeader[] excelHeaders() + { + ExcelHeader id = new ExcelHeader("主键", "id", String.class); + ExcelHeader tenantId = new ExcelHeader("租户主键", "tenantId", String.class); + ExcelHeader projectId = new ExcelHeader("系统主键", "projectId", String.class); + ExcelHeader planName = new ExcelHeader("计划名称", "planName", String.class); + ExcelHeader planDesc = new ExcelHeader("计划描述", "planDesc", String.class); + ExcelHeader enabled = new ExcelHeader("是否启用;0-否,1-是", "enabled", Boolean.class); + ExcelHeader status = new ExcelHeader("状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消", "status", String.class); + ExcelHeader appSet = new ExcelHeader("应用设置;1-清除数据,2-卸载安装", "appSet", String.class); + ExcelHeader screenRecordSet = new ExcelHeader("录屏设置;0-不保存,1-全部保存,2-出错保存", "screenRecordSet", String.class); + ExcelHeader screenshotSet = new ExcelHeader("截图设置;0-不保存,1-全部保存,2-出错保存", "screenshotSet", String.class); + ExcelHeader priority = new ExcelHeader("优先级;0-低,1-高", "priority", String.class); + ExcelHeader cronExpr = new ExcelHeader("Cron表达式", "cronExpr", String.class); + ExcelHeader upFrontPlanId = new ExcelHeader("前置计划ID", "upFrontPlanId", String.class); + ExcelHeader webhookUrl = new ExcelHeader("触发链接", "webhookUrl", String.class); + ExcelHeader webhookToken = new ExcelHeader("密保令牌", "webhookToken", String.class); + ExcelHeader sendMail = new ExcelHeader("是否发送邮件;0-否,1-是", "sendMail", Boolean.class); + ExcelHeader mailAddress = new ExcelHeader("邮件地址;当需要发送邮件时不能为空", "mailAddress", String.class); + ExcelHeader failRetry = new ExcelHeader("是否失败重试;0-否,1-是", "failRetry", Boolean.class); + ExcelHeader failRetryCount = new ExcelHeader("失败重试次数", "failRetryCount", Integer.class); + ExcelHeader failCreatePlan = new ExcelHeader("是否失败生成计划;0-否,1-是", "failCreatePlan", Boolean.class); + ExcelHeader lastExecTime = new ExcelHeader("最近执行时间", "lastExecTime", Date.class); + ExcelHeader nextExecTime = new ExcelHeader("下次执行时间", "nextExecTime", Date.class); + ExcelHeader lastBatchId = new ExcelHeader("最后批次号", "lastBatchId", String.class); + ExcelHeader waitingNum = new ExcelHeader("最后批次等待中任务数", "waitingNum", Integer.class); + ExcelHeader runningNum = new ExcelHeader("最后批次执行中任务数", "runningNum", Integer.class); + ExcelHeader successNum = new ExcelHeader("最后批次成功任务数", "successNum", Integer.class); + ExcelHeader execFailNum = new ExcelHeader("最后批次执行失败任务数", "execFailNum", Integer.class); + ExcelHeader assertFailNum = new ExcelHeader("最后批次断言失败任务数", "assertFailNum", Integer.class); + ExcelHeader timeoutNum = new ExcelHeader("最后批次超时任务数", "timeoutNum", Integer.class); + ExcelHeader cancelNum = new ExcelHeader("最后批次取消任务数", "cancelNum", Integer.class); + ExcelHeader createdBy = new ExcelHeader("创建人", "createdBy", String.class); + ExcelHeader createdTime = new ExcelHeader("创建时间", "createdTime", Date.class); + ExcelHeader updatedBy = new ExcelHeader("更新人", "updatedBy", String.class); + ExcelHeader updatedTime = new ExcelHeader("更新时间", "updatedTime", Date.class); + ExcelHeader deleted = new ExcelHeader("是否删除;0-否,1-是", "deleted", Boolean.class); + + return new ExcelHeader[]{}; + } + + /** + * Excel导入,入库之前的处理 + * @param records 从Excel读取到的记录 + * @return 待入库的记录 + */ + @Override + protected List beforeInsertBatch(List records) + { + for (AtuPlanInfo record : records) + { + record.setId(UUIDUtil.create32UUID()); + } + return records; + } + + /** + * 写入Excel之前的处理
+ * 数据的特殊处理在此处加工处理 + * + * @param record 来自数据库记录 + * @return 待写入Excel的记录 + */ + @Override + protected AtuPlanInfo beforeWriteExcel(AtuPlanInfo record) + { + return record; + } + + @Override + public Pagination pagingQuery(QueryByPage queryByPage) + { + queryByPage.getQuery().setTenantId(NKSecurityContext.getTenantId()); + buildQueryPage(queryByPage); + OrderBy sort = queryByPage.toSqlOrderBy(); + if (sort != null && sort.isNotEmpty() && org.springframework.util.StringUtils.hasText(sort.toString())) { + PageMethod.orderBy(sort.toString()); + } + Pagination query = this.atuPlanInfoService.queryPlanInfoPage(queryByPage); + for (AtuPlanInfoDetailDto record : query.getRecords()) { + String projectName = entityNameCache.translateById(EntityNameCatalog.MONSTER_SYSTEM, record.getProjectId()); + String principalName = entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, record.getPrincipalId()); + record.setProjectName(projectName); + record.setLastBatchScriptSumMap(getBatchScriptSumData(record)); + record.setPrincipalId(principalName); + String createdBy = entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, record.getCreatedBy()); + String updatedBy = entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, record.getUpdatedBy()); + record.setCreatedBy(createdBy); + record.setUpdatedBy(updatedBy); + //判断是否有下一次执行时间 + if (record.getHasCorn()) { + Date date = ScheduleUtils.getNextOneTriggerTime(record.getCronExpr()); + if (date == null) { + AtuPlanInfo atuPlanInfo = new AtuPlanInfo(); + atuPlanInfo.setId(record.getId()); + atuPlanInfo.setNextExecTime(null); + this.atuPlanInfoService.updatePlanNextExecTime(atuPlanInfo); + record.setNextExecTime(null); + } + } + } + return query; + } + + private void buildQueryPage(QueryByPage queryByPage) { + AtuPlanInfoQueryDto query = queryByPage.getQuery(); + if (!StringUtils.isEmpty(query.getPrincipal())) { + List principalIds = getUserIds(query.getPrincipal()); + if (!CollectionUtil.isEmpty(principalIds)) { + query.setPrincipalIds(principalIds); + } else { + principalIds.add("-1"); + query.setPrincipalIds(principalIds); + } + } + + if (!StringUtils.isEmpty(query.getCreator())) { + List createBys = getUserIds(query.getCreator()); + if (!CollectionUtils.isEmpty(createBys)) { + query.setCreateBys(createBys); + } else { + createBys.add("-1"); + query.setCreateBys(createBys); + } + } + //创建时间--时间区间 修改时间--时间区间 + String createdTimeStart = query.getCreatedTimeStart(); + if (!StringUtils.isEmpty(createdTimeStart)) { + Date startCreatedTime = null; + try { + startCreatedTime = net.northking.cctp.common.util.DateUtil.parse(createdTimeStart+" 00:00:00","yyyy-MM-dd HH:ss:mm"); + + } catch (ParseException e) { + logger.error("时间转换异常,createdTimeStart,{},e,{}",createdTimeStart,e.getMessage()); + throw new PlatformRuntimeException(ExecPlanError.PARSE_DATE_ERROR); + } + query.setStartCreatedTime(startCreatedTime); + } + String createdTimeEnd = query.getCreatedTimeEnd(); + if (!StringUtils.isEmpty(createdTimeEnd)) { + Date endCreatedTime = null; + try { + endCreatedTime = net.northking.cctp.common.util.DateUtil.parse(createdTimeEnd +" 23:59:59","yyyy-MM-dd HH:ss:mm"); + + } catch (ParseException e){ + logger.error("时间转换异常,createdTimeEnd,{},e,{}",createdTimeEnd,e.getMessage()); + throw new PlatformRuntimeException(ExecPlanError.PARSE_DATE_ERROR); + } + query.setEndCreatedTime(endCreatedTime); + } + // 更新时间 + String updatedTimeStart = query.getUpdatedTimeStart(); + if (!StringUtils.isEmpty(updatedTimeStart)) { + Date startUpdatedTime = null; + try{ + startUpdatedTime = net.northking.cctp.common.util.DateUtil.parse(updatedTimeStart+" 00:00:00","yyyy-MM-dd HH:ss:mm"); + }catch (ParseException e){ + logger.error("时间转换异常,updatedTimeStart,{},e,{}",updatedTimeStart,e.getMessage()); + throw new PlatformRuntimeException(ExecPlanError.PARSE_DATE_ERROR); + } + query.setStartUpdatedTime(startUpdatedTime); + } + String updatedTimeEnd = query.getUpdatedTimeEnd(); + if (!StringUtils.isEmpty(updatedTimeEnd)) { + Date endUpdatedTime = null; + try { + endUpdatedTime = net.northking.cctp.common.util.DateUtil.parse(updatedTimeEnd+" 23:59:59","yyyy-MM-dd HH:ss:mm"); + } catch (ParseException e) { + logger.error("时间转换异常,updatedTimeEnd,{},e,{}",updatedTimeEnd,e.getMessage()); + throw new PlatformRuntimeException(ExecPlanError.PARSE_DATE_ERROR); + } + query.setEndUpdatedTime(endUpdatedTime); + } + + } + + /** + * 查询人名可带正则表达式 + * @param userName + * @return + */ + private List getUserIds(String userName) { + UserQueryDto example = new UserQueryDto(); + if(userName.contains(",")||userName.contains(",")){ + userName = userName.replace(",","|") + .replace(",","|") + .replace("(","\\(") + .replace(")","\\)"); + example.setUserChnNames(userName); + }else{ + example.setUserChnName(userName); + } + example.setTenantId(NKSecurityContext.getTenantId()); + List userIds = platformFeignClient.selectUserId(example); + if (userIds == null) { + userIds = new ArrayList<>(); + } + return userIds; + } + + + + @Override + @DatabaseReadOnly + public AtuPlanInfoDetailDto findByPK(String uuid) + { + AtuPlanInfo example = new AtuPlanInfo(); + example.setId(uuid); + //查询基本信息 + List entities = this.atuPlanInfoService.query(example); + if (entities.isEmpty()) + { + return null; + } + AtuPlanInfoDetailDto dto = new AtuPlanInfoDetailDto(); + //查询主表关联的脚本 + AtuPlanScriptLink scriptLink = new AtuPlanScriptLink(); + scriptLink.setPlanId(uuid); + List scriptList = this.planScriptLinkService.query(scriptLink); + List insertList = new ArrayList<>(); + List resultDto = new ArrayList<>(); + List idList = new ArrayList<>(); + AtomicBoolean isMobile = new AtomicBoolean(false); + if (scriptList.size()>0) { + scriptList.forEach(one -> { + //新增到副表的数据 + AtuPlanScriptLinkMd linkMd = new AtuPlanScriptLinkMd(); + BeanUtils.copyProperties(one, linkMd); + linkMd.setUserId(NKSecurityContext.getUserId()); + //返现数据 脚本内不执行的测试意图 + AtuPlanScriptLinkDto linkDto = new AtuPlanScriptLinkDto(); + BeanUtils.copyProperties(linkMd, linkDto); + resultDto.add(linkDto); + insertList.add(linkMd); + idList.add(one.getScriptId()); + if (one.getScriptType().equals(PlanConstant.SCRIPT_TYPE_ANDROID) || + one.getScriptType().equals(PlanConstant.SCRIPT_TYPE_IOS) || + one.getScriptType().equals(PlanConstant.SCRIPT_TYPE_SCENE)){ + isMobile.set(true); + } + }); + //删除原来的md表的数据 + AtuPlanScriptLinkMd linkMd = new AtuPlanScriptLinkMd(); + linkMd.setUserId(NKSecurityContext.getUserId()); + linkMd.setPlanId(uuid); + this.planScriptLinkMdService.deleteByExample(linkMd); + //把数据加到md表 + this.planScriptLinkMdService.insertMdBatch(insertList); + } + //复制数据 + BeanUtils.copyProperties(entities.get(0), dto); + dto.setPlanScriptResultDto(queryScriptData(idList, resultDto)); + dto.setLastBatchScriptSumMap(getBatchScriptSumData(dto)); + //查询关联环境 + AtuPlanEnvLink envLink = new AtuPlanEnvLink(); + envLink.setPlanId(dto.getId()); + List resultLinks = this.planEnvLinkService.query(envLink); + if (resultLinks.size()>0){ + List envList = new ArrayList<>(); + for (AtuPlanEnvLink link : resultLinks) { + envList.add(link.getEnvId()); + } + dto.setEnvIdList(envList); + } + //查询飞狼用户中文名 + if(dto.getSendMail()&& + Objects.nonNull(dto.getMailAddress())&& + dto.getMailAddress().length()>0){ + List paramLoginNoList = new ArrayList<>(); + List resultList = new ArrayList<>(); + if(dto.getMailAddress().contains(",")){ + paramLoginNoList = Arrays.asList(dto.getMailAddress().split(",")); + }else{ + paramLoginNoList.add(dto.getMailAddress()); + } + ResponseVO> responseVO = monsterCommonService.queryUserInfoByLoginNo(paramLoginNoList); + if (!BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS.equals(responseVO.getCode())) { + logger.info("查询发送飞狼用户信息失败" + responseVO.getMessage()); + throw new InvalidException("查询发送飞狼用户信息失败"); + } + Map userInfoList = responseVO.getData(); + if (!CollectionUtils.isEmpty(userInfoList)) { + for (String key : userInfoList.keySet()) { + FeiLangUserDto feiLangUserDto = new FeiLangUserDto(); + feiLangUserDto.setLoginNo(key); + feiLangUserDto.setUserChnName(userInfoList.get(key)); + resultList.add(feiLangUserDto); + } + } + dto.setFeiLangUserDtoList(resultList); + } + // 查询应用编号 + if (isMobile.get()){ + AtuPlanAppLink appLink = new AtuPlanAppLink(); + appLink.setPlanId(dto.getId()); + List appLinks = atuPlanAppLinkService.query(appLink); + if (CollUtil.isNotEmpty(appLinks)){ + List appIdList = appLinks.stream().map(AtuPlanAppLink::getAppId).collect(Collectors.toList()); + dto.setAppIdList(appIdList); + } + } + return dto; + } + + @Override + @DatabaseWriteOnly + public Integer deleteByPK(String uuid) { + AtuPlanInfo entity = this.atuPlanInfoService.findByPrimaryKey(uuid); + if (entity.getStatus().equals(PlanConstant.PLAN_WAITING_STATUS) + || entity.getStatus().equals(PlanConstant.PLAN_EXECUTING_STATUS)) { + throw new PlatformRuntimeException(ExecPlanError.PLAN_STATUS_CANNOT_DELETE); + } + entity.setDeleted(true); + int row = this.atuPlanInfoService.updateByPrimaryKey(entity); + //删除定时任务 + if (row > 0) { + Scheduler scheduler = factoryBean.getScheduler(); + if (ScheduleUtils.checkExists(scheduler, uuid)) { + ScheduleUtils.deleteJob(scheduler, uuid); + } + //发送队列:平台删除日志 + CpLogAddDto cpLogAddDto = new CpLogAddDto(); + String proName = entityNameCache.translateById(EntityNameCatalog.MONSTER_SYSTEM, entity.getProjectId()); + cpLogAddDto.setContent("【删除执行计划】系统:" + proName + ",计划名称:" + entity.getPlanName()); + cpLogAddDto.setModule(MsgConstant.EXE_PLAN); + cpLogAddDto.setType(MsgConstant.LOG_DELETE); + logPublisher.deployLogContent(cpLogAddDto); + MonsterLogServer.sendLogToMonster(cpLogAddDto); + logger.debug("删除批次和任务信息"); + executor.execute(() -> { + logger.debug("异步删除批次和任务信息"); + int taskTotal = atuPlanTaskApiService.countByPlanId(uuid); + logger.debug("任务总数:{}", taskTotal); + int sceneTaskTotal = atuPlanSceneCaseTaskService.countByPlanId(uuid); + logger.debug("场景节点任务总数:{}", sceneTaskTotal); + + // 计算需要分几次删除 + logger.debug("单次最大删除数据量:{}", DELETE_MAX_NUM); + int num; + if (taskTotal > 0) { + logger.debug("删除任务信息"); + List tasks = atuPlanTaskApiService.getTasksByPlanId(uuid); + num = NumberUtil.ceilDiv(taskTotal, DELETE_MAX_NUM); + List deletedFilePath = new ArrayList<>(); + List taskIds = new ArrayList<>(); + tasks.forEach(task -> { + taskIds.add(task.getId()); + String execResultFile = task.getExecResultFile(); + if (StringUtils.isNotBlank(execResultFile)){ + deletedFilePath.add(execResultFile); + atuPlanTaskApiService.getActualImagePath(deletedFilePath, execResultFile); + } + String perDataPath = task.getPerDataPath(); + if (StringUtils.isNotBlank(perDataPath)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(perDataPath)[1]); + } + String videoUrl = task.getVideoUrl(); + if (StringUtils.isNotBlank(videoUrl)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(videoUrl)[1]); + } + // 场景用例脚本json是单独的需要删除 + if (task.getCaseType().equals("5")) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(task.getScriptJson())[1]); + } + }); + if (!CollectionUtils.isEmpty(taskIds)) { + List atuPlanSceneCaseTaskList = atuPlanSceneCaseTaskService.querySceneCaseTasksByTaskIds(taskIds); + atuPlanSceneCaseTaskList.forEach(atuPlanSceneCaseTask -> { + String videoUrl = atuPlanSceneCaseTask.getVideoUrl(); + if (StringUtils.isNotBlank(videoUrl)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(videoUrl)[1]); + } + String perDataPath = atuPlanSceneCaseTask.getPerDataPath(); + if (StringUtils.isNotBlank(perDataPath)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(perDataPath)[1]); + } + String execResultFile = atuPlanSceneCaseTask.getExecResultFile(); + if (StringUtils.isNotBlank(execResultFile)) { + deletedFilePath.add(execResultFile); + atuPlanTaskApiService.getActualImagePath(deletedFilePath, execResultFile); + } + }); + } + if (!CollectionUtils.isEmpty(deletedFilePath)) { + AssociatedFilesDto associatedFilesDto = new AssociatedFilesDto(); + associatedFilesDto.setObjId("-1"); + associatedFilesDto.setFileIds(deletedFilePath); + attachmentFeignClient.associatedFiles(associatedFilesDto); + } + for (; num > 0; num--) { + atuPlanTaskApiService.deleteByPlanIdLimit(uuid, DELETE_MAX_NUM); + } + } + if (sceneTaskTotal > 0) { + logger.debug("删除场景节点任务信息"); + num = NumberUtil.ceilDiv(sceneTaskTotal, DELETE_MAX_NUM); + for (; num > 0; num--) { + atuPlanSceneCaseTaskService.deleteByPlanIdLimit(uuid, DELETE_MAX_NUM); + } + } + logger.debug("删除批次信息"); + AtuPlanBatch planBatch = new AtuPlanBatch(); + planBatch.setPlanId(uuid); + List query = atuPlanBatchService.query(planBatch); + List deletedFilePath = new ArrayList<>(); + query.forEach(atuPlanBatch -> { + String perDataPath = atuPlanBatch.getPerDataPath(); + if (StringUtils.isNotBlank(perDataPath)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(perDataPath)[1]); + } + }); + if (!CollectionUtils.isEmpty(deletedFilePath)) { + AssociatedFilesDto associatedFilesDto = new AssociatedFilesDto(); + associatedFilesDto.setObjId("-1"); + associatedFilesDto.setFileIds(deletedFilePath); + attachmentFeignClient.associatedFiles(associatedFilesDto); + } + atuPlanBatchService.deleteByExample(planBatch); + }); + } + return row; + } + + /** + * 校验计划设备是否离线 + * + * @param planId 计划Id + * @return 批次ID + */ + @Override + public Map checkDeviceOffline(String planId, String batchId) { + // allOffline 0-在线,1-部分离线,2-全部离线 + Map result = new HashMap<>(); + if (StrUtil.isEmpty(batchId)) { + batchId = IdUtil.simpleUUID(); + } + result.put(PlanConstant.DEVICE_OFFLINE_KEY, PlanConstant.DEVICE_OFFLINE_PORTION); + result.put(PlanConstant.PLAN_BATCH_ID, batchId); + + AtuPlanDeviceLink deviceLinkParams = new AtuPlanDeviceLink(); + deviceLinkParams.setPlanId(planId); + List deviceLinkList = atuPlanDeviceLinkService.query(deviceLinkParams); + if (CollUtil.isEmpty(deviceLinkList)){ + throw new PlatformRuntimeException(ExecPlanError.PLAN_DEVICE_IS_NULL); + } + // 设备根据类型分类 + List deviceIdList = new ArrayList<>(); + Map> deviceTypeMap = new HashMap<>(); + for (AtuPlanDeviceLink deviceLink : deviceLinkList) { + deviceIdList.add(deviceLink.getDeviceId()); + String type = deviceLink.getDeviceType(); + if (StrUtil.isNotBlank(deviceLink.getPlatformType())){ + type = deviceLink.getPlatformType(); + } + List typeDeviceIdList = new ArrayList<>(); + if (deviceTypeMap.containsKey(type)){ + typeDeviceIdList = deviceTypeMap.get(type); + } + typeDeviceIdList.add(deviceLink.getDeviceId()); + deviceTypeMap.put(type, typeDeviceIdList); + } + + // 校验设备是否有离线 + List> offlineDeviceList = publicFeignClient.queryDeviceStatus(deviceIdList); + if (CollUtil.isEmpty(offlineDeviceList)){ + result.put(PlanConstant.DEVICE_OFFLINE_KEY, PlanConstant.DEVICE_OFFLINE_NO); + result.put(PlanConstant.PLAN_BATCH_ID, ""); + return result; + } + List offlineDeviceIdList = new ArrayList<>(); + AtomicBoolean offlineAll = new AtomicBoolean(false); + for (Map offlineDeviceMap : offlineDeviceList) { + String deviceId = offlineDeviceMap.get("deviceId").toString(); + deviceTypeMap.forEach((type, deviceList) -> { + deviceList.removeIf(deviceId::equals); + offlineDeviceIdList.add(deviceId); + if (CollUtil.isEmpty(deviceList)){ + offlineAll.set(true); + } + }); + } + if (offlineAll.get()){ + result.put(PlanConstant.DEVICE_OFFLINE_KEY, PlanConstant.DEVICE_OFFLINE_ALL); + result.put(PlanConstant.PLAN_BATCH_ID, ""); + return result; + } + // 将离线设备ID缓存-后续执行移除离线设备-过期时间1h + redisTemplate.opsForValue().set(RedisConstant.PLAN_BATCH_OFFLINE_DEVICE + batchId, + JSONUtil.toJsonStr(offlineDeviceIdList), + RedisConstant.PLAN_BATCH_OFFLINE_DEVICE_EXP_TIME, RedisConstant.PLAN_BATCH_OFFLINE_DEVICE_TIME_UNIT); + return result; + } + + @Override + public Boolean updatePlanNextRunTime(AtuPlanInfo planInfo) { + List nextTriggerTimes = ScheduleUtils.getNextTriggerTimes(planInfo.getCronExpr(), 2); + if (CollUtil.isEmpty(nextTriggerTimes)){ + return true; + } + Date nextOneTriggerTime; + if (ObjectUtil.isNull(planInfo.getLastExecTime())){ + nextOneTriggerTime = nextTriggerTimes.get(0); + }else { + long between = DateUtil.between(nextTriggerTimes.get(0), planInfo.getLastExecTime(), DateUnit.SECOND); + if (between > 0) { + nextOneTriggerTime = nextTriggerTimes.get(0); + } else { + if (nextTriggerTimes.size() >= 2) { + nextOneTriggerTime = nextTriggerTimes.get(1); + } else { + nextOneTriggerTime = nextTriggerTimes.get(0); + } + } + } + AtuPlanInfo update = new AtuPlanInfo(); + update.setId(planInfo.getId()); + update.setNextExecTime(nextOneTriggerTime); + int row = atuPlanInfoService.updateByPrimaryKey(update); + return row > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String clonePlanInfo(String planId) { + String uuid = UUIDUtil.create32UUID(); + //计划基本信息 + AtuPlanInfo planInfo = this.atuPlanInfoService.findByPrimaryKey(planId); + //计划名称 + String planName = getComNewName(planInfo); + if (planName.length() > 30){ + throw new PlatformRuntimeException(ExecPlanError.PLAN_NAME_OVERLONG, planInfo.getPlanName()); + } + //webhookUrl + if (!StringUtils.isEmpty(planInfo.getWebhookUrl())){ + String webhookUrl = planInfo.getWebhookUrl().replaceAll(planInfo.getId(), uuid); + planInfo.setWebhookUrl(webhookUrl); + } + planInfo.setId(uuid); + planInfo.setPlanName(planName); + planInfo.setWebhookToken(null); + planInfo.setLastBatchId(null); + planInfo.setLastExecTime(null); + planInfo.setNextExecTime(null); + planInfo.setWaitingNum(0); + planInfo.setRunningNum(0); + planInfo.setSuccessNum(0); + planInfo.setExecFailNum(0); + planInfo.setAssertFailNum(0); + planInfo.setTimeoutNum(0); + planInfo.setCancelNum(0); + planInfo.setStatus(PlanConstant.PLAN_NEW_STATUS); + Date date = new Date(); + planInfo.setCreatedBy(NKSecurityContext.getUserId()); + planInfo.setCreatedTime(date); + planInfo.setUpdatedBy(NKSecurityContext.getUserId()); + planInfo.setUpdatedTime(date); + this.atuPlanInfoService.insert(planInfo); + + // 计划关联环境 + AtuPlanEnvLink envLink = new AtuPlanEnvLink(); + envLink.setPlanId(planId); + List envLinkList = this.planEnvLinkService.query(envLink); + if (envLinkList != null && envLinkList.size() > 0){ + for (AtuPlanEnvLink atuPlanEnvLink : envLinkList) { + atuPlanEnvLink.setPlanId(uuid); + } + this.planEnvLinkService.insertByBatch(envLinkList); + } + // 计划关联脚本 + AtuPlanScriptLink scriptLink = new AtuPlanScriptLink(); + scriptLink.setPlanId(planId); + List scriptLinkList = this.planScriptLinkService.query(scriptLink); + if (scriptLinkList != null && scriptLinkList.size() > 0){ + for (AtuPlanScriptLink atuPlanScriptLink : scriptLinkList) { + atuPlanScriptLink.setPlanId(uuid); + } + this.planScriptLinkService.insertByBatch(scriptLinkList); + } + //计划关联的软件 + AtuPlanAppLink appLink = new AtuPlanAppLink(); + appLink.setPlanId(planId); + List appLinkList = this.atuPlanAppLinkService.query(appLink); + if (appLinkList.size() > 0) { + List appAddLink = new ArrayList<>(); + for (AtuPlanAppLink atuPlanAppLink : appLinkList) { + atuPlanAppLink.setId(UUIDUtil.create32UUID()); + atuPlanAppLink.setPlanId(uuid); + appAddLink.add(atuPlanAppLink); + } + this.atuPlanAppLinkService.insertByBatch(appAddLink); + } + + //计划关联的设备 + AtuPlanDeviceLink deviceLink = new AtuPlanDeviceLink(); + deviceLink.setPlanId(planId); + List deviceLinkList = this.atuPlanDeviceLinkService.query(deviceLink); + if (deviceLinkList.size() > 0) { + List deviceAddLink = new ArrayList<>(); + for (AtuPlanDeviceLink atuPlanDeviceLink : deviceLinkList) { + atuPlanDeviceLink.setId(UUIDUtil.create32UUID()); + atuPlanDeviceLink.setPlanId(uuid); + deviceAddLink.add(atuPlanDeviceLink); + } + this.atuPlanDeviceLinkService.insertByBatch(deviceAddLink); + } + + return uuid; + } + + @Override + public AtuPlanInfoAppAndDeviceDto queryPlanAppAndDevice(String planId) { + + AtuPlanInfoAppAndDeviceDto dto = new AtuPlanInfoAppAndDeviceDto(); + + AtuPlanAppLink appLink = new AtuPlanAppLink(); + appLink.setPlanId(planId); + List query = this.atuPlanAppLinkService.query(appLink); + dto.setAppList(query); + + AtuPlanDeviceLink deviceLink = new AtuPlanDeviceLink(); + deviceLink.setPlanId(planId); + deviceLink.setDeviceType(PlanConstant.DEVICE_TYPE_MOBILE); + List mobDeviceList = this.atuPlanDeviceLinkService.query(deviceLink); + dto.setMobDeviceList(mobDeviceList); + + deviceLink.setDeviceType(PlanConstant.DEVICE_TYPE_PC); + List pcDeviceList = this.atuPlanDeviceLinkService.query(deviceLink); + dto.setPcDeviceList(pcDeviceList); + + return dto; + } + + @Override + public Integer updatePlanEnable(AtuPlanInfo atuPlanInfo) { + int row = this.atuPlanInfoService.updateByPrimaryKey(atuPlanInfo); + AtuPlanInfo planInfo = this.atuPlanInfoService.findByPrimaryKey(atuPlanInfo.getId()); + if (row > 0){ + Scheduler scheduler = factoryBean.getScheduler(); + if (ScheduleUtils.checkExists(scheduler, planInfo.getId())){ + ScheduleUtils.deleteJob(scheduler, planInfo.getId()); + } + if (planInfo.getHasCorn() && planInfo.getEnabled()){ + ScheduleUtils.createScheduleJob(scheduler, planInfo); + // 更新下一次执行时间 + updatePlanNextRunTime(planInfo); + } + } + return row; + } + + @Override + public List> queryTaskLive(String taskId) { + List> mapList = new ArrayList<>(); + AtuPlanTask planTask = this.atuPlanTaskApiService.findByPrimaryKey(taskId); + //当前用例是否场景用例 + if (planTask.getCaseType().equals(PlanConstant.SCRIPT_TYPE_SCENE)) { + //查询场景用例的执行状态 + if (planTask.getStatus().equals(PlanConstant.TASK_START_EXECUTE_STATUS)){ + //执行中 + AtuPlanSceneCaseTask atuPlanSceneCaseTask = new AtuPlanSceneCaseTask(); + atuPlanSceneCaseTask.setTaskId(taskId); + atuPlanSceneCaseTask.setStatus("1"); + List query = this.atuPlanSceneCaseTaskService.query(atuPlanSceneCaseTask); + if (query.size()>0){ + if (PlanConstant.SCRIPT_TYPE_API.equals(query.get(0).getNodeType())){ + throw new PlatformRuntimeException(ExecPlanError.SCENE_NODE_INFO_ERROR); + } + Map map = new HashMap<>(); + map.put(MsgConstant.DEVICE_ID,query.get(0).getDeviceId()); + map.put(MsgConstant.TYPE,query.get(0).getNodeType()); + map.put(MsgConstant.STATUS,query.get(0).getStatus()); + map.put(MsgConstant.SCRIPT_NAME,query.get(0).getScriptName()); + String token = deviceFeignClient.queryDeviceToken(query.get(0).getDeviceId()); + map.put(MsgConstant.TOKEN,token); + mapList.add(map); + } + } else { + //执行完成 + AtuPlanSceneCaseTask atuPlanSceneCaseTask = new AtuPlanSceneCaseTask(); + atuPlanSceneCaseTask.setTaskId(taskId); + List query = this.atuPlanSceneCaseTaskService.query(atuPlanSceneCaseTask); + for (AtuPlanSceneCaseTask dto : query) { + if(!PlanConstant.SCRIPT_TYPE_API.equals(dto.getNodeType())){ + Map map = new HashMap<>(); + map.put(MsgConstant.TYPE,dto.getNodeType()); + map.put(MsgConstant.STATUS,dto.getStatus()); + map.put(MsgConstant.URL,dto.getVideoUrl()); + mapList.add(map); + } + } + } + }else { + Map map = new HashMap<>(); + if (planTask.getStatus().equals(PlanConstant.TASK_START_EXECUTE_STATUS)){ + //执行中 + map.put(MsgConstant.DEVICE_ID,planTask.getDeviceId()); + map.put(MsgConstant.TYPE,planTask.getCaseType()); + map.put(MsgConstant.STATUS,planTask.getStatus()); + String token = deviceFeignClient.queryDeviceToken(planTask.getDeviceId()); + map.put(MsgConstant.TOKEN,token); + } else { + //已完成 执行失败 断言失败 + map.put(MsgConstant.TYPE,planTask.getCaseType()); + map.put(MsgConstant.STATUS,planTask.getStatus()); + map.put(MsgConstant.URL,planTask.getVideoUrl()); + } + mapList.add(map); + } + return mapList; + } + + @Override + public Boolean isUse(List params) { + // TODO: 2023/8/31 绑定修改 + + return false; + } + + @Override + public String selectScriptByPlan(AtuPlanScriptDto dto) { + //feign调用 1、查询父节点下的脚本 2、场景脚本内关联的脚本 + Map queryMap = new HashMap<>(); + queryMap.put(MsgConstant.SCRIPT_LIST, dto.getScriptList()); + queryMap.put(MsgConstant.PARENT_LIST, dto.getParentList()); + ResultWrapper> wrapper = scriptCaseFeignClient.querySceneScript(queryMap); + //feign返回数据 + Map resultData = wrapper.getData(); + String planId = null; + if (StringUtils.isBlank(dto.getPlanId())) { + //新增 + planId = UUIDUtil.create32UUID(); + } else { + //编辑 + planId = dto.getPlanId(); + } + List scriptList = new ArrayList<>(); + List list = new ArrayList<>(); + HashMap scriptTypeMap = new HashMap<>(); + //场景脚本id + if (resultData.get(MsgConstant.SCENE_LIST) != null && resultData.get(MsgConstant.SCENE_LIST) != "") { + List sceneList = (List) resultData.get(MsgConstant.SCENE_LIST); + if (sceneList != null && sceneList.size() > 0) { + for (String sceneId : sceneList) { + AtuPlanScriptLinkMd insertData = new AtuPlanScriptLinkMd(); + insertData.setScriptId(sceneId); + insertData.setPlanId(planId); + insertData.setUserId(NKSecurityContext.getUserId()); + insertData.setScriptType("5");//场景脚本 + scriptList.add(sceneId); + scriptTypeMap.put(sceneId, "5"); + list.add(insertData); + } + } + } + //一般脚本 + if (resultData.get(MsgConstant.INSERT_LIST) != null && resultData.get(MsgConstant.INSERT_LIST) != "") { + List insertList = JSONObject.parseArray(JSONObject.toJSONString(resultData.get(MsgConstant.INSERT_LIST))).toJavaList(AtuScriptInfo.class); + if (insertList != null && insertList.size() > 0) { + for (AtuScriptInfo atuScriptInfo : insertList) { + AtuPlanScriptLinkMd insertData = new AtuPlanScriptLinkMd(); + insertData.setScriptId(atuScriptInfo.getId()); + insertData.setPlanId(planId); + insertData.setUserId(NKSecurityContext.getUserId()); + insertData.setScriptType(atuScriptInfo.getScriptType()); + scriptList.add(atuScriptInfo.getId()); + scriptTypeMap.put(atuScriptInfo.getId(), atuScriptInfo.getScriptType()); + list.add(insertData); + } + } + } + //先删后增 + AtuPlanScriptLinkMd del = new AtuPlanScriptLinkMd(); + del.setPlanId(planId); + del.setUserId(NKSecurityContext.getUserId()); + this.planScriptLinkMdService.deleteByExample(del); + //scriptLinkMd + if (list.size() > 0) { + this.planScriptLinkMdService.insertMdBatch(list); + } + return planId; + } + + @Override + public String savePlanScript(AtuPlanScriptSaveDto dto) { + String planId = ""; + if (StringUtils.isBlank(dto.getPlanId())) { + planId = UUIDUtil.create32UUID(); //新增 + } else { + planId = dto.getPlanId(); //编辑 + } + List resultList = scriptCaseFeignClient.feignQueryScriptId(dto); + if (resultList.size() > 0) { + List list = new ArrayList<>(); + for (AtuPlanScriptReturnDto returnDto : resultList) { + AtuPlanScriptLinkMd linkMd = new AtuPlanScriptLinkMd(); + linkMd.setScriptId(returnDto.getScriptId()); + linkMd.setScriptType(returnDto.getScriptType()); + linkMd.setUserId(NKSecurityContext.getUserId()); + linkMd.setPlanId(planId); + list.add(linkMd); + } + this.planScriptLinkMdService.insertMdBatch(list); + } else { + throw new PlatformRuntimeException(ExecPlanError.PLAN_SCRIPT_IS_NULL); + } + return planId; + } + + @Override + public String savePlanData(AtuPlanInfoAddDto dto) { + logger.info("-------------------->开始保存计划信息"); + //校验关联设备、应用是否为空 + checkDeviceAndApp(dto); + logger.info("-------------------->校验关联设备、应用是否为空"); + if (dto.getPlanName().length()>30){ + throw new PlatformRuntimeException(ExecPlanError.PLAN_NAME_TOO_LONG); + } + //校验正则表达式是否合法 + if (dto.getHasCorn()) { + boolean expression = CronExpression.isValidExpression(dto.getCronExpr()); + if (!expression) { + throw new PlatformRuntimeException(ExecPlanError.PLAN_CORN_ERROR); + } + //校验最近执行时间是否1s内 + List result = ScheduleUtils.getNextTriggerTimes(dto.getCronExpr(), 3); + boolean time1 = false; + boolean time2 = false; + if(!CollUtil.isEmpty(result)){ + if(result.size()>1){ + time1 = (result.get(1).getTime()-result.get(0).getTime()) < 2000L; + } + if(result.size()>2){ + time2 = (result.get(2).getTime()-result.get(1).getTime()) < 2000L; + } + if(time1 || time2){ + throw new PlatformRuntimeException(ExecPlanError.PLAN_CORN_TIME_TOO_LESS); + } + } + } + logger.info("-------------------->基础数据与执行策略校验"); + AtuPlanScriptLinkMd linkMd = new AtuPlanScriptLinkMd(); + linkMd.setPlanId(dto.getId()); + linkMd.setUserId(NKSecurityContext.getUserId()); + + List mdList = this.planScriptLinkMdService.query(linkMd); + List scriptList = new ArrayList<>(); + if (mdList != null && mdList.size() > 0) { + mdList.forEach(one -> { + scriptList.add(one.getScriptId()); + }); + }else { + throw new PlatformRuntimeException(ExecPlanError.PLAN_SCRIPT_LINK_IS_NULL); + } + AtuScriptInfoFeignDto feignDto = new AtuScriptInfoFeignDto(); + feignDto.setScriptId(scriptList); + feignDto.setAppLists(dto.getAppList()); + feignDto.setDeviceLists(dto.getDeviceList()); + //校验数据 + logger.info("-------------------->处理副表数据并组装数据调用feign"); + checkPlanData(feignDto); + logger.info("-------------------->调用feign校验数据结束"); + return savePlanInfo(dto, mdList); + } + + + @Transactional + private String savePlanInfo(AtuPlanInfoAddDto dto, List mdList){ + String uuid = dto.getId(); + AtuPlanInfo entity = new AtuPlanInfo(); + BeanUtils.copyProperties(dto, entity); + //基础数据与执行策略校验 + AtuPlanInfo atuPlanInfo = new AtuPlanInfo(); + atuPlanInfo.setId(dto.getId()); + atuPlanInfo.setPlanName(dto.getPlanName()); + atuPlanInfo.setProjectId(dto.getProjectId()); + atuPlanInfo.setDeleted(false); + + Integer uniqueNum = this.atuPlanInfoService.checkNameUnique(atuPlanInfo); + //校验是否重名 + if (uniqueNum != null) { + throw new PlatformRuntimeException(ExecPlanError.PLAN_NAME_ERROR); + } + //判断是否有前置计划 + if (dto.getHasUpFront()) { + if (StringUtils.isNotBlank(dto.getUpFrontPlanId())) { + AtuPlanInfo countParams = new AtuPlanInfo(); + countParams.setId(dto.getUpFrontPlanId()); + countParams.setIsDeleted(1); + long count = this.atuPlanInfoService.countdeleted(countParams); + if (count > 0){ + throw new PlatformRuntimeException(ExecPlanError.PLAN_UPFRONT_IS_DELETE, dto.getPlanName()); + } + }else { + throw new PlatformRuntimeException(ExecPlanError.PLAN_UPFRONT_NULL); + } + } + if (!entity.getHasCorn() && StrUtil.isNotBlank(entity.getCronExpr())){ + entity.setCronExpr(""); + } + logger.info("-------------------->判断是否有前置计划"); + //判断是否存在 + AtuPlanInfo planInfo = this.atuPlanInfoService.findByPrimaryKey(uuid); + if (planInfo != null) { + entity.setPrincipalId(planInfo.getPrincipalId()); + if (!entity.getHasCorn()) { + Scheduler scheduler = factoryBean.getScheduler(); + if (ScheduleUtils.checkExists(scheduler, entity.getId())) { + ScheduleUtils.deleteJob(scheduler, entity.getId()); + } + entity.setNextExecTime(null); + // 增加更新下一次执行时间方法,updateByPrimaryKey会将null值过滤不更新 + this.atuPlanInfoService.updatePlanNextExecTime(entity); + } + entity.setUpdatedBy(NKSecurityContext.getUserId()); + entity.setUpdatedTime(new Date()); + this.atuPlanInfoService.updatePlanRetryCount(entity); + if (entity.getFailRetry()) { + if (entity.getRetryStrategy() == null) { + entity.setRetryStrategy(PlanConstant.TASK_RETRY_STRATEGY_PACKAGE); + } + } else { + entity.setFailRetryCount(0); + entity.setRetryStrategy(null); + } + this.atuPlanInfoService.updateByPrimaryKey(entity); + entity.setPrincipalId(planInfo.getPrincipalId()); + } else { + entity.setId(uuid); + entity.setTenantId(NKSecurityContext.getTenantId()); + entity.setId(dto.getId()); + entity.setCaseChangeFlag(false); + entity.setPrincipalId(NKSecurityContext.getUserId()); + entity.setCreatedBy(NKSecurityContext.getUserId()); + entity.setCreatedTime(new Date()); + entity.setUpdatedBy(NKSecurityContext.getUserId()); + entity.setUpdatedTime(new Date()); + if (dto.getFailRetry() != null && dto.getFailRetry() && dto.getRetryStrategy() == null) { // 失败重试并且重试策略为空的情况下,默认使用策略:失败任务打包重试 + entity.setRetryStrategy(PlanConstant.TASK_RETRY_STRATEGY_PACKAGE); + } + this.atuPlanInfoService.insert(entity); + } + logger.info("-------------------->保存计划基础信息"); + //新增计划与软件之间的关联 + this.atuPlanAppLinkService.deleteAppByPlanId(dto.getId()); + if (dto.getAppList() != null && dto.getAppList().size() > 0) { + List appLinkList = new ArrayList<>(); + StringBuffer sb = new StringBuffer(); + for (AppList list : dto.getAppList()) { + if (StringUtils.isEmpty(list.getAppId())) { + sb.append("【"); + sb.append(list.getAppPackage()); + sb.append("】"); + } + AtuPlanAppLink appLink = new AtuPlanAppLink(); + BeanUtils.copyProperties(list, appLink); + appLink.setId(UUIDUtil.create32UUID()); + appLink.setPlanId(uuid); + appLinkList.add(appLink); + } + if (sb.length() > 0) { + throw new PlatformRuntimeException(ExecPlanError.PLAN_APP_IS_NULL_ERROR, sb); + } + this.atuPlanAppLinkService.insertByBatch(appLinkList); + } + logger.info("-------------------->新增计划与软件之间的关联"); + //新增计划与设备之间的关联 + this.atuPlanDeviceLinkService.deleteDeviceIdByPlanId(dto.getId()); + if (dto.getDeviceList() != null && dto.getDeviceList().size() > 0) { + List deviceLinkList = new ArrayList<>(); + for (DeviceList deviceList : dto.getDeviceList()) { + AtuPlanDeviceLink deviceLink = new AtuPlanDeviceLink(); + BeanUtils.copyProperties(deviceList, deviceLink); + deviceLink.setId(UUIDUtil.create32UUID()); + deviceLink.setPlanId(uuid); + //设备类型;1-移动端 2-PC + if (PlanConstant.DEVICE_TYPE_PC.equals(deviceLink.getDeviceType())) { + deviceLink.setPlatformType(null); + } + deviceLinkList.add(deviceLink); + } + this.atuPlanDeviceLinkService.insertByBatch(deviceLinkList); + } + logger.info("-------------------->新增计划与设备之间的关联"); + // 判断是否定时执行,是则将计划信息放入调度器 + if (entity.getHasCorn() && entity.getEnabled()) { + Scheduler scheduler = factoryBean.getScheduler(); + ScheduleUtils.createScheduleJob(scheduler, entity); + // 更新下一次执行时间 + updatePlanNextRunTime(entity); + } + logger.info("-------------------->判断是否定时执行,是则将计划信息放入调度器"); + // 保存用例集 + savePlanScriptData(uuid, mdList); + logger.info("-------------------->保存用例集"); + // 保存环境 + saveEnv(uuid, dto.getEnvList()); + logger.info("-------------------->保存环境"); + return uuid; + } + + + + private void savePlanScriptData(String planId,List mdList){ + List scriptLinks = new ArrayList<>(); + for (AtuPlanScriptLinkMd linkMd : mdList) { + AtuPlanScriptLink scriptLink = new AtuPlanScriptLink(); + BeanUtils.copyProperties(linkMd,scriptLink); + scriptLinks.add(scriptLink); + } + //先删除原来的 + AtuPlanScriptLink link = new AtuPlanScriptLink(); + link.setPlanId(planId); + this.planScriptLinkService.deleteByExample(link); + //新增关联 + this.planScriptLinkService.insertLinkList(scriptLinks); + } + + + private void saveEnv(String planId, List envList) { + if (envList == null || envList.isEmpty()) { + return; + } + Long projectId = RequestUtil.getProjectId(); + ResponseVO> responseVO = apiAtsEnviromentFeign.listByProject(projectId); + List data = responseVO.getData(); + List envIds = data.stream().map(e -> e.getId().toString()).collect(Collectors.toList()); + for (String id : envList) { + boolean contains = envIds.contains(id); + if (!contains) { + throw new InvalidException("环境信息不正确,请修改环境"); + } + } + //删除原来关联的环境 + AtuPlanEnvLink envLink = new AtuPlanEnvLink(); + envLink.setPlanId(planId); + planEnvLinkService.deleteByExample(envLink); + List inserList = new ArrayList<>(); + int sort = 0; + for (String envId : envList) { + AtuPlanEnvLink link = new AtuPlanEnvLink(); + link.setPlanId(planId); + link.setEnvId(envId); + sort = sort + 1; + link.setSort(sort); + inserList.add(link); + } + if (envList.size() > 0) { + this.planEnvLinkService.insertLinkList(inserList); + } + } + + + @Override + public AtuPlanScriptResultDto queryLinkMdPage(String planId) { + if (StringUtils.isBlank(planId)){ + return null; + } + List result = this.planScriptLinkMdService.queryLinkMdPage(planId,new ArrayList<>()); + //feign调用查询脚本类型 + List scriptList = new ArrayList<>(); + result.forEach(one -> { + scriptList.add(one.getScriptId()); + }); + return queryScriptData(scriptList,result); + } + + private AtuPlanScriptResultDto queryScriptData(List scriptList,List result) { + AtuPlanScriptResultDto resultDto = new AtuPlanScriptResultDto(); + ResultWrapper wrapper = scriptCaseFeignClient.checkScriptData(scriptList); + //脚本名称 + Map scriptMap = wrapper.getData().getScriptMap(); + //校验结果 + BeanUtils.copyProperties(wrapper.getData(),resultDto); + //查询不执行的测试意图 + List simpleList = new ArrayList<>(); + List sceneList = new ArrayList<>(); + for (AtuPlanScriptLinkDto record : result) { + String scriptName = scriptMap.get(record.getScriptId()); + record.setScriptName(scriptName); + if (record.getScriptType().equals(MsgConstant.ATU_PLAN_SCRIPT_LINK_DTO_SCRIPT_TYPE)){ + sceneList.add(record); + }else { + simpleList.add(record); + } + } + resultDto.setSceneList(sceneList); + resultDto.setSimpleList(simpleList); + return resultDto; + } + + @Override + public Integer deletePlanScriptLinkMd(AtuPlanScriptDeleteDto dto) { + //先删除md表中数据集的数据 + dto.setUserId(NKSecurityContext.getUserId()); + return planScriptLinkMdService.deleteLinkMd(dto); + } + + @Override + public List queryPlanScriptList(String planId) { + AtuPlanScriptLinkMd linkMd = new AtuPlanScriptLinkMd(); + linkMd.setPlanId(planId); + linkMd.setUserId(NKSecurityContext.getUserId()); + List query = planScriptLinkMdService.query(linkMd); + List scriptList = new ArrayList<>(); + query.forEach( one -> { + scriptList.add(one.getScriptId()); + }); + return scriptList; + } + + @Override + public Integer updatePlanStatus(String planId) { + AtuPlanInfo info = new AtuPlanInfo(); + info.setId(planId); + info.setCaseChangeFlag(false); + return atuPlanInfoService.updateByPrimaryKey(info); + } + + @Override + public Boolean checkScript(List ids) { + //主表 + boolean result = false; + long count = planScriptLinkService.countByScriptIdList(ids); + if (count > 0) { + result = true; + } + return result; + } + + @Override + public AtuPlanScriptPageDto queryScriptPage(QueryByPage queryByPage) { + AtuPlanScriptPageDto pageDto = new AtuPlanScriptPageDto(); + if (StringUtils.isBlank(queryByPage.getQuery().getPlanId())) { + return pageDto; + } + List dtoList = this.planScriptLinkMdService.queryLinkMdPage(queryByPage.getQuery().getPlanId(),new ArrayList<>()); + if (dtoList == null || dtoList.size()==0){ + return pageDto; + } + List scriptList = new ArrayList<>(); + dtoList.forEach( one -> {scriptList.add(one.getScriptId());}); + PlanPageQueryDto queryDto = new PlanPageQueryDto(); + queryDto.setAllList(scriptList); + if (!StringUtils.isBlank(queryByPage.getQuery().getSetName())) { + queryDto.setSetName(queryByPage.getQuery().getSetName()); + } + //查询所有脚本类型 + PlanScriptPageDto planScriptPageDto = scriptCaseFeignClient.queryScriptByPlan(queryDto); + Pagination resultDto = new DefaultPagination<>(); + pageDto.setInfoDto(planScriptPageDto.getInfoDto()); + List resultList = new ArrayList<>(); + if (planScriptPageDto.getResultDtoList() != null && planScriptPageDto.getResultDtoList().size()>0) { + planScriptPageDto.getResultDtoList().forEach( one ->{resultList.add(one.getScriptId());}); + }else { + pageDto.setPagination(resultDto); + return pageDto; + } + QueryByPage planPage = new QueryByPage<>(); + BeanUtils.copyProperties(queryByPage,planPage); + PlanScriptQueryPageDto dto = new PlanScriptQueryPageDto(); + dto.setPlanId(queryByPage.getQuery().getPlanId()); + dto.setScriptList(resultList); + planPage.setQuery(dto); + Pagination pagination = this.planScriptLinkMdService.queryScriptLink(planPage); + List resultDtoList = new ArrayList<>(); + if (pagination.getRecords().size()>0) { + pagination.getRecords().forEach( one ->{ + for (AtuCaseScriptResultDto scriptResultDto : planScriptPageDto.getResultDtoList()) { + if (scriptResultDto.getId().equals(one)) { + String principalName = entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, scriptResultDto.getPrincipalId()); + String updatedName = entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, scriptResultDto.getUpdatedBy()); + scriptResultDto.setPrincipalName(principalName); + scriptResultDto.setUpdatedName(updatedName); + resultDtoList.add(scriptResultDto); + } + } + }); + } + resultDto.setPageNo(pagination.getPageNo()); + resultDto.setRecordCount(pagination.getRecordCount()); + resultDto.setPageSize(pagination.getPageSize()); + resultDto.setRecords(resultDtoList); + pageDto.setPagination(resultDto); + return pageDto; + } + + @Override + public BatchScriptReportDto queryPlanBatchReport(String batchId) { + BatchScriptReportDto reportDto = new BatchScriptReportDto(); + // 批次基本信息 + BatchInfoReportDto batchInfo = new BatchInfoReportDto(); + AtuPlanBatchDetailDto batchDetailDto = this.atuPlanBatchService.queryBatchDetailById(batchId); + if (batchDetailDto == null){ + throw new PlatformRuntimeException(ExecPlanError.BATCH_INFO_IS_NULL); + } + + batchInfo.setPlanName(batchDetailDto.getPlanName()); + batchInfo.setCreatedTime(batchDetailDto.getCreatedTime()); + batchInfo.setEndTime(batchDetailDto.getEndTime()); + if (batchDetailDto.getStartTime() != null && batchDetailDto.getEndTime() != null) { + long between = batchDetailDto.getEndTime().getTime() - batchDetailDto.getStartTime().getTime(); + batchInfo.setElapsedTime(DateUtil.formatBetween(between, BetweenFormatter.Level.SECOND)); + } + batchInfo.setScriptTotal(batchDetailDto.getScriptNum()); + batchInfo.setCaseTotal(batchDetailDto.getTaskTotal()); + AtuPlanBatchDeviceLink deviceLink = new AtuPlanBatchDeviceLink(); + deviceLink.setBatchId(batchId); + long deviceCount = this.atuPlanBatchDeviceLinkService.count(deviceLink); + batchInfo.setTestDeviceNum(deviceCount); + batchInfo.setRetryDeviceNum(deviceCount); + batchInfo.setTestBy(entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, batchDetailDto.getExecutedBy())); + batchInfo.setTriggerType(batchDetailDto.getTriggerType()); + String envId = atuPlanTaskApiService.queryEnvIdByBatchId(batchDetailDto.getId()); + String envNameObj = envNameUtils.getEnvName(envId); + String envName = ""; + if (envNameObj != null) { + envName = envNameObj.toString(); + } + batchInfo.setEnvName(envName); + reportDto.setBatchInfo(batchInfo); + + // APP基本信息 + Map appNameMap = new HashMap<>(); + List appBaseInfoList = getAppBaseInfo(batchId, appNameMap); + reportDto.setAppBaseInfoList(appBaseInfoList); + + // app和设备性能相关信息 + List appPerList = getBatchAppInfo(batchId, batchDetailDto.getTenantId(), appNameMap); + reportDto.setAppPerList(appPerList); + + String clusterKeyPrefix = RedisConstant.CLUSTER_KEY_PREFIX + batchId.substring(0,4) + + RedisConstant.CLUSTER_KEY_SUFFIX; + // 脚本执行情况 + Map scriptExecMap = new HashMap<>(); + // 执行成功 + getCacheData(batchId, PlanConstant.TASK_EXECUTE_SUCCESS_STATUS, MsgConstant.STATUS_CACHEKEY_SUCCESSNUM, scriptExecMap, + batchDetailDto.getSuccessNum(), clusterKeyPrefix); + // 执行失败 + getCacheData(batchId, PlanConstant.TASK_EXECUTE_FAIL_STATUS, MsgConstant.STATUS_CACHEKEY_FAILNUM, scriptExecMap, + batchDetailDto.getExecFailNum(), clusterKeyPrefix); + // 取消 + getCacheData(batchId, PlanConstant.TASK_CANCEL_STATUS, MsgConstant.STATUS_CACHEKEY_CANCELNUM, scriptExecMap, + batchDetailDto.getCancelNum(), clusterKeyPrefix); + // 超时 + getCacheData(batchId, PlanConstant.TASK_TIMEOUT_STATUS, MsgConstant.STATUS_CACHEKEY_TIMEOUTNUM, scriptExecMap, + batchDetailDto.getTimeoutNum(), clusterKeyPrefix); + reportDto.setScriptExecMap(scriptExecMap); + + // 查询脚本执行详情 + reportDto.setScriptExecList(getScriptExecDetailList(batchId)); + return reportDto; + } + + private List getAppBaseInfo(String batchId, Map appNameMap){ + List appBaseInfoList = new ArrayList<>(); + // 查询批次任务中的app id集合 + List appIdList = this.atuPlanTaskApiService.queryAppIdListByBatchId(batchId); + // 查询场景节点任务app id集合 + List sceneAppIdList = this.atuPlanSceneCaseTaskService.queryAppIdListByBatchId(batchId); + if (CollUtil.isEmpty(appIdList)){ + appIdList = sceneAppIdList; + }else if(CollUtil.isNotEmpty(sceneAppIdList)){ + appIdList.addAll(sceneAppIdList); + } + if (CollUtil.isNotEmpty(appIdList)) { + try { + ResultWrapper> resultWrapper = publicFeignClient.queryAppByIds(appIdList); + if (resultWrapper != null && resultWrapper.getData() != null) { + List appList = resultWrapper.getData(); + if (CollUtil.isNotEmpty(appList)) { + for (AppDetailDto detailDto : appList) { + appNameMap.put(detailDto.getId(), detailDto.getAppName()); + AppBaseInfoDto baseInfoDto = new AppBaseInfoDto(); + baseInfoDto.setAppName(detailDto.getAppName()); + baseInfoDto.setAppVersion(detailDto.getBuildVersion()); + baseInfoDto.setAppPackage(detailDto.getPackageName()); + baseInfoDto.setVersionDesc(detailDto.getRemarks()); + baseInfoDto.setChannelName(detailDto.getPlatform()); + appBaseInfoList.add(baseInfoDto); + } + } + } + } catch (Exception e) { + logger.error("查询应用信息异常", e); + } + } + return appBaseInfoList; + } + + /** + * 查询脚本执行详情 + * @param batchId 批次id + * @return 结果集 + */ + private List getScriptExecDetailList(String batchId){ + List scriptExecList = new ArrayList<>(); + AtuPlanTask taskParams = new AtuPlanTask(); + taskParams.setBatchId(batchId); + SqlOrderBy orderBy = new SqlOrderBy(); + orderBy.desc("created_time"); + List taskList = this.atuPlanTaskApiService.query(taskParams, orderBy); + if (CollUtil.isEmpty(taskList)){ + return scriptExecList; + } + Map deviceNameMap = getDeviceInfo(taskList); + logger.debug("deviceNameMap => {}", JSONUtil.toJsonStr(deviceNameMap)); + for (AtuPlanTask atuPlanTask : taskList) { + BatchScriptExecDetailDto detailDto = new BatchScriptExecDetailDto(); + BeanUtils.copyProperties(atuPlanTask, detailDto); + + Object resultCode = redisTemplate.opsForValue().get("UITEST-ScriptCode:" + atuPlanTask.getScriptId()); + if (resultCode!= null && !resultCode.equals("")){ + detailDto.setScriptCode(resultCode.toString()); + }else { + Map scriptMap = new HashMap<>(); + scriptMap.put(MsgConstant.ID,atuPlanTask.getScriptId()); + scriptMap.put(MsgConstant.TYPE,atuPlanTask.getCaseType()); + try { + String scriptCode = scriptCaseFeignClient.queryScriptCode(scriptMap); + if (!StringUtils.isBlank(scriptCode)) { + detailDto.setScriptCode(scriptCode); + } + }catch (Exception e){ + logger.error("查询脚本编号异常", e); + } + } + detailDto.setElapsedTime("-"); + if (atuPlanTask.getStartTime() != null && atuPlanTask.getEndTime() != null) { + long between = atuPlanTask.getEndTime() - atuPlanTask.getStartTime(); + detailDto.setElapsedTime(between + ""); + } + + // 查询设备id + String deviceName = ""; + if (PlanConstant.SCRIPT_TYPE_SCENE.equals(detailDto.getCaseType())){ + Set sceneDeviceIdSet = atuPlanSceneCaseTaskService.queryDeviceIdListByTaskId(atuPlanTask.getId()); + logger.debug("场景节点设备数量:{}", sceneDeviceIdSet.size()); + if (CollUtil.isNotEmpty(sceneDeviceIdSet)){ + logger.debug("场景节点设备id:{}", JSONUtil.toJsonStr(sceneDeviceIdSet)); + StringBuilder deviceNames = new StringBuilder(); + for (String deviceId : sceneDeviceIdSet) { + if (StrUtil.isBlank(deviceId)){ + continue; + } + if (deviceNameMap.containsKey(deviceId)) { + deviceNames.append(deviceNameMap.get(deviceId)).append(";"); + } + } + if (deviceNames.length() > 0) { + deviceName = deviceNames.substring(0, deviceNames.lastIndexOf(";")); + } + } + }else { + if (deviceNameMap.containsKey(atuPlanTask.getDeviceId())) { + deviceName = deviceNameMap.get(atuPlanTask.getDeviceId()); + } + } + detailDto.setDeviceName(deviceName); + scriptExecList.add(detailDto); + } + return scriptExecList; + } + + private Map getDeviceInfo(List taskList){ + // 查询设备信息 + Set deviceIdSet = new HashSet<>(); + for (AtuPlanTask planTask : taskList) { + // 判断是否场景用例,场景用例则查询多个设备信息 + if (ObjectUtil.equal(PlanConstant.SCRIPT_TYPE_SCENE, planTask.getCaseType())) { + // 查询场景任务设备ID列表 + Set sceneDeviceIdSet = atuPlanSceneCaseTaskService.queryDeviceIdListByTaskId(planTask.getId()); + deviceIdSet.addAll(sceneDeviceIdSet); + } else { + deviceIdSet.add(planTask.getDeviceId()); + } + } + return getDeviceNameMap(deviceIdSet); + } + + /** + * 根据设备id查询设备名称集合 + * @param deviceIdSet 设备id集合 + * @return 结果 + */ + private Map getDeviceNameMap(Set deviceIdSet){ + Map deviceNameMap = new HashMap<>(); + try { + List> deviceInfoList = deviceFeignClient.queryDeviceInfo(deviceIdSet); + if (CollUtil.isNotEmpty(deviceInfoList)) { + for (Map deviceInfoMap : deviceInfoList) { + deviceNameMap.put(deviceInfoMap.get(MsgConstant.ID).toString(), deviceInfoMap.get(MsgConstant.DEVICE_NAME).toString()); + } + } + } catch (Exception e) { + logger.error("查询设备信息异常", e); + } + return deviceNameMap; + } + + private void getCacheData(String batchId, String statusCacheKey, String statusMapKey, + Map scriptExecMap, int statusNum, String clusterKeyPrefix){ + + Object obj = redisTemplate.opsForHash().get(clusterKeyPrefix + RedisConstant.BATCH_SCRIPT_SUM_KEY + batchId, + clusterKeyPrefix + statusCacheKey); + if (obj != null){ + int num = Integer.parseInt(obj.toString()); + scriptExecMap.put(statusMapKey, num); + }else{ + scriptExecMap.put(statusMapKey, statusNum); + } + } + + @Override + public String updatePrincipal(AtuPlanPrincipalDto dto) { + Long requestUserId = RequestUtil.getRequestUserId(); + dto.setUpdatedBy(String.valueOf(requestUserId)); + dto.setUpdatedTime(new Date()); + atuPlanInfoService.updatePrincipal(dto); + return "success"; + } + + @Override + public void exportBatchExecResult(HttpServletResponse response, String batchId) { + AtuPlanBatchDetailDto atuPlanBatchDetailDto = this.atuPlanBatchService.queryBatchDetailById(batchId); + if (atuPlanBatchDetailDto == null){ + throw new PlatformRuntimeException(ExecPlanError.BATCH_INFO_IS_NULL); + } + String title = atuPlanBatchDetailDto.getPlanName() + "第" + atuPlanBatchDetailDto.getBatch() + "批次汇总报告"; + List scriptExecDetailList = getScriptExecDetailList(batchId); + if (CollUtil.isNotEmpty(scriptExecDetailList)){ + Map scriptTypeDict = getDictItem(DictConstant.SCRIPT_CASE_TYPE); + Map taskStatusDict = getDictItem(DictConstant.PLAN_TASK_STATUS); + for (BatchScriptExecDetailDto detailDto : scriptExecDetailList) { + if (scriptTypeDict.containsKey(detailDto.getCaseType())){ + detailDto.setCaseType(scriptTypeDict.get(detailDto.getCaseType())); + } + if (taskStatusDict.containsKey(detailDto.getStatus())){ + detailDto.setStatus(taskStatusDict.get(detailDto.getStatus())); + } + } + } + + ExcelWriter writer = ExcelUtil.getWriter(); + writer.addHeaderAlias("scriptCode", "脚本编号"); + writer.addHeaderAlias("scriptName", "脚本名称"); + writer.addHeaderAlias("caseName", "用例名称"); + writer.addHeaderAlias("caseType", "用例类型"); + writer.addHeaderAlias("elapsedTime", "耗时(毫秒)"); + writer.addHeaderAlias("deviceName", "执行设备"); + writer.addHeaderAlias("status", "执行状态"); + writer.addHeaderAlias("errorMsg", "失败原因"); + writer.setOnlyAlias(true); + writer.merge(8, title); + writer.write(scriptExecDetailList, true); + + response.setContentType(MsgConstant.CONTENT_VNDMS_EXCEL_UTF8); + + ServletOutputStream output = null; + try { + String fileName = URLEncoder.encode(title + ".xls", "utf-8"); + response.setHeader(MsgConstant.HTTP_SER_RESPONSE_KEY_CONTENT_DISPOSITION, MsgConstant.HTTP_SER_RESPONSE_VALUE_ATTACHMENT + fileName); + output = response.getOutputStream(); + }catch (Exception e){ + logger.error("导出数据异常", e); + } + writer.flush(output, true); + writer.close(); + IoUtil.close(output); + } + + private Map getDictItem(String catalogId){ + Map data = new HashMap<>(); + DictCatalogSearchDto searchDto = new DictCatalogSearchDto(); + searchDto.setTenantId(NKSecurityContext.getTenantId()); + List dictTypeList = new ArrayList<>(); + dictTypeList.add(catalogId); + searchDto.setResultList(dictTypeList); + try { + ResultWrapper> queryResult = publicFeignClient.query(searchDto); + if (queryResult.isSuccess() && CollUtil.isNotEmpty(queryResult.getData())){ + Map resultData = queryResult.getData(); + List> dictItemList = (List>) resultData.get(catalogId); + if (CollUtil.isEmpty(dictItemList)){ + return data; + } + for (LinkedHashMap linkedHashMap : dictItemList) { + String itemCode = linkedHashMap.get(MsgConstant.ITEM_CODE).toString(); + String itemName = linkedHashMap.get(MsgConstant.ITEM_NAME).toString(); + data.put(itemCode, itemName); + } + return data; + } + }catch (Exception e){ + logger.error("获取字典[" + catalogId + "]数据异常", e); + } + return data; + } + + @Override + public void exportBatchReport(HttpServletResponse response, AtuPlanExportDto exportDto) { + // 设置response参数,可以打开下载页面 + response.reset(); + response.setCharacterEncoding(MsgConstant.CHARATER_ENCODING_UTF8); + // 定义输出类型 + response.setContentType(MsgConstant.CONTENT_PDF_UTF8); + // 设置名称 + AtuPlanBatchDetailDto atuPlanBatchDetailDto = this.atuPlanBatchService.queryBatchDetailById(exportDto.getBatchId()); + if (atuPlanBatchDetailDto == null){ + throw new PlatformRuntimeException(ExecPlanError.BATCH_INFO_IS_NULL); + } + String title = atuPlanBatchDetailDto.getPlanName() + "第" + atuPlanBatchDetailDto.getBatch() + "批次汇总报告"; + + // 查询填充的基础数据 + Map dataMap = getTextFillData(atuPlanBatchDetailDto); + + try { + String fileName = URLEncoder.encode(title + MsgConstant.ENC_TITLE_PDF, MsgConstant.ENC_UTF8); + response.setHeader(MsgConstant.HTTP_SER_RESPONSE_KEY_CONTENT_DISPOSITION, MsgConstant.HTTP_SER_RESPONSE_VALUE_ATTACHMENT + fileName); + ServletOutputStream out = response.getOutputStream(); + // 模板路径记 + this.fillTemp(dataMap, exportDto, atuPlanBatchDetailDto.getTenantId(), out); + } catch (IOException e) { + logger.error("报告导出异常,e,{}",e); + } + } + + @Override + public int updateStatusByLastBatchId(String lastBatchId, String planStatus) { + return atuPlanInfoService.updatePlanByLastBatchId(lastBatchId, planStatus); + } + + /** + * 获取文本填充数据 + * @param atuPlanBatchDetailDto 计划批次信息 + * @return 结果集 + */ + private Map getTextFillData(AtuPlanBatchDetailDto atuPlanBatchDetailDto){ + Map dataMap = new HashMap<>(16); + + dataMap.put(MsgConstant.DATA_MAP_START_TIME, DateUtil.format(atuPlanBatchDetailDto.getCreatedTime(), PlanConstant.DATETIME_FORMAT)); + Map dictItemMap = getDictItem(DictConstant.PLAN_TRIGGER_TYPE); + dataMap.put(MsgConstant.DATA_MAP_TRIGGER_TYPE, atuPlanBatchDetailDto.getTriggerType()); + if (dictItemMap.containsKey(atuPlanBatchDetailDto.getTriggerType())) { + dataMap.put(MsgConstant.DATA_MAP_TRIGGER_TYPE, dictItemMap.get(atuPlanBatchDetailDto.getTriggerType())); + } + dataMap.put(MsgConstant.DATA_MAP_ELAPSED_TIMED, DateUtil.formatBetween(atuPlanBatchDetailDto.getEndTime().getTime() - + atuPlanBatchDetailDto.getStartTime().getTime(), BetweenFormatter.Level.SECOND)); + // 暂定一个环境 + String envId = atuPlanTaskApiService.queryEnvIdByBatchId(atuPlanBatchDetailDto.getId()); + String envNameObj = envNameUtils.getEnvName(envId); + String envName = ""; + if (envNameObj != null) { + envName = envNameObj.toString(); + } + dataMap.put(MsgConstant.DATA_MAP_ENV_NAME, envName); + dataMap.put(MsgConstant.DATA_MAP_END_TIME, DateUtil.format(atuPlanBatchDetailDto.getEndTime(), PlanConstant.DATETIME_FORMAT)); + dataMap.put(MsgConstant.DATA_MAP_CASE_TOTAL, atuPlanBatchDetailDto.getTaskTotal()); + dataMap.put(MsgConstant.DATA_MAP_SCRIPT_TOTAL, atuPlanBatchDetailDto.getScriptNum()); + + AtuPlanBatchDeviceLink deviceLink = new AtuPlanBatchDeviceLink(); + deviceLink.setBatchId(atuPlanBatchDetailDto.getId()); + long deviceCount = this.atuPlanBatchDeviceLinkService.count(deviceLink); + dataMap.put(MsgConstant.DATA_MAP_TEST_DEVICE_NUM, deviceCount); + // 暂时定重试设备数量即该批次执行的设备数量 + dataMap.put(MsgConstant.DATA_MAP_RETRY_DEVICE_NUM, deviceCount); + // 因为模板定义的包名字段为package,而package为java关键字,故此处需转换 + dataMap.put(MsgConstant.DATA_MAP_PACKAGE, dataMap.get(MsgConstant.DATA_MAP_APP_PACKAGE)); + return dataMap; + } + + private List getBatchAppInfo(String batchId, String tenantId, Map appNameMap){ + List resultList = new ArrayList<>(); + AtuPlanBatch planBatch = atuPlanBatchService.findByPrimaryKey(batchId); + String filePath = planBatch.getPerDataPath(); + if (StrUtil.isBlank(filePath)){ + return resultList; + } + List dtoList = downloadAppProInfoList(tenantId, filePath); + if (CollUtil.isEmpty(dtoList)){ + return dtoList; + } + Set deviceIdSet = dtoList.stream().map(BatchAppInfoDto::getDeviceId).collect(Collectors.toSet()); + // 查询设备信息 + Map deviceNameMap = getDeviceNameMap(deviceIdSet); + + for (BatchAppInfoDto appInfoDto : dtoList) { + if (CollUtil.isNotEmpty(deviceNameMap)){ + appInfoDto.setDeviceName(appInfoDto.getDeviceId()); + if (deviceNameMap.containsKey(appInfoDto.getDeviceId())) { + appInfoDto.setDeviceName(deviceNameMap.get(appInfoDto.getDeviceId())); + } + } + if (appNameMap.containsKey(appInfoDto.getAppId())) { + appInfoDto.setAppName(appNameMap.get(appInfoDto.getAppId())); + } + + } + return dtoList; + } + + public List downloadAppProInfoList(String tenantId, String filePath){ + List resultList = new ArrayList<>(); + JSONArray jsonArray = null; + File file = null; + try { + String path = filePath.replace(tenantId, ""); + path = path.replace("_","/"); + file = simpleStorageService.downloadAsFile(tenantId, path); + byte[] bytes = FileUtil.readBytes(file); + if (bytes != null){ + String jsonStr = new String(bytes, StandardCharsets.UTF_8); + jsonArray = JSONUtil.parseArray(jsonStr); + } + } catch (Exception e) { + logger.error("读取结果文件失败", e); + } finally { + // 删除下载的临时文件 + if (file != null) { + if (!file.delete()) { + logger.error("临时文件删除失败, file => " + file.getAbsolutePath()); + } + } + } + if (jsonArray == null){ + return resultList; + } + resultList = JSON.parseArray(JSON.toJSONString(jsonArray), BatchAppInfoDto.class); + return resultList; + } + + @Override + public Boolean checkDataSetUsedByScriptIdList(List scriptIdList) { + //主表 + boolean result = false; + long count = planScriptLinkService.countByScriptIdList(scriptIdList); + if (count > 0) { + result = true; + } + return result; + } + + @Override + public Pagination pageUpFrontPlan(QueryByPage queryByPage) { + queryByPage.getQuery().setTenantId(NKSecurityContext.getTenantId()); + Pagination query = atuPlanInfoService.queryUpFrontPlan(queryByPage); + for (AtuPlanInfoDetailDto record : query.getRecords()) { + String projectName = entityNameCache.translateById(EntityNameCatalog.MONSTER_SYSTEM, record.getProjectId()); + String principalName = entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, record.getPrincipalId()); + record.setProjectName(projectName); + record.setLastBatchScriptSumMap(getBatchScriptSumData(record)); + record.setPrincipalId(principalName); + String createdBy = entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, record.getCreatedBy()); + String updatedBy = entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, record.getUpdatedBy()); + record.setCreatedBy(createdBy); + record.setUpdatedBy(updatedBy); + //判断是否有下一次执行时间 + if (record.getHasCorn()) { + Date date = ScheduleUtils.getNextOneTriggerTime(record.getCronExpr()); + if (date == null) { + AtuPlanInfo atuPlanInfo = new AtuPlanInfo(); + atuPlanInfo.setId(record.getId()); + atuPlanInfo.setNextExecTime(null); + this.atuPlanInfoService.updatePlanNextExecTime(atuPlanInfo); + record.setNextExecTime(null); + } + } + } + return query; + } + + /** + * ATS获取执行计划中脚本执行情况 + * @return + */ + @Override + public List scriptExecutionDetail() { + String code = "compliantTestPlanTag"; + ResponseVO> responseVO = apiMonsterDictService.findItemsKVByCatalogCode(code, false); + if (!BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS.equals(responseVO.getCode())) { + logger.error("获取字典配置异常,响应信息:" + JSON.toJSONString(responseVO)); + throw new InvalidException("获取字典配置异常"); + } + Map data = responseVO.getData(); + if (CollectionUtils.isEmpty(data)) { + return new ArrayList<>(); + } + List tagNames = new ArrayList<>(data.values()); + List tagDtos = apiTagService.getTagDtosByNameAndType(tagNames, 4); + if (tagDtos == null) { + logger.error("根据标签和类型获取关联计划Id异常,响应信息:" + JSON.toJSONString(responseVO)); + throw new InvalidException("根据标签和类型获取关联计划Id异常"); + } + if (CollectionUtils.isEmpty(tagDtos)) { + return new ArrayList<>(); + } + Map> tagMapByObjId = tagDtos.stream().collect(Collectors.groupingBy(TagDto::getObjectId)); + Set objIdsSet = tagDtos.stream().map(TagDto::getObjectId).collect(Collectors.toSet()); + + List atuPlanInfos = atuPlanInfoService.queryPlanInfoByIds(new ArrayList<>(objIdsSet)); + if (CollectionUtils.isEmpty(atuPlanInfos)) { + return new ArrayList<>(); + } + Set principalIds = new HashSet<>(); + List relust = new ArrayList<>(); + Map> scriptRefNumMap = new HashMap<>(); + for (AtuPlanInfo atuPlanInfo : atuPlanInfos) { + AtuPlanScriptLink atuPlanScriptLink = new AtuPlanScriptLink(); + atuPlanScriptLink.setPlanId(atuPlanInfo.getId()); + List atuPlanScriptLinkList = planScriptLinkService.query(atuPlanScriptLink); + PlanPageQueryDto queryDto = new PlanPageQueryDto(); + Set collect = atuPlanScriptLinkList.stream().map(AtuPlanScriptLink::getScriptId).collect(Collectors.toSet()); + queryDto.setAllList(new ArrayList<>(collect)); + + //查询所有脚本类型 + List atuScriptInfoList = scriptCaseFeignClient.queryScriptByIds(new ArrayList<>(collect)); + + Long testPlanManager = null; + try { + testPlanManager = Long.valueOf(atuPlanInfo.getPrincipalId()); + principalIds.add(testPlanManager); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + for (AtuCaseScriptResultDto record : atuScriptInfoList) { + TestPlanScriptExecutionDetailDTO detailDto = new TestPlanScriptExecutionDetailDTO(); + detailDto.setTestPlanId(atuPlanInfo.getId()); //测试计划id + detailDto.setTestPlanName(atuPlanInfo.getPlanName()); //测试计划名称 + Long systemId = null; + try { + systemId = Long.valueOf(atuPlanInfo.getProjectId()); + detailDto.setSystemId(systemId); //系统id + } catch (NumberFormatException e) { + e.printStackTrace(); + } + StringBuilder tag = new StringBuilder(); + List dtos = tagMapByObjId.get(atuPlanInfo.getId()); + for (String tagName : tagNames) { + for (TagDto dto : dtos) { + if (tagName.equals(dto.getName())) { + tag.append(dto.getName()).append(","); + } + } + } + tag.deleteCharAt(tag.length() - 1); + detailDto.setTag(tag.toString()); // 标签 + detailDto.setTestPlanManager(testPlanManager);// 计划负责人id + detailDto.setScriptId(record.getScriptId()); // 脚本id + detailDto.setScriptCode(record.getScriptCode()); // 脚本编号 + detailDto.setScriptName(record.getSetName()); // 脚本名称 + Long scriptManager = null; + try { + scriptManager = Long.valueOf(record.getPrincipalId()); + detailDto.setScriptManager(scriptManager); // 脚本负责人id + principalIds.add(scriptManager); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + + detailDto.setScriptCreateTime(record.getCreatedTime());// 脚本创建日期 + + LocalDate now = LocalDate.now().minusDays(1); + Integer num = atuPlanTaskApiService.getScriptExecuteSuccessNum(record.getScriptId(), atuPlanInfo.getId(), now); + detailDto.setExecutionSuccessNum(num); // 执行成功次数 + Set palnIdSet = scriptRefNumMap.computeIfAbsent(record.getScriptId(), key -> new HashSet<>()); + palnIdSet.add(atuPlanInfo.getId()); + + relust.add(detailDto); + } + List scriptFirstExecutionDTOS = atuPlanTaskApiService.getFirstExecuteInfo(new ArrayList<>(collect)); + + if (!CollectionUtils.isEmpty(scriptFirstExecutionDTOS)) { + for (TestPlanScriptExecutionDetailDTO detailDTO : relust) { + scriptFirstExecutionDTOS.stream() + .filter(fist -> detailDTO.getScriptId().equals(fist.getScriptId())) + .findFirst().ifPresent(first -> { + detailDTO.setFirstExecutionPlanId(first.getFirstExecutionPlanId()); // 首次执行计划id + detailDTO.setFirstExecutionPlanName(first.getFirstExecutionPlanName()); // 首次执行计划名称, + if (first.getFirstExecutionTime() != null) { + detailDTO.setFirstExecutionTime(new Date(first.getFirstExecutionTime())); // 首次执行日期, + } + }); + } + } + } + + List testGroup = monsterCommonService.getTestGroup(new ArrayList<>(principalIds)); + Map testGroupUserMap = new HashMap<>(); + for (TestGroupDTO testGroupDTO : testGroup) { + if (CollectionUtils.isEmpty(testGroupDTO.getUserList())) { + continue; + } + for (TestGroupUserDTO testGroupUserDTO : testGroupDTO.getUserList()) { + testGroupUserMap.put(testGroupUserDTO.getUserId(), testGroupUserDTO.getManagerId()); + } + } + + for (TestPlanScriptExecutionDetailDTO detailDTO : relust) { + Long testPlanManager = detailDTO.getTestPlanManager(); + Long testGroupManager = testGroupUserMap.get(detailDTO.getScriptManager()); + // 是否组员 + if (testGroupManager != null && testGroupManager.equals(testPlanManager)) { + detailDTO.setIsTeamMember(1); // 是组员 + } else { + detailDTO.setIsTeamMember(0); // 不是组员 + } + + } + + for (TestPlanScriptExecutionDetailDTO detailDTO : relust) { + Set palnIdSet = scriptRefNumMap.get(detailDTO.getScriptId()); + detailDTO.setRefScriptPlanNum(palnIdSet.size()); // 引用脚本计划数 具有标签的计划 + } + return relust; + } + + @Override + public AdvancedQueryOptions advancedQueryOptions(String projectId) { + AdvancedQueryOptions options = new AdvancedQueryOptions(); + options.setManagerList(new ArrayList<>()); + options.setCreatorList(new ArrayList<>()); + options.setUpdaterList(new ArrayList<>()); + List mangerList = atuPlanInfoService.selectManagerByProject(projectId); + Set userIds = new HashSet<>(); + if (!CollectionUtils.isEmpty(mangerList)) { + mangerList.forEach(id -> { + if (id.length() <= 20) { + userIds.add(Long.valueOf(id)); + } + }); + } + List creatorList = atuPlanInfoService.selectCreatorByProject(projectId); + if (!CollectionUtils.isEmpty(creatorList)) { + creatorList.forEach(id -> { + if (id.length() <= 20) { + userIds.add(Long.valueOf(id)); + } + }); + } + List updaterList = atuPlanInfoService.selectUpdaterByProject(projectId); + if (!CollectionUtils.isEmpty(updaterList)) { + updaterList.forEach(id -> { + if (id.length() <= 20) { + userIds.add(Long.valueOf(id)); + } + }); + } + if (CollectionUtils.isEmpty(userIds)){ + return options; + } + List userDTOS = monsterCommonFeignClient.getUserByIds(new ArrayList<>(userIds)); + userDTOS.forEach(user -> { + if (mangerList.contains(user.getId().toString())) { + options.getManagerList().add(UserOptions.userDTOtoUserOptions(user)); + } + if (creatorList.contains(user.getId().toString())) { + options.getCreatorList().add(UserOptions.userDTOtoUserOptions(user)); + } + if (updaterList.contains(user.getId().toString())) { + options.getUpdaterList().add(UserOptions.userDTOtoUserOptions(user)); + } + }); + return options; + } + + /** + * pdf模板填充 + * @param data 填充的文本域数据 + * @param exportDto 导出参数 + * @param tenantId 租户id + * @param out 输出流 + */ + private void fillTemp(Map data, AtuPlanExportDto exportDto, String tenantId, + ServletOutputStream out){ + //模板路径,放到系统里用这个ClassPathResource + ClassPathResource classPathResource = new ClassPathResource(MsgConstant.CLASS_PATH_RESOURCE_PDF_TEMP); + InputStream inputStream; + + PdfReader reader; + ByteArrayOutputStream bos; + PdfStamper stamper; + try { + inputStream = classPathResource.getInputStream(); + reader = new PdfReader(inputStream); + bos = new ByteArrayOutputStream(); + stamper = new PdfStamper(reader, bos); + + AcroFields acroFields = stamper.getAcroFields(); + // 模板数据填充 + for (String name : acroFields.getFields().keySet()) { + String value = data.get(name) == null ? "" : data.get(name).toString(); + acroFields.setField(name, value); + } + + // 图片赋值 + PdfContentByte cb = stamper.getOverContent(1); + // 填充脚本执行统计图 + + String barBase64Str = exportDto.getExecResultChartBase64Str(); + if (StrUtil.isNotBlank(barBase64Str)) { + try { + Rectangle barSignRect = acroFields.getFieldPositions(MsgConstant.FIELD_POSITION_SCRIPT_EXECSUM).get(0).position; + //替换转移字符 + String newImageInfo = barBase64Str.replaceAll(" ", "+"); + //取出图片部分 + String[] arr = newImageInfo.split(MsgConstant.REGEX_BASE64); + //添加echarts图片替换数据 + barBase64Str = arr[1]; + byte[] imageBytes = Base64.getDecoder().decode(barBase64Str); + Image barImage = Image.getInstance(imageBytes); + // 设根据域大小设置缩放图片 + barImage.scaleToFit(barSignRect.getWidth(), barSignRect.getHeight()); + // 设置居中 + barImage.setAlignment(Image.MIDDLE); + // 绝对定位 + barImage.setAbsolutePosition(barSignRect.getLeft(), barSignRect.getBottom()); + cb.addImage(barImage); + }catch (Exception e){ + logger.error("填充脚本统计概括异常", e); + } + } + cb.stroke(); + + // 如果为false那么生成的PDF文件还能编辑,一定要设为true + stamper.setFormFlattening(true); + stamper.close(); + + //*******************填充编辑好后的pdf************** + reader = new PdfReader(bos.toByteArray()); + Rectangle pageSize = reader.getPageSize(1); + Document document = new Document(pageSize); + PdfWriter writer = PdfWriter.getInstance(document, out); + writer.setPageEvent(new PageEvent()); + + // 打开文档 + document.open(); + PdfContentByte cbUnder = writer.getDirectContentUnder(); + PdfImportedPage pageTemplate = writer.getImportedPage(reader, 1); + cbUnder.addTemplate(pageTemplate, 0, 0); + + //document.newPage(); + //添加间隙,这里为进行了一个封装,因为这个模板第一页只有一些title啥的, + //重开一页太浪费,只需要确定表格要在什么位置生成,添加一个间隙就可以了 + createBlankTable(writer, document, 360); + // 填充app基础数据 + Map appNameMap = new HashMap<>(); + createAppTable(writer, document, exportDto.getBatchId(), appNameMap); + createBlankTable(writer, document, 50); + // 填充app性能数据 + createAppPerTable(writer, document, exportDto.getBatchId(), tenantId, appNameMap); + createBlankTable(writer, document, 50); + // 填充脚本执行详情 + createTaskTable(writer, document, exportDto.getBatchId()); + + document.close(); + out.close(); + + }catch (Exception e){ + logger.error("模板填充异常", e); + } + } + + private void createTaskTable(PdfWriter writer, Document document, String batchId) + throws IOException, DocumentException { + List tableHeardList = new ArrayList<>(); + tableHeardList.add(MsgConstant.TABLE_HEARD_LIST_SCRIPT_NUM); + tableHeardList.add(MsgConstant.TABLE_HEARD_LIST_SCRIPT_NAME); + tableHeardList.add(MsgConstant.TABLE_HEARD_LIST_TEST_CASE_NAME); + tableHeardList.add(MsgConstant.TABLE_HEARD_LIST_TEST_CASE_TYPE); + tableHeardList.add(MsgConstant.TABLE_HEARD_LIST_TIME_CONSUMING); + tableHeardList.add(MsgConstant.TABLE_HEARD_LIST_EXEC_DEVICE); + tableHeardList.add(MsgConstant.TABLE_HEARD_LIST_EXEC_STATUS); + tableHeardList.add(MsgConstant.TABLE_HEARD_LIST_FAILURE_REASON); + List scriptExecDetailList = getScriptExecDetailList(batchId); + if (CollUtil.isEmpty(scriptExecDetailList)){ + return; + } + Map caseTypeMap = getDictItem(DictConstant.SCRIPT_CASE_TYPE); + Map taskStatusMap = getDictItem(DictConstant.PLAN_TASK_STATUS); + for (BatchScriptExecDetailDto detailDto : scriptExecDetailList) { + if (caseTypeMap.containsKey(detailDto.getCaseType())){ + detailDto.setCaseType(caseTypeMap.get(detailDto.getCaseType())); + } + if (taskStatusMap.containsKey(detailDto.getStatus())){ + detailDto.setStatus(taskStatusMap.get(detailDto.getStatus())); + } + } + createTable(writer, document, MsgConstant.TABLE_TITLE_SCRIPT_EXECUTION_DETAILS, tableHeardList, scriptExecDetailList); + } + + + private void createAppPerTable(PdfWriter writer, Document document, String batchId, + String tenantId, Map appNameMap) + throws IOException, DocumentException { + List appPerList = getBatchAppInfo(batchId, tenantId, appNameMap); + if (CollUtil.isEmpty(appPerList)){ + return; + } + + int totalColumn =11; + PdfPTable table = new PdfPTable(totalColumn); + table.setTotalWidth(520); + table.setPaddingTop(500); + table.setLockedWidth(true); + //居中 + table.setHorizontalAlignment(Element.ALIGN_CENTER); + table.writeSelectedRows(0, -1,500,800,writer.getDirectContentUnder()); + + //定义数据的字体 + BaseFont baseFont = BaseFont.createFont(MsgConstant.FONT_NAME_STSONG_LIGHT,MsgConstant.FONT_ENCODING_UNIGB_UCS2_H,BaseFont.NOT_EMBEDDED); + List appIconPathList = new ArrayList<>(); + appIconPathList.add(MsgConstant.ICON_PATH_APP_APPINSTALLTIME_PNG); + appIconPathList.add(MsgConstant.ICON_PATH_APP_APPSTARTTIME_PNG); + appIconPathList.add(MsgConstant.ICON_PATH_APP_CPU_PNG); + appIconPathList.add(MsgConstant.ICON_PATH_APP_FLOW_PNG); + appIconPathList.add(MsgConstant.ICON_PATH_APP_MEMORY_PNG); + List appIconList = getAllImages(appIconPathList); + List deviceIconPathList = new ArrayList<>(); + deviceIconPathList.add(MsgConstant.ICON_PATH_DEVICE_CPU_PNG); + deviceIconPathList.add(MsgConstant.ICON_PATH_DEVICE_FLOW_PNG); + deviceIconPathList.add(MsgConstant.ICON_PATH_DEVICE_MEMORY_PNG); + deviceIconPathList.add(MsgConstant.ICON_PATH_DEVICE_TEMPERATURE_PNG); + List deviceIconList = getAllImages(deviceIconPathList); + + for (BatchAppInfoDto appInfoDto : appPerList) { + // 添加app性能表格标题 + addAppPerTitle(table, baseFont, "应用[" + appInfoDto.getAppName() + "]性能", totalColumn); + + addBlankCell(table, 1); + // 添加app性能图标 + addIconCell(table, appIconList); + // 添加app性能平均数据 + addBlankCell(table, 1); + List appAvgList = new ArrayList<>(); + appAvgList.add(appInfoDto.getInstallTime()); + appAvgList.add(appInfoDto.getStartElapsedTime()); + appAvgList.add(appInfoDto.getAppCpu()); + appAvgList.add(appInfoDto.getAppFlow()); + appAvgList.add(appInfoDto.getAppMemory()); + addPerCell(appAvgList, table, baseFont, 16, BaseColor.BLUE); + + String maxStr = MsgConstant.MAX_STR+":"; + + // 添加app性能最大值数据 + addBlankCell(table, 1); + List appMaxList = new ArrayList<>(); + String maxInstallTime = appInfoDto.getMaxInstallTime() == null ? "" : maxStr + appInfoDto.getMaxInstallTime(); + appMaxList.add(maxInstallTime); + String maxStartTime = appInfoDto.getMaxStartElapsedTime() == null ? "" : maxStr + appInfoDto.getMaxStartElapsedTime(); + appMaxList.add(maxStartTime); + String maxAppCpu = appInfoDto.getMaxAppCpu() == null ? "" : maxStr + appInfoDto.getMaxAppCpu(); + appMaxList.add(maxAppCpu); + String maxAppFlow = appInfoDto.getMaxAppFlow() == null ? "" : maxStr + appInfoDto.getMaxAppFlow(); + appMaxList.add(maxAppFlow); + String maxAppMemory = appInfoDto.getMaxAppMemory() == null ? "" : maxStr + appInfoDto.getMaxAppMemory(); + appMaxList.add(maxAppMemory); + addPerCell(appMaxList, table, baseFont, 8, BaseColor.RED); + + // 添加设备性能标题 + addAppPerTitle(table, baseFont, "设备[" + appInfoDto.getDeviceName() + "]性能", totalColumn); + addBlankCell(table, 1); + // 添加app性能图标 + addIconCell(table, deviceIconList); + // 设备数据少2列,填充两个空单元格 + addBlankCell(table, 2); + + // 添加设备性能平均数据 + addBlankCell(table, 1); + List deviceAvgList = new ArrayList<>(); + deviceAvgList.add(appInfoDto.getDeviceCpu()); + deviceAvgList.add(appInfoDto.getDeviceFlow()); + deviceAvgList.add(appInfoDto.getDeviceMemory()); + deviceAvgList.add(appInfoDto.getCellTemperature()); + addPerCell(deviceAvgList, table, baseFont, 16, BaseColor.BLUE); + addBlankCell(table, 2); + + // 添加设备性能最大值数据 + addBlankCell(table, 1); + List deviceMaxList = new ArrayList<>(); + String maxDeviceCpu = appInfoDto.getMaxDeviceCpu() == null ? "" : maxStr + appInfoDto.getMaxDeviceCpu(); + deviceMaxList.add(maxDeviceCpu); + String maxDeviceFlow = appInfoDto.getMaxDeviceFlow() == null ? "" : maxStr + appInfoDto.getMaxDeviceFlow(); + deviceMaxList.add(maxDeviceFlow); + String maxDeviceMemory = appInfoDto.getMaxDeviceMemory() == null ? "" : maxStr + appInfoDto.getMaxDeviceMemory(); + deviceMaxList.add(maxDeviceMemory); + String maxCellTemperature = appInfoDto.getMaxCellTemperature() == null ? "" : maxStr + appInfoDto.getMaxCellTemperature(); + deviceMaxList.add(maxCellTemperature); + addPerCell(deviceMaxList, table, baseFont, 8, BaseColor.RED); + addBlankCell(table, 2); + } + document.add(table); + } + + private void addPerCell(List dataList, PdfPTable table, BaseFont baseFont, int fontSize, BaseColor color){ + Font font = new Font(baseFont, fontSize, Font.NORMAL); + font.setColor(color); + for (String str : dataList) { + PdfPCell cell = new PdfPCell(); + //垂直居中 + cell.setVerticalAlignment(Element.ALIGN_MIDDLE); + // 水平居左 + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setPhrase(new Phrase(str, font)); + cell.setPaddingLeft(10); + cell.setBorder(Rectangle.NO_BORDER); + cell.setColspan(2); + table.addCell(cell); + } + } + + private void addIconCell(PdfPTable table, List images) throws IOException, BadElementException { + if (CollUtil.isEmpty(images)){ + return; + } + for (byte[] bytes : images) { + PdfPCell cell = new PdfPCell(); + cell.setVerticalAlignment(Element.ALIGN_MIDDLE); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + Image image = Image.getInstance(bytes); + image.scaleAbsolute(30, 30); + cell.addElement(image); + cell.setPaddingLeft(5); + cell.setBorder(Rectangle.NO_BORDER); + cell.setColspan(2); + table.addCell(cell); + } + } + + private List getAllImages(List dirList){ + List images = new ArrayList<>(); + if (CollUtil.isEmpty(dirList)){ + return images; + } + dirList.forEach(dir -> { + ClassPathResource resource = new ClassPathResource(dir); + try { + byte[] imageBytes = IoUtil.readBytes(resource.getInputStream()); + images.add(imageBytes); + } catch (IOException e) { + logger.error("获取文件失败,e,{}", e); + throw new PlatformRuntimeException(ExecPlanError.GET_FILE_FAIL); + } + }); + return images; + } + + private void addBlankCell(PdfPTable table, int colspan){ + PdfPCell blankCell = new PdfPCell(); + blankCell.setBorder(Rectangle.NO_BORDER); + blankCell.setColspan(colspan); + table.addCell(blankCell); + } + + private void addAppPerTitle(PdfPTable table, BaseFont baseFont, String title, int colSpan){ + Font appTitleFont = new Font(baseFont, 16, Font.NORMAL); + PdfPCell appTitleCell = new PdfPCell(); + appTitleCell.setPhrase(new Phrase(title, appTitleFont)); + appTitleCell.setColspan(colSpan); + appTitleCell.setVerticalAlignment(Element.ALIGN_MIDDLE); + appTitleCell.setHorizontalAlignment(Element.ALIGN_LEFT); + appTitleCell.setBorder(Rectangle.NO_BORDER); + table.addCell(appTitleCell); + } + + private void createAppTable(PdfWriter writer, Document document, String batchId, Map appNameMap) + throws IOException, DocumentException { + List headList = new ArrayList<>(); + headList.add(MsgConstant.HEAD_LIST_APP_NAME); + headList.add(MsgConstant.HEAD_LIST_APP_VERSION); + headList.add(MsgConstant.HEAD_LIST_PACKAGE_NAME); + headList.add(MsgConstant.HEAD_LIST_CHANNEL_NAME); + headList.add(MsgConstant.HEAD_LIST_VERSION_NOTES); + List appBaseInfoList = getAppBaseInfo(batchId, appNameMap); + if (CollUtil.isEmpty(appBaseInfoList)){ + return; + } + Map platformMap = getDictItem(DictConstant.MOBILE_PLATFORM_TYPE); + for (AppBaseInfoDto baseInfoDto : appBaseInfoList) { + if (platformMap.containsKey(baseInfoDto.getChannelName())){ + baseInfoDto.setChannelName(platformMap.get(baseInfoDto.getChannelName())); + } + } + createTable(writer, document, MsgConstant.TABLE_TITLE_APP_LIST, headList, appBaseInfoList); + } + + + private void createBlankTable(PdfWriter writer, Document document, int height) + throws DocumentException, IOException { + final BaseFont font = BaseFont.createFont(MsgConstant.FONT_NAME_STSONG_LIGHT, MsgConstant.FONT_ENCODING_UNIGB_UCS2_H, BaseFont.NOT_EMBEDDED); + PdfPTable table = new PdfPTable(new float[]{30}); + table.setTotalWidth(520); + table.setPaddingTop(500); + table.setLockedWidth(true); + //居中 + table.setHorizontalAlignment(Element.ALIGN_CENTER); + table.writeSelectedRows(0, -1, 500, 800, writer.getDirectContentUnder()); + Font textFont = new Font(font, 10, Font.NORMAL); + PdfPCell cell = new PdfPCell(new Paragraph(" ", textFont)); + + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + + cell.setVerticalAlignment(Element.ALIGN_BOTTOM); + + cell.setBorder(Rectangle.NO_BORDER); + cell.setFixedHeight(height); + + cell.setColspan(1); + + table.addCell(cell); + document.add(table); + } + + /** + * 添加表格 + * @param writer 写入 + * @param document 文档 + * @param title 表格标题 + * @param tableHeadList 表格表头 + * @param tableDataList 表格数据 + * @throws DocumentException 文档异常 + * @throws IOException io异常 + */ + private void createTable(PdfWriter writer, Document document, String title, + List tableHeadList, List tableDataList) + throws DocumentException, IOException { + + PdfPTable table = new PdfPTable(tableHeadList.size()); + table.setTotalWidth(520); + table.setPaddingTop(500); + table.setLockedWidth(true); + //居中 + table.setHorizontalAlignment(Element.ALIGN_CENTER); + table.writeSelectedRows(0, -1,500,800,writer.getDirectContentUnder()); + //每页都显示表头,输入几就是第几行的表头固定 + table.setHeaderRows(2); + + //定义数据的字体 + BaseFont baseFont = BaseFont.createFont(MsgConstant.FONT_NAME_STSONG_LIGHT,MsgConstant.FONT_ENCODING_UNIGB_UCS2_H,BaseFont.NOT_EMBEDDED); + Font textFont = new Font(baseFont, 6, Font.NORMAL); + Font titleFont = new Font(baseFont, 12, Font.NORMAL); + + //填充标题 + PdfPCell headCell = new PdfPCell(); + headCell.setRowspan(1); + headCell.setColspan(tableHeadList.size()); + headCell.setFixedHeight(30); + headCell.setVerticalAlignment(Element.ALIGN_MIDDLE); + headCell.setHorizontalAlignment(Element.ALIGN_CENTER); + headCell.setPhrase(new Phrase(title, titleFont)); + table.addCell(headCell); + + // 填充表头 + for (String tableHead : tableHeadList) { + table.addCell(createSetCell(tableHead, textFont)); + } + + //填充列表数据 + for (Object obj : tableDataList) { + Class clazz = obj.getClass(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + // 设置为可访问 + field.setAccessible(true); + try { + String value = field.get(obj) == null ? "" : field.get(obj).toString(); + table.addCell(createSetCell(value, textFont)); + }catch (Exception e) { + logger.error("填充数据异常", e); + } + } + } + document.add(table); + } + + + /** + * 为一个表格添加内容 + * @param value 值 + * @param font 字体 + * @return 单元格 + */ + public PdfPCell createSetCell(String value,Font font){ + PdfPCell cell = new PdfPCell(); + cell.setPhrase(new Phrase(value,font)); + cell.setVerticalAlignment(Element.ALIGN_MIDDLE); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setMinimumHeight(20); + return cell; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer clonePlan(List batch) + { + List planList = new ArrayList<>(); + for (String targetId : batch) { + String planId = this.clonePlanInfo(targetId); + planList.add(planId); + } + return planList.size(); + } + + /** + * 计划执行 + * + * @param atuPlanRunDto 执行参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void run(AtuPlanRunDto atuPlanRunDto) { + + Map offlineMap = checkDeviceOffline(atuPlanRunDto.getPlanId(), atuPlanRunDto.getBatchId()); + logger.debug("校验设备是否离线结果: {}", JSONUtil.toJsonStr(offlineMap)); + Object allOfflineObj = offlineMap.get(PlanConstant.DEVICE_OFFLINE_KEY); + if (allOfflineObj != null && PlanConstant.DEVICE_OFFLINE_ALL == Integer.parseInt(allOfflineObj.toString())) { + logger.error("该计划绑定的设备已全部离线"); + return; + } + atuPlanRunDto.setBatchId(offlineMap.get(PlanConstant.PLAN_BATCH_ID).toString()); + + // 1.查询计划信息 + AtuPlanInfo planInfo = this.atuPlanInfoService.findByPrimaryKey(atuPlanRunDto.getPlanId()); + if (ObjectUtil.isNull(planInfo)){ + throw new PlatformRuntimeException(ExecPlanError.PLAN_IS_NULL); + } + if (!planInfo.getEnabled()) {//false为禁用 + throw new PlatformRuntimeException(ExecPlanError.PLAN_IS_UN_ENABLE); + } + String tenantId = planInfo.getTenantId(); + NKSecurityContext.setTenantId(tenantId); + logger.debug("生成计划批次信息"); + AtuPlanBatch planBatch = new AtuPlanBatch(); + if (StrUtil.isBlank(atuPlanRunDto.getBatchId())){ + planBatch.setId(IdUtil.simpleUUID()); + }else{ + planBatch.setId(atuPlanRunDto.getBatchId()); + } + planBatch.setPlanId(atuPlanRunDto.getPlanId()); + int batchIdx = Objects.requireNonNull(redisTemplate.opsForValue() + .increment(RedisConstant.PLAN_BATCH_NUM_KEY + atuPlanRunDto.getPlanId())).intValue(); + planBatch.setBatch(batchIdx); + planBatch.setCreatedTime(new Date()); + planBatch.setExecutedBy(atuPlanRunDto.getExecutedBy()); + planBatch.setTriggerType(atuPlanRunDto.getTriggerType()); + + logger.info("查询计划绑定的环境id"); + List envIdList = planEnvLinkService.queryEnvIdByPlanIdOderBySort(planInfo.getId()); + logger.info("绑定的环境数量:" + envIdList.size()); + if (CollUtil.isEmpty(envIdList)){ + throw new PlatformRuntimeException(ExecPlanError.PLAN_ENV_IS_NULL); + } + Map caseMap; + try { + // 3.获取计划绑定的用例集 + caseMap = processBatchCaseSetData(planInfo, envIdList); + logger.debug("脚本用例类型信息 => " + JSONUtil.toJsonStr(caseMap)); + + int taskTotal = Integer.parseInt(caseMap.get(PlanConstant.TASK_TOTAL).toString()); + planBatch.setTaskTotal(taskTotal); + + long waitTotal = Long.parseLong(caseMap.get(PlanConstant.WAIT_TOTAL).toString()); + + int scriptTotal = Integer.parseInt(caseMap.get(PlanConstant.SCRIPT_TOTAL).toString()); + planBatch.setScriptNum(scriptTotal); + logger.debug("脚本总数为:" + scriptTotal); + + planBatch.setSuccessRate(MsgConstant.PLAN_BATCH_SUCCESS_RATE); + + // 判断用例是否全部删除 + if (taskTotal > 0) { + // 4.保存计划批次信息 + atuPlanBatchService.insert(planBatch); + + // 4.1 缓存批次的统计信息 + logger.info("缓存批次的统计信息 batchId=>" + planBatch.getId() + ", batch=>" + planBatch.getBatch() + + ", taskTotal=>" + taskTotal); + + // 缓存脚本统计信息 + String clusterPrefix = RedisConstant.CLUSTER_KEY_PREFIX + planBatch.getId().substring(0,4) + + RedisConstant.CLUSTER_KEY_SUFFIX; + String scriptSumKey = clusterPrefix + RedisConstant.BATCH_SCRIPT_SUM_KEY + planBatch.getId(); + redisTemplate.opsForHash().put(scriptSumKey, clusterPrefix + PlanConstant.PLAN_BATCH_NUM, planBatch.getBatch()); + redisTemplate.opsForHash().put(scriptSumKey, clusterPrefix + PlanConstant.SCRIPT_TOTAL, scriptTotal); + redisTemplate.opsForHash().put(scriptSumKey, clusterPrefix + PlanConstant.TASK_WAIT_EXECUTE_STATUS, waitTotal); + + logger.debug("更新计划信息最后批次信息"); + planInfo.setStatus(PlanConstant.PLAN_WAITING_STATUS); + planInfo.setLastBatchId(planBatch.getId()); + planInfo.setWaitingNum((int) waitTotal); + planInfo.setRunningNum(0); + planInfo.setSuccessNum(0); + planInfo.setExecFailNum(0); + planInfo.setAssertFailNum(0); + planInfo.setTimeoutNum(0); + planInfo.setCancelNum(0); + planInfo.setLastExecTime(new Date()); + atuPlanInfoService.updateByPrimaryKey(planInfo); + // 计划的更新方法会获取当前的租户,计划定时执行时会导致租户为空 + planInfo.setTenantId(tenantId); + + List inputDataList = (List) caseMap.get(PlanConstant.SCRIPT_INPUT_LIST); + if (CollUtil.isEmpty(inputDataList)) { + throw new PlatformRuntimeException(ExecPlanError.SCRIPT_INPUT_DATA_IS_NULL); + } + if (planInfo.getFailRetry() && PlanConstant.TASK_RETRY_STRATEGY_PACKAGE.equals(planInfo.getRetryStrategy())) { + redisTemplate.opsForHash().put(RedisConstant.PLAN_BATCH_RETRY_COUNT, planBatch.getId(), planInfo.getFailRetryCount()); + } + // 异步生成任务 + executor.execute(() ->{ + boolean hasOfflineDevice = StrUtil.isNotBlank(atuPlanRunDto.getBatchId()); + List pcDeviceList = new ArrayList<>(); + List mobDeviceList = new ArrayList<>(); + saveBatchDeviceLink(planInfo.getId(), planBatch.getId(), hasOfflineDevice, false, pcDeviceList, mobDeviceList); + + atuPlanTaskApiService.createdScriptTaskInfo(planInfo, planBatch.getId() , envIdList, inputDataList); + // 6.生成委托信息 + try { + // 创建委托信息 + createEntrustMsg(planBatch.getId(), planInfo.getId(), planInfo.getPriority(), pcDeviceList, mobDeviceList, caseMap); + }catch (Exception e){ + logger.error("计划批次委托失败", e); + throw new PlatformRuntimeException(ExecPlanError.PLAN_ENTRUST_FAIL); + + } + }); + }else { + logger.debug("计划用例全部删除批次完成"); + saveFinishBatchAndPlan(planInfo, planBatch); + } + }catch (Exception e){ + logger.error("计划批次创建失败", e); + // 回退批次号 + redisTemplate.opsForValue().increment(RedisConstant.PLAN_BATCH_NUM_KEY + atuPlanRunDto.getPlanId(), -1); + throw new PlatformRuntimeException(ExecPlanError.PLAN_EXECUTE_FAIL, e.getMessage()); + } + } + + /** + * 批次结束保存状态与计划信息 + * @param planInfo 计划信息 + * @param planBatch 批次信息 + */ + private void saveFinishBatchAndPlan(AtuPlanInfo planInfo, AtuPlanBatch planBatch){ + // 4.保存计划批次信息 + planBatch.setStatus(PlanConstant.BATCH_FINISH_STATUS); + Date date = new Date(); + planBatch.setStartTime(date); + planBatch.setEndTime(date); + planBatch.setSuccessNum(0); + planBatch.setExecFailNum(0); + planBatch.setAssertFailNum(0); + planBatch.setTimeoutNum(0); + planBatch.setCancelNum(0); + //增加devops调用时 塞值批次生成渠道channel和devops请求id todo + atuPlanBatchService.insert(planBatch); + + // 5.更新计划信息最后批次信息 + planInfo.setStatus(PlanConstant.PLAN_FINISH_STATUS); + planInfo.setLastBatchId(planBatch.getId()); + planInfo.setWaitingNum(planBatch.getTaskTotal()); + planInfo.setRunningNum(0); + planInfo.setSuccessNum(0); + planInfo.setExecFailNum(0); + planInfo.setAssertFailNum(0); + planInfo.setTimeoutNum(0); + planInfo.setCancelNum(0); + planInfo.setLastExecTime(new Date()); + atuPlanInfoService.updateByPrimaryKey(planInfo); + } + + /** + * 处理批次用例集数据 + * @param planInfo 计划信息 + * @return 结果 + */ + private Map processBatchCaseSetData(AtuPlanInfo planInfo, List envIdList){ + logger.info("查询计划绑定的脚本数据"); + AtuPlanScriptLink params = new AtuPlanScriptLink(); + params.setPlanId(planInfo.getId()); + List planScriptLinkList = planScriptLinkService.query(params); + logger.info("绑定脚本数据大小 => " + planScriptLinkList.size()); + + logger.info("判断该批次存在哪种类型用例"); + Map caseMap = new HashMap<>(); + caseMap.put(MsgConstant.CASEMAP_HAS_PC, false); + caseMap.put(MsgConstant.CASEMAP_HAS_MOB, false); + caseMap.put(MsgConstant.CASEMAP_HAS_INTERFACE, false); + Map scriptTypeMap = new HashMap<>(); + Map> unselectedInputMap = new HashMap<>(); + for (AtuPlanScriptLink scriptLink : planScriptLinkList) { + if (!unselectedInputMap.containsKey(scriptLink.getScriptId())){ + unselectedInputMap.put(scriptLink.getScriptId(), CollUtil.newArrayList()); + } + scriptTypeMap.put(scriptLink.getScriptId(), scriptLink.getScriptType()); + handleAutoType(scriptLink.getScriptType(), caseMap); + } + logger.info("用例类型:" + JSONUtil.toJsonStr(caseMap)); + // 根据用例集ID查询未删除用例总数 + getTaskTotal(unselectedInputMap, scriptTypeMap, envIdList, caseMap); + return caseMap; + } + + @Override + public void handleAutoType(String scriptType, Map caseMap){ + switch (scriptType){ + case PlanConstant.SCRIPT_TYPE_API: + caseMap.put(MsgConstant.CASEMAP_HAS_INTERFACE, true); + break; + case PlanConstant.SCRIPT_TYPE_BS: + case PlanConstant.SCRIPT_TYPE_CS: + caseMap.put(MsgConstant.CASEMAP_HAS_PC, true); + break; + case PlanConstant.SCRIPT_TYPE_ANDROID: + case PlanConstant.SCRIPT_TYPE_IOS: + caseMap.put(MsgConstant.CASEMAP_HAS_MOB, true); + break; + case PlanConstant.SCRIPT_TYPE_SCENE: + caseMap.put(MsgConstant.CASEMAP_HAS_INTERFACE, true); + caseMap.put(MsgConstant.CASEMAP_HAS_PC, true); + caseMap.put(MsgConstant.CASEMAP_HAS_MOB, true); + break; + default: + logger.error("脚本类型异常 type => " + scriptType); + break; + } + } + + /** + * 获取任务总数 + * @return 总数 + */ + private void getTaskTotal(Map> unselectedInputMap, + Map scriptTypeMap, List envIdList, + Map caseMap){ + int total = 0; + caseMap.put(PlanConstant.WAIT_TOTAL, 0); + caseMap.put(PlanConstant.TASK_TOTAL, total); + List inputDataList = new ArrayList<>(); + caseMap.put(PlanConstant.SCRIPT_INPUT_LIST, inputDataList); + List scriptIdAllList = new ArrayList<>(unselectedInputMap.keySet()); + caseMap.put(PlanConstant.SCRIPT_TOTAL, scriptIdAllList.size()); + + logger.info("调用脚本用例服务查询脚本输入项存放地址信息"); + AtuPlanInputQueryDto queryDto = new AtuPlanInputQueryDto(); + queryDto.setEnvIdList(envIdList); + queryDto.setScriptIdList(scriptIdAllList); + // 查询脚本输入项文件地址 + try { + ResultWrapper> queryResult = publicFeignClient.queryInputByEnvIdAndScriptId(queryDto); + if (queryResult != null && queryResult.isSuccess()){ + if (CollUtil.isEmpty(queryResult.getData())){ + logger.debug("无输入项数据"); + return; + } + inputDataList = queryResult.getData(); + } + }catch (Exception e){ + logger.error("查询脚本输入项数据异常", e); + throw new PlatformRuntimeException(ExecPlanError.QUERY_SCRIPT_INPUT_IS_NULL); + } + logger.info("脚本输入项:" + inputDataList); + if (CollUtil.isEmpty(inputDataList)) { + return; + } + logger.info("下载数据文件,并解析"); + for (AtuPlanInputDto atuPlanInputDto : inputDataList) { + String[] resultPath = MinioPathUtils.idToPath(atuPlanInputDto.getDataUrl()); + InputStream inputStream = null; + List> dataList; + try { + inputStream = simpleStorageService.downloadAsStream(resultPath[0], "/" + resultPath[1]); + ScriptInputFileDto fileData = MinioPathUtils.getFileContent(inputStream, ScriptInputFileDto.class); + //获取数据 + dataList = fileData.getTableContent(); + + } catch (FileDownloadException e) { + logger.error("读取环境[{}]脚本[{}]输入项文件失败,文件地址:{}", + atuPlanInputDto.getEnvId(), atuPlanInputDto.getScriptId(), atuPlanInputDto.getDataUrl()); + logger.error("失败原因:", e); + ResultWrapper> wrapper = publicFeignClient.queryScriptDetailMap(Sets.newHashSet(atuPlanInputDto.getScriptId())); + String scriptName = ""; + if (wrapper.getData() != null) { + scriptName = wrapper.getData().get(atuPlanInputDto.getScriptId()).getScriptName(); + } + throw new PlatformRuntimeException(ExecPlanError.QUERY_SCRIPT_INPUT_ERROR, envNameUtils.getEnvName(atuPlanInputDto.getEnvId()), + scriptName, e.getMessage()); + } finally { + if (null != inputStream) { + try { + inputStream.close(); + } catch (IOException e) { + logger.error("",e); + } + } + } + logger.debug("例集用例数据为" + dataList); + if (CollUtil.isEmpty(dataList)){ + logger.debug("该用例集无用例数据"); + continue; + } + // 排除未被选择的意图 + if (unselectedInputMap.containsKey(atuPlanInputDto.getScriptId())){ + List unselectedList = unselectedInputMap.get(atuPlanInputDto.getScriptId()); + if (CollUtil.isNotEmpty(unselectedList)) { + Iterator> iterator = dataList.iterator(); + while (iterator.hasNext()){ + Map dataMap = iterator.next(); + for (String caseId : unselectedList) { + if (dataMap.get(PlanConstant.SCRIPT_TEST_PURPOSE_ID).equals(caseId)){ + iterator.remove(); + } + } + } + } + } + atuPlanInputDto.setDataList(dataList); + atuPlanInputDto.setScriptType(scriptTypeMap.get(atuPlanInputDto.getScriptId())); + total = total + dataList.size(); + } + logger.info("脚本输入项数据:" + inputDataList); + caseMap.put(PlanConstant.TASK_TOTAL, total); + caseMap.put(PlanConstant.SCRIPT_INPUT_LIST, inputDataList); + long count = inputDataList.stream() + .filter(inputData -> CollUtil.isNotEmpty(inputData.getDataList())) + .map(AtuPlanInputDto::getScriptId) + .distinct() + .count(); + caseMap.put(PlanConstant.WAIT_TOTAL, count); + } + + + public void saveBatchDeviceLink(String planId, String batchId, boolean hasOfflineDevice, boolean isRetry, + List pcDeviceList, List mobDeviceList){ + logger.debug("保存在线计划设备至批次设备绑定"); + // 1.查询计划设备信息 + AtuPlanDeviceLink planDeviceLink = new AtuPlanDeviceLink(); + planDeviceLink.setPlanId(planId); + List planDeviceLinks = atuPlanDeviceLinkService.query(planDeviceLink); + + // 获取缓存执行时离线的设备ID + List offlineDeviceIdList = new ArrayList<>(); + if (hasOfflineDevice){ + Object offlineDeviceId = redisTemplate.opsForValue().get(RedisConstant.PLAN_BATCH_OFFLINE_DEVICE + batchId); + if (offlineDeviceId != null){ + offlineDeviceIdList = JSONUtil.toList(offlineDeviceId.toString(), String.class); + // 删除缓存中的离线设备信息 + redisTemplate.delete(RedisConstant.PLAN_BATCH_OFFLINE_DEVICE + batchId); + } + } + logger.debug("离线设备id集合: {}", JSONUtil.toJsonStr(offlineDeviceIdList)); + + List batchDeviceList = new ArrayList<>(); + // 1.1.获取PC与移动设备集合 + for (AtuPlanDeviceLink deviceLink : planDeviceLinks) { + // 过滤离线设备ID + if (CollUtil.isNotEmpty(offlineDeviceIdList) && offlineDeviceIdList.contains(deviceLink.getDeviceId())){ + continue; + } + EntrustDeviceDto deviceDto = new EntrustDeviceDto(); + deviceDto.setDeviceId(deviceLink.getDeviceId()); + deviceDto.setBrowserType(deviceLink.getBrowserType()); + + if (ObjectUtil.equal(PlanConstant.DEVICE_TYPE_PC, deviceLink.getDeviceType())){ + pcDeviceList.add(deviceDto); + }else if (ObjectUtil.equal(PlanConstant.DEVICE_TYPE_MOBILE, deviceLink.getDeviceType())){ + mobDeviceList.add(deviceDto); + } + AtuPlanBatchDeviceLink batchDevice = new AtuPlanBatchDeviceLink(); + batchDevice.setId(IdUtil.simpleUUID()); + batchDevice.setBatchId(batchId); + batchDevice.setDeviceId(deviceLink.getDeviceId()); + batchDevice.setDeviceType(deviceLink.getDeviceType()); + batchDevice.setOffline(false); + batchDeviceList.add(batchDevice); + } + + // 插入批次设备绑定信息表 + if (CollUtil.isEmpty(batchDeviceList)){ + throw new PlatformRuntimeException(ExecPlanError.PLAN_DEVICE_IS_NULL); + } + List deviceLinks = updateDeviceOfflineInfo(batchDeviceList); + if (isRetry){ + for (AtuPlanBatchDeviceLink deviceLink : deviceLinks) { + if (deviceLink.getOffline()){ + atuPlanBatchDeviceLinkService.updateByPrimaryKey(deviceLink); + } + } + }else { + atuPlanBatchDeviceLinkService.insertByBatch(deviceLinks); + } + } + + /** + * 创建委托信息 + * @param planId 计划ID + * @param priority 优先级 + * @param batchId 批次ID + * @param hasOfflineDevice 是否含有离线设备 + */ + @Override + public void handlePlanDevice(String planId, String priority, String batchId, + boolean hasOfflineDevice, Map caseMap, boolean isRetry){ + List pcDeviceList = new ArrayList<>(); + List mobDeviceList = new ArrayList<>(); + saveBatchDeviceLink(planId, batchId, hasOfflineDevice, isRetry, pcDeviceList, mobDeviceList); + // 创建委托信息 + createEntrustMsg(batchId, planId, priority, pcDeviceList, mobDeviceList, caseMap); + } + + @Override + public AtuPlanInfo findByBatchId(String batchId) { + return this.atuPlanInfoService.findByBatchId(batchId); + } + + /** + * 更新设备离线信息 + * @param batchDeviceList 批次设备列表 + * @return 更新后列表信息 + */ + private List updateDeviceOfflineInfo(List batchDeviceList){ + // 查询设备是否离线及离线时间 + List deviceIds = batchDeviceList.stream().map(AtuPlanBatchDeviceLink::getDeviceId).collect(Collectors.toList()); + logger.debug("批次设备列表 => " + JSONUtil.toJsonStr(deviceIds)); + // 设备离线状态查询 + List> offlineDeviceList = new ArrayList<>(); + try { + offlineDeviceList = publicFeignClient.queryDeviceStatus(deviceIds); + }catch (Exception e){ + logger.error("查询设备离线信息异常 => ", e); + //throw new PlatformRuntimeException(ExecPlanError.QUERY_DEVICE_OFFLINE_INFO); + } + if (CollUtil.isEmpty(offlineDeviceList)){ + return batchDeviceList; + } + Map offlineMap = new HashMap<>(); + for (Map map : offlineDeviceList) { + offlineMap.put(map.get(MsgConstant.OFFLINE_MAP_DEVICE_ID).toString(), map.get(MsgConstant.LAST_HEART_BEAT_TIME)); + } + + for (AtuPlanBatchDeviceLink batchDeviceLink : batchDeviceList) { + if (offlineMap.containsKey(batchDeviceLink.getDeviceId())){ + batchDeviceLink.setOffline(true); + long offlineTime = Long.parseLong(offlineMap.get(batchDeviceLink.getDeviceId()).toString()); + String format = DateUtil.format(new Date(offlineTime), PlanConstant.DATETIME_FORMAT); + batchDeviceLink.setOfflineTime(DateUtil.parse(format)); + } + } + + return batchDeviceList; + } + + /** + * 创建委托信息 + * @param batchId 批次号 + * @param planId 计划ID + * @param priority 优先级 + * @param pcDeviceList PC设备集合 + * @param mobDeviceList 移动设备集合 + * @param caseMap 用例分类集合 + */ + private void createEntrustMsg(String batchId, String planId, String priority, List pcDeviceList, + List mobDeviceList, Map caseMap){ + logger.debug("创建委托信息"); + List deviceTypeList = new ArrayList<>(); + if (CollUtil.isNotEmpty(pcDeviceList)){ + List pcDeviceIdList = pcDeviceList.stream().map(EntrustDeviceDto::getDeviceId).collect(Collectors.toList()); + DeviceListDto deviceListDto = new DeviceListDto(); + deviceListDto.setType(PlanConstant.DEVICE_TYPE_PC); + deviceListDto.setDeviceList(pcDeviceIdList); + deviceTypeList.add(deviceListDto); + } + if (CollUtil.isNotEmpty(mobDeviceList)){ + List mobDeviceIdList = mobDeviceList.stream().map(EntrustDeviceDto::getDeviceId).collect(Collectors.toList()); + DeviceListDto deviceListDto = new DeviceListDto(); + deviceListDto.setType(PlanConstant.DEVICE_TYPE_MOBILE); + deviceListDto.setDeviceList(mobDeviceIdList); + deviceTypeList.add(deviceListDto); + } + + logger.debug("查询引擎信息"); + List engineInfoList; + try { + logger.debug("查询引擎信息参数 => " + JSONUtil.toJsonStr(deviceTypeList)); + engineInfoList = publicFeignClient.queryEngineByType(deviceTypeList); + logger.debug("查询引擎信息结果 => " + JSONUtil.toJsonStr(engineInfoList)); + }catch (Exception e){ + logger.error("获取引擎信息异常", e); + throw new PlatformRuntimeException(ExecPlanError.QUERY_ENGINE_INFO_ERROR); + } + + if (CollUtil.isEmpty(engineInfoList)){ + logger.error("引擎信息不存在"); + } + + logger.debug("用例分类信息 => " +JSONUtil.toJsonStr(caseMap)); + boolean hasPc = (boolean) caseMap.get(MsgConstant.CASEMAP_HAS_PC); + boolean hasMob = (boolean) caseMap.get(MsgConstant.CASEMAP_HAS_MOB); + boolean hasApi = (boolean) caseMap.get(MsgConstant.CASEMAP_HAS_INTERFACE); + + logger.debug("发送委托信息至消息队列"); + for (EngineInfoListDto engineInfoListDto : engineInfoList) { + logger.debug("引擎类型:{}", engineInfoListDto.getType()); + if (CollUtil.isEmpty(engineInfoListDto.getEngineInfoList())){ + continue; + } + AtuEntrustMsgDto entrustMsg = new AtuEntrustMsgDto(); + entrustMsg.setPlanId(planId); + entrustMsg.setBatchId(batchId); + entrustMsg.setPriority(priority); + // 2.1.PC类引擎委托 + if (hasPc) { + // 创建任务队列 + logger.debug("发送PC引擎委托"); + String queueName = RabbitConstant.TASK_EXEC_QUEUE_PC_KEY + batchId; + logger.debug("PC设备集合 => " + JSONUtil.toJsonStr(pcDeviceList)); + if (CollUtil.isNotEmpty(pcDeviceList)) { + amqpAdmin.declareQueue(new Queue(queueName)); + sendEntrustMsgToQueue(entrustMsg, engineInfoListDto.getEngineInfoList(), + PlanConstant.ENGINE_TYPE_PC, queueName, pcDeviceList); + } + } + if (hasMob){ + // 2.2.移动类引擎委托 + logger.debug("发送移动引擎委托"); + logger.debug("移动设备集合 => " + JSONUtil.toJsonStr(mobDeviceList)); + if (CollUtil.isNotEmpty(mobDeviceList)){ + // 区分ios和安卓 + Map> deviceTypeMap; + List deviceIdList = mobDeviceList.stream().map(EntrustDeviceDto::getDeviceId).collect(Collectors.toList()); + try { + ResultWrapper>> resultWrapper = publicFeignClient.queryDeviceType(deviceIdList); + if (resultWrapper == null || !resultWrapper.isSuccess() || resultWrapper.getData() == null){ + throw new PlatformRuntimeException(ExecPlanError.QUERY_MOBILE_DEVICE_TYPE_IS_NULL); + } + deviceTypeMap = resultWrapper.getData(); + }catch (Exception e){ + logger.error("查询移动设备分类异常", e); + throw new PlatformRuntimeException(ExecPlanError.QUERY_MOBILE_DEVICE_TYPE_IS_NULL); + } + deviceTypeMap.forEach((type, deviceList) -> { + String name = MobilePlatformEnum.getNameByType(type); + logger.debug("移动端执行平台为:{}", name); + String queueName = RabbitConstant.TASK_EXEC_QUEUE_MOB_KEY + name + "." + batchId; + amqpAdmin.declareQueue(new Queue(queueName)); + List mobileTypeList = mobDeviceList.stream() + .filter(entrustDeviceDto -> deviceList.contains(entrustDeviceDto.getDeviceId())) + .collect(Collectors.toList()); + logger.debug("设备数量为:{}", mobileTypeList.size()); + sendEntrustMsgToQueue(entrustMsg, engineInfoListDto.getEngineInfoList(), + PlanConstant.ENGINE_TYPE_MOBILE, queueName, mobileTypeList); + }); + } + } + if (hasApi) { + // 2.3.接口类引擎委托 + logger.debug("发送接口引擎委托"); + String queueName = RabbitConstant.TASK_EXEC_QUEUE_API_KEY + batchId; + logger.debug("接口PC设备集合 => " + JSONUtil.toJsonStr(pcDeviceList)); + if (CollUtil.isNotEmpty(pcDeviceList)) { + amqpAdmin.declareQueue(new Queue(queueName)); + sendEntrustMsgToQueue(entrustMsg, engineInfoListDto.getEngineInfoList(), + PlanConstant.ENGINE_TYPE_API, queueName, pcDeviceList); + } + } + } + } + + /** + * 发送委托信息至队列 + * @param entrustMsg 委托信息 + * @param engineInfoList 引擎集合 + * @param type 引擎类型 + * @param queueName 队列名称 + * @param deviceList 设备集合 + */ + private void sendEntrustMsgToQueue(AtuEntrustMsgDto entrustMsg, + List> engineInfoList, String type, String queueName, + List deviceList){ + entrustMsg.setType(type); + entrustMsg.setQueueName(queueName); + entrustMsg.setDeviceList(deviceList); + logger.debug("委托引擎信息 => " + JSONUtil.toJsonStr(engineInfoList)); + for (Map engineInfo : engineInfoList) { + entrustMsg.setIp(engineInfo.get("ip")); + entrustMsg.setPort(Integer.parseInt(engineInfo.get("port"))); + logger.debug("委托信息 => " + JSONUtil.toJsonStr(entrustMsg)); + amqpTemplate.convertAndSend(RabbitConstant.PLAN_BATCH_ENTRUST, JSONUtil.toJsonStr(entrustMsg)); + } + } + + + //克隆计划名称 + public String getComNewName(AtuPlanInfo target) { + AtuPlanInfo atuPlanInfo = new AtuPlanInfo(); + String name = target.getPlanName(); + name = name.replace("(","\\(") + .replace(")","\\)") + .replace("^","\\^") + .replace("*","\\*") + .replace("+","\\+")+"-副本(\\([0-9]{1,2}\\)$)"; + atuPlanInfo.setPlanName(name); + atuPlanInfo.setTenantId(NKSecurityContext.getTenantId()); + atuPlanInfo.setProjectId(target.getProjectId()); + + String mdName = atuPlanInfoService.clonePlanName(atuPlanInfo); + int md = getMaxNum(mdName); + + return target.getPlanName()+"-副本("+ md +")"; + } + + + + private int getMaxNum(String getName){ + int last = 0; + if (StringUtils.isEmpty(getName)) { + last = 1; + }else{ + String reg = "(\\([0-9]{1,2}\\)$)"; + Pattern pattern = Pattern.compile(reg); + Matcher matcher = pattern.matcher(getName); + while (matcher.find()) { + String value = matcher.group(); + int integer = Integer.parseInt(value.substring(1, value.length() - 1)); + last = integer+1; + } + } + return last; + } + + + //feign调用:校验数据 + public Map checkPlanData(AtuScriptInfoFeignDto feignDto) { + ResultWrapper> wrapper = scriptCaseFeignClient.checkPlanByCaseSet(feignDto); + Map map = wrapper.getData(); + if (map!=null){ + logger.info(map.toString()); + } + //校验用例数量 + int caseNum = Integer.parseInt(map.get("caseNum").toString()); + if (caseNum == 0) { + throw new PlatformRuntimeException(ExecPlanError.PLAN_CASE_NUMBER_ZERO); + } + //计划关联应用 未被删除的 + Map appMap = new HashMap<>(); + List appIdList = new ArrayList<>(); + if (map.get(MsgConstant.MAP_JSON_APPALIVE)!=null) { + String jsonString = JSON.toJSONString(map.get(MsgConstant.MAP_JSON_APPALIVE)); + logger.info("appAlive------------------" + jsonString); + List appAlive = JSON.parseArray(jsonString, AppList.class); + appAlive.forEach(one -> { + if (PlanConstant.PLATFORM_TYPE_ANDROID.equals(one.getPlatformType())) { + logger.info("appMap:"+"【(Android)" + one.getAppPackage() + "】"); + appMap.put("【(Android)" + one.getAppPackage() + "】", one); + }else if (PlanConstant.PLATFORM_TYPE_IOS.equals(one.getPlatformType())) { + logger.info("appMap:"+"【(IOS)" + one.getAppPackage() + "】"); + appMap.put("【(IOS)" + one.getAppPackage() + "】", one); + }else if (PlanConstant.PLATFORM_TYPE_HARMONY.equals(one.getPlatformType())) { + logger.info("appMap:"+"【(Harmony)" + one.getAppPackage() + "】"); + appMap.put("【(Harmony)" + one.getAppPackage() + "】", one); + } + appIdList.add(one.getAppId()); + }); + } + + boolean androidDevice = false; + boolean iosDevice = false; + boolean pcDevice = false; + for (DeviceList device : feignDto.getDeviceLists()) { + if (PlanConstant.DEVICE_TYPE_PC.equals(device.getDeviceType())){ + pcDevice = true; + }else{ + //系统类型 0-Android 1-IOS 2-HarmonyOS + switch (device.getPlatformType()) { + case PlanConstant.PLATFORM_TYPE_ANDROID: + androidDevice = true; + break; + case PlanConstant.PLATFORM_TYPE_IOS: + iosDevice = true; + break; + default: + break; + } + } + } + //用例类型 + boolean hasAndroid = (boolean) map.get(MsgConstant.QUERY_MOBDEVICE_PLATFORM_TYPE_ANDROID); + boolean hasIOS = (boolean) map.get(MsgConstant.QUERY_MOBDEVICE_PLATFORM_TYPE_IOS); + boolean hasPC = (boolean) map.get(MsgConstant.PLATFORM_TYPE_HAS_PC); + boolean hasMob = (boolean) map.get(MsgConstant.PLATFORM_TYPE_HAS_MOB); + StringBuilder deviceType = new StringBuilder(); + //移动端的校验 + if (hasMob) { + if (hasAndroid && !androidDevice) { + deviceType.append(MsgConstant.ERROR_PLATFORM_TYPE_ANDROID); + } + if (hasIOS && !iosDevice) { + deviceType.append(MsgConstant.ERROR_PLATFORM_TYPE_IOS); + } + } + //PC端的校验 + if (hasPC && !pcDevice) { + deviceType.append(MsgConstant.ERROR_PLATFORM_TYPE_PC); + } + if (deviceType.length()>0){ + throw new PlatformRuntimeException(ExecPlanError.PLAN_UPDATE_DEVICE_ERROR, deviceType.toString()); + } + return map; + } + + /** + * 获取批次统计数据 + * @param record 计划信息 + * @return 统计数据 + */ + private Map getBatchScriptSumData(AtuPlanInfoDetailDto record){ + Map statusMap = new HashMap<>(); + String clusterKeyPrefix = ""; + String lastBatchId = record.getLastBatchId(); + int successNum = record.getSuccessNum(); + int failNum = record.getExecFailNum(); + int cancelNum = record.getCancelNum(); + int timeoutNum = record.getTimeoutNum(); + int waitingNum = record.getWaitingNum(); + int runningNum = record.getRunningNum(); + Object totalObj = null; + if (StrUtil.isNotBlank(lastBatchId)) { + clusterKeyPrefix = RedisConstant.CLUSTER_KEY_PREFIX + lastBatchId.substring(0,4) + + RedisConstant.CLUSTER_KEY_SUFFIX; + String scriptSumKey = clusterKeyPrefix + RedisConstant.BATCH_SCRIPT_SUM_KEY + record.getLastBatchId(); + Map sumDataCacheMap = redisTemplate.opsForHash().entries(scriptSumKey); + // 执行成功数 已缓存数据优先 + Object successObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.TASK_EXECUTE_SUCCESS_STATUS); + if (successObj != null){ + successNum = Integer.parseInt(successObj.toString()); + } + // 执行失败数 + Object failObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.TASK_EXECUTE_FAIL_STATUS); + if (failObj != null){ + failNum = Integer.parseInt(failObj.toString()); + } + // 取消任务数 + Object cancelObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.TASK_CANCEL_STATUS); + if (cancelObj != null){ + cancelNum = Integer.parseInt(cancelObj.toString()); + } + //超时任务数 + Object timeoutObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.TASK_TIMEOUT_STATUS); + if (timeoutObj != null){ + timeoutNum = Integer.parseInt(timeoutObj.toString()); + } + //等待中任务数 + Object waitingObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.TASK_WAIT_EXECUTE_STATUS); + if (waitingObj != null){ + waitingNum = Integer.parseInt(waitingObj.toString()); + } + //执行中任务数 + Object runningObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.TASK_START_EXECUTE_STATUS); + if (runningObj != null){ + runningNum = Integer.parseInt(runningObj.toString()); + } + totalObj = sumDataCacheMap.get(clusterKeyPrefix + PlanConstant.SCRIPT_TOTAL); + } + + if (totalObj != null){ + int totalNum = Integer.parseInt(totalObj.toString()); + if ((waitingNum != 0 || runningNum != 0) && totalNum > waitingNum){ + record.setStatus(PlanConstant.PLAN_EXECUTING_STATUS); + } + if (waitingNum == 0 && runningNum == 0){ + record.setStatus(PlanConstant.PLAN_FINISH_STATUS); + } + if (cancelNum > 0){ + record.setStatus(PlanConstant.PLAN_CANCEL_STATUS); + } + } + + if (PlanConstant.PLAN_FINISH_STATUS.equals(record.getStatus()) + || PlanConstant.PLAN_CANCEL_STATUS.equals(record.getStatus())){ + int finishNum = successNum + failNum + cancelNum + timeoutNum; + if (finishNum > 0){ + statusMap.put(MsgConstant.STATUS_CACHEKEY_SUCCESSNUM, successNum); + statusMap.put(MsgConstant.STATUS_CACHEKEY_FAILNUM, failNum); + statusMap.put(MsgConstant.STATUS_CACHEKEY_CANCELNUM, cancelNum); + statusMap.put(MsgConstant.STATUS_CACHEKEY_TIMEOUTNUM, timeoutNum); + try { + statusMap = PercentageCalculatorUtil.computePercentage(statusMap); + }catch (Exception e){ + logger.error("计算脚本状态占比异常", e); + } + } + } + return statusMap; + } + + //校验计划是否关联应用与设备 + private void checkDeviceAndApp(AtuPlanInfoAddDto dto){ + if (dto.isHasMob()){ + if (dto.getAppList() == null || dto.getAppList().size() == 0) { + throw new PlatformRuntimeException(ExecPlanError.PLAN_APP_LIST_IS_NULL); + } + } + if (dto.isHasPC() || dto.isHasMob() || dto.isHasAPI()) { + if (dto.getDeviceList() == null || dto.getDeviceList().size() == 0) { + throw new PlatformRuntimeException(ExecPlanError.PLAN_DEVICE_LIST_IS_NULL); + } + } + } +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanSceneCaseTaskApiService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanSceneCaseTaskApiService.java new file mode 100644 index 0000000..e2dba82 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanSceneCaseTaskApiService.java @@ -0,0 +1,16 @@ +package net.northking.cctp.executePlan.api.service; + +import net.northking.cctp.executePlan.db.entity.AtuPlanSceneCaseTask; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.dto.planTask.AtuTaskExecResultDto; + +public interface AtuPlanSceneCaseTaskApiService { + + void sceneCaseHandle(AtuTaskExecResultDto taskExecResult, String clusterKeyPrefix); + + void queryNextNodeInfo(AtuTaskExecResultDto taskExecResult, AtuPlanSceneCaseTask planSceneCaseTask, AtuPlanTask planTask); + + void associatedActualImgAndVideo(AtuTaskExecResultDto taskExecResult); + + String parseMobilePerformanceFile(AtuTaskExecResultDto taskExecResult); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanSceneCaseTaskApiServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanSceneCaseTaskApiServiceImpl.java new file mode 100644 index 0000000..8142c1f --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanSceneCaseTaskApiServiceImpl.java @@ -0,0 +1,461 @@ +package net.northking.cctp.executePlan.api.service; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import net.northking.cctp.common.enums.FileBusinessTypeEnum; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.common.s3.FileDownloadException; +import net.northking.cctp.common.s3.NKFile; +import net.northking.cctp.common.s3.SimpleStorageService; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.constants.RedisConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.db.entity.AtuPlanSceneCaseTask; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.db.entity.AtuPlanTaskRecord; +import net.northking.cctp.executePlan.db.service.AtuPlanInfoService; +import net.northking.cctp.executePlan.db.service.AtuPlanSceneCaseTaskService; +import net.northking.cctp.executePlan.db.service.AtuPlanTaskRecordService; +import net.northking.cctp.executePlan.dto.planBatch.AppPerInfo; +import net.northking.cctp.executePlan.dto.planBatch.DevicePerInfo; +import net.northking.cctp.executePlan.dto.planBatch.MobileTaskPerformanceDto; +import net.northking.cctp.executePlan.dto.planSceneCase.AtuSceneNextNodeDto; +import net.northking.cctp.executePlan.dto.planSceneCase.AtuSceneNodeExecDto; +import net.northking.cctp.executePlan.dto.planSceneCase.AtuSceneNodeInfoDto; +import net.northking.cctp.executePlan.dto.planTask.*; +import net.northking.cctp.executePlan.feign.AttachmentFeignClient; +import net.northking.cctp.executePlan.feign.PublicFeignClient; +import net.northking.cctp.executePlan.utils.MinioPathUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +@Service +public class AtuPlanSceneCaseTaskApiServiceImpl implements AtuPlanSceneCaseTaskApiService{ + + private static final Logger logger = LoggerFactory.getLogger(AtuPlanSceneCaseTaskApiServiceImpl.class); + + @Autowired + private AtuPlanInfoService planInfoService; + + @Autowired + private AtuPlanBatchApiService planBatchApiService; + + @Autowired + private AtuPlanSceneCaseTaskService planSceneCaseTaskService; + + @Autowired + private AtuPlanTaskApiService planTaskApiService; + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private PublicFeignClient publicFeignClient; + + @Autowired + private AttachmentFeignClient attachmentFeignClient; + + @Autowired + private SimpleStorageService simpleStorageService; + + @Autowired + private AtuPlanTaskRecordService planTaskRecordService; + + /** + * 场景用例处理 + * @param taskExecResult 任务执行结果 + */ + @Override + public void sceneCaseHandle(AtuTaskExecResultDto taskExecResult, String clusterKeyPrefix){ + AtuPlanSceneCaseTask planSceneCaseTask = planSceneCaseTaskService.findByPrimaryKey(taskExecResult.getTaskId()); + if (ObjectUtil.isNull(planSceneCaseTask)){ + logger.error("场景节点任务[" + taskExecResult.getTaskId() + "]信息不存在"); + // 根据批次和用例id查询任务信息 + AtuPlanTask query = new AtuPlanTask(); + query.setBatchId(taskExecResult.getBatchId()); + query.setCaseId(taskExecResult.getCaseId()); + List taskList = planTaskApiService.query(query); + if (CollUtil.isEmpty(taskList)){ + logger.error("根据批次id[{}]与用例id[{}]无法查询到该任务", query.getBatchId(), query.getCaseId()); + return; + } + planTaskApiService.taskExecFailUpdate(taskList.get(0), PlanConstant.TASK_EXECUTE_FAIL_STATUS, "场景节点任务信息不存在"); + return; + } + //开始执行同步更新计划任务表信息 + AtuPlanTask planTask = planTaskApiService.findByPrimaryKey(planSceneCaseTask.getTaskId()); + if (ObjectUtil.isNull(planTask)) { + logger.error("任务[" + planSceneCaseTask.getTaskId() + "]信息不存在"); + return; + } + // 判断是否开始执行 + if (ObjectUtil.equal(PlanConstant.TASK_START_EXECUTE_STATUS, taskExecResult.getStatus())){ + planSceneCaseTask.setStartTime(taskExecResult.getCurrentTime()); + planSceneCaseTask.setEngineId(taskExecResult.getEngineId()); + planSceneCaseTask.setDeviceId(taskExecResult.getDeviceId()); + planSceneCaseTask.setAppId(taskExecResult.getAppId()); + planSceneCaseTask.setStatus(PlanConstant.TASK_START_EXECUTE_STATUS); + Date now = new Date(); + planSceneCaseTask.setLastHeartbeatTime(now); + planSceneCaseTaskService.updateByPrimaryKey(planSceneCaseTask); + // 判断是否首节点 + AtuPlanSceneCaseTask countParams = new AtuPlanSceneCaseTask(); + countParams.setTaskId(planSceneCaseTask.getTaskId()); + long count = planSceneCaseTaskService.count(countParams); + if (count == 1) { + + planTask.setStartTime(taskExecResult.getCurrentTime()); + planTask.setStatus(PlanConstant.TASK_START_EXECUTE_STATUS); + planTask.setLastHeartbeatTime(now); + planTaskApiService.updateByPrimaryKey(planTask); + + if (!redisTemplate.opsForHash().hasKey(clusterKeyPrefix + RedisConstant.BATCH_SCRIPT_SUM_KEY + planTask.getBatchId(), + clusterKeyPrefix + PlanConstant.BATCH_START_TIME)) { + logger.debug("批次[" + planTask.getBatchId() + "]开始执行,更新计划的状态"); + planInfoService.updatePlanByLastBatchId(planTask.getBatchId(), PlanConstant.PLAN_EXECUTING_STATUS); + } + + // 更新批次统计数据 + planBatchApiService.updateCacheBatchSumData(planTask); + } + + }else { + // 获取下一节点信息 + queryNextNodeInfo(taskExecResult, planSceneCaseTask, planTask); + } + } + + + /** + * 查询下一节点信息 + * @param taskExecResult 任务执行结果 + * @param planSceneCaseTask 场景用例节点任务 + * @param planTask 任务信息 + */ + @Override + public void queryNextNodeInfo(AtuTaskExecResultDto taskExecResult, AtuPlanSceneCaseTask planSceneCaseTask, + AtuPlanTask planTask){ + + planSceneCaseTask.setStatus(taskExecResult.getStatus()); + planSceneCaseTask.setEndTime(taskExecResult.getCurrentTime()); + planSceneCaseTask.setErrorMsg(taskExecResult.getMessage()); + planSceneCaseTask.setVideoUrl(taskExecResult.getVideoPath()); + planSceneCaseTask.setExecResultFile(taskExecResult.getFilePath()); + logger.debug("更新当前节点信息 => " + JSONUtil.toJsonStr(planSceneCaseTask)); + planSceneCaseTaskService.updateByPrimaryKey(planSceneCaseTask); + + AtuSceneNextNodeDto sceneNextNodeDto = new AtuSceneNextNodeDto(); + //传递计划任务表id + sceneNextNodeDto.setTaskId(planSceneCaseTask.getTaskId()); + sceneNextNodeDto.setCaseId(taskExecResult.getCaseId()); + sceneNextNodeDto.setNodeId(planSceneCaseTask.getNodeId()); + sceneNextNodeDto.setSuccess(ObjectUtil.equal(PlanConstant.TASK_EXECUTE_SUCCESS_STATUS, taskExecResult.getStatus())); + sceneNextNodeDto.setOutputArgs(taskExecResult.getOutputs()); + sceneNextNodeDto.setScriptId(planTask.getScriptId()); + sceneNextNodeDto.setSceneScriptUrl(planTask.getScriptJson()); + ResultWrapper nextNodeResult; + try { + logger.debug("查询场景下一节点信息,参数为 => " + JSONUtil.toJsonStr(sceneNextNodeDto)); + //捕获异常信息 + nextNodeResult = publicFeignClient.getNextNode(sceneNextNodeDto); + if (!nextNodeResult.isSuccess()){ + logger.error("获取下一节点信息结果异常," + nextNodeResult.getMessage()); + planTaskApiService.taskExecFailUpdate(planTask, PlanConstant.TASK_EXECUTE_FAIL_STATUS, + nextNodeResult.getMessage()); + return; + } + } catch (Exception e) { + logger.error("获取下一节点信息异常:",e); + planTaskApiService.taskExecFailUpdate(planTask, PlanConstant.TASK_EXECUTE_FAIL_STATUS, + "获取下一节点信息异常" + e.getMessage()); + return; + } + + logger.debug("查询场景下一节点信息,返回结果为 => " + JSONUtil.toJsonStr(nextNodeResult)); + AtuSceneNodeExecDto sceneNodeExecDto = nextNodeResult.getData(); + + //更新url到表里 + if (sceneNodeExecDto != null && sceneNodeExecDto.getSceneScriptUrl() != null) { + planTask.setScriptJson(sceneNodeExecDto.getSceneScriptUrl()); + planTaskApiService.updateByPrimaryKey(planTask); + } + + AtuSceneNodeInfoDto nodeInfo = sceneNodeExecDto.getNodeInfo(); + // 节点不管成功或者失败,若没有连接到结束节点,默认最后节点为结束,节点信息不包含lineId + planSceneCaseTask.setNextNodeId(nodeInfo.getNodeId()); + planSceneCaseTask.setLineId(nodeInfo.getLineId()); + + // 记录性能数据 + if (PlanConstant.SCRIPT_TYPE_ANDROID.equals(planSceneCaseTask.getNodeType()) + || PlanConstant.SCRIPT_TYPE_IOS.equals(planSceneCaseTask.getNodeType())) { + logger.debug("处理场景移动端性能文件数据"); + planSceneCaseTask.setPerDataPath(parseMobilePerformanceFile(taskExecResult)); + } + + logger.debug("更新当前节点中下一节点信息 => " + JSONUtil.toJsonStr(planSceneCaseTask)); + planSceneCaseTaskService.updateByPrimaryKey(planSceneCaseTask); + // 关联文件,使用 CompletableFuture 复用线程 + CompletableFuture.runAsync(() -> associatedActualImgAndVideo(taskExecResult)); +// future.get(); + // 判断是否结束节点 + if (sceneNodeExecDto.getEnd()){ + logger.info("场景任务执行结束...."); + //判断任务状态是否未非引擎返回的状态 取消/超时 + if(ObjectUtil.equal(PlanConstant.TASK_CANCEL_STATUS, planTask.getStatus()) + ||ObjectUtil.equal(PlanConstant.TASK_TIMEOUT_STATUS, planTask.getStatus())){ + return; + } + planTask.setEndTime(planSceneCaseTask.getEndTime()); + if (StrUtil.isEmpty(nodeInfo.getLineId())) { + planTask.setStatus(planSceneCaseTask.getStatus()); + planTask.setErrorMsg(planSceneCaseTask.getErrorMsg()); + }else{ + // 节点执行结束且连接了结束节点,则该场景任务设置成功执行 + planTask.setStatus(PlanConstant.TASK_EXECUTE_SUCCESS_STATUS); + } + logger.debug("更新场景任务为结束"); + planTaskApiService.updateByPrimaryKey(planTask); + // 添加任务记录到表atu_plan_task_record + addTaskRecord(taskExecResult, planTask); + // 更新批次统计数据 + planBatchApiService.updateCacheBatchSumData(planTask); + // 删除节点更新时的场景任务文件 + String noDeleteFileId = "/" + MinioPathUtils.idToPath(sceneNodeExecDto.getSceneScriptUrl())[1]; + attachmentFeignClient.clearSceneTaskAttachments(planTask.getScriptId(), FileBusinessTypeEnum.SCENE_TASK_REFRESH_FILE.getCode(), noDeleteFileId); + }else { + // 新增下一节点任务信息 + try { + createNextNodeTask(planSceneCaseTask, nodeInfo, taskExecResult, planTask.getEnvId()); + }catch (Exception e){ + logger.error("创建下一节点任务信息失败", e); + planTaskApiService.taskExecFailUpdate(planTask, PlanConstant.TASK_EXECUTE_FAIL_STATUS, + "创建下一节点任务信息失败" + e.getMessage()); + } + } + } + + private void addTaskRecord(AtuTaskExecResultDto taskExecResult, AtuPlanTask planTask) { + try { + planTask.setEndTime(taskExecResult.getCurrentTime()); + + AtuPlanTaskRecord record = new AtuPlanTaskRecord(); + record.setTaskId(planTask.getId()); + // 根据taskId查询执行序号 + long count = planTaskRecordService.count(record); + if (count > 0) { + record.setExecuteType(PlanConstant.TASK_EXECUTE_TYPE_AUTO_RETRY); + } + record.setExecIdx(Math.toIntExact(count) + 1); + // 插入执行任务记录 + record.setId(UUIDUtil.create32UUID()); + record.setStartTime(planTask.getStartTime()); // 任务开始时间 + record.setEndTime(planTask.getEndTime()); // 任务结束时间 + record.setBatchId(planTask.getBatchId()); // 批次 + record.setErrorMsg(taskExecResult.getMessage()); // 任务错误信息 + record.setExecResultFile(taskExecResult.getFilePath()); // 任务执行记录结果文件地址 + record.setVideoUrl(taskExecResult.getVideoPath()); // 任务执行录屏文件地址 + planTaskRecordService.insert(record); + } catch (Exception e) { + logger.error("新增任务记录失败", e); + } + } + + /** + * 创建下一节点任务 + * @param planSceneCaseTask 场景用例节点任务 + * @param nodeInfo 节点信息 + * @param taskExecResult 任务执行结果 + */ + private void createNextNodeTask(AtuPlanSceneCaseTask planSceneCaseTask, AtuSceneNodeInfoDto nodeInfo, + AtuTaskExecResultDto taskExecResult, String envId){ + logger.debug("保存下一节点信息"); + logger.debug("节点信息:" + JSONUtil.toJsonStr(nodeInfo)); + AtuPlanSceneCaseTask nextNodeTask = new AtuPlanSceneCaseTask(); + nextNodeTask.setId(IdUtil.simpleUUID()); + nextNodeTask.setTaskId(planSceneCaseTask.getTaskId()); + nextNodeTask.setScriptId(nodeInfo.getScriptId()); + nextNodeTask.setVersionId(nodeInfo.getVersionId()); + nextNodeTask.setVersionName(nodeInfo.getVersionName()); + nextNodeTask.setScriptName(nodeInfo.getScriptName()); + nextNodeTask.setScriptJson(nodeInfo.getScriptPath()); + nextNodeTask.setNodeId(nodeInfo.getNodeId()); + nextNodeTask.setNodeType(nodeInfo.getNodeType()); + nextNodeTask.setStatus(PlanConstant.TASK_WAIT_EXECUTE_STATUS); + if (CollUtil.isNotEmpty(nodeInfo.getCaseParam())) { + nextNodeTask.setNodeParams(JSONUtil.toJsonStr(nodeInfo.getCaseParam())); + } + nextNodeTask.setPrevNodeId(planSceneCaseTask.getNodeId()); + nextNodeTask.setCreatedTime(new Date()); + planSceneCaseTaskService.insert(nextNodeTask); + + // 查询计划信息 + AtuPlanInfo planInfo = planInfoService.findByPrimaryKey(taskExecResult.getPlanId()); + if (ObjectUtil.isNull(planInfo)){ + logger.error("计划[" + taskExecResult.getPlanId() + "]信息为空"); + return; + } + + logger.debug("生成任务并推送至队列"); + AtuTaskExecDto atuTaskExecDto = new AtuTaskExecDto(); + atuTaskExecDto.setTenantId(planInfo.getTenantId()); + atuTaskExecDto.setProjectId(planInfo.getProjectId()); + atuTaskExecDto.setEnvId(envId); + atuTaskExecDto.setPlanId(planInfo.getId()); + atuTaskExecDto.setBatchId(taskExecResult.getBatchId()); + atuTaskExecDto.setTaskId(nextNodeTask.getId()); + atuTaskExecDto.setCaseId(taskExecResult.getCaseId()); + atuTaskExecDto.setCaseType(PlanConstant.SCRIPT_TYPE_SCENE); + atuTaskExecDto.setScriptPath(nodeInfo.getScriptPath()); + atuTaskExecDto.setCaseParams(nodeInfo.getCaseParam()); + atuTaskExecDto.setAppSet(planInfo.getAppSet()); + atuTaskExecDto.setScreenRecordSet(planInfo.getScreenRecordSet()); + atuTaskExecDto.setScreenshotSet(planInfo.getScreenshotSet()); + atuTaskExecDto.setFailRetryNum(planInfo.getFailRetryCount()); + // 重试策略 + atuTaskExecDto.setRetryStrategy(planInfo.getRetryStrategy()); + + atuTaskExecDto.setAppId(planTaskApiService.queryAppId(planInfo.getId(), nodeInfo.getPlatformType(), + nodeInfo.getAppPackage(), nodeInfo.getNodeType())); + + // 发送任务执行信息至消息队列 + planTaskApiService.sendToQueue(atuTaskExecDto.getBatchId(), atuTaskExecDto, nodeInfo.getNodeType()); + } + + @Override + public void associatedActualImgAndVideo(AtuTaskExecResultDto taskExecResult) { + try { + if (StringUtils.hasText(taskExecResult.getFilePath())) { + InputStream inputStream = simpleStorageService.downloadAsStream(NKSecurityContext.getTenantId(), taskExecResult.getFilePath()); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + List fileUriList = new ArrayList<>(); + String line = null; + while ((line = bufferedReader.readLine()) != null) { + StepExecuteResult stepExecuteResult = JSONUtil.toBean(line, StepExecuteResult.class); + String actualImgUri = stepExecuteResult.getActualImgUri(); + if (StringUtils.hasText(actualImgUri)) { + fileUriList.add(actualImgUri); + } + } + fileUriList.add(taskExecResult.getFilePath()); + if (StringUtils.hasText(taskExecResult.getVideoPath())) { + fileUriList.add(taskExecResult.getVideoPath()); + } + attachmentFeignClient.associatedFiles(fileUriList, taskExecResult.getTaskId()); + } + } catch (FileDownloadException e) { + logger.error("文件下载异常", e); + } catch (Exception e) { + logger.error("文件读取异常", e); + } + } + + @Override + public String parseMobilePerformanceFile(AtuTaskExecResultDto taskExecResult){ + String path = ""; + DevicePerInfo devicePerInfo = taskExecResult.getDevicePerInfo(); + logger.debug("设备性能数据结果 => {}", JSONUtil.toJsonStr(devicePerInfo) ); + if (devicePerInfo == null){ + return path; + } + AtuPlanInfo planInfo = planInfoService.findByBatchId(taskExecResult.getBatchId()); + MobileTaskPerformanceDto taskPerInfo = new MobileTaskPerformanceDto(); + taskPerInfo.setDeviceId(taskExecResult.getDeviceId()); + taskPerInfo.setAppId(taskExecResult.getAppId()); + String devicePerInfoAddress = devicePerInfo.getDevicePerInfoAddress(); + logger.info("任务ID:{},设备性能数据地址:{}", taskExecResult.getTaskId(), devicePerInfoAddress); + if (StrUtil.isNotBlank(devicePerInfoAddress)){ + DevicePerInfoDataDto deviceData = MinioPathUtils.downloadFileCoverObj(simpleStorageService, + planInfo.getTenantId(), devicePerInfoAddress, DevicePerInfoDataDto.class); + logger.debug("设备性能数据 => {}", JSONUtil.toJsonStr(deviceData)); + if (deviceData != null){ + taskPerInfo.setDeviceCpuList(filterData(deviceData.getCpuList())); + taskPerInfo.setDeviceMemoList(filterData(deviceData.getMemoList())); + taskPerInfo.setDeviceFlowList(filterData(deviceData.getFlowList())); + taskPerInfo.setDeviceTemperatureList(filterData(deviceData.getTemperatureList())); + } + } + AppPerInfo appPerInfo = devicePerInfo.getAppPerInfo(); + if (appPerInfo != null) { + // 安装时间 + taskPerInfo.setAppInstallTime(appPerInfo.getAppInstallTime()); + // 启动时间 + taskPerInfo.setAppActiveTime(appPerInfo.getAppActiveTime()); + + String appPerInfoAddress = appPerInfo.getAppPerInfoAddress(); + logger.info("任务ID:{},app性能数据地址:{}", taskExecResult.getTaskId(), appPerInfoAddress); + if (StrUtil.isNotBlank(appPerInfoAddress)) { + AppPerInfoDataDto appData = MinioPathUtils.downloadFileCoverObj(simpleStorageService, + planInfo.getTenantId(), appPerInfoAddress, AppPerInfoDataDto.class); + logger.debug("app性能数据 => {}", JSONUtil.toJsonStr(appData) ); + if (appData != null) { + taskPerInfo.setAppCpuList(filterData(appData.getCpuList())); + taskPerInfo.setAppMemoList(filterData(appData.getMemoList())); + taskPerInfo.setAppFlowList(filterData(appData.getFlowList())); + } + + } + } + + logger.debug("上传新的性能数据"); + logger.debug("MobileTaskPerformanceDto => {}", JSONUtil.toJsonStr(taskPerInfo) ); + File file = MinioPathUtils.objectToJsonFile(taskPerInfo); + try { + NKFile nkFile = simpleStorageService.upload(planInfo.getTenantId(), file, true, taskExecResult.getTaskId(), FileBusinessTypeEnum.MOBILE_TASK_PERFORMANCE_SUMMARY); + path = nkFile.getId(); + logger.debug("保存任务性能数据存放地址 => {}", path); + }catch (Exception e){ + logger.error("文件上传异常", e); + } + // 删除临时性能文件 + if (StrUtil.isNotBlank(devicePerInfoAddress)){ + String[] pathUrl = MinioPathUtils.idToPath(devicePerInfoAddress); + try { + simpleStorageService.delete(pathUrl[0], "/" + pathUrl[1]); + } catch (Exception e) { + logger.error("文件删除删除失败", e); + } + } + String appPerInfoAddress = appPerInfo.getAppPerInfoAddress(); + if (StrUtil.isNotBlank(appPerInfoAddress)){ + String[] pathUrl = MinioPathUtils.idToPath(appPerInfoAddress); + try { + simpleStorageService.delete(pathUrl[0], "/" + pathUrl[1]); + } catch (Exception e) { + logger.error("文件删除删除失败", e); + } + } + return path; + } + + /** + * 过滤小于等于0的数据 + * @param data 需过滤的数据 + * @return 结果集 + */ + private List filterData(List data){ + if (data == null || data.size() <= 0){ + return new ArrayList<>(); + } + return data.stream().filter(num -> num > 0).collect(Collectors.toList()); + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanTaskApiService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanTaskApiService.java new file mode 100644 index 0000000..d08d5b4 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanTaskApiService.java @@ -0,0 +1,212 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api.service; + +import net.northking.cctp.common.db.OrderBy; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.db.excel.ExcelService; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.dto.planBatch.AtuBatchCaseInfoDto; +import net.northking.cctp.executePlan.dto.planBatch.BatchRetryDto; +import net.northking.cctp.executePlan.dto.planTask.*; +import net.northking.cctp.executePlan.pub.dto.ScriptFirstExecutionDTO; + +import java.time.LocalDate; +import java.util.List; +import java.util.Map; + +/** + * 计划执行任务表Restful逻辑接口 + * @author maven-cctp-plugin + * @since 1.0 + */ +public interface AtuPlanTaskApiService extends ExcelService +{ + /** + * 查询计划执行任务表列表 + * + * @param queryByPage 查询条件 + * @return 查询结果列表 + */ + Pagination pagingQuery(QueryByPage queryByPage); + + /** + * 查询任务列表 + * @param atuPlanTask 参数 + * @return 结果集 + */ + List query(AtuPlanTask atuPlanTask); + + /** + * 查询任务列表 + * @param atuPlanTask 参数 + * @param orderBy 排序 + * @return 结果集 + */ + List query(AtuPlanTask atuPlanTask, OrderBy orderBy); + + /** + * 新增计划执行任务表 + * + * @param task 接口数据传输对象 + * @return 主键 + */ + String insert(AtuPlanTask task); + + /** + * 根据id更新任务信息 + * @param task 任务信息 + * @return 结果 + */ + int updateByPrimaryKey(AtuPlanTask task); + + /** + * 计划批次停止 + * @param batchId 批次ID + * @return 结果 + */ + Boolean stop(String batchId); + + /** + * 创建任务执行信息 + * @param planTask 任务信息 + * @param batchCaseInfo 用例信息 + * @return 执行信息 + */ + void createTaskExecuteInfo(AtuPlanTask planTask, AtuBatchCaseInfoDto batchCaseInfo); + + /** + * 查询任务详情 + * @param taskId 任务ID + * @return 任务详情 + */ + AtuPlanTaskDetailDto findTaskDetailById(String taskId); + + /** + * 任务取消更新任务执行文件 + * @param params {“taskId”:"", "filePath":""} + * @return 更新结果 + */ + Boolean updateTaskExecFile(Map params); + + /** + * 发送任务执行信息至消息队列 + * + * @param batchId 批次ID + * @param atuTaskExecDto 任务执行信息 + */ + void sendToQueue(String batchId, AtuTaskExecDto atuTaskExecDto, String type); + + /** + * 查询应用ID + * @param planId 计划ID + * @param platformType 平台类型 + * @param appPackage app包名 + * @param caseType 用例类型 + * @return 结果 + */ + String queryAppId(String planId, String platformType, String appPackage, String caseType); + + /** + * 创建脚本任务信息 + * @param planInfo 计划信息 + * @param batchId 批次号 + * @param envIdList 排序好的环境ID集合 + * @param inputDataList 输入项数据集合 + */ + void createdScriptTaskInfo(AtuPlanInfo planInfo, String batchId, List envIdList, + List inputDataList); + + /** + * 根据id查询任务信息 + * @param id id + * @return 任务信息 + */ + AtuPlanTask findByPrimaryKey(String id); + + /** + * 任务重试 + * @param retryDto 任务id + * @return 结果 + */ + Boolean taskRetry(BatchRetryDto retryDto); + + /** + * 根据批次id查询该批次的环境 + * @param batchId 批次id + * @return 环境id + */ + String queryEnvIdByBatchId(String batchId); + + /** + * 根据批次id查询任务中的appId + * @param batchId 批次Id + * @return 结果集 + */ + List queryAppIdListByBatchId(String batchId); + + /** + * 根据计划id删除任务 + * @param planId 计划id + * @param num 删除数量 + * @return 结果 + */ + int deleteByPlanIdLimit(String planId, int num); + + /** + * 根据计划id统计任务数量 + * @param planId 计划id + * @return 任务数量 + */ + int countByPlanId(String planId); + + + AtuTaskSendBugDto querySendBugTaskInfo(String taskId); + + /** + * 任务执行失败状态更新 + * @param planTask 任务信息 + * @param status 失败状态 + * @param errorMsg 错误信息 + */ + void taskExecFailUpdate(AtuPlanTask planTask, String status, String errorMsg); + + /** + * 处理引用数据 + * @param caseParamMap 需要处理的参数集合 + * @param envId 环境id + * @param projectId 系统id + * @return 处理结果 + */ + Map handleQuoteData(Map caseParamMap, String envId, String projectId); + + List getFirstExecuteInfo(List scriptIds); + ScriptFirstExecutionDTO getFirstExecuteInfo(String scriptId); + + Integer getScriptExecuteSuccessNum(String scriptId, String planId, LocalDate now); + + List getTasksByPlanId(String uuid); + + List getTaskIdsByScriptIdsAndPlanId(List oldScriptIds, String planId); + + void getActualImagePath(List deletedFilePath, String execResultFile); + /** + * 查询执行超时N秒任务 + * @param timeout 超时时间 + * @return 任务集合 + */ + List queryExecTimeoutTask(int timeout); + + /** + * 根据id查询任务扩展信息 + * @param taskId 任务id + * @return 任务扩展信息 + */ + AtuPlanTaskExtendDto queryTaskExtendById(String taskId); + + List queryWaitTimeoutTask(Integer waitTimeout); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanTaskApiServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanTaskApiServiceImpl.java new file mode 100644 index 0000000..cddeef3 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanTaskApiServiceImpl.java @@ -0,0 +1,2182 @@ +/* + * Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. + * + */ +package net.northking.cctp.executePlan.api.service; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.file.FileReader; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.page.PageMethod; +import net.northking.cctp.common.db.*; +import net.northking.cctp.common.db.annotation.DatabaseWriteOnly; +import net.northking.cctp.common.db.excel.AbstractExcelService; +import net.northking.cctp.common.db.excel.ExcelHeader; +import net.northking.cctp.common.dto.AssociatedFilesDto; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.common.s3.FileDownloadException; +import net.northking.cctp.common.s3.SimpleStorageService; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.executePlan.constants.MsgConstant; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.constants.RabbitConstant; +import net.northking.cctp.executePlan.constants.RedisConstant; +import net.northking.cctp.executePlan.db.entity.*; +import net.northking.cctp.executePlan.db.service.*; +import net.northking.cctp.executePlan.dto.planBatch.AtuBatchCaseInfoDto; +import net.northking.cctp.executePlan.dto.planBatch.AtuExceptionCase; +import net.northking.cctp.executePlan.dto.planBatch.BatchRetryDto; +import net.northking.cctp.executePlan.dto.planBatch.SceneCaseStopDto; +import net.northking.cctp.executePlan.dto.planEntrust.DeviceListDto; +import net.northking.cctp.executePlan.dto.planEntrust.EngineInfoListDto; +import net.northking.cctp.executePlan.dto.planSceneCase.AtuSceneNodeExecDto; +import net.northking.cctp.executePlan.dto.planSceneCase.AtuSceneNodeInfoDto; +import net.northking.cctp.executePlan.dto.planSceneCase.CdEngineInfoDetailDto; +import net.northking.cctp.executePlan.dto.planSceneCase.SceneFirstNodeDto; +import net.northking.cctp.executePlan.dto.planTask.*; +import net.northking.cctp.executePlan.exception.ExecPlanError; +import net.northking.cctp.executePlan.feign.AttachmentFeignClient; +import net.northking.cctp.executePlan.feign.DeviceFeignClient; +import net.northking.cctp.executePlan.feign.PublicFeignClient; +import net.northking.cctp.executePlan.feign.ScriptCaseFeignClient; +import net.northking.cctp.executePlan.feign.dto.MdBusComponentInfoDetailDto; +import net.northking.cctp.executePlan.pub.dto.ScriptFirstExecutionDTO; +import net.northking.cctp.executePlan.utils.EnvNameUtils; +import net.northking.cctp.executePlan.utils.MinioPathUtils; +import net.northking.cctp.executePlan.utils.WordUtils; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.AmqpAdmin; +import org.springframework.amqp.core.AmqpTemplate; +import org.springframework.amqp.core.Queue; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.io.ClassPathResource; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.web.client.RestTemplate; + +import java.io.*; +import java.time.LocalDate; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 计划执行任务表服务实现类 + * + * @author maven-cctp-plugin + * @since 1.0 + */ + +@Service +@ConditionalOnMissingBean(name = "AtuPlanTaskApiServiceImpl") +@RefreshScope +public class AtuPlanTaskApiServiceImpl extends AbstractExcelService implements AtuPlanTaskApiService { + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(AtuPlanTaskApiServiceImpl.class); + + @Autowired + private AtuPlanTaskService atuPlanTaskService; + + @Autowired + private AtuPlanAppLinkService atuPlanAppLinkService; + + @Autowired + private AtuPlanSceneCaseTaskService atuPlanSceneCaseTaskService; + + @Autowired + private AmqpAdmin amqpAdmin; + + @Autowired + private AmqpTemplate amqpTemplate; + + @Autowired + private PublicFeignClient publicFeignClient; + + @Autowired + private AtuPlanBatchDeviceLinkService atuPlanBatchDeviceLinkService; + + @Autowired + private ScriptCaseFeignClient scriptCaseFeignClient; + + @Autowired + private DeviceFeignClient deviceFeignClient; + + @Autowired + private SimpleStorageService simpleStorageService; + + @Autowired + private AtuPlanBatchApiService planBatchApiService; + + @Autowired + private AtuPlanInfoApiService atuPlanInfoApiService; + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private AtuPlanTaskRecordService taskRecordService; + + @Autowired + private EnvNameUtils envNameUtils; + @Autowired + private AttachmentFeignClient attachmentFeignClient; + + @Value("${zmn.hostStr}") + private String hostStr; + + private static final DefaultRedisScript TASK_RETRY_INIT_SCRIPT; + + static { + TASK_RETRY_INIT_SCRIPT = new DefaultRedisScript<>(); + TASK_RETRY_INIT_SCRIPT.setLocation(new ClassPathResource("/lua/taskRetryInitCache.lua")); + TASK_RETRY_INIT_SCRIPT.setResultType(Boolean.class); + } + + + //= Excel 导入导出相关代码 start ==================// + @Override + public BasicService getService() { + return this.atuPlanTaskService; + } + + @Override + public ExcelHeader[] excelHeaders() { + ExcelHeader id = new ExcelHeader("主键", "id", String.class); + ExcelHeader batchId = new ExcelHeader("调度主键", "batchId", String.class); + ExcelHeader scriptId = new ExcelHeader("脚本主键", "scriptId", String.class); + ExcelHeader scriptName = new ExcelHeader("脚本名称", "scriptName", String.class); + ExcelHeader caseId = new ExcelHeader("用例主键", "caseId", String.class); + ExcelHeader caseName = new ExcelHeader("用例名称", "caseName", String.class); + ExcelHeader caseType = new ExcelHeader("用例类型;1-接口,2-PC/BS,3-PC/CS,4-安卓,5-ios,6-场景用例", "caseType", String.class); + ExcelHeader engineId = new ExcelHeader("引擎主键", "engineId", String.class); + ExcelHeader deviceId = new ExcelHeader("设备主键", "deviceId", String.class); + ExcelHeader appId = new ExcelHeader("应用主键", "appId", String.class); + ExcelHeader status = new ExcelHeader("状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时", "status", String.class); + ExcelHeader startTime = new ExcelHeader("开始时间", "startTime", Date.class); + ExcelHeader endTime = new ExcelHeader("结束时间", "endTime", Date.class); + ExcelHeader errorMsg = new ExcelHeader("错误信息", "errorMsg", String.class); + ExcelHeader videoUrl = new ExcelHeader("视频地址", "videoUrl", String.class); + ExcelHeader execResultFile = new ExcelHeader("执行结果文件", "execResultFile", String.class); + ExcelHeader createdTime = new ExcelHeader("创建时间", "createdTime", Date.class); + + return new ExcelHeader[]{}; + } + + /** + * Excel导入,入库之前的处理 + * + * @param records 从Excel读取到的记录 + * @return 待入库的记录 + */ + @Override + protected List beforeInsertBatch(List records) { + for (AtuPlanTask record : records) { + record.setId(UUIDUtil.create32UUID()); + } + return records; + } + + /** + * 写入Excel之前的处理
+ * 数据的特殊处理在此处加工处理 + * + * @param record 来自数据库记录 + * @return 待写入Excel的记录 + */ + @Override + protected AtuPlanTask beforeWriteExcel(AtuPlanTask record) { + return record; + } + + //= Excel 导入导出相关代码 end =======================// + + //= 增删改查 相关代码 start ==================// + @Override + public Pagination pagingQuery(QueryByPage queryByPage) { + QueryByPage qty = new QueryByPage<>(); + qty.setQuery(new AtuPlanTaskQueryDto()); + qty.getQuery().setBatchId(queryByPage.getQuery().getBatchId()); + String keyWord = queryByPage.getQuery().getKeyword(); + if (org.springframework.util.StringUtils.hasText(keyWord)) + keyWord = keyWord.replace("%", "\\%").replace("_", "\\_"); + qty.getQuery().setKeyword(keyWord); + if (org.springframework.util.StringUtils.hasText(queryByPage.getQuery().getCaseName())) { + qty.getQuery().setCaseName(queryByPage.getQuery().getCaseName()); + } + if (org.springframework.util.StringUtils.hasText(queryByPage.getQuery().getScriptName())) { + qty.getQuery().setScriptName(queryByPage.getQuery().getScriptName()); + } + if (org.springframework.util.StringUtils.hasText(queryByPage.getQuery().getStatus())) { + qty.getQuery().setStatus(queryByPage.getQuery().getStatus()); + } + DefaultPagination pagination = new DefaultPagination(); + qty.setPageNo(queryByPage.getPageNo()); + qty.setPageSize(queryByPage.getPageSize()); + pagination.setPageSize(queryByPage.getPageSize()); + pagination.setPageNo(queryByPage.getPageNo()); + handlePageParam(qty); + Page page = PageMethod.startPage(qty.getPageNo(), qty.getPageSize()); + List result = atuPlanTaskService.queryList(qty); + pagination.setRecords(result); + pagination.setRecordCount(page.getTotal()); + for (AtuPlanTaskPageDto dto : pagination.getRecords()) { + //根据脚本id获取脚本编码 + if (StringUtils.isNotBlank(dto.getCaseNo())) { + dto.setScriptCode(dto.getCaseNo()); + } else { + Object resultCode = redisTemplate.opsForValue().get(MsgConstant.UITEST_SCRIPTCODE + dto.getScriptId()); + if (resultCode != null && !resultCode.equals("")) { + dto.setScriptCode(resultCode.toString()); + } else { + Map scriptMap = new HashMap<>(); + scriptMap.put(MsgConstant.ID, dto.getScriptId()); + scriptMap.put(MsgConstant.TYPE, dto.getCaseType()); + String scriptCode = scriptCaseFeignClient.queryScriptCode(scriptMap); + if (!StringUtils.isBlank(scriptCode)) { + dto.setScriptCode(scriptCode); + } + } + } + //场景用例返回对应的脚本执行视频 + if (dto.getCaseType().equals(PlanConstant.SCRIPT_TYPE_SCENE)) { + List sceneNodes = new ArrayList<>(); + //获取每个节点最后一次执行的内容 + List query = this.atuPlanSceneCaseTaskService.queryNodeInfo(dto.getId()); + for (AtuPlanSceneCaseTask caseTask : query) { + if (caseTask.getNodeType().equals(PlanConstant.SCRIPT_TYPE_API)) { + dto.setApiCase(true); + } + if (StrUtil.isNotBlank(caseTask.getVideoUrl())) { + SceneNodeDto node = new SceneNodeDto(); + BeanUtils.copyProperties(caseTask, node); + //视频播放的设备类型(1、移动 2、PC) + switch (caseTask.getNodeType()) { + case PlanConstant.SCRIPT_TYPE_API: + case PlanConstant.SCRIPT_TYPE_BS: + case PlanConstant.SCRIPT_TYPE_CS: + node.setDeviceType(PlanConstant.DEVICE_TYPE_PC); + break; + case PlanConstant.SCRIPT_TYPE_ANDROID: + case PlanConstant.SCRIPT_TYPE_IOS: + node.setDeviceType(PlanConstant.DEVICE_TYPE_MOBILE); + break; + default: + break; + } + sceneNodes.add(node); + } + } + dto.setSceneData(sceneNodes); + } else if (StrUtil.isNotBlank(dto.getVideoUrl())) { + List sceneNodes = new ArrayList<>(); + SceneNodeDto node = new SceneNodeDto(); + BeanUtils.copyProperties(dto, node); + switch (dto.getCaseType()) { + case PlanConstant.SCRIPT_TYPE_API: + case PlanConstant.SCRIPT_TYPE_BS: + case PlanConstant.SCRIPT_TYPE_CS: + node.setDeviceType(PlanConstant.DEVICE_TYPE_PC); + break; + case PlanConstant.SCRIPT_TYPE_ANDROID: + case PlanConstant.SCRIPT_TYPE_IOS: + node.setDeviceType(PlanConstant.DEVICE_TYPE_MOBILE); + break; + } + sceneNodes.add(node); + dto.setSceneData(sceneNodes); + } + if (dto.getStatus().equals(PlanConstant.TASK_START_EXECUTE_STATUS) + && dto.getCaseType().equals(PlanConstant.SCRIPT_TYPE_API)) { + dto.setApiCase(true); + } + if (PlanConstant.TASK_WAIT_EXECUTE_STATUS.equals(dto.getStatus()) || + PlanConstant.TASK_START_EXECUTE_STATUS.equals(dto.getStatus())) { + // 任务等待中或正在执行设置已有的任务结束时间为null,避免计算耗时 + dto.setEndTime(null); + } + // 设置环境名称 + if (StrUtil.isNotBlank(dto.getEnvId())) { + String envName = envNameUtils.getEnvName(dto.getEnvId()); + if (envName != null) { + dto.setEnvName(envName.toString()); + } + } + } + queryTaskExecTake(pagination.getRecords()); + return pagination; + } + + private void queryTaskExecTake(List records) { + try { + if (!records.isEmpty()) { + List ids = records.stream().map(AtuPlanTaskPageDto::getId).collect(Collectors.toList()); + List taskRecords = taskRecordService.queryTotalTake(ids); + if (!taskRecords.isEmpty()) { + Map collectMap = taskRecords.stream().collect(Collectors.toMap(PlanTaskRecordDto::getTaskId, Function.identity())); + for (AtuPlanTaskPageDto record : records) { + if (collectMap.containsKey(record.getId())) { + record.setTotalExecTake(collectMap.get(record.getId()).getTotalTake()); + } + } + } + } + } catch (Exception e) { + logger.error("查询任务的总耗时失败", e); + } + } + + @Override + public List query(AtuPlanTask atuPlanTask) { + return atuPlanTaskService.query(atuPlanTask); + } + + @Override + public List query(AtuPlanTask atuPlanTask, OrderBy orderBy) { + return atuPlanTaskService.query(atuPlanTask, orderBy); + } + + + @Override + @DatabaseWriteOnly + public String insert(AtuPlanTask task) { + this.atuPlanTaskService.insert(task); + return task.getId(); + } + + @Override + public int updateByPrimaryKey(AtuPlanTask task) { + return this.atuPlanTaskService.updateByPrimaryKey(task); + } + + + /** + * 计划批次停止 + * + * @param batchId 批次ID + * @return 结果 + */ + @Override + public Boolean stop(String batchId) { + logger.debug("删除批次任务队列"); + amqpAdmin.deleteQueue(RabbitConstant.TASK_EXEC_QUEUE_PC_KEY + batchId); + amqpAdmin.deleteQueue(RabbitConstant.TASK_EXEC_QUEUE_MOB_KEY + "android" + "." + batchId); + amqpAdmin.deleteQueue(RabbitConstant.TASK_EXEC_QUEUE_MOB_KEY + "ios" + "." + batchId); + amqpAdmin.deleteQueue(RabbitConstant.TASK_EXEC_QUEUE_API_KEY + batchId); + + logger.debug("查询该批次所有未完成的任务信息"); + List taskList = atuPlanTaskService.queryUnfinishedTaskByBatchId(batchId); + if (CollUtil.isEmpty(taskList)) { + logger.debug("任务已全部执行完成"); + return true; + } + ThreadUtil.execAsync(() -> { + logger.debug("通知引擎停止批次任务"); + noticeEngineRemoveBatch(batchId); + }); + logger.debug("该批次未完成的任务数量:{}", taskList.size()); + for (AtuPlanTask planTask : taskList) { + if (ObjectUtil.equal(PlanConstant.SCRIPT_TYPE_SCENE, planTask.getCaseType())) { + logger.debug("通知场景用例停止用例解析"); + SceneCaseStopDto stopDto = new SceneCaseStopDto(); + stopDto.setTaskId(planTask.getId()); + stopDto.setCaseId(planTask.getCaseId()); + ResultWrapper stopResult = publicFeignClient.stopCase(stopDto); + if (ObjectUtil.isNull(stopResult) || !stopResult.isSuccess()) { + logger.error("场景任务[" + planTask.getId() + "]取消失败"); + } + logger.debug("场景任务[" + planTask.getId() + "]取消结果 => " + JSONUtil.toJsonStr(stopResult)); + // 查询场景节点信息 + AtuPlanSceneCaseTask sceneCaseTask = atuPlanSceneCaseTaskService.queryUnfinishedTaskByTaskId(planTask.getId()); + if (ObjectUtil.isNotNull(sceneCaseTask)) { + logger.debug("更新场景节点任务状态"); + sceneCaseTask.setStatus(PlanConstant.TASK_CANCEL_STATUS); + if (ObjectUtil.isNull(sceneCaseTask.getStartTime())) { + sceneCaseTask.setStartTime(System.currentTimeMillis()); + } + sceneCaseTask.setEndTime(System.currentTimeMillis()); + sceneCaseTask.setErrorMsg("任务取消"); + // 更新场景节点状态 + atuPlanSceneCaseTaskService.updateByPrimaryKey(sceneCaseTask); + } + } + logger.debug("任务状态为:{}", planTask.getStatus()); + // 判断是否终态 + if (ObjectUtil.equals(PlanConstant.TASK_WAIT_EXECUTE_STATUS, planTask.getStatus()) + || ObjectUtil.equals(PlanConstant.TASK_START_EXECUTE_STATUS, planTask.getStatus())) { + logger.debug("修改任务状态为取消"); + this.taskExecFailUpdate(planTask, PlanConstant.TASK_CANCEL_STATUS, "任务取消"); + } + } + return true; + } + + public void taskExecFailUpdate(AtuPlanTask planTask, String status, String errorMsg) { + logger.debug("修改任务状态为: {}", status); + if (ObjectUtil.isNull(planTask.getStartTime())) { + logger.debug("任务还未开始执行,修改开始状态"); + planTask.setStartTime(System.currentTimeMillis()); + planTask.setStatus(PlanConstant.TASK_START_EXECUTE_STATUS); + // 任务还未开始执行,先设置为开始执行状态 + planBatchApiService.updateCacheBatchSumData(planTask); + } + planTask.setStatus(status); + planTask.setEndTime(System.currentTimeMillis()); + planTask.setErrorMsg(errorMsg); + atuPlanTaskService.updateByPrimaryKey(planTask); + logger.debug("更新缓存中的统计信息"); + planBatchApiService.updateCacheBatchSumData(planTask); + } + + /** + * 创建任务执行信息 + * + * @param planTask 任务信息 + * @param batchCaseInfo 用例信息 + */ + @Override + public void createTaskExecuteInfo(AtuPlanTask planTask, AtuBatchCaseInfoDto batchCaseInfo) { + AtuTaskExecDto atuTaskExecDto = new AtuTaskExecDto(); + BeanUtil.copyProperties(batchCaseInfo, atuTaskExecDto); + atuTaskExecDto.setTaskId(planTask.getId()); + atuTaskExecDto.setCaseId(planTask.getCaseId()); + atuTaskExecDto.setCaseParams(batchCaseInfo.getCaseParam()); + String type = planTask.getCaseType(); + atuTaskExecDto.setCaseType(type); + atuTaskExecDto.setFailRetryNum(batchCaseInfo.getFailRetryCount()); + // 重试策略 + atuTaskExecDto.setRetryStrategy(batchCaseInfo.getRetryStrategy()); + boolean deviceOffline = false; + if (ObjectUtil.equal(PlanConstant.SCRIPT_TYPE_SCENE, type)) { + // 场景用例 + // 第一节点执行信息 + AtuSceneNodeExecDto sceneNodeExecDto = batchCaseInfo.getSceneNodeExecDto(); + logger.debug("场景首节点信息:" + JSONUtil.toJsonStr(sceneNodeExecDto)); + if (ObjectUtil.isNull(sceneNodeExecDto)) { + this.taskExecFailUpdate(planTask,PlanConstant.TASK_EXECUTE_FAIL_STATUS,"场景节点执行信息不存在"); + throw new PlatformRuntimeException(ExecPlanError.SCENE_NODE_EXEC_INFO_IS_NULL); + } + AtuSceneNodeInfoDto nextNodeInfo = sceneNodeExecDto.getNodeInfo(); + if (ObjectUtil.isNull(nextNodeInfo)) { + this.taskExecFailUpdate(planTask,PlanConstant.TASK_EXECUTE_FAIL_STATUS,"场景下一节点信息不存在"); + throw new PlatformRuntimeException(ExecPlanError.SCENE_NEXT_NODE_INFO_IS_NULL); + } + // 生成场景节点任务 + AtuPlanSceneCaseTask planSceneCaseTask = new AtuPlanSceneCaseTask(); + planSceneCaseTask.setId(IdUtil.simpleUUID()); + planSceneCaseTask.setTaskId(planTask.getId()); + planSceneCaseTask.setScriptId(nextNodeInfo.getScriptId()); + planSceneCaseTask.setVersionId(nextNodeInfo.getVersionId()); + planSceneCaseTask.setVersionName(nextNodeInfo.getVersionName()); + planSceneCaseTask.setScriptName(nextNodeInfo.getScriptName()); + planSceneCaseTask.setScriptJson(nextNodeInfo.getScriptPath()); + planSceneCaseTask.setNodeId(nextNodeInfo.getNodeId()); + planSceneCaseTask.setNodeType(nextNodeInfo.getNodeType()); + if (CollUtil.isNotEmpty(nextNodeInfo.getCaseParam())) { + planSceneCaseTask.setNodeParams(JSONUtil.toJsonStr(nextNodeInfo.getCaseParam())); + } + planSceneCaseTask.setPrevNodeId(sceneNodeExecDto.getNodeId()); + planSceneCaseTask.setCreatedTime(new Date()); + planSceneCaseTask.setStatus(PlanConstant.TASK_WAIT_EXECUTE_STATUS); + planSceneCaseTask.setScriptJson(nextNodeInfo.getScriptPath()); + atuPlanSceneCaseTaskService.insert(planSceneCaseTask); + + // 移动用例 + atuTaskExecDto.setAppId(queryAppId(batchCaseInfo.getPlanId(), nextNodeInfo.getPlatformType(), + nextNodeInfo.getAppPackage(), nextNodeInfo.getNodeType())); + atuTaskExecDto.setTaskId(planSceneCaseTask.getId()); + atuTaskExecDto.setScriptPath(nextNodeInfo.getScriptPath()); + atuTaskExecDto.setCaseParams(nextNodeInfo.getCaseParam()); + + type = nextNodeInfo.getNodeType(); + + deviceOffline = checkDeviceOffline(planTask, planSceneCaseTask, batchCaseInfo, true); + } else { + atuTaskExecDto.setAppId(queryAppId(batchCaseInfo.getPlanId(), batchCaseInfo.getPlatformType(), + batchCaseInfo.getAppPackage(), planTask.getCaseType())); + + deviceOffline = checkDeviceOffline(planTask, new AtuPlanSceneCaseTask(), batchCaseInfo, false); + } + + if (deviceOffline) { + logger.debug("该类型的设备全部离线了,任务结束"); + return; + } + // 发送任务执行信息至消息队列 + sendToQueue(atuTaskExecDto.getBatchId(), atuTaskExecDto, type); + } + + /** + * 校验设备是否离线 + * + * @param planTask 任务信息 + * @param planSceneCaseTask 场景节点任务信息 + * @param batchCaseInfo 用例信息 + * @param isScene 是否场景任务 + */ + private boolean checkDeviceOffline(AtuPlanTask planTask, AtuPlanSceneCaseTask planSceneCaseTask, + AtuBatchCaseInfoDto batchCaseInfo, boolean isScene) { + logger.debug("校验设备是否离线"); + String taskType = planTask.getCaseType(); + if (isScene) { + taskType = planSceneCaseTask.getNodeType(); + } + AtuPlanBatchDeviceLink batchDeviceLink = new AtuPlanBatchDeviceLink(); + logger.debug("脚本类型为:{}", taskType); + switch (taskType) { + case PlanConstant.SCRIPT_TYPE_API: + case PlanConstant.SCRIPT_TYPE_BS: + case PlanConstant.SCRIPT_TYPE_CS: + batchDeviceLink.setDeviceType(PlanConstant.DEVICE_TYPE_PC); + break; + case PlanConstant.SCRIPT_TYPE_ANDROID: + case PlanConstant.SCRIPT_TYPE_IOS: + batchDeviceLink.setDeviceType(PlanConstant.DEVICE_TYPE_MOBILE); + break; + } + if (StrUtil.isEmpty(batchDeviceLink.getDeviceType())) { + logger.debug("设备类型为空,结束校验"); + return false; + } + batchDeviceLink.setBatchId(planTask.getBatchId()); + batchDeviceLink.setOffline(false); + List onlineDeviceList = atuPlanBatchDeviceLinkService.query(batchDeviceLink); + if (CollUtil.isNotEmpty(onlineDeviceList)) { + logger.debug("部分设备离线,任务照常执行, 在线设备数量:{}", onlineDeviceList.size()); + return false; + } + if (isScene) { + logger.debug("场景任务,更新节点任务状态"); + // 查询首节点任务类型 + planSceneCaseTask.setStartTime(System.currentTimeMillis()); + planSceneCaseTask.setStatus(PlanConstant.TASK_EXECUTE_FAIL_STATUS); + planSceneCaseTask.setEndTime(System.currentTimeMillis()); + planSceneCaseTask.setErrorMsg("该计划绑定的设备已离线"); + logger.debug("更新当前节点信息 => " + JSONUtil.toJsonStr(planSceneCaseTask)); + atuPlanSceneCaseTaskService.updateByPrimaryKey(planSceneCaseTask); + + logger.debug("通知脚本用例服务该场景任务取消执行"); + SceneCaseStopDto sceneCaseStopDto = new SceneCaseStopDto(); + sceneCaseStopDto.setTaskId(batchCaseInfo.getTaskId()); + sceneCaseStopDto.setCaseId(batchCaseInfo.getCaseId()); + try { + publicFeignClient.stopCase(sceneCaseStopDto); + } catch (Exception e) { + logger.error("通知脚本用例服务该场景任务取消执行异常", e); + } + } + logger.debug("更新任务为离线超时状态"); + this.taskExecFailUpdate(planTask, PlanConstant.TASK_EXECUTE_FAIL_STATUS, "该计划绑定的设备已离线"); + return true; + } + + /** + * 查询应用ID + * + * @param planId 计划ID + * @param platformType 平台类型 + * @param appPackage app包名 + * @param caseType 用例类型 + * @return 结果 + */ + @Override + public String queryAppId(String planId, String platformType, String appPackage, String caseType) { + if (ObjectUtil.equal(PlanConstant.SCRIPT_TYPE_ANDROID, caseType) + || ObjectUtil.equal(PlanConstant.SCRIPT_TYPE_IOS, caseType)) { + // 根据计划ID,应用包名,应用平台类型查询应用ID + AtuPlanAppLink planAppLink = new AtuPlanAppLink(); + planAppLink.setPlanId(planId); + planAppLink.setPlatformType(platformType); + logger.debug("查询应用ID参数 => " + JSONUtil.toJsonStr(planAppLink)); + String appId = atuPlanAppLinkService.queryAppId(planAppLink); + if (StrUtil.isBlank(appId)) { + logger.error("该平台绑定的应用编号信息为空"); + return ""; + //throw new PlatformRuntimeException(ExecPlanError.CASE_APP_ID_IS_NULL); + } + return appId; + } + return ""; + } + + /** + * 下载脚本文件 + * + * @param scriptJson 脚本存放地址 + * @return 脚本对象 + */ + private JSONObject downloadScriptFile(String scriptJson) { + if (StrUtil.isBlank(scriptJson)) { + logger.error("脚本存放地址不存在"); + return null; + } + String[] resultPath = MinioPathUtils.idToPath(scriptJson); + InputStream inputStream = null; + JSONObject scriptData; + try { + inputStream = simpleStorageService.downloadAsStream(resultPath[0], "/" + resultPath[1]); + scriptData = MinioPathUtils.getFileContent(inputStream, JSONObject.class); + } catch (FileDownloadException e) { + logger.error("读取原脚本文件失败,失败原因:", e); + throw new PlatformRuntimeException(ExecPlanError.DOWNLOAD_SCRIPT_FAIL); + } finally { + if (null != inputStream) { + try { + inputStream.close(); + } catch (IOException e) { + logger.error("关闭文件流异常", e); + } + } + } + return scriptData; + } + + @Override + public AtuPlanTaskDetailDto findTaskDetailById(String taskId) { + AtuPlanTaskDetailDto taskDetailDto = new AtuPlanTaskDetailDto(); + // 查询任务信息 + AtuPlanTask planTask = atuPlanTaskService.findByPrimaryKey(taskId); + if (ObjectUtil.isNull(planTask)) { + throw new PlatformRuntimeException(ExecPlanError.TASK_INFO_IS_NULL); + } + BeanUtils.copyProperties(planTask, taskDetailDto); + taskDetailDto.setTaskId(planTask.getId()); + taskDetailDto.setExecResult(planTask.getStatus()); + + //啄木鸟跳转ip赋值 + taskDetailDto.setHostStr(hostStr); + // 脚本下载解析 + JSONObject scriptJson = downloadScriptFile(planTask.getScriptJson()); + if (scriptJson != null) { + logger.debug("scriptJson => " + scriptJson); + // 解析脚本,获取脚本参数信息 + JSONArray variables = new JSONArray(); + try { + String str = scriptJson.getStr(MsgConstant.JSONARRAY_KEY_VARIABLES); + if (str.contains(MsgConstant.JSONARRAY_KEY_REF)){//引用模式取数问题 + variables = JSONUtil.parseArray(scriptJson.getStr(MsgConstant.JSONARRAY_KEY_VARIABLES_FIELD)); + }else { + variables = JSONUtil.parseArray(scriptJson.getStr(MsgConstant.JSONARRAY_KEY_VARIABLES)); + } + } catch (Exception e) { + logger.info("脚本参数内容 => " + JSONUtil.toJsonStr(scriptJson.getStr(MsgConstant.JSONARRAY_KEY_VARIABLES))); + logger.error("脚本参数解析失败", e); + } + // 返回步骤的脚本列表 + List steps = new ArrayList<>(); + if (ObjectUtil.equal(PlanConstant.SCRIPT_TYPE_SCENE, planTask.getCaseType())) { + // 查询获取场景脚本的所有节点 + JSONArray nodes = scriptJson.getJSONArray(MsgConstant.JSONARRAY_KEY_NODES); + + // 根据执行结果排序节点 + //logger.debug("节点数组排序前 => " + JSONUtil.toJsonStr(nodes)); + nodes = orderByNodes(nodes, planTask.getId()); + //logger.debug("节点数组排序后 => " + JSONUtil.toJsonStr(nodes)); + + List execScripts = new ArrayList<>(); + List unExecScripts = new ArrayList<>(); + for (Object node : nodes) { + JSONObject nodeJson = JSONUtil.parseObj(node); + logger.info("开始处理节点:"+nodeJson); + String nodeType = nodeJson.getStr(MsgConstant.JSONOBJECT_KEY_NODETYPE); + if (ObjectUtil.equal(MsgConstant.START, nodeType) || ObjectUtil.equal(MsgConstant.END, nodeType)) { + continue; + } + AtuPlanSceneCaseTask query = new AtuPlanSceneCaseTask(); + query.setTaskId(planTask.getId()); + query.setNodeId(nodeJson.getStr(MsgConstant.ID)); + AtuPlanSceneCaseTask sceneCaseTask = atuPlanSceneCaseTaskService.queryResultFileByTaskIdAndNodeId(query); + + TaskCaseStepDetailDto stepDto = new TaskCaseStepDetailDto(); + // 查询场景各个节点的脚本数据 + stepDto.setStepId(nodeJson.getStr(MsgConstant.SCRIPT_ID)); + stepDto.setStepName(nodeJson.getStr(MsgConstant.SCRIPT_NAME)); + JSONObject nodeScriptJson = downloadScriptFile(nodeJson.getStr(MsgConstant.SCRIPT_URL)); + if (ObjectUtil.isNotNull(nodeScriptJson)) { + // 节点执行结果文件由场景任务表中获取,有循环则查最后一条数据 + + String execResultFile = ObjectUtil.isNotNull(sceneCaseTask) ? sceneCaseTask.getExecResultFile() : ""; + // 获取脚本步骤明细 + List stepList = findScriptStepDetail(execResultFile, nodeScriptJson, stepDto); + stepDto.setStepList(stepList); + + } + if (ObjectUtil.isNotEmpty(sceneCaseTask)) { + execScripts.add(stepDto); + } else { + unExecScripts.add(stepDto); + } + } + steps.addAll(execScripts); + steps.addAll(unExecScripts); + + } else { + // 获取脚本步骤明细 + steps = findScriptStepDetail(planTask.getExecResultFile(), scriptJson, new TaskCaseStepDetailDto()); + } + + List variableDtoList = new ArrayList<>(); + if (ObjectUtil.isNotNull(variables)) { + Map caseParamMap = new HashMap<>(); + if (StrUtil.isNotEmpty(planTask.getCaseParam())) { + caseParamMap = JSONUtil.parseObj(planTask.getCaseParam()); + } + for (Object variable : variables) { + JSONObject variableJson = JSONUtil.parseObj(variable); + AtuVariableDto variableDto = new AtuVariableDto(); + boolean input = false; + boolean output = false; + if (ObjectUtil.isNotNull(variableJson.get(MsgConstant.INPUT))) { + input = (boolean) variableJson.get(MsgConstant.INPUT); + logger.debug("解析到的 input 数据为 " + input); + } + if (ObjectUtil.isNotNull(variableJson.get(MsgConstant.OUTPUT))) { + output = (boolean) variableJson.get(MsgConstant.OUTPUT); + } + if (!input && !output) { + continue; + } + + String name = variableJson.getStr(MsgConstant.NAME); + variableDto.setName(name); + variableDto.setType(variableJson.getStr(MsgConstant.TYPE)); + // 脚本参数匹配实际值 + if (input) { + if (caseParamMap.containsKey(name)) { + variableDto.setValue(caseParamMap.get(name).toString()); + } else { + variableDto.setValue(variableJson.getStr(MsgConstant.DEFAULT_VALUE)); + } + variableDto.setInput(true); + variableDtoList.add(variableDto); + } + if (output) { + AtuVariableDto variableDtoCopy = new AtuVariableDto(); + BeanUtils.copyProperties(variableDto, variableDtoCopy); + variableDtoCopy.setInput(false); + variableDtoCopy.setValue(variableJson.getStr(MsgConstant.DEFAULT_VALUE)); + variableDtoList.add(variableDtoCopy); + } + } + } + // 脚本参数匹配实际值 + taskDetailDto.setCaseParams(variableDtoList); + taskDetailDto.setSteps(steps); + } + // 查询引擎信息 + String engineId = ""; + // 判断是否场景用例,场景用例则查询场景任务表中的引擎信息 + if (ObjectUtil.equal(PlanConstant.SCRIPT_TYPE_SCENE, planTask.getCaseType())) { + // 查询场景任务设备ID列表 + List ids = new ArrayList<>(); + ids.add(planTask.getId()); + List atuPlanSceneCaseTasks = atuPlanSceneCaseTaskService.querySceneCaseTasksByTaskIds(ids); + if (!CollectionUtils.isEmpty(atuPlanSceneCaseTasks)) { + engineId = atuPlanSceneCaseTasks.get(0).getEngineId(); + } + } else { + engineId = planTask.getEngineId(); + } + if (StringUtils.isNotBlank(engineId)) { + CdEngineInfoDetailDto engineInfo = deviceFeignClient.queryEngineInfo(engineId); + if (engineInfo != null) { + taskDetailDto.setEngineIp(engineInfo.getIpAddr()); + } + } + // 查询设备信息 + Set deviceIdList = new HashSet<>(); + // 判断是否场景用例,场景用例则查询多个设备信息 + if (ObjectUtil.equal(PlanConstant.SCRIPT_TYPE_SCENE, planTask.getCaseType())) { + // 查询场景任务设备ID列表 + deviceIdList = atuPlanSceneCaseTaskService.queryDeviceIdListByTaskId(planTask.getId()); + } else { + deviceIdList.add(planTask.getDeviceId()); + } + + if (planTask.getCaseType().equals(PlanConstant.SCRIPT_TYPE_SCENE)) { + List sceneNodes = new ArrayList<>(); + //获取每个节点最后一次执行的内容 + List query = this.atuPlanSceneCaseTaskService.queryNodeInfo(planTask.getId()); + for (AtuPlanSceneCaseTask caseTask : query) { + if (StrUtil.isNotBlank(caseTask.getVideoUrl())) { + SceneNodeDto node = new SceneNodeDto(); + BeanUtils.copyProperties(caseTask, node); + //视频播放的设备类型(1、移动 2、PC) + switch (caseTask.getNodeType()) { + case PlanConstant.SCRIPT_TYPE_API: + case PlanConstant.SCRIPT_TYPE_BS: + case PlanConstant.SCRIPT_TYPE_CS: + node.setDeviceType(PlanConstant.DEVICE_TYPE_PC); + break; + case PlanConstant.SCRIPT_TYPE_ANDROID: + case PlanConstant.SCRIPT_TYPE_IOS: + node.setDeviceType(PlanConstant.DEVICE_TYPE_MOBILE); + break; + } + sceneNodes.add(node); + } + } + taskDetailDto.setSceneData(sceneNodes); + } else if (StrUtil.isNotBlank(planTask.getVideoUrl())) { + List sceneNodes = new ArrayList<>(); + SceneNodeDto node = new SceneNodeDto(); + BeanUtils.copyProperties(planTask, node); + switch (planTask.getCaseType()) { + case PlanConstant.SCRIPT_TYPE_API: + case PlanConstant.SCRIPT_TYPE_BS: + case PlanConstant.SCRIPT_TYPE_CS: + node.setDeviceType(PlanConstant.DEVICE_TYPE_PC); + break; + case PlanConstant.SCRIPT_TYPE_ANDROID: + case PlanConstant.SCRIPT_TYPE_IOS: + node.setDeviceType(PlanConstant.DEVICE_TYPE_MOBILE); + break; + } + sceneNodes.add(node); + taskDetailDto.setSceneData(sceneNodes); + } + + try { + List> deviceInfoList = deviceFeignClient.queryDeviceInfo(deviceIdList); + if (CollUtil.isNotEmpty(deviceInfoList)) { + taskDetailDto.setDeviceInfoList(deviceInfoList); + } + } catch (Exception e) { + logger.error("查询设备信息异常", e); + } + return taskDetailDto; + } + + private JSONArray orderByNodes(JSONArray nodes, String taskId) { + // 根据任务ID查询已经执行的节点结果 + AtuPlanSceneCaseTask sceneCaseTask = new AtuPlanSceneCaseTask(); + sceneCaseTask.setTaskId(taskId); + OrderBy orderBy = new SqlOrderBy(); + orderBy.asc(PlanConstant.CREATED_TIME); + List sceneCaseTasks = atuPlanSceneCaseTaskService.query(sceneCaseTask, orderBy); + if (CollUtil.isEmpty(sceneCaseTasks)) { + return nodes; + } + Map sceneCaseMap = sceneCaseTasks.stream() + .collect(Collectors.toMap(AtuPlanSceneCaseTask::getNodeId, AtuPlanSceneCaseTask::getCreatedTime, + (v1, v2) -> v1)); + // 将执行顺序加入到节点集合中 + JSONArray nodeArray = new JSONArray(); + for (Object node : nodes) { + JSONObject nodeJson = JSONUtil.parseObj(node); + String nodeId = nodeJson.getStr("id"); + if (sceneCaseMap.containsKey(nodeId)) { + nodeJson.set(PlanConstant.CREATED_TIME, sceneCaseMap.get(nodeId)); + } else { + nodeJson.set(PlanConstant.CREATED_TIME, new Date()); + } + nodeArray.add(nodeJson); + } + //logger.debug("节点数组增加时间排序前 => " + JSONUtil.toJsonStr(nodeArray)); + // 节点集合进行排序 + nodeArray.sort(Comparator.comparing(obj -> ((JSONObject) obj).getDate(PlanConstant.CREATED_TIME))); + return nodeArray; + } + + /** + * 获取脚本步骤明细 + * + * @param execResultFile 执行结果文件地址 + * @param scriptJson 脚本信息 + */ + private List findScriptStepDetail(String execResultFile, JSONObject scriptJson, + TaskCaseStepDetailDto detailDto) { + // 获取脚本执行结果信息 + Map stepResultMap = new HashMap<>(); + + JSONArray commands = scriptJson.getJSONArray(MsgConstant.COMMANDS); + Map groupMap = new HashMap<>(); + for (Object command : commands) { + cn.hutool.json.JSONObject commandJson = JSONUtil.parseObj(command); + String commandName = commandJson.getStr(MsgConstant.COMMAND); + if ("group".equalsIgnoreCase(commandName)) { + String groupStepId = commandJson.getStr(MsgConstant.ID); + Object children = commandJson.get(MsgConstant.CHILDREN); + cn.hutool.json.JSONArray childrenArray = JSONUtil.parseArray(children); + for (Object child : childrenArray) { + cn.hutool.json.JSONObject childJson = JSONUtil.parseObj(child); + String childId = childJson.getStr(MsgConstant.ID); + groupMap.put(childId, groupStepId); + } + } + } + + String stepId = ""; + if (StrUtil.isNotEmpty(execResultFile)) { + // 读取结果文件信息 + File file = null; + try { + file = simpleStorageService.downloadAsFile(NKSecurityContext.getTenantId(), execResultFile); + String absolutePath = file.getAbsolutePath(); + String canonicalPath = file.getCanonicalPath(); + logger.debug("absolutePath => " + absolutePath); + logger.debug("canonicalPath => " + canonicalPath); + FileReader reader = new FileReader(file); + List lines = reader.readLines(); + for (String line : lines) { + if (StrUtil.isBlank(line)) { + continue; + } + StepExecuteResult stepExecuteResult = JSONUtil.toBean(line, StepExecuteResult.class); + String groupId = groupMap.get(stepExecuteResult.getStepId()); + processStepResult(stepExecuteResult, stepResultMap, groupId); + boolean ifPrint = SpringUtil.getProperty("ifPrint") != null && Boolean.parseBoolean(SpringUtil.getProperty("ifPrint")); + if (stepExecuteResult.getStepId() != null && ifPrint) { // 用于只输出对应异常数据的详情,可以删除判断,每一个查询进行输出,日志增多而已 + stepId = stepExecuteResult.getStepId(); + stepResultMap.forEach((key, value) -> { + logger.debug("每一步的执行情况:{},success:{},isExecuted:{}", key, value.isSuccess(), value.isExecuted()); + }); + } + } + } catch (Exception e) { + logger.error("读取结果文件失败", e); + } finally { + // 删除下载的临时文件 + if (file != null) { + if (!file.delete()) { + logger.error("临时文件删除失败, file => " + file.getAbsolutePath()); + } + } + } + } + + commands.forEach(one -> checkGroup(stepResultMap, one)); + List resultList = processStepData(commands, stepResultMap, scriptJson, detailDto, 0, false, false, ""); + if (StringUtils.isNotBlank(stepId)) { + for (TaskCaseStepDetailDto dto : resultList) { // 用于只输出对应异常数据的详情,可以删除判断,每一个查询进行输出,日志增多而已 + logger.debug("步骤id:{},步骤名称:{},skip:{},是否成功:{},是否已执行:{}", dto.getStepId(), dto.getStepName(), dto.getSkip(), dto.getExecResult(), dto.getExecuted()); + } + } + return resultList; + } + + private void checkGroup(Map stepResultMap, Object command) { + cn.hutool.json.JSONObject commandJson = JSONUtil.parseObj(command); + String commandStr = commandJson.getStr(MsgConstant.COMMAND); + String groupStepId = commandJson.getStr(MsgConstant.ID); + if ("group".equalsIgnoreCase(commandStr)) { + Object children = commandJson.get(MsgConstant.CHILDREN); + if (null != children) { + cn.hutool.json.JSONArray childrenArray = JSONUtil.parseArray(children); + childrenArray.forEach(child -> { + cn.hutool.json.JSONObject childJson = JSONUtil.parseObj(child); + String childId = childJson.getStr(MsgConstant.ID); + StepExecuteResult stepExecuteResult = stepResultMap.get(String.format("%s.%s", groupStepId, childId)); + if (null != stepExecuteResult && stepExecuteResult.isExecuted()) { + StepExecuteResult groupResult = new StepExecuteResult(); + groupResult.setExecuted(true); + groupResult.setStepId(groupStepId); + stepResultMap.put(groupStepId, groupResult); + } + }); + } + + } + } + + /** + * 步骤执行结果处理 + * + * @param stepExecuteResult 步骤执行结果信息 + * @param stepResultMap 步骤执行结果集合 + */ + private void processStepResult(StepExecuteResult stepExecuteResult, Map stepResultMap, + String parentStepId) { + String stepId = stepExecuteResult.getStepId(); + if (StrUtil.isNotBlank(parentStepId)) { + stepId = parentStepId + "." + stepId; + } + stepResultMap.put(stepId, stepExecuteResult); + if (CollUtil.isNotEmpty(stepExecuteResult.getChildResult())) { + for (StepExecuteResult executeResult : stepExecuteResult.getChildResult()) { + processStepResult(executeResult, stepResultMap, stepId); + } + } + } + + /** + * 处理步骤数据 + * + * @param jsonArray 组件列表 + * @param stepResultMap 步骤结果集合 + * @param scriptJson 脚本json + * @return 步骤集合 + */ + private List processStepData(JSONArray jsonArray, Map stepResultMap, + JSONObject scriptJson, TaskCaseStepDetailDto parentDetail, int num, + boolean success, boolean executed, String parentStepId) { + List stepList = new ArrayList<>(); + if (ObjectUtil.isNull(jsonArray) || jsonArray.size() <= 0) { + return stepList; + } + if (num == PlanConstant.MAX_STEP_ANALYSIS_NUM) { + return stepList; + } + num++; + for (Object command : jsonArray) { + JSONObject commandJson = JSONUtil.parseObj(command); + //logger.debug("commandJson => {}", JSONUtil.toJsonStr(commandJson)); + TaskCaseStepDetailDto stepDetailDto = new TaskCaseStepDetailDto(); + stepDetailDto.setStepId(commandJson.getStr(MsgConstant.ID)); + // 设置步骤名称 + String commandStr = commandJson.getStr(MsgConstant.COMMAND); + JSONObject extAttrs = JSONUtil.parseObj(commandJson.getStr(MsgConstant.EXTATTRS)); + String title = ""; + String stepType = extAttrs.getStr(MsgConstant.EXTATTRS_STEPTYPE); + // title: 点击元素名称 < stopName:步骤名称 + if (StrUtil.isNotBlank(extAttrs.getStr(MsgConstant.TITLE))) { + title = extAttrs.getStr(MsgConstant.TITLE); + } + if (StrUtil.isNotBlank(extAttrs.getStr(MsgConstant.STEPNAME))) { + title = extAttrs.getStr(MsgConstant.STEPNAME); + } + String commandName = extAttrs.getStr(MsgConstant.COMMAND_NAME); + // command:组件英文名 < commandName:组件中文名 + String stepName = StrUtil.isBlank(commandName) ? commandStr + " " + title : commandName + " " + title; + stepDetailDto.setStepName(WordUtils.replaceHtmlSpace(stepName)); + // 设置步骤描述 + List> stepDescList = new ArrayList<>(); + JSONArray targets = JSONUtil.parseArray(commandJson.getStr(MsgConstant.TARGETS)); + for (Object target : targets) { + JSONObject targetJson = JSONUtil.parseObj(target); + Map stepDescMap = new HashMap<>(); + stepDescMap.put(MsgConstant.USING, targetJson.getStr(MsgConstant.USING)); + JSONObject value = JSONUtil.parseObj(targetJson.getStr(MsgConstant.VALUE)); + stepDescMap.put(MsgConstant.SELECTOR, value.getStr(MsgConstant.SELECTOR)); + stepDescList.add(stepDescMap); + } + stepDetailDto.setStepDescList(stepDescList); + // 设置步骤类型 1-PC;2-移动 + String componentLib = commandJson.getStr(MsgConstant.COMPONENTLIB); + stepDetailDto.setStepType(MsgConstant.STEPDETAILDTO_StepType_0); + if (PlanConstant.PC_COMPONENT_LIB.equalsIgnoreCase(componentLib)) { + stepDetailDto.setStepType(MsgConstant.STEPDETAILDTO_StepType_1); + } + if (PlanConstant.MOBILE_COMPONENT_LIB.equalsIgnoreCase(componentLib)) { + stepDetailDto.setStepType(MsgConstant.STEPDETAILDTO_StepType_2); + } + if (PlanConstant.INTERFACE_COMPONENT_LIB.equalsIgnoreCase(componentLib)) { + stepDetailDto.setStepType(MsgConstant.STEPDETAILDTO_StepType_3); + } + // 设置预期截图 + stepDetailDto.setImgUrl(extAttrs.getStr(MsgConstant.FULL_IMAGE)); + // 是否跳过 + stepDetailDto.setSkip(commandJson.getBool(MsgConstant.SKIP)); + // 设置步骤执行结果 + boolean childSuccess = false; + boolean childExecuted = false; + String stepId = stepDetailDto.getStepId(); + if (StrUtil.isNotBlank(parentStepId)) { + // 解决多个相同业务组件引用问题 + stepId = parentStepId + "." + stepId; + } + if (CollUtil.isNotEmpty(stepResultMap)) { + if (stepResultMap.containsKey(stepId)) { + // 步骤执行结果处理 + StepExecuteResult stepExecuteResult = stepResultMap.get(stepId); + if (StrUtil.isNotBlank(stepExecuteResult.getOutputMsg())) { + String outputMsg = stepExecuteResult.getOutputMsg() + .replace("\r", "") + .replace("\n", ""); + stepDetailDto.setOutputMsg(outputMsg); + } + List paramList = new ArrayList<>(); + if (CollUtil.isNotEmpty(stepExecuteResult.getParamMap())) { + stepExecuteResult.getParamMap().forEach((key, value) -> { + paramList.add(key + "=" + value); + }); + stepDetailDto.setParamList(paramList); + } + success = stepExecuteResult.isSuccess(); + executed = stepExecuteResult.isExecuted(); + childSuccess = stepExecuteResult.isSuccess(); + childExecuted = stepExecuteResult.isExecuted(); + + stepDetailDto.setExecTime(stepExecuteResult.getExecuteTime()); + stepDetailDto.setActualImgUrl(stepExecuteResult.getActualImgUri()); + stepDetailDto.setErrorMsg(stepExecuteResult.getMsg()); + // 获取响应报文 + Map result = stepExecuteResult.getResult(); + if (stepDetailDto.getStepType() != null && "3".equalsIgnoreCase(stepDetailDto.getStepType()) && CollUtil.isNotEmpty(result)) { + Object keywordReturn = result.get(MsgConstant.KEYWORDRETURN); + if (ObjectUtil.isNotEmpty(keywordReturn)) { + stepDetailDto.setResponseMap(keywordReturn.toString()); + } + } + } + } + stepDetailDto.setExecResult(childSuccess); + stepDetailDto.setExecuted(childExecuted); + // 处理子步骤 + stepDetailDto.setStepList(processStepData(commandJson.getJSONArray(MsgConstant.CHILDREN), stepResultMap, + scriptJson, stepDetailDto, num, childSuccess, childExecuted, stepId)); + // 判断是否内部组件 + if (ObjectUtil.equal(PlanConstant.INTERNAL_COMPONENT_LIB, componentLib)) { + if (ObjectUtil.equal(PlanConstant.INTERFACE_STEP_TYPE, stepType) || + ObjectUtil.equal(PlanConstant.BUSINESS_STEP_TYPE, stepType)) { + // 接口组件和业务组件 + // 加入到该步骤信息中 + stepDetailDto.setStepList(processBusinessComponent(scriptJson, commandJson, stepResultMap, + stepDetailDto, num, stepId)); + } + } + stepList.add(stepDetailDto); + } + parentDetail.setExecResult(success); + parentDetail.setExecuted(executed); + parentDetail.setStepList(stepList); + return stepList; + } + + /** + * 处理接口和业务组件 + * + * @param scriptJson 脚本json + * @param commandJson 组件JSON + * @param stepResultMap 步骤结果 + * @return 步骤列表 + */ + private List processBusinessComponent(JSONObject scriptJson, JSONObject commandJson, + Map stepResultMap, + TaskCaseStepDetailDto parentDetail, int num, + String parentStepId) { + List stepList = new ArrayList<>(); + // 获取command中args里的resId + String args = commandJson.getStr(MsgConstant.ARGS); + if (StrUtil.isBlank(args)) { + return stepList; + } + JSONObject argsJson = JSONUtil.parseObj(args); + String resId = argsJson.getStr(MsgConstant.RESID); + if (StrUtil.isBlank(resId)) { + return stepList; + } + // 更新resId在resources-scriptDependencies中查找对应的脚本存放地址resUri + String resources = scriptJson.getStr(MsgConstant.RESOURCES); + if (StrUtil.isBlank(resources)) { + return stepList; + } + JSONObject resourcesJson = JSONUtil.parseObj(resources); + JSONArray scriptDependencies = resourcesJson.getJSONArray(MsgConstant.SCRIPT_DEPENDENCIES); + if (ObjectUtil.isNull(scriptDependencies) || scriptDependencies.size() <= 0) { + return stepList; + } + String resUri = ""; + String resName = ""; + for (Object scriptDependency : scriptDependencies) { + JSONObject jsonObject = JSONUtil.parseObj(scriptDependency); + String setId = jsonObject.getStr(MsgConstant.RESID); + if (ObjectUtil.equal(resId, setId)) { + resUri = jsonObject.getStr(MsgConstant.RESURI); + //获取最新的业务组件信息 + try { + ResultWrapper resultWrapper = scriptCaseFeignClient.findBusComName(resId); + if (resultWrapper != null && resultWrapper.isSuccess() && resultWrapper.getData() != null) { + MdBusComponentInfoDetailDto busCom = resultWrapper.getData(); + if (busCom != null) { + resName = busCom.getComName(); + } + } + } catch (Exception e) { + logger.error("获取业务组件最新名称异常", e); + } + } + } + if (StrUtil.isNotBlank(resName)) { + parentDetail.setStepName(resName); + } + + // 根据脚本地址下载脚本解析 + try { + JSONObject scriptJsonObj = downloadScriptFile(resUri); + // 获取脚本中的步骤信息 + if (scriptJsonObj == null) { + return stepList; + } + stepList = processStepData(scriptJsonObj.getJSONArray(MsgConstant.COMMANDS), stepResultMap, scriptJsonObj, + parentDetail, num, false, false, parentStepId); + } catch (Exception e) { + logger.error("下载解析脚本文件异常", e); + } + + return stepList; + } + + @Override + public Boolean updateTaskExecFile(Map params) { + if (StrUtil.isEmpty(params.get(MsgConstant.TASKID)) || StrUtil.isEmpty(params.get(MsgConstant.FILEPATH))) { + throw new PlatformRuntimeException(ExecPlanError.PARAMS_IS_NOT_NULL); + } + AtuPlanTask planTask = atuPlanTaskService.findByPrimaryKey(params.get(MsgConstant.TASKID)); + if (ObjectUtil.isNull(planTask)) { + throw new PlatformRuntimeException(ExecPlanError.TASK_INFO_IS_NULL); + } + planTask.setExecResultFile(params.get(MsgConstant.FILEPATH)); + int row = atuPlanTaskService.updateByPrimaryKey(planTask); + return row > 0; + } + + /** + * 发送任务执行信息至消息队列 + * + * @param batchId 批次ID + * @param atuTaskExecDto 任务执行信息 + */ + @Override + public void sendToQueue(String batchId, AtuTaskExecDto atuTaskExecDto, String type) { + String queueName = ""; + switch (type) { + case PlanConstant.SCRIPT_TYPE_API: + queueName = RabbitConstant.TASK_EXEC_QUEUE_API_KEY + batchId; + break; + case PlanConstant.SCRIPT_TYPE_BS: + case PlanConstant.SCRIPT_TYPE_CS: + queueName = RabbitConstant.TASK_EXEC_QUEUE_PC_KEY + batchId; + break; + case PlanConstant.SCRIPT_TYPE_ANDROID: + queueName = RabbitConstant.TASK_EXEC_QUEUE_MOB_KEY + MsgConstant.ANDROID + "." + batchId; + break; + case PlanConstant.SCRIPT_TYPE_IOS: + queueName = RabbitConstant.TASK_EXEC_QUEUE_MOB_KEY + MsgConstant.IOS + "." + batchId; + break; + default: + break; + } + logger.debug("任务执行信息 => " + JSONUtil.toJsonStr(atuTaskExecDto)); + if (StrUtil.isEmpty(queueName)) { + logger.error("消息队列名称或路由为空"); + return; + } + // 增加当前重试次数 + atuTaskExecDto.setCurrentRetryNum(0); + Object o = redisTemplate.opsForHash().get(RedisConstant.PLAN_BATCH_RETRY_COUNT, atuTaskExecDto.getBatchId()); + if (null != o) { + int count = Integer.parseInt(o.toString()); + atuTaskExecDto.setCurrentRetryNum(atuTaskExecDto.getFailRetryNum() - count); + } + amqpAdmin.declareQueue(new Queue(queueName)); + amqpTemplate.convertAndSend(queueName, JSONUtil.toJsonStr(atuTaskExecDto)); + } + + /** + * 根据脚本id查询脚本详情 + * + * @param scriptIdSet 脚本id集合 + * @return 脚本详情 + */ + private Map queryScriptDetailMap(Set scriptIdSet) { + Map scriptMap = new HashMap<>(); + if (CollUtil.isEmpty(scriptIdSet)) { + return scriptMap; + } + // 根据脚本id查询脚本信息 + try { + ResultWrapper> scriptQueryResult = publicFeignClient.queryScriptDetailMap(scriptIdSet); + if (ObjectUtil.isNotNull(scriptQueryResult) && scriptQueryResult.isSuccess()) { + logger.debug("查询脚本结果:{}", JSONUtil.toJsonStr(scriptQueryResult)); + if (CollUtil.isEmpty(scriptQueryResult.getData())) { + throw new PlatformRuntimeException(ExecPlanError.QUERY_SCRIPT_INFO_IS_NULL); + } + scriptMap = scriptQueryResult.getData(); + logger.info("查询脚本结果数量:" + scriptMap.size()); + logger.info("脚本详情 => " + JSONUtil.toJsonStr(scriptMap)); + } + } catch (Exception e) { + logger.error("获取脚本信息异常", e); + } + return scriptMap; + } + + @Override + public void createdScriptTaskInfo(AtuPlanInfo planInfo, String batchId, List envIdList, + List inputDataList) { + logger.info("开始整合任务生成信息..."); + logger.info("查询脚本详细信息"); + Set scriptIdSet = inputDataList.stream().map(AtuPlanInputDto::getScriptId).collect(Collectors.toSet()); + logger.info("查询脚本数量:" + scriptIdSet.size()); + Map scriptMap = queryScriptDetailMap(scriptIdSet); + // 根据环境进行分组 + Map> envGroupMap = inputDataList.stream().collect(Collectors.groupingBy(AtuPlanInputDto::getEnvId)); + logger.debug("环境输入项分类数据 => {}", JSONUtil.toJsonStr(envGroupMap)); + logger.info("根据排序好的环境进行遍历"); + for (String envId : envIdList) { + if (!envGroupMap.containsKey(envId)) { + logger.debug("环境[{}]不在输入项数据环境中", envId); + continue; + } + List planInputDtoList = envGroupMap.get(envId); + if (CollUtil.isEmpty(planInputDtoList)) { + logger.debug("环境[{}]的输入项数据为空", envId); + continue; + } + List exceptionCaseList = new ArrayList<>(); + for (AtuPlanInputDto atuPlanInputDto : planInputDtoList) { + String scriptId = atuPlanInputDto.getScriptId(); + AtuScriptDetailDto atuScriptDetailDto = scriptMap.get(scriptId); + if (atuScriptDetailDto == null) { + logger.debug("生成异常任务数据"); + AtuExceptionCase exceptionCase = new AtuExceptionCase(); + exceptionCase.setBatchId(batchId); + exceptionCase.setScriptId(atuPlanInputDto.getScriptId()); + exceptionCase.setScriptName(MsgConstant.EMPTY); + exceptionCase.setScriptJson(MsgConstant.EMPTY); + exceptionCase.setCaseId(IdUtil.simpleUUID()); + exceptionCase.setCaseName(MsgConstant.EMPTY); + exceptionCase.setCaseType(atuPlanInputDto.getScriptType()); + exceptionCase.setCaseParam(""); + exceptionCase.setErrorMsg("脚本信息不存在,请检查"); + exceptionCaseList.add(exceptionCase); + continue; + } + if (CollUtil.isEmpty(atuPlanInputDto.getDataList())) { + logger.debug("脚本[{}]环境[{}]输入项文件数据为空", atuPlanInputDto.getScriptId(), atuPlanInputDto.getEnvId()); + continue; + } + for (Map dataMap : atuPlanInputDto.getDataList()) { + logger.debug("输入项数据:" + JSONUtil.toJsonStr(dataMap)); + createdCaseInfoToQueue(batchId, envId, dataMap, atuScriptDetailDto, planInfo, exceptionCaseList); + } + } + // 异常用例信息 + if (CollUtil.isNotEmpty(exceptionCaseList)) { + logger.info("生成异常用例任务信息"); + planBatchApiService.casePushNotice(exceptionCaseList); + } + } + } + + /** + * 创建用例信息并推送至队列 + * + * @param batchId 批次id + * @param envId 环境id + * @param dataMap 输入项行数据 + * @param atuScriptDetailDto 脚本信息 + * @param planInfo 计划信息 + * @param exceptionCaseList 异常用例集合 + */ + private void createdCaseInfoToQueue(String batchId, String envId, Map dataMap, + AtuScriptDetailDto atuScriptDetailDto, AtuPlanInfo planInfo, + List exceptionCaseList) { + logger.debug("创建用例信息并推送至队列"); + AtuBatchCaseInfoDto caseInfoDto = new AtuBatchCaseInfoDto(); + caseInfoDto.setBatchId(batchId); + String taskId = IdUtil.simpleUUID(); + caseInfoDto.setTaskId(taskId); + caseInfoDto.setEnvId(envId); + String caseId = IdUtil.simpleUUID(); + if (dataMap.get(PlanConstant.SCRIPT_TEST_PURPOSE_ID) != null) { + caseId = dataMap.get(PlanConstant.SCRIPT_TEST_PURPOSE_ID).toString(); + } + caseInfoDto.setCaseId(caseId); + String caseName = ""; + if (dataMap.get(PlanConstant.SCRIPT_TEST_PURPOSE_NAME) != null) { + caseName = dataMap.get(PlanConstant.SCRIPT_TEST_PURPOSE_NAME).toString(); + } + caseInfoDto.setCaseName(caseName); + caseInfoDto.setCaseParam(dataMap); + + String scriptId = atuScriptDetailDto.getScriptId(); + // 复制脚本信息 + BeanUtils.copyProperties(atuScriptDetailDto, caseInfoDto); + // 用例类型与脚本类型一致 + caseInfoDto.setCaseType(atuScriptDetailDto.getScriptType()); + // 复制计划策略 + BeanUtils.copyProperties(planInfo, caseInfoDto); + caseInfoDto.setPlanId(planInfo.getId()); + caseInfoDto.setFailRetryCount(0); + if (planInfo.getFailRetry()) { + caseInfoDto.setFailRetryCount(planInfo.getFailRetryCount()); + // 重试策略 + caseInfoDto.setRetryStrategy(planInfo.getRetryStrategy()); + } + + // 判断是否场景用例 + if (PlanConstant.SCRIPT_TYPE_SCENE.equals(atuScriptDetailDto.getScriptType())) { + logger.debug("场景脚本,获取首节点信息"); + SceneFirstNodeDto sceneFirstNodeDto = new SceneFirstNodeDto(); + sceneFirstNodeDto.setTaskId(taskId); + sceneFirstNodeDto.setCaseId(caseId); + sceneFirstNodeDto.setScriptId(scriptId); + sceneFirstNodeDto.setParamMap(dataMap); + try { + ResultWrapper firstNodeResult = publicFeignClient.getFirstNode(sceneFirstNodeDto); + AtuSceneNodeExecDto retNode = firstNodeResult.getData(); + if (firstNodeResult.isSuccess() && retNode != null) { + caseInfoDto.setSceneNodeExecDto(retNode); + caseInfoDto.setScriptPath(retNode.getSceneScriptUrl()); + } else { + throw new RuntimeException("获取场景脚本[ " + scriptId + "]首节点信息异常," + firstNodeResult.getMessage()); + } + } catch (Exception e) { + logger.error("获取场景脚本[{}]首节点信息异常", scriptId, e); + // 生成异常用例信息 + AtuExceptionCase exceptionCase = new AtuExceptionCase(); + BeanUtils.copyProperties(caseInfoDto, exceptionCase); + + exceptionCase.setCaseType(PlanConstant.SCRIPT_TYPE_SCENE); + exceptionCase.setCaseParam(JSONUtil.toJsonStr(dataMap)); + exceptionCase.setErrorMsg(e.getMessage()); + exceptionCaseList.add(exceptionCase); + return; + } + } + logger.debug("发送任务用例数据至队列"); + amqpTemplate.convertAndSend(RabbitConstant.PLAN_CASE_KEY, JSONUtil.toJsonStr(caseInfoDto)); + } + + @Override + public AtuPlanTask findByPrimaryKey(String id) { + return this.atuPlanTaskService.findByPrimaryKey(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean taskRetry(BatchRetryDto retryDto) { + logger.debug("查询需要重试的任务信息"); + List planTaskList = this.atuPlanTaskService.findByPrimaryKeys(retryDto.getTaskIdList()); + logger.debug("查询需要重试的任务信息数量:{}", planTaskList.size()); + if (CollUtil.isEmpty(planTaskList)) { + throw new PlatformRuntimeException(ExecPlanError.TASK_INFO_IS_NULL); + } + AtuPlanTask firstFailTask = planTaskList.get(0); + logger.debug("判断任务批次是否完成"); + AtuPlanBatch planBatch = planBatchApiService.findByPrimaryKey(firstFailTask.getBatchId()); + if (PlanConstant.BATCH_WAITING_STATUS.equals(planBatch.getStatus()) || + PlanConstant.BATCH_EXECUTING_STATUS.equals(planBatch.getStatus())) { + throw new PlatformRuntimeException(ExecPlanError.BATCH_NOT_FINISH); + } + logger.debug("根据批次编号[{}]查询计划信息", firstFailTask.getBatchId()); + AtuPlanInfo planInfo = atuPlanInfoApiService.findByBatchId(firstFailTask.getBatchId()); + if (planInfo == null) { + throw new PlatformRuntimeException(ExecPlanError.PLAN_IS_NULL); + } + + logger.debug("更新计划和批次状态"); + String planStatus = ""; + if (planBatch.getTaskTotal() > retryDto.getTaskIdList().size()) { + logger.debug("部分任务重试,批次状态为:{},计划状态为:{}", PlanConstant.BATCH_EXECUTING_STATUS, + PlanConstant.PLAN_EXECUTING_STATUS); + planBatch.setStatus(PlanConstant.BATCH_EXECUTING_STATUS); + planStatus = PlanConstant.PLAN_EXECUTING_STATUS; + } else { + logger.debug("全部任务重试,批次状态为:{},计划状态为:{}", PlanConstant.BATCH_WAITING_STATUS, + PlanConstant.PLAN_WAITING_STATUS); + planBatch.setStatus(PlanConstant.BATCH_WAITING_STATUS); + planStatus = PlanConstant.PLAN_WAITING_STATUS; + } + List deletedFilePath = new ArrayList<>(); + List taskIds = new ArrayList<>(); + planTaskList.forEach(task -> { + logger.info("普通脚本任务id:{},执行结果文件:{}", task.getId(), task.getExecResultFile()); + taskIds.add(task.getId()); + String execResultFile = task.getExecResultFile(); + if (StringUtils.isNotBlank(execResultFile)){ + deletedFilePath.add(execResultFile); + getActualImagePath(deletedFilePath, execResultFile); + } + String perDataPath = task.getPerDataPath(); + if (StringUtils.isNotBlank(perDataPath)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(perDataPath)[1]); + } + String videoUrl = task.getVideoUrl(); + if (StringUtils.isNotBlank(videoUrl)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(videoUrl)[1]); + } + // 场景用例脚本json是单独的需要删除 + if (task.getCaseType().equals("5")) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(task.getScriptJson())[1]); + } + }); + if (!CollectionUtils.isEmpty(taskIds)) { + List atuPlanSceneCaseTaskList = atuPlanSceneCaseTaskService.querySceneCaseTasksByTaskIds(taskIds); + atuPlanSceneCaseTaskList.forEach(atuPlanSceneCaseTask -> { + logger.info("场景任务id:{},节点任务id:{},执行结果文件:{}", atuPlanSceneCaseTask.getTaskId(),atuPlanSceneCaseTask.getId(), atuPlanSceneCaseTask.getExecResultFile()); + String videoUrl = atuPlanSceneCaseTask.getVideoUrl(); + if (StringUtils.isNotBlank(videoUrl)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(videoUrl)[1]); + } + String perDataPath = atuPlanSceneCaseTask.getPerDataPath(); + if (StringUtils.isNotBlank(perDataPath)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(perDataPath)[1]); + } + String execResultFile = atuPlanSceneCaseTask.getExecResultFile(); + if (StringUtils.isNotBlank(execResultFile)) { + deletedFilePath.add(execResultFile); + getActualImagePath(deletedFilePath, execResultFile); + } + }); + } + if (!CollectionUtils.isEmpty(deletedFilePath)) { + AssociatedFilesDto associatedFilesDto = new AssociatedFilesDto(); + associatedFilesDto.setObjId("-1"); + associatedFilesDto.setFileIds(deletedFilePath); + attachmentFeignClient.associatedFiles(associatedFilesDto); + } + planBatchApiService.updateByEntity(planBatch); + atuPlanInfoApiService.updateStatusByLastBatchId(planBatch.getId(), planStatus); + + logger.info("查询计划数据集中未被选择的意图数据"); + Set scriptIdSet = new HashSet<>(); + Map> envScriptMap = new HashMap<>(); + Map> envScriptTaskMap = new HashMap<>(); + List taskIdList = new ArrayList<>(); + for (AtuPlanTask planTask : planTaskList) { + taskIdList.add(planTask.getId()); + scriptIdSet.add(planTask.getScriptId()); + List scriptIdList = new ArrayList<>(); + if (envScriptMap.containsKey(planTask.getEnvId())) { + scriptIdList = envScriptMap.get(planTask.getEnvId()); + } + scriptIdList.add(planTask.getScriptId()); + envScriptMap.put(planTask.getEnvId(), scriptIdList); + String key = planTask.getEnvId() + "-" + planTask.getScriptId(); + List envScriptTaskList = new ArrayList<>(); + if (envScriptTaskMap.containsKey(key)) { + envScriptTaskList = envScriptTaskMap.get(key); + } + envScriptTaskList.add(planTask); + envScriptTaskMap.put(key, envScriptTaskList); + } + logger.debug("获取最新的输入项数据"); + Map taskParamsMap = getRetryTaskInputInfo(envScriptTaskMap, envScriptMap); + logger.debug("最新输入项数据大小:{}", taskParamsMap.size()); + + logger.debug("start 初始化批次缓存数据"); + taskRetryInitCache(taskIdList, planBatch); + logger.debug("end 初始化批次缓存数据"); + + logger.debug("查询脚本最新数据"); + logger.debug("脚本数量:{}", scriptIdSet.size()); + Map scriptMap = queryScriptDetailMap(scriptIdSet); + logger.debug("脚本最新信息数量:{}", scriptMap.size()); + + Map caseTypeMap = new HashMap<>(); + caseTypeMap.put("hasPc", false); + caseTypeMap.put("hasMob", false); + caseTypeMap.put("hasInterface", false); + for (AtuPlanTask planTask : planTaskList) { + String status = planTask.getStatus(); + logger.debug("原任务状态为: {}", status); + // 判断任务是否开始执行 + if (PlanConstant.TASK_WAIT_EXECUTE_STATUS.equals(planTask.getStatus()) || + PlanConstant.TASK_START_EXECUTE_STATUS.equals(planTask.getStatus())) { + throw new PlatformRuntimeException(ExecPlanError.TASK_NOT_FINISH); + } + logger.debug("修改任务脚本为最新脚本信息"); + if (scriptMap.containsKey(planTask.getScriptId())) { + AtuScriptDetailDto atuScriptDetailDto = scriptMap.get(planTask.getScriptId()); + planTask.setVersionId(atuScriptDetailDto.getVersionId()); + planTask.setVersionName(atuScriptDetailDto.getVersionName()); + planTask.setScriptName(atuScriptDetailDto.getScriptName()); + planTask.setScriptJson(atuScriptDetailDto.getScriptPath()); + planTask.setAppId(queryAppId(planInfo.getId(),atuScriptDetailDto.getPlatformType(), + atuScriptDetailDto.getAppPackage(),atuScriptDetailDto.getScriptType())); + } + + logger.debug("生成任务执行信息"); + AtuTaskExecDto taskExecDto = new AtuTaskExecDto(); + BeanUtil.copyProperties(planInfo, taskExecDto); + taskExecDto.setPlanId(planInfo.getId()); + taskExecDto.setFailRetryNum(planInfo.getFailRetryCount()); + taskExecDto.setBatchId(planTask.getBatchId()); + taskExecDto.setTaskId(planTask.getId()); + taskExecDto.setCaseId(planTask.getCaseId()); + taskExecDto.setEnvId(planTask.getEnvId()); + String type = planTask.getCaseType(); + taskExecDto.setCaseType(type); + String scriptPath = planTask.getScriptJson(); + + Map caseParams = new HashMap<>(); + if (taskParamsMap.containsKey(planTask.getId())) { + logger.debug("重试使用新数据"); + caseParams = JSONUtil.toBean(taskParamsMap.get(planTask.getId()), Map.class); + } else { + if (StrUtil.isNotBlank(planTask.getCaseParam())) { + logger.debug("使用旧数据重试"); + caseParams = JSONUtil.toBean(planTask.getCaseParam(), Map.class); + } + } + // 更新静态数据与模糊数据为最新值 + caseParams = this.handleQuoteData(caseParams, planTask.getEnvId(), planInfo.getProjectId()); + planTask.setCaseParam(JSONUtil.toJsonStr(caseParams)); + + String appId = planTask.getAppId(); + AtuSceneNodeExecDto sceneNodeExecDto = null; + + //判断是否场景任务 + if (PlanConstant.SCRIPT_TYPE_SCENE.equals(planTask.getCaseType())) { + // 调用脚本服务获取场景首节点信息,通知脚本服务场景重新发起 + logger.debug("查询场景脚本的首节点信息"); + SceneFirstNodeDto firstNodeDto = new SceneFirstNodeDto(); + firstNodeDto.setTaskId(planTask.getId()); + firstNodeDto.setCaseId(planTask.getCaseId()); + String scriptId = planTask.getScriptId(); + firstNodeDto.setScriptId(scriptId); + firstNodeDto.setParamMap(caseParams); + logger.debug("查询参数 => {}", JSONUtil.toJsonStr(firstNodeDto)); + AtuSceneNodeInfoDto nodeInfo; + try { + ResultWrapper firstNodeResult = publicFeignClient.getFirstNode(firstNodeDto); + if (firstNodeResult.isSuccess() && firstNodeResult.getData() != null) { + logger.debug("首节点信息为 => " + JSONUtil.toJsonStr(firstNodeResult)); + sceneNodeExecDto = firstNodeResult.getData(); + nodeInfo = sceneNodeExecDto.getNodeInfo(); + } else { + throw new RuntimeException("获取场景脚本[ " + scriptId + "]首节点信息异常," + firstNodeResult.getMessage()); + } + } catch (Exception e) { + logger.error("获取场景首节点信息异常", e); + throw new PlatformRuntimeException(ExecPlanError.GET_SCENE_FIRST_NODE_FAIL); + } + if (ObjectUtil.isNull(nodeInfo)) { + throw new PlatformRuntimeException(ExecPlanError.SCENE_FIRST_NODE_INFO_IS_NULL); + } + + String sceneTaskId = IdUtil.simpleUUID(); + taskExecDto.setTaskId(sceneTaskId); + scriptPath = nodeInfo.getScriptPath(); + caseParams = nodeInfo.getCaseParam(); + appId = queryAppId(taskExecDto.getPlanId(), nodeInfo.getPlatformType(), + nodeInfo.getAppPackage(), nodeInfo.getNodeType()); + type = nodeInfo.getNodeType(); + + logger.debug("清理原节点任务"); + AtuPlanSceneCaseTask deleteParams = new AtuPlanSceneCaseTask(); + deleteParams.setTaskId(planTask.getId()); + int rows = atuPlanSceneCaseTaskService.deleteByExample(deleteParams); + if (rows <= 0) { + logger.error("清理原场景节点任务失败"); + throw new PlatformRuntimeException(ExecPlanError.CLEAR_SCENE_NODE_TASK_FAIL); + } + logger.debug("插入新节点任务"); + AtuPlanSceneCaseTask planSceneCaseTask = new AtuPlanSceneCaseTask(); + planSceneCaseTask.setId(sceneTaskId); + planSceneCaseTask.setTaskId(planTask.getId()); + planSceneCaseTask.setScriptId(nodeInfo.getScriptId()); + planSceneCaseTask.setVersionId(nodeInfo.getVersionId()); + planSceneCaseTask.setVersionName(nodeInfo.getVersionName()); + planSceneCaseTask.setScriptName(nodeInfo.getScriptName()); + planSceneCaseTask.setScriptJson(nodeInfo.getScriptPath()); + planSceneCaseTask.setNodeId(nodeInfo.getNodeId()); + planSceneCaseTask.setNodeType(nodeInfo.getNodeType()); + if (CollUtil.isNotEmpty(nodeInfo.getCaseParam())) { + planSceneCaseTask.setNodeParams(JSONUtil.toJsonStr(nodeInfo.getCaseParam())); + } + planSceneCaseTask.setCreatedTime(new Date()); + planSceneCaseTask.setStatus(PlanConstant.TASK_WAIT_EXECUTE_STATUS); + planSceneCaseTask.setScriptJson(nodeInfo.getScriptPath()); + atuPlanSceneCaseTaskService.insert(planSceneCaseTask); + + } + taskExecDto.setScriptPath(scriptPath); + taskExecDto.setCaseParams(caseParams); + taskExecDto.setAppId(appId); + + logger.debug("修改原任务状态"); + planTask.setEngineId(""); + planTask.setDeviceId(""); + planTask.setAppId(""); + planTask.setStatus(PlanConstant.TASK_WAIT_EXECUTE_STATUS); + planTask.setStartTime(null); + planTask.setEndTime(null); + planTask.setErrorMsg(""); + planTask.setVideoUrl(""); + planTask.setExecResultFile(""); + planTask.setBugId(""); + if (sceneNodeExecDto != null && sceneNodeExecDto.getSceneScriptUrl() != null) { + planTask.setScriptJson(sceneNodeExecDto.getSceneScriptUrl()); + }else { + logger.info("首节点返回sceneScriptUrl为空" + sceneNodeExecDto); + } + int rows = atuPlanTaskService.updateByPrimaryKey(planTask); + if (rows <= 0) { + throw new PlatformRuntimeException(ExecPlanError.INIT_TASK_INFO_FAIL); + } + + logger.debug("发送任务执行信息至消息队列"); + sendToQueue(taskExecDto.getBatchId(), taskExecDto, type); + + atuPlanInfoApiService.handleAutoType(PlanConstant.SCRIPT_TYPE_SCENE, caseTypeMap); + } + + logger.debug("计划批次重新发起委托"); + atuPlanInfoApiService.handlePlanDevice(planInfo.getId(), planInfo.getPriority(), planBatch.getId(), + retryDto.getHasOfflineDevice(), caseTypeMap, true); + return true; + } + + @Override + public void getActualImagePath(List deletedFilePath, String execResultFile) { + InputStream inputStream = null; + try { + inputStream = simpleStorageService.downloadAsStream(NKSecurityContext.getTenantId(), execResultFile); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + List actualImgUriList = new ArrayList<>(); + String line = null; + while ((line = bufferedReader.readLine()) != null) { + StepExecuteResult stepExecuteResult = JSONUtil.toBean(line, StepExecuteResult.class); + String actualImgUri = stepExecuteResult.getActualImgUri(); + if (StringUtils.isNotBlank(actualImgUri)) { + actualImgUriList.add("/" + MinioPathUtils.idToPath(actualImgUri)[1]); + } + } + deletedFilePath.addAll(actualImgUriList); + } catch (FileDownloadException e) { + logger.error("文件下载异常", e); + } catch (IOException e) { + logger.error("文件流读取异常", e); + } + } + + @Override + public List queryExecTimeoutTask(int timeout) { + return atuPlanTaskService.queryExecTimeoutTask(timeout); + } + + @Override + public AtuPlanTaskExtendDto queryTaskExtendById(String taskId) { + return atuPlanTaskService.queryTaskExtendById(taskId); + } + + @Override + public List queryWaitTimeoutTask(Integer waitTimeout) { + + return atuPlanTaskService.queryWaitTimeoutTask(waitTimeout); + } + + private Map getRetryTaskInputInfo(Map> envScriptTaskMap, + Map> envScriptMap) { + Map taskParamsMap = new HashMap<>(); + List inputDataList = new ArrayList<>(); + try { + ResultWrapper> queryResult = scriptCaseFeignClient.queryInputByEnvIdAndScriptIdMap(envScriptMap); + if (queryResult != null && queryResult.isSuccess()) { + if (CollUtil.isEmpty(queryResult.getData())) { + logger.debug("从脚本服务获取输入项数据为空"); + throw new PlatformRuntimeException(ExecPlanError.SCRIPT_INPUT_DATA_IS_NULL); + } + inputDataList = queryResult.getData(); + } + } catch (Exception e) { + logger.error("查询脚本输入项数据异常", e); + throw new PlatformRuntimeException(ExecPlanError.QUERY_SCRIPT_INPUT_IS_NULL); + } + logger.info("脚本输入项数量:" + inputDataList.size()); + if (CollUtil.isEmpty(inputDataList)) { + logger.debug("获取输入项数据异常"); + throw new PlatformRuntimeException(ExecPlanError.SCRIPT_INPUT_DATA_IS_NULL); + } + Map envScriptInputMap = new HashMap<>(); + for (AtuPlanInputDto inputDto : inputDataList) { + envScriptInputMap.put(inputDto.getEnvId() + "-" + inputDto.getScriptId(), inputDto); + } + + envScriptTaskMap.forEach((envScriptId, taskList) -> { + if (envScriptInputMap.containsKey(envScriptId)) { + AtuPlanInputDto atuPlanInputDto = envScriptInputMap.get(envScriptId); + String[] resultPath = MinioPathUtils.idToPath(atuPlanInputDto.getDataUrl()); + InputStream inputStream = null; + List> dataList; + try { + inputStream = simpleStorageService.downloadAsStream(resultPath[0], "/" + resultPath[1]); + ScriptInputFileDto fileData = MinioPathUtils.getFileContent(inputStream, ScriptInputFileDto.class); + //获取数据 + dataList = fileData.getTableContent(); + + } catch (FileDownloadException e) { + logger.error("读取环境[{}]脚本[{}]输入项文件失败,文件地址:{}", + atuPlanInputDto.getEnvId(), atuPlanInputDto.getScriptId(), atuPlanInputDto.getDataUrl()); + logger.error("失败原因:", e); + throw new PlatformRuntimeException(ExecPlanError.QUERY_SCRIPT_INPUT_ERROR, envNameUtils.getEnvName(atuPlanInputDto.getEnvId()), + taskList.get(0).getScriptName(), e.getMessage()); + } finally { + if (null != inputStream) { + try { + inputStream.close(); + } catch (IOException e) { + logger.error("", e); + } + } + } + if (CollUtil.isEmpty(dataList)) { + logger.debug("该用例集无用例数据"); + throw new PlatformRuntimeException(ExecPlanError.SCRIPT_INPUT_NOT_DATA); + } + for (AtuPlanTask planTask : taskList) { + String params = ""; + for (Map dataMap : dataList) { + if (dataMap.get(PlanConstant.SCRIPT_TEST_PURPOSE_ID).equals(planTask.getCaseId())) { + params = JSONUtil.toJsonStr(dataMap); + } + } + if (StrUtil.isBlank(params)) { + throw new PlatformRuntimeException(ExecPlanError.SCRIPT_INPUT_DELETED); + } + taskParamsMap.put(planTask.getId(), params); + } + } else { + logger.error("脚本[{}]在环境[{}]下的输入项数据已被删除", + envScriptId.split("-")[1], + envScriptId.split("-")[0]); + } + }); + return taskParamsMap; + } + + /** + * 任务重试初始化缓存 + * + * @param taskIdList 重试任务id + * @param planBatch 重试任务批次信息 + */ + private void taskRetryInitCache(List taskIdList, AtuPlanBatch planBatch) { + AtuPlanTask queryParams = new AtuPlanTask(); + queryParams.setBatchId(planBatch.getId()); + List batchTaskList = this.atuPlanTaskService.query(queryParams); + logger.debug("查询批次下的所有任务:{}", batchTaskList.size()); + // 重试的任务信息 + List retryTaskList = batchTaskList.stream() + .filter(task -> taskIdList.contains(task.getId())) + .collect(Collectors.toList()); + logger.debug("重试的任务:{}", retryTaskList.size()); + + // 获取重试的脚本id集合 + Set scriptIdSet = retryTaskList.stream().map(AtuPlanTask::getScriptId).collect(Collectors.toSet()); + logger.debug("重试的脚本:{}", scriptIdSet.size()); + // 需要重试的脚本,以及该脚本下的所有任务 + Map> scriptTaskMap = batchTaskList.stream() + .filter(task -> scriptIdSet.contains(task.getScriptId())) + .collect(Collectors.groupingBy(AtuPlanTask::getScriptId)); + + String clusterKeyPrefix = RedisConstant.CLUSTER_KEY_PREFIX + planBatch.getId().substring(0, 4) + + RedisConstant.CLUSTER_KEY_SUFFIX; + for (String scriptId : scriptIdSet) { + // 查询脚本下的所有任务,重试和未选择重试的 + List allScriptTaskList = scriptTaskMap.get(scriptId); + Set taskStatusSet = allScriptTaskList.stream().map(AtuPlanTask::getStatus).collect(Collectors.toSet()); + // 获取任务的统计状态 + String allTaskStatus = coverScriptStatus(taskStatusSet); + // 排除重试的任务 + List notRetryTaskList = new ArrayList<>(); + List scriptRetryTaskList = new ArrayList<>(); + for (AtuPlanTask atuPlanTask : allScriptTaskList) { + if (taskIdList.contains(atuPlanTask.getId())) { + scriptRetryTaskList.add(atuPlanTask); + } else { + notRetryTaskList.add(atuPlanTask); + } + } + + for (AtuPlanTask atuPlanTask : scriptRetryTaskList) { + String taskId = atuPlanTask.getId(); + redisTemplate.opsForHash().put(clusterKeyPrefix + RedisConstant.BATCH_SCRIPT_TASK_KEY + + planBatch.getId() + ":" + scriptId, clusterKeyPrefix + taskId, taskId); + } + if (CollUtil.isEmpty(notRetryTaskList)) { + logger.debug("该脚本的任务全部重试"); + // allTaskStatus状态数据-1,增加脚本任务关联scriptRetryTaskList,脚本状态设置为等待中 + initBatchSumCache(planBatch, allTaskStatus, scriptId, PlanConstant.TASK_WAIT_EXECUTE_STATUS, + true, clusterKeyPrefix); + } else { + logger.debug("该脚本的任务部分重试"); + // 获取剩余任务的状态 + Set notRetryTaskStatusSet = notRetryTaskList.stream().map(AtuPlanTask::getStatus).collect(Collectors.toSet()); + String remainTaskStatus = coverScriptStatus(notRetryTaskStatusSet); + + // allTaskStatus状态数据-1,增加脚本任务关联scriptRetryTaskList,脚本状态设置为remainTaskStatus + initBatchSumCache(planBatch, allTaskStatus, scriptId, remainTaskStatus, false, clusterKeyPrefix); + } + + } + } + + /** + * 初始化批次统计缓存数据 + * + * @param planBatch 批次信息 + * @param status 统计数量-1的状态 + * @param scriptId 脚本id + * @param scriptStatus 批次脚本状态 + */ + private void initBatchSumCache(AtuPlanBatch planBatch, String status, String scriptId, String scriptStatus, + boolean isAll, String clusterKeyPrefix) { + logger.debug("重试加载批次脚本统计缓存"); + List scriptKeys = new ArrayList<>(); + scriptKeys.add(clusterKeyPrefix + RedisConstant.BATCH_SCRIPT_SUM_KEY + planBatch.getId()); + scriptKeys.add(clusterKeyPrefix + PlanConstant.PLAN_BATCH_NUM); + scriptKeys.add(clusterKeyPrefix + PlanConstant.BATCH_START_TIME); + scriptKeys.add(clusterKeyPrefix + PlanConstant.SCRIPT_TOTAL); + scriptKeys.add(clusterKeyPrefix + PlanConstant.TASK_WAIT_EXECUTE_STATUS); + scriptKeys.add(clusterKeyPrefix + PlanConstant.TASK_START_EXECUTE_STATUS); + scriptKeys.add(clusterKeyPrefix + PlanConstant.TASK_EXECUTE_SUCCESS_STATUS); + scriptKeys.add(clusterKeyPrefix + PlanConstant.TASK_EXECUTE_FAIL_STATUS); + scriptKeys.add(clusterKeyPrefix + PlanConstant.TASK_ASSERT_FAIL_STATUS); + scriptKeys.add(clusterKeyPrefix + PlanConstant.TASK_CANCEL_STATUS); + scriptKeys.add(clusterKeyPrefix + PlanConstant.TASK_TIMEOUT_STATUS); + scriptKeys.add(clusterKeyPrefix + status); + String scriptStatusKey = clusterKeyPrefix + RedisConstant.BATCH_SCRIPT_STATUS_KEY + planBatch.getId(); + scriptKeys.add(scriptStatusKey); + scriptKeys.add(clusterKeyPrefix + scriptId); + + long startTime = planBatch.getStartTime().getTime(); + if (isAll) { + startTime = 0; + } + redisTemplate.execute(TASK_RETRY_INIT_SCRIPT, scriptKeys, planBatch.getBatch(), + startTime, planBatch.getScriptNum(), planBatch.getSuccessNum(), planBatch.getExecFailNum(), + planBatch.getAssertFailNum(), planBatch.getCancelNum(), planBatch.getTimeoutNum(), Integer.parseInt(scriptStatus)); + } + + /** + * 脚本任务状态转换 + * + * @param taskStatusSet 任务状态集合 + * @return 结果 + */ + private String coverScriptStatus(Set taskStatusSet) { + List taskStatusList = new ArrayList<>(taskStatusSet); + if (CollUtil.isEmpty(taskStatusList)) { + throw new RuntimeException("任务状态数据异常"); + } + String status = taskStatusList.get(0); + logger.debug("任务状态:{}", status); + if (taskStatusSet.contains(PlanConstant.TASK_CANCEL_STATUS)) { + status = PlanConstant.TASK_CANCEL_STATUS; + } + if (taskStatusSet.contains(PlanConstant.TASK_TIMEOUT_STATUS)) { + status = PlanConstant.TASK_TIMEOUT_STATUS; + } + if (taskStatusSet.contains(PlanConstant.TASK_EXECUTE_FAIL_STATUS)) { + status = PlanConstant.TASK_EXECUTE_FAIL_STATUS; + } + logger.debug("转换后的状态:{}", status); + return status; + } + + @Override + public String queryEnvIdByBatchId(String batchId) { + return this.atuPlanTaskService.queryEnvIdByBatchId(batchId); + } + + @Override + public List queryAppIdListByBatchId(String batchId) { + return this.atuPlanTaskService.queryAppIdListByBatchId(batchId); + } + + @Override + public int deleteByPlanIdLimit(String planId, int num) { + return this.atuPlanTaskService.deleteByPlanIdLimit(planId, num); + } + + @Override + public int countByPlanId(String planId) { + return this.atuPlanTaskService.countByPlanId(planId); + } + + @Override + public AtuTaskSendBugDto querySendBugTaskInfo(String taskId) { + AtuTaskSendBugDto atuTaskSendBugDto = this.atuPlanTaskService.querySendBugTaskInfo(taskId); + if (atuTaskSendBugDto != null) { + Object resultCode = redisTemplate.opsForValue().get("UITEST-ScriptCode:" + atuTaskSendBugDto.getScriptId()); + if (resultCode != null && !resultCode.equals("")) { + atuTaskSendBugDto.setScriptCode(resultCode.toString()); + } + } + return atuTaskSendBugDto; + } + + + /** + * 通知引擎取消批次 + * + * @param batchId 批次ID + */ + private void noticeEngineRemoveBatch(String batchId) { + logger.debug("查询批次绑定的设备信息"); + AtuPlanBatchDeviceLink batchDeviceLink = new AtuPlanBatchDeviceLink(); + batchDeviceLink.setBatchId(batchId); + List batchDeviceLinks = atuPlanBatchDeviceLinkService.query(batchDeviceLink); + logger.debug("批次绑定的设备数量为:{}", batchDeviceLinks.size()); + if (CollUtil.isNotEmpty(batchDeviceLinks)) { + List deviceTypeList = new ArrayList<>(); + + List pcDeviceIdList = new ArrayList<>(); + List mobDeviceIdList = new ArrayList<>(); + for (AtuPlanBatchDeviceLink deviceLink : batchDeviceLinks) { + + if (ObjectUtil.equal(PlanConstant.ENGINE_TYPE_PC, deviceLink.getDeviceType())) { + pcDeviceIdList.add(deviceLink.getDeviceId()); + } else { + mobDeviceIdList.add(deviceLink.getDeviceId()); + } + } + if (CollUtil.isNotEmpty(pcDeviceIdList)) { + DeviceListDto deviceListDto = new DeviceListDto(); + deviceListDto.setType(PlanConstant.ENGINE_TYPE_PC); + deviceListDto.setDeviceList(pcDeviceIdList); + deviceTypeList.add(deviceListDto); + } + if (CollUtil.isNotEmpty(mobDeviceIdList)) { + DeviceListDto deviceListDto = new DeviceListDto(); + deviceListDto.setType(PlanConstant.ENGINE_TYPE_MOBILE); + deviceListDto.setDeviceList(mobDeviceIdList); + deviceTypeList.add(deviceListDto); + } + logger.debug("根据设备获取引擎信息"); + logger.debug("设备信息 => {}", JSONUtil.toJsonStr(deviceTypeList)); + List engineInfoList = new ArrayList<>(); + try { + engineInfoList = publicFeignClient.queryEngineByType(deviceTypeList); + } catch (Exception e) { + logger.error("获取引擎信息异常", e); + } + if (CollUtil.isEmpty(engineInfoList)) { + logger.error("引擎信息不存在"); + } + try { + logger.debug("发送终止任务信息至引擎"); + for (EngineInfoListDto engineInfoListDto : engineInfoList) { + for (Map engineInfoMap : engineInfoListDto.getEngineInfoList()) { + String ip = engineInfoMap.get("ip"); + String port = engineInfoMap.get("port"); + String url = "http://" + ip + ":" + port + PlanConstant.PLAN_BATCH_CANCEL_URL; + //String url = "http://192.168.77.71:6001" + PlanConstant.PLAN_BATCH_CANCEL_URL; + logger.info("引擎批次取消地址 => " + url); + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity requestEntity = new HttpEntity<>(batchId, headers); + try { + ResponseEntity response = restTemplate.postForEntity(url, requestEntity, String.class); + logger.info("引擎批次取消结果 => " + JSONUtil.toJsonStr(response.getBody())); + } catch (Exception e) { + logger.error("引擎[" + ip + ":" + port + "]批次取消失败", e); + } + + } + } + } catch (Exception e) { + logger.error("发送取消委托失败", e); + } + } + } + + /** + * 处理引用数据 + * + * @param caseParamMap 需要处理的参数集合 + * @param envId 环境id + * @param projectId 系统id + * @return 处理结果 + */ + public Map handleQuoteData(Map caseParamMap, String envId, String projectId) { + if (CollUtil.isEmpty(caseParamMap)) { + return caseParamMap; + } + for (String key : caseParamMap.keySet()) { + try { + if (caseParamMap.get(key) instanceof Map) { + QuoteData quoteData = BeanUtil.toBean(caseParamMap.get(key), QuoteData.class); + if (quoteData == null) { + continue; + } + String quoteValue = null; + if (quoteData.getType().equals(PlanConstant.INPUT_SET_QUOTE_TYPE_FUZZY)) { + logger.debug("查询模糊数据"); + ResultWrapper bodyResult = publicFeignClient.getRuleDataByName(quoteData.getColumn(), projectId); + if (bodyResult != null && bodyResult.isSuccess()) { + quoteValue = bodyResult.getData(); + } + } else { + logger.debug("查询静态数据"); + quoteData.setEnvId(envId); + QuoteData bodyResult = publicFeignClient.selectDataUrlAndTreeName(quoteData); + if (bodyResult != null) { + quoteValue = bodyResult.getValue(); + } + } + if (null != quoteValue) { + caseParamMap.put(key, quoteValue); + } + } + } catch (Exception e) { + logger.error("获取引用数据失败", e); + } + } + return caseParamMap; + } + + @Override + public List getFirstExecuteInfo(List scriptIds) { + return atuPlanTaskService.getFirstExecuteInfo(scriptIds); + } + @Override + public ScriptFirstExecutionDTO getFirstExecuteInfo(String scriptIds) { + return atuPlanTaskService.getFirstExecuteInfo(scriptIds); + } + + @Override + public Integer getScriptExecuteSuccessNum(String scriptId, String planId, LocalDate now) { + return atuPlanTaskService.getScriptExecuteSuccessNum(scriptId, planId, now); + } + + @Override + public List getTasksByPlanId(String planId) { + return this.atuPlanTaskService.getTasksByPlanId(planId); + } + + @Override + public List getTaskIdsByScriptIdsAndPlanId(List oldScriptIds, String planId) { + return this.atuPlanTaskService.getTaskIdsByScriptIdsAndPlanId(oldScriptIds, planId); + } + + /** + * 处理分页查询参数 + * + * @param query + */ + private void handlePageParam(QueryByPage query) { + if (query.getPageNo() <= 0) { + query.setPageNo(1); + } + if (query.getPageSize() <= 0 || query.getPageSize() > 500) { + query.setPageSize(500); + } + OrderBy sort = query.toSqlOrderBy(); + if (sort != null && sort.isNotEmpty() && org.springframework.util.StringUtils.hasText(sort.toString())) { + PageMethod.orderBy(sort.toString()); + } + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MessageCenterService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MessageCenterService.java new file mode 100644 index 0000000..6bcd9b7 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MessageCenterService.java @@ -0,0 +1,8 @@ +package net.northking.cctp.executePlan.api.service; + +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchDetailDto; + +public interface MessageCenterService { + void sendMessage(AtuPlanInfo atuPlanInfo, AtuPlanBatchDetailDto atuPlanBatch) ; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MessageCenterServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MessageCenterServiceImpl.java new file mode 100644 index 0000000..4d367be --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MessageCenterServiceImpl.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. + * + */ +package net.northking.cctp.executePlan.api.service; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.constants.BaseDefineDependencyConstants; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.entity.Message; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.enums.MessageScopeEnum; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.enums.MessageTypeEnum; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import net.northking.cctp.common.cache.EntityNameCache; +import net.northking.cctp.common.cache.EntityNameCatalog; +import net.northking.cctp.executePlan.api.third.feilang.service.FeiLangServiceImpl; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatch; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.db.service.AtuPlanBatchService; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchDetailDto; +import net.northking.cctp.executePlan.feign.ApiCommonCenterService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 第三方飞狼系统交互类 + * + * @author yujinfa + * @since 1.0 + */ + +@Service +public class MessageCenterServiceImpl implements MessageCenterService { + + @Autowired + EntityNameCache entityNameCache; + + @Autowired + ApiCommonCenterService commonCenterService; + + @Autowired + private AtuPlanBatchService atuPlanBatchService; + + private final static Logger logger = LoggerFactory.getLogger(FeiLangServiceImpl.class); + + @Override + public void sendMessage(AtuPlanInfo atuPlanInfo, AtuPlanBatchDetailDto atuPlanBatch) { + logger.info("开始处理发送消息中心..."); + + String executedByName = entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, atuPlanBatch.getExecutedBy()) == null ? + "" : entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, atuPlanBatch.getExecutedBy()); + + //批次执行状态 0-等待中,1-执行中,2-已完成,3-已取消 + //计划执行状态 0-新建,1-等待中,2-执行中,3-已完成,4-已取消 + String tempStatusStr = atuPlanInfo.getStatus(); + String tempStatusCHN = ""; + // 判断计划状态 + if (tempStatusStr.equals(PlanConstant.PLAN_CANCEL_STATUS)) { + tempStatusCHN = "已取消"; + } else { + //根据batchId查询脚本信息 + AtuPlanBatch tempResultAtuPlanBatch = this.atuPlanBatchService.findByPrimaryKey(atuPlanBatch.getId()); + if (tempResultAtuPlanBatch.getScriptNum() != null + && tempResultAtuPlanBatch.getSuccessNum() != null + && tempResultAtuPlanBatch.getScriptNum().equals(tempResultAtuPlanBatch.getSuccessNum())) { + tempStatusCHN = "执行成功"; + } else { + tempStatusCHN = "执行失败"; + } + } + + try { + String title = "执行计划执行结束"; + String planName = atuPlanInfo.getPlanName(); + // 避免脚本注入 + if(planName.contains("<")){ + planName.replaceAll("<","<"); + } + if(planName.contains(">")){ + planName.replaceAll(">",">"); + } + + Message message = new Message(); + message.setScope(MessageScopeEnum.PERSONAL.getValue()); + message.setUserId(Long.valueOf(atuPlanBatch.getExecutedBy())); + message.setTitle(title); + Map dataMap = new HashMap<>(); + dataMap.put("uniqueField", "planId"); + + String path = "/UiTest/taskPlanExeRecord"; + dataMap.put("path", path); + dataMap.put("title", "查询执行记录-" + atuPlanInfo.getPlanName()); + dataMap.put("planId", atuPlanInfo.getId()); + dataMap.put("projectId", atuPlanInfo.getProjectId()); + dataMap.put("enabled", true); + dataMap.put("planName", atuPlanInfo.getPlanName()); + dataMap.put("methodToSetProject", "view"); + + message.setContent("执行计划【" + planName + "】 " + tempStatusCHN + + ",类型【UI】" + + ",系统【" + entityNameCache.translateById(EntityNameCatalog.MONSTER_SYSTEM, atuPlanInfo.getProjectId()) + "】" + + ",执行人【" + executedByName +"】," + + "点击此处查看执行报告。"); + + message.setType(MessageTypeEnum.MESSAGE.getValue()); + message.setCreateTime(new Date()); + logger.info("发送消息中心内容为:" + message); + ResponseVO responseVO = commonCenterService.sendMessage(message); + if (!responseVO.getCode().equals(BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS)) { + logger.error(responseVO.getCode() + ":" + responseVO.getMessage()); + } + } catch (Exception e) { + logger.error("发送执行计划结果消息失败,计划报告id{},错误原因{}:", atuPlanInfo.getId(), e.toString()); + } + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MqSynchronizeTaskApiService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MqSynchronizeTaskApiService.java new file mode 100644 index 0000000..4af27e2 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MqSynchronizeTaskApiService.java @@ -0,0 +1,11 @@ +package net.northking.cctp.executePlan.api.service; + +import net.northking.cctp.executePlan.db.entity.MqSynchronizeTask; + +import java.util.List; + +public interface MqSynchronizeTaskApiService { + List findByTypes(List singletonList); + + Integer deleteBatch(List ids); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MqSynchronizeTaskApiServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MqSynchronizeTaskApiServiceImpl.java new file mode 100644 index 0000000..e239358 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/MqSynchronizeTaskApiServiceImpl.java @@ -0,0 +1,24 @@ +package net.northking.cctp.executePlan.api.service; + +import net.northking.cctp.executePlan.db.entity.MqSynchronizeTask; +import net.northking.cctp.executePlan.db.service.MqSynchronizeTaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class MqSynchronizeTaskApiServiceImpl implements MqSynchronizeTaskApiService{ + @Autowired + private MqSynchronizeTaskService mqSynchronizeTaskService; + @Override + public List findByTypes(List singletonList) { + return mqSynchronizeTaskService.findByTypes(singletonList); + } + + @Override + public Integer deleteBatch(List ids) { + return this.mqSynchronizeTaskService.deleteByPrimaryKeys(ids); + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/common/ResponseEntity.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/common/ResponseEntity.java new file mode 100644 index 0000000..910a4eb --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/common/ResponseEntity.java @@ -0,0 +1,39 @@ +package net.northking.cctp.executePlan.api.third.common; + +import java.io.Serializable; + +public class ResponseEntity implements Serializable { + private String code; + private String message; + private Object data; + + public ResponseEntity(String code, String message, Object data) { + this.code = code; + this.message = message; + this.data = data; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/common/ThirdConstant.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/common/ThirdConstant.java new file mode 100644 index 0000000..ba2ef51 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/common/ThirdConstant.java @@ -0,0 +1,14 @@ +package net.northking.cctp.executePlan.api.third.common; + +public final class ThirdConstant { + //Monster-common发送平台 to mc + public static final String PLATFORM_SEND_TO_MC = "0" ; + //Monster-common发送平台 to PICUS + public static final String PLATFORM_SEND_TO_PICUS = "1" ; + //Monster-common发送平台 to ats + public static final String PLATFORM_SEND_TO_ATS = "2" ; + //Monster-common发送平台 to ui + public static final String PLATFORM_SEND_TO_UI = "3" ; + //Monster-common发送平台 to cc + public static final String PLATFORM_SEND_TO_CC = "4" ; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/DevopsPubCtrl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/DevopsPubCtrl.java new file mode 100644 index 0000000..d8a118f --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/DevopsPubCtrl.java @@ -0,0 +1,122 @@ +package net.northking.cctp.executePlan.api.third.devops; + +import cn.hutool.json.JSONUtil; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.executePlan.api.third.common.ResponseEntity; +import net.northking.cctp.executePlan.api.third.devops.dto.DevopsDoExecplanParamDto; +import net.northking.cctp.executePlan.api.third.devops.dto.DevopsExecplanInfoResultDto; +import net.northking.cctp.executePlan.api.third.devops.dto.DevopsProExecplanInfoDto; +import net.northking.cctp.executePlan.api.third.devops.service.DevopsService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +/** + *

Title:

+ *

Description:

+ * + * @Author yujinfa + * @Version V1.0 + * @Date + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +@RequestMapping("/pub") +@RestController +public class DevopsPubCtrl { + + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DevopsPubCtrl.class); + + @Autowired + private DevopsService devopsService; + + @ApiOperation(value = "获取系统下执行计划集合") + @PostMapping(value = "/execplan/getExecplanListByProjectId", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity getExecplanListByProjectId( + @RequestBody DevopsDoExecplanParamDto doExecplanParamDto) + { + logger.info("start projectIds: params =======> " + JSONUtil.toJsonStr(doExecplanParamDto.getProjectIds())); + //校验数据 + List projectList = new ArrayList<>(1); + if (Objects.isNull(doExecplanParamDto.getProjectIds()) || "".equals(doExecplanParamDto.getProjectIds())) { + return new ResponseEntity("200","请求参数为空",null); + } else { + if (doExecplanParamDto.getProjectIds().contains(",")) { + projectList = Arrays.asList(doExecplanParamDto.getProjectIds().split(",")); + } else { + projectList.add(doExecplanParamDto.getProjectIds()); + } + } + List result = new ArrayList<>(); + try { + result = devopsService.getExecplanListByProjectId(projectList); + }catch (Exception e){ + logger.info("获取系统下执行计划集合接口 异常信息"+e.getMessage()); + return new ResponseEntity("500","自动化测试平台查询异常!"+e.getMessage(),null); + } + logger.info("end projectIds"+result.toString()); + return new ResponseEntity("200","查询成功!",result); + } + + @ApiOperation(value = "Devops调用入口") + @PostMapping(value = "/execplan/doExecplanByThirdPlatforn", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity doExecplanByThirdPlatforn( + @RequestBody DevopsDoExecplanParamDto doExecplanParamDto) + { + logger.info("start projectIds: params =======> " + JSONUtil.toJsonStr(doExecplanParamDto)); + //校验数据 + if(Objects.isNull(doExecplanParamDto) + ||Objects.isNull(doExecplanParamDto.getExecplanId()) + ||Objects.isNull(doExecplanParamDto.getChannel()) + ||Objects.isNull(doExecplanParamDto.getDevopsExecUuid()) + ||Objects.isNull(doExecplanParamDto.getExecMan())){ + logger.info("调用时间"+new Date().toString()+"Devops调用参数为空,执行失败"); + return new ResponseEntity("200","Devops调用传参错误",null); + } + try { + devopsService.doExecplanByThirdPlatforn(doExecplanParamDto); + }catch (Exception e){ + logger.info("Devops调用入口接口 异常信息"+e.getMessage()); + return new ResponseEntity("500","测试平台调用异常!"+e.getMessage(),null); + } + logger.info("调用成功!"); + return new ResponseEntity("200","正在执行中...",null); + } + + + @ApiOperation(value = "获取本次执行计划详情") + @PostMapping(value = "/execplan/getExecplanResultInfo", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity getExecplanResultInfo( + @RequestBody DevopsDoExecplanParamDto doExecplanParamDto) + { + logger.info("start doExecplanParamDto: params =======> " + JSONUtil.toJsonStr(doExecplanParamDto)); + //校验数据 + if(Objects.isNull(doExecplanParamDto)||Objects.isNull(doExecplanParamDto.getDevopsExecUuid())){ + logger.info("调用时间"+new Date().toString()+"Devops查询参数为空"); + return new ResponseEntity("200","Devops调用传参错误",null); + } + DevopsExecplanInfoResultDto devopsExecplanInfoResultDto; + try { + devopsExecplanInfoResultDto = devopsService.getExecplanResultInfo(doExecplanParamDto); + }catch (Exception e){ + logger.info("获取本次执行计划详情接口 异常信息"+e.getMessage()); + return new ResponseEntity("500","测试平台调用异常!"+e.getMessage(),null); + } + logger.info("调用成功!"+ JSONUtil.toJsonStr(devopsExecplanInfoResultDto) ); + return new ResponseEntity("200","测试平台调用成功!",devopsExecplanInfoResultDto); + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsCaseInfoDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsCaseInfoDto.java new file mode 100644 index 0000000..92c2b91 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsCaseInfoDto.java @@ -0,0 +1,68 @@ +package net.northking.cctp.executePlan.api.third.devops.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.io.Serializable; +@JsonSerialize +public class DevopsCaseInfoDto implements Serializable { + //用例编号 + private String caseNo; + //用例名称 + private String caseName; + //用例类型 + private String caseType; + //case执行状态 + private String caseResult; + //脚本主键 + private String scriptId; + //脚本名称 + private String scriptName; + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public String getCaseNo() { + return caseNo; + } + + public void setCaseNo(String caseNo) { + this.caseNo = caseNo; + } + + public String getCaseName() { + return caseName; + } + + public void setCaseName(String caseName) { + this.caseName = caseName; + } + + public String getCaseType() { + return caseType; + } + + public void setCaseType(String caseType) { + this.caseType = caseType; + } + + public String getCaseResult() { + return caseResult; + } + + public void setCaseResult(String caseResult) { + this.caseResult = caseResult; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsDoExecplanParamDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsDoExecplanParamDto.java new file mode 100644 index 0000000..f397fc5 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsDoExecplanParamDto.java @@ -0,0 +1,66 @@ +package net.northking.cctp.executePlan.api.third.devops.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +@JsonSerialize +public class DevopsDoExecplanParamDto implements Serializable { + //系统id + private String projectIds; + + //执行计划id + private String execplanId; + + //执行人 + @NotBlank(message = "执行人不能为空") + @Length(max = 32,message = "执行人长度不能超过32位") + private String execMan; + + //渠道来源 + private String channel; + + //第三方请求执行唯一id + private String devopsExecUuid; + + public String getExecplanId() { + return execplanId; + } + + public void setExecplanId(String execplanId) { + this.execplanId = execplanId; + } + + public String getExecMan() { + return execMan; + } + + public void setExecMan(String execMan) { + this.execMan = execMan; + } + + public String getChannel() { + return channel; + } + + public void setChannel(String channel) { + this.channel = channel; + } + + public String getDevopsExecUuid() { + return devopsExecUuid; + } + + public void setDevopsExecUuid(String devopsExecUuid) { + this.devopsExecUuid = devopsExecUuid; + } + + public String getProjectIds() { + return projectIds; + } + + public void setProjectIds(String projectIds) { + this.projectIds = projectIds; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsExecplanInfoResultDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsExecplanInfoResultDto.java new file mode 100644 index 0000000..d875606 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsExecplanInfoResultDto.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. + * + */ +package net.northking.cctp.executePlan.api.third.devops.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.io.Serializable; +import java.util.List; + +/** + * + * createdate: 2022-12-06 11:32:04
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@JsonSerialize +public class DevopsExecplanInfoResultDto implements Serializable +{ + /** + * 执行计划id + */ + private String planId; + /** + * 执行计划名称 + */ + private String planName; + /** + * 执行状态 + */ + private String execState; + /** + * 执行时间 + */ + private String execTime; + /** + * 用例总数 + */ + private Integer tasktotal; + /** + * 成功个数 + */ + private Integer successNum; + /** + * 失败个数 + */ + private Integer failNum; + /** + * 断言失败个数 + */ + private Integer assertFailNum; + /** + * 取消个数 + */ + private Integer cancelNum; + /** + * 超时个数 + */ + private Integer timeoutNum; + + /** + * case信息集合 + */ + private List caseList; + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getExecState() { + return execState; + } + + public void setExecState(String execState) { + this.execState = execState; + } + + public String getExecTime() { + return execTime; + } + + public void setExecTime(String execTime) { + this.execTime = execTime; + } + + public Integer getTasktotal() { + return tasktotal; + } + + public void setTasktotal(Integer tasktotal) { + this.tasktotal = tasktotal; + } + + public Integer getSuccessNum() { + return successNum; + } + + public void setSuccessNum(Integer successNum) { + this.successNum = successNum; + } + + public Integer getFailNum() { + return failNum; + } + + public void setFailNum(Integer failNum) { + this.failNum = failNum; + } + + public Integer getAssertFailNum() { + return assertFailNum; + } + + public void setAssertFailNum(Integer assertFailNum) { + this.assertFailNum = assertFailNum; + } + + public Integer getCancelNum() { + return cancelNum; + } + + public void setCancelNum(Integer cancelNum) { + this.cancelNum = cancelNum; + } + + public Integer getTimeoutNum() { + return timeoutNum; + } + + public void setTimeoutNum(Integer timeoutNum) { + this.timeoutNum = timeoutNum; + } + + public List getCaseList() { + return caseList; + } + + public void setCaseList(List caseList) { + this.caseList = caseList; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsProExecplanInfoDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsProExecplanInfoDto.java new file mode 100644 index 0000000..b446b57 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/dto/DevopsProExecplanInfoDto.java @@ -0,0 +1,57 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api.third.devops.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.io.Serializable; +import java.util.List; + +/** +* +* createdate: 2022-12-06 11:32:04
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +public class DevopsProExecplanInfoDto implements Serializable +{ + /** + * 系统id + */ + private String projectId; + /** + * 系统名 + */ + private String projectName; + /** + * 执行计划信息
+ */ + private List execplanList; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public List getExecplanList() { + return execplanList; + } + + public void setExecplanList(List execplanList) { + this.execplanList = execplanList; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/service/DevopsService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/service/DevopsService.java new file mode 100644 index 0000000..ffc8f22 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/service/DevopsService.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. + * + */ +package net.northking.cctp.executePlan.api.third.devops.service; + +import net.northking.cctp.executePlan.api.third.devops.dto.DevopsExecplanInfoResultDto; +import net.northking.cctp.executePlan.api.third.devops.dto.DevopsProExecplanInfoDto; +import net.northking.cctp.executePlan.api.third.devops.dto.DevopsDoExecplanParamDto; + +import java.util.List; + +/** + * @author maven-cctp-plugin + * @since 1.0 + */ +public interface DevopsService +{ + List getExecplanListByProjectId(List productIdList); + + void doExecplanByThirdPlatforn(DevopsDoExecplanParamDto doExecplanParamDto); + + DevopsExecplanInfoResultDto getExecplanResultInfo(DevopsDoExecplanParamDto doExecplanParamDto); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/service/DevopsServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/service/DevopsServiceImpl.java new file mode 100644 index 0000000..8f01dde --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/devops/service/DevopsServiceImpl.java @@ -0,0 +1,158 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.api.third.devops.service; + +import cn.hutool.json.JSONUtil; +import net.northking.cctp.common.cache.EntityNameCache; +import net.northking.cctp.common.cache.EntityNameCatalog; +import net.northking.cctp.common.util.DateUtil; +import net.northking.cctp.executePlan.api.service.AtuPlanInfoApiService; +import net.northking.cctp.executePlan.api.third.devops.dto.DevopsCaseInfoDto; +import net.northking.cctp.executePlan.api.third.devops.dto.DevopsDoExecplanParamDto; +import net.northking.cctp.executePlan.api.third.devops.dto.DevopsExecplanInfoResultDto; +import net.northking.cctp.executePlan.api.third.devops.dto.DevopsProExecplanInfoDto; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatch; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.db.service.AtuPlanBatchService; +import net.northking.cctp.executePlan.db.service.AtuPlanInfoService; +import net.northking.cctp.executePlan.db.service.AtuPlanTaskService; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanInfoDetailDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanInfoQueryDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanRunDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskPageDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author maven-cctp-plugin + * @since 1.0 + */ + +@Service +@ConditionalOnMissingBean(name = "DevopsServiceImpl") +public class DevopsServiceImpl implements DevopsService +{ + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(DevopsServiceImpl.class); + @Autowired + private AtuPlanInfoService atuPlanInfoService; + @Autowired + private EntityNameCache entityNameCache; + @Autowired + private AtuPlanInfoApiService atuPlanInfoApiService; + @Autowired + private AtuPlanBatchService atuPlanBatchService; + @Autowired + private AtuPlanTaskService atuPlanTaskService; + @Override + public List getExecplanListByProjectId(List productIdList) { + //查询数据 + AtuPlanInfoQueryDto selectParamAtuPlanInfoQueryDto = new AtuPlanInfoQueryDto(); + selectParamAtuPlanInfoQueryDto.setProjectList(productIdList); + List tempResultAtuPlanInfoDetailDtos = atuPlanInfoService.queryPlanInfo(selectParamAtuPlanInfoQueryDto); + //构建返回对象 + List resultDevopsProExecplanInfoDtoList = new ArrayList<>(); + Map> dtoMapKeyToProjectId = tempResultAtuPlanInfoDetailDtos.stream().collect(Collectors.groupingBy(AtuPlanInfoDetailDto::getProjectId)); + for(String key:dtoMapKeyToProjectId.keySet()){ + //构建返回实体 + DevopsProExecplanInfoDto resultBuildDto = new DevopsProExecplanInfoDto(); + AtuPlanInfoDetailDto tempIndex0Dto = dtoMapKeyToProjectId.get(key).get(0); + //系统名称 + resultBuildDto.setProjectName(entityNameCache.translateById(EntityNameCatalog.MONSTER_SYSTEM, tempIndex0Dto.getProjectId())); + //系统id + resultBuildDto.setProjectId(tempIndex0Dto.getProjectId()); + //执行计划集合 + List execplanList = new ArrayList<>(); + dtoMapKeyToProjectId.get(key).stream().forEach(item->{ + DevopsExecplanInfoResultDto resultDto = new DevopsExecplanInfoResultDto(); + //执行计划id + resultDto.setPlanId(item.getId()); + //执行计划名称 + resultDto.setPlanName(item.getPlanName()); + execplanList.add(resultDto); + }); + resultBuildDto.setExecplanList(execplanList); + //塞入结果 + resultDevopsProExecplanInfoDtoList.add(resultBuildDto); + } + return resultDevopsProExecplanInfoDtoList; + } + + @Override + public void doExecplanByThirdPlatforn(DevopsDoExecplanParamDto doExecplanParamDto) { + //build 入参 + AtuPlanRunDto atuPlanRunDto = new AtuPlanRunDto(); + atuPlanRunDto.setPlanId(doExecplanParamDto.getExecplanId()); + atuPlanRunDto.setTriggerType(PlanConstant.TRIGGER_TYPE_DEVOPS); + atuPlanRunDto.setExecutedBy(doExecplanParamDto.getExecMan()); + atuPlanRunDto.setBatchId(doExecplanParamDto.getDevopsExecUuid()); + try{ + atuPlanInfoApiService.run(atuPlanRunDto); + }catch (Exception e){ + throw new RuntimeException("执行计划执行失败"+e.getMessage()); + } + } + + @Override + public DevopsExecplanInfoResultDto getExecplanResultInfo(DevopsDoExecplanParamDto doExecplanParamDto) { + DevopsExecplanInfoResultDto resultDto = new DevopsExecplanInfoResultDto(); + //请求uuid = 系统内批次id 按照我们系统batchid生成规则生成uuid + + AtuPlanBatch tempResultAtuPlanBatchDto = atuPlanBatchService.findByPrimaryKey(doExecplanParamDto.getDevopsExecUuid()); + //脚本总数 + resultDto.setTasktotal(tempResultAtuPlanBatchDto.getTaskTotal()); + //脚本成功数 + resultDto.setSuccessNum(tempResultAtuPlanBatchDto.getSuccessNum()); + //脚本失败数 + resultDto.setFailNum(tempResultAtuPlanBatchDto.getExecFailNum()); + //脚本取消数 + resultDto.setCancelNum(tempResultAtuPlanBatchDto.getCancelNum()); + //脚本超时数 + resultDto.setTimeoutNum(tempResultAtuPlanBatchDto.getTimeoutNum()); + //执行时间 + resultDto.setExecTime(DateUtil.toYearMonthDay24HourMinSecond(tempResultAtuPlanBatchDto.getStartTime())); + //执行状态 0-等待中,1-执行中,2-已完成,3-已取消 + resultDto.setExecState(tempResultAtuPlanBatchDto.getStatus()); + //执行计划id + resultDto.setPlanId(tempResultAtuPlanBatchDto.getPlanId()); + + //查询计划名称 + String planId = tempResultAtuPlanBatchDto.getPlanId(); + AtuPlanInfo tempResultAtuPlanInfoDto = atuPlanInfoService.findByPrimaryKey(planId); + resultDto.setPlanName(tempResultAtuPlanInfoDto.getPlanName()); + + //Case集合信息 + List resultCaseList = new ArrayList<>(); + String batchId = doExecplanParamDto.getDevopsExecUuid(); + + List result = this.atuPlanTaskService.queryCaseListByBatchId(batchId); + logger.info("查询的case集合有" +result.size()+"个"+ JSONUtil.toJsonStr(result)); + result.stream().forEach(item->{ + DevopsCaseInfoDto resultCaseDto = new DevopsCaseInfoDto(); + resultCaseDto.setCaseName(item.getCaseName()); + resultCaseDto.setCaseNo(item.getCaseNo()); + resultCaseDto.setCaseResult(item.getStatus()); + resultCaseDto.setCaseType(item.getCaseType()); + resultCaseDto.setScriptId(item.getScriptId()); + resultCaseDto.setScriptName(item.getScriptName()); + resultCaseList.add(resultCaseDto); + }); + resultDto.setCaseList(resultCaseList); + + return resultDto; + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/config/FeilangConfig.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/config/FeilangConfig.java new file mode 100644 index 0000000..38f7f95 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/config/FeilangConfig.java @@ -0,0 +1,50 @@ +package net.northking.cctp.executePlan.api.third.feilang.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "cctp.fl.execplan.param") +public class FeilangConfig { + //ak 认证 + private String ak ; + // 模板id + private String messageTemplateId ; + //monster-common地址 + private String pathUrl ; + //跳转回来查看执行计划的url + private String backUrl ; + + public String getAk() { + return ak; + } + + public void setAk(String ak) { + this.ak = ak; + } + + public String getMessageTemplateId() { + return messageTemplateId; + } + + public void setMessageTemplateId(String messageTemplateId) { + this.messageTemplateId = messageTemplateId; + } + + public String getPathUrl() { + return pathUrl; + } + + public void setPathUrl(String pathUrl) { + this.pathUrl = pathUrl; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/dto/FeiLangExecplanInfoResultDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/dto/FeiLangExecplanInfoResultDto.java new file mode 100644 index 0000000..ce86af9 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/dto/FeiLangExecplanInfoResultDto.java @@ -0,0 +1,178 @@ +/* + * Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. + * + */ +package net.northking.cctp.executePlan.api.third.feilang.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.io.Serializable; + +/** + * + * createdate: 2022-12-06 11:32:04
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@JsonSerialize +public class FeiLangExecplanInfoResultDto implements Serializable +{ + + + /** + * 执行计划名称 + */ + private String planName; + /** + * 执行状态 + */ + private String execStatus; + /** + * 系统名称 + */ + private String projectName; + /** + * 系统id + */ + private String projectId; + /** + * batch id + */ + private String batchId; + /** + * 执行人 + */ + private String execUser; + /** + * 执行时间 + */ + private String execTime; + /** + * 发送人 + */ + private String userAccounts; + /** + * 脚本总数 + */ + private String sunCount; + /** + * 成功数 + */ + private String successCount; + /** + * 失败数 + */ + private String failCount; + /** + * 取消数 + */ + private String cancelCount; + /** + * 超时数 + */ + private String timeOutCount; + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getExecStatus() { + return execStatus; + } + + public void setExecStatus(String execStatus) { + this.execStatus = execStatus; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getExecUser() { + return execUser; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public void setExecUser(String execUser) { + this.execUser = execUser; + } + + public String getExecTime() { + return execTime; + } + + public void setExecTime(String execTime) { + this.execTime = execTime; + } + + public String getSunCount() { + return sunCount; + } + + public void setSunCount(String sunCount) { + this.sunCount = sunCount; + } + + public String getSuccessCount() { + return successCount; + } + + public void setSuccessCount(String successCount) { + this.successCount = successCount; + } + + public String getFailCount() { + return failCount; + } + + public void setFailCount(String failCount) { + this.failCount = failCount; + } + + public String getCancelCount() { + return cancelCount; + } + + public void setCancelCount(String cancelCount) { + this.cancelCount = cancelCount; + } + + public String getTimeOutCount() { + return timeOutCount; + } + + public void setTimeOutCount(String timeOutCount) { + this.timeOutCount = timeOutCount; + } + + public String getUserAccounts() { + return userAccounts; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public void setUserAccounts(String userAccounts) { + this.userAccounts = userAccounts; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/dto/FeiLangUserDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/dto/FeiLangUserDto.java new file mode 100644 index 0000000..eb1a571 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/dto/FeiLangUserDto.java @@ -0,0 +1,34 @@ +package net.northking.cctp.executePlan.api.third.feilang.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +@JsonSerialize +@ApiModel(description = "用户雪狼信息") +public class FeiLangUserDto implements Serializable { + + @ApiModelProperty("用户登录号") + private String loginNo; + + @ApiModelProperty("用户中文名称") + private String userChnName; + + public String getLoginNo() { + return loginNo; + } + + public void setLoginNo(String loginNo) { + this.loginNo = loginNo; + } + + public String getUserChnName() { + return userChnName; + } + + public void setUserChnName(String userChnName) { + this.userChnName = userChnName; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/service/FeiLangService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/service/FeiLangService.java new file mode 100644 index 0000000..17464ad --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/service/FeiLangService.java @@ -0,0 +1,8 @@ +package net.northking.cctp.executePlan.api.third.feilang.service; + +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchDetailDto; + +public interface FeiLangService { + void sendMessage(AtuPlanInfo atuPlanInfo, AtuPlanBatchDetailDto atuPlanBatch) ; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/service/FeiLangServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/service/FeiLangServiceImpl.java new file mode 100644 index 0000000..162be60 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/feilang/service/FeiLangServiceImpl.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. + * + */ +package net.northking.cctp.executePlan.api.third.feilang.service; + +import com.alibaba.fastjson.JSONObject; +import net.northking.cctp.common.cache.EntityNameCache; +import net.northking.cctp.common.cache.EntityNameCatalog; +import net.northking.cctp.executePlan.api.third.common.ThirdConstant; +import net.northking.cctp.executePlan.api.third.feilang.config.FeilangConfig; +import net.northking.cctp.executePlan.api.third.feilang.dto.FeiLangExecplanInfoResultDto; +import net.northking.cctp.executePlan.api.third.util.FLHttpClientUtils; +import net.northking.cctp.executePlan.constants.MsgConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatch; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.db.service.AtuPlanBatchService; +import net.northking.cctp.executePlan.db.service.AtuPlanInfoService; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchDetailDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 第三方飞狼系统交互类 + * + * @author yujinfa + * @since 1.0 + */ + +@Service +@ConditionalOnMissingBean(name = "FeiLangServiceImpl") +public class FeiLangServiceImpl implements FeiLangService { + @Autowired + private FeilangConfig feilangConfig; + @Autowired + private AtuPlanInfoService atuPlanInfoService; + @Autowired + private EntityNameCache entityNameCache; + @Autowired + private AtuPlanBatchService atuPlanBatchService; + + private final static Logger logger = LoggerFactory.getLogger(FeiLangServiceImpl.class); + + @Override + public void sendMessage(AtuPlanInfo atuPlanInfo, AtuPlanBatchDetailDto atuPlanBatch) { + // result dto model + FeiLangExecplanInfoResultDto resultDto = new FeiLangExecplanInfoResultDto(); + // build result dto + buildResultDto(resultDto, atuPlanInfo, atuPlanBatch); + //飞狼发送用户id + List feiLangUserList = new ArrayList<>(); + if (resultDto.getUserAccounts().contains(",")) { + feiLangUserList = Arrays.asList(resultDto.getUserAccounts().split(",")); + } else { + feiLangUserList.add(resultDto.getUserAccounts()); + } + //接口参数 + Map contentParameterMap = new HashMap<>(); + //业务模板参数 + Map templateParamMap = new HashMap(); + try { + //执行人 + templateParamMap.put(MsgConstant.EXEC_USER, resultDto.getExecUser()); + //系统名称 + templateParamMap.put(MsgConstant.PROJECT_NAME, entityNameCache.translateById(EntityNameCatalog.MONSTER_SYSTEM, resultDto.getProjectId())); + //执行状态 + templateParamMap.put(MsgConstant.EXEC_STATUS, resultDto.getExecStatus()); + //计划名称 + templateParamMap.put(MsgConstant.PLAN_NAME, resultDto.getPlanName()); + //执行时间 + templateParamMap.put(MsgConstant.EXEC_TIME, resultDto.getExecTime()); + //获取脚本总数 ,成功数, 失败数,取消数,超时数。 + //脚本总数 + templateParamMap.put(MsgConstant.SUN_COUNT, resultDto.getSunCount()); + //成功数 + templateParamMap.put(MsgConstant.SUCCESS_COUNT, resultDto.getSuccessCount()); + //失败数 + templateParamMap.put(MsgConstant.FAIL_COUNT, resultDto.getFailCount()); + //取消数 + templateParamMap.put(MsgConstant.CANCEL_COUNT, resultDto.getCancelCount()); + //超时数 + templateParamMap.put(MsgConstant.TIMEOUT_COUNT, resultDto.getTimeOutCount()); + //接口入参 + //消息模板id + contentParameterMap.put(MsgConstant.MSG_TEMP_ID, feilangConfig.getMessageTemplateId()); + //发送平台(0-mc 1-picus 2-ats 3-ui 4-cc) + contentParameterMap.put(MsgConstant.SOUR_PLAT, ThirdConstant.PLATFORM_SEND_TO_UI); + + } catch (Exception e) { + logger.error("飞狼发送前数据组装异常:",e); + throw new RuntimeException("飞狼发送前数据组装异常" + e.getMessage()); + } + + //循环发送飞狼信息以便提供跳转回来飞狼的登录号 + try { + String result = null; + for(String feiLangLoginNo:feiLangUserList){ + //跳转链接+飞狼登录号 待前端调试 todo + //urlfeilangConfig.getBackUrl()+resultDto.getBatchId()+"?enabled=true" ">"+feiLangLoginNo + templateParamMap.put(MsgConstant.URL, feilangConfig.getBackUrl() + "?loginName="+feiLangLoginNo +"&software=autoTest" +"&planId="+atuPlanInfo.getId() +"&planName="+resultDto.getPlanName()); //获取飞狼订阅用户 + //发送飞狼用户 + contentParameterMap.put(MsgConstant.USER_ACCOUNTS, feiLangLoginNo); + //模板占位符所需的参数 + contentParameterMap.put(MsgConstant.CONT_PARA, JSONObject.toJSONString(templateParamMap)); + result = FLHttpClientUtils.doPostFormData(feilangConfig.getPathUrl(), null, null, contentParameterMap, feilangConfig.getAk()); + logger.info("推送飞狼"+feiLangLoginNo+"返回信息为" + result); + } + }catch (Exception e){ + logger.error("飞狼发送消息异常:",e); + throw new RuntimeException("飞狼发送消息异常"+e.getMessage()); + } + } + + + private void buildResultDto(FeiLangExecplanInfoResultDto feiLangExecplanInfoResultDto,AtuPlanInfo atuPlanInfo,AtuPlanBatchDetailDto atuPlanBatch) { + + //执行人 + String executedByName = entityNameCache.translateById(EntityNameCatalog.MONSTER_USER, atuPlanBatch.getExecutedBy()); + feiLangExecplanInfoResultDto.setExecUser(executedByName==null?"":executedByName); + //系统id + feiLangExecplanInfoResultDto.setProjectId(atuPlanInfo.getProjectId()); + //执行状态 0-等待中,1-执行中,2-已完成,3-已取消 + String tempStatus = atuPlanInfo.getStatus(); + String tempStatusCHN = ""; + if(Objects.nonNull(tempStatus)&&tempStatus.equals("0")){ + tempStatusCHN = "等待中"; + }else if(Objects.nonNull(tempStatus)&&tempStatus.equals("1")){ + tempStatusCHN = "执行中"; + }else if(Objects.nonNull(tempStatus)&&tempStatus.equals("2")){ + tempStatusCHN = "已完成"; + }else if(Objects.nonNull(tempStatus)&&tempStatus.equals("3")){ + tempStatusCHN = "已取消"; + } + feiLangExecplanInfoResultDto.setExecStatus(tempStatusCHN); + //计划名称 + feiLangExecplanInfoResultDto.setPlanName(atuPlanInfo.getPlanName()); + //执行时间 + DateFormat dateFormat=new SimpleDateFormat(MsgConstant.DATE_FORMAT_PATTERN); + feiLangExecplanInfoResultDto.setExecTime(dateFormat.format(atuPlanBatch.getStartTime())); + //飞狼订阅用户 + feiLangExecplanInfoResultDto.setUserAccounts(atuPlanInfo.getMailAddress()); + //batchId + feiLangExecplanInfoResultDto.setBatchId(atuPlanBatch.getId()); + //根据batchId查询脚本信息 + AtuPlanBatch tempResultAtuPlanBatch = this.atuPlanBatchService.findByPrimaryKey(atuPlanBatch.getId()); + //脚本总数 + feiLangExecplanInfoResultDto.setSunCount(tempResultAtuPlanBatch.getScriptNum().toString()); + //成功数 + feiLangExecplanInfoResultDto.setSuccessCount(tempResultAtuPlanBatch.getSuccessNum().toString()); + //失败数 + feiLangExecplanInfoResultDto.setFailCount(tempResultAtuPlanBatch.getExecFailNum().toString()); + //取消数 + feiLangExecplanInfoResultDto.setCancelCount(tempResultAtuPlanBatch.getCancelNum().toString()); + //超时数 + feiLangExecplanInfoResultDto.setTimeOutCount(tempResultAtuPlanBatch.getTimeoutNum().toString()); + } + + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/util/FLHttpClientUtils.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/util/FLHttpClientUtils.java new file mode 100644 index 0000000..b071431 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/third/util/FLHttpClientUtils.java @@ -0,0 +1,85 @@ +package net.northking.cctp.executePlan.api.third.util; + +import com.alibaba.cloud.commons.lang.StringUtils; +import org.apache.http.Consts; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.mime.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.entity.mime.content.StringBody; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Map; + +/** + * 飞狼调用工具类 + * + * @author yujinfa + * @date 2023/09/18 + */ +public class FLHttpClientUtils { + + private final static Logger log = LoggerFactory.getLogger(FLHttpClientUtils.class); + + public static String doPostFormData(String url, String fileParamName, MultipartFile multipartFile, Map paramMap,String ak) { + log.info("sendurl:" + url+"data:" + paramMap); + // 创建Http实例 + CloseableHttpClient httpClient = HttpClients.createDefault(); + // 创建HttpPost实例 + HttpPost httpPost = new HttpPost(url); + // 请求参数配置 + RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(60000) + .setConnectionRequestTimeout(60000).build(); + httpPost.setConfig(requestConfig); + if (StringUtils.isNotBlank(ak)){ + httpPost.setHeader("ak",ak); + } + try { + MultipartEntityBuilder builder = MultipartEntityBuilder.create(); + builder.setCharset(java.nio.charset.Charset.forName("UTF-8")); + builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); + if (multipartFile !=null) { + String fileName = multipartFile.getOriginalFilename(); + // 文件流 + builder.addBinaryBody(fileParamName, multipartFile.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName); + } + //表单中其他参数 + for(Map.Entry entry: paramMap.entrySet()) { + builder.addPart(entry.getKey(),new StringBody(entry.getValue(), ContentType.create("text/plain", Consts.UTF_8))); + } + HttpEntity entity = builder.build(); + httpPost.setEntity(entity); + HttpResponse response = httpClient.execute(httpPost);// 执行提交 + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + // 返回 + String res = EntityUtils.toString(response.getEntity(), java.nio.charset.Charset.forName("UTF-8")); + log.info("返回结果:"+res); + return res; + }else{ + log.error("[{}]请求返回http code 为 [{}]",url,response.getStatusLine().getStatusCode()); + } + } catch (Exception e) { + log.error("",e); + log.error("调用HttpPost失败!" + e.toString()); + } finally { + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + log.error("关闭HttpPost连接失败!"); + } + } + } + return null; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/BusConstants.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/BusConstants.java new file mode 100644 index 0000000..d940e81 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/BusConstants.java @@ -0,0 +1,17 @@ +package net.northking.cctp.executePlan.bus; + +public class BusConstants { + + /** + * 头部数据KEY:租户 + */ + public static final String Key_SaaS_Tenant_ID = "SaaS_Tenant_ID"; + /** + * 头部数据KEY:用户ID + */ + public static final String Key_CCTP_User_ID = "CCTP_User_ID"; + /** + * 发送通知--日志请求 + */ + public static final String Q_Platform_Log_Insert_REQ = "Platform.Log.Insert.REQ"; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/ScriptReceiver.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/ScriptReceiver.java new file mode 100644 index 0000000..5382260 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/ScriptReceiver.java @@ -0,0 +1,61 @@ +package net.northking.cctp.executePlan.bus; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.executePlan.db.entity.AtuPlanScriptLink; +import net.northking.cctp.executePlan.db.service.AtuPlanInfoService; +import net.northking.cctp.executePlan.db.service.AtuPlanScriptLinkService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.amqp.core.Message; + +import java.util.*; + +@Component +public class ScriptReceiver { + + private final static Logger logger = LoggerFactory.getLogger(ScriptReceiver.class); + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private AtuPlanScriptLinkService planScriptLinkService; + + @Autowired + private AtuPlanInfoService planInfoService; + + @RabbitListener(queuesToDeclare = {@Queue(value = "Plan.Update.Status.REQ")}) + public void process(Message message) { + String scriptId = ""; + MessageProperties mp = message.getMessageProperties(); + Map headers = mp.getHeaders(); + String userId = (String) headers.get(BusConstants.Key_CCTP_User_ID); // 创建人 + String tenantId = (String) headers.get(BusConstants.Key_SaaS_Tenant_ID); // 租户id + try { + scriptId = objectMapper.readValue(message.getBody(), new TypeReference() { + }); + NKSecurityContext.setUserId(userId); + NKSecurityContext.setTenantId(tenantId); + AtuPlanScriptLink link = new AtuPlanScriptLink(); + link.setScriptId(scriptId); + List query = planScriptLinkService.query(link); + Set planSet = new HashSet<>(); + for (AtuPlanScriptLink scriptLink : query) { + planSet.add(scriptLink.getPlanId()); + } + if (planSet.size()>0) { + //更新计划状态 + planInfoService.updatePlanByIds(new ArrayList<>(planSet)); + } + }catch (Exception e){ + logger.error("更新计划状态异常:", e); + } + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/SyncData2DwPublisher.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/SyncData2DwPublisher.java new file mode 100644 index 0000000..d6e6c93 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/SyncData2DwPublisher.java @@ -0,0 +1,331 @@ +package net.northking.cctp.executePlan.bus; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.executePlan.api.service.MqSynchronizeTaskApiService; +import net.northking.cctp.executePlan.constants.MsgConstant; +import net.northking.cctp.executePlan.db.entity.*; +import net.northking.cctp.executePlan.enums.ErrorMessage; +import net.northking.cctp.executePlan.enums.TaskTypeEnum; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.MessageBuilder; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.integration.redis.util.RedisLockRegistry; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.stream.Collectors; + +/** + * @Description: TODO + * @Author: baoxt + * @@CreateDate: 2023-09-15 + */ +@Component +public class SyncData2DwPublisher { + /** + * 日志 + */ + private final static Logger logger = LoggerFactory.getLogger(SyncData2DwPublisher.class); + + @Autowired + private RabbitTemplate rabbitTemplate; + @Autowired + private ObjectMapper objectMapper; + @Autowired + private MqSynchronizeTaskApiService mqSynchronizeTaskApiService; + @Autowired + private RedisLockRegistry redisLockRegistry; + + //同步执行计划数据 + @Scheduled(fixedDelayString ="${atu.plan.syncAtuPlanInfo:120000}") + public void syncAtuPlanInfo() { + Lock lock = redisLockRegistry.obtain(MsgConstant.SYNC_ATUPLAN_INFO); + try { + boolean b = lock.tryLock(10, TimeUnit.SECONDS); + if (b){ + byte[] json; + //查询 + List mqSynchronizeTasks= mqSynchronizeTaskApiService.findByTypes(Collections.singletonList(TaskTypeEnum.SYNC_PLAN_INFO.getCode())); + //处理推送数据 + if (mqSynchronizeTasks.size()!=0){ + //删除 + List ids = mqSynchronizeTasks.stream().map(MqSynchronizeTask::getId).collect(Collectors.toList()); + mqSynchronizeTaskApiService.deleteBatch(ids); + //数据处理 + List atuPlanInfoList = new ArrayList<>(); + for (MqSynchronizeTask mqSynchronizeTask: mqSynchronizeTasks) { + AtuPlanInfo atuCaseInfo = JSONObject.parseObject(mqSynchronizeTask.getTaskInfo(), AtuPlanInfo.class); + atuPlanInfoList.add(atuCaseInfo); + } + //根据更新时间获取相同id最新的更新记录 + List idList = atuPlanInfoList.stream().map(AtuPlanInfo::getId).distinct().collect(Collectors.toList()); + Map> map = atuPlanInfoList.stream().collect(Collectors.groupingBy(AtuPlanInfo::getId)); + List atuPlanInfos = new ArrayList<>(); + for (String id:idList) { + List atuPlanInfoListTemp = map.get(id); + List collect = atuPlanInfoListTemp.stream().sorted(Comparator.comparing(AtuPlanInfo::getUpdatedTime).reversed()).collect(Collectors.toList()); + atuPlanInfos.add(collect.get(0)); + } + // 分包发送 + int count = 20; + Integer num = atuPlanInfos.size(); + for (int i = 0; i < num / count + 1; i++) { + if (i * count == num) { + break; + } + int stop = (i + 1) * count > num ? num : (i + 1) * count; + List subAtuPlanInfos = atuPlanInfos.subList(i * count, stop); + + json = objectMapper.writeValueAsBytes(subAtuPlanInfos); + MessageBuilder mb = MessageBuilder.withBody(json); + mb.setContentType(MediaType.APPLICATION_JSON_VALUE); + rabbitTemplate.send(MsgConstant.DW_ATUPLANINFO_INSERT_REQ, mb.build()); + } + } + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new PlatformRuntimeException(new ErrorMessage(e.getMessage())); + } catch (JsonProcessingException e) { + throw new PlatformRuntimeException(new ErrorMessage("同步执行计划信息消息发送失败!!!")); + }finally { + lock.unlock(); + } + } + + + @Scheduled(fixedDelayString ="${atu.plan.syncAtuPlanBatch:120000}") + public void syncAtuPlanBatch() { + Lock lock = redisLockRegistry.obtain(MsgConstant.SYNC_ATUPLAN_BATCH); + try { + boolean b = lock.tryLock(10, TimeUnit.SECONDS); + if (b){ + byte[] json; + //查询 + List mqSynchronizeTasks= mqSynchronizeTaskApiService.findByTypes(Collections.singletonList(TaskTypeEnum.SYNC_PLAN_BATCH.getCode())); + //处理推送数据 + if (mqSynchronizeTasks.size()!=0){ + //删除 + List ids = mqSynchronizeTasks.stream().map(MqSynchronizeTask::getId).collect(Collectors.toList()); + mqSynchronizeTaskApiService.deleteBatch(ids); + //数据处理 + List atuPlanBatchList = new ArrayList<>(); + for (MqSynchronizeTask mqSynchronizeTask: mqSynchronizeTasks) { + AtuPlanBatch atuPlanBatch = JSONObject.parseObject(mqSynchronizeTask.getTaskInfo(), AtuPlanBatch.class); + atuPlanBatchList.add(atuPlanBatch); + } + //根据更新时间获取相同id最新的更新记录 + List idList = atuPlanBatchList.stream().map(AtuPlanBatch::getId).distinct().collect(Collectors.toList()); + Map> map = atuPlanBatchList.stream().collect(Collectors.groupingBy(AtuPlanBatch::getId)); + List atuPlanBatches = new ArrayList<>(); + for (String id:idList) { + List atuPlanInfoListTemp = map.get(id); + List collect = atuPlanInfoListTemp.stream().sorted(Comparator.comparing(AtuPlanBatch::getCreatedTime).reversed()).collect(Collectors.toList()); + atuPlanBatches.add(collect.get(0)); + } + // 分包发送 + int count = 20; + Integer num = atuPlanBatches.size(); + for (int i = 0; i < num / count + 1; i++) { + if (i * count == num) { + break; + } + int stop = (i + 1) * count > num ? num : (i + 1) * count; + List subAtuPlanBatchs = atuPlanBatches.subList(i * count, stop); + + json = objectMapper.writeValueAsBytes(subAtuPlanBatchs); + MessageBuilder mb = MessageBuilder.withBody(json); + mb.setContentType(MediaType.APPLICATION_JSON_VALUE); + rabbitTemplate.send(MsgConstant.DW_ATUPLANBATCH_INSERT_REQ, mb.build()); + } + } + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new PlatformRuntimeException(new ErrorMessage(e.getMessage())); + } catch (JsonProcessingException e) { + throw new PlatformRuntimeException(new ErrorMessage("同步执行计划信息消息发送失败!!!")); + }finally { + lock.unlock(); + } + } + + + @Scheduled(fixedDelayString ="${atu.plan.syncAtuPlanScriptLink:120000}") + public void syncAtuPlanScriptLink(){ + Lock lock = redisLockRegistry.obtain(MsgConstant.SYNC_ATUPLAN_SCRIPTLINK); + try { + boolean b = lock.tryLock(10, TimeUnit.SECONDS); + if(b){ + byte[] json; + //查询 + List mqSynchronizeTasks= mqSynchronizeTaskApiService.findByTypes(Collections.singletonList(TaskTypeEnum.SYNC_PLAN_SCRIPT_LINK.getCode())); + //处理推送数据 + if (mqSynchronizeTasks.size()!=0){ + //删除 + List ids = mqSynchronizeTasks.stream().map(MqSynchronizeTask::getId).collect(Collectors.toList()); + mqSynchronizeTaskApiService.deleteBatch(ids); + //数据处理 + List atuPlanScriptLinkList = new ArrayList<>(); + for (MqSynchronizeTask mqSynchronizeTask: mqSynchronizeTasks) { + AtuPlanScriptLink atuPlanScriptLink = JSONObject.parseObject(mqSynchronizeTask.getTaskInfo(), AtuPlanScriptLink.class); + atuPlanScriptLinkList.add(atuPlanScriptLink); + } + //根据更新时间获取相同id最新的更新记录 + List idList = atuPlanScriptLinkList.stream().map(AtuPlanScriptLink::getId).distinct().collect(Collectors.toList()); + Map> map = atuPlanScriptLinkList.stream().collect(Collectors.groupingBy(AtuPlanScriptLink::getId)); + List atuPlanScriptLinks = new ArrayList<>(); + for (Long id:idList) { + List atuPlanScriptLinkListTemp = map.get(id); + List collect = atuPlanScriptLinkListTemp.stream().collect(Collectors.toList()); + atuPlanScriptLinks.add(collect.get(0)); + } + // 分包发送 + int count = 20; + Integer num = atuPlanScriptLinks.size(); + for (int i = 0; i < num / count + 1; i++) { + if (i * count == num) { + break; + } + int stop = (i + 1) * count > num ? num : (i + 1) * count; + List subAtuPlanScriptLinks = atuPlanScriptLinks.subList(i * count, stop); + + json = objectMapper.writeValueAsBytes(subAtuPlanScriptLinks); + MessageBuilder mb = MessageBuilder.withBody(json); + mb.setContentType(MediaType.APPLICATION_JSON_VALUE); + rabbitTemplate.send(MsgConstant.DW_ATUPLANSCRIPTLINK_INSERT_REQ, mb.build()); + } + } + } + }catch (InterruptedException e){ + Thread.currentThread().interrupt(); + throw new PlatformRuntimeException(new ErrorMessage(e.getMessage())); + }catch (JsonProcessingException e){ + throw new PlatformRuntimeException(new ErrorMessage("同步执行计划信息消息发送失败!!!")); + }finally { + lock.unlock(); + } + } + + @Scheduled(fixedDelayString ="${atu.plan.syncAtuPlanEnvLink:120000}") + public void syncAtuPlanEnvLink(){ + Lock lock = redisLockRegistry.obtain(MsgConstant.SYNC_ATUPLAN_ENVLINK); + try { + boolean b = lock.tryLock(10, TimeUnit.SECONDS); + if(b){ + byte[] json; + //查询 + List mqSynchronizeTasks= mqSynchronizeTaskApiService.findByTypes(Collections.singletonList(TaskTypeEnum.SYNC_PLAN_ENV_LINK.getCode())); + //处理推送数据 + if (mqSynchronizeTasks.size()!=0){ + //删除 + List ids = mqSynchronizeTasks.stream().map(MqSynchronizeTask::getId).collect(Collectors.toList()); + mqSynchronizeTaskApiService.deleteBatch(ids); + //数据处理 + List atuPlanEnvLinkList = new ArrayList<>(); + for (MqSynchronizeTask mqSynchronizeTask: mqSynchronizeTasks) { + AtuPlanEnvLink atuPlanEnvLink = JSONObject.parseObject(mqSynchronizeTask.getTaskInfo(), AtuPlanEnvLink.class); + atuPlanEnvLinkList.add(atuPlanEnvLink); + } + //根据更新时间获取相同id最新的更新记录 + List idList = atuPlanEnvLinkList.stream().map(AtuPlanEnvLink::getId).distinct().collect(Collectors.toList()); + Map> map = atuPlanEnvLinkList.stream().collect(Collectors.groupingBy(AtuPlanEnvLink::getId)); + List atuPlanEnvLinks = new ArrayList<>(); + for (Long id:idList) { + List atuPlanEnvLinkListTemp = map.get(id); + List collect = atuPlanEnvLinkListTemp.stream().collect(Collectors.toList()); + atuPlanEnvLinks.add(collect.get(0)); + } + // 分包发送 + int count = 20; + Integer num = atuPlanEnvLinks.size(); + for (int i = 0; i < num / count + 1; i++) { + if (i * count == num) { + break; + } + int stop = (i + 1) * count > num ? num : (i + 1) * count; + List subAtuPlanEnvLinks = atuPlanEnvLinks.subList(i * count, stop); + + json = objectMapper.writeValueAsBytes(atuPlanEnvLinks); + MessageBuilder mb = MessageBuilder.withBody(json); + mb.setContentType(MediaType.APPLICATION_JSON_VALUE); + rabbitTemplate.send(MsgConstant.DW_ATUPLANEnvLink_INSERT_REQ, mb.build()); + } + } + } + }catch (InterruptedException e){ + Thread.currentThread().interrupt(); + throw new PlatformRuntimeException(new ErrorMessage(e.getMessage())); + }catch (JsonProcessingException e){ + throw new PlatformRuntimeException(new ErrorMessage("同步执行计划信息消息发送失败!!!")); + }finally { + lock.unlock(); + } + } + + @Scheduled(fixedDelayString ="${atu.plan.syncAtuPlanTask:120000}") + public void syncAtuPlanTask() { + Lock lock = redisLockRegistry.obtain(MsgConstant.SYNC_ATUPLAN_TASK); + try { + boolean b = lock.tryLock(10, TimeUnit.SECONDS); + if (b){ + byte[] json; + //查询 + List mqSynchronizeTasks= mqSynchronizeTaskApiService.findByTypes(Collections.singletonList(TaskTypeEnum.SYNC_PLAN_TASK.getCode())); + //处理推送数据 + if (mqSynchronizeTasks.size()!=0){ + //删除 + List ids = mqSynchronizeTasks.stream().map(MqSynchronizeTask::getId).collect(Collectors.toList()); + mqSynchronizeTaskApiService.deleteBatch(ids); + //数据处理 + List atuPlanTaskList = new ArrayList<>(); + for (MqSynchronizeTask mqSynchronizeTask: mqSynchronizeTasks) { + AtuPlanTask atuPlanTask = JSONObject.parseObject(mqSynchronizeTask.getTaskInfo(), AtuPlanTask.class); + atuPlanTaskList.add(atuPlanTask); + } + //根据更新时间获取相同id最新的更新记录 + List idList = atuPlanTaskList.stream().map(AtuPlanTask::getId).distinct().collect(Collectors.toList()); + Map> map = atuPlanTaskList.stream().collect(Collectors.groupingBy(AtuPlanTask::getId)); + List atuPlanTasks = new ArrayList<>(); + for (String id:idList) { + List atuPlanInfoListTemp = map.get(id); + List collect = atuPlanInfoListTemp.stream().sorted(Comparator.comparing(AtuPlanTask::getCreatedTime).reversed()).collect(Collectors.toList()); + atuPlanTasks.add(collect.get(0)); + } + // 分包发送 + int count = 20; + Integer num = atuPlanTasks.size(); + for (int i = 0; i < num / count + 1; i++) { + if (i * count == num) { + break; + } + int stop = (i + 1) * count > num ? num : (i + 1) * count; + List subAtuPlanTasks = atuPlanTasks.subList(i * count, stop); + + json = objectMapper.writeValueAsBytes(subAtuPlanTasks); + MessageBuilder mb = MessageBuilder.withBody(json); + mb.setContentType(MediaType.APPLICATION_JSON_VALUE); + rabbitTemplate.send(MsgConstant.DW_ATUPLANTASK_INSERT_REQ, mb.build()); + } + } + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new PlatformRuntimeException(new ErrorMessage(e.getMessage())); + } catch (JsonProcessingException e) { + throw new PlatformRuntimeException(new ErrorMessage("同步计划执行任务发送失败!!!")); + }finally { + lock.unlock(); + } + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/log/CpLogAddDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/log/CpLogAddDto.java new file mode 100644 index 0000000..fa76e71 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/log/CpLogAddDto.java @@ -0,0 +1,182 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2021 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.bus.log; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** +* Restful接口--新增资源--数据传输对象: +* +* createdate: 2021-12-06 14:56:51
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "") +public class CpLogAddDto implements Serializable +{ + // TODO 请完成新增资源的属性 + /** + * 日志类型(1-新增 2-修改 3-删除)
+ */ + @ApiModelProperty("日志类型(1-新增 2-修改 3-删除)") + @Size(max = 2, message="日志类型(1-新增 2-修改 3-删除)-type: 数据长度不能 > 2" ) + private String type; + /** + * 所属功能
+ */ + @ApiModelProperty("所属功能") + @Size(max = 50, message="所属功能-module: 数据长度不能 > 50" ) + private String module; + /** + * 请求地址
+ */ + @ApiModelProperty("请求地址") + @Size(max = 100, message="请求地址-remoteAddr: 数据长度不能 > 100" ) + private String remoteAddr; + /** + * 日志内容
+ */ + @ApiModelProperty("日志内容") + @Size(max = 1000, message="日志内容-content: 数据长度不能 > 1000" ) + private String content; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + @Size(max = 32, message="创建人-createdBy: 数据长度不能 > 32" ) + private String createdBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createdTime; + /** + * 修改人
+ */ + @ApiModelProperty("修改人") + @Size(max = 32, message="修改人-updatedBy: 数据长度不能 > 32" ) + private String updatedBy; + /** + * 修改时间
+ */ + @ApiModelProperty("修改时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updatedTime; + /** + * 逻辑删除
+ */ + @ApiModelProperty("逻辑删除") + private Boolean deleted; + /** + * 租户id
+ */ + @ApiModelProperty("租户id") + @Size(max = 32, message="租户id-tenantId: 数据长度不能 > 32" ) + private String tenantId; + + /** + * 内容
+ */ + @ApiModelProperty("删除内容列表") + private List names; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getModule() { + return module; + } + + public void setModule(String module) { + this.module = module; + } + + public String getRemoteAddr() { + return remoteAddr; + } + + public void setRemoteAddr(String remoteAddr) { + this.remoteAddr = remoteAddr; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + public Boolean getDeleted() { + return deleted; + } + + public void setDeleted(Boolean deleted) { + this.deleted = deleted; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public List getNames() { + return names; + } + + public void setNames(List names) { + this.names = names; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/log/LogPublisher.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/log/LogPublisher.java new file mode 100644 index 0000000..86db131 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/log/LogPublisher.java @@ -0,0 +1,12 @@ +package net.northking.cctp.executePlan.bus.log; + +import net.northking.cctp.common.dto.CpLogAddDto; + +public interface LogPublisher { + /** + * 发送消息 + * + * @param + */ + void deployLogContent(CpLogAddDto cpLogAddDto); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/log/LogRabbitMQPublisher.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/log/LogRabbitMQPublisher.java new file mode 100644 index 0000000..883b834 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/bus/log/LogRabbitMQPublisher.java @@ -0,0 +1,44 @@ +package net.northking.cctp.executePlan.bus.log; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.northking.cctp.common.dto.CpLogAddDto; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.executePlan.bus.BusConstants; +import net.northking.cctp.executePlan.exception.ExecPlanError; +import org.springframework.amqp.core.MessageBuilder; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; + +@Component +public class LogRabbitMQPublisher implements LogPublisher { + @Autowired + private RabbitTemplate rabbitTemplate; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private HttpServletRequest request; + + @Override + public void deployLogContent(CpLogAddDto cpLogAddDto) { + byte[] json; + try { + cpLogAddDto.setRemoteAddr(request.getRemoteAddr()); + json = objectMapper.writeValueAsBytes(cpLogAddDto); + } catch (JsonProcessingException e) { + throw new PlatformRuntimeException(ExecPlanError.PLAN_DELETE_LOG_ERROR); + } + MessageBuilder mb = MessageBuilder.withBody(json); + mb.setContentType(MediaType.APPLICATION_JSON_VALUE); + mb.setHeader(BusConstants.Key_CCTP_User_ID, NKSecurityContext.getUserId()); + mb.setHeader(BusConstants.Key_SaaS_Tenant_ID, NKSecurityContext.getTenantId()); + rabbitTemplate.send(BusConstants.Q_Platform_Log_Insert_REQ, mb.build()); + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/config/AtuPlanConfig.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/config/AtuPlanConfig.java new file mode 100644 index 0000000..098d5d6 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/config/AtuPlanConfig.java @@ -0,0 +1,24 @@ +package net.northking.cctp.executePlan.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties("atu.plan") +public class AtuPlanConfig { + /** + * 任务等待超时时间 单位:小时 默认24小时 + */ + private Integer waitTimeout = 24; + + public Integer getWaitTimeout() { + return waitTimeout; + } + + public void setWaitTimeout(Integer waitTimeout) { + if (waitTimeout <= 0) { + waitTimeout = 1; + } + this.waitTimeout = waitTimeout; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/config/WebhookConfig.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/config/WebhookConfig.java new file mode 100644 index 0000000..b5314d0 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/config/WebhookConfig.java @@ -0,0 +1,18 @@ +package net.northking.cctp.executePlan.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "atu.webhook") +public class WebhookConfig { + private String prefix; + + public String getPrefix() { + return prefix; + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/DictConstant.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/DictConstant.java new file mode 100644 index 0000000..01f2143 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/DictConstant.java @@ -0,0 +1,33 @@ +package net.northking.cctp.executePlan.constants; + +/** + *

Title: DictConstant

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/10/12 16:27 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class DictConstant { + + /** + * 计划触发方式 1-自动,2-手动,3-devops + */ + public static final String PLAN_TRIGGER_TYPE = "planTriggerType"; + + /** + * 脚本用例类型 0-接口,1-PC/BS,2-PC/CS,3-安卓,4-ios,5-场景用例 + */ + public static final String SCRIPT_CASE_TYPE = "scriptCaseType"; + + /** + * 计划任务状态 0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时 + */ + public static final String PLAN_TASK_STATUS = "planTaskStatus"; + + /** + * 移动平台类型 0-android,1-ios + */ + public static final String MOBILE_PLATFORM_TYPE = "platform"; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/MsgConstant.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/MsgConstant.java new file mode 100644 index 0000000..05d7739 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/MsgConstant.java @@ -0,0 +1,284 @@ +package net.northking.cctp.executePlan.constants; + +public class MsgConstant { + public static final String RESPONSE_VO_GET_EXE_PLAN_LAB_SUCCESSFULLY = "获取执行计划标签列表成功"; + public static final String RESPONSE_VO_EXECUTE_PLAN = "执行计划"; + public static final String RESPONSE_VO_ADD_TAGS_FAILURE = "添加标签失败"; + public static final String RESPONSE_VO_ADD_TAGS_SUCCESSFULLY= "执行计划添加标签成功"; + //createBys principalIds + public static final String CREATE_BY_INDEX= "-1"; + public static final String PRINCIPAL_ID_INDEX= "-1"; + //"#.##%" "%" + public static final String PATTERN_HASH_DOT_HASH_HASH= "#.##%"; + public static final String PERCENTAGE= "%"; + public static final String LETTER_S= "S"; + public static final String LETTER_M= "M"; + public static final String TEMPERATURE_DEGREE= "℃"; + //webhookExecPlan + public static final String WEBHOOK_EXEC_PLAN_SUCCESSFULLY= "执行计划成功"; + //scriptTypeMap + public static final String SCRIPT_TYPE_MAP_VALUE_5= "5"; + //AtuPlanScriptLinkMd + public static final String ATU_PLAN_SCRIPT_LINK_MD_SCRIPT_TYPE= "5"; + //AtuPlanScriptLinkDto + public static final String ATU_PLAN_SCRIPT_LINK_DTO_SCRIPT_TYPE= "5"; + //statusCacheKey + public static final String STATUS_CACHEKEY_SUCCESSNUM= "successNum"; + public static final String STATUS_CACHEKEY_FAILNUM= "failNum"; + public static final String STATUS_CACHEKEY_CANCELNUM= "cancelNum"; + public static final String STATUS_CACHEKEY_TIMEOUTNUM= "timeoutNum"; + //"application/vnd.ms-excel;charset=utf-8" + public static final String CONTENT_VNDMS_EXCEL_UTF8= "application/vnd.ms-excel;charset=utf-8"; + public static final String CONTENT_PDF_UTF8= "application/PDF;charset=utf-8"; + //CharacterEncoding + public static final String CHARATER_ENCODING_UTF8= "UTF-8"; + public static final String ENC_TITLE_PDF= ".pdf"; + public static final String ENC_UTF8= "utf-8"; + //HttpServletResponse + public static final String HTTP_SER_RESPONSE_KEY_CONTENT_DISPOSITION= "Content-Disposition"; + public static final String HTTP_SER_RESPONSE_KEY_CONTENT_TYPE= "Content-Type"; + public static final String HTTP_SER_RESPONSE_VALUE_ATTACHMENT= "attachment;filename="; + public static final String HTTP_SER_RESPONSE_VALUE_APPLICATION_OCTET_STREAM= "application/octet-stream"; + public static final String HTTP_SER_RESPONSE_VALUE_DOCX= ".docx"; + + public static final String DATA_MAP_START_TIME= "startTime"; + public static final String DATA_MAP_TRIGGER_TYPE= "triggerType"; + public static final String DATA_MAP_ELAPSED_TIMED= "elapsedTime"; + public static final String DATA_MAP_ENV_NAME= "envName"; + public static final String DATA_MAP_END_TIME= "endTime"; + public static final String DATA_MAP_CASE_TOTAL= "caseTotal"; + public static final String DATA_MAP_SCRIPT_TOTAL= "scriptTotal"; + public static final String DATA_MAP_TEST_DEVICE_NUM= "testDeviceNum"; + public static final String DATA_MAP_RETRY_DEVICE_NUM= "retryDeviceNum"; + public static final String DATA_MAP_PACKAGE= "package"; + public static final String DATA_MAP_APP_PACKAGE= "appPackage"; + //ClassPathResource + public static final String CLASS_PATH_RESOURCE_PDF_TEMP= "templates/pdfTemp.pdf"; + public static final String CLASS_PATH_RESOURCE_TASK_REPORT_TEMPLATE_DOCX= "templates/taskReportTemplate.docx"; + //WordUtils + public static final String WORDUTILS_TITLE_TASK_SUMM_REPORT= "一、任务汇总报告:"; + public static final String WORDUTILS_TITLE_RESULT_DISTRIBUTION_CHART= "二、任务执行结果分布图:"; + public static final String WORDUTILS_TITLE_EXEC_FAILED_CASES_LIST= "三、执行失败案例列表:"; + + //"base64," + public static final String REGEX_BASE64= "base64,"; + public static final String UITEST_SCRIPTCODE= "UITEST-ScriptCode:"; + //JSONArray JSONObject + public static final String JSONARRAY_KEY_VARIABLES= "variables"; + public static final String JSONARRAY_KEY_VARIABLES_FIELD= "Variables"; + public static final String JSONARRAY_KEY_NODES= "nodes"; + public static final String JSONOBJECT_KEY_NODETYPE= "nodeType"; + public static final String JSONARRAY_KEY_REF= "$ref"; + + //FieldPositions + public static final String FIELD_POSITION_SCRIPT_EXECSUM= "scriptExecSum"; + //tableHeardList + public static final String TABLE_HEARD_LIST_SCRIPT_NUM= "脚本编号"; + public static final String TABLE_HEARD_LIST_SCRIPT_NAME= "脚本名称"; + public static final String TABLE_HEARD_LIST_TEST_CASE_NAME= "用例名称"; + public static final String TABLE_HEARD_LIST_TEST_CASE_TYPE= "用例类型"; + public static final String TABLE_HEARD_LIST_TIME_CONSUMING= "耗时(毫秒)"; + public static final String TABLE_HEARD_LIST_EXEC_DEVICE= "执行设备"; + public static final String TABLE_HEARD_LIST_EXEC_STATUS= "执行状态"; + public static final String TABLE_HEARD_LIST_FAILURE_REASON= "失败原因"; + //TABLE_TITLE + public static final String TABLE_TITLE_SCRIPT_EXECUTION_DETAILS= "脚本执行详情"; + public static final String TABLE_TITLE_APP_LIST= "应用列表"; + + public static final String FONT_NAME_STSONG_LIGHT= "STSong-Light"; + public static final String FONT_ENCODING_UNIGB_UCS2_H= "UniGB-UCS2-H"; + //IconPathList + public static final String ICON_PATH_APP_APPINSTALLTIME_PNG= "static/icon/app/appInstallTime.png"; + public static final String ICON_PATH_APP_APPSTARTTIME_PNG= "static/icon/app/appStartTime.png"; + public static final String ICON_PATH_APP_CPU_PNG= "static/icon/app/cpu.png"; + public static final String ICON_PATH_APP_FLOW_PNG= "static/icon/app/flow.png"; + public static final String ICON_PATH_APP_MEMORY_PNG= "static/icon/app/memory.png"; + public static final String ICON_PATH_DEVICE_CPU_PNG= "static/icon/device/cpu.png"; + public static final String ICON_PATH_DEVICE_FLOW_PNG= "static/icon/device/flow.png"; + public static final String ICON_PATH_DEVICE_MEMORY_PNG= "static/icon/device/memory.png"; + public static final String ICON_PATH_DEVICE_TEMPERATURE_PNG= "static/icon/device/temperature.png"; + + + //maxStr + public static final String MAX_STR= "最大值"; + //headList + public static final String HEAD_LIST_APP_NAME= "App名称"; + public static final String HEAD_LIST_APP_VERSION= "App版本"; + public static final String HEAD_LIST_PACKAGE_NAME= "包名"; + public static final String HEAD_LIST_CHANNEL_NAME= "渠道名称"; + public static final String HEAD_LIST_VERSION_NOTES= "版本备注"; + //planBatch + public static final String PLAN_BATCH_SUCCESS_RATE= "0.00%"; + public static final String ZERO_DOT= "0.00"; + //CASEMAP + public static final String CASEMAP_HAS_PC= "hasPc"; + public static final String CASEMAP_HAS_MOB= "hasMob"; + public static final String CASEMAP_HAS_INTERFACE= "hasInterface"; + //offlineMap + public static final String OFFLINE_MAP_DEVICE_ID= "deviceId"; + + public static final String LAST_HEART_BEAT_TIME= "lastHeartBeatTime"; + + public static final String DateUtil_format= "yyyy-MM-dd.HH.mm.ss.SSS"; + //appMap + public static final String PLATFORM= "platform"; + public static final String APP_PACKAGE= "appPackage"; + + public static final String PLATFORM_TYPE_ANDROID= "Android"; + public static final String PLATFORM_TYPE_IOS= "IOS"; + public static final String PLATFORM_TYPE_HARMONY= "Harmony"; + public static final String ERROR_PLATFORM_TYPE_PC= "【PC】"; + public static final String ERROR_PLATFORM_TYPE_IOS= "【IOS】"; + public static final String ERROR_PLATFORM_TYPE_ANDROID= "【Android】"; + // + public static final String QUERY_MOBDEVICE_PLATFORM_TYPE_IOS= "hasIOS"; + public static final String QUERY_MOBDEVICE_PLATFORM_TYPE_ANDROID= "hasAndroid"; + public static final String PLATFORM_TYPE_HAS_PC= "hasPC"; + public static final String PLATFORM_TYPE_HAS_MOB= "hasMob"; + public static final String MAP_JSON_APPALIVE= "appAlive"; + + public static final String DATE_FORMAT_PATTERN= "yyyy-MM-dd HH:mm:ss"; + + public static final String SYNC_ATUPLAN_INFO= "syncAtuPlanInfo"; + public static final String SYNC_ATUPLAN_BATCH= "syncAtuPlanBatch"; + public static final String SYNC_ATUPLAN_SCRIPTLINK= "syncAtuPlanScriptLink"; + public static final String SYNC_ATUPLAN_ENVLINK= "syncAtuPlanEnvLink"; + public static final String SYNC_ATUPLAN_TASK= "syncAtuPlanTask"; + public static final String DW_ATUPLANINFO_INSERT_REQ= "Dw.AtuPlanInfo.Insert.REQ"; + public static final String DW_ATUPLANBATCH_INSERT_REQ= "Dw.AtuPlanBatch.Insert.REQ"; + public static final String DW_ATUPLANSCRIPTLINK_INSERT_REQ= "Dw.AtuPlanScriptLink.Insert.REQ"; + public static final String DW_ATUPLANEnvLink_INSERT_REQ= "Dw.AtuPlanEnvLink.Insert.REQ"; + public static final String DW_ATUPLANTASK_INSERT_REQ= "Dw.AtuPlanTask.Insert.REQ"; + + public static final String DEV_OFFLINE_TIMEOUT = "设备离线超时"; + + public static final String ID = "id"; + + public static final String STR_TRUE = "true"; + + public static final String EXE_PLAN = "执行计划"; + + public static final String DEVICE_ID = "deviceId"; + + public static final String TYPE = "type"; + + public static final String DEVICE_NAME = "deviceName"; + + public static final String STATUS = "status"; + + public static final String SCRIPT_NAME = "scriptName"; + + public static final String TOKEN = "token"; + + public static final String URL = "url"; + + public static final String LOG_DELETE = "3"; + + public static final String SUCCESS_RATE = "successRate"; + + public static final String EXEC_FAIL_RATE = "execFailRate"; + + public static final String ASSER_FAIL_RATE = "assertFailRate"; + + public static final String CANCEL_RATE = "cancelRate"; + + public static final String TIME_OUT_RATE = "timeoutRate"; + + public static final String SCRIPT_LIST = "scriptList"; + + public static final String PARENT_LIST = "parentList"; + + public static final String SCENE_LIST = "sceneList"; + + public static final String INSERT_LIST = "insertList"; + + public static final String ITEM_CODE = "itemCode"; + + public static final String ITEM_NAME = "itemName"; + + public static final String INPUT = "input"; + + public static final String START = "start"; + public static final String END = "end"; + + public static final String SCRIPT_ID = "scriptId"; + public static final String SCRIPT_URL = "scriptUrl"; + + public static final String NAME = "name"; + public static final String DEFAULT_VALUE = "defaultValue"; + public static final String COMMANDS = "commands"; + public static final String COMMAND = "command"; + public static final String EXTATTRS = "extAttrs"; + public static final String EXTATTRS_STEPTYPE = "stepType"; + public static final String TITLE = "title"; + public static final String STEPNAME = "stepName"; + public static final String COMMAND_NAME = "commandName"; + public static final String TARGETS= "targets"; + public static final String USING= "using"; + public static final String VALUE= "value"; + public static final String SELECTOR= "selector"; + public static final String COMPONENTLIB= "componentLib"; + public static final String STEPDETAILDTO_StepType_0= "0"; + public static final String STEPDETAILDTO_StepType_1= "1"; + public static final String STEPDETAILDTO_StepType_2= "2"; + public static final String STEPDETAILDTO_StepType_3= "3"; + public static final String FULL_IMAGE= "fullImage"; + public static final String SKIP= "skip"; + public static final String KEYWORDRETURN= "keywordReturn"; + public static final String CHILDREN= "children"; + public static final String ARGS= "args"; + public static final String RESID= "resId"; + public static final String RESOURCES= "resources"; + public static final String SCRIPT_DEPENDENCIES= "scriptDependencies"; + public static final String RESURI= "resUri"; + public static final String TASKID= "taskId"; + public static final String FILEPATH= "filePath"; + public static final String ANDROID= "android"; + public static final String IOS= "ios"; + public static final String EMPTY= "无"; + + public static final String OUTPUT = "output"; + public static final String EXEC_USER = "execUser"; + public static final String PROJECT_NAME= "projectName"; + public static final String EXEC_STATUS= "execStatus"; + public static final String PLAN_NAME= "planName"; + public static final String EXEC_TIME = "execTime"; + public static final String SUN_COUNT = "sunCount"; + public static final String SUCCESS_COUNT = "successCount"; + public static final String FAIL_COUNT = "failCount"; + public static final String CANCEL_COUNT = "cancelCount"; + public static final String TIMEOUT_COUNT = "timeOutCount"; + public static final String MSG_TEMP_ID = "messageTemplateId"; + public static final String SOUR_PLAT = "sourcePlatform"; + public static final String USER_ACCOUNTS = "userAccounts"; + public static final String CONT_PARA = "contentParameter"; + + public static final String SIMSUN = "宋体"; + + public static final String SCH_INS_NAME = "org.quartz.scheduler.instanceName"; + public static final String ATU_PLAN_SCH = "atuPlanScheduler"; + public static final String AUTO = "AUTO"; + public static final String SCH_INS_ID = "org.quartz.scheduler.instanceId"; + public static final String THR_POOL_CLASS = "org.quartz.threadPool.class"; + public static final String THR_POOL_THR_COUNT = "org.quartz.threadPool.threadCount"; + public static final String THR_POOL_THR_COUNT_CONFIGURATION= "20"; + public static final String THR_POOL_THR_PRI = "org.quartz.threadPool.threadPriority"; + public static final String THR_POOL_THR_PRI_CONFIGURATION = "5"; + public static final String JOBSTO_CLASS = "org.quartz.jobStore.class"; + public static final String JOBSTO_ISCLU = "org.quartz.jobStore.isClustered"; + public static final String JOBSTO_ACQUIRE_LOCK = "org.quartz.jobStore.acquireTriggersWithinLock"; + public static final String JOBSTO_CLU_CHECK_INTER = "org.quartz.jobStore.clusterCheckinInterval"; + public static final String JOBSTO_CLU_CHECK_INTER_CONFIGURATION = "15000"; + public static final String JOBSTO_MAX_MIS_TO_HANDLE_AT_TIME = "org.quartz.jobStore.maxMisfiresToHandleAtATime"; + public static final String JOBSTO_MAX_MIS_TO_HANDLE_AT_TIME_CONFIGURATION = "1"; + public static final String JOBSTO_TX_ISO_LEVEL = "org.quartz.jobStore.txIsolationLevelSerializable"; + public static final String JOBSTO_MIS_FIRE_THRE = "org.quartz.jobStore.misfireThreshold"; + public static final String JOBSTO_MIS_FIRE_THRE_CONFIGURATION = "12000"; + public static final String JOBSTO_TABLE_PRE = "org.quartz.jobStore.tablePrefix"; + public static final String SIMP_THRE_POOL = "org.quartz.simpl.SimpleThreadPool"; + public static final String JDBC_JOBSTORE_TX = "org.quartz.impl.jdbcjobstore.JobStoreTX"; + public static final String APP_CON_KEY = "applicationContextKey"; + + public static final String QRTZ = "QRTZ_"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/PlanConstant.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/PlanConstant.java new file mode 100644 index 0000000..5826170 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/PlanConstant.java @@ -0,0 +1,327 @@ +package net.northking.cctp.executePlan.constants; + +/** + *

Title: PlanConstant

+ *

Description: 计划常量

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/09 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class PlanConstant { + + public static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + public static final String PC = "pc"; + + public static final String MOBILE = "mob"; + + public static final String API = "api"; + + public static final String SCRIPT_TYPE_API = "0"; + public static final String SCRIPT_TYPE_BS = "1"; + public static final String SCRIPT_TYPE_CS = "2"; + public static final String SCRIPT_TYPE_ANDROID = "3"; + public static final String SCRIPT_TYPE_IOS = "4"; + public static final String SCRIPT_TYPE_SCENE = "5"; + + /** + * 脚本测试意图id key + */ + public static final String SCRIPT_TEST_PURPOSE_ID = "__row_id__"; + + /** + * 脚本测试意图名称key + */ + public static final String SCRIPT_TEST_PURPOSE_NAME = "测试轮次名"; + + /** + * 设备离线key + */ + public static final String DEVICE_OFFLINE_KEY = "allOffline"; + + /** + * 设备未离线 + */ + public static final int DEVICE_OFFLINE_NO = 0; + /** + * 设备部分离线 + */ + public static final int DEVICE_OFFLINE_PORTION = 1; + /** + * 设备全部离线 + */ + public static final int DEVICE_OFFLINE_ALL = 2; + + + /** + * 引擎类型-PC + */ + public static final String ENGINE_TYPE_PC = "1"; + + /** + * 引擎类型-移动端 + */ + public static final String ENGINE_TYPE_MOBILE = "2"; + + /** + * 引擎类型-接口 + */ + public static final String ENGINE_TYPE_API = "3"; + + /** + * 设备类型-移动 + */ + public static final String DEVICE_TYPE_MOBILE = "1"; + + /** + * 设备类型-PC + */ + public static final String DEVICE_TYPE_PC = "2"; + + + /** + * 计划批次委托URL + */ + public static final String PLAN_BATCH_ENTRUST_URL = "/v1/plan/entrust"; + + /** + * 计划批次取消URL + */ + public static final String PLAN_BATCH_CANCEL_URL = "/v1/plan/remove"; + + /** + * 任务等待状态 + */ + public static final String TASK_WAIT_EXECUTE_STATUS = "0"; + + /** + * 任务开始执行状态 + */ + public static final String TASK_START_EXECUTE_STATUS = "1"; + + /** + * 任务执行成功状态 + */ + public static final String TASK_EXECUTE_SUCCESS_STATUS = "2"; + + /** + * 任务执行失败状态 + */ + public static final String TASK_EXECUTE_FAIL_STATUS = "3"; + + /** + * 任务断言失败状态 + */ + public static final String TASK_ASSERT_FAIL_STATUS = "4"; + + /** + * 任务取消状态 + */ + public static final String TASK_CANCEL_STATUS = "5"; + + /** + * 任务超时状态 + */ + public static final String TASK_TIMEOUT_STATUS = "6"; + /** + * 任务重试 + */ + public static final String TASK_RETRY_STATUS = "10"; + /** + * 正常执行 + */ + public static final String TASK_EXECUTE_TYPE_NORMAL = "0"; + /** + * 自动重试 + */ + public static final String TASK_EXECUTE_TYPE_AUTO_RETRY = "1"; + /** + * 手动重试 + */ + public static final String TASK_EXECUTE_TYPE_MANUAL_RETRY = "2"; + /** + * 重试策略 :失败任务打包重试 + */ + public static final String TASK_RETRY_STRATEGY_PACKAGE = "1"; + /** + * 重试策略:任务失败立刻重试 + */ + public static final String TASK_RETRY_STRATEGY_SINGLE = "2"; + /** + * 任务总数key + */ + public static final String TASK_TOTAL = "total"; + + /** + * 等待中脚本书 + */ + public static final String WAIT_TOTAL = "waitTotal"; + + /** + * 输入项数据集合 + */ + public static final String SCRIPT_INPUT_LIST = "inputDataList"; + + /** + * 脚本总数 + */ + public static final String SCRIPT_TOTAL = "scriptTotal"; + + /** + * 批次开始时间key + */ + public static final String BATCH_START_TIME = "startTime"; + + /** + * 计划批次号key + */ + public static final String PLAN_BATCH_NUM = "batch"; + + /** + * 计划批次ID + */ + public static final String PLAN_BATCH_ID = "batchId"; + + /** + * 批次等待状态 + */ + public static final String BATCH_WAITING_STATUS = "0"; + + /** + * 批次执行中状态 + */ + public static final String BATCH_EXECUTING_STATUS = "1"; + + /** + * 批次已完成状态 + */ + public static final String BATCH_FINISH_STATUS = "2"; + + /** + * 批次已取消状态 + */ + public static final String BATCH_CANCEL_STATUS = "3"; + + /** + * 计划新建状态 + */ + public static final String PLAN_NEW_STATUS = "0"; + + /** + * 计划等待中状态 + */ + public static final String PLAN_WAITING_STATUS = "1"; + + /** + * 计划执行中状态 + */ + public static final String PLAN_EXECUTING_STATUS = "2"; + + /** + * 计划已完成状态 + */ + public static final String PLAN_FINISH_STATUS = "3"; + + /** + * 计划已取消状态 + */ + public static final String PLAN_CANCEL_STATUS = "4"; + + + /** + * 计划步骤移动类型 + */ + public static final String MOBILE_COMPONENT_LIB = "NK.mobile"; + + + /** + * 计划步骤PC类型 + */ + public static final String PC_COMPONENT_LIB = "NK.Desktop"; + + /** + * 计划步骤内部类型(分区组件,接口组件,业务组件) + */ + public static final String INTERNAL_COMPONENT_LIB = "NK.internal"; + + /** + * 接口步骤 + */ + public static final String INTERFACE_COMPONENT_LIB = "NK.Interface"; + + + /** + * 分区标识 + */ + public static final String GROUP_COMMAND = "group"; + + /** + * 接口步骤 + */ + public static final String INTERFACE_STEP_TYPE = "interface"; + + /** + * 业务组件 + */ + public static final String BUSINESS_STEP_TYPE = "business"; + + /** + * 最大步骤解析层数 + */ + public static final int MAX_STEP_ANALYSIS_NUM = 10; + + /** + * 创建时间 + */ + public static final String CREATED_TIME = "created_time"; + + /** + * 平台类型-安卓 + */ + public static final String PLATFORM_TYPE_ANDROID = "0"; + + /** + * 平台类型-ios + */ + public static final String PLATFORM_TYPE_IOS = "1"; + + /** + * 平台类型-Harmony + */ + public static final String PLATFORM_TYPE_HARMONY = "2"; + + /** + * 计划触发方式 1 自动 + */ + public static final String TRIGGER_TYPE_AUTO = "1" ; + /** + * 计划触发方式 2 手动 + */ + public static final String TRIGGER_TYPE_MANUAL = "2" ; + /** + * 计划触发方式 3 devops + */ + public static final String TRIGGER_TYPE_DEVOPS = "3" ; + //禁用计划 + public static final Integer PLAN_UN_ENABLE = 0; + //启用计划 + public static final Integer PLAN_ENABLE = 1; + + /** + * 线程池最大处理数量 + */ + public static final int EXECUTOR_MAX_PROCESS_NUM = 500; + + /** + * 输入项数据集引用类型-静态数据 + */ + public static final String INPUT_SET_QUOTE_TYPE_STATIC = "1"; + /** + * 输入项数据集引用类型-模糊数据 + */ + public static final String INPUT_SET_QUOTE_TYPE_FUZZY = "2"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/QuartzConstant.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/QuartzConstant.java new file mode 100644 index 0000000..f52583b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/QuartzConstant.java @@ -0,0 +1,24 @@ +package net.northking.cctp.executePlan.constants; + +/** + *

Title: QuartzConstant

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/29 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class QuartzConstant { + + public static final String PLAN_TASK_PROPERTIES = "PLAN_TASK_PROPERTIES_"; + + public static final String PLAN_TASK_EXECUTE_BEAN = "planTaskExecute"; + + public static final String PLAN_TASK_EXECUTE_METHOD = "execute"; + + public static final String JOB_GROUP_DEFAULT = "AtuExecPlan"; + + public static final String PLAN_TASK_CLASS_NAME = "PLAN_TASK_CLASS_NAME_"; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/RabbitConstant.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/RabbitConstant.java new file mode 100644 index 0000000..30d334d --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/RabbitConstant.java @@ -0,0 +1,84 @@ +package net.northking.cctp.executePlan.constants; + +/** + *

Title: RabbitConstant

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/08 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class RabbitConstant { + + /** + * 系统默认交换机 + */ + public static final String PROJECT_EXCHANGE_KEY = "atu.execute.plan"; + + /** + * PC任务执行信息队列前缀 + */ + public static final String TASK_EXEC_QUEUE_PC_KEY = "execute.plan.pc."; + + /** + * 移动任务执行信息队列前缀 + */ + public static final String TASK_EXEC_QUEUE_MOB_KEY = "execute.plan.mob."; + + /** + * 接口任务执行信息队列前缀 + */ + public static final String TASK_EXEC_QUEUE_API_KEY = "execute.plan.api."; + + /** + * 计划用例队列 + */ + public static final String PLAN_CASE_KEY = "execute.plan.case"; + + /** + * 计划批次委托队列 + */ + public static final String PLAN_BATCH_ENTRUST = "execute.plan.batch.entrust"; + + /** + * 计划任务执行结果队列 + */ + public static final String TASK_EXEC_RESULT = "execute.plan.task.exec.result"; + + /** + * 设备离线队列 + */ + public static final String DEVICE_OFFLINE_QUEUE = "device.status.queue"; + + /** + * 任务超时延迟交换机 + */ + public static final String TASK_TIMEOUT_DELAY_EXCHANGE_NAME = "plan.task.timeout.delay.exchange"; + + /** + * 任务超时延迟队列 + */ + public static final String TASK_TIMEOUT_DELAY_QUEUE_NAME = "plan.task.timeout.delay.queue"; + + /** + * 任务超时延迟路由 + */ + public static final String TASK_TIMEOUT_DELAY_ROUTING_KEY = "plan.task.timeout.delay"; + + /** + * 更新任务输入参数的队列 + */ + public static final String TASK_INPUT_PARAM_UPDATE = "execute.plan.task.input_param.update"; + + /** + * 批次统计数据更新队列 + */ + public static final String BATCH_SUM_UPDATE_QUEUE = "execute.plan.batch.sum.update"; + + /** + * 任务执行心跳 + */ + public static final String TASK_EXEC_HEARTBEAT_QUEUE = "plan.task.exec.heartbeat"; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/RedisConstant.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/RedisConstant.java new file mode 100644 index 0000000..0b8a9bf --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/RedisConstant.java @@ -0,0 +1,62 @@ +package net.northking.cctp.executePlan.constants; + +import java.util.concurrent.TimeUnit; + +/** + *

Title: RedisConstant

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/08 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class RedisConstant { + /** + * 计划批次序号key + */ + public static final String PLAN_BATCH_NUM_KEY = "UITEST-plan:batch:"; + + /** + * 计划批次离线设备 + */ + public static final String PLAN_BATCH_OFFLINE_DEVICE = "UITEST-plan:batch:offline:device:"; + + public static final long PLAN_BATCH_OFFLINE_DEVICE_EXP_TIME = 1L; + + public static final TimeUnit PLAN_BATCH_OFFLINE_DEVICE_TIME_UNIT = TimeUnit.HOURS; + + public static final String PLAN_BATCH_RETRY_COUNT = "plan:batch:retry-count:"; + + /** + * 批次脚本统计数据 + */ + public static final String BATCH_SCRIPT_SUM_KEY = "UITEST-plan:batch:script:sum:"; + + /** + * 批次脚本任务数据 + */ + public static final String BATCH_SCRIPT_TASK_KEY = "UITEST-plan:batch:script:task:"; + + /** + * 批次脚本状态数据 + */ + public static final String BATCH_SCRIPT_STATUS_KEY = "UITEST-plan:batch:script:status:"; + + /** + * 集群key前缀 + */ + public static final String CLUSTER_KEY_PREFIX = "{cluster_"; + + /** + * 集群key后缀 + */ + public static final String CLUSTER_KEY_SUFFIX = "}_"; + + /** + * 批次消息发送锁前缀 + */ + public static final String BATCH_MESSAGE_LOCK_PRE = "BATCH_MESSAGE_LOCK_PRE"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/CreatedTaskConsumer.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/CreatedTaskConsumer.java new file mode 100644 index 0000000..a568271 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/CreatedTaskConsumer.java @@ -0,0 +1,157 @@ +package net.northking.cctp.executePlan.consumer; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.rabbitmq.client.Channel; +import net.northking.cctp.executePlan.api.service.AtuPlanBatchApiService; +import net.northking.cctp.executePlan.api.service.AtuPlanTaskApiService; +import net.northking.cctp.executePlan.constants.MsgConstant; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.constants.RabbitConstant; +import net.northking.cctp.executePlan.constants.RedisConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.dto.planBatch.AtuBatchCaseInfoDto; +import net.northking.cctp.executePlan.dto.planTask.QuoteData; +import net.northking.cctp.executePlan.feign.PublicFeignClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.*; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; +import java.util.Date; +import java.util.Map; + +/** + *

Title: CreatedTaskConsumer

+ *

Description: 用例生成任务并推送至队列

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/09 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@Component +public class CreatedTaskConsumer { + + private final static Logger logger = LoggerFactory.getLogger(CreatedTaskConsumer.class); + + @Autowired + private AtuPlanTaskApiService atuPlanTaskApiService; + + @Autowired + private AtuPlanBatchApiService planBatchApiService; + + @Autowired + private AmqpAdmin amqpAdmin; + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private PublicFeignClient publicFeignClient; + + @PostConstruct + public void init(){ + // 初始化队列并绑定到交换机 + Exchange exchange = new DirectExchange(RabbitConstant.PROJECT_EXCHANGE_KEY); + amqpAdmin.declareExchange(exchange); + Queue queue = new Queue(RabbitConstant.PLAN_CASE_KEY); + amqpAdmin.declareQueue(queue); + Binding binding = BindingBuilder.bind(queue).to(exchange) + .with(RabbitConstant.PLAN_CASE_KEY).noargs(); + amqpAdmin.declareBinding(binding); + } + + /** + * 计划用例生成任务 + * @param message 对象消息 + */ + @Transactional(rollbackFor = Exception.class) + @RabbitListener(queues = RabbitConstant.PLAN_CASE_KEY) + public void receive(Message message, Channel channel) throws Exception{ + try { + logger.info("计划用例生成任务 ==> " + new String(message.getBody())); + JSONObject event = JSONUtil.parseObj(new String(message.getBody())); + AtuBatchCaseInfoDto batchCaseInfo = JSONUtil.toBean(event, AtuBatchCaseInfoDto.class); + createdTask(batchCaseInfo); + }catch (Exception e){ + logger.error("任务生成失败", e); + } + } + + + /** + * 生成并保存任务信息 + * @param batchCaseInfo 用例信息 + */ + private void createdTask(AtuBatchCaseInfoDto batchCaseInfo){ + AtuPlanTask planTask = new AtuPlanTask(); + BeanUtil.copyProperties(batchCaseInfo, planTask); + String taskId = StrUtil.isEmpty(batchCaseInfo.getTaskId()) ? IdUtil.simpleUUID() : batchCaseInfo.getTaskId(); + planTask.setId(taskId); + planTask.setScriptJson(batchCaseInfo.getScriptPath()); + if (CollUtil.isNotEmpty(batchCaseInfo.getCaseParam())) { + Map paramsMap = atuPlanTaskApiService.handleQuoteData(batchCaseInfo.getCaseParam(), + planTask.getEnvId(), batchCaseInfo.getProjectId()); + planTask.setCaseParam(JSONUtil.toJsonStr(paramsMap)); + } + // 用例名称为引用数据或名称过长处理 + updateCaseName(planTask); + + // 用例编号 + Object resultCode = redisTemplate.opsForValue().get(MsgConstant.UITEST_SCRIPTCODE + batchCaseInfo.getScriptId()); + if (resultCode != null && !resultCode.equals("")) { + planTask.setCaseNo(resultCode.toString()); + } + planTask.setCreatedTime(new Date()); + atuPlanTaskApiService.insert(planTask); + + // 增加批次脚本任务缓存 + String scriptTaskKey = RedisConstant.BATCH_SCRIPT_TASK_KEY + planTask.getBatchId() + ":" + planTask.getScriptId(); + String clusterPrefix = RedisConstant.CLUSTER_KEY_PREFIX + planTask.getBatchId().substring(0,4) + + RedisConstant.CLUSTER_KEY_SUFFIX; + redisTemplate.opsForHash().put(clusterPrefix + scriptTaskKey, clusterPrefix + planTask.getId(), planTask.getId()); + + // 生成任务执行信息 + // 任务生成异常,结束该任务 + try { + atuPlanTaskApiService.createTaskExecuteInfo(planTask, batchCaseInfo); + }catch (Exception e){ + logger.error("生成任务执行信息并推送至队列异常", e); + atuPlanTaskApiService.taskExecFailUpdate(planTask, PlanConstant.TASK_EXECUTE_FAIL_STATUS, + "生成任务执行信息并推送至队列异常," + e.getMessage()); + } + } + + private void updateCaseName(AtuPlanTask planTask){ + String data = planTask.getCaseName(); + try { + QuoteData quoteData = BeanUtil.toBean(data, QuoteData.class); + quoteData.setEnvId(planTask.getEnvId()); + if (quoteData.getTip() != null) { + logger.debug("查询引用数据:{}", JSONUtil.toJsonStr(quoteData)); + QuoteData result = publicFeignClient.selectDataUrlAndTreeName(quoteData); + if (result != null) { + logger.debug("引用的数据为:{}", result.getValue()); + data = result.getValue(); + } + } + }catch (Exception e){ + logger.error("获取引用数据失败", e); + } + if (data.length() >= 90){ + logger.debug("用例名称过长,截取部分数据 => {}", data); + data = data.substring(0, 85); + } + planTask.setCaseName(data); + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/DeviceOfflineConsumer.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/DeviceOfflineConsumer.java new file mode 100644 index 0000000..cec7ced --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/DeviceOfflineConsumer.java @@ -0,0 +1,76 @@ +package net.northking.cctp.executePlan.consumer; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import net.northking.cctp.executePlan.api.service.AtuPlanBatchApiService; +import net.northking.cctp.executePlan.constants.RabbitConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatchDeviceLink; +import net.northking.cctp.executePlan.db.service.AtuPlanBatchDeviceLinkService; +import net.northking.cctp.executePlan.dto.planBatch.DeviceOfflineMsgDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +/** + *

Title: DeviceOfflineConsumer

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/24 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@Component +public class DeviceOfflineConsumer { + + private final static Logger logger = LoggerFactory.getLogger(DeviceOfflineConsumer.class); + + @Autowired + private AtuPlanBatchDeviceLinkService planBatchDeviceLinkService; + + @Autowired + private AtuPlanBatchApiService planBatchApiService; + + @RabbitListener(queues = RabbitConstant.DEVICE_OFFLINE_QUEUE) + public void receive(Message message){ + try { + logger.info("设备离线消息 ==> " + new String(message.getBody())); + JSONObject event = JSONUtil.parseObj(new String(message.getBody())); + DeviceOfflineMsgDto deviceOfflineMsgDto = JSONUtil.toBean(event, DeviceOfflineMsgDto.class); + + // 查询该设备绑定的未完成的批次 + logger.debug("查询该设备绑定的未完成的批次"); + List batchDeviceLinkList = + planBatchDeviceLinkService.queryByOfflineDeviceId(deviceOfflineMsgDto.getDeviceId()); + logger.debug("未完成的批次数量 => " + batchDeviceLinkList.size()); + if (CollUtil.isEmpty(batchDeviceLinkList)) { + return; + } + logger.debug("更新批次中该设备为离线"); + for (AtuPlanBatchDeviceLink batchDeviceLink : batchDeviceLinkList) { + // 更新批次绑定的设备为离线,更新离线时间 + batchDeviceLink.setOffline(true); + batchDeviceLink.setOfflineTime(deviceOfflineMsgDto.getLastHeartbeatTime()); + planBatchDeviceLinkService.updateByPrimaryKey(batchDeviceLink); + } + List batchIdList = batchDeviceLinkList.stream().map(AtuPlanBatchDeviceLink::getBatchId) + .collect(Collectors.toList()); + logger.debug("包含该离线设备的批次集合 => " + JSONUtil.toJsonStr(batchIdList)); + + long lastOfflineTime = deviceOfflineMsgDto.getLastHeartbeatTime().getTime(); + // 判断批次的所有设备是否都离线超过20分钟 + for (String batchId : batchIdList) { + planBatchApiService.processBatchTaskTimeout(batchId, lastOfflineTime); + } + }catch (Exception e){ + logger.error("离线消息处理异常", e); + } + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/PublishEntrustConsumer.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/PublishEntrustConsumer.java new file mode 100644 index 0000000..958c937 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/PublishEntrustConsumer.java @@ -0,0 +1,137 @@ +package net.northking.cctp.executePlan.consumer; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import net.northking.cctp.executePlan.api.service.AtuPlanBatchApiService; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.constants.RabbitConstant; +import net.northking.cctp.executePlan.db.service.AtuPlanBatchDeviceLinkService; +import net.northking.cctp.executePlan.db.service.AtuPlanTaskService; +import net.northking.cctp.executePlan.dto.planEntrust.AtuEntrustInfoDto; +import net.northking.cctp.executePlan.dto.planEntrust.AtuEntrustMsgDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.*; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.PostConstruct; + +/** + *

Title: PublishEntrustConsumer

+ *

Description: 发布委托

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/09 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@Component +@RefreshScope +public class PublishEntrustConsumer { + + private final static Logger logger = LoggerFactory.getLogger(PublishEntrustConsumer.class); + + /** + * 最大重试次数 + */ + @Value("${atu.plan.entrust.maxRetryNum}") + public static final int MAX_RETRY_NUM = 30; + + /** + * 重试等待时间 + */ + @Value("${atu.plan.entrust.retryWaitTime}") + public static final int RETRY_WAIT_TIME = 1000 * 10; + + @Autowired + private AtuPlanTaskService atuPlanTaskService; + + @Autowired + private AmqpAdmin amqpAdmin; + + @Autowired + private AmqpTemplate amqpTemplate; + + @Autowired + private AtuPlanBatchApiService planBatchApiService; + + @Autowired + private AtuPlanBatchDeviceLinkService planBatchDeviceLinkService; + + @PostConstruct + public void init(){ + // 初始化队列并绑定到交换机 + Exchange exchange = new DirectExchange(RabbitConstant.PROJECT_EXCHANGE_KEY); + amqpAdmin.declareExchange(exchange); + Queue queue = new Queue(RabbitConstant.PLAN_BATCH_ENTRUST); + amqpAdmin.declareQueue(queue); + Binding binding = BindingBuilder.bind(queue).to(exchange) + .with(RabbitConstant.PLAN_BATCH_ENTRUST).noargs(); + amqpAdmin.declareBinding(binding); + } + + /** + * 发布委托 + * @param message 对象消息 + */ + @RabbitListener(queues = RabbitConstant.PLAN_BATCH_ENTRUST) + public void receive(Message message){ + try { + logger.info("发布委托信息 ==> " + new String(message.getBody())); + JSONObject event = JSONUtil.parseObj(new String(message.getBody())); + AtuEntrustMsgDto entrustMsg = JSONUtil.toBean(event, AtuEntrustMsgDto.class); + // 判断该批次任务是否执行完成 + boolean isFinish = atuPlanTaskService.checkBatchFinish(entrustMsg.getBatchId()); + if (isFinish && entrustMsg.getEntrustNum() > 0) { + // 批次任务已全部执行完成,无需委托 + return; + } + if (entrustMsg.getEntrustNum() >= MAX_RETRY_NUM) { + logger.error("委托失败重试" + MAX_RETRY_NUM + "次还未成功"); + long lastOfflineTime = System.currentTimeMillis() - MAX_RETRY_NUM * RETRY_WAIT_TIME; + planBatchApiService.processBatchTaskTimeout(entrustMsg.getBatchId(), lastOfflineTime); + return; + } + + // 发送委托至引擎 + String url = "http://" + entrustMsg.getIp() + ":" + entrustMsg.getPort() + PlanConstant.PLAN_BATCH_ENTRUST_URL; + logger.info("委托地址 => " + url); + AtuEntrustInfoDto entrustInfo = new AtuEntrustInfoDto(); + BeanUtil.copyProperties(entrustMsg, entrustInfo); + logger.info("委托参数 => " + JSONUtil.toJsonStr(entrustInfo)); + + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity requestEntity = new HttpEntity<>(entrustInfo, headers); + try { + ResponseEntity response = restTemplate.postForEntity(url, requestEntity, String.class); + logger.info("委托结果 => " + JSONUtil.toJsonStr(response.getBody())); + if (response.getStatusCode().is2xxSuccessful()) { + return; + } + } catch (Exception e) { + logger.error("引擎[" + entrustMsg.getIp() + ":" + entrustMsg.getPort() + "]委托失败", e); + } + // 将委托信息放至队列尾部,等待下一次委托 + logger.debug("委托处理异常,休眠 " + RETRY_WAIT_TIME + "毫秒"); + ThreadUtil.safeSleep(RETRY_WAIT_TIME); + // TODO: 2022/12/12 若设备离线后20分钟内,队列委托信息少,会频繁执行这一步 + entrustMsg.setEntrustNum(entrustMsg.getEntrustNum() + 1); + amqpTemplate.convertAndSend(RabbitConstant.PLAN_BATCH_ENTRUST, JSONUtil.toJsonStr(entrustMsg)); + }catch (Exception e){ + logger.error("发布委托失败", e); + } + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskExecHeartbeatConsumer.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskExecHeartbeatConsumer.java new file mode 100644 index 0000000..a7ba3b1 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskExecHeartbeatConsumer.java @@ -0,0 +1,76 @@ +package net.northking.cctp.executePlan.consumer; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.json.JSONUtil; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.constants.RabbitConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanSceneCaseTask; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.db.service.AtuPlanSceneCaseTaskService; +import net.northking.cctp.executePlan.db.service.AtuPlanTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.AmqpAdmin; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Component +public class TaskExecHeartbeatConsumer { + + private final static Logger logger = LoggerFactory.getLogger(TaskExecHeartbeatConsumer.class); + + @Autowired + private AmqpAdmin amqpAdmin; + + @Autowired + private AtuPlanTaskService planTaskService; + + @Autowired + private AtuPlanSceneCaseTaskService planSceneCaseTaskService; + + @PostConstruct + public void init(){ + // 初始化队列并绑定到交换机 + Queue queue = new Queue(RabbitConstant.TASK_EXEC_HEARTBEAT_QUEUE); + amqpAdmin.declareQueue(queue); + } + + /** + * 计划任务心跳 + * @param message 对象消息 + */ + @RabbitListener(queues = RabbitConstant.TASK_EXEC_HEARTBEAT_QUEUE) + public void receive(Message message){ + try { + logger.info("计划任务心跳 ==> " + new String(message.getBody())); + Map taskMap = JSONUtil.toBean(new String(message.getBody()), Map.class); + taskMap.forEach(this::handleTaskHeartbeat); + }catch (Exception e){ + logger.error("任务生成失败", e); + } + } + + private void handleTaskHeartbeat(String taskId, String taskType){ + AtuPlanTask planTask = new AtuPlanTask(); + planTask.setId(taskId); + planTask.setLastHeartbeatTime(new Date()); + if (PlanConstant.SCRIPT_TYPE_SCENE.equals(taskType)){ + // 场景任务 + AtuPlanSceneCaseTask sceneCaseTask = planSceneCaseTaskService.findByPrimaryKey(taskId); + sceneCaseTask.setLastHeartbeatTime(new Date()); + planSceneCaseTaskService.updateByPrimaryKey(sceneCaseTask); + // 更新场景节点对应的任务心跳 + planTask.setId(sceneCaseTask.getTaskId()); + } + // 普通任务 + planTaskService.updateByPrimaryKey(planTask); + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskExecResultConsumer.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskExecResultConsumer.java new file mode 100644 index 0000000..c389d64 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskExecResultConsumer.java @@ -0,0 +1,206 @@ +package net.northking.cctp.executePlan.consumer; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.executePlan.api.service.AtuPlanBatchApiService; +import net.northking.cctp.executePlan.api.service.AtuPlanSceneCaseTaskApiService; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.constants.RabbitConstant; +import net.northking.cctp.executePlan.constants.RedisConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.db.entity.AtuPlanTaskRecord; +import net.northking.cctp.executePlan.db.service.AtuPlanInfoService; +import net.northking.cctp.executePlan.db.service.AtuPlanTaskRecordService; +import net.northking.cctp.executePlan.db.service.AtuPlanTaskService; +import net.northking.cctp.executePlan.dto.planTask.AtuTaskExecResultDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.*; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; +import java.util.Date; +import java.util.concurrent.CompletableFuture; + +/** + *

Title: TaskExecResultConsumer

+ *

Description: 任务执行结果

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/12 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@Component +public class TaskExecResultConsumer { + + private final static Logger logger = LoggerFactory.getLogger(TaskExecResultConsumer.class); + + @Autowired + private AtuPlanTaskService planTaskService; + + @Autowired + private AtuPlanInfoService atuPlanInfoService; + + @Autowired + private AmqpAdmin amqpAdmin; + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private AtuPlanBatchApiService planBatchApiService; + + @Autowired + private AtuPlanSceneCaseTaskApiService sceneCaseTaskApiService; + + @Autowired + private AtuPlanTaskRecordService taskRecordService; + + @PostConstruct + public void init(){ + // 初始化队列并绑定到交换机 + Exchange exchange = new DirectExchange(RabbitConstant.PROJECT_EXCHANGE_KEY); + amqpAdmin.declareExchange(exchange); + Queue queue = new Queue(RabbitConstant.TASK_EXEC_RESULT); + amqpAdmin.declareQueue(queue); + Binding binding = BindingBuilder.bind(queue).to(exchange) + .with(RabbitConstant.TASK_EXEC_RESULT).noargs(); + amqpAdmin.declareBinding(binding); + } + + + /** + * 接收任务执行结果 + * @param message 对象消息 + */ + @Transactional(rollbackFor = Exception.class) + @RabbitListener(queues = RabbitConstant.TASK_EXEC_RESULT) + public void receive(Message message){ + try{ + logger.info("任务执行结果 ==> " + new String(message.getBody())); + JSONObject event = JSONUtil.parseObj(new String(message.getBody())); + AtuTaskExecResultDto taskExecResult = JSONUtil.toBean(event, AtuTaskExecResultDto.class); + + String clusterKeyPrefix = RedisConstant.CLUSTER_KEY_PREFIX + taskExecResult.getBatchId().substring(0,4) + + RedisConstant.CLUSTER_KEY_SUFFIX; + + if (ObjectUtil.equal(PlanConstant.TASK_ASSERT_FAIL_STATUS, taskExecResult.getStatus())){ + // 断言失败设置为执行失败 + taskExecResult.setStatus(PlanConstant.TASK_EXECUTE_FAIL_STATUS); + } + // 判断是否场景用例 + if (ObjectUtil.equal(PlanConstant.SCRIPT_TYPE_SCENE, taskExecResult.getCaseType())){ + sceneCaseTaskApiService.sceneCaseHandle(taskExecResult, clusterKeyPrefix); + return; + } + // 查询任务信息 + AtuPlanTask planTask = planTaskService.findByPrimaryKey(taskExecResult.getTaskId()); + if (ObjectUtil.isNull(planTask)){ + logger.error("任务[" + taskExecResult.getTaskId() + "]信息不存在"); + return; + } + //判断任务状态是否未非引擎返回的状态 取消/超时 + if(ObjectUtil.equal(PlanConstant.TASK_CANCEL_STATUS, planTask.getStatus()) + ||ObjectUtil.equal(PlanConstant.TASK_TIMEOUT_STATUS, planTask.getStatus())){ + return; + } + // 判断是否开始执行 + if (ObjectUtil.equal(PlanConstant.TASK_START_EXECUTE_STATUS, taskExecResult.getStatus())){ + planTask.setStartTime(taskExecResult.getCurrentTime()); + planTask.setEngineId(taskExecResult.getEngineId()); + planTask.setDeviceId(taskExecResult.getDeviceId()); + planTask.setAppId(taskExecResult.getAppId()); + planTask.setStatus(PlanConstant.TASK_START_EXECUTE_STATUS); + planTask.setLastHeartbeatTime(new Date()); + + if (!redisTemplate.opsForHash().hasKey(clusterKeyPrefix + RedisConstant.BATCH_SCRIPT_SUM_KEY + planTask.getBatchId(), + clusterKeyPrefix + PlanConstant.BATCH_START_TIME)) { + logger.debug("批次[" + planTask.getBatchId() + "]开始执行,更新计划的状态"); + atuPlanInfoService.updatePlanByLastBatchId(planTask.getBatchId(), PlanConstant.PLAN_EXECUTING_STATUS); + } + + }else if(taskExecResult.isNeedRetry()) { // 任务需要失败后需要重试 + // 添加任务执行记录 + addTaskRecord(taskExecResult, planTask, true); + + // 任务重试,结束时间作为重试的开始时间 + AtuPlanTask updateTaskTime = new AtuPlanTask(); + updateTaskTime.setId(planTask.getId()); + updateTaskTime.setStartTime(taskExecResult.getCurrentTime()); + planTaskService.updateByPrimaryKey(updateTaskTime); + // 结束 + return; + }else{ + planTask.setStatus(taskExecResult.getStatus()); + planTask.setEndTime(taskExecResult.getCurrentTime()); + planTask.setErrorMsg(taskExecResult.getMessage() != null ? taskExecResult.getMessage() : ""); + planTask.setVideoUrl(taskExecResult.getVideoPath()); + planTask.setExecResultFile(taskExecResult.getFilePath()); + // 任务完成后查询数据后将数据插入到表atu_plan_task_record + addTaskRecord(taskExecResult, planTask, false); + } + + if (PlanConstant.SCRIPT_TYPE_ANDROID.equals(planTask.getCaseType()) + || PlanConstant.SCRIPT_TYPE_IOS.equals(planTask.getCaseType())) { + logger.debug("处理移动端性能文件数据"); + planTask.setPerDataPath(sceneCaseTaskApiService.parseMobilePerformanceFile(taskExecResult)); + } + + // 终态休眠一会,避免集群同时更新执行中状态造成数据异常 + if (!PlanConstant.TASK_START_EXECUTE_STATUS.equals(planTask.getStatus())){ + try { + Thread.sleep(5000); + }catch (Exception e){ + logger.debug(""); + } + } + planTaskService.updateByPrimaryKey(planTask); + + // 更新批次统计数据 + planBatchApiService.updateCacheBatchSumData(planTask); + + // 关联截图文件 + CompletableFuture.runAsync(() -> sceneCaseTaskApiService.associatedActualImgAndVideo(taskExecResult)); + }catch (Exception e){ + logger.error("任务结果更新失败", e); + } + } + + private void addTaskRecord(AtuTaskExecResultDto taskExecResult, AtuPlanTask planTask, boolean isAutoRetry) { + try { + planTask.setEndTime(taskExecResult.getCurrentTime()); + + AtuPlanTaskRecord record = new AtuPlanTaskRecord(); + record.setTaskId(planTask.getId()); + // 根据taskId查询执行序号 + long count = taskRecordService.count(record); + if (count > 0) { + record.setExecuteType(PlanConstant.TASK_EXECUTE_TYPE_MANUAL_RETRY); + if (isAutoRetry) { + record.setExecuteType(PlanConstant.TASK_EXECUTE_TYPE_AUTO_RETRY); + } + } + record.setExecIdx(Math.toIntExact(count) + 1); + // 插入执行任务记录 + record.setId(UUIDUtil.create32UUID()); + record.setStartTime(planTask.getStartTime()); // 任务开始时间 + record.setEndTime(planTask.getEndTime()); // 任务结束时间 + record.setStatus(taskExecResult.getStatus()); // 执行结果 + record.setBatchId(planTask.getBatchId()); // 批次 + record.setErrorMsg(taskExecResult.getMessage()); // 任务错误信息 + record.setExecResultFile(taskExecResult.getFilePath()); // 任务执行记录结果文件地址 + record.setVideoUrl(taskExecResult.getVideoPath()); // 任务执行录屏文件地址 + taskRecordService.insert(record); + } catch (Exception e) { + logger.error("新增任务记录失败", e); + } + } +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskInputParamConsumer.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskInputParamConsumer.java new file mode 100644 index 0000000..63a9ed4 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskInputParamConsumer.java @@ -0,0 +1,75 @@ +package net.northking.cctp.executePlan.consumer; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.constants.RabbitConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanSceneCaseTask; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.db.service.AtuPlanSceneCaseTaskService; +import net.northking.cctp.executePlan.db.service.AtuPlanTaskService; +import net.northking.cctp.executePlan.dto.planTask.AtuTaskExecDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.*; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; + +public class TaskInputParamConsumer { + + private final static Logger logger = LoggerFactory.getLogger(TaskInputParamConsumer.class); + + @Autowired + private AtuPlanSceneCaseTaskService planSceneCaseTaskService; + + @Autowired + private AtuPlanTaskService planTaskService; + + @Autowired + private AmqpAdmin amqpAdmin; + + @PostConstruct + public void init(){ + // 初始化队列并绑定到交换机 + Exchange exchange = new DirectExchange(RabbitConstant.PROJECT_EXCHANGE_KEY); + amqpAdmin.declareExchange(exchange); + Queue queue = new Queue(RabbitConstant.TASK_INPUT_PARAM_UPDATE); + amqpAdmin.declareQueue(queue); + Binding binding = BindingBuilder.bind(queue).to(exchange) + .with(RabbitConstant.TASK_INPUT_PARAM_UPDATE).noargs(); + amqpAdmin.declareBinding(binding); + } + + /** + * 接收任务输入参数并更新入库 + * + * @param message 对象消息 + */ + @Transactional(rollbackFor = Exception.class) + @RabbitListener(queues = RabbitConstant.TASK_INPUT_PARAM_UPDATE) + public void receiveTaskInputParam(Message message) { + logger.info("接收信息 ==> " + new String(message.getBody())); + try { + JSONObject event = JSONUtil.parseObj(new String(message.getBody())); + AtuTaskExecDto receiveTask = JSONUtil.toBean(event, AtuTaskExecDto.class); + if (PlanConstant.SCRIPT_TYPE_SCENE.equals(receiveTask.getCaseType())) { + // 更新到场景任务表 + AtuPlanSceneCaseTask sceneTask = new AtuPlanSceneCaseTask(); + sceneTask.setId(receiveTask.getTaskId()); + sceneTask.setNodeParams(JSONUtil.toJsonStr(receiveTask.getCaseParams())); + planSceneCaseTaskService.updateByPrimaryKey(sceneTask); + } else { + // 更新到任务表 + AtuPlanTask updateTask = new AtuPlanTask(); + updateTask.setId(receiveTask.getTaskId()); + updateTask.setCaseParam(JSONUtil.toJsonStr(receiveTask.getCaseParams())); + planTaskService.updateByPrimaryKey(updateTask); + } + } catch (Exception e) { + logger.error("更新任务的输入参数失败", e); + } + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskTimeoutDelayConsumer.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskTimeoutDelayConsumer.java new file mode 100644 index 0000000..11a12ab --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/consumer/TaskTimeoutDelayConsumer.java @@ -0,0 +1,92 @@ +package net.northking.cctp.executePlan.consumer; + +import cn.hutool.core.util.ObjectUtil; +import net.northking.cctp.executePlan.api.service.AtuPlanBatchApiService; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.constants.RabbitConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.db.service.AtuPlanTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.*; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.HashMap; +import java.util.Map; + +/** + *

Title: TaskTimeoutDelayConsumer

+ *

Description: 任务超时延迟队列消费者

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/02/10 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@Component +public class TaskTimeoutDelayConsumer { + + private final static Logger logger = LoggerFactory.getLogger(TaskTimeoutDelayConsumer.class); + + @Autowired + private AmqpAdmin amqpAdmin; + + @Autowired + private AtuPlanTaskService planTaskService; + + @Autowired + private AtuPlanBatchApiService planBatchApiService; + + @PostConstruct + public void init(){ + // 初始化交换机与队列 + // 创建交换机 + Map args = new HashMap<>(4); + args.put("x-delayed-type", "direct"); + CustomExchange exchange = new CustomExchange(RabbitConstant.TASK_TIMEOUT_DELAY_EXCHANGE_NAME, + "x-delayed-message", true, false, args); + amqpAdmin.declareExchange(exchange); + // 创建队列 + Queue queue = new Queue(RabbitConstant.TASK_TIMEOUT_DELAY_QUEUE_NAME); + amqpAdmin.declareQueue(queue); + // 交换机与队列绑定 + Binding binding = BindingBuilder.bind(queue).to(exchange) + .with(RabbitConstant.TASK_TIMEOUT_DELAY_ROUTING_KEY).noargs(); + amqpAdmin.declareBinding(binding); + } + + @RabbitListener(queues = RabbitConstant.TASK_TIMEOUT_DELAY_QUEUE_NAME) + public void receive(Message message){ + logger.info("任务超时信息 ==> " + new String(message.getBody())); + // 根据批次ID更新未完成的任务为超时 + String taskId = new String(message.getBody()); + + // 判断任务是否完成 + AtuPlanTask task = planTaskService.findByPrimaryKey(taskId); + if (ObjectUtil.isNull(task)){ + logger.error("超时任务[" + taskId + "]不存在"); + return; + } + // 任务执行完成 + if (!ObjectUtil.equal(PlanConstant.TASK_WAIT_EXECUTE_STATUS, task.getStatus()) + && !ObjectUtil.equals(PlanConstant.TASK_START_EXECUTE_STATUS, task.getStatus())){ + logger.info("超时任务[" + task.getId() + "]已执行完成"); + return; + } + if (ObjectUtil.isNull(task.getStartTime())){ + task.setStartTime(System.currentTimeMillis()); + + task.setStatus(PlanConstant.TASK_START_EXECUTE_STATUS); + planBatchApiService.updateCacheBatchSumData(task); + } + task.setStatus(PlanConstant.TASK_TIMEOUT_STATUS); + task.setEndTime(System.currentTimeMillis()); + task.setErrorMsg("设备离线超时"); + planTaskService.updateByPrimaryKey(task); + + planBatchApiService.updateCacheBatchSumData(task); + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanAppLinkDao.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanAppLinkDao.java new file mode 100644 index 0000000..671e846 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanAppLinkDao.java @@ -0,0 +1,31 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.dao; + +import net.northking.cctp.executePlan.db.entity.AtuPlanAppLink; +import net.northking.cctp.executePlan.db.mapper.AtuPlanAppLinkMapper; +import org.springframework.stereotype.Repository; + +/** + * Mybatis数据库持久层(业务层):计划应用关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-06 17:37:23
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface AtuPlanAppLinkDao extends AtuPlanAppLinkMapper +{ + /** + * 查询应用ID + * @param planAppLink 参数 + * @return 应用ID + */ + String queryAppId(AtuPlanAppLink planAppLink); + + void deleteAppByPlanId(String planId); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanBatchDao.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanBatchDao.java new file mode 100644 index 0000000..21cb2f6 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanBatchDao.java @@ -0,0 +1,73 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.dao; + +import net.northking.cctp.executePlan.db.entity.AtuPlanBatch; +import net.northking.cctp.executePlan.db.mapper.AtuPlanBatchMapper; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchDetailDto; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):计划执行批次表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-07 17:41:08
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface AtuPlanBatchDao extends AtuPlanBatchMapper +{ + /** + * 查询计划最大批次号计划 + * @return 结果集 + */ + List queryPlanMaxBatchNumList(@Param("endTime") String endTime, + @Param("fromIndex") int fromIndex, + @Param("toIndex") int toIndex); + + List queryBatchByPlan(String planId); + + /** + * 根据id查询批次详情 + * @param batchId id + * @return 详情 + */ + AtuPlanBatchDetailDto queryBatchDetailById(String batchId); + + /** + * 统计计划批次总数-去重 + * @param endTime 结束时间 + * @return 结果 + */ + int countPlanMaxBatch(String endTime); + + /** + * 判断批次是否完成 + * @param batchId 批次id + * @return 结果 + */ + long countUnFinishById(String batchId); + + /** + * 查询需要被删除的批次 + * @param localDateTime 时间参数 + * @return 批次集合 + */ + List queryNeedClearBatch(@Param("localDateTime") LocalDateTime localDateTime); + + /** + * 更新批次表附件清除字段 + * @param batchIds 批次Ids集合 + */ + void updateAttachmentClearStatusByIds(@Param("batchIds") List batchIds); + + // ---- The End by Generator ----// + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanBatchDeviceLinkDao.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanBatchDeviceLinkDao.java new file mode 100644 index 0000000..7d5ebb8 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanBatchDeviceLinkDao.java @@ -0,0 +1,46 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.dao; + +import net.northking.cctp.executePlan.db.entity.AtuPlanBatchDeviceLink; +import net.northking.cctp.executePlan.db.mapper.AtuPlanBatchDeviceLinkMapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):计划批次设备关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-12 16:22:12
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface AtuPlanBatchDeviceLinkDao extends AtuPlanBatchDeviceLinkMapper +{ + /** + * 根据离线设备ID查询批次设备绑定信息 + * @param deviceId 离线设备ID + * @return 绑定信息 + */ + List queryByOfflineDeviceId(String deviceId); + + /** + * 统计在线设备,或者离线设备离线时间小于20分钟 + * @param batchId 批次号 + * @return 结果 + */ + Integer countOnlineDeviceByBatchId(String batchId); + + // ---- The End by Generator ----// + + /** + * 统计批次的设备 + * @param batchId 批次号 + * @return 结果 + */ + Integer countDeviceByBatchId(String batchId); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanDeviceLinkDao.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanDeviceLinkDao.java new file mode 100644 index 0000000..35f3024 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanDeviceLinkDao.java @@ -0,0 +1,32 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.dao; + +import net.northking.cctp.executePlan.db.mapper.AtuPlanDeviceLinkMapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):计划设备关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-06 17:37:24
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface AtuPlanDeviceLinkDao extends AtuPlanDeviceLinkMapper +{ + /** + * 根据计划ID查询设备ID集合 + * @param planId 计划ID + * @return 设备ID集合 + */ + List queryDeviceIdByPlanId(String planId); + + void deleteByPlanId(String planId); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanEnvLinkDao.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanEnvLinkDao.java new file mode 100644 index 0000000..c90e2cd --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanEnvLinkDao.java @@ -0,0 +1,33 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.dao; + +import net.northking.cctp.executePlan.db.entity.AtuPlanEnvLink; +import net.northking.cctp.executePlan.db.mapper.AtuPlanEnvLinkMapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):计划环境关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-30 10:30:29
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface AtuPlanEnvLinkDao extends AtuPlanEnvLinkMapper +{ + /** + * 根据计划id查询绑定的环境id集合并根据排序值排序 + * @param planId 计划ID + * @return 环境id集合 + */ + List queryEnvIdByPlanIdOderBySort(String planId); + + Integer insertLinkList(List list); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanInfoDao.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanInfoDao.java new file mode 100644 index 0000000..e45ef98 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanInfoDao.java @@ -0,0 +1,102 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.dao; + +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.db.mapper.AtuPlanInfoMapper; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanInfoDetailDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanInfoPageDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanInfoQueryDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanPrincipalDto; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):执行计划表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-07 17:41:08
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface AtuPlanInfoDao extends AtuPlanInfoMapper +{ + /** + * 根据最后批次ID查询计划信息 + * @param batchId 批次ID + * @return 计划信息 + */ + AtuPlanInfo queryByLastBatchId(String batchId); + + /** + * 查询设置该计划为前置执行的计划ID集合 + * @param planId 计划ID + * @return 计划ID集合 + */ + List queryFollowUpPlanIdList(String planId); + + List queryPageByPlan(AtuPlanInfoQueryDto dto); + + String clonePlanName(AtuPlanInfo atuPlanInfo); + + List checkPlanName(AtuPlanInfo atuPlanInfo); + + /** + * 根据批次ID查询计划信息 + * @param batchId 批次ID + * @return 计划信息 + */ + AtuPlanInfo findByBatchId(String batchId); + + /** + * 根据任务ID查询计划信息 + * @param taskId 任务ID + * @return 计划信息 + */ + AtuPlanBatchDto queryByTaskId(String taskId); + + /** + * 更新计划下一次执行时间 + * @param atuPlanInfo 计划信息 + * @return 结果 + */ + Integer updatePlanNextExecTime(AtuPlanInfo atuPlanInfo); + + /** + * 根据批次编号修改计划状态 + * @param batchId 批次编号 + * @param status 状态 + * @return 结果 + */ + Integer updatePlanByLastBatchId(@Param(value = "batchId") String batchId, + @Param(value = "status") String status); + + Integer updatePlanByIds(@Param("ids")List ids); + // ---- The End by Generator ----// + List queryPlanInfoByIds(List execplanIdList); + + Integer checkNameUnique(AtuPlanInfo info); + + void updatePrincipal(AtuPlanPrincipalDto dto); + + List queryUpFrontPlan(AtuPlanInfoPageDto dto); + + List queryByPage(@Param("fromIndex") int fromIndex, @Param("toIndex") int toIndex); + + Integer countDeleted(AtuPlanInfo countParams); + + Integer updatePlanRetryCount(AtuPlanInfo entity); + + List selectManagerByProject(@Param("projectId") String projectId); + + List selectCreatorByProject(@Param("projectId") String projectId); + + List selectUpdaterByProject(@Param("projectId") String projectId); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanSceneCaseTaskDao.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanSceneCaseTaskDao.java new file mode 100644 index 0000000..2179180 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanSceneCaseTaskDao.java @@ -0,0 +1,90 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.dao; + +import net.northking.cctp.executePlan.db.entity.AtuPlanSceneCaseTask; +import net.northking.cctp.executePlan.db.mapper.AtuPlanSceneCaseTaskMapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Set; + +/** + * Mybatis数据库持久层(业务层):计划场景用例节点任务表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-12 16:22:12
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface AtuPlanSceneCaseTaskDao extends AtuPlanSceneCaseTaskMapper +{ + /** + * 根据任务ID查询场景节点任务设备ID集合 + * @param taskId 任务ID + * @return 设备ID集合 + */ + Set queryDeviceIdListByTaskId(String taskId); + + /** + * 根据任务ID查询未完成节点任务信息 + * @param taskId 任务ID + * @return 节点任务信息 + */ + AtuPlanSceneCaseTask queryUnfinishedTaskByTaskId(String taskId); + + List queryTaskVideoUrl(String taskId); + + /** + * 查询节点最后一次执行结果文件 + * @param query 查询条件 + * @return 结果 + */ + AtuPlanSceneCaseTask queryResultFileByTaskIdAndNodeId(AtuPlanSceneCaseTask query); + + List queryNodeInfo(@Param("taskId") String taskId); + + /** + * 根据任务id查询场景首节点任务信息 + * @param taskId 任务id + * @return 场景首节点任务信息 + */ + AtuPlanSceneCaseTask queryFirstNodeTask(String taskId); + + /** + * 根据批次id查询任务中的appId + * @param batchId 批次Id + * @return 结果集 + */ + List queryAppIdListByBatchId(String batchId); + + /** + * 根据计划id删除场景节点任务 + * @param planId 计划id + * @param num 删除数量 + * @return 结果 + */ + int deleteByPlanIdLimit(@Param("planId") String planId, @Param("num") int num); + + /** + * 根据计划id统计场景节点任务数量 + * @param planId 计划id + * @return 任务数量 + */ + int countByPlanId(String planId); + + List querySceneCaseTasksByTaskIds(@Param("taskIds") List taskIds); + + /** + * 查询执行超时N秒任务 + * @param timeout 超时时间 + * @return 任务集合 + */ + List queryExecTimeoutTask(int timeout); + + List queryWaitTimeoutTask(@Param("waitTimeout") Integer waitTimeout); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanScriptLinkDao.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanScriptLinkDao.java new file mode 100644 index 0000000..12dcbba --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanScriptLinkDao.java @@ -0,0 +1,29 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.dao; + +import net.northking.cctp.executePlan.db.entity.AtuPlanScriptLink; +import net.northking.cctp.executePlan.db.mapper.AtuPlanScriptLinkMapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):计划脚本关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-31 16:48:02
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface AtuPlanScriptLinkDao extends AtuPlanScriptLinkMapper +{ + Integer insertLinkList(List list); + + long countByScriptIdList(@Param("scriptIdList") List scriptIdList); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanScriptLinkMdDao.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanScriptLinkMdDao.java new file mode 100644 index 0000000..61e9ffe --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanScriptLinkMdDao.java @@ -0,0 +1,33 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.dao; + +import net.northking.cctp.executePlan.db.entity.AtuPlanScriptLinkMd; +import net.northking.cctp.executePlan.db.mapper.AtuPlanScriptLinkMdMapper; +import net.northking.cctp.executePlan.dto.planScript.AtuPlanScriptDeleteDto; +import net.northking.cctp.executePlan.dto.planScript.AtuPlanScriptLinkDto; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):计划脚本关联副表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-09-04 09:44:18
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface AtuPlanScriptLinkMdDao extends AtuPlanScriptLinkMdMapper +{ + List queryLinkMdPage(@Param("planId") String planId,@Param("userId") String userId,@Param("scriptList")List scriptList); + + Integer deleteLinkMd(AtuPlanScriptDeleteDto deleteDto); + + Integer insertMdBatch(List list); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanTaskDao.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanTaskDao.java new file mode 100644 index 0000000..8cc8e9b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanTaskDao.java @@ -0,0 +1,135 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.dao; + +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.db.mapper.AtuPlanTaskMapper; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskExtendDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskPageDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskQueryDto; +import net.northking.cctp.executePlan.dto.planTask.AtuTaskSendBugDto; +import net.northking.cctp.executePlan.pub.dto.ScriptFirstExecutionDTO; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.time.LocalDate; +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):计划执行任务表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-06 11:00:17
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface AtuPlanTaskDao extends AtuPlanTaskMapper +{ + + /** + * 分页查询计划关联用例集列表 + * @param queryByPage 分页条件 + * @return 用例集列表 + */ + List queryList(AtuPlanTaskQueryDto queryByPage); + + /** + * 统计批次未完成的任务数 + * @param batchId 批次号 + * @return 数量 + */ + Integer countUnFinishedTask(String batchId); + + /** + * 查询批次最后完成任务的结束时间 + * @param batchId 批次号 + * @return 结束时间 + */ + Long queryBatchLastTaskEndTime(String batchId); + + /** + * 根据批次ID查询未完成的任务 + * @param batchId 批次ID + * @return 任务 + */ + List queryUnfinishedTaskByBatchId(String batchId); + + /** + * 查询批次第一个开始执行的任务开始时间 + * @param batchId 批次号 + * @return 开始时间 + */ + Long queryBatchFirstTaskStartTime(String batchId); + + /** + * 根据批次ID查询该批次失败的任务ID集合 + * @param batchId 批次ID + * @return 失败任务ID集合 + */ + List queryAllFailIdList(String batchId); + + List selectCaseListByBatchId(String batchId); + + /** + * 根据批次id查询该批次的环境 + * @param batchId 批次id + * @return 环境id + */ + String queryEnvIdByBatchId(String batchId); + + /** + * 根据批次id查询任务中的appId + * @param batchId 批次Id + * @return 结果集 + */ + List queryAppIdListByBatchId(String batchId); + + int deleteByPlanIdLimit(@Param("planId") String planId, @Param("num") int num); + + /** + * 根据计划id统计任务数量 + * @param planId 计划id + * @return 任务数量 + */ + int countByPlanId(String planId); + + /** + * 根据批次id查询移动任务性能文件地址集合 + * @param batchId 批次id + * @return 结果集 + */ + List queryMobilePerDataPathByBatchId(String batchId); + + AtuTaskSendBugDto querySendBugTaskInfo(String taskId); + + List getFirstExecuteInfo(@Param("scriptIds") List scriptIds); + List getFirstExecuteInfos(@Param("scriptId") String scriptId); + + Integer getScriptExecuteSuccessNum(@Param("scriptId") String scriptId,@Param("planId") String planId, @Param("now") LocalDate now); + + List getTasksByPlanId(@Param("planId") String planId); + + List getTaskIdsByScriptIdsAndPlanId(@Param("scriptIds") List scriptIds, @Param("planId") String planId); + + List queryTasksByBatchIds(@Param("batchIds") List batchIds); + + /** + * 查询执行超时N秒任务 + * @param timeout 超时时间 + * @return 任务集合 + */ + List queryExecTimeoutTask(int timeout); + + /** + * 根据id查询任务扩展信息 + * @param id 任务id + * @return 任务扩展信息 + */ + AtuPlanTaskExtendDto queryTaskExtendById(String id); + + List queryWaitTimeoutTask(@Param("waitTimeout") Integer waitTimeout); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanTaskRecordDao.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanTaskRecordDao.java new file mode 100644 index 0000000..3df593b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/AtuPlanTaskRecordDao.java @@ -0,0 +1,30 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2024 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.dao; + +import net.northking.cctp.executePlan.db.entity.AtuPlanTaskRecord; +import net.northking.cctp.executePlan.db.mapper.AtuPlanTaskRecordMapper; +import net.northking.cctp.executePlan.dto.planTask.PlanTaskRecordDto; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Mybatis数据库持久层(业务层):任务执行记录表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2024-10-16 17:02:48
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Repository +public interface AtuPlanTaskRecordDao extends AtuPlanTaskRecordMapper +{ + List queryTotalTake(@Param("taskIds") List taskIds); + + List queryReTryTaskByTaskIds(@Param("taskIds") List taskIds); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/MqSynchronizeTaskDao.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/MqSynchronizeTaskDao.java new file mode 100644 index 0000000..3c6188a --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/dao/MqSynchronizeTaskDao.java @@ -0,0 +1,13 @@ +package net.northking.cctp.executePlan.db.dao; + +import net.northking.cctp.executePlan.db.entity.MqSynchronizeTask; +import net.northking.cctp.executePlan.db.mapper.MqSynchronizeTaskMapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface MqSynchronizeTaskDao extends MqSynchronizeTaskMapper { + List findByTypes(@Param("types") List types); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanAppLink.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanAppLink.java new file mode 100644 index 0000000..b8ced50 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanAppLink.java @@ -0,0 +1,154 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.Size; + +import net.northking.cctp.common.db.Partition; + +import java.io.Serializable; + +/** + * 计划应用关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-06 17:37:23
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "计划应用关联表") +public class AtuPlanAppLink extends Partition implements Serializable +{ + public static final String KEY_id = "id"; + public static final String KEY_planId = "planId"; + public static final String KEY_appId = "appId"; + public static final String KEY_appPackage = "appPackage"; + public static final String KEY_platformType = "platformType"; + + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 计划主键
+ */ + @ApiModelProperty("计划主键") + @Size(max = 32, message="计划主键-planId: 数据长度不能 > 32" ) + private String planId; + /** + * 应用主键
+ */ + @ApiModelProperty("应用主键") + @Size(max = 32, message="应用主键-appId: 数据长度不能 > 32" ) + private String appId; + /** + * 应用包名
+ */ + @ApiModelProperty("应用包名") + @Size(max = 90, message="应用包名-appPackage: 数据长度不能 > 90" ) + private String appPackage; + /** + * 平台类型;0-android,1-ios
+ */ + @ApiModelProperty("平台类型;0-android,1-ios") + @Size(max = 1, message="平台类型;0-android,1-ios-platformType: 数据长度不能 > 1" ) + private String platformType; + + /** + * 主键
+ */ + public String getId() + { + return id; + } + + /** + * 主键
+ * + * @param id 主键 + */ + public void setId(String id) + { + this.id = id; + } + /** + * 计划主键
+ */ + public String getPlanId() + { + return planId; + } + + /** + * 计划主键
+ * + * @param planId 计划主键 + */ + public void setPlanId(String planId) + { + this.planId = planId; + } + /** + * 应用主键
+ */ + public String getAppId() + { + return appId; + } + + /** + * 应用主键
+ * + * @param appId 应用主键 + */ + public void setAppId(String appId) + { + this.appId = appId; + } + /** + * 应用包名
+ */ + public String getAppPackage() + { + return appPackage; + } + + /** + * 应用包名
+ * + * @param appPackage 应用包名 + */ + public void setAppPackage(String appPackage) + { + this.appPackage = appPackage; + } + /** + * 平台类型;0-android,1-ios
+ */ + public String getPlatformType() + { + return platformType; + } + + /** + * 平台类型;0-android,1-ios
+ * + * @param platformType 平台类型;0-android,1-ios + */ + public void setPlatformType(String platformType) + { + this.platformType = platformType; + } + + public AtuPlanAppLink() + { + } + +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanBatch.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanBatch.java new file mode 100644 index 0000000..cbafebc --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanBatch.java @@ -0,0 +1,501 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.Size; + +import net.northking.cctp.common.db.Partition; + +import java.util.Date; + + +/** + * 计划执行批次表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-10-11 20:31:24
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "计划执行批次表") +public class AtuPlanBatch extends Partition +{ + public static final String KEY_id = "id"; + public static final String KEY_planId = "planId"; + public static final String KEY_batch = "batch"; + public static final String KEY_status = "status"; + public static final String KEY_startTime = "startTime"; + public static final String KEY_endTime = "endTime"; + public static final String KEY_taskTotal = "taskTotal"; + public static final String KEY_successNum = "successNum"; + public static final String KEY_execFailNum = "execFailNum"; + public static final String KEY_assertFailNum = "assertFailNum"; + public static final String KEY_timeoutNum = "timeoutNum"; + public static final String KEY_cancelNum = "cancelNum"; + public static final String KEY_successRate = "successRate"; + public static final String KEY_createdTime = "createdTime"; + public static final String KEY_executedBy = "executedBy"; + public static final String KEY_triggerType = "triggerType"; + public static final String KEY_scriptNum = "scriptNum"; + public static final String KEY_perDataPath = "perDataPath"; + public static final String KEY_attachmentClearStatus = "attachmentClearStatus"; + + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 计划主键
+ */ + @ApiModelProperty("计划主键") + @Size(max = 32, message="计划主键-planId: 数据长度不能 > 32" ) + private String planId; + /** + * 任务批次
+ */ + @ApiModelProperty("任务批次") + private Integer batch; + /** + * 状态;0-等待中,1-执行中,2-已完成,3-已取消
+ */ + @ApiModelProperty("状态;0-等待中,1-执行中,2-已完成,3-已取消") + @Size(max = 1, message="状态;0-等待中,1-执行中,2-已完成,3-已取消-status: 数据长度不能 > 1" ) + private String status; + /** + * 调度开始时间
+ */ + @ApiModelProperty("调度开始时间") + private Date startTime; + /** + * 调度结束时间
+ */ + @ApiModelProperty("调度结束时间") + private Date endTime; + /** + * 任务总数
+ */ + @ApiModelProperty("任务总数") + private Integer taskTotal; + /** + * 执行成功脚本数
+ */ + @ApiModelProperty("执行成功脚本数") + private Integer successNum; + /** + * 执行失败脚本数
+ */ + @ApiModelProperty("执行失败脚本数") + private Integer execFailNum; + /** + * 断言失败脚本数
+ */ + @ApiModelProperty("断言失败脚本数") + private Integer assertFailNum; + /** + * 超时脚本数
+ */ + @ApiModelProperty("超时脚本数") + private Integer timeoutNum; + /** + * 取消脚本数
+ */ + @ApiModelProperty("取消脚本数") + private Integer cancelNum; + /** + * 成功率
+ */ + @ApiModelProperty("成功率") + @Size(max = 10, message="成功率-successRate: 数据长度不能 > 10" ) + private String successRate; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 执行人
+ */ + @ApiModelProperty("执行人") + @Size(max = 32, message="执行人-executedBy: 数据长度不能 > 32" ) + private String executedBy; + /** + * 触发类型;1-自动,2-手动,3-devops
+ */ + @ApiModelProperty("触发类型;1-自动,2-手动,3-devops") + @Size(max = 1, message="触发类型;1-自动,2-手动,3-devops-triggerType: 数据长度不能 > 1" ) + private String triggerType; + /** + * 脚本总数
+ */ + @ApiModelProperty("脚本总数") + private Integer scriptNum; + /** + * 批次性能数据文件存放地址
+ */ + @ApiModelProperty("批次性能数据文件存放地址") + @Size(max = 512, message="批次性能数据文件存放地址-perDataPath: 数据长度不能 > 512" ) + private String perDataPath; + + /** + * 附件清理标志,0-未清理,1-已清理 + */ + @ApiModelProperty("附件清理标志,0-未清理,1-已清理") + private Integer attachmentClearStatus; + + public Integer getAttachmentClearStatus() { + return attachmentClearStatus; + } + + public void setAttachmentClearStatus(Integer attachmentClearStatus) { + this.attachmentClearStatus = attachmentClearStatus; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + private String source; + + /** + * 主键
+ */ + public String getId() + { + return id; + } + + /** + * 主键
+ * + * @param id 主键 + */ + public void setId(String id) + { + this.id = id; + } + /** + * 计划主键
+ */ + public String getPlanId() + { + return planId; + } + + /** + * 计划主键
+ * + * @param planId 计划主键 + */ + public void setPlanId(String planId) + { + this.planId = planId; + } + /** + * 任务批次
+ */ + public Integer getBatch() + { + return batch; + } + + /** + * 任务批次
+ * + * @param batch 任务批次 + */ + public void setBatch(Integer batch) + { + this.batch = batch; + } + /** + * 状态;0-等待中,1-执行中,2-已完成,3-已取消
+ */ + public String getStatus() + { + return status; + } + + /** + * 状态;0-等待中,1-执行中,2-已完成,3-已取消
+ * + * @param status 状态;0-等待中,1-执行中,2-已完成,3-已取消 + */ + public void setStatus(String status) + { + this.status = status; + } + /** + * 调度开始时间
+ */ + public Date getStartTime() + { + if(startTime != null) + { + return (Date)startTime.clone(); + } + return null; + } + + /** + * 调度开始时间
+ * + * @param startTime 调度开始时间 + */ + public void setStartTime(Date startTime) + { + if(startTime != null) + { + this.startTime = (Date)startTime.clone(); + } + } + /** + * 调度结束时间
+ */ + public Date getEndTime() + { + if(endTime != null) + { + return (Date)endTime.clone(); + } + return null; + } + + /** + * 调度结束时间
+ * + * @param endTime 调度结束时间 + */ + public void setEndTime(Date endTime) + { + if(endTime != null) + { + this.endTime = (Date)endTime.clone(); + } + } + /** + * 任务总数
+ */ + public Integer getTaskTotal() + { + return taskTotal; + } + + /** + * 任务总数
+ * + * @param taskTotal 任务总数 + */ + public void setTaskTotal(Integer taskTotal) + { + this.taskTotal = taskTotal; + } + /** + * 执行成功脚本数
+ */ + public Integer getSuccessNum() + { + return successNum; + } + + /** + * 执行成功脚本数
+ * + * @param successNum 执行成功脚本数 + */ + public void setSuccessNum(Integer successNum) + { + this.successNum = successNum; + } + /** + * 执行失败脚本数
+ */ + public Integer getExecFailNum() + { + return execFailNum; + } + + /** + * 执行失败脚本数
+ * + * @param execFailNum 执行失败脚本数 + */ + public void setExecFailNum(Integer execFailNum) + { + this.execFailNum = execFailNum; + } + /** + * 断言失败脚本数
+ */ + public Integer getAssertFailNum() + { + return assertFailNum; + } + + /** + * 断言失败脚本数
+ * + * @param assertFailNum 断言失败脚本数 + */ + public void setAssertFailNum(Integer assertFailNum) + { + this.assertFailNum = assertFailNum; + } + /** + * 超时脚本数
+ */ + public Integer getTimeoutNum() + { + return timeoutNum; + } + + /** + * 超时脚本数
+ * + * @param timeoutNum 超时脚本数 + */ + public void setTimeoutNum(Integer timeoutNum) + { + this.timeoutNum = timeoutNum; + } + /** + * 取消脚本数
+ */ + public Integer getCancelNum() + { + return cancelNum; + } + + /** + * 取消脚本数
+ * + * @param cancelNum 取消脚本数 + */ + public void setCancelNum(Integer cancelNum) + { + this.cancelNum = cancelNum; + } + /** + * 成功率
+ */ + public String getSuccessRate() + { + return successRate; + } + + /** + * 成功率
+ * + * @param successRate 成功率 + */ + public void setSuccessRate(String successRate) + { + this.successRate = successRate; + } + /** + * 创建时间
+ */ + public Date getCreatedTime() + { + if(createdTime != null) + { + return (Date)createdTime.clone(); + } + return null; + } + + /** + * 创建时间
+ * + * @param createdTime 创建时间 + */ + public void setCreatedTime(Date createdTime) + { + if(createdTime != null) + { + this.createdTime = (Date)createdTime.clone(); + } + } + /** + * 执行人
+ */ + public String getExecutedBy() + { + return executedBy; + } + + /** + * 执行人
+ * + * @param executedBy 执行人 + */ + public void setExecutedBy(String executedBy) + { + this.executedBy = executedBy; + } + /** + * 触发类型;1-自动,2-手动,3-devops
+ */ + public String getTriggerType() + { + return triggerType; + } + + /** + * 触发类型;1-自动,2-手动,3-devops
+ * + * @param triggerType 触发类型;1-自动,2-手动,3-devops + */ + public void setTriggerType(String triggerType) + { + this.triggerType = triggerType; + } + /** + * 脚本总数
+ */ + public Integer getScriptNum() + { + return scriptNum; + } + + /** + * 脚本总数
+ * + * @param scriptNum 脚本总数 + */ + public void setScriptNum(Integer scriptNum) + { + this.scriptNum = scriptNum; + } + /** + * 批次性能数据文件存放地址
+ */ + public String getPerDataPath() + { + return perDataPath; + } + + /** + * 批次性能数据文件存放地址
+ * + * @param perDataPath 批次性能数据文件存放地址 + */ + public void setPerDataPath(String perDataPath) + { + this.perDataPath = perDataPath; + } + + public AtuPlanBatch() + { + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanBatchDeviceLink.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanBatchDeviceLink.java new file mode 100644 index 0000000..7b77b0e --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanBatchDeviceLink.java @@ -0,0 +1,183 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.Size; + +import net.northking.cctp.common.db.Partition; + +import java.util.Date; + + +/** + * 计划批次设备关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-23 15:34:17
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "计划批次设备关联表") +public class AtuPlanBatchDeviceLink extends Partition +{ + public static final String KEY_id = "id"; + public static final String KEY_batchId = "batchId"; + public static final String KEY_deviceId = "deviceId"; + public static final String KEY_deviceType = "deviceType"; + public static final String KEY_offline = "offline"; + public static final String KEY_offlineTime = "offlineTime"; + + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 批次号
+ */ + @ApiModelProperty("批次号") + @Size(max = 32, message="批次号-batchId: 数据长度不能 > 32" ) + private String batchId; + /** + * 设备编号
+ */ + @ApiModelProperty("设备编号") + @Size(max = 32, message="设备编号-deviceId: 数据长度不能 > 32" ) + private String deviceId; + /** + * 设备类型;1-PC,2-移动端
+ */ + @ApiModelProperty("设备类型;2-PC,1-移动端") + @Size(max = 1, message="设备类型;2-PC,1-移动端-deviceType: 数据长度不能 > 1" ) + private String deviceType; + /** + * 是否离线;0-否,1-是
+ */ + @ApiModelProperty("是否离线;0-否,1-是") + private Boolean offline; + /** + * 离线时间
+ */ + @ApiModelProperty("离线时间") + private Date offlineTime; + + /** + * 主键
+ */ + public String getId() + { + return id; + } + + /** + * 主键
+ * + * @param id 主键 + */ + public void setId(String id) + { + this.id = id; + } + /** + * 批次号
+ */ + public String getBatchId() + { + return batchId; + } + + /** + * 批次号
+ * + * @param batchId 批次号 + */ + public void setBatchId(String batchId) + { + this.batchId = batchId; + } + /** + * 设备编号
+ */ + public String getDeviceId() + { + return deviceId; + } + + /** + * 设备编号
+ * + * @param deviceId 设备编号 + */ + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + /** + * 设备类型;1-PC,2-移动端
+ */ + public String getDeviceType() + { + return deviceType; + } + + /** + * 设备类型;1-PC,2-移动端
+ * + * @param deviceType 设备类型;1-PC,2-移动端 + */ + public void setDeviceType(String deviceType) + { + this.deviceType = deviceType; + } + /** + * 是否离线;0-否,1-是
+ */ + public Boolean getOffline() + { + return offline; + } + + /** + * 是否离线;0-否,1-是
+ * + * @param offline 是否离线;0-否,1-是 + */ + public void setOffline(Boolean offline) + { + this.offline = offline; + } + /** + * 离线时间
+ */ + public Date getOfflineTime() + { + if(offlineTime != null) + { + return (Date)offlineTime.clone(); + } + return null; + } + + /** + * 离线时间
+ * + * @param offlineTime 离线时间 + */ + public void setOfflineTime(Date offlineTime) + { + if(offlineTime != null) + { + this.offlineTime = (Date)offlineTime.clone(); + } + } + + public AtuPlanBatchDeviceLink() + { + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanDeviceLink.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanDeviceLink.java new file mode 100644 index 0000000..a3fea6a --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanDeviceLink.java @@ -0,0 +1,166 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.Size; + +import net.northking.cctp.common.db.Partition; + +import java.io.Serializable; + + +/** + * 计划设备关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-06 17:37:24
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "计划设备关联表") +public class AtuPlanDeviceLink extends Partition implements Serializable +{ + public static final String KEY_id = "id"; + public static final String KEY_planId = "planId"; + public static final String KEY_deviceId = "deviceId"; + public static final String KEY_deviceType = "deviceType"; + public static final String KEY_browserType = "browserType"; + public static final String KEY_platformType = "platformType"; + + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 计划主键
+ */ + @ApiModelProperty("计划主键") + @Size(max = 32, message="计划主键-planId: 数据长度不能 > 32" ) + private String planId; + /** + * 设备主键
+ */ + @ApiModelProperty("设备主键") + @Size(max = 128, message="设备主键-deviceId: 数据长度不能 > 32" ) + private String deviceId; + /** + * 设备类型;1-PC,2-移动端
+ */ + @ApiModelProperty("设备类型;1-PC,2-移动端") + @Size(max = 1, message="设备类型;1-PC,2-移动端-deviceType: 数据长度不能 > 1" ) + private String deviceType; + /** + * 浏览器类型;1-IE,2-chrome,3-firefox,4-edge
+ */ + @ApiModelProperty("浏览器类型;1-IE,2-chrome,3-firefox,4-edge") + @Size(max = 1, message="浏览器类型;1-IE,2-chrome,3-firefox,4-edge-browserType: 数据长度不能 > 1" ) + private String browserType; + + @ApiModelProperty("系统类型 0-Android 1-IOS 2-HarmonyOS") + private String platformType; + + public String getPlatformType() { + return platformType; + } + + public void setPlatformType(String platformType) { + this.platformType = platformType; + } + + /** + * 主键
+ */ + public String getId() + { + return id; + } + + /** + * 主键
+ * + * @param id 主键 + */ + public void setId(String id) + { + this.id = id; + } + /** + * 计划主键
+ */ + public String getPlanId() + { + return planId; + } + + /** + * 计划主键
+ * + * @param planId 计划主键 + */ + public void setPlanId(String planId) + { + this.planId = planId; + } + /** + * 设备主键
+ */ + public String getDeviceId() + { + return deviceId; + } + + /** + * 设备主键
+ * + * @param deviceId 设备主键 + */ + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + /** + * 设备类型;1-PC,2-移动端
+ */ + public String getDeviceType() + { + return deviceType; + } + + /** + * 设备类型;1-PC,2-移动端
+ * + * @param deviceType 设备类型;1-PC,2-移动端 + */ + public void setDeviceType(String deviceType) + { + this.deviceType = deviceType; + } + /** + * 浏览器类型;1-IE,2-chrome,3-firefox,4-edge
+ */ + public String getBrowserType() + { + return browserType; + } + + /** + * 浏览器类型;1-IE,2-chrome,3-firefox,4-edge
+ * + * @param browserType 浏览器类型;1-IE,2-chrome,3-firefox,4-edge + */ + public void setBrowserType(String browserType) + { + this.browserType = browserType; + } + + public AtuPlanDeviceLink() + { + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanEnvLink.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanEnvLink.java new file mode 100644 index 0000000..e6f1f9b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanEnvLink.java @@ -0,0 +1,127 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.common.db.Partition; + +import javax.validation.constraints.Size; +import java.io.Serializable; + + +/** + * 计划环境关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-30 10:30:29
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "计划环境关联表") +public class AtuPlanEnvLink extends Partition implements Serializable +{ + public static final String KEY_id = "id"; + public static final String KEY_planId = "planId"; + public static final String KEY_envId = "envId"; + public static final String KEY_sort = "sort"; + + /** + * 主键
+ */ + @ApiModelProperty("主键") + private Long id; + /** + * 计划id
+ */ + @ApiModelProperty("计划id") + @Size(max = 32, message="计划id-planId: 数据长度不能 > 32" ) + private String planId; + /** + * 环境id
+ */ + @ApiModelProperty("环境id") + @Size(max = 32, message="环境id-envId: 数据长度不能 > 32" ) + private String envId; + /** + * 排序值
+ */ + @ApiModelProperty("排序值") + private Integer sort; + + /** + * 主键
+ */ + public Long getId() + { + return id; + } + + /** + * 主键
+ * + * @param id 主键 + */ + public void setId(Long id) + { + this.id = id; + } + /** + * 计划id
+ */ + public String getPlanId() + { + return planId; + } + + /** + * 计划id
+ * + * @param planId 计划id + */ + public void setPlanId(String planId) + { + this.planId = planId; + } + /** + * 环境id
+ */ + public String getEnvId() + { + return envId; + } + + /** + * 环境id
+ * + * @param envId 环境id + */ + public void setEnvId(String envId) + { + this.envId = envId; + } + /** + * 排序值
+ */ + public Integer getSort() + { + return sort; + } + + /** + * 排序值
+ * + * @param sort 排序值 + */ + public void setSort(Integer sort) + { + this.sort = sort; + } + + public AtuPlanEnvLink() + { + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanInfo.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanInfo.java new file mode 100644 index 0000000..649f749 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanInfo.java @@ -0,0 +1,1027 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.common.db.entity.Entity; +import net.northking.cctp.common.saas.db.TenantPartition; + +import javax.validation.constraints.Size; +import java.util.Date; + + +/** + * 执行计划表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-30 10:30:29
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "执行计划表") +public class AtuPlanInfo extends TenantPartition implements Entity +{ + public static final String KEY_id = "id"; + public static final String KEY_tenantId = "tenantId"; + public static final String KEY_projectId = "projectId"; + public static final String KEY_planName = "planName"; + public static final String KEY_planDesc = "planDesc"; + public static final String KEY_enabled = "enabled"; + public static final String KEY_status = "status"; + public static final String KEY_appSet = "appSet"; + public static final String KEY_screenRecordSet = "screenRecordSet"; + public static final String KEY_screenshotSet = "screenshotSet"; + public static final String KEY_priority = "priority"; + public static final String KEY_cronExpr = "cronExpr"; + public static final String KEY_upFrontPlanId = "upFrontPlanId"; + public static final String KEY_webhookUrl = "webhookUrl"; + public static final String KEY_webhookToken = "webhookToken"; + public static final String KEY_sendMail = "sendMail"; + public static final String KEY_mailAddress = "mailAddress"; + public static final String KEY_failRetry = "failRetry"; + public static final String KEY_failRetryCount = "failRetryCount"; + public static final String KEY_failCreatePlan = "failCreatePlan"; + public static final String KEY_lastExecTime = "lastExecTime"; + public static final String KEY_nextExecTime = "nextExecTime"; + public static final String KEY_lastBatchId = "lastBatchId"; + public static final String KEY_waitingNum = "waitingNum"; + public static final String KEY_runningNum = "runningNum"; + public static final String KEY_successNum = "successNum"; + public static final String KEY_execFailNum = "execFailNum"; + public static final String KEY_assertFailNum = "assertFailNum"; + public static final String KEY_timeoutNum = "timeoutNum"; + public static final String KEY_cancelNum = "cancelNum"; + public static final String KEY_createdBy = "createdBy"; + public static final String KEY_createdTime = "createdTime"; + public static final String KEY_updatedBy = "updatedBy"; + public static final String KEY_updatedTime = "updatedTime"; + public static final String KEY_deleted = "deleted"; + public static final String KEY_hasCorn = "hasCorn"; + public static final String KEY_hasUpFront = "hasUpFront"; + public static final String KEY_hasWebhook = "hasWebhook"; + public static final String KEY_caseChangeFlag = "caseChangeFlag"; + public static final String KEY_principalId = "principalId"; + /** + * 此类在quartz数据库中进行序列化,定时任务需要反序列化,因此序列化id禁止修改 + */ + public static final long serialVersionUID = -3818747591014706223L; + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 租户主键
+ */ + @ApiModelProperty("租户主键") + @Size(max = 32, message="租户主键-tenantId: 数据长度不能 > 32" ) + private String tenantId; + /** + * 系统主键
+ */ + @ApiModelProperty("系统主键") + @Size(max = 32, message="系统主键-projectId: 数据长度不能 > 32" ) + private String projectId; + /** + * 计划名称
+ */ + @ApiModelProperty("计划名称") + @Size(max = 90, message="计划名称-planName: 数据长度不能 > 90" ) + private String planName; + /** + * 计划描述
+ */ + @ApiModelProperty("计划描述") + @Size(max = 900, message="计划描述-planDesc: 数据长度不能 > 900" ) + private String planDesc; + /** + * 是否启用;0-否,1-是
+ */ + @ApiModelProperty("是否启用;0-否,1-是") + private Boolean enabled; + /** + * 状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消
+ */ + @ApiModelProperty("状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消") + @Size(max = 1, message="状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消-status: 数据长度不能 > 1" ) + private String status; + /** + * 应用设置;1-清除数据,2-卸载安装,3-清除并卸载
+ */ + @ApiModelProperty("应用设置;1-清除数据,2-卸载安装,3-清除并卸载") + @Size(max = 1, message="应用设置;1-清除数据,2-卸载安装,3-清除并卸载-appSet: 数据长度不能 > 1" ) + private String appSet; + /** + * 录屏设置;0-不保存,1-全部保存,2-出错保存
+ */ + @ApiModelProperty("录屏设置;0-不保存,1-全部保存,2-出错保存") + @Size(max = 1, message="录屏设置;0-不保存,1-全部保存,2-出错保存-screenRecordSet: 数据长度不能 > 1" ) + private String screenRecordSet; + /** + * 截图设置;0-不保存,1-全部保存,2-出错保存
+ */ + @ApiModelProperty("截图设置;0-不保存,1-全部保存,2-出错保存") + @Size(max = 1, message="截图设置;0-不保存,1-全部保存,2-出错保存-screenshotSet: 数据长度不能 > 1" ) + private String screenshotSet; + /** + * 优先级;0-低,1-高
+ */ + @ApiModelProperty("优先级;0-低,1-高") + @Size(max = 1, message="优先级;0-低,1-高-priority: 数据长度不能 > 1" ) + private String priority; + /** + * Cron表达式
+ */ + @ApiModelProperty("Cron表达式") + @Size(max = 90, message="Cron表达式-cronExpr: 数据长度不能 > 90" ) + private String cronExpr; + /** + * 前置计划ID
+ */ + @ApiModelProperty("前置计划ID") + @Size(max = 32, message="前置计划ID-upFrontPlanId: 数据长度不能 > 32" ) + private String upFrontPlanId; + /** + * 触发链接
+ */ + @ApiModelProperty("触发链接") + @Size(max = 255, message="触发链接-webhookUrl: 数据长度不能 > 255" ) + private String webhookUrl; + /** + * 密保令牌
+ */ + @ApiModelProperty("密保令牌") + @Size(max = 32, message="密保令牌-webhookToken: 数据长度不能 > 32" ) + private String webhookToken; + /** + * 是否发送飞狼;0-否,1-是
+ */ + @ApiModelProperty("是否发送飞狼;0-否,1-是") + private Boolean sendMail; + /** + * 邮件地址;当需要发送邮件时不能为空
+ */ + @ApiModelProperty("飞狼用户;当需要发送飞狼时不能为空") + @Size(max = 255, message="当需要发送飞狼时不能为空" ) + private String mailAddress; + /** + * 是否失败重试;0-否,1-是
+ */ + @ApiModelProperty("是否失败重试;0-否,1-是") + private Boolean failRetry; + /** + * 失败重试次数
+ */ + @ApiModelProperty("失败重试次数") + private Integer failRetryCount; + /** + * 失败重试策略
+ */ + @ApiModelProperty("重试策略") + private String retryStrategy; + /** + * 是否失败生成计划;0-否,1-是
+ */ + @ApiModelProperty("是否失败生成计划;0-否,1-是") + private Boolean failCreatePlan; + /** + * 最近执行时间
+ */ + @ApiModelProperty("最近执行时间") + private Date lastExecTime; + /** + * 下次执行时间
+ */ + @ApiModelProperty("下次执行时间") + private Date nextExecTime; + /** + * 最后批次号
+ */ + @ApiModelProperty("最后批次号") + @Size(max = 32, message="最后批次号-lastBatchId: 数据长度不能 > 32" ) + private String lastBatchId; + /** + * 最后批次等待中任务数
+ */ + @ApiModelProperty("最后批次等待中任务数") + private Integer waitingNum; + /** + * 最后批次执行中任务数
+ */ + @ApiModelProperty("最后批次执行中任务数") + private Integer runningNum; + /** + * 最后批次成功任务数
+ */ + @ApiModelProperty("最后批次成功任务数") + private Integer successNum; + /** + * 最后批次执行失败任务数
+ */ + @ApiModelProperty("最后批次执行失败任务数") + private Integer execFailNum; + /** + * 最后批次断言失败任务数
+ */ + @ApiModelProperty("最后批次断言失败任务数") + private Integer assertFailNum; + /** + * 最后批次超时任务数
+ */ + @ApiModelProperty("最后批次超时任务数") + private Integer timeoutNum; + /** + * 最后批次取消任务数
+ */ + @ApiModelProperty("最后批次取消任务数") + private Integer cancelNum; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + @Size(max = 32, message="创建人-createdBy: 数据长度不能 > 32" ) + private String createdBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 更新人
+ */ + @ApiModelProperty("更新人") + @Size(max = 32, message="更新人-updatedBy: 数据长度不能 > 32" ) + private String updatedBy; + /** + * 更新时间
+ */ + @ApiModelProperty("更新时间") + private Date updatedTime; + /** + * 是否删除;0-否,1-是
+ */ + @ApiModelProperty("是否删除;0-否,1-是") + private Boolean deleted; + /** + * 是否定时触发 0-否,1-是
+ */ + @ApiModelProperty("是否定时触发 0-否,1-是") + private Boolean hasCorn; + /** + * 是否存在前置计划 0-否,1-是
+ */ + @ApiModelProperty("是否存在前置计划 0-否,1-是") + private Boolean hasUpFront; + /** + * 是否勾选webhook触发 0-否,1-是
+ */ + @ApiModelProperty("是否勾选webhook触发 0-否,1-是") + private Boolean hasWebhook; + /** + * 用例变更标识;0-无,1-是
+ */ + @ApiModelProperty("用例变更标识;0-无,1-是") + private Boolean caseChangeFlag; + + @ApiModelProperty("计划负责人") + private String principalId; + + private Integer isDeleted; + + public Integer getIsEnabled() { + return isEnabled; + } + + public void setIsEnabled(Integer isEnabled) { + this.isEnabled = isEnabled; + } + + private Integer isEnabled; + + /** + * 主键
+ */ + public String getId() + { + return id; + } + + /** + * 主键
+ * + * @param id 主键 + */ + public void setId(String id) + { + this.id = id; + } + /** + * 租户主键
+ */ + @Override + public String getTenantId() + { + return tenantId; + } + + /** + * 租户主键
+ * + * @param tenantId 租户主键 + */ + @Override + public void setTenantId(String tenantId) + { + this.tenantId = tenantId; + } + /** + * 系统主键
+ */ + public String getProjectId() + { + return projectId; + } + + /** + * 系统主键
+ * + * @param projectId 系统主键 + */ + public void setProjectId(String projectId) + { + this.projectId = projectId; + } + /** + * 计划名称
+ */ + public String getPlanName() + { + return planName; + } + + /** + * 计划名称
+ * + * @param planName 计划名称 + */ + public void setPlanName(String planName) + { + this.planName = planName; + } + /** + * 计划描述
+ */ + public String getPlanDesc() + { + return planDesc; + } + + /** + * 计划描述
+ * + * @param planDesc 计划描述 + */ + public void setPlanDesc(String planDesc) + { + this.planDesc = planDesc; + } + /** + * 是否启用;0-否,1-是
+ */ + public Boolean getEnabled() + { + return enabled; + } + + /** + * 是否启用;0-否,1-是
+ * + * @param enabled 是否启用;0-否,1-是 + */ + public void setEnabled(Boolean enabled) + { + this.enabled = enabled; + } + /** + * 状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消
+ */ + public String getStatus() + { + return status; + } + + /** + * 状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消
+ * + * @param status 状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消 + */ + public void setStatus(String status) + { + this.status = status; + } + /** + * 应用设置;1-清除数据,2-卸载安装,3-清除并卸载
+ */ + public String getAppSet() + { + return appSet; + } + + /** + * 应用设置;1-清除数据,2-卸载安装,3-清除并卸载
+ * + * @param appSet 应用设置;1-清除数据,2-卸载安装,3-清除并卸载 + */ + public void setAppSet(String appSet) + { + this.appSet = appSet; + } + /** + * 录屏设置;0-不保存,1-全部保存,2-出错保存
+ */ + public String getScreenRecordSet() + { + return screenRecordSet; + } + + /** + * 录屏设置;0-不保存,1-全部保存,2-出错保存
+ * + * @param screenRecordSet 录屏设置;0-不保存,1-全部保存,2-出错保存 + */ + public void setScreenRecordSet(String screenRecordSet) + { + this.screenRecordSet = screenRecordSet; + } + /** + * 截图设置;0-不保存,1-全部保存,2-出错保存
+ */ + public String getScreenshotSet() + { + return screenshotSet; + } + + /** + * 截图设置;0-不保存,1-全部保存,2-出错保存
+ * + * @param screenshotSet 截图设置;0-不保存,1-全部保存,2-出错保存 + */ + public void setScreenshotSet(String screenshotSet) + { + this.screenshotSet = screenshotSet; + } + /** + * 优先级;0-低,1-高
+ */ + public String getPriority() + { + return priority; + } + + /** + * 优先级;0-低,1-高
+ * + * @param priority 优先级;0-低,1-高 + */ + public void setPriority(String priority) + { + this.priority = priority; + } + /** + * Cron表达式
+ */ + public String getCronExpr() + { + return cronExpr; + } + + /** + * Cron表达式
+ * + * @param cronExpr Cron表达式 + */ + public void setCronExpr(String cronExpr) + { + this.cronExpr = cronExpr; + } + /** + * 前置计划ID
+ */ + public String getUpFrontPlanId() + { + return upFrontPlanId; + } + + /** + * 前置计划ID
+ * + * @param upFrontPlanId 前置计划ID + */ + public void setUpFrontPlanId(String upFrontPlanId) + { + this.upFrontPlanId = upFrontPlanId; + } + /** + * 触发链接
+ */ + public String getWebhookUrl() + { + return webhookUrl; + } + + /** + * 触发链接
+ * + * @param webhookUrl 触发链接 + */ + public void setWebhookUrl(String webhookUrl) + { + this.webhookUrl = webhookUrl; + } + /** + * 密保令牌
+ */ + public String getWebhookToken() + { + return webhookToken; + } + + /** + * 密保令牌
+ * + * @param webhookToken 密保令牌 + */ + public void setWebhookToken(String webhookToken) + { + this.webhookToken = webhookToken; + } + /** + * 是否发送飞狼;0-否,1-是
+ */ + public Boolean getSendMail() + { + return sendMail; + } + + /** + * 是否发送飞狼;0-否,1-是
+ * + * @param sendMail 是否发送飞狼;0-否,1-是 + */ + public void setSendMail(Boolean sendMail) + { + this.sendMail = sendMail; + } + /** + * 飞狼用户;当需要发送飞狼时不能为空
+ */ + public String getMailAddress() + { + return mailAddress; + } + + /** + * 飞狼用户;当需要发送飞狼时不能为空
+ * + * @param mailAddress 飞狼用户;当需要发送飞狼时不能为空 + */ + public void setMailAddress(String mailAddress) + { + this.mailAddress = mailAddress; + } + /** + * 是否失败重试;0-否,1-是
+ */ + public Boolean getFailRetry() + { + return failRetry; + } + + /** + * 是否失败重试;0-否,1-是
+ * + * @param failRetry 是否失败重试;0-否,1-是 + */ + public void setFailRetry(Boolean failRetry) + { + this.failRetry = failRetry; + } + /** + * 失败重试次数
+ */ + public Integer getFailRetryCount() + { + return failRetryCount; + } + + /** + * 失败重试次数
+ * + * @param failRetryCount 失败重试次数 + */ + public void setFailRetryCount(Integer failRetryCount) + { + this.failRetryCount = failRetryCount; + } + /** + * 是否失败生成计划;0-否,1-是
+ */ + public Boolean getFailCreatePlan() + { + return failCreatePlan; + } + + /** + * 是否失败生成计划;0-否,1-是
+ * + * @param failCreatePlan 是否失败生成计划;0-否,1-是 + */ + public void setFailCreatePlan(Boolean failCreatePlan) + { + this.failCreatePlan = failCreatePlan; + } + /** + * 最近执行时间
+ */ + public Date getLastExecTime() + { + if(lastExecTime != null) + { + return (Date)lastExecTime.clone(); + } + return null; + } + + /** + * 最近执行时间
+ * + * @param lastExecTime 最近执行时间 + */ + public void setLastExecTime(Date lastExecTime) + { + this.lastExecTime = lastExecTime; + } + /** + * 下次执行时间
+ */ + public Date getNextExecTime() + { + if(nextExecTime != null) + { + return (Date)nextExecTime.clone(); + } + return null; + } + + /** + * 下次执行时间
+ * + * @param nextExecTime 下次执行时间 + */ + public void setNextExecTime(Date nextExecTime) + { + this.nextExecTime = nextExecTime; + } + /** + * 最后批次号
+ */ + public String getLastBatchId() + { + return lastBatchId; + } + + /** + * 最后批次号
+ * + * @param lastBatchId 最后批次号 + */ + public void setLastBatchId(String lastBatchId) + { + this.lastBatchId = lastBatchId; + } + /** + * 最后批次等待中任务数
+ */ + public Integer getWaitingNum() + { + return waitingNum; + } + + /** + * 最后批次等待中任务数
+ * + * @param waitingNum 最后批次等待中任务数 + */ + public void setWaitingNum(Integer waitingNum) + { + this.waitingNum = waitingNum; + } + /** + * 最后批次执行中任务数
+ */ + public Integer getRunningNum() + { + return runningNum; + } + + /** + * 最后批次执行中任务数
+ * + * @param runningNum 最后批次执行中任务数 + */ + public void setRunningNum(Integer runningNum) + { + this.runningNum = runningNum; + } + /** + * 最后批次成功任务数
+ */ + public Integer getSuccessNum() + { + return successNum; + } + + /** + * 最后批次成功任务数
+ * + * @param successNum 最后批次成功任务数 + */ + public void setSuccessNum(Integer successNum) + { + this.successNum = successNum; + } + /** + * 最后批次执行失败任务数
+ */ + public Integer getExecFailNum() + { + return execFailNum; + } + + /** + * 最后批次执行失败任务数
+ * + * @param execFailNum 最后批次执行失败任务数 + */ + public void setExecFailNum(Integer execFailNum) + { + this.execFailNum = execFailNum; + } + /** + * 最后批次断言失败任务数
+ */ + public Integer getAssertFailNum() + { + return assertFailNum; + } + + /** + * 最后批次断言失败任务数
+ * + * @param assertFailNum 最后批次断言失败任务数 + */ + public void setAssertFailNum(Integer assertFailNum) + { + this.assertFailNum = assertFailNum; + } + /** + * 最后批次超时任务数
+ */ + public Integer getTimeoutNum() + { + return timeoutNum; + } + + /** + * 最后批次超时任务数
+ * + * @param timeoutNum 最后批次超时任务数 + */ + public void setTimeoutNum(Integer timeoutNum) + { + this.timeoutNum = timeoutNum; + } + /** + * 最后批次取消任务数
+ */ + public Integer getCancelNum() + { + return cancelNum; + } + + /** + * 最后批次取消任务数
+ * + * @param cancelNum 最后批次取消任务数 + */ + public void setCancelNum(Integer cancelNum) + { + this.cancelNum = cancelNum; + } + /** + * 创建人
+ */ + @Override + public String getCreatedBy() + { + return createdBy; + } + + /** + * 创建人
+ * + * @param createdBy 创建人 + */ + @Override + public void setCreatedBy(String createdBy) + { + this.createdBy = createdBy; + } + /** + * 创建时间
+ */ + @Override + public Date getCreatedTime() + { + if(createdTime != null) + { + return (Date)createdTime.clone(); + } + return null; + } + + /** + * 创建时间
+ * + * @param createdTime 创建时间 + */ + @Override + public void setCreatedTime(Date createdTime) + { + if(createdTime != null) + { + this.createdTime = (Date)createdTime.clone(); + } + } + /** + * 更新人
+ */ + @Override + public String getUpdatedBy() + { + return updatedBy; + } + + /** + * 更新人
+ * + * @param updatedBy 更新人 + */ + @Override + public void setUpdatedBy(String updatedBy) + { + this.updatedBy = updatedBy; + } + /** + * 更新时间
+ */ + @Override + public Date getUpdatedTime() + { + if(updatedTime != null) + { + return (Date)updatedTime.clone(); + } + return null; + } + + /** + * 更新时间
+ * + * @param updatedTime 更新时间 + */ + @Override + public void setUpdatedTime(Date updatedTime) + { + if(updatedTime != null) + { + this.updatedTime = (Date)updatedTime.clone(); + } + } + /** + * 是否删除;0-否,1-是
+ */ + public Boolean getDeleted() + { + return deleted; + } + + /** + * 是否删除;0-否,1-是
+ * + * @param deleted 是否删除;0-否,1-是 + */ + public void setDeleted(Boolean deleted) + { + this.deleted = deleted; + } + /** + * 是否定时触发 0-否,1-是
+ */ + public Boolean getHasCorn() + { + return hasCorn; + } + + /** + * 是否定时触发 0-否,1-是
+ * + * @param hasCorn 是否定时触发 0-否,1-是 + */ + public void setHasCorn(Boolean hasCorn) + { + this.hasCorn = hasCorn; + } + /** + * 是否存在前置计划 0-否,1-是
+ */ + public Boolean getHasUpFront() + { + return hasUpFront; + } + + /** + * 是否存在前置计划 0-否,1-是
+ * + * @param hasUpFront 是否存在前置计划 0-否,1-是 + */ + public void setHasUpFront(Boolean hasUpFront) + { + this.hasUpFront = hasUpFront; + } + /** + * 是否勾选webhook触发 0-否,1-是
+ */ + public Boolean getHasWebhook() + { + return hasWebhook; + } + + /** + * 是否勾选webhook触发 0-否,1-是
+ * + * @param hasWebhook 是否勾选webhook触发 0-否,1-是 + */ + public void setHasWebhook(Boolean hasWebhook) + { + this.hasWebhook = hasWebhook; + } + /** + * 用例变更标识;0-无,1-是
+ */ + public Boolean getCaseChangeFlag() + { + return caseChangeFlag; + } + + /** + * 用例变更标识;0-无,1-是
+ * + * @param caseChangeFlag 用例变更标识;0-无,1-是 + */ + public void setCaseChangeFlag(Boolean caseChangeFlag) + { + this.caseChangeFlag = caseChangeFlag; + } + + public String getPrincipalId() { + return principalId; + } + + public void setPrincipalId(String principalId) { + this.principalId = principalId; + } + + public Integer getIsDeleted() { + return isDeleted; + } + + public void setIsDeleted(Integer isDeleted) { + this.isDeleted = isDeleted; + } + public AtuPlanInfo() + { + } + + public String getRetryStrategy() { + return retryStrategy; + } + + public void setRetryStrategy(String retryStrategy) { + this.retryStrategy = retryStrategy; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanSceneCaseTask.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanSceneCaseTask.java new file mode 100644 index 0000000..65d42ce --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanSceneCaseTask.java @@ -0,0 +1,643 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2024 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.common.db.Partition; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; + + +/** + * 计划场景用例节点任务表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2024-07-03 18:59:03
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "计划场景用例节点任务表") +public class AtuPlanSceneCaseTask extends Partition implements Serializable +{ + public static final String KEY_id = "id"; + public static final String KEY_taskId = "taskId"; + public static final String KEY_scriptId = "scriptId"; + public static final String KEY_versionId = "versionId"; + public static final String KEY_versionName = "versionName"; + public static final String KEY_scriptName = "scriptName"; + public static final String KEY_scriptJson = "scriptJson"; + public static final String KEY_nodeId = "nodeId"; + public static final String KEY_nodeType = "nodeType"; + public static final String KEY_nodeParams = "nodeParams"; + public static final String KEY_prevNodeId = "prevNodeId"; + public static final String KEY_nextNodeId = "nextNodeId"; + public static final String KEY_lineId = "lineId"; + public static final String KEY_engineId = "engineId"; + public static final String KEY_deviceId = "deviceId"; + public static final String KEY_appId = "appId"; + public static final String KEY_status = "status"; + public static final String KEY_startTime = "startTime"; + public static final String KEY_endTime = "endTime"; + public static final String KEY_errorMsg = "errorMsg"; + public static final String KEY_videoUrl = "videoUrl"; + public static final String KEY_execResultFile = "execResultFile"; + public static final String KEY_perDataPath = "perDataPath"; + public static final String KEY_createdTime = "createdTime"; + public static final String KEY_lastHeartbeatTime = "lastHeartbeatTime"; + + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 任务主键
+ */ + @ApiModelProperty("任务主键") + @Size(max = 32, message="任务主键-taskId: 数据长度不能 > 32" ) + private String taskId; + /** + * 脚本主键
+ */ + @ApiModelProperty("脚本主键") + @Size(max = 32, message="脚本主键-scriptId: 数据长度不能 > 32" ) + private String scriptId; + /** + * 脚本版本id
+ */ + @ApiModelProperty("脚本版本id") + private Integer versionId; + /** + * 脚本版本名称
+ */ + @ApiModelProperty("脚本版本名称") + @Size(max = 255, message="脚本版本名称-versionName: 数据长度不能 > 255" ) + private String versionName; + /** + * 脚本名称
+ */ + @ApiModelProperty("脚本名称") + @Size(max = 90, message="脚本名称-scriptName: 数据长度不能 > 90" ) + private String scriptName; + /** + * 脚本存放地址
+ */ + @ApiModelProperty("脚本存放地址") + @Size(max = 100, message="脚本存放地址-scriptJson: 数据长度不能 > 100" ) + private String scriptJson; + /** + * 节点编号
+ */ + @ApiModelProperty("节点编号") + @Size(max = 32, message="节点编号-nodeId: 数据长度不能 > 32" ) + private String nodeId; + /** + * 节点类型;1-接口,2-PC/BS,3-PC/CS,4-安卓,5-ios
+ */ + @ApiModelProperty("节点类型;1-接口,2-PC/BS,3-PC/CS,4-安卓,5-ios") + @Size(max = 1, message="节点类型;1-接口,2-PC/BS,3-PC/CS,4-安卓,5-ios-nodeType: 数据长度不能 > 1" ) + private String nodeType; + /** + * 节点参数
+ */ + @ApiModelProperty("节点参数") + @Size(max = 65535, message="节点参数-nodeParams: 数据长度不能 > 65535" ) + private String nodeParams; + /** + * 上一节点编号
+ */ + @ApiModelProperty("上一节点编号") + @Size(max = 32, message="上一节点编号-prevNodeId: 数据长度不能 > 32" ) + private String prevNodeId; + /** + * 下一节点编号
+ */ + @ApiModelProperty("下一节点编号") + @Size(max = 32, message="下一节点编号-nextNodeId: 数据长度不能 > 32" ) + private String nextNodeId; + /** + * 下一节点线编号
+ */ + @ApiModelProperty("下一节点线编号") + @Size(max = 32, message="下一节点线编号-lineId: 数据长度不能 > 32" ) + private String lineId; + /** + * 引擎主键
+ */ + @ApiModelProperty("引擎主键") + @Size(max = 32, message="引擎主键-engineId: 数据长度不能 > 32" ) + private String engineId; + /** + * 设备主键
+ */ + @ApiModelProperty("设备主键") + @Size(max = 128, message="设备主键-deviceId: 数据长度不能 > 128" ) + private String deviceId; + /** + * 应用主键
+ */ + @ApiModelProperty("应用主键") + @Size(max = 32, message="应用主键-appId: 数据长度不能 > 32" ) + private String appId; + /** + * 状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时
+ */ + @ApiModelProperty("状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时") + @Size(max = 1, message="状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时-status: 数据长度不能 > 1" ) + private String status; + /** + * 开始时间
+ */ + @ApiModelProperty("开始时间") + private Long startTime; + /** + * 结束时间
+ */ + @ApiModelProperty("结束时间") + private Long endTime; + /** + * 错误信息
+ */ + @ApiModelProperty("错误信息") + @Size(max = 65535, message="错误信息-errorMsg: 数据长度不能 > 65535" ) + private String errorMsg; + /** + * 视频地址
+ */ + @ApiModelProperty("视频地址") + @Size(max = 255, message="视频地址-videoUrl: 数据长度不能 > 255" ) + private String videoUrl; + /** + * 执行结果文件
+ */ + @ApiModelProperty("执行结果文件") + @Size(max = 512, message="执行结果文件-execResultFile: 数据长度不能 > 512" ) + private String execResultFile; + /** + * 任务性能数据文件存放地址
+ */ + @ApiModelProperty("任务性能数据文件存放地址") + @Size(max = 128, message="任务性能数据文件存放地址-perDataPath: 数据长度不能 > 128" ) + private String perDataPath; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 执行心跳时间
+ */ + @ApiModelProperty("执行心跳时间") + private Date lastHeartbeatTime; + + /** + * 主键
+ */ + public String getId() + { + return id; + } + + /** + * 主键
+ * + * @param id 主键 + */ + public void setId(String id) + { + this.id = id; + } + /** + * 任务主键
+ */ + public String getTaskId() + { + return taskId; + } + + /** + * 任务主键
+ * + * @param taskId 任务主键 + */ + public void setTaskId(String taskId) + { + this.taskId = taskId; + } + /** + * 脚本主键
+ */ + public String getScriptId() + { + return scriptId; + } + + /** + * 脚本主键
+ * + * @param scriptId 脚本主键 + */ + public void setScriptId(String scriptId) + { + this.scriptId = scriptId; + } + /** + * 脚本版本id
+ */ + public Integer getVersionId() + { + return versionId; + } + + /** + * 脚本版本id
+ * + * @param versionId 脚本版本id + */ + public void setVersionId(Integer versionId) + { + this.versionId = versionId; + } + /** + * 脚本版本名称
+ */ + public String getVersionName() + { + return versionName; + } + + /** + * 脚本版本名称
+ * + * @param versionName 脚本版本名称 + */ + public void setVersionName(String versionName) + { + this.versionName = versionName; + } + /** + * 脚本名称
+ */ + public String getScriptName() + { + return scriptName; + } + + /** + * 脚本名称
+ * + * @param scriptName 脚本名称 + */ + public void setScriptName(String scriptName) + { + this.scriptName = scriptName; + } + /** + * 脚本存放地址
+ */ + public String getScriptJson() + { + return scriptJson; + } + + /** + * 脚本存放地址
+ * + * @param scriptJson 脚本存放地址 + */ + public void setScriptJson(String scriptJson) + { + this.scriptJson = scriptJson; + } + /** + * 节点编号
+ */ + public String getNodeId() + { + return nodeId; + } + + /** + * 节点编号
+ * + * @param nodeId 节点编号 + */ + public void setNodeId(String nodeId) + { + this.nodeId = nodeId; + } + /** + * 节点类型;1-接口,2-PC/BS,3-PC/CS,4-安卓,5-ios
+ */ + public String getNodeType() + { + return nodeType; + } + + /** + * 节点类型;1-接口,2-PC/BS,3-PC/CS,4-安卓,5-ios
+ * + * @param nodeType 节点类型;1-接口,2-PC/BS,3-PC/CS,4-安卓,5-ios + */ + public void setNodeType(String nodeType) + { + this.nodeType = nodeType; + } + /** + * 节点参数
+ */ + public String getNodeParams() + { + return nodeParams; + } + + /** + * 节点参数
+ * + * @param nodeParams 节点参数 + */ + public void setNodeParams(String nodeParams) + { + this.nodeParams = nodeParams; + } + /** + * 上一节点编号
+ */ + public String getPrevNodeId() + { + return prevNodeId; + } + + /** + * 上一节点编号
+ * + * @param prevNodeId 上一节点编号 + */ + public void setPrevNodeId(String prevNodeId) + { + this.prevNodeId = prevNodeId; + } + /** + * 下一节点编号
+ */ + public String getNextNodeId() + { + return nextNodeId; + } + + /** + * 下一节点编号
+ * + * @param nextNodeId 下一节点编号 + */ + public void setNextNodeId(String nextNodeId) + { + this.nextNodeId = nextNodeId; + } + /** + * 下一节点线编号
+ */ + public String getLineId() + { + return lineId; + } + + /** + * 下一节点线编号
+ * + * @param lineId 下一节点线编号 + */ + public void setLineId(String lineId) + { + this.lineId = lineId; + } + /** + * 引擎主键
+ */ + public String getEngineId() + { + return engineId; + } + + /** + * 引擎主键
+ * + * @param engineId 引擎主键 + */ + public void setEngineId(String engineId) + { + this.engineId = engineId; + } + /** + * 设备主键
+ */ + public String getDeviceId() + { + return deviceId; + } + + /** + * 设备主键
+ * + * @param deviceId 设备主键 + */ + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + /** + * 应用主键
+ */ + public String getAppId() + { + return appId; + } + + /** + * 应用主键
+ * + * @param appId 应用主键 + */ + public void setAppId(String appId) + { + this.appId = appId; + } + /** + * 状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时
+ */ + public String getStatus() + { + return status; + } + + /** + * 状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时
+ * + * @param status 状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时 + */ + public void setStatus(String status) + { + this.status = status; + } + /** + * 开始时间
+ */ + public Long getStartTime() + { + return startTime; + } + + /** + * 开始时间
+ * + * @param startTime 开始时间 + */ + public void setStartTime(Long startTime) + { + this.startTime = startTime; + } + /** + * 结束时间
+ */ + public Long getEndTime() + { + return endTime; + } + + /** + * 结束时间
+ * + * @param endTime 结束时间 + */ + public void setEndTime(Long endTime) + { + this.endTime = endTime; + } + /** + * 错误信息
+ */ + public String getErrorMsg() + { + return errorMsg; + } + + /** + * 错误信息
+ * + * @param errorMsg 错误信息 + */ + public void setErrorMsg(String errorMsg) + { + this.errorMsg = errorMsg; + } + /** + * 视频地址
+ */ + public String getVideoUrl() + { + return videoUrl; + } + + /** + * 视频地址
+ * + * @param videoUrl 视频地址 + */ + public void setVideoUrl(String videoUrl) + { + this.videoUrl = videoUrl; + } + /** + * 执行结果文件
+ */ + public String getExecResultFile() + { + return execResultFile; + } + + /** + * 执行结果文件
+ * + * @param execResultFile 执行结果文件 + */ + public void setExecResultFile(String execResultFile) + { + this.execResultFile = execResultFile; + } + /** + * 任务性能数据文件存放地址
+ */ + public String getPerDataPath() + { + return perDataPath; + } + + /** + * 任务性能数据文件存放地址
+ * + * @param perDataPath 任务性能数据文件存放地址 + */ + public void setPerDataPath(String perDataPath) + { + this.perDataPath = perDataPath; + } + /** + * 创建时间
+ */ + public Date getCreatedTime() + { + if(createdTime != null) + { + return (Date)createdTime.clone(); + } + return null; + } + + /** + * 创建时间
+ * + * @param createdTime 创建时间 + */ + public void setCreatedTime(Date createdTime) + { + if(createdTime != null) + { + this.createdTime = (Date)createdTime.clone(); + } + } + /** + * 执行心跳时间
+ */ + public Date getLastHeartbeatTime() + { + if(lastHeartbeatTime != null) + { + return (Date)lastHeartbeatTime.clone(); + } + return null; + } + + /** + * 执行心跳时间
+ * + * @param lastHeartbeatTime 执行心跳时间 + */ + public void setLastHeartbeatTime(Date lastHeartbeatTime) + { + if(lastHeartbeatTime != null) + { + this.lastHeartbeatTime = (Date)lastHeartbeatTime.clone(); + } + } + + public AtuPlanSceneCaseTask() + { + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanScriptLink.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanScriptLink.java new file mode 100644 index 0000000..186259f --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanScriptLink.java @@ -0,0 +1,128 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.common.db.Partition; + +import javax.validation.constraints.Size; +import java.io.Serializable; + + +/** + * 计划脚本关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-31 16:48:02
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "计划脚本关联表") +public class AtuPlanScriptLink extends Partition implements Serializable +{ + public static final String KEY_id = "id"; + public static final String KEY_planId = "planId"; + public static final String KEY_scriptId = "scriptId"; + public static final String KEY_scriptType = "scriptType"; + + /** + * 主键
+ */ + @ApiModelProperty("主键") + private Long id; + /** + * 计划id
+ */ + @ApiModelProperty("计划id") + @Size(max = 32, message="计划id-planId: 数据长度不能 > 32" ) + private String planId; + /** + * 脚本id
+ */ + @ApiModelProperty("脚本id") + @Size(max = 32, message="脚本id-scriptId: 数据长度不能 > 32" ) + private String scriptId; + /** + * 脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios
+ */ + @ApiModelProperty("脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios") + @Size(max = 32, message="脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios-scriptType: 数据长度不能 > 32" ) + private String scriptType; + + /** + * 主键
+ */ + public Long getId() + { + return id; + } + + /** + * 主键
+ * + * @param id 主键 + */ + public void setId(Long id) + { + this.id = id; + } + /** + * 计划id
+ */ + public String getPlanId() + { + return planId; + } + + /** + * 计划id
+ * + * @param planId 计划id + */ + public void setPlanId(String planId) + { + this.planId = planId; + } + /** + * 脚本id
+ */ + public String getScriptId() + { + return scriptId; + } + + /** + * 脚本id
+ * + * @param scriptId 脚本id + */ + public void setScriptId(String scriptId) + { + this.scriptId = scriptId; + } + /** + * 脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios
+ */ + public String getScriptType() + { + return scriptType; + } + + /** + * 脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios
+ * + * @param scriptType 脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios + */ + public void setScriptType(String scriptType) + { + this.scriptType = scriptType; + } + + public AtuPlanScriptLink() + { + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanScriptLinkMd.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanScriptLinkMd.java new file mode 100644 index 0000000..3783f53 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanScriptLinkMd.java @@ -0,0 +1,153 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.Size; + +import net.northking.cctp.common.db.Partition; + +import java.io.Serializable; + + +/** + * 计划脚本关联副表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-09-04 09:44:17
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "计划脚本关联副表") +public class AtuPlanScriptLinkMd extends Partition implements Serializable +{ + public static final String KEY_id = "id"; + public static final String KEY_userId = "userId"; + public static final String KEY_planId = "planId"; + public static final String KEY_scriptId = "scriptId"; + public static final String KEY_scriptType = "scriptType"; + + /** + * 主键
+ */ + @ApiModelProperty("主键") + private Long id; + /** + * 编辑人id
+ */ + @ApiModelProperty("编辑人id") + @Size(max = 32, message="编辑人id-userId: 数据长度不能 > 32" ) + private String userId; + /** + * 计划id
+ */ + @ApiModelProperty("计划id") + @Size(max = 32, message="计划id-planId: 数据长度不能 > 32" ) + private String planId; + /** + * 脚本id
+ */ + @ApiModelProperty("脚本id") + @Size(max = 32, message="脚本id-scriptId: 数据长度不能 > 32" ) + private String scriptId; + /** + * 脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios
+ */ + @ApiModelProperty("脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios") + @Size(max = 32, message="脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios-scriptType: 数据长度不能 > 32" ) + private String scriptType; + + /** + * 主键
+ */ + public Long getId() + { + return id; + } + + /** + * 主键
+ * + * @param id 主键 + */ + public void setId(Long id) + { + this.id = id; + } + /** + * 编辑人id
+ */ + public String getUserId() + { + return userId; + } + + /** + * 编辑人id
+ * + * @param userId 编辑人id + */ + public void setUserId(String userId) + { + this.userId = userId; + } + /** + * 计划id
+ */ + public String getPlanId() + { + return planId; + } + + /** + * 计划id
+ * + * @param planId 计划id + */ + public void setPlanId(String planId) + { + this.planId = planId; + } + /** + * 脚本id
+ */ + public String getScriptId() + { + return scriptId; + } + + /** + * 脚本id
+ * + * @param scriptId 脚本id + */ + public void setScriptId(String scriptId) + { + this.scriptId = scriptId; + } + /** + * 脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios
+ */ + public String getScriptType() + { + return scriptType; + } + + /** + * 脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios
+ * + * @param scriptType 脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios + */ + public void setScriptType(String scriptType) + { + this.scriptType = scriptType; + } + + public AtuPlanScriptLinkMd() + { + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanTask.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanTask.java new file mode 100644 index 0000000..d685d4d --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanTask.java @@ -0,0 +1,667 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.common.db.Partition; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; + + +/** + * 计划执行任务表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-11-13 14:35:52
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "计划执行任务表") +public class AtuPlanTask extends Partition implements Serializable +{ + public static final String KEY_id = "id"; + public static final String KEY_batchId = "batchId"; + public static final String KEY_envId = "envId"; + public static final String KEY_scriptId = "scriptId"; + public static final String KEY_versionId = "versionId"; + public static final String KEY_versionName = "versionName"; + public static final String KEY_scriptName = "scriptName"; + public static final String KEY_scriptJson = "scriptJson"; + public static final String KEY_caseId = "caseId"; + public static final String KEY_caseNo = "caseNo"; + public static final String KEY_caseName = "caseName"; + public static final String KEY_caseType = "caseType"; + public static final String KEY_caseParam = "caseParam"; + public static final String KEY_engineId = "engineId"; + public static final String KEY_deviceId = "deviceId"; + public static final String KEY_appId = "appId"; + public static final String KEY_status = "status"; + public static final String KEY_startTime = "startTime"; + public static final String KEY_endTime = "endTime"; + public static final String KEY_errorMsg = "errorMsg"; + public static final String KEY_videoUrl = "videoUrl"; + public static final String KEY_execResultFile = "execResultFile"; + public static final String KEY_bugId = "bugId"; + public static final String KEY_perDataPath = "perDataPath"; + public static final String KEY_createdTime = "createdTime"; + public static final String KEY_lastHeartbeatTime = "lastHeartbeatTime"; + + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 调度主键
+ */ + @ApiModelProperty("调度主键") + @Size(max = 32, message="调度主键-batchId: 数据长度不能 > 32" ) + private String batchId; + /** + * 环境id
+ */ + @ApiModelProperty("环境id") + @Size(max = 32, message="环境id-envId: 数据长度不能 > 32" ) + private String envId; + /** + * 脚本主键
+ */ + @ApiModelProperty("脚本主键") + @Size(max = 32, message="脚本主键-scriptId: 数据长度不能 > 32" ) + private String scriptId; + /** + * 脚本版本id
+ */ + @ApiModelProperty("脚本版本id") + private Integer versionId; + /** + * 脚本版本名称
+ */ + @ApiModelProperty("脚本版本名称") + @Size(max = 255, message="脚本版本名称-versionName: 数据长度不能 > 255" ) + private String versionName; + /** + * 脚本名称
+ */ + @ApiModelProperty("脚本名称") + @Size(max = 90, message="脚本名称-scriptName: 数据长度不能 > 90" ) + private String scriptName; + /** + * 脚本存放地址
+ */ + @ApiModelProperty("脚本存放地址") + @Size(max = 100, message="脚本存放地址-scriptJson: 数据长度不能 > 100" ) + private String scriptJson; + /** + * 用例主键
+ */ + @ApiModelProperty("用例主键") + @Size(max = 32, message="用例主键-caseId: 数据长度不能 > 32" ) + private String caseId; + /** + * 用例编号
+ */ + @ApiModelProperty("用例编号") + @Size(max = 32, message="用例编号-caseNo: 数据长度不能 > 32" ) + private String caseNo; + /** + * 用例名称
+ */ + @ApiModelProperty("用例名称") + @Size(max = 90, message="用例名称-caseName: 数据长度不能 > 90" ) + private String caseName; + /** + * 用例类型;0-接口,1-PC/BS,2-PC/CS,3-安卓,4-ios,5-场景用例
+ */ + @ApiModelProperty("用例类型;0-接口,1-PC/BS,2-PC/CS,3-安卓,4-ios,5-场景用例") + @Size(max = 1, message="用例类型;0-接口,1-PC/BS,2-PC/CS,3-安卓,4-ios,5-场景用例-caseType: 数据长度不能 > 1" ) + private String caseType; + /** + * 用例参数
+ */ + @ApiModelProperty("用例参数") + @Size(max = 65535, message="用例参数-caseParam: 数据长度不能 > 65535" ) + private String caseParam; + /** + * 引擎主键
+ */ + @ApiModelProperty("引擎主键") + @Size(max = 32, message="引擎主键-engineId: 数据长度不能 > 32" ) + private String engineId; + /** + * 设备主键
+ */ + @ApiModelProperty("设备主键") + @Size(max = 128, message="设备主键-deviceId: 数据长度不能 > 128" ) + private String deviceId; + /** + * 应用主键
+ */ + @ApiModelProperty("应用主键") + @Size(max = 32, message="应用主键-appId: 数据长度不能 > 32" ) + private String appId; + /** + * 状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时
+ */ + @ApiModelProperty("状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时") + @Size(max = 1, message="状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时-status: 数据长度不能 > 1" ) + private String status; + /** + * 开始时间
+ */ + @ApiModelProperty("开始时间") + private Long startTime; + /** + * 结束时间
+ */ + @ApiModelProperty("结束时间") + private Long endTime; + /** + * 错误信息
+ */ + @ApiModelProperty("错误信息") + @Size(max = 65535, message="错误信息-errorMsg: 数据长度不能 > 65535" ) + private String errorMsg; + /** + * 视频地址
+ */ + @ApiModelProperty("视频地址") + @Size(max = 255, message="视频地址-videoUrl: 数据长度不能 > 255" ) + private String videoUrl; + /** + * 执行结果文件
+ */ + @ApiModelProperty("执行结果文件") + @Size(max = 512, message="执行结果文件-execResultFile: 数据长度不能 > 512" ) + private String execResultFile; + /** + * 断言缺陷主键
+ */ + @ApiModelProperty("断言缺陷主键") + @Size(max = 32, message="断言缺陷主键-bugId: 数据长度不能 > 32" ) + private String bugId; + /** + * 任务性能数据文件存放地址
+ */ + @ApiModelProperty("任务性能数据文件存放地址") + @Size(max = 128, message="任务性能数据文件存放地址-perDataPath: 数据长度不能 > 128" ) + private String perDataPath; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 执行心跳时间
+ */ + @ApiModelProperty("执行心跳时间") + private Date lastHeartbeatTime; + + /** + * 主键
+ */ + public String getId() + { + return id; + } + + /** + * 主键
+ * + * @param id 主键 + */ + public void setId(String id) + { + this.id = id; + } + /** + * 调度主键
+ */ + public String getBatchId() + { + return batchId; + } + + /** + * 调度主键
+ * + * @param batchId 调度主键 + */ + public void setBatchId(String batchId) + { + this.batchId = batchId; + } + /** + * 环境id
+ */ + public String getEnvId() + { + return envId; + } + + /** + * 环境id
+ * + * @param envId 环境id + */ + public void setEnvId(String envId) + { + this.envId = envId; + } + /** + * 脚本主键
+ */ + public String getScriptId() + { + return scriptId; + } + + /** + * 脚本主键
+ * + * @param scriptId 脚本主键 + */ + public void setScriptId(String scriptId) + { + this.scriptId = scriptId; + } + /** + * 脚本版本id
+ */ + public Integer getVersionId() + { + return versionId; + } + + /** + * 脚本版本id
+ * + * @param versionId 脚本版本id + */ + public void setVersionId(Integer versionId) + { + this.versionId = versionId; + } + /** + * 脚本版本名称
+ */ + public String getVersionName() + { + return versionName; + } + + /** + * 脚本版本名称
+ * + * @param versionName 脚本版本名称 + */ + public void setVersionName(String versionName) + { + this.versionName = versionName; + } + /** + * 脚本名称
+ */ + public String getScriptName() + { + return scriptName; + } + + /** + * 脚本名称
+ * + * @param scriptName 脚本名称 + */ + public void setScriptName(String scriptName) + { + this.scriptName = scriptName; + } + /** + * 脚本存放地址
+ */ + public String getScriptJson() + { + return scriptJson; + } + + /** + * 脚本存放地址
+ * + * @param scriptJson 脚本存放地址 + */ + public void setScriptJson(String scriptJson) + { + this.scriptJson = scriptJson; + } + /** + * 用例主键
+ */ + public String getCaseId() + { + return caseId; + } + + /** + * 用例主键
+ * + * @param caseId 用例主键 + */ + public void setCaseId(String caseId) + { + this.caseId = caseId; + } + /** + * 用例编号
+ */ + public String getCaseNo() + { + return caseNo; + } + + /** + * 用例编号
+ * + * @param caseNo 用例编号 + */ + public void setCaseNo(String caseNo) + { + this.caseNo = caseNo; + } + /** + * 用例名称
+ */ + public String getCaseName() + { + return caseName; + } + + /** + * 用例名称
+ * + * @param caseName 用例名称 + */ + public void setCaseName(String caseName) + { + this.caseName = caseName; + } + /** + * 用例类型;0-接口,1-PC/BS,2-PC/CS,3-安卓,4-ios,5-场景用例
+ */ + public String getCaseType() + { + return caseType; + } + + /** + * 用例类型;0-接口,1-PC/BS,2-PC/CS,3-安卓,4-ios,5-场景用例
+ * + * @param caseType 用例类型;0-接口,1-PC/BS,2-PC/CS,3-安卓,4-ios,5-场景用例 + */ + public void setCaseType(String caseType) + { + this.caseType = caseType; + } + /** + * 用例参数
+ */ + public String getCaseParam() + { + return caseParam; + } + + /** + * 用例参数
+ * + * @param caseParam 用例参数 + */ + public void setCaseParam(String caseParam) + { + this.caseParam = caseParam; + } + /** + * 引擎主键
+ */ + public String getEngineId() + { + return engineId; + } + + /** + * 引擎主键
+ * + * @param engineId 引擎主键 + */ + public void setEngineId(String engineId) + { + this.engineId = engineId; + } + /** + * 设备主键
+ */ + public String getDeviceId() + { + return deviceId; + } + + /** + * 设备主键
+ * + * @param deviceId 设备主键 + */ + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + /** + * 应用主键
+ */ + public String getAppId() + { + return appId; + } + + /** + * 应用主键
+ * + * @param appId 应用主键 + */ + public void setAppId(String appId) + { + this.appId = appId; + } + /** + * 状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时
+ */ + public String getStatus() + { + return status; + } + + /** + * 状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时
+ * + * @param status 状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时 + */ + public void setStatus(String status) + { + this.status = status; + } + /** + * 开始时间
+ */ + public Long getStartTime() + { + return startTime; + } + + /** + * 开始时间
+ * + * @param startTime 开始时间 + */ + public void setStartTime(Long startTime) + { + this.startTime = startTime; + } + /** + * 结束时间
+ */ + public Long getEndTime() + { + return endTime; + } + + /** + * 结束时间
+ * + * @param endTime 结束时间 + */ + public void setEndTime(Long endTime) + { + this.endTime = endTime; + } + /** + * 错误信息
+ */ + public String getErrorMsg() + { + return errorMsg; + } + + /** + * 错误信息
+ * + * @param errorMsg 错误信息 + */ + public void setErrorMsg(String errorMsg) + { + this.errorMsg = errorMsg; + } + /** + * 视频地址
+ */ + public String getVideoUrl() + { + return videoUrl; + } + + /** + * 视频地址
+ * + * @param videoUrl 视频地址 + */ + public void setVideoUrl(String videoUrl) + { + this.videoUrl = videoUrl; + } + /** + * 执行结果文件
+ */ + public String getExecResultFile() + { + return execResultFile; + } + + /** + * 执行结果文件
+ * + * @param execResultFile 执行结果文件 + */ + public void setExecResultFile(String execResultFile) + { + this.execResultFile = execResultFile; + } + /** + * 断言缺陷主键
+ */ + public String getBugId() + { + return bugId; + } + + /** + * 断言缺陷主键
+ * + * @param bugId 断言缺陷主键 + */ + public void setBugId(String bugId) + { + this.bugId = bugId; + } + /** + * 任务性能数据文件存放地址
+ */ + public String getPerDataPath() + { + return perDataPath; + } + + /** + * 任务性能数据文件存放地址
+ * + * @param perDataPath 任务性能数据文件存放地址 + */ + public void setPerDataPath(String perDataPath) + { + this.perDataPath = perDataPath; + } + /** + * 创建时间
+ */ + public Date getCreatedTime() + { + if(createdTime != null) + { + return (Date)createdTime.clone(); + } + return null; + } + + /** + * 创建时间
+ * + * @param createdTime 创建时间 + */ + public void setCreatedTime(Date createdTime) + { + if(createdTime != null) + { + this.createdTime = (Date)createdTime.clone(); + } + } + /** + * 执行心跳时间
+ */ + public Date getLastHeartbeatTime() + { + if(lastHeartbeatTime != null) + { + return (Date)lastHeartbeatTime.clone(); + } + return null; + } + + /** + * 执行心跳时间
+ * + * @param lastHeartbeatTime 执行心跳时间 + */ + public void setLastHeartbeatTime(Date lastHeartbeatTime) + { + if(lastHeartbeatTime != null) + { + this.lastHeartbeatTime = (Date)lastHeartbeatTime.clone(); + } + } + + public AtuPlanTask() + { + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanTaskRecord.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanTaskRecord.java new file mode 100644 index 0000000..5e4160f --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/AtuPlanTaskRecord.java @@ -0,0 +1,303 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2024 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.Size; + +import net.northking.cctp.common.db.POJO; +import net.northking.cctp.common.db.Partition; +import net.northking.cctp.common.db.entity.Entity; +import net.northking.cctp.common.validation.ValAddGroup; +import net.northking.cctp.common.validation.ValUpdateGroup; + +import java.math.BigDecimal; +import java.text.ParseException; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + + +/** + * 任务执行记录表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2024-10-16 17:02:48
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "任务执行记录表") +public class AtuPlanTaskRecord extends Partition implements POJO +{ + public static final String KEY_id = "id"; + public static final String KEY_taskId = "taskId"; + public static final String KEY_batchId = "batchId"; + public static final String KEY_execIdx = "execIdx"; + public static final String KEY_startTime = "startTime"; + public static final String KEY_endTime = "endTime"; + public static final String KEY_executeType = "executeType"; + public static final String KEY_status = "status"; + public static final String KEY_errorMsg = "errorMsg"; + public static final String KEY_videoUrl = "videoUrl"; + public static final String KEY_execResultFile = "execResultFile"; + + /** + * 记录id
+ */ + @ApiModelProperty("记录id") + @Size(max = 32, message="记录id-id: 数据长度不能 > 32" ) + private String id; + /** + * 任务id
+ */ + @ApiModelProperty("任务id") + @Size(max = 32, message="任务id-taskId: 数据长度不能 > 32" ) + private String taskId; + /** + * 批次id
+ */ + @ApiModelProperty("批次id") + @Size(max = 32, message="批次id-batchId: 数据长度不能 > 32" ) + private String batchId; + /** + * 执行序号
+ */ + @ApiModelProperty("执行序号") + private Integer execIdx; + /** + * 开始时间
+ */ + @ApiModelProperty("开始时间") + private Long startTime; + /** + * 结束时间
+ */ + @ApiModelProperty("结束时间") + private Long endTime; + /** + * 执行类型,0-正常执行|1-自动重试|2-手动重试
+ */ + @ApiModelProperty("执行类型,0-正常执行|1-自动重试|2-手动重试") + @Size(max = 10, message="执行类型,0-正常执行|1-自动重试|2-手动重试-executeType: 数据长度不能 > 10" ) + private String executeType; + /** + * 状态
+ */ + @ApiModelProperty("状态") + @Size(max = 10, message="状态-status: 数据长度不能 > 10" ) + private String status; + /** + * 错误信息
+ */ + @ApiModelProperty("错误信息") + @Size(max = 65535, message="错误信息-errorMsg: 数据长度不能 > 65535" ) + private String errorMsg; + /** + * 视频地址
+ */ + @ApiModelProperty("视频地址") + @Size(max = 255, message="视频地址-videoUrl: 数据长度不能 > 255" ) + private String videoUrl; + /** + * 执行结果文件
+ */ + @ApiModelProperty("执行结果文件") + @Size(max = 255, message="执行结果文件-execResultFile: 数据长度不能 > 255" ) + private String execResultFile; + + /** + * 记录id
+ */ + public String getId() + { + return id; + } + + /** + * 记录id
+ * + * @param id 记录id + */ + public void setId(String id) + { + this.id = id; + } + /** + * 任务id
+ */ + public String getTaskId() + { + return taskId; + } + + /** + * 任务id
+ * + * @param taskId 任务id + */ + public void setTaskId(String taskId) + { + this.taskId = taskId; + } + /** + * 批次id
+ */ + public String getBatchId() + { + return batchId; + } + + /** + * 批次id
+ * + * @param batchId 批次id + */ + public void setBatchId(String batchId) + { + this.batchId = batchId; + } + /** + * 执行序号
+ */ + public Integer getExecIdx() + { + return execIdx; + } + + /** + * 执行序号
+ * + * @param execIdx 执行序号 + */ + public void setExecIdx(Integer execIdx) + { + this.execIdx = execIdx; + } + /** + * 开始时间
+ */ + public Long getStartTime() + { + return startTime; + } + + /** + * 开始时间
+ * + * @param startTime 开始时间 + */ + public void setStartTime(Long startTime) + { + this.startTime = startTime; + } + /** + * 结束时间
+ */ + public Long getEndTime() + { + return endTime; + } + + /** + * 结束时间
+ * + * @param endTime 结束时间 + */ + public void setEndTime(Long endTime) + { + this.endTime = endTime; + } + /** + * 执行类型,0-正常执行|1-自动重试|2-手动重试
+ */ + public String getExecuteType() + { + return executeType; + } + + /** + * 执行类型,0-正常执行|1-自动重试|2-手动重试
+ * + * @param executeType 执行类型,0-正常执行|1-自动重试|2-手动重试 + */ + public void setExecuteType(String executeType) + { + this.executeType = executeType; + } + /** + * 状态
+ */ + public String getStatus() + { + return status; + } + + /** + * 状态
+ * + * @param status 状态 + */ + public void setStatus(String status) + { + this.status = status; + } + /** + * 错误信息
+ */ + public String getErrorMsg() + { + return errorMsg; + } + + /** + * 错误信息
+ * + * @param errorMsg 错误信息 + */ + public void setErrorMsg(String errorMsg) + { + this.errorMsg = errorMsg; + } + /** + * 视频地址
+ */ + public String getVideoUrl() + { + return videoUrl; + } + + /** + * 视频地址
+ * + * @param videoUrl 视频地址 + */ + public void setVideoUrl(String videoUrl) + { + this.videoUrl = videoUrl; + } + /** + * 执行结果文件
+ */ + public String getExecResultFile() + { + return execResultFile; + } + + /** + * 执行结果文件
+ * + * @param execResultFile 执行结果文件 + */ + public void setExecResultFile(String execResultFile) + { + this.execResultFile = execResultFile; + } + + public AtuPlanTaskRecord() + { + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/MqSynchronizeTask.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/MqSynchronizeTask.java new file mode 100644 index 0000000..5f136b9 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/entity/MqSynchronizeTask.java @@ -0,0 +1,16 @@ +package net.northking.cctp.executePlan.db.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class MqSynchronizeTask { + private String id; + + private String taskType; + + private String taskInfo; + + private Date createdTime; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanAppLinkServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanAppLinkServiceImpl.java new file mode 100644 index 0000000..aa6caf7 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanAppLinkServiceImpl.java @@ -0,0 +1,71 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.impl; + +import net.northking.cctp.executePlan.db.dao.AtuPlanAppLinkDao; +import net.northking.cctp.executePlan.db.service.AtuPlanAppLinkService; +import net.northking.cctp.executePlan.db.entity.AtuPlanAppLink; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.db.PaginationService; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + + +/** + * 计划应用关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-06 17:37:23
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "AtuPlanAppLinkServiceImpl") +public class AtuPlanAppLinkServiceImpl extends PaginationService implements AtuPlanAppLinkService +{ +private static final Logger logger = LoggerFactory.getLogger(AtuPlanAppLinkServiceImpl.class); + + private final AtuPlanAppLinkDao atuPlanAppLinkDao; + + public AtuPlanAppLinkServiceImpl(AtuPlanAppLinkDao atuPlanAppLinkDao) {this.atuPlanAppLinkDao = atuPlanAppLinkDao;} + + @Override + public BasicDao getDao() {return atuPlanAppLinkDao;} + + @Override + public AtuPlanAppLink createEntity() { return new AtuPlanAppLink();} + + @Override + protected void beforeInsert(AtuPlanAppLink record) { + + } + + @Override + protected void beforeUpdate(AtuPlanAppLink record) { + + } + + @Override + public String queryAppId(AtuPlanAppLink planAppLink) { + return atuPlanAppLinkDao.queryAppId(planAppLink); + } + + @Override + public void deleteAppByPlanId(String planId) { + this.atuPlanAppLinkDao.deleteAppByPlanId(planId); + } + + + + + + + +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanBatchDeviceLinkServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanBatchDeviceLinkServiceImpl.java new file mode 100644 index 0000000..6f525da --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanBatchDeviceLinkServiceImpl.java @@ -0,0 +1,72 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.impl; + +import net.northking.cctp.executePlan.db.dao.AtuPlanBatchDeviceLinkDao; +import net.northking.cctp.executePlan.db.service.AtuPlanBatchDeviceLinkService; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatchDeviceLink; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.db.PaginationService; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.List; + + +/** + * 计划批次设备关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-12 16:22:12
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "AtuPlanBatchDeviceLinkServiceImpl") +public class AtuPlanBatchDeviceLinkServiceImpl extends PaginationService implements AtuPlanBatchDeviceLinkService +{ +private static final Logger logger = LoggerFactory.getLogger(AtuPlanBatchDeviceLinkServiceImpl.class); + + private final AtuPlanBatchDeviceLinkDao atuPlanBatchDeviceLinkDao; + + public AtuPlanBatchDeviceLinkServiceImpl(AtuPlanBatchDeviceLinkDao atuPlanBatchDeviceLinkDao) {this.atuPlanBatchDeviceLinkDao = atuPlanBatchDeviceLinkDao;} + + @Override + public BasicDao getDao() {return atuPlanBatchDeviceLinkDao;} + + @Override + public AtuPlanBatchDeviceLink createEntity() { return new AtuPlanBatchDeviceLink();} + + @Override + protected void beforeInsert(AtuPlanBatchDeviceLink record) { + + } + + @Override + protected void beforeUpdate(AtuPlanBatchDeviceLink record) { + + } + + @Override + public List queryByOfflineDeviceId(String deviceId) { + return atuPlanBatchDeviceLinkDao.queryByOfflineDeviceId(deviceId); + } + + @Override + public Integer countOnlineDeviceByBatchId(String batchId) { + return atuPlanBatchDeviceLinkDao.countOnlineDeviceByBatchId(batchId); + } + + @Override + public Integer countDeviceByBatchId(String batchId) { + return atuPlanBatchDeviceLinkDao.countDeviceByBatchId(batchId); + } + +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanBatchServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanBatchServiceImpl.java new file mode 100644 index 0000000..247d524 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanBatchServiceImpl.java @@ -0,0 +1,102 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.impl; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.exception.InvalidException; +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.db.PaginationService; +import net.northking.cctp.executePlan.db.dao.AtuPlanBatchDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatch; +import net.northking.cctp.executePlan.db.service.AtuPlanBatchService; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchDetailDto; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + + +/** + * 计划执行批次表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-07 17:41:08
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "AtuPlanBatchServiceImpl") +public class AtuPlanBatchServiceImpl extends PaginationService implements AtuPlanBatchService +{ +private static final Logger logger = LoggerFactory.getLogger(AtuPlanBatchServiceImpl.class); + + private final AtuPlanBatchDao atuPlanBatchDao; + + public AtuPlanBatchServiceImpl(AtuPlanBatchDao atuPlanBatchDao) {this.atuPlanBatchDao = atuPlanBatchDao;} + + @Override + public BasicDao getDao() {return atuPlanBatchDao;} + + @Override + public AtuPlanBatch createEntity() { return new AtuPlanBatch();} + + @Override + protected void beforeInsert(AtuPlanBatch record) { + + } + + @Override + protected void beforeUpdate(AtuPlanBatch record) { + + } + + @Override + public List queryPlanMaxBatchNumList(String endTime, int fromIndex, int toIndex) { + return atuPlanBatchDao.queryPlanMaxBatchNumList(endTime, fromIndex, toIndex); + } + + + @Override + public Integer updateByEntity(AtuPlanBatch entity) { + return this.atuPlanBatchDao.updateByPrimaryKey(entity); + } + + @Override + public AtuPlanBatchDetailDto queryBatchDetailById(String batchId) { + return this.atuPlanBatchDao.queryBatchDetailById(batchId); + } + + @Override + public int countPlanMaxBatch(String endTime) { + return this.atuPlanBatchDao.countPlanMaxBatch(endTime); + } + + @Override + public List queryNeedClearBatch(LocalDateTime localDateTime) { + if (localDateTime == null) { + throw new InvalidException("时间不能为空"); + } + return this.atuPlanBatchDao.queryNeedClearBatch(localDateTime); + } + + /** + * 更新批次表附件清除字段 + * + * @param batchIds 批次Ids + */ + @Override + public void updateAttachmentClearStatusByIds(List batchIds) { + if (CollectionUtils.isEmpty(batchIds)) { + return; + } + this.atuPlanBatchDao.updateAttachmentClearStatusByIds(batchIds); + } + + +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanDeviceLinkServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanDeviceLinkServiceImpl.java new file mode 100644 index 0000000..05dbe1f --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanDeviceLinkServiceImpl.java @@ -0,0 +1,67 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.impl; + +import net.northking.cctp.executePlan.db.dao.AtuPlanDeviceLinkDao; +import net.northking.cctp.executePlan.db.service.AtuPlanDeviceLinkService; +import net.northking.cctp.executePlan.db.entity.AtuPlanDeviceLink; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.db.PaginationService; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + + +/** + * 计划设备关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-06 17:37:24
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "AtuPlanDeviceLinkServiceImpl") +public class AtuPlanDeviceLinkServiceImpl extends PaginationService implements AtuPlanDeviceLinkService +{ +private static final Logger logger = LoggerFactory.getLogger(AtuPlanDeviceLinkServiceImpl.class); + + private final AtuPlanDeviceLinkDao atuPlanDeviceLinkDao; + + public AtuPlanDeviceLinkServiceImpl(AtuPlanDeviceLinkDao atuPlanDeviceLinkDao) {this.atuPlanDeviceLinkDao = atuPlanDeviceLinkDao;} + + @Override + public BasicDao getDao() {return atuPlanDeviceLinkDao;} + + @Override + public AtuPlanDeviceLink createEntity() { return new AtuPlanDeviceLink();} + + @Override + protected void beforeInsert(AtuPlanDeviceLink record) { + + } + + @Override + protected void beforeUpdate(AtuPlanDeviceLink record) { + + } + + + @Override + public void deleteDeviceIdByPlanId(String planId) { + this.atuPlanDeviceLinkDao.deleteByPlanId(planId); + } + + +// ---- The End by Generator ----// + + + + +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanEnvLinkServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanEnvLinkServiceImpl.java new file mode 100644 index 0000000..702b1e1 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanEnvLinkServiceImpl.java @@ -0,0 +1,65 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.impl; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.db.PaginationService; +import net.northking.cctp.executePlan.db.dao.AtuPlanEnvLinkDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanEnvLink; +import net.northking.cctp.executePlan.db.service.AtuPlanEnvLinkService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.List; + + +/** + * 计划环境关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-30 10:30:29
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "AtuPlanEnvLinkServiceImpl") +public class AtuPlanEnvLinkServiceImpl extends PaginationService implements AtuPlanEnvLinkService +{ +private static final Logger logger = LoggerFactory.getLogger(AtuPlanEnvLinkServiceImpl.class); + + private final AtuPlanEnvLinkDao atuPlanEnvLinkDao; + + public AtuPlanEnvLinkServiceImpl(AtuPlanEnvLinkDao atuPlanEnvLinkDao) {this.atuPlanEnvLinkDao = atuPlanEnvLinkDao;} + + @Override + public BasicDao getDao() {return atuPlanEnvLinkDao;} + + @Override + public AtuPlanEnvLink createEntity() { return new AtuPlanEnvLink();} + + @Override + protected void beforeInsert(AtuPlanEnvLink record) { + + } + + @Override + protected void beforeUpdate(AtuPlanEnvLink record) { + + } + + @Override + public List queryEnvIdByPlanIdOderBySort(String planId) { + return atuPlanEnvLinkDao.queryEnvIdByPlanIdOderBySort(planId); + } + + @Override + public Integer insertLinkList(List list) { + return atuPlanEnvLinkDao.insertLinkList(list); + } + +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanInfoServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanInfoServiceImpl.java new file mode 100644 index 0000000..0946afd --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanInfoServiceImpl.java @@ -0,0 +1,172 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.impl; + +import com.github.pagehelper.Page; +import com.github.pagehelper.page.PageMethod; +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.db.DefaultPagination; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.common.saas.db.TenantEntityService; +import net.northking.cctp.executePlan.db.dao.AtuPlanInfoDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.db.service.AtuPlanInfoService; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanInfoDetailDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanInfoPageDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanInfoQueryDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanPrincipalDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.List; + + +/** + * 执行计划表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-07 17:41:09
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "AtuPlanInfoServiceImpl") +public class AtuPlanInfoServiceImpl extends TenantEntityService implements AtuPlanInfoService +{ +private static final Logger logger = LoggerFactory.getLogger(AtuPlanInfoServiceImpl.class); + + private final AtuPlanInfoDao atuPlanInfoDao; + + public AtuPlanInfoServiceImpl(AtuPlanInfoDao atuPlanInfoDao) {this.atuPlanInfoDao = atuPlanInfoDao;} + + @Override + public BasicDao getDao() {return atuPlanInfoDao;} + + @Override + public AtuPlanInfo createEntity() { return new AtuPlanInfo();} + + @Override + public AtuPlanInfo queryByLastBatchId(String batchId) { + return atuPlanInfoDao.queryByLastBatchId(batchId); + } + + @Override + public List queryPlanInfoByIds(List objectIdsByNameAndType) { + return this.atuPlanInfoDao.queryPlanInfoByIds(objectIdsByNameAndType); + } + + @Override + public List queryFollowUpPlanIdList(String planId) { + return atuPlanInfoDao.queryFollowUpPlanIdList(planId); + } + + @Override + public Pagination queryPlanInfoPage(QueryByPage queryByPage) { + + DefaultPagination pagination = new DefaultPagination<>(); + + Page page = PageMethod.startPage(queryByPage.getPageNo(), queryByPage.getPageSize()); + List dtoList = atuPlanInfoDao.queryPageByPlan(queryByPage.getQuery()); + + pagination.setRecordCount(page.getTotal()); + pagination.setPageNo(queryByPage.getPageNo()); + pagination.setPageSize(queryByPage.getPageSize()); + pagination.setRecords(dtoList); + + return pagination; + } + @Override + public List queryPlanInfo(AtuPlanInfoQueryDto selectParamAtuPlanInfoQueryDto) { + return atuPlanInfoDao.queryPageByPlan(selectParamAtuPlanInfoQueryDto); + } + + @Override + public void updatePrincipal(AtuPlanPrincipalDto dto) { + atuPlanInfoDao.updatePrincipal(dto); + } + + @Override + public Pagination queryUpFrontPlan(QueryByPage queryByPage) { + DefaultPagination pagination = new DefaultPagination<>(); + Page page = PageMethod.startPage(queryByPage.getPageNo(), queryByPage.getPageSize()); + List pageList = atuPlanInfoDao.queryUpFrontPlan(queryByPage.getQuery()); + pagination.setRecordCount(page.getTotal()); + pagination.setPageNo(queryByPage.getPageNo()); + pagination.setPageSize(queryByPage.getPageSize()); + pagination.setRecords(pageList); + return pagination; + } + + @Override + public List queryByPage(int fromIndex, int toIndex) { + return this.atuPlanInfoDao.queryByPage(fromIndex, toIndex); + } + + @Override + public Integer countdeleted(AtuPlanInfo countParams) { + return atuPlanInfoDao.countDeleted(countParams); + } + + @Override + public Integer updatePlanRetryCount(AtuPlanInfo entity) { + return this.atuPlanInfoDao.updatePlanRetryCount(entity); + } + + @Override + public List selectManagerByProject(String projectId) { + return this.atuPlanInfoDao.selectManagerByProject(projectId); + } + + @Override + public List selectCreatorByProject(String projectId) { + return this.atuPlanInfoDao.selectCreatorByProject(projectId); + } + + @Override + public List selectUpdaterByProject(String projectId) { + return this.atuPlanInfoDao.selectUpdaterByProject(projectId); + } + + @Override + public String clonePlanName(AtuPlanInfo atuPlanInfo) { + return this.atuPlanInfoDao.clonePlanName(atuPlanInfo); + } + + @Override + public Integer updatePlanResultById(AtuPlanInfo atuPlanInfo) { + return this.atuPlanInfoDao.updateByPrimaryKey(atuPlanInfo); + } + + @Override + public AtuPlanInfo findByBatchId(String batchId) { + return this.atuPlanInfoDao.findByBatchId(batchId); + } + + + @Override + public Integer updatePlanNextExecTime(AtuPlanInfo atuPlanInfo) { + return this.atuPlanInfoDao.updatePlanNextExecTime(atuPlanInfo); + } + + @Override + public Integer updatePlanByLastBatchId(String batchId, String status) { + return this.atuPlanInfoDao.updatePlanByLastBatchId(batchId, status); + } + + @Override + public void updatePlanByIds(List ids) { + atuPlanInfoDao.updatePlanByIds(ids); + } + + @Override + public Integer checkNameUnique(AtuPlanInfo info) { + return atuPlanInfoDao.checkNameUnique(info); + } + +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanSceneCaseTaskServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanSceneCaseTaskServiceImpl.java new file mode 100644 index 0000000..004b052 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanSceneCaseTaskServiceImpl.java @@ -0,0 +1,113 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.impl; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.db.PaginationService; +import net.northking.cctp.executePlan.db.dao.AtuPlanSceneCaseTaskDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanSceneCaseTask; +import net.northking.cctp.executePlan.db.service.AtuPlanSceneCaseTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; + + +/** + * 计划场景用例节点任务表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-12 16:22:13
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "AtuPlanSceneCaseTaskServiceImpl") +public class AtuPlanSceneCaseTaskServiceImpl extends PaginationService implements AtuPlanSceneCaseTaskService +{ +private static final Logger logger = LoggerFactory.getLogger(AtuPlanSceneCaseTaskServiceImpl.class); + + private final AtuPlanSceneCaseTaskDao atuPlanSceneCaseTaskDao; + + public AtuPlanSceneCaseTaskServiceImpl(AtuPlanSceneCaseTaskDao atuPlanSceneCaseTaskDao) {this.atuPlanSceneCaseTaskDao = atuPlanSceneCaseTaskDao;} + + @Override + public BasicDao getDao() {return atuPlanSceneCaseTaskDao;} + + @Override + public AtuPlanSceneCaseTask createEntity() { return new AtuPlanSceneCaseTask();} + + @Override + protected void beforeInsert(AtuPlanSceneCaseTask record) { + + } + + @Override + protected void beforeUpdate(AtuPlanSceneCaseTask record) { + + } + + @Override + public Set queryDeviceIdListByTaskId(String taskId) { + return atuPlanSceneCaseTaskDao.queryDeviceIdListByTaskId(taskId); + } + + @Override + public AtuPlanSceneCaseTask queryUnfinishedTaskByTaskId(String taskId) { + return atuPlanSceneCaseTaskDao.queryUnfinishedTaskByTaskId(taskId); + } + + + @Override + public AtuPlanSceneCaseTask queryResultFileByTaskIdAndNodeId(AtuPlanSceneCaseTask query) { + return atuPlanSceneCaseTaskDao.queryResultFileByTaskIdAndNodeId(query); + } + + @Override + public List queryNodeInfo(String taskId) { + return atuPlanSceneCaseTaskDao.queryNodeInfo(taskId); + } + + @Override + public List queryAppIdListByBatchId(String batchId) { + return this.atuPlanSceneCaseTaskDao.queryAppIdListByBatchId(batchId); + } + + @Override + public int deleteByPlanIdLimit(String planId, int num) { + return this.atuPlanSceneCaseTaskDao.deleteByPlanIdLimit(planId, num); + } + + @Override + public int countByPlanId(String planId) { + return this.atuPlanSceneCaseTaskDao.countByPlanId(planId); + } + + @Override + public List querySceneCaseTasksByTaskIds(List taskIds) { + return this.atuPlanSceneCaseTaskDao.querySceneCaseTasksByTaskIds(taskIds); + } + + @Override + public List queryExecTimeoutTask(int timeout) { + return this.atuPlanSceneCaseTaskDao.queryExecTimeoutTask(timeout); + } + + @Override + public List queryWaitTimeoutTask(Integer waitTimeout) { + return atuPlanSceneCaseTaskDao.queryWaitTimeoutTask(waitTimeout); + } + + +// ---- The End by Generator ----// + + + + +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanScriptLinkMdServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanScriptLinkMdServiceImpl.java new file mode 100644 index 0000000..f5ae7fa --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanScriptLinkMdServiceImpl.java @@ -0,0 +1,102 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.impl; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import net.northking.cctp.common.db.DefaultPagination; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.executePlan.db.dao.AtuPlanScriptLinkMdDao; +import net.northking.cctp.executePlan.db.service.AtuPlanScriptLinkMdService; +import net.northking.cctp.executePlan.db.entity.AtuPlanScriptLinkMd; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.db.PaginationService; + +import net.northking.cctp.executePlan.dto.planScript.AtuPlanScriptDeleteDto; +import net.northking.cctp.executePlan.dto.planScript.AtuPlanScriptLinkDto; +import net.northking.cctp.executePlan.feign.dto.PlanScriptQueryPageDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + + +/** + * 计划脚本关联副表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-09-04 09:44:18
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "AtuPlanScriptLinkMdServiceImpl") +public class AtuPlanScriptLinkMdServiceImpl extends PaginationService implements AtuPlanScriptLinkMdService +{ +private static final Logger logger = LoggerFactory.getLogger(AtuPlanScriptLinkMdServiceImpl.class); + + private final AtuPlanScriptLinkMdDao atuPlanScriptLinkMdDao; + + public AtuPlanScriptLinkMdServiceImpl(AtuPlanScriptLinkMdDao atuPlanScriptLinkMdDao) {this.atuPlanScriptLinkMdDao = atuPlanScriptLinkMdDao;} + + public BasicDao getDao() {return atuPlanScriptLinkMdDao;} + + public AtuPlanScriptLinkMd createEntity() { return new AtuPlanScriptLinkMd();} + + @Override + protected void beforeInsert(AtuPlanScriptLinkMd record) { + + } + + @Override + protected void beforeUpdate(AtuPlanScriptLinkMd record) { + + } + + @Override + public List queryLinkMdPage(String planId,List selectList) { + return atuPlanScriptLinkMdDao.queryLinkMdPage(planId,NKSecurityContext.getUserId(),new ArrayList<>()); + } + + @Override + public Integer deleteLinkMd(AtuPlanScriptDeleteDto deleteDto) { + return atuPlanScriptLinkMdDao.deleteLinkMd(deleteDto); + } + + @Override + public Integer insertMdBatch(List list) { + return atuPlanScriptLinkMdDao.insertMdBatch(list); + } + + @Override + public Pagination queryScriptLink(QueryByPage dto) { + DefaultPagination pagination = new DefaultPagination<>(); + Page page = PageHelper.startPage(dto.getPageNo(), dto.getPageSize()); + List list = atuPlanScriptLinkMdDao.queryLinkMdPage(dto.getQuery().getPlanId(), NKSecurityContext.getUserId(),dto.getQuery().getScriptList()); + + List listId = new ArrayList<>(); + list.forEach( one ->{listId.add(one.getScriptId());}); + + pagination.setRecords(listId); + pagination.setPageNo(dto.getPageNo()); + pagination.setPageSize(dto.getPageSize()); + pagination.setRecordCount(page.getTotal()); + return pagination; + } + + +// ---- The End by Generator ----// + + + + +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanScriptLinkServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanScriptLinkServiceImpl.java new file mode 100644 index 0000000..4441428 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanScriptLinkServiceImpl.java @@ -0,0 +1,73 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.impl; + +import net.northking.cctp.executePlan.db.dao.AtuPlanScriptLinkDao; +import net.northking.cctp.executePlan.db.service.AtuPlanScriptLinkService; +import net.northking.cctp.executePlan.db.entity.AtuPlanScriptLink; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.db.PaginationService; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.List; + + +/** + * 计划脚本关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-31 16:48:02
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "AtuPlanScriptLinkServiceImpl") +public class AtuPlanScriptLinkServiceImpl extends PaginationService implements AtuPlanScriptLinkService +{ +private static final Logger logger = LoggerFactory.getLogger(AtuPlanScriptLinkServiceImpl.class); + + private final AtuPlanScriptLinkDao atuPlanScriptLinkDao; + + public AtuPlanScriptLinkServiceImpl(AtuPlanScriptLinkDao atuPlanScriptLinkDao) {this.atuPlanScriptLinkDao = atuPlanScriptLinkDao;} + + @Override + public BasicDao getDao() {return atuPlanScriptLinkDao;} + + @Override + public AtuPlanScriptLink createEntity() { return new AtuPlanScriptLink();} + + @Override + protected void beforeInsert(AtuPlanScriptLink atuPlanScriptLink) { + + } + + @Override + protected void beforeUpdate(AtuPlanScriptLink atuPlanScriptLink) { + + } + + @Override + public Integer insertLinkList(List list) { + return atuPlanScriptLinkDao.insertLinkList(list); + } + + @Override + public long countByScriptIdList(List scriptIdList) { + return atuPlanScriptLinkDao.countByScriptIdList(scriptIdList); + } + + +// ---- The End by Generator ----// + + + + +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanTaskRecordServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanTaskRecordServiceImpl.java new file mode 100644 index 0000000..6a25c2e --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanTaskRecordServiceImpl.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 京北方信息技术股份有限公司 Corporation 2024 . All rights reserved. + * + */ +package net.northking.cctp.executePlan.db.impl; + +import net.northking.cctp.executePlan.db.dao.AtuPlanTaskRecordDao; +import net.northking.cctp.executePlan.db.service.AtuPlanTaskRecordService; +import net.northking.cctp.executePlan.db.entity.AtuPlanTaskRecord; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.db.PaginationService; + +import net.northking.cctp.executePlan.dto.planTask.PlanTaskRecordDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.List; + + +/** + * 任务执行记录表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2024-10-16 17:02:48
+ * + * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "AtuPlanTaskRecordServiceImpl") +public class AtuPlanTaskRecordServiceImpl extends PaginationService implements AtuPlanTaskRecordService { + private static final Logger logger = LoggerFactory.getLogger(AtuPlanTaskRecordServiceImpl.class); + + private final AtuPlanTaskRecordDao atuPlanTaskRecordDao; + + public AtuPlanTaskRecordServiceImpl(AtuPlanTaskRecordDao atuPlanTaskRecordDao) { + this.atuPlanTaskRecordDao = atuPlanTaskRecordDao; + } + + public BasicDao getDao() { + return atuPlanTaskRecordDao; + } + + public AtuPlanTaskRecord createEntity() { + return new AtuPlanTaskRecord(); + } + + @Override + protected void beforeInsert(AtuPlanTaskRecord record) { + + } + + @Override + protected void beforeUpdate(AtuPlanTaskRecord record) { + + } + + // ---- The End by Generator ----// + @Override + public List queryTotalTake(List ids) { + return atuPlanTaskRecordDao.queryTotalTake(ids); + } + + @Override + public List queryReTryTaskByTaskIds(List ids) { + return atuPlanTaskRecordDao.queryReTryTaskByTaskIds(ids); + } + + +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanTaskServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanTaskServiceImpl.java new file mode 100644 index 0000000..c7f7004 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/AtuPlanTaskServiceImpl.java @@ -0,0 +1,192 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.impl; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.common.db.PaginationService; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.executePlan.db.dao.AtuPlanTaskDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.db.service.AtuPlanTaskService; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskExtendDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskPageDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskQueryDto; +import net.northking.cctp.executePlan.dto.planTask.AtuTaskSendBugDto; +import net.northking.cctp.executePlan.pub.dto.ScriptFirstExecutionDTO; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + + +/** + * 计划执行任务表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-06 11:00:17
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@Service +@ConditionalOnMissingBean(name = "AtuPlanTaskServiceImpl") +public class AtuPlanTaskServiceImpl extends PaginationService implements AtuPlanTaskService +{ +private static final Logger logger = LoggerFactory.getLogger(AtuPlanTaskServiceImpl.class); + + private final AtuPlanTaskDao atuPlanTaskDao; + + public AtuPlanTaskServiceImpl(AtuPlanTaskDao atuPlanTaskDao) {this.atuPlanTaskDao = atuPlanTaskDao;} + + @Override + public BasicDao getDao() {return atuPlanTaskDao;} + + @Override + public AtuPlanTask createEntity() { return new AtuPlanTask();} + + @Override + protected void beforeInsert(AtuPlanTask record) { + + } + + @Override + protected void beforeUpdate(AtuPlanTask record) { + + } + + @Override + public List queryList(QueryByPage queryByPage) { + return atuPlanTaskDao.queryList(queryByPage.getQuery()); + } + + @Override + public boolean checkBatchFinish(String batchId) { + Integer count = atuPlanTaskDao.countUnFinishedTask(batchId); + return count == null; + } + + @Override + public Long queryBatchLastTaskEndTime(String batchId) { + return atuPlanTaskDao.queryBatchLastTaskEndTime(batchId); + } + + @Override + public List queryUnfinishedTaskByBatchId(String batchId) { + return atuPlanTaskDao.queryUnfinishedTaskByBatchId(batchId); + } + + @Override + public Long queryBatchFirstTaskStartTime(String batchId) { + return atuPlanTaskDao.queryBatchFirstTaskStartTime(batchId); + } + + @Override + public List queryAllFailIdList(String batchId) { + return atuPlanTaskDao.queryAllFailIdList(batchId); + } + + + @Override + public List queryCaseListByBatchId(String batchId) { + return atuPlanTaskDao.selectCaseListByBatchId(batchId); + } + + @Override + public String queryEnvIdByBatchId(String batchId) { + return this.atuPlanTaskDao.queryEnvIdByBatchId(batchId); + } + + @Override + public List queryAppIdListByBatchId(String batchId) { + return this.atuPlanTaskDao.queryAppIdListByBatchId(batchId); + } + + + @Override + public int deleteByPlanIdLimit(String planId, int num) { + return this.atuPlanTaskDao.deleteByPlanIdLimit(planId, num); + } + + @Override + public int countByPlanId(String planId) { + return this.atuPlanTaskDao.countByPlanId(planId); + } + + @Override + public List queryMobilePerDataPathByBatchId(String batchId) { + return this.atuPlanTaskDao.queryMobilePerDataPathByBatchId(batchId); + } + + @Override + public AtuTaskSendBugDto querySendBugTaskInfo(String taskId) { + return this.atuPlanTaskDao.querySendBugTaskInfo(taskId); + } + + @Override + public List getFirstExecuteInfo(List scriptIds) { + List scriptFirstExecutionDTOS = this.atuPlanTaskDao.getFirstExecuteInfo(scriptIds); + if (CollectionUtils.isEmpty(scriptFirstExecutionDTOS)) { + return new ArrayList<>(); + } + return scriptFirstExecutionDTOS; + } + @Override + public ScriptFirstExecutionDTO getFirstExecuteInfo(String scriptIds) { + List scriptFirstExecutionDTOS = this.atuPlanTaskDao.getFirstExecuteInfos(scriptIds); + if (CollectionUtils.isEmpty(scriptFirstExecutionDTOS)) { + return new ScriptFirstExecutionDTO(); + } + return scriptFirstExecutionDTOS.get(0); + } + + @Override + public Integer getScriptExecuteSuccessNum(String scriptId, String planId, LocalDate now) { + return this.atuPlanTaskDao.getScriptExecuteSuccessNum(scriptId, planId, now); + } + + @Override + public List getTasksByPlanId(String planId) { + return this.atuPlanTaskDao.getTasksByPlanId(planId); + } + + @Override + public List getTaskIdsByScriptIdsAndPlanId(List oldScriptIds, String planId) { + return this.atuPlanTaskDao.getTaskIdsByScriptIdsAndPlanId(oldScriptIds, planId); + } + + @Override + public List queryTasksByBatchIds(List batchIds) { + if (CollectionUtils.isEmpty(batchIds)) { + return new ArrayList<>(); + } + return this.atuPlanTaskDao.queryTasksByBatchIds(batchIds); + } + + @Override + public List queryExecTimeoutTask(int timeout) { + return this.atuPlanTaskDao.queryExecTimeoutTask(timeout); + } + + @Override + public AtuPlanTaskExtendDto queryTaskExtendById(String taskId) { + return this.atuPlanTaskDao.queryTaskExtendById(taskId); + } + + @Override + public List queryWaitTimeoutTask(Integer waitTimeout) { + return atuPlanTaskDao.queryWaitTimeoutTask(waitTimeout); + } + +// ---- The End by Generator ----// + + + + +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/MqSynchronizeTaskServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/MqSynchronizeTaskServiceImpl.java new file mode 100644 index 0000000..82594ec --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/impl/MqSynchronizeTaskServiceImpl.java @@ -0,0 +1,40 @@ +package net.northking.cctp.executePlan.db.impl; + +import net.northking.cctp.common.db.*; +import net.northking.cctp.executePlan.db.dao.MqSynchronizeTaskDao; +import net.northking.cctp.executePlan.db.entity.MqSynchronizeTask; +import net.northking.cctp.executePlan.db.service.MqSynchronizeTaskService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@ConditionalOnMissingBean(name = "MqSynchronizeTaskServiceImpl") +public class MqSynchronizeTaskServiceImpl extends PaginationService implements MqSynchronizeTaskService { + + private final MqSynchronizeTaskDao mqSynchronizeTaskDao; + + public MqSynchronizeTaskServiceImpl(MqSynchronizeTaskDao mqSynchronizeTaskDao) {this.mqSynchronizeTaskDao = mqSynchronizeTaskDao;} + + public BasicDao getDao() {return mqSynchronizeTaskDao;} + + public MqSynchronizeTask createEntity() { return new MqSynchronizeTask();} + + @Override + protected void beforeInsert(MqSynchronizeTask mqSynchronizeTask) { + + } + + @Override + protected void beforeUpdate(MqSynchronizeTask mqSynchronizeTask) { + + } + + @Override + public List findByTypes(List types) { + return mqSynchronizeTaskDao.findByTypes(types); + } + + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanAppLinkMapper.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanAppLinkMapper.java new file mode 100644 index 0000000..121b571 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanAppLinkMapper.java @@ -0,0 +1,27 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanAppLink; + +/** + * Mybatis数据库持久层(底层):计划应用关联表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2022-12-06 17:37:23
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanAppLinkMapper extends BasicDao +{ + String EntityName = "AtuPlanAppLink"; + + String COLUMN_id = "id"; + String COLUMN_planId = "plan_id"; + String COLUMN_appId = "app_id"; + String COLUMN_appPackage = "app_package"; + String COLUMN_platformType = "platform_type"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanBatchDeviceLinkMapper.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanBatchDeviceLinkMapper.java new file mode 100644 index 0000000..73e31bd --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanBatchDeviceLinkMapper.java @@ -0,0 +1,28 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatchDeviceLink; + +/** + * Mybatis数据库持久层(底层):计划批次设备关联表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2022-12-23 15:34:17
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanBatchDeviceLinkMapper extends BasicDao +{ + String EntityName = "AtuPlanBatchDeviceLink"; + + String COLUMN_id = "id"; + String COLUMN_batchId = "batch_id"; + String COLUMN_deviceId = "device_id"; + String COLUMN_deviceType = "device_type"; + String COLUMN_offline = "is_offline"; + String COLUMN_offlineTime = "offline_time"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanBatchMapper.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanBatchMapper.java new file mode 100644 index 0000000..eac436f --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanBatchMapper.java @@ -0,0 +1,40 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatch; + +/** + * Mybatis数据库持久层(底层):计划执行批次表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2023-10-11 20:31:24
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanBatchMapper extends BasicDao +{ + String EntityName = "AtuPlanBatch"; + + String COLUMN_id = "id"; + String COLUMN_planId = "plan_id"; + String COLUMN_batch = "batch"; + String COLUMN_status = "status"; + String COLUMN_startTime = "start_time"; + String COLUMN_endTime = "end_time"; + String COLUMN_taskTotal = "task_total"; + String COLUMN_successNum = "success_num"; + String COLUMN_execFailNum = "exec_fail_num"; + String COLUMN_assertFailNum = "assert_fail_num"; + String COLUMN_timeoutNum = "timeout_num"; + String COLUMN_cancelNum = "cancel_num"; + String COLUMN_successRate = "success_rate"; + String COLUMN_createdTime = "created_time"; + String COLUMN_executedBy = "executed_by"; + String COLUMN_triggerType = "trigger_type"; + String COLUMN_scriptNum = "script_num"; + String COLUMN_perDataPath = "per_data_path"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanDeviceLinkMapper.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanDeviceLinkMapper.java new file mode 100644 index 0000000..79a75cf --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanDeviceLinkMapper.java @@ -0,0 +1,27 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanDeviceLink; + +/** + * Mybatis数据库持久层(底层):计划设备关联表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2022-12-06 17:37:24
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanDeviceLinkMapper extends BasicDao +{ + String EntityName = "AtuPlanDeviceLink"; + + String COLUMN_id = "id"; + String COLUMN_planId = "plan_id"; + String COLUMN_deviceId = "device_id"; + String COLUMN_deviceType = "device_type"; + String COLUMN_browserType = "browser_type"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanEnvLinkMapper.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanEnvLinkMapper.java new file mode 100644 index 0000000..8cfdd0c --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanEnvLinkMapper.java @@ -0,0 +1,26 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanEnvLink; + +/** + * Mybatis数据库持久层(底层):计划环境关联表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2023-08-30 10:30:29
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanEnvLinkMapper extends BasicDao +{ + String EntityName = "AtuPlanEnvLink"; + + String COLUMN_id = "id"; + String COLUMN_planId = "plan_id"; + String COLUMN_envId = "env_id"; + String COLUMN_sort = "sort"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanInfoMapper.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanInfoMapper.java new file mode 100644 index 0000000..e4995bc --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanInfoMapper.java @@ -0,0 +1,61 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; + +/** + * Mybatis数据库持久层(底层):执行计划表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2023-08-30 10:30:29
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanInfoMapper extends BasicDao +{ + String EntityName = "AtuPlanInfo"; + + String COLUMN_id = "id"; + String COLUMN_tenantId = "tenant_id"; + String COLUMN_projectId = "project_id"; + String COLUMN_planName = "plan_name"; + String COLUMN_planDesc = "plan_desc"; + String COLUMN_enabled = "is_enabled"; + String COLUMN_status = "status"; + String COLUMN_appSet = "app_set"; + String COLUMN_screenRecordSet = "screen_record_set"; + String COLUMN_screenshotSet = "screenshot_set"; + String COLUMN_priority = "priority"; + String COLUMN_cronExpr = "cron_expr"; + String COLUMN_upFrontPlanId = "up_front_plan_id"; + String COLUMN_webhookUrl = "webhook_url"; + String COLUMN_webhookToken = "webhook_token"; + String COLUMN_sendMail = "is_send_mail"; + String COLUMN_mailAddress = "mail_address"; + String COLUMN_failRetry = "is_fail_retry"; + String COLUMN_failRetryCount = "fail_retry_count"; + String COLUMN_failCreatePlan = "is_fail_create_plan"; + String COLUMN_lastExecTime = "last_exec_time"; + String COLUMN_nextExecTime = "next_exec_time"; + String COLUMN_lastBatchId = "last_batch_id"; + String COLUMN_waitingNum = "waiting_num"; + String COLUMN_runningNum = "running_num"; + String COLUMN_successNum = "success_num"; + String COLUMN_execFailNum = "exec_fail_num"; + String COLUMN_assertFailNum = "assert_fail_num"; + String COLUMN_timeoutNum = "timeout_num"; + String COLUMN_cancelNum = "cancel_num"; + String COLUMN_createdBy = "created_by"; + String COLUMN_createdTime = "created_time"; + String COLUMN_updatedBy = "updated_by"; + String COLUMN_updatedTime = "updated_time"; + String COLUMN_deleted = "is_deleted"; + String COLUMN_hasCorn = "has_corn"; + String COLUMN_hasUpFront = "has_up_front"; + String COLUMN_hasWebhook = "has_webhook"; + String COLUMN_caseChangeFlag = "case_change_flag"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanSceneCaseTaskMapper.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanSceneCaseTaskMapper.java new file mode 100644 index 0000000..9d95097 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanSceneCaseTaskMapper.java @@ -0,0 +1,47 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanSceneCaseTask; + +/** + * Mybatis数据库持久层(底层):计划场景用例节点任务表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2023-11-13 14:35:52
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanSceneCaseTaskMapper extends BasicDao +{ + String EntityName = "AtuPlanSceneCaseTask"; + + String COLUMN_id = "id"; + String COLUMN_taskId = "task_id"; + String COLUMN_scriptId = "script_id"; + String COLUMN_versionId = "version_id"; + String COLUMN_versionName = "version_name"; + String COLUMN_scriptName = "script_name"; + String COLUMN_scriptJson = "script_json"; + String COLUMN_nodeId = "node_id"; + String COLUMN_nodeType = "node_type"; + String COLUMN_nodeParams = "node_params"; + String COLUMN_prevNodeId = "prev_node_id"; + String COLUMN_nextNodeId = "next_node_id"; + String COLUMN_lineId = "line_id"; + String COLUMN_engineId = "engine_id"; + String COLUMN_deviceId = "device_id"; + String COLUMN_appId = "app_id"; + String COLUMN_status = "status"; + String COLUMN_startTime = "start_time"; + String COLUMN_endTime = "end_time"; + String COLUMN_errorMsg = "error_msg"; + String COLUMN_videoUrl = "video_url"; + String COLUMN_execResultFile = "exec_result_file"; + String COLUMN_perDataPath = "per_data_path"; + String COLUMN_createdTime = "created_time"; + String COLUMN_lastHeartbeatTime = "last_heartbeat_time"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanScriptLinkMapper.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanScriptLinkMapper.java new file mode 100644 index 0000000..0bb08e1 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanScriptLinkMapper.java @@ -0,0 +1,26 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanScriptLink; + +/** + * Mybatis数据库持久层(底层):计划脚本关联表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2023-08-31 16:48:02
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanScriptLinkMapper extends BasicDao +{ + String EntityName = "AtuPlanScriptLink"; + + String COLUMN_id = "id"; + String COLUMN_planId = "plan_id"; + String COLUMN_scriptId = "script_id"; + String COLUMN_scriptType = "script_type"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanScriptLinkMdMapper.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanScriptLinkMdMapper.java new file mode 100644 index 0000000..fced83b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanScriptLinkMdMapper.java @@ -0,0 +1,27 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanScriptLinkMd; + +/** + * Mybatis数据库持久层(底层):计划脚本关联副表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2023-09-04 09:44:18
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanScriptLinkMdMapper extends BasicDao +{ + String EntityName = "AtuPlanScriptLinkMd"; + + String COLUMN_id = "id"; + String COLUMN_userId = "user_id"; + String COLUMN_planId = "plan_id"; + String COLUMN_scriptId = "script_id"; + String COLUMN_scriptType = "script_type"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanTaskMapper.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanTaskMapper.java new file mode 100644 index 0000000..a22d756 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanTaskMapper.java @@ -0,0 +1,48 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; + +/** + * Mybatis数据库持久层(底层):计划执行任务表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2023-11-13 14:35:52
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanTaskMapper extends BasicDao +{ + String EntityName = "AtuPlanTask"; + + String COLUMN_id = "id"; + String COLUMN_batchId = "batch_id"; + String COLUMN_envId = "env_id"; + String COLUMN_scriptId = "script_id"; + String COLUMN_versionId = "version_id"; + String COLUMN_versionName = "version_name"; + String COLUMN_scriptName = "script_name"; + String COLUMN_scriptJson = "script_json"; + String COLUMN_caseId = "case_id"; + String COLUMN_caseNo = "case_no"; + String COLUMN_caseName = "case_name"; + String COLUMN_caseType = "case_type"; + String COLUMN_caseParam = "case_param"; + String COLUMN_engineId = "engine_id"; + String COLUMN_deviceId = "device_id"; + String COLUMN_appId = "app_id"; + String COLUMN_status = "status"; + String COLUMN_startTime = "start_time"; + String COLUMN_endTime = "end_time"; + String COLUMN_errorMsg = "error_msg"; + String COLUMN_videoUrl = "video_url"; + String COLUMN_execResultFile = "exec_result_file"; + String COLUMN_bugId = "bug_id"; + String COLUMN_perDataPath = "per_data_path"; + String COLUMN_createdTime = "created_time"; + String COLUMN_lastHeartbeatTime = "last_heartbeat_time"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanTaskRecordMapper.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanTaskRecordMapper.java new file mode 100644 index 0000000..c975bc9 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/AtuPlanTaskRecordMapper.java @@ -0,0 +1,33 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2024 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.executePlan.db.entity.AtuPlanTaskRecord; + +/** + * Mybatis数据库持久层(底层):任务执行记录表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2024-10-16 17:02:48
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanTaskRecordMapper extends BasicDao +{ + String EntityName = "AtuPlanTaskRecord"; + + String COLUMN_id = "id"; + String COLUMN_taskId = "task_id"; + String COLUMN_batchId = "batch_id"; + String COLUMN_execIdx = "exec_idx"; + String COLUMN_startTime = "start_time"; + String COLUMN_endTime = "end_time"; + String COLUMN_executeType = "execute_type"; + String COLUMN_status = "status"; + String COLUMN_errorMsg = "error_msg"; + String COLUMN_videoUrl = "video_url"; + String COLUMN_execResultFile = "exec_result_file"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/MqSynchronizeTaskMapper.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/MqSynchronizeTaskMapper.java new file mode 100644 index 0000000..f3cec76 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/mapper/MqSynchronizeTaskMapper.java @@ -0,0 +1,26 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.mapper; + +import net.northking.cctp.common.db.BasicDao; +import net.northking.cctp.executePlan.db.entity.MqSynchronizeTask; + +/** + * Mybatis数据库持久层(底层):dw同步表 + *

文件内容由代码生成器产生,请不要手动修改! + * createdate: 2022-11-24 12:13:20
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface MqSynchronizeTaskMapper extends BasicDao +{ + String EntityName = "MqSynchronizeTask"; + + String COLUMN_id = "id"; + String COLUMN_taskInfo = "task_info"; + String COLUMN_taskType = "task_type"; + String COLUMN_createdTime = "created_time"; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanAppLinkService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanAppLinkService.java new file mode 100644 index 0000000..290e97c --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanAppLinkService.java @@ -0,0 +1,29 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.executePlan.db.entity.AtuPlanAppLink; + +/** + * 计划应用关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-06 17:37:23
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanAppLinkService extends BasicService +{ + /** + * 查询应用ID + * @param planAppLink 参数 + * @return 应用ID + */ + String queryAppId(AtuPlanAppLink planAppLink); + + void deleteAppByPlanId(String planId); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanBatchDeviceLinkService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanBatchDeviceLinkService.java new file mode 100644 index 0000000..02211d3 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanBatchDeviceLinkService.java @@ -0,0 +1,42 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatchDeviceLink; + +import java.util.List; + +/** + * 计划批次设备关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-12 16:22:12
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanBatchDeviceLinkService extends BasicService +{ + /** + * 根据离线设备ID查询批次设备绑定信息 + * @param deviceId 离线设备ID + * @return 绑定信息 + */ + List queryByOfflineDeviceId(String deviceId); + + /** + * 统计在线设备,或者离线设备离线时间小于20分钟 + * @param batchId 批次号 + * @return 结果 + */ + Integer countOnlineDeviceByBatchId(String batchId); + + /** + * 统计批次的设备 + * @param batchId 批次号 + * @return 结果 + */ + Integer countDeviceByBatchId(String batchId); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanBatchService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanBatchService.java new file mode 100644 index 0000000..0c9736e --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanBatchService.java @@ -0,0 +1,55 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatch; +import net.northking.cctp.executePlan.dto.planBatch.AtuPlanBatchDetailDto; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 计划执行批次表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-07 17:41:08
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanBatchService extends BasicService +{ + /** + * 查询计划最大批次号计划 + * @return 结果集 + */ + List queryPlanMaxBatchNumList(String endTime, int fromIndex, int toIndex); + + + Integer updateByEntity(AtuPlanBatch entity); + + /** + * 根据id查询批次详情 + * @param batchId id + * @return 详情 + */ + AtuPlanBatchDetailDto queryBatchDetailById(String batchId); + + /** + * 统计计划批次总数-去重 + * @param endTime 结束时间 + * @return 结果 + */ + int countPlanMaxBatch(String endTime); + + List queryNeedClearBatch(LocalDateTime localDateTime); + + /** + * 更新批次表附件清除字段 + * @param batchIds 批次Ids + */ + void updateAttachmentClearStatusByIds(List batchIds); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanDeviceLinkService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanDeviceLinkService.java new file mode 100644 index 0000000..019baf0 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanDeviceLinkService.java @@ -0,0 +1,21 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.executePlan.db.entity.AtuPlanDeviceLink; + +/** + * 计划设备关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-06 17:37:24
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanDeviceLinkService extends BasicService +{ + void deleteDeviceIdByPlanId(String planId); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanEnvLinkService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanEnvLinkService.java new file mode 100644 index 0000000..314c098 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanEnvLinkService.java @@ -0,0 +1,32 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.executePlan.db.entity.AtuPlanEnvLink; + +import java.util.List; + +/** + * 计划环境关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-30 10:30:29
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanEnvLinkService extends BasicService +{ + /** + * 根据计划id查询绑定的环境id集合并根据排序值排序 + * @param planId 计划ID + * @return 环境id集合 + */ + List queryEnvIdByPlanIdOderBySort(String planId); + + Integer insertLinkList(List list); + + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanInfoService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanInfoService.java new file mode 100644 index 0000000..b01901c --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanInfoService.java @@ -0,0 +1,94 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanInfoDetailDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanInfoPageDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanInfoQueryDto; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanPrincipalDto; + +import java.util.List; + +/** + * 执行计划表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-07 17:41:09
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanInfoService extends BasicService +{ + /** + * 根据最后批次ID查询计划信息 + * @param batchId 批次ID + * @return 计划信息 + */ + AtuPlanInfo queryByLastBatchId(String batchId); + + /** + * 查询设置该计划为前置执行的计划ID集合 + * @param planId 计划ID + * @return 计划ID集合 + */ + List queryFollowUpPlanIdList(String planId); + + Pagination queryPlanInfoPage(QueryByPage queryByPage); + + String clonePlanName(AtuPlanInfo atuPlanInfo); + + Integer updatePlanResultById(AtuPlanInfo atuPlanInfo); + + /** + * 根据批次ID查询计划信息 + * @param batchId 批次ID + * @return 计划信息 + */ + AtuPlanInfo findByBatchId(String batchId); + + + /** + * 更新计划下一次执行时间 + * @param atuPlanInfo 计划信息 + * @return 结果 + */ + Integer updatePlanNextExecTime(AtuPlanInfo atuPlanInfo); + + /** + * 根据批次编号修改计划状态 + * @param batchId 批次编号 + * @param status 状态 + * @return 结果 + */ + Integer updatePlanByLastBatchId(String batchId, String status); + + void updatePlanByIds(List ids); + + Integer checkNameUnique(AtuPlanInfo info); + + List queryPlanInfo(AtuPlanInfoQueryDto selectParamAtuPlanInfoQueryDto); + + void updatePrincipal(AtuPlanPrincipalDto dto); + + Pagination queryUpFrontPlan(QueryByPage queryByPage); + + List queryByPage(int fromIndex, int toIndex); + + Integer countdeleted(AtuPlanInfo countParams); + + List queryPlanInfoByIds(List objectIds); + + Integer updatePlanRetryCount(AtuPlanInfo entity); + + List selectManagerByProject(String projectId); + + List selectCreatorByProject(String projectId); + + List selectUpdaterByProject(String projectId); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanSceneCaseTaskService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanSceneCaseTaskService.java new file mode 100644 index 0000000..fc1ddca --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanSceneCaseTaskService.java @@ -0,0 +1,90 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.executePlan.db.entity.AtuPlanSceneCaseTask; + +import java.util.List; +import java.util.Set; + +/** + * 计划场景用例节点任务表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-12 16:22:13
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanSceneCaseTaskService extends BasicService +{ + /** + * 根据任务ID查询场景节点任务设备ID集合 + * @param taskId 任务ID + * @return 设备ID集合 + */ + Set queryDeviceIdListByTaskId(String taskId); + + /** + * 根据任务ID查询未完成节点任务信息 + * @param taskId 任务ID + * @return 节点任务信息 + */ + AtuPlanSceneCaseTask queryUnfinishedTaskByTaskId(String taskId); + + + /** + * 查询节点最后一次执行结果文件 + * @param query 查询条件 + * @return 结果 + */ + AtuPlanSceneCaseTask queryResultFileByTaskIdAndNodeId(AtuPlanSceneCaseTask query); + + /** + * 根据任务id查询节点任务信息 + * @param taskId 任务id + * @return 节点任务信息集合 + */ + List queryNodeInfo(String taskId); + + + /** + * 根据批次id查询任务中的appId + * @param batchId 批次Id + * @return 结果集 + */ + List queryAppIdListByBatchId(String batchId); + + /** + * 根据计划id删除场景节点任务 + * @param planId 计划id + * @param num 删除数量 + * @return 结果 + */ + int deleteByPlanIdLimit(String planId, int num); + + /** + * 根据计划id统计场景节点任务数量 + * @param planId 计划id + * @return 任务数量 + */ + int countByPlanId(String planId); + + /** + * 根据任务Ids 查询场景任务 + * @param taskIds 任务Ids + * @return 场景任务集合 + */ + List querySceneCaseTasksByTaskIds(List taskIds); + + /** + * 查询执行超时N秒任务 + * @param timeout 超时时间 + * @return 任务集合 + */ + List queryExecTimeoutTask(int timeout); + + List queryWaitTimeoutTask(Integer waitTimeout); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanScriptLinkMdService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanScriptLinkMdService.java new file mode 100644 index 0000000..697fa18 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanScriptLinkMdService.java @@ -0,0 +1,35 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.executePlan.db.entity.AtuPlanScriptLinkMd; +import net.northking.cctp.executePlan.dto.planScript.AtuPlanScriptDeleteDto; +import net.northking.cctp.executePlan.dto.planScript.AtuPlanScriptLinkDto; +import net.northking.cctp.executePlan.feign.dto.PlanScriptQueryPageDto; + +import java.util.List; + +/** + * 计划脚本关联副表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-09-04 09:44:18
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanScriptLinkMdService extends BasicService +{ + List queryLinkMdPage(String planId,List selectList); + + Integer deleteLinkMd(AtuPlanScriptDeleteDto deleteDto); + + Integer insertMdBatch(Listlist); + + Pagination queryScriptLink(QueryByPage dto); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanScriptLinkService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanScriptLinkService.java new file mode 100644 index 0000000..55c561a --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanScriptLinkService.java @@ -0,0 +1,32 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.executePlan.db.entity.AtuPlanScriptLink; + +import java.util.List; + +/** + * 计划脚本关联表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2023-08-31 16:48:02
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanScriptLinkService extends BasicService +{ + + Integer insertLinkList(List list); + + /** + * 根据脚本id统计 + * @param scriptIdList 脚本id集合 + * @return 结果 + */ + long countByScriptIdList(List scriptIdList); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanTaskRecordService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanTaskRecordService.java new file mode 100644 index 0000000..95e109b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanTaskRecordService.java @@ -0,0 +1,30 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2024 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.executePlan.db.entity.AtuPlanTaskRecord; +import net.northking.cctp.executePlan.dto.planTask.PlanTaskRecordDto; + +import java.util.List; + +/** + * 任务执行记录表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2024-10-16 17:02:48
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanTaskRecordService extends BasicService +{ + + + +// ---- The End by Generator ----// + List queryTotalTake(List ids); + + List queryReTryTaskByTaskIds(List ids); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanTaskService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanTaskService.java new file mode 100644 index 0000000..d79d224 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/AtuPlanTaskService.java @@ -0,0 +1,139 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.common.http.QueryByPage; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskExtendDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskPageDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskQueryDto; +import net.northking.cctp.executePlan.dto.planTask.AtuTaskSendBugDto; +import net.northking.cctp.executePlan.pub.dto.ScriptFirstExecutionDTO; + +import java.time.LocalDate; +import java.util.List; + +/** + * 计划执行任务表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-12-06 11:00:17
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface AtuPlanTaskService extends BasicService + +{ + /** + * 分页查询计划关联用例集列表 + * @param queryByPage 分页条件 + * @return 用例集列表 + */ + List queryList(QueryByPage queryByPage); + + /** + * 校验批次是否完成 + * @param batchId 批次号 + * @return 是否完成 + */ + boolean checkBatchFinish(String batchId); + + /** + * 查询批次最后完成任务的结束时间 + * @param batchId 批次号 + * @return 结束时间 + */ + Long queryBatchLastTaskEndTime(String batchId); + + /** + * 根据批次ID查询未完成的任务 + * @param batchId 批次ID + * @return 任务 + */ + List queryUnfinishedTaskByBatchId(String batchId); + + /** + * 查询批次第一个开始执行的任务开始时间 + * @param batchId 批次号 + * @return 开始时间 + */ + Long queryBatchFirstTaskStartTime(String batchId); + + /** + * 根据批次ID查询该批次失败的任务ID集合 + * @param batchId 批次ID + * @return 失败任务ID集合 + */ + List queryAllFailIdList(String batchId); + + + List queryCaseListByBatchId(String batchId); + + /** + * 根据批次id查询该批次的环境 + * @param batchId 批次id + * @return 环境id + */ + String queryEnvIdByBatchId(String batchId); + + /** + * 根据批次id查询任务中的appId + * @param batchId 批次Id + * @return 结果集 + */ + List queryAppIdListByBatchId(String batchId); + + + int deleteByPlanIdLimit(String planId, int num); + + /** + * 根据计划id统计任务数量 + * @param planId 计划id + * @return 任务数量 + */ + int countByPlanId(String planId); + + /** + * 根据批次id查询移动任务性能文件地址集合 + * @param batchId 批次id + * @return 结果集 + */ + List queryMobilePerDataPathByBatchId(String batchId); + + AtuTaskSendBugDto querySendBugTaskInfo(String taskId); + + List getFirstExecuteInfo(List scriptIds); + ScriptFirstExecutionDTO getFirstExecuteInfo(String scriptIds); + + Integer getScriptExecuteSuccessNum(String scriptId, String planId, LocalDate now); + + List getTasksByPlanId(String planId); + + List getTaskIdsByScriptIdsAndPlanId(List oldScriptIds, String planId); + + /** + * 根据批次Id集合查询需要的任务 + * @param batchIds 批次Id集合 + * @return 任务集合 + */ + List queryTasksByBatchIds(List batchIds); + + /** + * 查询执行超时N秒任务 + * @param timeout 超时时间 + * @return 任务集合 + */ + List queryExecTimeoutTask(int timeout); + + /** + * 根据id查询任务扩展信息 + * @param taskId 任务id + * @return 任务扩展信息 + */ + AtuPlanTaskExtendDto queryTaskExtendById(String taskId); + + List queryWaitTimeoutTask(Integer waitTimeout); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/MqSynchronizeTaskService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/MqSynchronizeTaskService.java new file mode 100644 index 0000000..af46d35 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/db/service/MqSynchronizeTaskService.java @@ -0,0 +1,24 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.db.service; + +import net.northking.cctp.common.db.BasicService; +import net.northking.cctp.executePlan.db.entity.MqSynchronizeTask; + +import java.util.List; + +/** + * dw同步表 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2022-11-24 12:13:20
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +public interface MqSynchronizeTaskService extends BasicService +{ + List findByTypes(List types); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/AtuExecplanTagAddDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/AtuExecplanTagAddDto.java new file mode 100644 index 0000000..3671c15 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/AtuExecplanTagAddDto.java @@ -0,0 +1,48 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.execplanTag; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.util.List; + +/** +* Restful接口--新增资源--数据传输对象:执行计划标签表 +* +* createdate: 2023-09-06 19:55:52
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "执行计划标签表") +public class AtuExecplanTagAddDto implements Serializable +{ + // TODO 请完成新增资源的属性 + + @ApiModelProperty("执行计划id列表") + private List execplanIdList; + + @ApiModelProperty("标签名称列表") + private List tagNameList; + + public List getExecplanIdList() { + return execplanIdList; + } + + public void setExecplanIdList(List execplanIdList) { + this.execplanIdList = execplanIdList; + } + + public List getTagNameList() { + return tagNameList; + } + + public void setTagNameList(List tagNameList) { + this.tagNameList = tagNameList; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/AtuExecplanTagDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/AtuExecplanTagDetailDto.java new file mode 100644 index 0000000..72775a2 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/AtuExecplanTagDetailDto.java @@ -0,0 +1,24 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2023 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.execplanTag; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; + +import java.io.Serializable; + +/** +* Restful接口--资源详情--数据传输对象:执行计划标签表 +* +* createdate: 2023-09-06 19:55:52
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "执行计划标签表") +public class AtuExecplanTagDetailDto implements Serializable +{ + // TODO 请完成资源详情展示的属性 +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/AtuExexplanTagDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/AtuExexplanTagDto.java new file mode 100644 index 0000000..9b94005 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/AtuExexplanTagDto.java @@ -0,0 +1,41 @@ +package net.northking.cctp.executePlan.dto.execplanTag; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.List; + +@JsonSerialize +@ApiModel(description = "执行计划标签关系表") +public class AtuExexplanTagDto implements Serializable { + /** + * 脚本ID
+ */ + @ApiModelProperty("执行计划ID") + @Size(max = 32, message="执行计划ID-execplanId: 数据长度不能 > 32" ) + private String execplanId; + /** + * 标签ID列表
+ */ + @ApiModelProperty("标签ID列表") + private List tagIdList; + + public String getExecplanId() { + return execplanId; + } + + public void setExecplanId(String execplanId) { + this.execplanId = execplanId; + } + + public List getTagIdList() { + return tagIdList; + } + + public void setTagIdList(List tagIdList) { + this.tagIdList = tagIdList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/TagInfoDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/TagInfoDto.java new file mode 100644 index 0000000..67717a6 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/execplanTag/TagInfoDto.java @@ -0,0 +1,41 @@ +package net.northking.cctp.executePlan.dto.execplanTag; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; + +@JsonSerialize +@ApiModel(description = "标签信息实体") +public class TagInfoDto implements Serializable { + /** + * 标签ID
+ */ + @ApiModelProperty("标签ID") + @Size(max = 32, message="标签ID-tagId: 数据长度不能 > 32" ) + private String tagId; + /** + * 标签名称
+ */ + @ApiModelProperty("标签名称") + @Size(max = 30, message="标签名称-tagName: 数据长度不能 > 30" ) + private String tagName; + + public String getTagId() { + return tagId; + } + + public void setTagId(String tagId) { + this.tagId = tagId; + } + + public String getTagName() { + return tagName; + } + + public void setTagName(String tagName) { + this.tagName = tagName; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AppBaseInfoDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AppBaseInfoDto.java new file mode 100644 index 0000000..c555920 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AppBaseInfoDto.java @@ -0,0 +1,83 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +/** + *

Title: AppBaseInfoDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/10/18 16:28 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class AppBaseInfoDto implements Serializable { + + /** + * app名称 + */ + @ApiModelProperty("app名称") + private String appName; + /** + * app版本 + */ + @ApiModelProperty("app版本") + private String appVersion; + /** + * 包名 + */ + @ApiModelProperty("包名") + private String appPackage; + /** + * 渠道名称 + */ + @ApiModelProperty("渠道名称") + private String channelName; + /** + * app版本备注 + */ + @ApiModelProperty("app版本备注") + private String versionDesc; + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getAppVersion() { + return appVersion; + } + + public void setAppVersion(String appVersion) { + this.appVersion = appVersion; + } + + public String getAppPackage() { + return appPackage; + } + + public void setAppPackage(String appPackage) { + this.appPackage = appPackage; + } + + public String getChannelName() { + return channelName; + } + + public void setChannelName(String channelName) { + this.channelName = channelName; + } + + public String getVersionDesc() { + return versionDesc; + } + + public void setVersionDesc(String versionDesc) { + this.versionDesc = versionDesc; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AppDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AppDetailDto.java new file mode 100644 index 0000000..a6e9519 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AppDetailDto.java @@ -0,0 +1,206 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planBatch; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; + +import java.io.Serializable; +import java.util.Date; +import java.util.Map; + +/** +* Restful接口--资源详情--数据传输对象:应用表 +* +* createdate: 2022-10-13 10:02:44
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "应用表") +public class AppDetailDto implements Serializable +{ + private String id;//ID + private String appSize;//应用大小 + private String appName;//应用名称 + private String packageName;//包名 + private String buildVersion;//构建版本 + private String platform;//平台类型 + private String appUrl;//脚本文件地址 + private String versionMark;//版本说明 + private String ownerId;//设备归属对象ID + private String tenantId;//租户ID + private byte[] appIcon;//app图标 + private String remarks;//备注 + private Integer versionCode;//版本号 + private String activity;//activity + private String createdBy;//上传人id + private String createdByName;//上传人姓名 + private Date createdTime;//上传时间 + private String updatedBy;//更新人 + private Date updatedTime;//更新时间 + + private Map manifest; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAppSize() { + return appSize; + } + + public void setAppSize(String appSize) { + this.appSize = appSize; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getBuildVersion() { + return buildVersion; + } + + public void setBuildVersion(String buildVersion) { + this.buildVersion = buildVersion; + } + + public String getPlatform() { + return platform; + } + + public void setPlatform(String platform) { + this.platform = platform; + } + + public String getAppUrl() { + return appUrl; + } + + public void setAppUrl(String appUrl) { + this.appUrl = appUrl; + } + + public String getVersionMark() { + return versionMark; + } + + public void setVersionMark(String versionMark) { + this.versionMark = versionMark; + } + + public String getOwnerId() { + return ownerId; + } + + public void setOwnerId(String ownerId) { + this.ownerId = ownerId; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public byte[] getAppIcon() { + return appIcon; + } + + public void setAppIcon(byte[] appIcon) { + this.appIcon = appIcon; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Integer getVersionCode() { + return versionCode; + } + + public void setVersionCode(Integer versionCode) { + this.versionCode = versionCode; + } + + public String getActivity() { + return activity; + } + + public void setActivity(String activity) { + this.activity = activity; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getCreatedByName() { + return createdByName; + } + + public void setCreatedByName(String createdByName) { + this.createdByName = createdByName; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + public Map getManifest() { + return manifest; + } + + public void setManifest(Map manifest) { + this.manifest = manifest; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AppPerInfo.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AppPerInfo.java new file mode 100644 index 0000000..d811105 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AppPerInfo.java @@ -0,0 +1,44 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +public class AppPerInfo { + + private String appPackage; + + private long appInstallTime; //app安装时间/ms + + private long appActiveTime; //app启动时间/ms + + private String appPerInfoAddress; //app具体的数据三个List + + public String getAppPackage() { + return appPackage; + } + + public void setAppPackage(String appPackage) { + this.appPackage = appPackage; + } + + public long getAppInstallTime() { + return appInstallTime; + } + + public void setAppInstallTime(long appInstallTime) { + this.appInstallTime = appInstallTime; + } + + public long getAppActiveTime() { + return appActiveTime; + } + + public void setAppActiveTime(long appActiveTime) { + this.appActiveTime = appActiveTime; + } + + public String getAppPerInfoAddress() { + return appPerInfoAddress; + } + + public void setAppPerInfoAddress(String appPerInfoAddress) { + this.appPerInfoAddress = appPerInfoAddress; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuBatchCaseInfoDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuBatchCaseInfoDto.java new file mode 100644 index 0000000..a3c3eb0 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuBatchCaseInfoDto.java @@ -0,0 +1,239 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import net.northking.cctp.executePlan.dto.planSceneCase.AtuSceneNodeExecDto; + +import java.io.Serializable; +import java.util.Map; + +/** + *

Title: AtuBatchCaseCreateDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/09 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuBatchCaseInfoDto extends BatchStrategyDto implements Serializable { + + /** + * 批次ID + */ + private String batchId; + + /** + * 环境id
+ */ + private String envId; + + /** + * 数据集id + */ + private String dataSetId; + + /** + * 任务ID + */ + private String taskId; + + /** + * 用例ID + */ + private String caseId; + + /** + * 用例编号 + */ + private String caseNo; + + /** + * 用例名称 + */ + private String caseName; + + /** + * 用例类型 1-接口,2-PC/BS,3-PC/CS,4-安卓,5-IOS,6-场景 + */ + private String caseType; + + /** + * 用例参数 + */ + private Map caseParam; + + /** + * 脚本编号 + */ + private String scriptId; + + /** + * 脚本版本id
+ */ + private Integer versionId; + /** + * 脚本版本名称
+ */ + private String versionName; + + /** + * 脚本名称 + */ + private String scriptName; + + /** + * 脚本地址 + */ + private String scriptPath; + + /** + * 应用平台类型 + */ + private String platformType; + + /** + * 应用包名 + */ + private String appPackage; + + /** + * 场景节点执行信息 + */ + private AtuSceneNodeExecDto sceneNodeExecDto; + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getCaseId() { + return caseId; + } + + public void setCaseId(String caseId) { + this.caseId = caseId; + } + + public String getCaseNo() { + return caseNo; + } + + public void setCaseNo(String caseNo) { + this.caseNo = caseNo; + } + + public String getCaseName() { + return caseName; + } + + public void setCaseName(String caseName) { + this.caseName = caseName; + } + + public String getCaseType() { + return caseType; + } + + public void setCaseType(String caseType) { + this.caseType = caseType; + } + + public Map getCaseParam() { + return caseParam; + } + + public void setCaseParam(Map caseParam) { + this.caseParam = caseParam; + } + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public Integer getVersionId() { + return versionId; + } + + public void setVersionId(Integer versionId) { + this.versionId = versionId; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public String getScriptPath() { + return scriptPath; + } + + public void setScriptPath(String scriptPath) { + this.scriptPath = scriptPath; + } + + public String getPlatformType() { + return platformType; + } + + public void setPlatformType(String platformType) { + this.platformType = platformType; + } + + public String getAppPackage() { + return appPackage; + } + + public void setAppPackage(String appPackage) { + this.appPackage = appPackage; + } + + public AtuSceneNodeExecDto getSceneNodeExecDto() { + return sceneNodeExecDto; + } + + public void setSceneNodeExecDto(AtuSceneNodeExecDto sceneNodeExecDto) { + this.sceneNodeExecDto = sceneNodeExecDto; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuBatchSumDataDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuBatchSumDataDto.java new file mode 100644 index 0000000..a89db35 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuBatchSumDataDto.java @@ -0,0 +1,56 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import java.io.Serializable; + +/** + *

Title: AtuBatchSumDataDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/01/29 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuBatchSumDataDto implements Serializable { + + private String batchId; + + private Integer batch; + + private String status; + + private Integer total; + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public Integer getBatch() { + return batch; + } + + public void setBatch(Integer batch) { + this.batch = batch; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Integer getTotal() { + return total; + } + + public void setTotal(Integer total) { + this.total = total; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuBatchTaskPageDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuBatchTaskPageDto.java new file mode 100644 index 0000000..9e5c2ca --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuBatchTaskPageDto.java @@ -0,0 +1,27 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskPageDto; + +public class AtuBatchTaskPageDto { + + private AtuPlanBatchPageDto batchDto; + + private Pagination taskPage; + + public AtuPlanBatchPageDto getBatchDto() { + return batchDto; + } + + public void setBatchDto(AtuPlanBatchPageDto batchDto) { + this.batchDto = batchDto; + } + + public Pagination getTaskPage() { + return taskPage; + } + + public void setTaskPage(Pagination taskPage) { + this.taskPage = taskPage; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuExceptionCase.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuExceptionCase.java new file mode 100644 index 0000000..fa49189 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuExceptionCase.java @@ -0,0 +1,175 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import java.io.Serializable; + +/** + *

Title: AtuExceptionCase

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/02/07 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuExceptionCase implements Serializable { + + /** + * 调度主键
+ */ + private String batchId; + /** + * 脚本主键
+ */ + private String scriptId; + /** + * 脚本名称
+ */ + private String scriptName; + /** + * 脚本存放地址
+ */ + private String scriptJson; + /** + * 用例主键
+ */ + private String caseId; + /** + * 用例编号
+ */ + private String caseNo; + /** + * 用例名称
+ */ + private String caseName; + /** + * 用例类型;1-接口,2-PC/BS,3-PC/CS,4-安卓,5-ios,6-场景用例
+ */ + private String caseType; + /** + * 用例参数
+ */ + private String caseParam; + + /** + * 错误信息 + */ + private String errorMsg; + + /** + * 环境id + */ + private String envId; + /** + * 脚本版本id
+ */ + private Integer versionId; + /** + * 脚本版本名称
+ */ + private String versionName; + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public Integer getVersionId() { + return versionId; + } + + public void setVersionId(Integer versionId) { + this.versionId = versionId; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public String getScriptJson() { + return scriptJson; + } + + public void setScriptJson(String scriptJson) { + this.scriptJson = scriptJson; + } + + public String getCaseId() { + return caseId; + } + + public void setCaseId(String caseId) { + this.caseId = caseId; + } + + public String getCaseNo() { + return caseNo; + } + + public void setCaseNo(String caseNo) { + this.caseNo = caseNo; + } + + public String getCaseName() { + return caseName; + } + + public void setCaseName(String caseName) { + this.caseName = caseName; + } + + public String getCaseType() { + return caseType; + } + + public void setCaseType(String caseType) { + this.caseType = caseType; + } + + public String getCaseParam() { + return caseParam; + } + + public void setCaseParam(String caseParam) { + this.caseParam = caseParam; + } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchDetailDto.java new file mode 100644 index 0000000..50c2d21 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchDetailDto.java @@ -0,0 +1,43 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planBatch; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatch; + +import java.io.Serializable; + +/** +* Restful接口--资源详情--数据传输对象:执行计划表 +* +* createdate: 2022-12-06 11:32:04
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "执行计划表") +public class AtuPlanBatchDetailDto extends AtuPlanBatch implements Serializable +{ + private String tenantId; + + private String planName; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchDto.java new file mode 100644 index 0000000..afda534 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchDto.java @@ -0,0 +1,94 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import java.io.Serializable; + +/** + *

Title: AtuPlanBatchDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/02/03 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuPlanBatchDto implements Serializable { + + /** + * 系统ID + */ + private String projectId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 计划ID + */ + private String planId; + + /** + * 批次ID + */ + private String batchId; + + /** + * 计划名称 + */ + private String planName; + + /** + * 批次号 + */ + private Integer batch; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public Integer getBatch() { + return batch; + } + + public void setBatch(Integer batch) { + this.batch = batch; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchPageDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchPageDto.java new file mode 100644 index 0000000..04c5f0f --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchPageDto.java @@ -0,0 +1,292 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planBatch; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; + +/** +* Restful接口--资源详情--数据传输对象:计划执行批次表 +* +* createdate: 2022-12-06 11:32:04
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "计划执行批次表") +public class AtuPlanBatchPageDto implements Serializable +{ + + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 计划主键
+ */ + @ApiModelProperty("计划主键") + @Size(max = 32, message="计划主键-planId: 数据长度不能 > 32" ) + private String planId; + /** + * 任务批次
+ */ + @ApiModelProperty("任务批次") + private Integer batch; + /** + * 状态;0-等待中,1-执行中,2-已完成,3-已取消
+ */ + @ApiModelProperty("状态;0-等待中,1-执行中,2-已完成,3-已取消") + @Size(max = 1, message="状态;0-等待中,1-执行中,2-已完成,3-已取消-status: 数据长度不能 > 1" ) + private String status; + /** + * 调度开始时间
+ */ + @ApiModelProperty("调度开始时间") + private Date startTime; + /** + * 调度结束时间
+ */ + @ApiModelProperty("调度结束时间") + private Date endTime; + /** + * 任务总数
+ */ + @ApiModelProperty("任务总数") + private Integer taskTotal; + /** + * 成功任务数
+ */ + @ApiModelProperty("成功任务数") + private Integer successNum; + /** + * 执行失败数
+ */ + @ApiModelProperty("执行失败数") + private Integer execFailNum; + /** + * 断言失败数
+ */ + @ApiModelProperty("断言失败数") + private Integer assertFailNum; + /** + * 超时任务数
+ */ + @ApiModelProperty("超时任务数") + private Integer timeoutNum; + /** + * 取消任务数
+ */ + @ApiModelProperty("取消任务数") + private Integer cancelNum; + /** + * 成功率
+ */ + @ApiModelProperty("成功率") + @Size(max = 10, message="成功率-successRate: 数据长度不能 > 10" ) + private String successRate; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + + @ApiModelProperty("计划名称") + private String planName; + + @ApiModelProperty("录屏设置;0-不保存,1-全部保存,2-出错保存") + @Size(max = 1, message="录屏设置;0-不保存,1-全部保存,2-出错保存-screenRecordSet: 数据长度不能 > 1" ) + private String screenRecordSet; + + /** + * 脚本总数
+ */ + @ApiModelProperty("脚本总数") + private Integer scriptNum; + + /** + * 执行人
+ */ + @ApiModelProperty("执行人") + @Size(max = 32, message="执行人-executedBy: 数据长度不能 > 32" ) + private String executedBy; + /** + * 触发类型;1-自动,2-手动,3-devops
+ */ + @ApiModelProperty("触发类型;1-自动,2-手动,3-devops") + @Size(max = 1, message="触发类型;1-自动,2-手动,3-devops-triggerType: 数据长度不能 > 1" ) + private String triggerType; + + @ApiModelProperty("耗时") + private String elapsedTime; + + public String getElapsedTime() { + return elapsedTime; + } + + public void setElapsedTime(String elapsedTime) { + this.elapsedTime = elapsedTime; + } + + public String getScreenRecordSet() { + return screenRecordSet; + } + + public void setScreenRecordSet(String screenRecordSet) { + this.screenRecordSet = screenRecordSet; + } + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public Integer getBatch() { + return batch; + } + + public void setBatch(Integer batch) { + this.batch = batch; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getTaskTotal() { + return taskTotal; + } + + public void setTaskTotal(Integer taskTotal) { + this.taskTotal = taskTotal; + } + + public Integer getSuccessNum() { + return successNum; + } + + public void setSuccessNum(Integer successNum) { + this.successNum = successNum; + } + + public Integer getExecFailNum() { + return execFailNum; + } + + public void setExecFailNum(Integer execFailNum) { + this.execFailNum = execFailNum; + } + + public Integer getAssertFailNum() { + return assertFailNum; + } + + public void setAssertFailNum(Integer assertFailNum) { + this.assertFailNum = assertFailNum; + } + + public Integer getTimeoutNum() { + return timeoutNum; + } + + public void setTimeoutNum(Integer timeoutNum) { + this.timeoutNum = timeoutNum; + } + + public Integer getCancelNum() { + return cancelNum; + } + + public void setCancelNum(Integer cancelNum) { + this.cancelNum = cancelNum; + } + + public String getSuccessRate() { + return successRate; + } + + public void setSuccessRate(String successRate) { + this.successRate = successRate; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public Integer getScriptNum() { + return scriptNum; + } + + public void setScriptNum(Integer scriptNum) { + this.scriptNum = scriptNum; + } + + public String getExecutedBy() { + return executedBy; + } + + public void setExecutedBy(String executedBy) { + this.executedBy = executedBy; + } + + public String getTriggerType() { + return triggerType; + } + + public void setTriggerType(String triggerType) { + this.triggerType = triggerType; + } + + // TODO 请完成资源详情展示的属性 +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchQueryDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchQueryDto.java new file mode 100644 index 0000000..00d4969 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchQueryDto.java @@ -0,0 +1,52 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planBatch; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.*; + +import java.io.Serializable; + +/** +* 查询接口--数据传输对象:计划执行批次表 +* +* createdate: 2022-12-06 11:32:04
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "计划执行批次表") +public class AtuPlanBatchQueryDto implements Serializable +{ + /** + * 计划主键
+ */ + @ApiModelProperty("计划主键") + @Size(max = 32, message="计划主键-planId: 数据长度不能 > 32" ) + private String planId; + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + private String source; + + // TODO 请完成查询接口的查询条件 +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchReportDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchReportDto.java new file mode 100644 index 0000000..0a25c49 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/AtuPlanBatchReportDto.java @@ -0,0 +1,43 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.executePlan.db.entity.AtuPlanBatch; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; + +import java.util.List; +import java.util.Map; + +public class AtuPlanBatchReportDto { + @ApiModelProperty("批次信息") + private AtuPlanBatch planBatch; + + @ApiModelProperty("失败执行任务") + private List taskList; + + @ApiModelProperty("饼图数据") + private Map tableData; + + public AtuPlanBatch getPlanBatch() { + return planBatch; + } + + public void setPlanBatch(AtuPlanBatch planBatch) { + this.planBatch = planBatch; + } + + public List getTaskList() { + return taskList; + } + + public void setTaskList(List taskList) { + this.taskList = taskList; + } + + public Map getTableData() { + return tableData; + } + + public void setTableData(Map tableData) { + this.tableData = tableData; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchAppInfoDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchAppInfoDto.java new file mode 100644 index 0000000..1ec03d4 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchAppInfoDto.java @@ -0,0 +1,308 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +/** + *

Title: BatchAppInfoDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/10/5 19:39 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class BatchAppInfoDto implements Serializable { + + /** + * 设备id + */ + @ApiModelProperty("设备id") + private String deviceId; + + /** + * 设备名称 + */ + @ApiModelProperty("设备名称") + private String deviceName; + + /** + * appId + */ + @ApiModelProperty("appId") + private String appId; + + /** + * app名称 + */ + @ApiModelProperty("appName") + private String appName; + + /** + * app安装耗时 + */ + @ApiModelProperty("app安装耗时") + private String installTime; + /** + * app安装耗时最大值 + */ + @ApiModelProperty("app安装耗时最大值") + private String maxInstallTime; + /** + * app启动耗时 + */ + @ApiModelProperty("app启动耗时") + private String startElapsedTime; + /** + * app启动耗时最大值 + */ + @ApiModelProperty("app启动耗时最大值") + private String maxStartElapsedTime; + /** + * app cpu占用率 + */ + @ApiModelProperty("app cpu占用率") + private String appCpu; + /** + * app cpu占用率最大值 + */ + @ApiModelProperty("app cpu占用率最大值") + private String maxAppCpu; + /** + * app内存占用 + */ + @ApiModelProperty("app内存占用") + private String appMemory; + /** + * app内存占用最大值 + */ + @ApiModelProperty("app内存占用最大值") + private String maxAppMemory; + /** + * app流量消耗 + */ + @ApiModelProperty("app流量消耗") + private String appFlow; + /** + * app流量消耗最大值 + */ + @ApiModelProperty("app流量消耗最大值") + private String maxAppFlow; + /** + * 设备CPU占用率 + */ + @ApiModelProperty("设备CPU占用率") + private String deviceCpu; + /** + * 设备CPU占用率最大值 + */ + @ApiModelProperty("设备CPU占用率最大值") + private String maxDeviceCpu; + /** + * 设备内存占用 + */ + @ApiModelProperty("设备内存占用") + private String deviceMemory; + /** + * 设备内存占用最大值 + */ + @ApiModelProperty("设备内存占用最大值") + private String maxDeviceMemory; + /** + * 设备流量 + */ + @ApiModelProperty("设备流量消耗") + private String deviceFlow; + /** + * 设备流量最大值 + */ + @ApiModelProperty("设备流量消耗最大值") + private String maxDeviceFlow; + /** + * 电池温度 + */ + @ApiModelProperty("电池温度") + private String cellTemperature; + /** + * 电池温度最大值 + */ + @ApiModelProperty("电池温度最大值") + private String maxCellTemperature; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getInstallTime() { + return installTime; + } + + public void setInstallTime(String installTime) { + this.installTime = installTime; + } + + public String getMaxInstallTime() { + return maxInstallTime; + } + + public void setMaxInstallTime(String maxInstallTime) { + this.maxInstallTime = maxInstallTime; + } + + public String getStartElapsedTime() { + return startElapsedTime; + } + + public void setStartElapsedTime(String startElapsedTime) { + this.startElapsedTime = startElapsedTime; + } + + public String getMaxStartElapsedTime() { + return maxStartElapsedTime; + } + + public void setMaxStartElapsedTime(String maxStartElapsedTime) { + this.maxStartElapsedTime = maxStartElapsedTime; + } + + public String getAppCpu() { + return appCpu; + } + + public void setAppCpu(String appCpu) { + this.appCpu = appCpu; + } + + public String getMaxAppCpu() { + return maxAppCpu; + } + + public void setMaxAppCpu(String maxAppCpu) { + this.maxAppCpu = maxAppCpu; + } + + public String getAppMemory() { + return appMemory; + } + + public void setAppMemory(String appMemory) { + this.appMemory = appMemory; + } + + public String getMaxAppMemory() { + return maxAppMemory; + } + + public void setMaxAppMemory(String maxAppMemory) { + this.maxAppMemory = maxAppMemory; + } + + public String getAppFlow() { + return appFlow; + } + + public void setAppFlow(String appFlow) { + this.appFlow = appFlow; + } + + public String getMaxAppFlow() { + return maxAppFlow; + } + + public void setMaxAppFlow(String maxAppFlow) { + this.maxAppFlow = maxAppFlow; + } + + public String getDeviceCpu() { + return deviceCpu; + } + + public void setDeviceCpu(String deviceCpu) { + this.deviceCpu = deviceCpu; + } + + public String getMaxDeviceCpu() { + return maxDeviceCpu; + } + + public void setMaxDeviceCpu(String maxDeviceCpu) { + this.maxDeviceCpu = maxDeviceCpu; + } + + public String getDeviceMemory() { + return deviceMemory; + } + + public void setDeviceMemory(String deviceMemory) { + this.deviceMemory = deviceMemory; + } + + public String getMaxDeviceMemory() { + return maxDeviceMemory; + } + + public void setMaxDeviceMemory(String maxDeviceMemory) { + this.maxDeviceMemory = maxDeviceMemory; + } + + public String getDeviceFlow() { + return deviceFlow; + } + + public void setDeviceFlow(String deviceFlow) { + this.deviceFlow = deviceFlow; + } + + public String getMaxDeviceFlow() { + return maxDeviceFlow; + } + + public void setMaxDeviceFlow(String maxDeviceFlow) { + this.maxDeviceFlow = maxDeviceFlow; + } + + public String getCellTemperature() { + return cellTemperature; + } + + public void setCellTemperature(String cellTemperature) { + this.cellTemperature = cellTemperature; + } + + public String getMaxCellTemperature() { + return maxCellTemperature; + } + + public void setMaxCellTemperature(String maxCellTemperature) { + this.maxCellTemperature = maxCellTemperature; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchInfoReportDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchInfoReportDto.java new file mode 100644 index 0000000..1dcbfa1 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchInfoReportDto.java @@ -0,0 +1,172 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.util.Date; + +/** + *

Title: BatchInfoReportDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/09/25 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class BatchInfoReportDto implements Serializable { + + /** + * 计划名称 + */ + @ApiModelProperty("计划名称") + private String planName; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + private Date createdTime; + + /** + * 结束时间 + */ + @ApiModelProperty("结束时间") + private Date endTime; + + /** + * 耗时 + */ + @ApiModelProperty("耗时") + private String elapsedTime; + + /** + * 脚本总数 + */ + @ApiModelProperty("脚本总数") + private Integer scriptTotal; + + /** + * 用例总数 + */ + @ApiModelProperty("用例总数") + private Integer caseTotal; + + /** + * 提测设备数量 + */ + @ApiModelProperty("提测设备数量") + private Long testDeviceNum; + + /** + * 重试设备数量 + */ + @ApiModelProperty("重试设备数量") + private Long retryDeviceNum; + + /** + * 提测人 + */ + @ApiModelProperty("提测人") + private String testBy; + + /** + * 触发类型;1-自动,2-手动,3-devops
+ */ + @ApiModelProperty("触发方式 1-自动,2-手动,3-devops") + private String triggerType; + + /** + * 环境名称 + */ + @ApiModelProperty("环境名称") + private String envName; + + public String getTriggerType() { + return triggerType; + } + + public void setTriggerType(String triggerType) { + this.triggerType = triggerType; + } + + public String getEnvName() { + return envName; + } + + public void setEnvName(String envName) { + this.envName = envName; + } + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getElapsedTime() { + return elapsedTime; + } + + public void setElapsedTime(String elapsedTime) { + this.elapsedTime = elapsedTime; + } + + public Integer getScriptTotal() { + return scriptTotal; + } + + public void setScriptTotal(Integer scriptTotal) { + this.scriptTotal = scriptTotal; + } + + public Integer getCaseTotal() { + return caseTotal; + } + + public void setCaseTotal(Integer caseTotal) { + this.caseTotal = caseTotal; + } + + public Long getTestDeviceNum() { + return testDeviceNum; + } + + public void setTestDeviceNum(Long testDeviceNum) { + this.testDeviceNum = testDeviceNum; + } + + public Long getRetryDeviceNum() { + return retryDeviceNum; + } + + public void setRetryDeviceNum(Long retryDeviceNum) { + this.retryDeviceNum = retryDeviceNum; + } + + public String getTestBy() { + return testBy; + } + + public void setTestBy(String testBy) { + this.testBy = testBy; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchMobilePerformanceDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchMobilePerformanceDto.java new file mode 100644 index 0000000..bdbc5fb --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchMobilePerformanceDto.java @@ -0,0 +1,98 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import java.io.Serializable; +import java.util.List; + +/** + *

Title: BatchMobilePerformanceDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/10/10 15:18 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class BatchMobilePerformanceDto implements Serializable { + + private List appInstallTimeList; + private List appActiveTimeList; + private List appCpuList; + private List appMemoList; + private List appFlowList; + private List deviceCpuList; + private List deviceMemoList; + private List deviceFlowList; + private List deviceTemperatureList; + + public List getAppInstallTimeList() { + return appInstallTimeList; + } + + public void setAppInstallTimeList(List appInstallTimeList) { + this.appInstallTimeList = appInstallTimeList; + } + + public List getAppActiveTimeList() { + return appActiveTimeList; + } + + public void setAppActiveTimeList(List appActiveTimeList) { + this.appActiveTimeList = appActiveTimeList; + } + + public List getAppCpuList() { + return appCpuList; + } + + public void setAppCpuList(List appCpuList) { + this.appCpuList = appCpuList; + } + + public List getAppMemoList() { + return appMemoList; + } + + public void setAppMemoList(List appMemoList) { + this.appMemoList = appMemoList; + } + + public List getAppFlowList() { + return appFlowList; + } + + public void setAppFlowList(List appFlowList) { + this.appFlowList = appFlowList; + } + + public List getDeviceCpuList() { + return deviceCpuList; + } + + public void setDeviceCpuList(List deviceCpuList) { + this.deviceCpuList = deviceCpuList; + } + + public List getDeviceMemoList() { + return deviceMemoList; + } + + public void setDeviceMemoList(List deviceMemoList) { + this.deviceMemoList = deviceMemoList; + } + + public List getDeviceFlowList() { + return deviceFlowList; + } + + public void setDeviceFlowList(List deviceFlowList) { + this.deviceFlowList = deviceFlowList; + } + + public List getDeviceTemperatureList() { + return deviceTemperatureList; + } + + public void setDeviceTemperatureList(List deviceTemperatureList) { + this.deviceTemperatureList = deviceTemperatureList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchRetryDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchRetryDto.java new file mode 100644 index 0000000..1bf0387 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchRetryDto.java @@ -0,0 +1,38 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + *

Title: BatchRetryDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/11/10 18:13 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class BatchRetryDto implements Serializable { + + private Boolean hasOfflineDevice = false; + + @NotNull(message = "请选择需要重试的任务") + private List taskIdList; + + public Boolean getHasOfflineDevice() { + return hasOfflineDevice; + } + + public void setHasOfflineDevice(Boolean hasOfflineDevice) { + this.hasOfflineDevice = hasOfflineDevice; + } + + public List getTaskIdList() { + return taskIdList; + } + + public void setTaskIdList(List taskIdList) { + this.taskIdList = taskIdList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchScriptExecDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchScriptExecDetailDto.java new file mode 100644 index 0000000..c81f5e5 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchScriptExecDetailDto.java @@ -0,0 +1,129 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +/** + *

Title: BatchScriptExecDetailDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/9/25 20:09 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class BatchScriptExecDetailDto implements Serializable { + + /** + * 脚本编号 + */ + @ApiModelProperty("脚本编号") + private String scriptCode; + + /** + * 脚本名称 + */ + @ApiModelProperty("脚本名称") + private String scriptName; + + /** + * 用例名称 + */ + @ApiModelProperty("用例名称") + private String caseName; + + /** + * 用例类型 + */ + @ApiModelProperty("用例类型") + private String caseType; + + /** + * 耗时 + */ + @ApiModelProperty("耗时") + private String elapsedTime; + + /** + * 设备名称 + */ + @ApiModelProperty("设备名称") + private String deviceName; + + /** + * 执行状态 + */ + @ApiModelProperty("执行状态") + private String status; + + /** + * 失败原因 + */ + @ApiModelProperty("失败原因") + private String errorMsg; + + public String getScriptCode() { + return scriptCode; + } + + public void setScriptCode(String scriptCode) { + this.scriptCode = scriptCode; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public String getCaseName() { + return caseName; + } + + public void setCaseName(String caseName) { + this.caseName = caseName; + } + + public String getCaseType() { + return caseType; + } + + public void setCaseType(String caseType) { + this.caseType = caseType; + } + + public String getElapsedTime() { + return elapsedTime; + } + + public void setElapsedTime(String elapsedTime) { + this.elapsedTime = elapsedTime; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchScriptReportDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchScriptReportDto.java new file mode 100644 index 0000000..32f46d1 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchScriptReportDto.java @@ -0,0 +1,89 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + *

Title: BatchScriptReportDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/09/25 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class BatchScriptReportDto implements Serializable { + + /** + * 计划批次基本信息 + */ + @ApiModelProperty("计划批次基本信息") + private BatchInfoReportDto batchInfo; + + /** + * 脚本执行统计信息 + */ + @ApiModelProperty("脚本执行统计信息") + private Map scriptExecMap; + + /** + * 脚本执行详情 + */ + @ApiModelProperty("脚本执行详情") + private List scriptExecList; + + /** + * app基本信息 + */ + @ApiModelProperty("app基本信息集合") + private List appBaseInfoList; + + /** + * app性能相关信息 + */ + @ApiModelProperty("app性能相关信息") + private List appPerList; + + public BatchInfoReportDto getBatchInfo() { + return batchInfo; + } + + public void setBatchInfo(BatchInfoReportDto batchInfo) { + this.batchInfo = batchInfo; + } + + public Map getScriptExecMap() { + return scriptExecMap; + } + + public void setScriptExecMap(Map scriptExecMap) { + this.scriptExecMap = scriptExecMap; + } + + public List getScriptExecList() { + return scriptExecList; + } + + public void setScriptExecList(List scriptExecList) { + this.scriptExecList = scriptExecList; + } + + public List getAppPerList() { + return appPerList; + } + + public void setAppPerList(List appPerList) { + this.appPerList = appPerList; + } + + public List getAppBaseInfoList() { + return appBaseInfoList; + } + + public void setAppBaseInfoList(List appBaseInfoList) { + this.appBaseInfoList = appBaseInfoList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchStrategyDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchStrategyDto.java new file mode 100644 index 0000000..aead898 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/BatchStrategyDto.java @@ -0,0 +1,132 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import java.io.Serializable; + +/** + *

Title: BatchStrategyCacheDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/08/30 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class BatchStrategyDto implements Serializable { + + /** + * 租户ID + */ + private String tenantId; + + /** + * 系统ID + */ + private String projectId; + + /** + * 计划Id + */ + private String planId; + + /** + * 应用设置;1-清除数据,2-卸载安装 + */ + private String appSet; + /** + * 录屏设置;0-不保存,1-全部保存,2-出错保存 + */ + private String screenRecordSet; + + /** + * 截图设置;0-不保存,1-全部保存,2-出错保存 + */ + private String screenshotSet; + + /** + * 优先级;0-低,1-高 + */ + private String priority; + + /** + * 失败重试次数 + */ + private Integer failRetryCount = 0; + + /** + * 失败重试策略 + */ + private String retryStrategy; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getAppSet() { + return appSet; + } + + public void setAppSet(String appSet) { + this.appSet = appSet; + } + + public String getScreenRecordSet() { + return screenRecordSet; + } + + public void setScreenRecordSet(String screenRecordSet) { + this.screenRecordSet = screenRecordSet; + } + + public String getScreenshotSet() { + return screenshotSet; + } + + public void setScreenshotSet(String screenshotSet) { + this.screenshotSet = screenshotSet; + } + + public String getPriority() { + return priority; + } + + public void setPriority(String priority) { + this.priority = priority; + } + + public Integer getFailRetryCount() { + return failRetryCount; + } + + public void setFailRetryCount(Integer failRetryCount) { + this.failRetryCount = failRetryCount; + } + + public String getRetryStrategy() { + return retryStrategy; + } + + public void setRetryStrategy(String retryStrategy) { + this.retryStrategy = retryStrategy; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/DeviceOfflineMsgDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/DeviceOfflineMsgDto.java new file mode 100644 index 0000000..df2afb8 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/DeviceOfflineMsgDto.java @@ -0,0 +1,57 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import java.io.Serializable; +import java.util.Date; + +/** + *

Title: DeviceOfflineMsgDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/24 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class DeviceOfflineMsgDto implements Serializable { + + private String deviceId; + + private String type; + + private String status; + + private Date lastHeartbeatTime; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Date getLastHeartbeatTime() { + return lastHeartbeatTime; + } + + public void setLastHeartbeatTime(Date lastHeartbeatTime) { + this.lastHeartbeatTime = lastHeartbeatTime; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/DevicePerInfo.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/DevicePerInfo.java new file mode 100644 index 0000000..69ba790 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/DevicePerInfo.java @@ -0,0 +1,44 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +public class DevicePerInfo { + + private String deviceId; + + private String caseId; + + private AppPerInfo appPerInfo; + + private String devicePerInfoAddress; + + public String getCaseId() { + return caseId; + } + + public void setCaseId(String caseId) { + this.caseId = caseId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public AppPerInfo getAppPerInfo() { + return appPerInfo; + } + + public void setAppPerInfo(AppPerInfo appPerInfo) { + this.appPerInfo = appPerInfo; + } + + public String getDevicePerInfoAddress() { + return devicePerInfoAddress; + } + + public void setDevicePerInfoAddress(String devicePerInfoAddress) { + this.devicePerInfoAddress = devicePerInfoAddress; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/MobileTaskPerformanceDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/MobileTaskPerformanceDto.java new file mode 100644 index 0000000..0b13b5a --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/MobileTaskPerformanceDto.java @@ -0,0 +1,116 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import java.io.Serializable; +import java.util.List; + +/** + *

Title: MobileTaskPerformanceDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/11/13 14:52 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class MobileTaskPerformanceDto implements Serializable { + + private String deviceId; + private String appId; + private Long appInstallTime; + private Long appActiveTime; + private List appCpuList; + private List appMemoList; + private List appFlowList; + private List deviceCpuList; + private List deviceMemoList; + private List deviceFlowList; + private List deviceTemperatureList; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public Long getAppInstallTime() { + return appInstallTime; + } + + public void setAppInstallTime(Long appInstallTime) { + this.appInstallTime = appInstallTime; + } + + public Long getAppActiveTime() { + return appActiveTime; + } + + public void setAppActiveTime(Long appActiveTime) { + this.appActiveTime = appActiveTime; + } + + public List getAppCpuList() { + return appCpuList; + } + + public void setAppCpuList(List appCpuList) { + this.appCpuList = appCpuList; + } + + public List getAppMemoList() { + return appMemoList; + } + + public void setAppMemoList(List appMemoList) { + this.appMemoList = appMemoList; + } + + public List getAppFlowList() { + return appFlowList; + } + + public void setAppFlowList(List appFlowList) { + this.appFlowList = appFlowList; + } + + public List getDeviceCpuList() { + return deviceCpuList; + } + + public void setDeviceCpuList(List deviceCpuList) { + this.deviceCpuList = deviceCpuList; + } + + public List getDeviceMemoList() { + return deviceMemoList; + } + + public void setDeviceMemoList(List deviceMemoList) { + this.deviceMemoList = deviceMemoList; + } + + public List getDeviceFlowList() { + return deviceFlowList; + } + + public void setDeviceFlowList(List deviceFlowList) { + this.deviceFlowList = deviceFlowList; + } + + public List getDeviceTemperatureList() { + return deviceTemperatureList; + } + + public void setDeviceTemperatureList(List deviceTemperatureList) { + this.deviceTemperatureList = deviceTemperatureList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/PageEvent.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/PageEvent.java new file mode 100644 index 0000000..90a81a6 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/PageEvent.java @@ -0,0 +1,72 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import com.itextpdf.text.Document; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfPageEvent; +import com.itextpdf.text.pdf.PdfWriter; + +/** + *

Title: PageEvent

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/10/5 18:16 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class PageEvent implements PdfPageEvent { + @Override + public void onOpenDocument(PdfWriter pdfWriter, Document document) { + } + + @Override + public void onStartPage(PdfWriter pdfWriter, Document document) { + + } + + @Override + public void onEndPage(PdfWriter pdfWriter, Document document) { + + } + + @Override + public void onCloseDocument(PdfWriter pdfWriter, Document document) { + + } + + @Override + public void onParagraph(PdfWriter pdfWriter, Document document, float v) { + + } + + @Override + public void onParagraphEnd(PdfWriter pdfWriter, Document document, float v) { + + } + + @Override + public void onChapter(PdfWriter pdfWriter, Document document, float v, Paragraph paragraph) { + + } + + @Override + public void onChapterEnd(PdfWriter pdfWriter, Document document, float v) { + + } + + @Override + public void onSection(PdfWriter pdfWriter, Document document, float v, int i, Paragraph paragraph) { + + } + + @Override + public void onSectionEnd(PdfWriter pdfWriter, Document document, float v) { + + } + + @Override + public void onGenericTag(PdfWriter pdfWriter, Document document, Rectangle rectangle, String s) { + + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/SceneCaseStopDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/SceneCaseStopDto.java new file mode 100644 index 0000000..8e98a91 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planBatch/SceneCaseStopDto.java @@ -0,0 +1,39 @@ +package net.northking.cctp.executePlan.dto.planBatch; + +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +/** + *

Title: SceneCaseStopDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/21 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class SceneCaseStopDto implements Serializable { + + @ApiModelProperty("计划执行任务号") + public String taskId; + @ApiModelProperty("用例Id") + public String caseId; + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getCaseId() { + return caseId; + } + + public void setCaseId(String caseId) { + this.caseId = caseId; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/AtuEntrustInfoDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/AtuEntrustInfoDto.java new file mode 100644 index 0000000..727f2a8 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/AtuEntrustInfoDto.java @@ -0,0 +1,95 @@ +package net.northking.cctp.executePlan.dto.planEntrust; + +import java.io.Serializable; +import java.util.List; + +/** + *

Title: AtuEntrustInfoDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/09 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuEntrustInfoDto implements Serializable { + + /** + * 计划ID + */ + private String planId; + + /** + * 批次ID + */ + private String batchId; + + /** + * 类型,1-PC,2-移动,3-接口 + */ + private String type; + + /** + * 队列名称 + */ + private String queueName; + + /** + * 优先级 + */ + private String priority; + + /** + * 设备列表 + */ + private List deviceList; + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getQueueName() { + return queueName; + } + + public void setQueueName(String queueName) { + this.queueName = queueName; + } + + public String getPriority() { + return priority; + } + + public void setPriority(String priority) { + this.priority = priority; + } + + public List getDeviceList() { + return deviceList; + } + + public void setDeviceList(List deviceList) { + this.deviceList = deviceList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/AtuEntrustMsgDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/AtuEntrustMsgDto.java new file mode 100644 index 0000000..659736e --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/AtuEntrustMsgDto.java @@ -0,0 +1,55 @@ +package net.northking.cctp.executePlan.dto.planEntrust; + +import java.io.Serializable; + +/** + *

Title: AtuEntrustMsgDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/10 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuEntrustMsgDto extends AtuEntrustInfoDto implements Serializable { + + /** + * 引擎IP + */ + private String ip; + + /** + * 引擎端口 + */ + private Integer port; + + /** + * 委托次数 + */ + private Integer entrustNum = 0; + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + + public Integer getEntrustNum() { + return entrustNum; + } + + public void setEntrustNum(Integer entrustNum) { + this.entrustNum = entrustNum; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/DeviceListDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/DeviceListDto.java new file mode 100644 index 0000000..39d09fb --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/DeviceListDto.java @@ -0,0 +1,41 @@ +package net.northking.cctp.executePlan.dto.planEntrust; + +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.util.List; + +/** + *

Title: DeviceListDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/20 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class DeviceListDto implements Serializable { + + @ApiModelProperty("设备类型") + private String type; + + @ApiModelProperty("设备id集合") + private List deviceList; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getDeviceList() { + return deviceList; + } + + public void setDeviceList(List deviceList) { + this.deviceList = deviceList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/EngineInfoListDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/EngineInfoListDto.java new file mode 100644 index 0000000..173aec9 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/EngineInfoListDto.java @@ -0,0 +1,42 @@ +package net.northking.cctp.executePlan.dto.planEntrust; + +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + *

Title: EngineInfoListDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/20 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class EngineInfoListDto implements Serializable { + + @ApiModelProperty("设备类型") + private String type; + + @ApiModelProperty("引擎信息") + private List> engineInfoList; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List> getEngineInfoList() { + return engineInfoList; + } + + public void setEngineInfoList(List> engineInfoList) { + this.engineInfoList = engineInfoList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/EntrustDeviceDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/EntrustDeviceDto.java new file mode 100644 index 0000000..c9aacca --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planEntrust/EntrustDeviceDto.java @@ -0,0 +1,36 @@ +package net.northking.cctp.executePlan.dto.planEntrust; + +import java.io.Serializable; + +/** + *

Title: EntrustDeviceDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/22 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class EntrustDeviceDto implements Serializable { + + private String deviceId; + + private String browserType; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getBrowserType() { + return browserType; + } + + public void setBrowserType(String browserType) { + this.browserType = browserType; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AppList.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AppList.java new file mode 100644 index 0000000..167fc55 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AppList.java @@ -0,0 +1,39 @@ +package net.northking.cctp.executePlan.dto.planInfo; + +import io.swagger.annotations.ApiModelProperty; + +public class AppList { + + @ApiModelProperty("应用主键") + private String appId; + + @ApiModelProperty("应用包名") + private String appPackage; + + @ApiModelProperty("平台类型;0-android,1-ios") + private String platformType; + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppPackage() { + return appPackage; + } + + public void setAppPackage(String appPackage) { + this.appPackage = appPackage; + } + + public String getPlatformType() { + return platformType; + } + + public void setPlatformType(String platformType) { + this.platformType = platformType; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanExportDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanExportDto.java new file mode 100644 index 0000000..6dd594a --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanExportDto.java @@ -0,0 +1,28 @@ +package net.northking.cctp.executePlan.dto.planInfo; + +import io.swagger.annotations.ApiModelProperty; + +public class AtuPlanExportDto { + + @ApiModelProperty("调度id") + private String batchId; + + @ApiModelProperty("执行结果分布图") + private String execResultChartBase64Str; + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getExecResultChartBase64Str() { + return execResultChartBase64Str; + } + + public void setExecResultChartBase64Str(String execResultChartBase64Str) { + this.execResultChartBase64Str = execResultChartBase64Str; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoAddDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoAddDto.java new file mode 100644 index 0000000..3f67ad4 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoAddDto.java @@ -0,0 +1,354 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planInfo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.*; +import java.io.Serializable; +import java.util.List; + +/** +* Restful接口--新增资源--数据传输对象:执行计划表 +* +* createdate: 2022-12-06 11:32:04
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "执行计划表") +public class AtuPlanInfoAddDto implements Serializable +{ + @ApiModelProperty("计划id") + private String id; + /** + * 系统主键
+ */ + @ApiModelProperty("系统主键") + @Size(max = 32, message="系统主键-projectId: 数据长度不能 > 32" ) + private String projectId; + /** + * 计划名称
+ */ + @ApiModelProperty("计划名称") + @Size(max = 90, message="计划名称-planName: 数据长度不能 > 90" ) + private String planName; + /** + * 计划描述
+ */ + @ApiModelProperty("计划描述") + @Size(max = 900, message="计划描述-planDesc: 数据长度不能 > 900" ) + private String planDesc; + /** + * 是否启用;0-否,1-是
+ */ + @ApiModelProperty("是否启用;0-否,1-是") + private Boolean enabled; + /** + * 应用设置;1-清除数据,2-卸载安装
+ */ + @ApiModelProperty("应用设置;1-清除数据,2-卸载安装") + @Size(max = 1, message="应用设置;1-清除数据,2-卸载安装-appSet: 数据长度不能 > 1" ) + private String appSet; + /** + * 录屏设置;0-不保存,1-全部保存,2-出错保存
+ */ + @ApiModelProperty("录屏设置;0-不保存,1-全部保存,2-出错保存") + @Size(max = 1, message="录屏设置;0-不保存,1-全部保存,2-出错保存-screenRecordSet: 数据长度不能 > 1" ) + private String screenRecordSet; + /** + * 截图设置;0-不保存,1-全部保存,2-出错保存
+ */ + @ApiModelProperty("截图设置;0-不保存,1-全部保存,2-出错保存") + @Size(max = 1, message="截图设置;0-不保存,1-全部保存,2-出错保存-screenshotSet: 数据长度不能 > 1" ) + private String screenshotSet; + /** + * 优先级;0-低,1-高
+ */ + @ApiModelProperty("优先级;0-低,1-高") + @Size(max = 1, message="优先级;0-低,1-高-priority: 数据长度不能 > 1" ) + private String priority; + /** + * Cron表达式
+ */ + @ApiModelProperty("Cron表达式") + @Size(max = 90, message="Cron表达式-cronExpr: 数据长度不能 > 90" ) + private String cronExpr; + /** + * 前置计划ID
+ */ + @ApiModelProperty("前置计划ID") + @Size(max = 32, message="前置计划ID-upFrontPlanId: 数据长度不能 > 32" ) + private String upFrontPlanId; + + @ApiModelProperty("是否勾选定时触发") + private Boolean hasCorn; + + @ApiModelProperty("是否存在前置计划") + private Boolean hasUpFront; + + /** + * 是否发送邮件;0-否,1-是
+ */ + @ApiModelProperty("是否发送邮件;0-否,1-是") + private Boolean sendMail; + /** + * 邮件地址;当需要发送邮件时不能为空
+ */ + @ApiModelProperty("邮件地址;当需要发送邮件时不能为空") + @Size(max = 500, message="邮件地址;当需要发送邮件时不能为空-mailAddress: 数据长度不能 > 500" ) + private String mailAddress; + /** + * 是否失败重试;0-否,1-是
+ */ + @ApiModelProperty("是否失败重试;0-否,1-是") + private Boolean failRetry; + /** + * 失败重试次数
+ */ + @ApiModelProperty("失败重试次数") + private Integer failRetryCount; + /** + * 失败重试策略
+ */ + @ApiModelProperty("重试策略") + private String retryStrategy; + /** + * 是否失败生成计划;0-否,1-是
+ */ + @ApiModelProperty("是否失败生成计划;0-否,1-是") + private Boolean failCreatePlan; + + @ApiModelProperty("软件集合") + private List appList; + + @ApiModelProperty("设备集合") + private List deviceList; + + @ApiModelProperty("环境集合") + private List envList; + + @ApiModelProperty("选中的用例集") + private List selectSets; + + @ApiModelProperty("是否存在接口脚本") + private boolean hasAPI; + + @ApiModelProperty("是否存在PC/接口脚本") + private boolean hasPC; + + @ApiModelProperty("是否存在移动脚本") + private boolean hasMob; + + public boolean isHasAPI() { + return hasAPI; + } + + public void setHasAPI(boolean hasAPI) { + this.hasAPI = hasAPI; + } + + public boolean isHasPC() { + return hasPC; + } + + public void setHasPC(boolean hasPC) { + this.hasPC = hasPC; + } + + public boolean isHasMob() { + return hasMob; + } + + public void setHasMob(boolean hasMob) { + this.hasMob = hasMob; + } + + public List getSelectSets() { + return selectSets; + } + + public void setSelectSets(List selectSets) { + this.selectSets = selectSets; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getEnvList() { + return envList; + } + + public void setEnvList(List envList) { + this.envList = envList; + } + + public Boolean getHasCorn() { + return hasCorn; + } + + public void setHasCorn(Boolean hasCorn) { + this.hasCorn = hasCorn; + } + + public Boolean getHasUpFront() { + return hasUpFront; + } + + public void setHasUpFront(Boolean hasUpFront) { + this.hasUpFront = hasUpFront; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanDesc() { + return planDesc; + } + + public void setPlanDesc(String planDesc) { + this.planDesc = planDesc; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public String getAppSet() { + return appSet; + } + + public void setAppSet(String appSet) { + this.appSet = appSet; + } + + public String getScreenRecordSet() { + return screenRecordSet; + } + + public void setScreenRecordSet(String screenRecordSet) { + this.screenRecordSet = screenRecordSet; + } + + public String getScreenshotSet() { + return screenshotSet; + } + + public void setScreenshotSet(String screenshotSet) { + this.screenshotSet = screenshotSet; + } + + public String getPriority() { + return priority; + } + + public void setPriority(String priority) { + this.priority = priority; + } + + public String getCronExpr() { + return cronExpr; + } + + public void setCronExpr(String cronExpr) { + this.cronExpr = cronExpr; + } + + public String getUpFrontPlanId() { + return upFrontPlanId; + } + + public void setUpFrontPlanId(String upFrontPlanId) { + this.upFrontPlanId = upFrontPlanId; + } + + public Boolean getSendMail() { + return sendMail; + } + + public void setSendMail(Boolean sendMail) { + this.sendMail = sendMail; + } + + public String getMailAddress() { + return mailAddress; + } + + public void setMailAddress(String mailAddress) { + this.mailAddress = mailAddress; + } + + public Boolean getFailRetry() { + return failRetry; + } + + public void setFailRetry(Boolean failRetry) { + this.failRetry = failRetry; + } + + public Integer getFailRetryCount() { + return failRetryCount; + } + + public void setFailRetryCount(Integer failRetryCount) { + this.failRetryCount = failRetryCount; + } + + public Boolean getFailCreatePlan() { + return failCreatePlan; + } + + public void setFailCreatePlan(Boolean failCreatePlan) { + this.failCreatePlan = failCreatePlan; + } + + public List getAppList() { + return appList; + } + + public void setAppList(List appList) { + this.appList = appList; + } + + public List getDeviceList() { + return deviceList; + } + + public void setDeviceList(List deviceList) { + this.deviceList = deviceList; + } + + public String getRetryStrategy() { + return retryStrategy; + } + + public void setRetryStrategy(String retryStrategy) { + this.retryStrategy = retryStrategy; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoAppAndDeviceDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoAppAndDeviceDto.java new file mode 100644 index 0000000..eb6de01 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoAppAndDeviceDto.java @@ -0,0 +1,43 @@ +package net.northking.cctp.executePlan.dto.planInfo; + +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.executePlan.db.entity.AtuPlanAppLink; +import net.northking.cctp.executePlan.db.entity.AtuPlanDeviceLink; + +import java.util.List; + +public class AtuPlanInfoAppAndDeviceDto { + + @ApiModelProperty("勾选应用集合") + private List appList; + + @ApiModelProperty("选择PC设备集合") + private List pcDeviceList; + + @ApiModelProperty("选择移动设备集合") + private List mobDeviceList; + + public List getAppList() { + return appList; + } + + public void setAppList(List appList) { + this.appList = appList; + } + + public List getPcDeviceList() { + return pcDeviceList; + } + + public void setPcDeviceList(List pcDeviceList) { + this.pcDeviceList = pcDeviceList; + } + + public List getMobDeviceList() { + return mobDeviceList; + } + + public void setMobDeviceList(List mobDeviceList) { + this.mobDeviceList = mobDeviceList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoDetailDto.java new file mode 100644 index 0000000..837dad9 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoDetailDto.java @@ -0,0 +1,652 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planInfo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.executePlan.api.third.feilang.dto.FeiLangUserDto; +import net.northking.cctp.executePlan.dto.planScript.AtuPlanScriptResultDto; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** +* Restful接口--资源详情--数据传输对象:执行计划表 +* +* createdate: 2022-12-06 11:32:04
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "执行计划表") +public class AtuPlanInfoDetailDto implements Serializable +{ + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 租户主键
+ */ + @ApiModelProperty("租户主键") + @Size(max = 32, message="租户主键-tenantId: 数据长度不能 > 32" ) + private String tenantId; + /** + * 系统主键
+ */ + @ApiModelProperty("系统主键") + @Size(max = 32, message="系统主键-projectId: 数据长度不能 > 32" ) + private String projectId; + + @ApiModelProperty("系统名称") + private String projectName; + /** + * 计划名称
+ */ + @ApiModelProperty("计划名称") + @Size(max = 90, message="计划名称-planName: 数据长度不能 > 90" ) + private String planName; + /** + * 计划描述
+ */ + @ApiModelProperty("计划描述") + @Size(max = 900, message="计划描述-planDesc: 数据长度不能 > 900" ) + private String planDesc; + /** + * 是否启用;0-否,1-是
+ */ + @ApiModelProperty("是否启用;0-否,1-是") + private Boolean enabled; + /** + * 状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消
+ */ + @ApiModelProperty("状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消") + @Size(max = 1, message="状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消-status: 数据长度不能 > 1" ) + private String status; + /** + * 应用设置;1-清除数据,2-卸载安装
+ */ + @ApiModelProperty("应用设置;1-清除数据,2-卸载安装") + @Size(max = 1, message="应用设置;1-清除数据,2-卸载安装-appSet: 数据长度不能 > 1" ) + private String appSet; + /** + * 录屏设置;0-不保存,1-全部保存,2-出错保存
+ */ + @ApiModelProperty("录屏设置;0-不保存,1-全部保存,2-出错保存") + @Size(max = 1, message="录屏设置;0-不保存,1-全部保存,2-出错保存-screenRecordSet: 数据长度不能 > 1" ) + private String screenRecordSet; + /** + * 截图设置;0-不保存,1-全部保存,2-出错保存
+ */ + @ApiModelProperty("截图设置;0-不保存,1-全部保存,2-出错保存") + @Size(max = 1, message="截图设置;0-不保存,1-全部保存,2-出错保存-screenshotSet: 数据长度不能 > 1" ) + private String screenshotSet; + /** + * 优先级;0-低,1-高
+ */ + @ApiModelProperty("优先级;0-低,1-高") + @Size(max = 1, message="优先级;0-低,1-高-priority: 数据长度不能 > 1" ) + private String priority; + /** + * Cron表达式
+ */ + @ApiModelProperty("Cron表达式") + @Size(max = 90, message="Cron表达式-cronExpr: 数据长度不能 > 90" ) + private String cronExpr; + /** + * 前置计划ID
+ */ + @ApiModelProperty("前置计划ID") + @Size(max = 32, message="前置计划ID-upFrontPlanId: 数据长度不能 > 32" ) + private String upFrontPlanId; + /** + * 触发链接
+ */ + @ApiModelProperty("触发链接") + @Size(max = 255, message="触发链接-webhookUrl: 数据长度不能 > 255" ) + private String webhookUrl; + /** + * 密保令牌
+ */ + @ApiModelProperty("密保令牌") + @Size(max = 32, message="密保令牌-webhookToken: 数据长度不能 > 32" ) + private String webhookToken; + /** + * 是否发送邮件;0-否,1-是
+ */ + @ApiModelProperty("是否发送邮件;0-否,1-是") + private Boolean sendMail; + /** + * 邮件地址;当需要发送邮件时不能为空
+ */ + @ApiModelProperty("飞狼用户login_no信息") + @Size(max = 255, message="邮件地址;当需要发送邮件时不能为空-mailAddress: 数据长度不能 > 255" ) + private String mailAddress; + + /** + * 飞狼用户信息
+ */ + @ApiModelProperty("飞狼用户login_no信息") + private List feiLangUserDtoList; + + /** + * 是否失败重试;0-否,1-是
+ */ + @ApiModelProperty("是否失败重试;0-否,1-是") + private Boolean failRetry; + /** + * 失败重试次数
+ */ + @ApiModelProperty("失败重试次数") + private Integer failRetryCount; + /** + * 失败重试策略
+ */ + @ApiModelProperty("重试策略") + private String retryStrategy; + /** + * 是否失败生成计划;0-否,1-是
+ */ + @ApiModelProperty("是否失败生成计划;0-否,1-是") + private Boolean failCreatePlan; + /** + * 最近执行时间
+ */ + @ApiModelProperty("最近执行时间") + private Date lastExecTime; + /** + * 下次执行时间
+ */ + @ApiModelProperty("下次执行时间") + private Date nextExecTime; + /** + * 最后批次号
+ */ + @ApiModelProperty("最后批次号") + @Size(max = 32, message="最后批次号-lastBatchId: 数据长度不能 > 32" ) + private String lastBatchId; + /** + * 最后批次等待中任务数
+ */ + @ApiModelProperty("最后批次等待中任务数") + private Integer waitingNum; + /** + * 最后批次执行中任务数
+ */ + @ApiModelProperty("最后批次执行中任务数") + private Integer runningNum; + /** + * 最后批次成功任务数
+ */ + @ApiModelProperty("最后批次成功任务数") + private Integer successNum; + /** + * 最后批次执行失败任务数
+ */ + @ApiModelProperty("最后批次执行失败任务数") + private Integer execFailNum; + /** + * 最后批次断言失败任务数
+ */ + @ApiModelProperty("最后批次断言失败任务数") + private Integer assertFailNum; + /** + * 最后批次超时任务数
+ */ + @ApiModelProperty("最后批次超时任务数") + private Integer timeoutNum; + /** + * 最后批次取消任务数
+ */ + @ApiModelProperty("最后批次取消任务数") + private Integer cancelNum; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + @Size(max = 32, message="创建人-createdBy: 数据长度不能 > 32" ) + private String createdBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 更新人
+ */ + @ApiModelProperty("更新人") + @Size(max = 32, message="更新人-updatedBy: 数据长度不能 > 32" ) + private String updatedBy; + /** + * 更新时间
+ */ + @ApiModelProperty("更新时间") + private Date updatedTime; + /** + * 是否删除;0-否,1-是
+ */ + @ApiModelProperty("是否删除;0-否,1-是") + private Boolean deleted; + + @ApiModelProperty("是否展示软件/设备页面") + private AtuPlanScriptResultDto planScriptResultDto; + + @ApiModelProperty("是否勾选定时触发") + private Boolean hasCorn; + + @ApiModelProperty("是否存在前置计划") + private Boolean hasUpFront; + + @ApiModelProperty("是否webhook触发") + private Boolean hasWebhook; + + @ApiModelProperty("最后执行参数") + private String lastBatchMessage; + + @ApiModelProperty("环境id集合") + private List envIdList; + + @ApiModelProperty("用例变更标识;0-无,1-是") + private Boolean caseChangeFlag; + + @ApiModelProperty("负责人") + private String principalId; + + @ApiModelProperty("最后批次脚本统计数据") + private Map lastBatchScriptSumMap; + + @ApiModelProperty("绑定应用id集合") + private List appIdList; + + public List getAppIdList() { + return appIdList; + } + + public void setAppIdList(List appIdList) { + this.appIdList = appIdList; + } + + public Boolean getCaseChangeFlag() { + return caseChangeFlag; + } + + public void setCaseChangeFlag(Boolean caseChangeFlag) { + this.caseChangeFlag = caseChangeFlag; + } + + public List getEnvIdList() { + return envIdList; + } + + public void setEnvIdList(List envIdList) { + this.envIdList = envIdList; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getLastBatchMessage() { + return lastBatchMessage; + } + + public void setLastBatchMessage(String lastBatchMessage) { + this.lastBatchMessage = lastBatchMessage; + } + + public AtuPlanScriptResultDto getPlanScriptResultDto() { + return planScriptResultDto; + } + + public void setPlanScriptResultDto(AtuPlanScriptResultDto planScriptResultDto) { + this.planScriptResultDto = planScriptResultDto; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanDesc() { + return planDesc; + } + + public void setPlanDesc(String planDesc) { + this.planDesc = planDesc; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getAppSet() { + return appSet; + } + + public void setAppSet(String appSet) { + this.appSet = appSet; + } + + public String getScreenRecordSet() { + return screenRecordSet; + } + + public void setScreenRecordSet(String screenRecordSet) { + this.screenRecordSet = screenRecordSet; + } + + public String getScreenshotSet() { + return screenshotSet; + } + + public void setScreenshotSet(String screenshotSet) { + this.screenshotSet = screenshotSet; + } + + public String getPriority() { + return priority; + } + + public void setPriority(String priority) { + this.priority = priority; + } + + public String getCronExpr() { + return cronExpr; + } + + public void setCronExpr(String cronExpr) { + this.cronExpr = cronExpr; + } + + public String getUpFrontPlanId() { + return upFrontPlanId; + } + + public void setUpFrontPlanId(String upFrontPlanId) { + this.upFrontPlanId = upFrontPlanId; + } + + public String getWebhookUrl() { + return webhookUrl; + } + + public void setWebhookUrl(String webhookUrl) { + this.webhookUrl = webhookUrl; + } + + public String getWebhookToken() { + return webhookToken; + } + + public void setWebhookToken(String webhookToken) { + this.webhookToken = webhookToken; + } + + public Boolean getSendMail() { + return sendMail; + } + + public void setSendMail(Boolean sendMail) { + this.sendMail = sendMail; + } + + public String getMailAddress() { + return mailAddress; + } + + public void setMailAddress(String mailAddress) { + this.mailAddress = mailAddress; + } + + public Boolean getFailRetry() { + return failRetry; + } + + public void setFailRetry(Boolean failRetry) { + this.failRetry = failRetry; + } + + public Integer getFailRetryCount() { + return failRetryCount; + } + + public void setFailRetryCount(Integer failRetryCount) { + this.failRetryCount = failRetryCount; + } + + public Boolean getFailCreatePlan() { + return failCreatePlan; + } + + public void setFailCreatePlan(Boolean failCreatePlan) { + this.failCreatePlan = failCreatePlan; + } + + public Date getLastExecTime() { + return lastExecTime; + } + + public void setLastExecTime(Date lastExecTime) { + this.lastExecTime = lastExecTime; + } + + public Date getNextExecTime() { + return nextExecTime; + } + + public void setNextExecTime(Date nextExecTime) { + this.nextExecTime = nextExecTime; + } + + public String getLastBatchId() { + return lastBatchId; + } + + public void setLastBatchId(String lastBatchId) { + this.lastBatchId = lastBatchId; + } + + public Integer getWaitingNum() { + return waitingNum; + } + + public void setWaitingNum(Integer waitingNum) { + this.waitingNum = waitingNum; + } + + public Integer getRunningNum() { + return runningNum; + } + + public void setRunningNum(Integer runningNum) { + this.runningNum = runningNum; + } + + public Integer getSuccessNum() { + return successNum; + } + + public void setSuccessNum(Integer successNum) { + this.successNum = successNum; + } + + public Integer getExecFailNum() { + return execFailNum; + } + + public void setExecFailNum(Integer execFailNum) { + this.execFailNum = execFailNum; + } + + public Integer getAssertFailNum() { + return assertFailNum; + } + + public void setAssertFailNum(Integer assertFailNum) { + this.assertFailNum = assertFailNum; + } + + public Integer getTimeoutNum() { + return timeoutNum; + } + + public void setTimeoutNum(Integer timeoutNum) { + this.timeoutNum = timeoutNum; + } + + public Integer getCancelNum() { + return cancelNum; + } + + public void setCancelNum(Integer cancelNum) { + this.cancelNum = cancelNum; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + public Boolean getDeleted() { + return deleted; + } + + public void setDeleted(Boolean deleted) { + this.deleted = deleted; + } + + public Boolean getHasCorn() { + return hasCorn; + } + + public void setHasCorn(Boolean hasCorn) { + this.hasCorn = hasCorn; + } + + public Boolean getHasUpFront() { + return hasUpFront; + } + + public void setHasUpFront(Boolean hasUpFront) { + this.hasUpFront = hasUpFront; + } + + public Boolean getHasWebhook() { + return hasWebhook; + } + + public void setHasWebhook(Boolean hasWebhook) { + this.hasWebhook = hasWebhook; + } + + public List getFeiLangUserDtoList() { + return feiLangUserDtoList; + } + + public void setFeiLangUserDtoList(List feiLangUserDtoList) { + this.feiLangUserDtoList = feiLangUserDtoList; + } + + public String getPrincipalId() { + return principalId; + } + + public void setPrincipalId(String principalId) { + this.principalId = principalId; + } + + public Map getLastBatchScriptSumMap() { + return lastBatchScriptSumMap; + } + + public void setLastBatchScriptSumMap(Map lastBatchScriptSumMap) { + this.lastBatchScriptSumMap = lastBatchScriptSumMap; + } + + public String getRetryStrategy() { + return retryStrategy; + } + + public void setRetryStrategy(String retryStrategy) { + this.retryStrategy = retryStrategy; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoPageDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoPageDto.java new file mode 100644 index 0000000..05307d6 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoPageDto.java @@ -0,0 +1,42 @@ +package net.northking.cctp.executePlan.dto.planInfo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Size; +import java.io.Serializable; + + +/** + *

Title: AtuPlanInfoPageDto

+ *

Description: 分页查询对象

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/06 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@JsonSerialize +@ApiModel(description = "执行计划表") +@Data +public class AtuPlanInfoPageDto implements Serializable { + + @ApiModelProperty("计划id") + private String planId; + + @ApiModelProperty("系统id") + private String projectId; + + @ApiModelProperty("状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消") + @Size(max = 1, message="状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消-status: 数据长度不能 > 1" ) + private String status; + + @ApiModelProperty("计划名称") + @Size(max = 90, message="计划名称-planName: 数据长度不能 > 90" ) + private String planName; + + @ApiModelProperty("租户Id") + private String tenantId; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoQueryDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoQueryDto.java new file mode 100644 index 0000000..658c3b3 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoQueryDto.java @@ -0,0 +1,245 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planInfo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.*; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** +* 查询接口--数据传输对象:执行计划表 +* +* createdate: 2022-12-06 11:32:04
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "执行计划表") +public class AtuPlanInfoQueryDto implements Serializable +{ + /** + * 状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消
+ */ + @ApiModelProperty("状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消") + @Size(max = 1, message="状态;0-新建,1-等待中,2-执行中,3-已完成,4-已取消-status: 数据长度不能 > 1" ) + private String status; + + @ApiModelProperty("租户id") + private String tenantId; + + /** + * 计划名称
+ */ + @ApiModelProperty("计划名称") + @Size(max = 90, message="计划名称-planName: 数据长度不能 > 90" ) + private String planName; + + @ApiModelProperty("系统id集合") + private List projectList; + + @ApiModelProperty("是否展示新建计划") + private boolean tableFlag = false; + + + @ApiModelProperty("负责人") + @Size(max = 32, message="负责人-principal: 数据长度不能 > 32" ) + private String principal; + + private List principalIds; + + @ApiModelProperty("创建时间开始") + private String createdTimeStart; + @ApiModelProperty("创建时间结束") + private String createdTimeEnd; + @ApiModelProperty("修改时间开始") + private String updatedTimeStart; + @ApiModelProperty("修改时间结束") + private String updatedTimeEnd; + + private Date startCreatedTime; + + private Date endCreatedTime; + + private Date startUpdatedTime; + + private Date endUpdatedTime; + + @ApiModelProperty("创建人") + private String creator; + + private List createBys; + + public String getCreatorId() { + return creatorId; + } + + public void setCreatorId(String creatorId) { + this.creatorId = creatorId; + } + + public String getPrincipalId() { + return principalId; + } + + public void setPrincipalId(String principalId) { + this.principalId = principalId; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + private String creatorId; + + private String principalId; + + private String updateBy; + + public String getPrincipal() { + return principal; + } + + public void setPrincipal(String principal) { + this.principal = principal; + } + + public List getPrincipalIds() { + return principalIds; + } + + public void setPrincipalIds(List principalIds) { + this.principalIds = principalIds; + } + + public String getCreatedTimeStart() { + return createdTimeStart; + } + + public void setCreatedTimeStart(String createdTimeStart) { + this.createdTimeStart = createdTimeStart; + } + + public String getCreatedTimeEnd() { + return createdTimeEnd; + } + + public void setCreatedTimeEnd(String createdTimeEnd) { + this.createdTimeEnd = createdTimeEnd; + } + + public String getUpdatedTimeStart() { + return updatedTimeStart; + } + + public void setUpdatedTimeStart(String updatedTimeStart) { + this.updatedTimeStart = updatedTimeStart; + } + + public String getUpdatedTimeEnd() { + return updatedTimeEnd; + } + + public void setUpdatedTimeEnd(String updatedTimeEnd) { + this.updatedTimeEnd = updatedTimeEnd; + } + + public Date getStartCreatedTime() { + return startCreatedTime; + } + + public void setStartCreatedTime(Date startCreatedTime) { + this.startCreatedTime = startCreatedTime; + } + + public Date getEndCreatedTime() { + return endCreatedTime; + } + + public void setEndCreatedTime(Date endCreatedTime) { + this.endCreatedTime = endCreatedTime; + } + + public Date getStartUpdatedTime() { + return startUpdatedTime; + } + + public void setStartUpdatedTime(Date startUpdatedTime) { + this.startUpdatedTime = startUpdatedTime; + } + + public Date getEndUpdatedTime() { + return endUpdatedTime; + } + + public void setEndUpdatedTime(Date endUpdatedTime) { + this.endUpdatedTime = endUpdatedTime; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public List getCreateBys() { + return createBys; + } + + public void setCreateBys(List createBys) { + this.createBys = createBys; + } + + public boolean isTableFlag() { + return tableFlag; + } + + public void setTableFlag(boolean tableFlag) { + this.tableFlag = tableFlag; + } + + public List getProjectList() { + return projectList; + } + + public void setProjectList(List projectList) { + this.projectList = projectList; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoUpdateDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoUpdateDto.java new file mode 100644 index 0000000..7ca45e3 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanInfoUpdateDto.java @@ -0,0 +1,373 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planInfo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.*; +import java.io.Serializable; +import java.util.List; + +/** +* Restful接口--更新资源--数据传输对象:执行计划表 +* +* createdate: 2022-12-06 11:32:04
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "执行计划表") +public class AtuPlanInfoUpdateDto implements Serializable +{ + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 计划名称
+ */ + @ApiModelProperty("计划名称") + @Size(max = 30, message="计划名称长度不能超过30" ) + private String planName; + /** + * 计划描述
+ */ + @ApiModelProperty("计划描述") + @Size(max = 900, message="计划描述长度不能超过900" ) + private String planDesc; + /** + * 是否启用;0-否,1-是
+ */ + @ApiModelProperty("是否启用;0-否,1-是") + private Boolean enabled; + /** + * 应用设置;1-清除数据,2-卸载安装
+ */ + @ApiModelProperty("应用设置;1-清除数据,2-卸载安装") + @Size(max = 1, message="应用设置;1-清除数据,2-卸载安装-appSet: 数据长度不能 > 1" ) + private String appSet; + /** + * 录屏设置;0-不保存,1-全部保存,2-出错保存
+ */ + @ApiModelProperty("录屏设置;0-不保存,1-全部保存,2-出错保存") + @Size(max = 1, message="录屏设置;0-不保存,1-全部保存,2-出错保存-screenRecordSet: 数据长度不能 > 1" ) + private String screenRecordSet; + /** + * 截图设置;0-不保存,1-全部保存,2-出错保存
+ */ + @ApiModelProperty("截图设置;0-不保存,1-全部保存,2-出错保存") + @Size(max = 1, message="截图设置;0-不保存,1-全部保存,2-出错保存-screenshotSet: 数据长度不能 > 1" ) + private String screenshotSet; + /** + * 优先级;0-低,1-高
+ */ + @ApiModelProperty("优先级;0-低,1-高") + @Size(max = 1, message="优先级;0-低,1-高-priority: 数据长度不能 > 1" ) + private String priority; + /** + * Cron表达式
+ */ + @ApiModelProperty("Cron表达式") + @Size(max = 90, message="Cron表达式-cronExpr: 数据长度不能 > 90" ) + private String cronExpr; + /** + * 前置计划ID
+ */ + @ApiModelProperty("前置计划ID") + @Size(max = 32, message="前置计划ID-upFrontPlanId: 数据长度不能 > 32" ) + private String upFrontPlanId; + /** + * 触发链接
+ */ + @ApiModelProperty("触发链接") + @Size(max = 255, message="触发链接-webhookUrl: 数据长度不能 > 255" ) + private String webhookUrl; + /** + * 密保令牌
+ */ + @ApiModelProperty("密保令牌") + @Size(max = 32, message="密保令牌-webhookToken: 数据长度不能 > 32" ) + private String webhookToken; + /** + * 是否发送邮件;0-否,1-是
+ */ + @ApiModelProperty("是否发送邮件;0-否,1-是") + private Boolean sendMail; + /** + * 邮件地址;当需要发送邮件时不能为空
+ */ + @ApiModelProperty("邮件地址;当需要发送邮件时不能为空") + @Size(max = 500, message="邮件地址;当需要发送邮件时不能为空-mailAddress: 数据长度不能 > 500" ) + private String mailAddress; + /** + * 是否失败重试;0-否,1-是
+ */ + @ApiModelProperty("是否失败重试;0-否,1-是") + private Boolean failRetry; + /** + * 失败重试次数
+ */ + @ApiModelProperty("失败重试次数") + private Integer failRetryCount; + /** + * 失败重试策略
+ */ + @ApiModelProperty("重试策略") + private String retryStrategy; + /** + * 是否失败生成计划;0-否,1-是
+ */ + @ApiModelProperty("是否失败生成计划;0-否,1-是") + private Boolean failCreatePlan; + + @ApiModelProperty("软件集合") + private List appList; + + @ApiModelProperty("设备集合") + private List deviceList; + + @ApiModelProperty("是否勾选定时触发") + private Boolean hasCorn; + + @ApiModelProperty("是否存在前置计划") + private Boolean hasUpFront; + + @ApiModelProperty("是否webhook触发") + private Boolean hasWebhook; + + @ApiModelProperty("系统id") + private String projectId; + @ApiModelProperty("选中的用例集") + private List selectSets; + @ApiModelProperty("选中的环境") + private List envList; + + public List getEnvList() { + return envList; + } + + public void setEnvList(List envList) { + this.envList = envList; + } + + public List getSelectSets() { + return selectSets; + } + + public void setSelectSets(List selectSets) { + this.selectSets = selectSets; + } + + /** + * 用例集类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios,5-场景
+ */ + @ApiModelProperty("用例集类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios,5-场景") + private Integer setType; + + public Integer getSetType() { + return setType; + } + + public void setSetType(Integer setType) { + this.setType = setType; + } + + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public Boolean getHasCorn() { + return hasCorn; + } + + public void setHasCorn(Boolean hasCorn) { + this.hasCorn = hasCorn; + } + + public Boolean getHasUpFront() { + return hasUpFront; + } + + public void setHasUpFront(Boolean hasUpFront) { + this.hasUpFront = hasUpFront; + } + + public Boolean getHasWebhook() { + return hasWebhook; + } + + public void setHasWebhook(Boolean hasWebhook) { + this.hasWebhook = hasWebhook; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanDesc() { + return planDesc; + } + + public void setPlanDesc(String planDesc) { + this.planDesc = planDesc; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public String getAppSet() { + return appSet; + } + + public void setAppSet(String appSet) { + this.appSet = appSet; + } + + public String getScreenRecordSet() { + return screenRecordSet; + } + + public void setScreenRecordSet(String screenRecordSet) { + this.screenRecordSet = screenRecordSet; + } + + public String getScreenshotSet() { + return screenshotSet; + } + + public void setScreenshotSet(String screenshotSet) { + this.screenshotSet = screenshotSet; + } + + public String getPriority() { + return priority; + } + + public void setPriority(String priority) { + this.priority = priority; + } + + public String getCronExpr() { + return cronExpr; + } + + public void setCronExpr(String cronExpr) { + this.cronExpr = cronExpr; + } + + public String getUpFrontPlanId() { + return upFrontPlanId; + } + + public void setUpFrontPlanId(String upFrontPlanId) { + this.upFrontPlanId = upFrontPlanId; + } + + public String getWebhookUrl() { + return webhookUrl; + } + + public void setWebhookUrl(String webhookUrl) { + this.webhookUrl = webhookUrl; + } + + public String getWebhookToken() { + return webhookToken; + } + + public void setWebhookToken(String webhookToken) { + this.webhookToken = webhookToken; + } + + public Boolean getSendMail() { + return sendMail; + } + + public void setSendMail(Boolean sendMail) { + this.sendMail = sendMail; + } + + public String getMailAddress() { + return mailAddress; + } + + public void setMailAddress(String mailAddress) { + this.mailAddress = mailAddress; + } + + public Boolean getFailRetry() { + return failRetry; + } + + public void setFailRetry(Boolean failRetry) { + this.failRetry = failRetry; + } + + public Integer getFailRetryCount() { + return failRetryCount; + } + + public void setFailRetryCount(Integer failRetryCount) { + this.failRetryCount = failRetryCount; + } + + public Boolean getFailCreatePlan() { + return failCreatePlan; + } + + public void setFailCreatePlan(Boolean failCreatePlan) { + this.failCreatePlan = failCreatePlan; + } + + public List getAppList() { + return appList; + } + + public void setAppList(List appList) { + this.appList = appList; + } + + public List getDeviceList() { + return deviceList; + } + + public void setDeviceList(List deviceList) { + this.deviceList = deviceList; + } + + public String getRetryStrategy() { + return retryStrategy; + } + + public void setRetryStrategy(String retryStrategy) { + this.retryStrategy = retryStrategy; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanPrincipalDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanPrincipalDto.java new file mode 100644 index 0000000..b6c46cf --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanPrincipalDto.java @@ -0,0 +1,27 @@ +package net.northking.cctp.executePlan.dto.planInfo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +public class AtuPlanPrincipalDto { + + @ApiModelProperty("计划集合") + private List planList; + + @ApiModelProperty("负责人") + private String principalId; + + @ApiModelProperty("更新人id") + private String updatedBy; + + /** + * 更新时间
+ */ + @ApiModelProperty("更新时间") + private Date updatedTime; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanRunDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanRunDto.java new file mode 100644 index 0000000..65b8e4e --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/AtuPlanRunDto.java @@ -0,0 +1,70 @@ +package net.northking.cctp.executePlan.dto.planInfo; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + *

Title: AtuPlanRunDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/10 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuPlanRunDto implements Serializable { + + /** + * 计划id + */ + @NotBlank(message = "计划编号不能为空") + private String planId; + + /** + * 批次id + */ + private String batchId; + + /** + * 触发方式 1 自动执行 2 手动执行 3 devops + */ + private String triggerType ; + + /** + * 执行人 + */ + private String executedBy ; + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getTriggerType() { + return triggerType; + } + + public void setTriggerType(String triggerType) { + this.triggerType = triggerType; + } + + public String getExecutedBy() { + return executedBy; + } + + public void setExecutedBy(String executedBy) { + this.executedBy = executedBy; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/DeviceList.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/DeviceList.java new file mode 100644 index 0000000..29340be --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/DeviceList.java @@ -0,0 +1,61 @@ +package net.northking.cctp.executePlan.dto.planInfo; + +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; + +public class DeviceList { + /** + * 设备主键
+ */ + @ApiModelProperty("设备主键") + @Size(max = 128, message="设备主键-deviceId: 数据长度不能 > 32" ) + private String deviceId; + /** + * 设备类型;1-PC,2-移动端
+ */ + @ApiModelProperty("设备类型;1-PC,2-移动端") + @Size(max = 1, message="设备类型;1-PC,2-移动端-deviceType: 数据长度不能 > 1" ) + private String deviceType; + /** + * 浏览器类型;1-IE,2-chrome,3-firefox,4-edge
+ */ + @ApiModelProperty("浏览器类型;1-IE,2-chrome,3-firefox,4-edge") + @Size(max = 1, message="浏览器类型;1-IE,2-chrome,3-firefox,4-edge-browserType: 数据长度不能 > 1" ) + private String browserType; + + @ApiModelProperty("系统类型 0-Android 1-IOS 2-HarmonyOS") + private String platformType; + + public String getPlatformType() { + return platformType; + } + + public void setPlatformType(String platformType) { + this.platformType = platformType; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getBrowserType() { + return browserType; + } + + public void setBrowserType(String browserType) { + this.browserType = browserType; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/SelectSets.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/SelectSets.java new file mode 100644 index 0000000..7bf0fe4 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planInfo/SelectSets.java @@ -0,0 +1,39 @@ +package net.northking.cctp.executePlan.dto.planInfo; + +import io.swagger.annotations.ApiModel; + +import java.util.List; + +@ApiModel(description = "选中的用例集") +public class SelectSets { + + private String scriptId; + + private String scriptType; + + private List unselectIds; + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public String getScriptType() { + return scriptType; + } + + public void setScriptType(String scriptType) { + this.scriptType = scriptType; + } + + public List getUnselectIds() { + return unselectIds; + } + + public void setUnselectIds(List unselectIds) { + this.unselectIds = unselectIds; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanAppLinkDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanAppLinkDetailDto.java new file mode 100644 index 0000000..a9448aa --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanAppLinkDetailDto.java @@ -0,0 +1,18 @@ +package net.northking.cctp.executePlan.dto.planLink; + +import net.northking.cctp.executePlan.db.entity.AtuPlanAppLink; + +import java.io.Serializable; + +/** + *

Title: AtuPlanAppLinkDetailDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/06 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuPlanAppLinkDetailDto extends AtuPlanAppLink implements Serializable { +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanCaseSetLinkDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanCaseSetLinkDetailDto.java new file mode 100644 index 0000000..c4cf581 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanCaseSetLinkDetailDto.java @@ -0,0 +1,17 @@ +package net.northking.cctp.executePlan.dto.planLink; + +import java.io.Serializable; + +/** + *

Title: AtuPlanCaseSetLinkDetailDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/06 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuPlanCaseSetLinkDetailDto implements Serializable { +} + diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanEnvLinkDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanEnvLinkDetailDto.java new file mode 100644 index 0000000..bcea16a --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanEnvLinkDetailDto.java @@ -0,0 +1,73 @@ +package net.northking.cctp.executePlan.dto.planLink; + +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** + *

Title: AtuPlanEnvLinkDetailDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/08/30 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class AtuPlanEnvLinkDetailDto implements Serializable { + + /** + * 主键
+ */ + @ApiModelProperty("主键") + private Long id; + /** + * 计划id
+ */ + @ApiModelProperty("计划id") + @Size(max = 32, message="计划id-planId: 数据长度不能 > 32" ) + private String planId; + /** + * 环境id
+ */ + @ApiModelProperty("环境id") + @Size(max = 32, message="环境id-envId: 数据长度不能 > 32" ) + private String envId; + /** + * 排序值
+ */ + @ApiModelProperty("排序值") + private Integer sort; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanScriptInputLinkDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanScriptInputLinkDetailDto.java new file mode 100644 index 0000000..8a1c8fc --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanScriptInputLinkDetailDto.java @@ -0,0 +1,43 @@ +package net.northking.cctp.executePlan.dto.planLink; + +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** + *

Title: AtuPlanScriptInputLinkDetailDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/08/31 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuPlanScriptInputLinkDetailDto implements Serializable { + + /** + * 主键
+ */ + @ApiModelProperty("主键") + private Long id; + /** + * 计划id
+ */ + @ApiModelProperty("计划id") + @Size(max = 32, message="计划id-planId: 数据长度不能 > 32" ) + private String planId; + /** + * 脚本id
+ */ + @ApiModelProperty("脚本id") + @Size(max = 32, message="脚本id-scriptId: 数据长度不能 > 32" ) + private String scriptId; + /** + * 未被选择的意图id
+ */ + @ApiModelProperty("未被选择的意图id") + @Size(max = 32, message="未被选择的意图id-unselectedCaseId: 数据长度不能 > 32" ) + private String unselectedCaseId; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanScriptLinkDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanScriptLinkDetailDto.java new file mode 100644 index 0000000..9ef1a5c --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/AtuPlanScriptLinkDetailDto.java @@ -0,0 +1,75 @@ +package net.northking.cctp.executePlan.dto.planLink; + +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** + *

Title: AtuPlanScriptLinkDetailDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/08/31 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuPlanScriptLinkDetailDto implements Serializable { + + /** + * 主键
+ */ + @ApiModelProperty("主键") + private Long id; + /** + * 计划id
+ */ + @ApiModelProperty("计划id") + @Size(max = 32, message="计划id-planId: 数据长度不能 > 32" ) + private String planId; + /** + * 脚本id
+ */ + @ApiModelProperty("脚本id") + @Size(max = 32, message="脚本id-scriptId: 数据长度不能 > 32" ) + private String scriptId; + /** + * 脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios
+ */ + @ApiModelProperty("脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios") + @Size(max = 32, message="脚本类型;0-接口,1-pcbs,2-pccs,3-安卓,4-ios-scriptType: 数据长度不能 > 32" ) + private String scriptType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public String getScriptType() { + return scriptType; + } + + public void setScriptType(String scriptType) { + this.scriptType = scriptType; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/ProjectEnvCheckDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/ProjectEnvCheckDto.java new file mode 100644 index 0000000..b08f4a5 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planLink/ProjectEnvCheckDto.java @@ -0,0 +1,36 @@ +package net.northking.cctp.executePlan.dto.planLink; + +import java.io.Serializable; +import java.util.List; + +/** + *

Title: ProjectEnvCheckDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/11/14 18:45 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class ProjectEnvCheckDto implements Serializable { + + private String projectId; + + private List envIdList; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public List getEnvIdList() { + return envIdList; + } + + public void setEnvIdList(List envIdList) { + this.envIdList = envIdList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuPlanSceneCaseTaskDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuPlanSceneCaseTaskDetailDto.java new file mode 100644 index 0000000..9413e5d --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuPlanSceneCaseTaskDetailDto.java @@ -0,0 +1,70 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planSceneCase; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.executePlan.db.entity.AtuPlanSceneCaseTask; +import net.northking.cctp.executePlan.dto.planTask.SceneNodeDto; + +import java.io.Serializable; +import java.util.List; + +/** +* Restful接口--资源详情--数据传输对象:计划场景用例节点任务表 +* +* createdate: 2022-12-06 11:32:04
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "计划场景用例节点任务表") +public class AtuPlanSceneCaseTaskDetailDto extends AtuPlanSceneCaseTask implements Serializable +{ + @ApiModelProperty("脚本编号") + private String scriptCode; + + @ApiModelProperty("环境名称") + private String envName; + + @ApiModelProperty("视频地址") + private List sceneData; + + @ApiModelProperty("当前直播是否为接口用例") + private boolean apiCase = false; + + public String getScriptCode() { + return scriptCode; + } + + public void setScriptCode(String scriptCode) { + this.scriptCode = scriptCode; + } + + public List getSceneData() { + return sceneData; + } + + public void setSceneData(List sceneData) { + this.sceneData = sceneData; + } + + public boolean isApiCase() { + return apiCase; + } + + public void setApiCase(boolean apiCase) { + this.apiCase = apiCase; + } + + public String getEnvName() { + return envName; + } + + public void setEnvName(String envName) { + this.envName = envName; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuPlanSceneCaseTaskQueryDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuPlanSceneCaseTaskQueryDto.java new file mode 100644 index 0000000..e9dab9b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuPlanSceneCaseTaskQueryDto.java @@ -0,0 +1,59 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planSceneCase; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.*; + +import java.io.Serializable; + +/** +* 查询接口--数据传输对象:计划场景用例节点任务表 +* +* createdate: 2022-12-06 11:32:04
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "计划场景用例节点任务表") +public class AtuPlanSceneCaseTaskQueryDto implements Serializable +{ + @NotBlank(message = "任务编号不能为空") + @ApiModelProperty("任务编号") + private String taskId; + + @ApiModelProperty("脚本名称") + private String scriptName; + + @ApiModelProperty("状态") + private String status; + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuSceneNextNodeDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuSceneNextNodeDto.java new file mode 100644 index 0000000..922f4f5 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuSceneNextNodeDto.java @@ -0,0 +1,52 @@ +package net.northking.cctp.executePlan.dto.planSceneCase; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

Title: AtuSceneNextNodeDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/13 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +@Data +public class AtuSceneNextNodeDto implements Serializable { + /** + * 任务ID + */ + private String taskId; + /** + * 用例ID + */ + private String caseId; + + @ApiModelProperty("脚本Url") + private String sceneScriptUrl; + + /** + * 节点ID + */ + private String nodeId; + + /** + * 是否成功 + */ + private Boolean success; + + /** + * 输出参数 + */ + private Map outputArgs; + + /** + * 场景脚本id + */ + private String scriptId; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuSceneNodeExecDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuSceneNodeExecDto.java new file mode 100644 index 0000000..6f8d339 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuSceneNodeExecDto.java @@ -0,0 +1,56 @@ +package net.northking.cctp.executePlan.dto.planSceneCase; + +import lombok.Data; + +import java.io.Serializable; + +/** + *

Title: AtuSceneNodeExecDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/08 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + + +@Data +public class AtuSceneNodeExecDto implements Serializable { + + /** + * 任务ID + */ + private String taskId; + + /** + * 节点ID + */ + private String nodeId; + + /** + * 下一节点信息 + */ + private AtuSceneNodeInfoDto nodeInfo; + + /** + * 是否结束 + */ + private Boolean end; + + /** + * 任务状态 1-开始执行,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时 + */ + private String status; + + /** + * 错误信息 + */ + private String message; + + /** + * 场景文件信息 + */ + private String sceneScriptUrl; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuSceneNodeInfoDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuSceneNodeInfoDto.java new file mode 100644 index 0000000..d93e56b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/AtuSceneNodeInfoDto.java @@ -0,0 +1,159 @@ +package net.northking.cctp.executePlan.dto.planSceneCase; + +import java.io.Serializable; +import java.util.Map; + +/** + *

Title: AtuSceneNodeInfoDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/08 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuSceneNodeInfoDto implements Serializable { + + /** + * 节点ID + */ + private String nodeId; + + /** + * 节点类型 + */ + private String nodeType; + + /** + * 连线ID + */ + private String lineId; + + /** + * 脚本ID + */ + private String scriptId; + + /** + * 脚本版本id
+ */ + private Integer versionId; + /** + * 脚本版本名称
+ */ + private String versionName; + + /** + * 脚本名称 + */ + private String scriptName; + + /** + * 脚本路径 + */ + private String scriptPath; + + /** + * 用例参数 + */ + private Map caseParam; + + /** + * 应用平台类型 + */ + private String platformType; + + /** + * 应用包名 + */ + private String appPackage; + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public String getNodeType() { + return nodeType; + } + + public void setNodeType(String nodeType) { + this.nodeType = nodeType; + } + + public String getLineId() { + return lineId; + } + + public void setLineId(String lineId) { + this.lineId = lineId; + } + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public Integer getVersionId() { + return versionId; + } + + public void setVersionId(Integer versionId) { + this.versionId = versionId; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public String getScriptPath() { + return scriptPath; + } + + public void setScriptPath(String scriptPath) { + this.scriptPath = scriptPath; + } + + public Map getCaseParam() { + return caseParam; + } + + public void setCaseParam(Map caseParam) { + this.caseParam = caseParam; + } + + public String getPlatformType() { + return platformType; + } + + public void setPlatformType(String platformType) { + this.platformType = platformType; + } + + public String getAppPackage() { + return appPackage; + } + + public void setAppPackage(String appPackage) { + this.appPackage = appPackage; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/CdEngineInfoDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/CdEngineInfoDetailDto.java new file mode 100644 index 0000000..08a3c32 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/CdEngineInfoDetailDto.java @@ -0,0 +1,161 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planSceneCase; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; + +/** +* Restful接口--资源详情--数据传输对象:执行引擎信息表 +* +* createdate: 2022-09-28 14:47:46
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "执行引擎信息表") +public class CdEngineInfoDetailDto implements Serializable +{ + /** + * 主键id
+ */ + @ApiModelProperty("主键id") + @Size(max = 32, message="主键id-id: 数据长度不能 > 32" ) + private String id; + /** + * 引擎名称
+ */ + @ApiModelProperty("引擎名称") + @Size(max = 50, message="引擎名称-engineName: 数据长度不能 > 50" ) + private String engineName; + /** + * pc设备id
+ */ + @ApiModelProperty("pc设备id") + @Size(max = 32, message="pc设备id-deviceId: 数据长度不能 > 32" ) + private String deviceId; + /** + * ip地址
+ */ + @ApiModelProperty("ip地址") + @Size(max = 20, message="ip地址-ipAddr: 数据长度不能 > 20" ) + private String ipAddr; + /** + * 引擎版本
+ */ + @ApiModelProperty("引擎版本") + @Size(max = 255, message="引擎版本-runningRelease: 数据长度不能 > 255" ) + private String runningRelease; + /** + * 注册时间
+ */ + @ApiModelProperty("注册时间") + private Date registedTime; + /** + * 启用/禁用
+ */ + @ApiModelProperty("启用/禁用") + private Boolean enabled; + /** + * 引擎状态
+ */ + @ApiModelProperty("引擎状态") + @Size(max = 1, message="引擎状态-engineStatus: 数据长度不能 > 1" ) + private String engineStatus; + /** + * 引擎描述
+ */ + @ApiModelProperty("引擎描述") + @Size(max = 255, message="引擎描述-engineDesc: 数据长度不能 > 255" ) + private String engineDesc; + + @ApiModelProperty("设备名称") + private String deviceName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getEngineName() { + return engineName; + } + + public void setEngineName(String engineName) { + this.engineName = engineName; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getIpAddr() { + return ipAddr; + } + + public void setIpAddr(String ipAddr) { + this.ipAddr = ipAddr; + } + + public String getRunningRelease() { + return runningRelease; + } + + public void setRunningRelease(String runningRelease) { + this.runningRelease = runningRelease; + } + + public Date getRegistedTime() { + return registedTime; + } + + public void setRegistedTime(Date registedTime) { + this.registedTime = registedTime; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public String getEngineStatus() { + return engineStatus; + } + + public void setEngineStatus(String engineStatus) { + this.engineStatus = engineStatus; + } + + public String getEngineDesc() { + return engineDesc; + } + + public void setEngineDesc(String engineDesc) { + this.engineDesc = engineDesc; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/SceneFirstNodeDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/SceneFirstNodeDto.java new file mode 100644 index 0000000..344a0a7 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planSceneCase/SceneFirstNodeDto.java @@ -0,0 +1,36 @@ +package net.northking.cctp.executePlan.dto.planSceneCase; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + *

Title: SceneFirstNodeDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/09/04 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +@Data +public class SceneFirstNodeDto implements Serializable { + + @ApiModelProperty("计划执行任务号") + private String taskId; + + @ApiModelProperty("用例Id") + private String caseId; + + @ApiModelProperty("脚本id") + private String scriptId; + + @ApiModelProperty("脚本Url") + private String sceneScriptUrl; + + @ApiModelProperty("用例参数") + private Map paramMap; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptDeleteDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptDeleteDto.java new file mode 100644 index 0000000..30ff2a8 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptDeleteDto.java @@ -0,0 +1,40 @@ +package net.northking.cctp.executePlan.dto.planScript; + +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; + +public class AtuPlanScriptDeleteDto { + @ApiModelProperty("脚本id集合") + private List scriptList; + + @ApiModelProperty("计划id") + private String planId; + + @ApiModelProperty("修改人") + private String userId; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public List getScriptList() { + return scriptList; + } + + public void setScriptList(List scriptList) { + this.scriptList = scriptList; + } + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptDto.java new file mode 100644 index 0000000..0701918 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptDto.java @@ -0,0 +1,52 @@ +package net.northking.cctp.executePlan.dto.planScript; + +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; + +public class AtuPlanScriptDto { + + @ApiModelProperty("计划id") + private String planId; + + @ApiModelProperty("脚本集合") + private List scriptList; + + @ApiModelProperty("脚本勾选不执行测试意图集合") + private List dtoList; + + @ApiModelProperty("父节点集合") + private List parentList; + + public List getScriptList() { + return scriptList; + } + + public void setScriptList(List scriptList) { + this.scriptList = scriptList; + } + + public List getParentList() { + return parentList; + } + + public void setParentList(List parentList) { + this.parentList = parentList; + } + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public List getDtoList() { + return dtoList; + } + + public void setDtoList(List dtoList) { + this.dtoList = dtoList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptInputDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptInputDto.java new file mode 100644 index 0000000..89c0712 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptInputDto.java @@ -0,0 +1,36 @@ +package net.northking.cctp.executePlan.dto.planScript; + +import java.util.List; + +public class AtuPlanScriptInputDto { + + private String scriptId; + + private List unselectedId; + + private String scriptType; + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public List getUnselectedId() { + return unselectedId; + } + + public void setUnselectedId(List unselectedId) { + this.unselectedId = unselectedId; + } + + public String getScriptType() { + return scriptType; + } + + public void setScriptType(String scriptType) { + this.scriptType = scriptType; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptLinkDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptLinkDto.java new file mode 100644 index 0000000..626d8f4 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptLinkDto.java @@ -0,0 +1,19 @@ +package net.northking.cctp.executePlan.dto.planScript; + +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.executePlan.db.entity.AtuPlanScriptLinkMd; + +public class AtuPlanScriptLinkDto extends AtuPlanScriptLinkMd { + + @ApiModelProperty("脚本名称") + private String scriptName; + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptPageDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptPageDto.java new file mode 100644 index 0000000..5ef260e --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptPageDto.java @@ -0,0 +1,16 @@ +package net.northking.cctp.executePlan.dto.planScript; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.northking.cctp.common.db.Pagination; +import net.northking.cctp.executePlan.feign.dto.AtuCaseScriptResultDto; +import net.northking.cctp.executePlan.feign.dto.AtuScriptInfoResultDto; + +@Data +public class AtuPlanScriptPageDto { + @ApiModelProperty("分页信息") + private Pagination pagination; + + @ApiModelProperty("脚本信息") + private AtuScriptInfoResultDto infoDto; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptQueryDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptQueryDto.java new file mode 100644 index 0000000..bee4f3b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptQueryDto.java @@ -0,0 +1,13 @@ +package net.northking.cctp.executePlan.dto.planScript; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class AtuPlanScriptQueryDto { + @ApiModelProperty("计划id") + private String planId; + + @ApiModelProperty("脚本名称") + private String setName; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptResultDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptResultDto.java new file mode 100644 index 0000000..be40947 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptResultDto.java @@ -0,0 +1,107 @@ +package net.northking.cctp.executePlan.dto.planScript; + +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; + +public class AtuPlanScriptResultDto { + + @ApiModelProperty("一般") + private List simpleList; + + @ApiModelProperty("场景") + private List sceneList; + + @ApiModelProperty("是否存在PC/接口脚本") + private boolean hasPC; + + @ApiModelProperty("是否存在移动脚本") + private boolean hasMob; + + @ApiModelProperty("是否存在安卓脚本") + private boolean hasAndroid; + + @ApiModelProperty("是否存在IOS脚本") + private boolean hasIOS; + + @ApiModelProperty("是否存在B/S脚本") + private boolean hasBS; + + @ApiModelProperty("是否存在C/S脚本") + private boolean hasCS; + + @ApiModelProperty("是否存在接口脚本") + private boolean hasAPI; + + public List getSimpleList() { + return simpleList; + } + + public void setSimpleList(List simpleList) { + this.simpleList = simpleList; + } + + public List getSceneList() { + return sceneList; + } + + public void setSceneList(List sceneList) { + this.sceneList = sceneList; + } + + public boolean isHasPC() { + return hasPC; + } + + public void setHasPC(boolean hasPC) { + this.hasPC = hasPC; + } + + public boolean isHasMob() { + return hasMob; + } + + public void setHasMob(boolean hasMob) { + this.hasMob = hasMob; + } + + public boolean isHasAndroid() { + return hasAndroid; + } + + public void setHasAndroid(boolean hasAndroid) { + this.hasAndroid = hasAndroid; + } + + public boolean isHasIOS() { + return hasIOS; + } + + public void setHasIOS(boolean hasIOS) { + this.hasIOS = hasIOS; + } + + public boolean isHasBS() { + return hasBS; + } + + public void setHasBS(boolean hasBS) { + this.hasBS = hasBS; + } + + public boolean isHasCS() { + return hasCS; + } + + public void setHasCS(boolean hasCS) { + this.hasCS = hasCS; + } + + public boolean isHasAPI() { + return hasAPI; + } + + public void setHasAPI(boolean hasAPI) { + this.hasAPI = hasAPI; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptSaveDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptSaveDto.java new file mode 100644 index 0000000..8de4a17 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planScript/AtuPlanScriptSaveDto.java @@ -0,0 +1,63 @@ +package net.northking.cctp.executePlan.dto.planScript; + +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; + +public class AtuPlanScriptSaveDto { + + @ApiModelProperty("计划id") + private String planId; + + @ApiModelProperty("系统id") + private String proId; + + @ApiModelProperty("勾选的脚本") + private List selectList; + + @ApiModelProperty("全选的节点") + private List pathList; + + @ApiModelProperty("不勾选的脚本") + private List unSelectList; + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } + + public List getSelectList() { + return selectList; + } + + public void setSelectList(List selectList) { + this.selectList = selectList; + } + + public List getPathList() { + return pathList; + } + + public void setPathList(List pathList) { + this.pathList = pathList; + } + + public List getUnSelectList() { + return unSelectList; + } + + public void setUnSelectList(List unSelectList) { + this.unSelectList = unSelectList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AppPerInfoDataDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AppPerInfoDataDto.java new file mode 100644 index 0000000..f149e05 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AppPerInfoDataDto.java @@ -0,0 +1,52 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; +import java.util.List; + +/** + *

Title: AppPerInfoDataDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/10/8 17:38 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class AppPerInfoDataDto implements Serializable { + /** + * cpu使用数据 % + */ + private List cpuList; + /** + * 内存使用数据 M + */ + private List memoList; + /** + * 流量使用数据 M + */ + private List flowList; + + public List getCpuList() { + return cpuList; + } + + public void setCpuList(List cpuList) { + this.cpuList = cpuList; + } + + public List getMemoList() { + return memoList; + } + + public void setMemoList(List memoList) { + this.memoList = memoList; + } + + public List getFlowList() { + return flowList; + } + + public void setFlowList(List flowList) { + this.flowList = flowList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanInputDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanInputDto.java new file mode 100644 index 0000000..a66c9c7 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanInputDto.java @@ -0,0 +1,32 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + *

Title: AtuPlanInputDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/09/01 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@Data +public class AtuPlanInputDto { + + private String id; + + private String envId; + + private String scriptId; + + private String scriptType; + + private String dataUrl; + + private List> dataList; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanInputQueryDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanInputQueryDto.java new file mode 100644 index 0000000..ff5d793 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanInputQueryDto.java @@ -0,0 +1,37 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; +import java.util.List; + +/** + *

Title: AtuPlanInputQueryDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/09/01 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuPlanInputQueryDto implements Serializable { + + private List envIdList; + + private List scriptIdList; + + public List getEnvIdList() { + return envIdList; + } + + public void setEnvIdList(List envIdList) { + this.envIdList = envIdList; + } + + public List getScriptIdList() { + return scriptIdList; + } + + public void setScriptIdList(List scriptIdList) { + this.scriptIdList = scriptIdList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskDetailDto.java new file mode 100644 index 0000000..b1f87e7 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskDetailDto.java @@ -0,0 +1,229 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planTask; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** +* Restful接口--资源详情--数据传输对象:计划执行任务表 +* +* createdate: 2022-12-06 11:32:05
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "计划执行任务表") +public class AtuPlanTaskDetailDto implements Serializable +{ + /** + * 任务ID + */ + private String taskId; + + /** + * 脚本名称 + */ + private String scriptName; + + /** + * 版本名称 + */ + private String versionName; + + /** + * 引擎ip + */ + private String engineIp; + + /** + * 用例ID + */ + private String caseId; + + /** + * 用例编号 + */ + private String caseNo; + + /** + * 用例名称 + */ + private String caseName; + + /** + * 用例类型 + */ + private String caseType; + + /** + * 执行结果 2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时 + */ + private String execResult; + + /** + * 错误信息 + */ + private String errorMsg; + + /** + * 视频地址 + */ + private String videoUrl; + + /** + * 用例数据 + */ + private List caseParams; + + /** + * 步骤列表 + */ + private List steps; + + /** + * 设备信息 + */ + private List> deviceInfoList; + + @ApiModelProperty("视频地址") + private List sceneData; + + @ApiModelProperty("缺陷跳转ip") + private String hostStr; + + public String getHostStr() { + return hostStr; + } + + public void setHostStr(String hostStr) { + this.hostStr = hostStr; + } + + public List getSceneData() { + return sceneData; + } + + public void setSceneData(List sceneData) { + this.sceneData = sceneData; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + + public String getCaseId() { + return caseId; + } + + public void setCaseId(String caseId) { + this.caseId = caseId; + } + + public String getCaseNo() { + return caseNo; + } + + public void setCaseNo(String caseNo) { + this.caseNo = caseNo; + } + + public String getCaseName() { + return caseName; + } + + public void setCaseName(String caseName) { + this.caseName = caseName; + } + + public String getCaseType() { + return caseType; + } + + public String getEngineIp() { + return engineIp; + } + + public void setEngineIp(String engineIp) { + this.engineIp = engineIp; + } + + public void setCaseType(String caseType) { + this.caseType = caseType; + } + + public String getExecResult() { + return execResult; + } + + public void setExecResult(String execResult) { + this.execResult = execResult; + } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public String getVideoUrl() { + return videoUrl; + } + + public void setVideoUrl(String videoUrl) { + this.videoUrl = videoUrl; + } + + public List getCaseParams() { + return caseParams; + } + + public void setCaseParams(List caseParams) { + this.caseParams = caseParams; + } + + public List getSteps() { + return steps; + } + + public void setSteps(List steps) { + this.steps = steps; + } + + public List> getDeviceInfoList() { + return deviceInfoList; + } + + public void setDeviceInfoList(List> deviceInfoList) { + this.deviceInfoList = deviceInfoList; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskExtendDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskExtendDto.java new file mode 100644 index 0000000..e8ea251 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskExtendDto.java @@ -0,0 +1,26 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; + +public class AtuPlanTaskExtendDto extends AtuPlanTask { + + private String planId; + + private String planName; + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskPageDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskPageDto.java new file mode 100644 index 0000000..6431abf --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskPageDto.java @@ -0,0 +1,409 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + *

Title: AtuPlanTaskPageDto

+ *

Description: 分页查询对象

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/06 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@JsonSerialize +@ApiModel(description = "执行计划任务表") +public class AtuPlanTaskPageDto implements Serializable { + + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message = "主键-id: 数据长度不能 > 32") + private String id; + + /** + * 关键字
+ */ + @ApiModelProperty("关键字") + @Size(max = 30, message = "关键字: 数据长度不能 > 30") + private String keyword; + + /** + * 调度主键
+ */ + @ApiModelProperty("调度主键") + @Size(max = 32, message = "调度主键-batchId: 数据长度不能 > 32") + private String batchId; + + /** + * 环境主键 + */ + @ApiModelProperty("环境主键") + private String envId; + + /** + * 环境名称 + */ + @ApiModelProperty("环境名称") + private String envName; + + /** + * 脚本主键
+ */ + @ApiModelProperty("脚本主键") + @Size(max = 32, message = "脚本主键-scriptId: 数据长度不能 > 32") + private String scriptId; + + /** + * 版本主键 + */ + @ApiModelProperty("版本主键") + private Integer versionId; + + /** + * 版本名称 + */ + @ApiModelProperty("版本名称") + private String versionName; + + /** + * 脚本名称
+ */ + @ApiModelProperty("脚本名称") + @Size(max = 90, message = "脚本名称-scriptName: 数据长度不能 > 90") + private String scriptName; + + /** + * 脚本编码
+ */ + @ApiModelProperty("脚本编码") + private String scriptCode; + /** + * 用例主键
+ */ + @ApiModelProperty("用例主键") + @Size(max = 32, message = "用例主键-caseId: 数据长度不能 > 32") + private String caseId; + /** + * 用例编号
+ */ + @ApiModelProperty("用例编号") + @Size(max = 32, message = "用例编号-caseNo: 数据长度不能 > 32") + private String caseNo; + /** + * 用例名称
+ */ + @ApiModelProperty("用例名称") + @Size(max = 90, message = "用例名称-caseName: 数据长度不能 > 90") + private String caseName; + /** + * 用例类型;1-接口,2-PC/BS,3-PC/CS,4-安卓,5-ios,6-场景用例
+ */ + @ApiModelProperty("用例类型;1-接口,2-PC/BS,3-PC/CS,4-安卓,5-ios,6-场景用例") + @Size(max = 1, message = "用例类型;1-接口,2-PC/BS,3-PC/CS,4-安卓,5-ios,6-场景用例-caseType: 数据长度不能 > 1") + private String caseType; + /** + * 用例参数
+ */ + @ApiModelProperty("用例参数") + @Size(max = 65535, message = "用例参数-caseParam: 数据长度不能 > 65535") + private String caseParam; + /** + * 引擎主键
+ */ + @ApiModelProperty("引擎主键") + @Size(max = 32, message = "引擎主键-engineId: 数据长度不能 > 32") + private String engineId; + /** + * 设备主键
+ */ + @ApiModelProperty("设备主键") + @Size(max = 128, message = "设备主键-deviceId: 数据长度不能 > 32") + private String deviceId; + /** + * 应用主键
+ */ + @ApiModelProperty("应用主键") + @Size(max = 32, message = "应用主键-appId: 数据长度不能 > 32") + private String appId; + /** + * 状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时
+ */ + @ApiModelProperty("状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时") + @Size(max = 1, message = "状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时-status: 数据长度不能 > 1") + private String status; + /** + * 开始时间
+ */ + @ApiModelProperty("开始时间") + private Long startTime; + /** + * 结束时间
+ */ + @ApiModelProperty("结束时间") + private Long endTime; + /** + * 错误信息
+ */ + @ApiModelProperty("错误信息") + @Size(max = 65535, message = "错误信息-errorMsg: 数据长度不能 > 65535") + private String errorMsg; + /** + * 视频地址
+ */ + @ApiModelProperty("视频地址") + @Size(max = 255, message = "视频地址-videoUrl: 数据长度不能 > 255") + private String videoUrl; + /** + * 执行结果文件
+ */ + @ApiModelProperty("执行结果文件") + @Size(max = 512, message = "执行结果文件-execResultFile: 数据长度不能 > 512") + private String execResultFile; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + + @ApiModelProperty("视频地址") + private List sceneData; + + @ApiModelProperty("当前直播是否为接口用例") + private boolean apiCase = false; + + @ApiModelProperty("总耗时") + private Long totalExecTake; + + public boolean isApiCase() { + return apiCase; + } + + public void setApiCase(boolean apiCase) { + this.apiCase = apiCase; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public String getEnvName() { + return envName; + } + + public void setEnvName(String envName) { + this.envName = envName; + } + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public Integer getVersionId() { + return versionId; + } + + public void setVersionId(Integer versionId) { + this.versionId = versionId; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public String getScriptCode() { + return scriptCode; + } + + public void setScriptCode(String scriptCode) { + this.scriptCode = scriptCode; + } + + public String getCaseId() { + return caseId; + } + + public void setCaseId(String caseId) { + this.caseId = caseId; + } + + public String getCaseNo() { + return caseNo; + } + + public void setCaseNo(String caseNo) { + this.caseNo = caseNo; + } + + public String getCaseName() { + return caseName; + } + + public void setCaseName(String caseName) { + this.caseName = caseName; + } + + public String getCaseType() { + return caseType; + } + + public void setCaseType(String caseType) { + this.caseType = caseType; + } + + public String getCaseParam() { + return caseParam; + } + + public void setCaseParam(String caseParam) { + this.caseParam = caseParam; + } + + public String getEngineId() { + return engineId; + } + + public void setEngineId(String engineId) { + this.engineId = engineId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Long getStartTime() { + return startTime; + } + + public void setStartTime(Long startTime) { + this.startTime = startTime; + } + + public Long getEndTime() { + return endTime; + } + + public void setEndTime(Long endTime) { + this.endTime = endTime; + } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public String getVideoUrl() { + return videoUrl; + } + + public void setVideoUrl(String videoUrl) { + this.videoUrl = videoUrl; + } + + public String getExecResultFile() { + return execResultFile; + } + + public void setExecResultFile(String execResultFile) { + this.execResultFile = execResultFile; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public List getSceneData() { + return sceneData; + } + + public void setSceneData(List sceneData) { + this.sceneData = sceneData; + } + + public String getKeyword() { + return keyword; + } + + public void setKeyword(String keyword) { + this.keyword = keyword; + } + + public Long getTotalExecTake() { + return totalExecTake; + } + + public void setTotalExecTake(Long totalExecTake) { + this.totalExecTake = totalExecTake; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskQueryDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskQueryDto.java new file mode 100644 index 0000000..07495ff --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuPlanTaskQueryDto.java @@ -0,0 +1,100 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.dto.planTask; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +/** +* 查询接口--数据传输对象:计划执行任务表 +* +* createdate: 2022-12-06 11:32:05
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "计划执行任务表") +public class AtuPlanTaskQueryDto implements Serializable +{ + @ApiModelProperty("关键字") + private String keyword; + + @ApiModelProperty("计划id") + private String planId; + + @ApiModelProperty("调度id") + private String batchId; + + @ApiModelProperty("用例id") + private String caseId; + + @ApiModelProperty("用例名称") + private String caseName; + + @ApiModelProperty("状态;0-等待中,1-执行中,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时") + private String status; + + @ApiModelProperty("脚本名称") + private String scriptName; + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getCaseId() { + return caseId; + } + + public void setCaseId(String caseId) { + this.caseId = caseId; + } + + public String getCaseName() { + return caseName; + } + + public void setCaseName(String caseName) { + this.caseName = caseName; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public String getKeyword() { + return keyword; + } + + public void setKeyword(String keyword) { + this.keyword = keyword; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuScriptDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuScriptDetailDto.java new file mode 100644 index 0000000..aaecf4e --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuScriptDetailDto.java @@ -0,0 +1,134 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import net.northking.cctp.executePlan.dto.planSceneCase.AtuSceneNodeExecDto; + +import java.io.Serializable; + +/** + *

Title: AtuScriptDetailDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/09/01 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuScriptDetailDto implements Serializable { + + /** + * 脚本编号 + */ + private String scriptId; + + /** + * 脚本版本id
+ */ + private Integer versionId; + /** + * 脚本版本名称
+ */ + private String versionName; + + /** + * 脚本类型 + */ + private String scriptType; + + /** + * 脚本名称 + */ + private String scriptName; + + /** + * 脚本地址 + */ + private String scriptPath; + + /** + * 应用平台类型 + */ + private String platformType; + + /** + * 应用包名 + */ + private String appPackage; + + /** + * 场景节点执行信息 + */ + private AtuSceneNodeExecDto sceneNodeExecDto; + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public Integer getVersionId() { + return versionId; + } + + public void setVersionId(Integer versionId) { + this.versionId = versionId; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + + public String getScriptType() { + return scriptType; + } + + public void setScriptType(String scriptType) { + this.scriptType = scriptType; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public String getScriptPath() { + return scriptPath; + } + + public void setScriptPath(String scriptPath) { + this.scriptPath = scriptPath; + } + + public String getPlatformType() { + return platformType; + } + + public void setPlatformType(String platformType) { + this.platformType = platformType; + } + + public String getAppPackage() { + return appPackage; + } + + public void setAppPackage(String appPackage) { + this.appPackage = appPackage; + } + + public AtuSceneNodeExecDto getSceneNodeExecDto() { + return sceneNodeExecDto; + } + + public void setSceneNodeExecDto(AtuSceneNodeExecDto sceneNodeExecDto) { + this.sceneNodeExecDto = sceneNodeExecDto; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskCreateDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskCreateDto.java new file mode 100644 index 0000000..d385aa1 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskCreateDto.java @@ -0,0 +1,72 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import net.northking.cctp.executePlan.dto.planBatch.BatchStrategyDto; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + *

Title: AtuTaskCreateDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/12 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuTaskCreateDto extends BatchStrategyDto implements Serializable { + + /** + * 消息队列名称 + */ + private String queueName; + + /** + * 批次ID + */ + private String batchId; + + /** + * 环境ID集合 + */ + private List envIdList; + + /** + * 用例集集合,key为用例集id,value为未选择的意图id集合 + */ + private Map> caseSetMap; + + public String getQueueName() { + return queueName; + } + + public void setQueueName(String queueName) { + this.queueName = queueName; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public List getEnvIdList() { + return envIdList; + } + + public void setEnvIdList(List envIdList) { + this.envIdList = envIdList; + } + + public Map> getCaseSetMap() { + return caseSetMap; + } + + public void setCaseSetMap(Map> caseSetMap) { + this.caseSetMap = caseSetMap; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskExecDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskExecDto.java new file mode 100644 index 0000000..244ecef --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskExecDto.java @@ -0,0 +1,233 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; +import java.util.Map; + +/** + *

Title: AtuTaskExecDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/08 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuTaskExecDto implements Serializable { + + /** + * 租户ID + */ + private String tenantId; + + /** + * 系统ID + */ + private String projectId; + + /** + * 计划ID + */ + private String planId; + + /** + * 批次ID + */ + private String batchId; + + /** + * 任务ID + */ + private String taskId; + + /** + * 用例ID + */ + private String caseId; + + /** + * 用例类型 + */ + private String caseType; + + /** + * 脚本地址 + */ + private String scriptPath; + + /** + * 用例参数 + */ + private Map caseParams; + + /** + * 应用设置;1-清除数据,2-卸载安装 + */ + private String appSet; + /** + * 录屏设置;0-不保存,1-全部保存,2-出错保存 + */ + private String screenRecordSet; + /** + * 截图设置;0-不保存,1-全部保存,2-出错保存 + */ + private String screenshotSet; + + /** + * 失败重试次数 + */ + private Integer failRetryNum; + /** + * 失败重试策略
+ */ + private String retryStrategy; + /** + * 当前重试次数 + */ + private int currentRetryNum; + /** + * 应用ID + */ + private String appId; + + /** + * 环境id + */ + private String envId; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getCaseId() { + return caseId; + } + + public void setCaseId(String caseId) { + this.caseId = caseId; + } + + public String getCaseType() { + return caseType; + } + + public void setCaseType(String caseType) { + this.caseType = caseType; + } + + public String getScriptPath() { + return scriptPath; + } + + public void setScriptPath(String scriptPath) { + this.scriptPath = scriptPath; + } + + public Map getCaseParams() { + return caseParams; + } + + public void setCaseParams(Map caseParams) { + this.caseParams = caseParams; + } + + public String getAppSet() { + return appSet; + } + + public void setAppSet(String appSet) { + this.appSet = appSet; + } + + public String getScreenRecordSet() { + return screenRecordSet; + } + + public void setScreenRecordSet(String screenRecordSet) { + this.screenRecordSet = screenRecordSet; + } + + public String getScreenshotSet() { + return screenshotSet; + } + + public void setScreenshotSet(String screenshotSet) { + this.screenshotSet = screenshotSet; + } + + public Integer getFailRetryNum() { + return failRetryNum; + } + + public void setFailRetryNum(Integer failRetryNum) { + this.failRetryNum = failRetryNum; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public String getRetryStrategy() { + return retryStrategy; + } + + public void setRetryStrategy(String retryStrategy) { + this.retryStrategy = retryStrategy; + } + + public int getCurrentRetryNum() { + return currentRetryNum; + } + + public void setCurrentRetryNum(int currentRetryNum) { + this.currentRetryNum = currentRetryNum; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskExecResultDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskExecResultDto.java new file mode 100644 index 0000000..e6ad334 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskExecResultDto.java @@ -0,0 +1,239 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import net.northking.cctp.executePlan.dto.planBatch.DevicePerInfo; + +import java.io.Serializable; +import java.util.Map; + +/** + *

Title: AtuTaskExecResultDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/12 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuTaskExecResultDto implements Serializable { + + /** + * 计划ID + */ + private String planId; + + /** + * 批次ID + */ + private String batchId; + + /** + * 任务ID + */ + private String taskId; + + /** + * 用例ID + */ + private String caseId; + + /** + * 用例类型 1-接口,2-bs,3-CS,4-安卓,5-ios,6-场景 + */ + private String caseType; + + /** + * 任务状态 1-开始执行,2-执行成功,3-执行失败,4-断言失败,5-取消,6-超时 + */ + private String status; + /** + * 是否要重试 + */ + private boolean needRetry; + + /** + * 执行信息 + */ + private String message; + + /** + * 当前时间 + */ + private Long currentTime; + + /** + * 引擎ID + */ + private String engineId; + + /** + * 设备ID + */ + private String deviceId; + + /** + * 应用ID + */ + private String appId; + + /** + * 视频地址 + */ + private String videoPath; + + /** + * 执行结果文件地址 + */ + private String filePath; + + /** + * 断言失败截图 + */ + private String imageUrl; + + /** + * 输出参数 + */ + private Map outputs; + + /** + * 设备性能数据地址 + */ + private DevicePerInfo devicePerInfo; + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getCaseId() { + return caseId; + } + + public void setCaseId(String caseId) { + this.caseId = caseId; + } + + public String getCaseType() { + return caseType; + } + + public void setCaseType(String caseType) { + this.caseType = caseType; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Long getCurrentTime() { + return currentTime; + } + + public void setCurrentTime(Long currentTime) { + this.currentTime = currentTime; + } + + public String getEngineId() { + return engineId; + } + + public void setEngineId(String engineId) { + this.engineId = engineId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getVideoPath() { + return videoPath; + } + + public void setVideoPath(String videoPath) { + this.videoPath = videoPath; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public Map getOutputs() { + return outputs; + } + + public void setOutputs(Map outputs) { + this.outputs = outputs; + } + + public DevicePerInfo getDevicePerInfo() { + return devicePerInfo; + } + + public void setDevicePerInfo(DevicePerInfo devicePerInfo) { + this.devicePerInfo = devicePerInfo; + } + + public boolean isNeedRetry() { + return needRetry; + } + + public void setNeedRetry(boolean needRetry) { + this.needRetry = needRetry; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskSendBugDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskSendBugDto.java new file mode 100644 index 0000000..e4f8c74 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskSendBugDto.java @@ -0,0 +1,86 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; +import java.util.Date; + +/** + *

Title: AtuTaskSendBugDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/12/28 17:10 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class AtuTaskSendBugDto implements Serializable { + + private String taskId; + + private String planId; + + private String planName; + + private String scriptCode; + + private String scriptId; + + private String scriptName; + + private Date createdTime; + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getScriptCode() { + return scriptCode; + } + + public void setScriptCode(String scriptCode) { + this.scriptCode = scriptCode; + } + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskSumDataDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskSumDataDto.java new file mode 100644 index 0000000..5ab4a3b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuTaskSumDataDto.java @@ -0,0 +1,77 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; +import java.util.Date; + +/** + *

Title: AtuTaskSumDataDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/13 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuTaskSumDataDto implements Serializable { + + private String planId; + + private String batchId; + + private Integer batch; + + private String status; + + private Integer total; + + private Date startTime; + + public String getPlanId() { + return planId; + } + + public void setPlanId(String planId) { + this.planId = planId; + } + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public Integer getBatch() { + return batch; + } + + public void setBatch(Integer batch) { + this.batch = batch; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Integer getTotal() { + return total; + } + + public void setTotal(Integer total) { + this.total = total; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuVariableDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuVariableDto.java new file mode 100644 index 0000000..1c88cc9 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/AtuVariableDto.java @@ -0,0 +1,68 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; + +/** + *

Title: AtuVariableDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/08 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class AtuVariableDto implements Serializable { + + /** + * 参数名称 + */ + private String name; + + /** + * 参数类型 + */ + private String type; + + /** + * 参数值 + */ + private String value; + + /** + * 是否入参 + */ + private Boolean input; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Boolean getInput() { + return input; + } + + public void setInput(Boolean input) { + this.input = input; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/BugAddDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/BugAddDto.java new file mode 100644 index 0000000..a02edb7 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/BugAddDto.java @@ -0,0 +1,125 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; + +/** + *

Title: BugAddDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/02/01 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class BugAddDto implements Serializable { + + /** + * 系统编号 + */ + private String proId; + /** + * 租户编号 + */ + private String tenantId; + /** + * 附件存放地址 + */ + private String attachId; + /** + * 附件名称 + */ + private String attachName; + /** + * 用例编号 + */ + private String caseId; + /** + * 错误描述 + */ + private String errorMessage; + /** + * 信息 + */ + private String message; + /** + * 计划名称 + */ + private String planName; + /** + * 计划轮次 + */ + private String planRound; + + public String getProId() { + return proId; + } + + public void setProId(String proId) { + this.proId = proId; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getAttachId() { + return attachId; + } + + public void setAttachId(String attachId) { + this.attachId = attachId; + } + + public String getAttachName() { + return attachName; + } + + public void setAttachName(String attachName) { + this.attachName = attachName; + } + + public String getCaseId() { + return caseId; + } + + public void setCaseId(String caseId) { + this.caseId = caseId; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getPlanName() { + return planName; + } + + public void setPlanName(String planName) { + this.planName = planName; + } + + public String getPlanRound() { + return planRound; + } + + public void setPlanRound(String planRound) { + this.planRound = planRound; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/DeviceInfoDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/DeviceInfoDto.java new file mode 100644 index 0000000..8d6d09d --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/DeviceInfoDto.java @@ -0,0 +1,16 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; + +/** + *

Title: DeviceInfo

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/27 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class DeviceInfoDto implements Serializable { +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/DevicePerInfoDataDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/DevicePerInfoDataDto.java new file mode 100644 index 0000000..4da11c3 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/DevicePerInfoDataDto.java @@ -0,0 +1,64 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; +import java.util.List; + +/** + *

Title: DevicePerInfoDataDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/10/8 17:37 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class DevicePerInfoDataDto implements Serializable { + /** + * cpu使用数据 % + */ + private List cpuList; + /** + * 内存使用数据 G + */ + private List memoList; + /** + * 流量使用数据 M + */ + private List flowList; + /** + * 电池温度数据 + */ + private List temperatureList; + + public List getCpuList() { + return cpuList; + } + + public void setCpuList(List cpuList) { + this.cpuList = cpuList; + } + + public List getMemoList() { + return memoList; + } + + public void setMemoList(List memoList) { + this.memoList = memoList; + } + + public List getFlowList() { + return flowList; + } + + public void setFlowList(List flowList) { + this.flowList = flowList; + } + + public List getTemperatureList() { + return temperatureList; + } + + public void setTemperatureList(List temperatureList) { + this.temperatureList = temperatureList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/PlanTaskRecordDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/PlanTaskRecordDto.java new file mode 100644 index 0000000..a7c3b56 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/PlanTaskRecordDto.java @@ -0,0 +1,24 @@ +package net.northking.cctp.executePlan.dto.planTask; + +public class PlanTaskRecordDto { + + private String taskId; + + private long totalTake; + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public long getTotalTake() { + return totalTake; + } + + public void setTotalTake(long totalTake) { + this.totalTake = totalTake; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/QuoteData.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/QuoteData.java new file mode 100644 index 0000000..c6aac89 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/QuoteData.java @@ -0,0 +1,101 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import net.northking.cctp.executePlan.constants.PlanConstant; + +/** + * 引用静态数据 + */ + +public class QuoteData { + + /** + * 静态数据id + */ + private String setId; + + /** + * 单元格值 + */ + private String value; + + /** + * 列名 + */ + private String column; + + /** + * 行号 + */ + private int row; + + /** + * 静态数据路径 + */ + private String tip; + + /** + * 类型,默认为1,1-静态数据,2-模糊数据 + */ + private String type = PlanConstant.INPUT_SET_QUOTE_TYPE_STATIC; + + /** + * 环境id + */ + private String envId; + + public String getSetId() { + return setId; + } + + public void setSetId(String setId) { + this.setId = setId; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getColumn() { + return column; + } + + public void setColumn(String column) { + this.column = column; + } + + public int getRow() { + return row; + } + + public void setRow(int row) { + this.row = row; + } + + public String getTip() { + return tip; + } + + public void setTip(String tip) { + this.tip = tip; + } + + public String getEnvId() { + return envId; + } + + public void setEnvId(String envId) { + this.envId = envId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/SceneNodeDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/SceneNodeDto.java new file mode 100644 index 0000000..0fd26ed --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/SceneNodeDto.java @@ -0,0 +1,50 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import io.swagger.annotations.ApiModelProperty; + +public class SceneNodeDto { + + @ApiModelProperty("主键id") + private String id; + + @ApiModelProperty("脚本名称") + private String scriptName; + + @ApiModelProperty("视频地址") + private String videoUrl; + + @ApiModelProperty("设备类型(1、移动 2、PC)") + private String deviceType; + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public String getVideoUrl() { + return videoUrl; + } + + public void setVideoUrl(String videoUrl) { + this.videoUrl = videoUrl; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/ScriptInputFileDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/ScriptInputFileDto.java new file mode 100644 index 0000000..705a96a --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/ScriptInputFileDto.java @@ -0,0 +1,28 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + *

Title: ScriptInputFileDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/09/01 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class ScriptInputFileDto implements Serializable { + + private List> tableContent; + + public List> getTableContent() { + return tableContent; + } + + public void setTableContent(List> tableContent) { + this.tableContent = tableContent; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/ScriptStep.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/ScriptStep.java new file mode 100644 index 0000000..c245049 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/ScriptStep.java @@ -0,0 +1,155 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; +import java.util.Map; + +/** + *

Title: ScriptStep

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/27 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class ScriptStep implements Serializable { + + /** + * 步骤Id + */ + private String id; + /** + * 是否跳过步骤 + */ + private boolean skip; + /** + * 出错继续下一步 + */ + private boolean ignoreError; + /** + * 调用组件库 + */ + private String componentLib; + /** + * 调用组件命令 + */ + private String command; + /** + * 步骤操作对象 + */ + //private List targets; + /** + * 步骤输出对象 + */ + private Map output; + /** + * 步骤变量 + */ + private Map args; + /** + * 步骤标题 + */ + private String title; + /** + * 步骤缩略图 + */ + private String imgUri; + /** + * 子步骤 + */ + private ScriptStep[] children; + + /** + * 扩展属性 + */ + private Map extAttrs; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public boolean isSkip() { + return skip; + } + + public void setSkip(boolean skip) { + this.skip = skip; + } + + public boolean isIgnoreError() { + return ignoreError; + } + + public void setIgnoreError(boolean ignoreError) { + this.ignoreError = ignoreError; + } + + public String getComponentLib() { + return componentLib; + } + + public void setComponentLib(String componentLib) { + this.componentLib = componentLib; + } + + public String getCommand() { + return command; + } + + public void setCommand(String command) { + this.command = command; + } + + public Map getOutput() { + return output; + } + + public void setOutput(Map output) { + this.output = output; + } + + public Map getArgs() { + return args; + } + + public void setArgs(Map args) { + this.args = args; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getImgUri() { + return imgUri; + } + + public void setImgUri(String imgUri) { + this.imgUri = imgUri; + } + + public ScriptStep[] getChildren() { + return children; + } + + public void setChildren(ScriptStep[] children) { + this.children = children; + } + + public Map getExtAttrs() { + return extAttrs; + } + + public void setExtAttrs(Map extAttrs) { + this.extAttrs = extAttrs; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/StepExecuteResult.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/StepExecuteResult.java new file mode 100644 index 0000000..fc51cb5 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/StepExecuteResult.java @@ -0,0 +1,187 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

Title: StepExecuteResult

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/27 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class StepExecuteResult implements Serializable { + + private String retId; // 步骤执行结果id + private String scriptId; // 脚本id + private String stepId; // 步骤id + private ScriptStep step; // 步骤信息 + + private String nextStepId; // 下一步骤id + private boolean success; // 执行结果 + private boolean isExecuted; // 是否已经执行了 + private String msg; // + private boolean finish; // + private String actualImgUri; // 实际截图地址 + private String imgUri; // 截图地址 + private String requestId; + + private String inputMsg; + private List childResult; + private long executeTime; + + private Map result = new HashMap<>(); + + private Map paramMap = new HashMap<>(); + + private String outputMsg; + + public String getOutputMsg() { + return outputMsg; + } + + public void setOutputMsg(String outputMsg) { + this.outputMsg = outputMsg; + } + + public String getRetId() { + return retId; + } + + public void setRetId(String retId) { + this.retId = retId; + } + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public String getStepId() { + return stepId; + } + + public void setStepId(String stepId) { + this.stepId = stepId; + } + + public ScriptStep getStep() { + return step; + } + + public void setStep(ScriptStep step) { + this.step = step; + } + + public String getNextStepId() { + return nextStepId; + } + + public void setNextStepId(String nextStepId) { + this.nextStepId = nextStepId; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public boolean isExecuted() { + return isExecuted; + } + + public void setExecuted(boolean executed) { + isExecuted = executed; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public boolean isFinish() { + return finish; + } + + public void setFinish(boolean finish) { + this.finish = finish; + } + + public String getActualImgUri() { + return actualImgUri; + } + + public void setActualImgUri(String actualImgUri) { + this.actualImgUri = actualImgUri; + } + + public String getImgUri() { + return imgUri; + } + + public void setImgUri(String imgUri) { + this.imgUri = imgUri; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public String getInputMsg() { + return inputMsg; + } + + public void setInputMsg(String inputMsg) { + this.inputMsg = inputMsg; + } + + public List getChildResult() { + return childResult; + } + + public void setChildResult(List childResult) { + this.childResult = childResult; + } + + public long getExecuteTime() { + return executeTime; + } + + public void setExecuteTime(long executeTime) { + this.executeTime = executeTime; + } + + public Map getResult() { + return result; + } + + public void setResult(Map result) { + this.result = result; + } + + public Map getParamMap() { + return paramMap; + } + + public void setParamMap(Map paramMap) { + this.paramMap = paramMap; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/TaskCaseStepDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/TaskCaseStepDetailDto.java new file mode 100644 index 0000000..0315418 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/dto/planTask/TaskCaseStepDetailDto.java @@ -0,0 +1,177 @@ +package net.northking.cctp.executePlan.dto.planTask; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + *

Title: TaskCaseStepDetailDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/27 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class TaskCaseStepDetailDto implements Serializable { + + private String stepId; + + private String stepName; + + private List> stepDescList; + + private List paramList; + + private Boolean execResult; + + private Boolean executed; + + private Long execTime; + + private String imgUrl; + + private String actualImgUrl; + + private String errorMsg; + + private List stepList; + + /** + * 步骤类型 1-PC;2-移动;3-接口 + */ + private String stepType; + + /** + * 是否跳过 + */ + private Boolean skip; + + /** + * 接口响应报文 + */ + private String responseMap; + + private String outputMsg; + + public String getOutputMsg() { + return outputMsg; + } + + public void setOutputMsg(String outputMsg) { + this.outputMsg = outputMsg; + } + + public String getStepId() { + return stepId; + } + + public void setStepId(String stepId) { + this.stepId = stepId; + } + + public String getStepName() { + return stepName; + } + + public void setStepName(String stepName) { + this.stepName = stepName; + } + + public List> getStepDescList() { + return stepDescList; + } + + public void setStepDescList(List> stepDescList) { + this.stepDescList = stepDescList; + } + + public List getParamList() { + return paramList; + } + + public void setParamList(List paramList) { + this.paramList = paramList; + } + + public Boolean getExecResult() { + return execResult; + } + + public void setExecResult(Boolean execResult) { + this.execResult = execResult; + } + + public Boolean getExecuted() { + return executed; + } + + public void setExecuted(Boolean executed) { + this.executed = executed; + } + + public Long getExecTime() { + return execTime; + } + + public void setExecTime(Long execTime) { + this.execTime = execTime; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getActualImgUrl() { + return actualImgUrl; + } + + public void setActualImgUrl(String actualImgUrl) { + this.actualImgUrl = actualImgUrl; + } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public List getStepList() { + return stepList; + } + + public void setStepList(List stepList) { + this.stepList = stepList; + } + + public String getStepType() { + return stepType; + } + + public void setStepType(String stepType) { + this.stepType = stepType; + } + + public Boolean getSkip() { + return skip; + } + + public void setSkip(Boolean skip) { + this.skip = skip; + } + + public String getResponseMap() { + return responseMap; + } + + public void setResponseMap(String responseMap) { + this.responseMap = responseMap; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/ErrorMessage.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/ErrorMessage.java new file mode 100644 index 0000000..7bb0c1b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/ErrorMessage.java @@ -0,0 +1,28 @@ +package net.northking.cctp.executePlan.enums; + +import net.northking.cctp.common.exception.PlatformError; + +public class ErrorMessage implements PlatformError { + private String msg; + private Integer code = 20000; + + public ErrorMessage(){ + + } + public ErrorMessage(String msg){ + this.msg = msg; + } + public ErrorMessage(Integer code, String msg){ + this.msg = msg; + this.code = code; + } + @Override + public Integer getCode() { + return this.code; + } + + @Override + public String getMsg() { + return this.msg; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/HtmlSpaceEnum.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/HtmlSpaceEnum.java new file mode 100644 index 0000000..f19c950 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/HtmlSpaceEnum.java @@ -0,0 +1,53 @@ +package net.northking.cctp.executePlan.enums; + +/** + *

Title: HtmlSpaceEnum

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/11/30 11:20 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public enum HtmlSpaceEnum { + /** + * 不换行空格 + */ + NBSP(" ", ""), + /** + * 半角空格 + */ + ENSP(" ", ""), + /** + * 全角空格 + */ + EMSP(" ", ""), + /** + * 窄空格 + */ + THINSP(" ", ""), + /** + * 零宽不连字 + */ + ZWNJ("‌", ""), + /** + * 零宽连字 + */ + ZWJ("‍", ""); + + private final String name; + private final String value; + + HtmlSpaceEnum(String name, String value) { + this.name = name; + this.value = value; + } + + public String getName(){ + return name; + } + + public String getValue() { + return value; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/MobilePlatformEnum.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/MobilePlatformEnum.java new file mode 100644 index 0000000..a5e1cb6 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/MobilePlatformEnum.java @@ -0,0 +1,41 @@ +package net.northking.cctp.executePlan.enums; + +/** + *

Title: MobilePlatformEnum

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/10/23 11:27 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public enum MobilePlatformEnum { + + ANDROID("0", "android"), + IOS("1", "ios"); + + private String type; + private String name; + + MobilePlatformEnum(String type, String name) { + this.type = type; + this.name = name; + } + + public String getType(){ + return type; + } + + public String getName() { + return name; + } + + public static String getNameByType(String type){ + for (MobilePlatformEnum platformEnum : MobilePlatformEnum.values()) { + if (platformEnum.getType().equals(type)) { + return platformEnum.getName(); + } + } + return ""; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/TaskTypeEnum.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/TaskTypeEnum.java new file mode 100644 index 0000000..39f86f3 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/enums/TaskTypeEnum.java @@ -0,0 +1,17 @@ +package net.northking.cctp.executePlan.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum TaskTypeEnum { + + SYNC_PLAN_INFO(1,"计划信息同步"), + SYNC_PLAN_BATCH(2,"计划执行信息同步"), + SYNC_PLAN_SCRIPT_LINK(3,"计划脚本关联同步"), + SYNC_PLAN_ENV_LINK(4,"计划环境关联同步"), + SYNC_PLAN_TASK(5,"计划任务同步"); + private Integer code; + private String desc; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/exception/ExecPlanError.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/exception/ExecPlanError.java new file mode 100644 index 0000000..68eac8d --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/exception/ExecPlanError.java @@ -0,0 +1,122 @@ +package net.northking.cctp.executePlan.exception; + +import net.northking.cctp.common.exception.PlatformError; + + +/** + *

Title: ExecPlanError

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/08 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public enum ExecPlanError implements PlatformError { + /** + * 错误码起始值 + */ + FIRST(220000, "First"), + + PLAN_NAME_ERROR("系统下的计划名称不能重复"), + PLAN_NAME_TOO_LONG("计划名称超过30位,请修改计划名称!"), + PLAN_IS_NULL("计划信息不存在"), + PLAN_CASE_SET_IS_NULL("计划用例集信息不存在"), + PLAN_IS_UN_ENABLE("计划被禁用,执行失败!"), + PLAN_CASE_IS_NULL("计划用例信息不存在"), + PLAN_DEVICE_IS_NULL("计划绑定的设备信息不存在"), + PLAN_STATUS_CANNOT_DELETE("当前状态下的执行计划不允许删除"), + PLAN_UPDATE_APP_ERROR("请重新确认应用包信息:{0}"), + PLAN_UPDATE_DEVICE_ERROR("请选择{0}设备"), + PLAN_PC_DEVICE_IS_NULL("当前用例集中存在PC设备的用例,请选择PC设备"), + PLAN_DELETE_LOG_ERROR("删除计划发送日志"), + PLAN_CORN_ERROR("计划中的corn表达式格式错误,请修改"), + PLAN_CORN_TIME_TOO_LESS("计划中的corn表达式存在执行间隔1s的情况"), + PLAN_EMAIL_ERROR("计划中的邮箱地址格式错误,请修改"), + PLAN_UPFRONT_NULL("计划中的前置计划为空,请选择前置计划!"), + PLAN_UPFRONT_IS_DELETE("{0}的前置计划已经被删除,请重新选择前置计划!"), + PLAN_WEBHOOK_TOKEN_ERROR("当前token无效,执行计划失败!"), + PLAN_APP_IS_NULL_ERROR("当前计划存在移动端用例,请选择{0}应用"), + PLAN_CASE_NUMBER_ZERO("当前计划的用例为空,请选择用例"), + PLAN_UPDATE_ERROR("编辑计划异常:{0}"), + PLAN_NAME_OVERLONG("克隆【{0}】计划后的名称超长,克隆失败!"), + PLAN_EXECUTE_FAIL("计划执行失败:{0}"), + PLAN_ENTRUST_FAIL("委托失败"), + PLAN_ENV_IS_NULL("计划绑定的环境信息不存在,请检查"), + PLAN_SCRIPT_IS_NULL("计划勾选的脚本为空"), + PLAN_APP_LIST_IS_NULL("计划关联的应用为空,请选择应用!"), + PLAN_DEVICE_LIST_IS_NULL("计划关联的设备为空,请选择设备!"), + PLAN_SCRIPT_LINK_IS_NULL("计划缺少关联的用例集,请选择用例集!"), + + BATCH_INFO_IS_NULL("批次信息不存在"), + QUERY_SCRIPT_INPUT_IS_NULL("执行所需要的脚本输入项异常,请检查"), + QUERY_SCRIPT_INFO_IS_NULL("所查询的脚本信息不存在"), + CASE_APP_INFO_IS_NULL("用例的应用信息不存在"), + SCENE_NODE_EXEC_INFO_IS_NULL("场景节点执行信息不存在"), + SCENE_NEXT_NODE_INFO_IS_NULL("场景下一节点信息不存在"), + SCENE_FIRST_NODE_INFO_IS_NULL("场景首节点信息不存在"), + SCENE_NODE_INFO_ERROR("当前场景用例执行任务为接口类型,暂无直播与视频"), + TASK_INFO_IS_NULL("任务信息不存在"), + QUERY_SCRIPT_INFO_ERROR("查询任务脚本信息异常"), + PARAMS_IS_NOT_NULL("必填参数不能为空"), + SCENE_TASK_ID_IS_NOT_NULL("场景任务编号不能为空"), + QUERY_ENGINE_INFO_ERROR("获取引擎信息异常"), + QUERY_DEVICE_OFFLINE_INFO("获取设备离线信息异常"), + CREATE_CASE_DATA_ERROR("生成用例数据失败"), + DOWNLOAD_SCRIPT_FAIL("读取原脚本文件失败"), + CASE_APP_ID_IS_NULL("该平台绑定的应用编号信息为空"), + TASK_NOT_FINISH("任务还未完成"), + BATCH_NOT_FINISH("计划批次还未完成"), + INIT_TASK_INFO_FAIL("初始化任务信息失败"), + UPDATE_BATCH_INFO_FAIL("更新计划批次信息失败"), + CLEAR_SCENE_NODE_TASK_FAIL("清理场景节点任务信息失败"), + GET_SCENE_FIRST_NODE_FAIL("获取场景首节点信息失败"), + SCENE_FIRST_NODE_TASK_IS_NULL("场景首节点任务不存在"), + SCRIPT_INPUT_DATA_IS_NULL("脚本输入项数据不存在"), + EXECPLAN_ID_IS_NULL("执行计划Id为空"), + EXECPLAN_ID_IS_DELETE("执行计划{0}已被删除"), + DELETE_EXECPLANTAG_ERROR("执行计划标签删除参数为空"), + QUERY_MOBILE_DEVICE_TYPE_IS_NULL("移动设备分类信息获取异常"), + QUERY_SCRIPT_INPUT_ERROR("读取环境[{0}]脚本[{1}]输入项文件失败, {2}"), + SCRIPT_INPUT_NOT_DATA("存在没数据的输入项文件"), + SCRIPT_INPUT_DELETED("存在用例被删除任务,不可重试"), + SCRIPT_INPUT_UNSELECTED("存在任务对应输入项数据被排除"), + + PARSE_DATE_ERROR("格式化日期出错,请检查参数"), + + GET_FILE_FAIL("获取文件失败"), + + /** + * 错误码结束值 + */ + LAST(229999, "Last"); + private static final int START_CODE = 220000; + + private final Integer code; + private final String msg; + + ExecPlanError(Integer code, String msg) + { + this.code = code; + this.msg = msg; + } + + ExecPlanError(String msg) + { + this.code = ordinal() + START_CODE; + this.msg = msg; + } + + @Override + public Integer getCode() + { + return code; + } + + @Override + public String getMsg() + { + return msg; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiCommonCenterService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiCommonCenterService.java new file mode 100644 index 0000000..e7d4df0 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiCommonCenterService.java @@ -0,0 +1,23 @@ +package net.northking.cctp.executePlan.feign; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.entity.Message; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import net.northking.cctp.common.feign.FeignCctpConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@FeignClient(contextId = "apiCommonCenterService", value = "common-center", path = "/common-center/api", configuration = {FeignCctpConfig.class}) +public interface ApiCommonCenterService { + + /** + * 发送消息 + * + * @param message 消息 + * @return 是否成功 + */ + @RequestMapping(value = "/message/sendMessage", method = RequestMethod.POST) + ResponseVO sendMessage(@RequestBody Message message); + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiMonsterCommonService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiMonsterCommonService.java new file mode 100644 index 0000000..76a0032 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiMonsterCommonService.java @@ -0,0 +1,37 @@ +package net.northking.cctp.executePlan.feign; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import com.hzbank.testteam.autotest.dependencies.monsterDependency.dto.TestGroupDTO; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import net.northking.cctp.common.feign.FeignCctpConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.util.List; +import java.util.Map; + +@FeignClient(contextId = "apiMonsterCommonService", value = "monster-common", path = "/monster-common/api", configuration = {FeignCctpConfig.class}) +public interface ApiMonsterCommonService { + + /** + * 查询用户 + * + * @param loginNoList userNameList + * @return 是否成功 + */ + @RequestMapping(value = "/user/queryUserInfoByLoginNo", method = RequestMethod.POST) + ResponseVO> queryUserInfoByLoginNo(@RequestBody List loginNoList); + + /** + * 根据用户Ids获取测试小组信息, 包括小组成员信息 + * + * @param userIds + * @return + */ + @ApiOperation(value = "获取测试小组信息", notes = "获取测试小组信息,包括小组成员信息") + @RequestMapping(value = "/test-group/getTestGroup", method = RequestMethod.POST) + List getTestGroup(@ApiParam("用户id集合") @RequestBody(required = false) List userIds); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiMonsterDictService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiMonsterDictService.java new file mode 100644 index 0000000..a052601 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiMonsterDictService.java @@ -0,0 +1,41 @@ +package net.northking.cctp.executePlan.feign; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.dto.LabelValue; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; +import java.util.Map; + +@Component +@FeignClient(contextId = "apiMonsterDictService", value = "monster-common", path = "/monster-common/api/dic-item") +public interface ApiMonsterDictService { + + /** + * 根据字典类型编码获取字典条目键值对 + * + * @param catalogCode 字典类型编码 + * @return 字典条目键值对 + */ + @GetMapping(value = "/findItemsKVByCatalogCode/{catalogCode}/{hasDisabled}") + ResponseVO> findItemsKVByCatalogCode( + @PathVariable("catalogCode") String catalogCode, + @PathVariable("hasDisabled") Boolean hasDisabled); + + /** + * 根据字典类型编码集合获取字典条目键值对 + * + * @param catalogCodeList 字典类型编码集合 + * @return 字典条目键值对 + */ + @PostMapping(value = "/findItemsKVByCatalogCodeList/{status}") + ResponseVO>> findItemsKVByCatalogCodeList(@PathVariable("status") Integer status, + @RequestBody List catalogCodeList); + + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiTagService.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiTagService.java new file mode 100644 index 0000000..22695eb --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ApiTagService.java @@ -0,0 +1,61 @@ +package net.northking.cctp.executePlan.feign; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.dto.TagDto; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.form.TagForm; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.feign.FeignCctpConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@FeignClient(contextId = "apiTagService", value = "common-center", path = "/common-center/api/tag", configuration = {FeignCctpConfig.class}) +public interface ApiTagService { + + @PostMapping("/save") + ResponseVO saveTags(@RequestBody TagForm form); + + /** + * 跟据objectId获取到其对应的标签{@literal (tag)}列表 + * + * @param objectId 标签归属数据的ID + * @return 标签列表 + */ + @GetMapping("/listByObjectId/{objectId}") + List listTagByObjectId(@PathVariable("objectId") String objectId); + + @PostMapping("/removeByObjectId") + Integer removeByObjectId(@RequestParam("objectId") String objectId); + + @PostMapping("/removeByObjectIds") + Integer removeByObjectIds(@RequestBody List objectIds); + + @GetMapping("/getMatchTagObject") + ResponseVO> getMatchTagObject( + @RequestParam(value = "tagContent") String tagContent, + @RequestParam(value = "projectId") Long projectId, + @RequestParam(value = "type") Integer type); + + @GetMapping("/getMatchTagObjectByProjectIds") + ResponseVO> getMatchTagObjectByProjectIds( + @RequestParam(value = "tagContent") String tagContent, + @RequestParam(value = "projectIds") List projectIds, + @RequestParam(value = "type") Integer type); + + @GetMapping("/getTagsByTypeAndProjectId") + List getTagsByTypeAndProjectId( + @RequestParam(value = "type") Integer type, + @RequestParam(value = "projectId") Long projectId); + + @PostMapping("/removeByProjectId") + void removeByProjectId(@RequestParam("projectId") Long projectId); + + @PostMapping("/removeById") + ResponseVO removeById(@RequestParam("tagId") Long tagId); + + @ApiOperation(value = "根据标签名称和类型查询object_id集合", notes = "根据标签名称和类型查询object_id集合") + @GetMapping("/getTagDtosByNameAndType") + List getTagDtosByNameAndType(@RequestParam(value = "names") List names, + @RequestParam(value = "type") Integer type); +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/AttachmentFeignClient.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/AttachmentFeignClient.java new file mode 100644 index 0000000..82310d4 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/AttachmentFeignClient.java @@ -0,0 +1,70 @@ +package net.northking.cctp.executePlan.feign; + + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.utils.JSONUtil; +import io.swagger.annotations.ApiParam; +import net.northking.cctp.common.dto.AssociatedFilesDto; +import net.northking.cctp.common.feign.FeignCctpConfig; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.executePlan.utils.MinioPathUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@FeignClient(name = "cctp-files", path = "/cctp-files", configuration = {FeignCctpConfig.class}) +public interface AttachmentFeignClient { + + Logger logger = LoggerFactory.getLogger(AttachmentFeignClient.class); + + @PostMapping(value = "/v1/update", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper update(Map file); + + @PostMapping(value = "/pub/associatedFiles") + ResultWrapper associatedFiles(@ApiParam(value = "关联文件请求对象") @RequestBody AssociatedFilesDto associatedFilesDto); + + @GetMapping(value = "/pub/deleteFileByObjIdAndBusinessCode") + ResultWrapper deleteFileByObjId(@RequestParam("objectId") String objectId, @RequestParam("businessCode") String businessCode); + + @PostMapping(value = "/pub/deleteFileByObjIds") + ResultWrapper deleteFileByObjIds(@RequestBody List objectId); + + @PostMapping(value = "/pub/clearSceneTaskAttachments") + ResultWrapper clearSceneTaskAttachments(@RequestParam(value = "objId") String objId, + @RequestParam("businessCode") String businessCode, + @RequestParam("noDeleteFileId") String noDeleteFileId); + + default void associatedFiles(List fileIds, String objId) { + if (!CollectionUtils.isEmpty(fileIds)) { + fileIds = fileIds.stream().map(fileId -> { + if (fileId.contains("_")){ + return "/" + MinioPathUtils.idToPath(fileId)[1]; + } + return fileId; + }).collect(Collectors.toList()); + AssociatedFilesDto associatedFilesDto = new AssociatedFilesDto(); + associatedFilesDto.setObjId(objId); + associatedFilesDto.setFileIds(fileIds); + try { + ResultWrapper wrapper = this.associatedFiles(associatedFilesDto); + if (wrapper == null || !wrapper.isSuccess()) { + logger.error("文件关联失败:{}", JSONUtil.toJSONString(wrapper)); + } + } catch (Exception e) { + logger.error("文件关联失败"); + e.printStackTrace(); + } + } + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/DeviceFeignClient.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/DeviceFeignClient.java new file mode 100644 index 0000000..7a89e38 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/DeviceFeignClient.java @@ -0,0 +1,44 @@ +package net.northking.cctp.executePlan.feign; + +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.feign.FeignCctpConfig; +import net.northking.cctp.executePlan.dto.planSceneCase.CdEngineInfoDetailDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

Title: DeviceFeignClient

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/27 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@FeignClient(name = "cctp-device-mgr", path = "/cctp-device-mgr", configuration = {FeignCctpConfig.class}) +public interface DeviceFeignClient { + + /** + * 根据设备ID获取设备信息 + * @param deviceIdList 设备ID集合 + * @return 设备信息 + */ + @ApiOperation(value = "根据设备ID获取设备信息") + @PostMapping(value = "/v1/query/deviceInfo") + List> queryDeviceInfo(@RequestBody Set deviceIdList); + + @ApiOperation(value = "直播申请设备的token") + @GetMapping(value = "/v1/query/device/token/{deviceId}") + public String queryDeviceToken(@PathVariable("deviceId") String deviceId); + + @ApiOperation(value = "根据引擎id获取引擎信息") + @GetMapping(value = "/v1/query/engineInfo/{uuid}") + CdEngineInfoDetailDto queryEngineInfo(@PathVariable("uuid") String uuid); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/PlatformFeignClient.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/PlatformFeignClient.java new file mode 100644 index 0000000..34be81d --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/PlatformFeignClient.java @@ -0,0 +1,34 @@ +package net.northking.cctp.executePlan.feign; + +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.feign.FeignCctpConfig; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.executePlan.feign.dto.UserQueryDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; +import java.util.Map; + +@FeignClient(name = "cctp-platform", configuration = {FeignCctpConfig.class}, path = "/cctp-platform") +public interface PlatformFeignClient { + + @ApiOperation(value = "查询标签名") + @PostMapping(value = "/v1/query/findLabelName", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> findLabelName(@RequestBody List ids); + @ApiOperation(value = "查询标签名") + @PostMapping(value = "/query/common/queryUserInfoByLoginNo", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public Map queryUserInfoByLoginNo(@RequestBody List loginNoList); + + @ApiOperation(value = "根据名称模糊查询用户ID列表") + @PostMapping(value = "/v1/query/selectUserId", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public List selectUserId(@RequestBody UserQueryDto userQueryDto); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/PublicFeignClient.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/PublicFeignClient.java new file mode 100644 index 0000000..f650a84 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/PublicFeignClient.java @@ -0,0 +1,136 @@ +package net.northking.cctp.executePlan.feign; + +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.feign.FeignCctpConfig; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.executePlan.dto.planBatch.AppDetailDto; +import net.northking.cctp.executePlan.dto.planBatch.SceneCaseStopDto; +import net.northking.cctp.executePlan.dto.planEntrust.DeviceListDto; +import net.northking.cctp.executePlan.dto.planEntrust.EngineInfoListDto; +import net.northking.cctp.executePlan.dto.planSceneCase.AtuSceneNextNodeDto; +import net.northking.cctp.executePlan.dto.planSceneCase.AtuSceneNodeExecDto; +import net.northking.cctp.executePlan.dto.planSceneCase.SceneFirstNodeDto; +import net.northking.cctp.executePlan.dto.planTask.*; +import net.northking.cctp.executePlan.feign.dto.DictCatalogSearchDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

Title: PublicFeignClient

+ *

Description: 公共Feign客户端,无需token

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/09 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@FeignClient(name = "gateway", configuration = {FeignCctpConfig.class}) +public interface PublicFeignClient { + + /** + * 获取场景下一调度节点 + * @param reqSceneNextNodeDto 请求参数 + * @return 结果 + */ + @PostMapping(value = "/atu-script-case/pub/scene/getNextNode") + ResultWrapper getNextNode(@RequestBody @Validated AtuSceneNextNodeDto reqSceneNextNodeDto); + + /** + * 终止调度 + * @param sceneCaseStopDto 终止参数 + * @return 结果 + */ + @ApiOperation(value = "终止调度") + @PostMapping(value = "/atu-script-case/pub/scene/stopCase") + ResultWrapper stopCase(@RequestBody @Validated SceneCaseStopDto sceneCaseStopDto); + + + /** + * 根据设备类型申请引擎 + * @param deviceListDto 设备列表 + * @return 结果 + */ + @ApiOperation(value = "根据设备类型申请引擎") + @PostMapping(value = "/cctp-device-mgr/pub/query/engineByType", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + List queryEngineByType(@RequestBody List deviceListDto); + + /** + * 根据移动设备id查询设备类型 + * @param deviceIds 设备id集合 + * @return 结果集 + */ + @ApiOperation(value = "根据移动设备id查询设备类型") + @PostMapping(value = "/cctp-device-mgr/pub/query/deviceTypeByIds") + ResultWrapper>> queryDeviceType(@RequestBody List deviceIds); + + + /** + * 查询离线设备 + * @param deviceIds 设备ID集合 + * @return 离线设备ID集合 + */ + @ApiOperation(value = "查询离线设备") + @PostMapping(value = "/cctp-device-mgr/pub/device/check/status") + List> queryDeviceStatus(@RequestBody List deviceIds); + + /** + * 查询脚本输入项信息 + * @param queryDto 查询参数 环境id集合+脚本id集合 + * @return 查询结果 + */ + @ApiOperation(value = "查询脚本输入项信息") + @PostMapping(value = "/atu-script-case/pub/AtuInputSets/queryByEnvIdAndScriptId") + ResultWrapper> queryInputByEnvIdAndScriptId(@RequestBody AtuPlanInputQueryDto queryDto); + + /** + * 查询脚本详细信息 + * @param scriptIdSet 脚本id集合 + * @return 结果集 + */ + @ApiOperation(value = "查询脚本详细信息") + @PostMapping(value = "/atu-script-case/pub/script/queryScriptDetailMap") + ResultWrapper> queryScriptDetailMap(@RequestBody Set scriptIdSet); + + /** + * 获取场景首节点信息 + * @param sceneFirstNodeDto + * @return + */ + @ApiOperation(value = "获取场景首节点") + @PostMapping(value = "/atu-script-case/pub/scene/getFirstNode") + public ResultWrapper getFirstNode(@RequestBody @Validated SceneFirstNodeDto sceneFirstNodeDto); + + /** + * 查询获取字典条目 + * + * @param searchDto 字典code集合 + * @return 数据列表 + */ + @ApiOperation(value = "获取字典条目") + @PostMapping(value = "/cctp-platform/pub/query/dict-catalog-item", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResultWrapper> query(@RequestBody DictCatalogSearchDto searchDto); + + + @ApiOperation(value = "查询单元格的引用(pub)") + @PostMapping(value = "/atu-data-mgr/pub/query/selectDataUrlAndTreeName") + public QuoteData selectDataUrlAndTreeName(@RequestBody QuoteData quoteData); + + @ApiOperation("根据id集合查询app信息") + @PostMapping("/atu-script-case/pub/apps/queryByIds") + public ResultWrapper> queryAppByIds(@RequestBody List ids); + + @ApiOperation(value = "执行计划根据规则名称取值") + @GetMapping(value = "/atu-data-mgr/pub/dataRule/getRuleDataByName") + ResultWrapper getRuleDataByName(@RequestParam(value = "ruleName") String ruleName, + @RequestParam(value = "proId") String proId) throws Exception; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ScriptCaseFeignClient.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ScriptCaseFeignClient.java new file mode 100644 index 0000000..11b335c --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/ScriptCaseFeignClient.java @@ -0,0 +1,73 @@ +package net.northking.cctp.executePlan.feign; + +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.common.feign.FeignCctpConfig; +import net.northking.cctp.common.http.ResultWrapper; +import net.northking.cctp.executePlan.dto.planScript.AtuPlanScriptSaveDto; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanInputDto; +import net.northking.cctp.executePlan.feign.dto.*; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; +import java.util.Map; + +/** + *

Title: ScriptCaseFeignClient

+ *

Description: 脚本用例服务

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/09 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@FeignClient(name = "atu-script-case", path = "/atu-script-case", configuration = {FeignCctpConfig.class}) +public interface ScriptCaseFeignClient { + + @ApiOperation(value = "根据场景脚本id查询节点脚本") + @PostMapping(value = "/v1/scene/query/scriptByScene") + public ResultWrapper> querySceneScript(@RequestBody Map sceneId); + + @ApiOperation(value = "feign调用:校验计划数据是否正常") + @PostMapping(value = "/v1/script/feign/plan/checkData") + public ResultWrapper> checkPlanByCaseSet(@RequestBody @Validated AtuScriptInfoFeignDto dto); + + @ApiOperation(value = "feign调用:校验脚本类型") + @PostMapping(value = "/v1/script/feign/script/checkData") + public ResultWrapper checkScriptData(@RequestBody @Validated List scriptList); + + + + @ApiOperation(value = "feign调用:校验脚本类型") + @PostMapping(value = "/v1/script/feign/query/ScriptData") + public PlanScriptPageDto queryScriptByPlan(@RequestBody @Validated PlanPageQueryDto queryDto); + + @ApiOperation(value = "feign调用:校验脚本类型") + @PostMapping(value = "/v1/script/feign/query/queryScriptByIds") + List queryScriptByIds(@RequestBody List ids); + + @ApiOperation(value = "feign调用:查询计划勾选的脚本") + @PostMapping(value = "/v1/feign/query/scriptId", + produces = MediaType.APPLICATION_JSON_UTF8_VALUE, + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + public List feignQueryScriptId(@RequestBody AtuPlanScriptSaveDto dto); + + @ApiOperation(value = "数据列表查询") + @PostMapping(value = "/v1/script/feign/queryCode") + public String queryScriptCode(@RequestBody Map scriptMap); + + @ApiOperation(value = "feign调用:查询业务组件名称") + @PostMapping(value = "/v1/query/busComNameMap") + public ResultWrapper> queryBusComNameMap(@RequestBody List comIdList); + + @ApiOperation(value = "feign调用:根据环境和脚本查询输入项数据") + @PostMapping(value = "/pub/AtuInputSets/query/queryInputByEnvIdAndScriptIdMap") + public ResultWrapper> queryInputByEnvIdAndScriptIdMap(@RequestBody Map> envScriptMap); + + @ApiOperation(value = "feign调用:查询业务组件信息") + @PostMapping(value = "/pub/busCom/findBusComName") + public ResultWrapper findBusComName(@RequestBody String id); +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/App.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/App.java new file mode 100644 index 0000000..f8cf697 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/App.java @@ -0,0 +1,257 @@ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.util.Date; + +public class App { + /** + * 应用id
+ */ + @ApiModelProperty("应用id") + @Size(max = 32, message="应用id-id: 数据长度不能 > 32" ) + private String id; + /** + * 应用名称
+ */ + @ApiModelProperty("应用名称") + @Size(max = 32, message="应用名称-appName: 数据长度不能 > 32" ) + private String appName; + /** + * 应用大小
+ */ + @ApiModelProperty("应用大小") + @Size(max = 32, message="应用大小-appSize: 数据长度不能 > 32" ) + private String appSize; + /** + * 包名称
+ */ + @ApiModelProperty("包名称") + @Size(max = 32, message="包名称-packageName: 数据长度不能 > 32" ) + private String packageName; + /** + * 构建版本
+ */ + @ApiModelProperty("构建版本") + @Size(max = 32, message="构建版本-buildVersion: 数据长度不能 > 32" ) + private String buildVersion; + /** + * 平台类型$$$0-android,1-IOS
+ */ + @ApiModelProperty("平台类型$$$0-android,1-IOS") + @Size(max = 32, message="平台类型$$$0-android,1-IOS-platform: 数据长度不能 > 32" ) + private String platform; + /** + * 脚本文件地址
+ */ + @ApiModelProperty("脚本文件地址") + @Size(max = 512, message="脚本文件地址-appUrl: 数据长度不能 > 512" ) + private String appUrl; + /** + * 版本说明
+ */ + @ApiModelProperty("版本说明") + @Size(max = 32, message="版本说明-versionMark: 数据长度不能 > 32" ) + private String versionMark; + /** + * 设备归属对象ID
+ */ + @ApiModelProperty("设备归属对象ID") + @Size(max = 32, message="设备归属对象ID-ownerId: 数据长度不能 > 32" ) + private String ownerId; + /** + * 租户ID
+ */ + @ApiModelProperty("租户ID") + @Size(max = 32, message="租户ID-tenantId: 数据长度不能 > 32" ) + private String tenantId; + /** + * app图标
+ */ + @ApiModelProperty("app图标") + private byte[] appIcon; + /** + * 备注
+ */ + @ApiModelProperty("备注") + @Size(max = 256, message="备注-remarks: 数据长度不能 > 256" ) + private String remarks; + /** + * 版本编号
+ */ + @ApiModelProperty("版本编号") + private Integer versionCode; + /** + * activity
+ */ + @ApiModelProperty("activity") + @Size(max = 128, message="activity-activity: 数据长度不能 > 128" ) + private String activity; + /** + * 上传人
+ */ + @ApiModelProperty("上传人") + @Size(max = 32, message="上传人-createdBy: 数据长度不能 > 32" ) + private String createdBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 更新人
+ */ + @ApiModelProperty("更新人") + @Size(max = 32, message="更新人-updatedBy: 数据长度不能 > 32" ) + private String updatedBy; + /** + * 更新时间
+ */ + @ApiModelProperty("更新时间") + private Date updatedTime; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getAppSize() { + return appSize; + } + + public void setAppSize(String appSize) { + this.appSize = appSize; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getBuildVersion() { + return buildVersion; + } + + public void setBuildVersion(String buildVersion) { + this.buildVersion = buildVersion; + } + + public String getPlatform() { + return platform; + } + + public void setPlatform(String platform) { + this.platform = platform; + } + + public String getAppUrl() { + return appUrl; + } + + public void setAppUrl(String appUrl) { + this.appUrl = appUrl; + } + + public String getVersionMark() { + return versionMark; + } + + public void setVersionMark(String versionMark) { + this.versionMark = versionMark; + } + + public String getOwnerId() { + return ownerId; + } + + public void setOwnerId(String ownerId) { + this.ownerId = ownerId; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public byte[] getAppIcon() { + return appIcon; + } + + public void setAppIcon(byte[] appIcon) { + this.appIcon = appIcon; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Integer getVersionCode() { + return versionCode; + } + + public void setVersionCode(Integer versionCode) { + this.versionCode = versionCode; + } + + public String getActivity() { + return activity; + } + + public void setActivity(String activity) { + this.activity = activity; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseScriptResultDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseScriptResultDto.java new file mode 100644 index 0000000..ea8e315 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseScriptResultDto.java @@ -0,0 +1,283 @@ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.util.Date; + +public class AtuCaseScriptResultDto{ + + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 目录名称
+ */ + @ApiModelProperty("目录名称") + @Size(max = 50, message="目录名称-setName: 数据长度不能 > 50" ) + private String setName; + /** + * 系统id
+ */ + @ApiModelProperty("系统id") + @Size(max = 32, message="系统id-projectId: 数据长度不能 > 32" ) + private String projectId; + /** + * 脚本id
+ */ + @ApiModelProperty("脚本id") + @Size(max = 32, message="脚本id-scriptId: 数据长度不能 > 32" ) + private String scriptId; + /** + * 路径
+ */ + @ApiModelProperty("路径") + @Size(max = 350, message="路径-path: 数据长度不能 > 350" ) + private String path; + /** + * 是否叶子节点
+ */ + @ApiModelProperty("是否叶子节点") + private Boolean leaf; + + @ApiModelProperty("版本") + private String version; + /** + * 目录层级
+ */ + @ApiModelProperty("目录层级") + private Integer levelNo; + /** + * 目录层级
+ */ + @ApiModelProperty("层级排序") + private Integer idx; + /** + * 父节点
+ */ + @ApiModelProperty("父节点") + @Size(max = 32, message="父节点-parentId: 数据长度不能 > 32" ) + private String parentId; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + @Size(max = 32, message="创建人-createdBy: 数据长度不能 > 32" ) + private String createdBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 更新人
+ */ + @ApiModelProperty("更新人") + @Size(max = 32, message="更新人-updatedBy: 数据长度不能 > 32" ) + private String updatedBy; + /** + * 更新时间
+ */ + @ApiModelProperty("更新时间") + private Date updatedTime; + /** + * 租户id
+ */ + @ApiModelProperty("租户id") + @Size(max = 32, message="租户id-tenantId: 数据长度不能 > 32" ) + private String tenantId; + + @ApiModelProperty("负责人id") + private String principalId; + /** + * 脚本编号
+ */ + @ApiModelProperty("脚本编号") + private String scriptCode; + /** + * 脚本类型
+ */ + @ApiModelProperty("脚本类型") + @Size(max = 32, message="脚本类型-scriptType: 数据长度不能 > 32" ) + private String scriptType; + + @ApiModelProperty("创建人名称") + private String createdName; + + @ApiModelProperty("更新人名称") + private String updatedName; + + @ApiModelProperty("负责人名称") + private String principalName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSetName() { + return setName; + } + + public void setSetName(String setName) { + this.setName = setName; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public Boolean getLeaf() { + return leaf; + } + + public void setLeaf(Boolean leaf) { + this.leaf = leaf; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public Integer getLevelNo() { + return levelNo; + } + + public void setLevelNo(Integer levelNo) { + this.levelNo = levelNo; + } + + public Integer getIdx() { + return idx; + } + + public void setIdx(Integer idx) { + this.idx = idx; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getPrincipalId() { + return principalId; + } + + public void setPrincipalId(String principalId) { + this.principalId = principalId; + } + + public String getScriptCode() { + return scriptCode; + } + + public void setScriptCode(String scriptCode) { + this.scriptCode = scriptCode; + } + + public String getScriptType() { + return scriptType; + } + + public void setScriptType(String scriptType) { + this.scriptType = scriptType; + } + + public String getCreatedName() { + return createdName; + } + + public void setCreatedName(String createdName) { + this.createdName = createdName; + } + + public String getUpdatedName() { + return updatedName; + } + + public void setUpdatedName(String updatedName) { + this.updatedName = updatedName; + } + + public String getPrincipalName() { + return principalName; + } + + public void setPrincipalName(String principalName) { + this.principalName = principalName; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetAppDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetAppDto.java new file mode 100644 index 0000000..163ef61 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetAppDto.java @@ -0,0 +1,20 @@ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; + +public class AtuCaseSetAppDto { + + @ApiModelProperty("软件集合") + private List appList; + + public List getAppList() { + return appList; + } + + public void setAppList(List appList) { + this.appList = appList; + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetCheckDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetCheckDto.java new file mode 100644 index 0000000..a11a7e4 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetCheckDto.java @@ -0,0 +1,63 @@ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; +import java.util.Map; + +public class AtuCaseSetCheckDto { + + @ApiModelProperty("是否存在PC/接口用例") + private boolean hasPcCase; + + @ApiModelProperty("是否存在移动用例") + private boolean hasMobCase; + + @ApiModelProperty("是否存在安卓用例") + private boolean hasAndroidCase; + + @ApiModelProperty("是否存在IOS用例") + private boolean hasIOSCase; + + private List> appList; + + public boolean isHasAndroidCase() { + return hasAndroidCase; + } + + public void setHasAndroidCase(boolean hasAndroidCase) { + this.hasAndroidCase = hasAndroidCase; + } + + public boolean isHasIOSCase() { + return hasIOSCase; + } + + public void setHasIOSCase(boolean hasIOSCase) { + this.hasIOSCase = hasIOSCase; + } + + public boolean isHasPcCase() { + return hasPcCase; + } + + public void setHasPcCase(boolean hasPcCase) { + this.hasPcCase = hasPcCase; + } + + public boolean isHasMobCase() { + return hasMobCase; + } + + public void setHasMobCase(boolean hasMobCase) { + this.hasMobCase = hasMobCase; + } + + public List> getAppList() { + return appList; + } + + public void setAppList(List> appList) { + this.appList = appList; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetCountDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetCountDto.java new file mode 100644 index 0000000..31b0bb1 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetCountDto.java @@ -0,0 +1,28 @@ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModelProperty; + +public class AtuCaseSetCountDto { + + @ApiModelProperty("用例类型") + private String caseType; + + @ApiModelProperty("用例数量") + private Integer caseNum; + + public String getCaseType() { + return caseType; + } + + public void setCaseType(String caseType) { + this.caseType = caseType; + } + + public Integer getCaseNum() { + return caseNum; + } + + public void setCaseNum(Integer caseNum) { + this.caseNum = caseNum; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetFeignDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetFeignDto.java new file mode 100644 index 0000000..5f0f527 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetFeignDto.java @@ -0,0 +1,54 @@ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.executePlan.dto.planInfo.AppList; +import net.northking.cctp.executePlan.dto.planInfo.DeviceList; + +import java.util.List; + +public class AtuCaseSetFeignDto { + + @ApiModelProperty("用例集id") + private List setId; + + @ApiModelProperty("是否新增页面") + private boolean updateFlag; + + @ApiModelProperty("应用集合") + private List appLists; + + @ApiModelProperty("设备集合") + private List deviceLists; + + public List getSetId() { + return setId; + } + + public void setSetId(List setId) { + this.setId = setId; + } + + public boolean isUpdateFlag() { + return updateFlag; + } + + public void setUpdateFlag(boolean updateFlag) { + this.updateFlag = updateFlag; + } + + public List getAppLists() { + return appLists; + } + + public void setAppLists(List appLists) { + this.appLists = appLists; + } + + public List getDeviceLists() { + return deviceLists; + } + + public void setDeviceLists(List deviceLists) { + this.deviceLists = deviceLists; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetResultDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetResultDto.java new file mode 100644 index 0000000..5a6cf78 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuCaseSetResultDto.java @@ -0,0 +1,106 @@ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; + +public class AtuCaseSetResultDto { + @ApiModelProperty("集合id") + private List setId; + + @ApiModelProperty("是否存在PC/接口用例") + private boolean hasPcCase; + + @ApiModelProperty("是否存在移动用例") + private boolean hasMobCase; + + @ApiModelProperty("是否存在安卓用例") + private boolean hasAndroidCase; + + @ApiModelProperty("是否存在IOS用例") + private boolean hasIOSCase; + + @ApiModelProperty("是否存在B/S用例") + private boolean hasBSCase; + + @ApiModelProperty("是否存在C/S用例") + private boolean hasCSCase; + + @ApiModelProperty("是否存在接口用例") + private boolean hasInterfaceCase; + + @ApiModelProperty("用例数量") + private List atuCaseSetCountDto; + + public boolean isHasBSCase() { + return hasBSCase; + } + + public void setHasBSCase(boolean hasBSCase) { + this.hasBSCase = hasBSCase; + } + + public boolean isHasCSCase() { + return hasCSCase; + } + + public void setHasCSCase(boolean hasCSCase) { + this.hasCSCase = hasCSCase; + } + + public boolean isHasInterfaceCase() { + return hasInterfaceCase; + } + + public void setHasInterfaceCase(boolean hasInterfaceCase) { + this.hasInterfaceCase = hasInterfaceCase; + } + + public boolean isHasAndroidCase() { + return hasAndroidCase; + } + + public void setHasAndroidCase(boolean hasAndroidCase) { + this.hasAndroidCase = hasAndroidCase; + } + + public boolean isHasIOSCase() { + return hasIOSCase; + } + + public void setHasIOSCase(boolean hasIOSCase) { + this.hasIOSCase = hasIOSCase; + } + + public List getAtuCaseSetCountDto() { + return atuCaseSetCountDto; + } + + public void setAtuCaseSetCountDto(List atuCaseSetCountDto) { + this.atuCaseSetCountDto = atuCaseSetCountDto; + } + + public List getSetId() { + return setId; + } + + public void setSetId(List setId) { + this.setId = setId; + } + + public boolean isHasPcCase() { + return hasPcCase; + } + + public void setHasPcCase(boolean hasPcCase) { + this.hasPcCase = hasPcCase; + } + + public boolean isHasMobCase() { + return hasMobCase; + } + + public void setHasMobCase(boolean hasMobCase) { + this.hasMobCase = hasMobCase; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuPlanScriptReturnDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuPlanScriptReturnDto.java new file mode 100644 index 0000000..742b181 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuPlanScriptReturnDto.java @@ -0,0 +1,27 @@ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModelProperty; + +public class AtuPlanScriptReturnDto { + @ApiModelProperty("脚本id") + private String scriptId; + + @ApiModelProperty("脚本类型") + private String scriptType; + + public String getScriptId() { + return scriptId; + } + + public void setScriptId(String scriptId) { + this.scriptId = scriptId; + } + + public String getScriptType() { + return scriptType; + } + + public void setScriptType(String scriptType) { + this.scriptType = scriptType; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuSceneInfoDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuSceneInfoDetailDto.java new file mode 100644 index 0000000..05a5b09 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuSceneInfoDetailDto.java @@ -0,0 +1,138 @@ +package net.northking.cctp.executePlan.feign.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; + +@JsonSerialize +@ApiModel(description = "场景脚本列表") +public class AtuSceneInfoDetailDto implements Serializable { + /** + * 场景脚本ID
+ */ + @ApiModelProperty("场景脚本ID") + @Size(max = 32, message="场景脚本ID-id: 数据长度不能 > 32" ) + private String id; + /** + * 场景脚本名称
+ */ + @ApiModelProperty("场景脚本名称") + @Size(max = 30, message="场景脚本名称-sceneName: 数据长度不能 > 30" ) + private String sceneName; + /** + * 场景脚本编码
+ */ + @ApiModelProperty("场景脚本编码") + private String scriptCode; + /** + * 最新版本ID
+ */ + @ApiModelProperty("最新版本ID") + private Integer currentVersionId; + /** + * 场景脚本地址
+ */ + @ApiModelProperty("场景脚本地址") + @Size(max = 255, message="场景脚本地址-scriptUrl: 数据长度不能 > 255" ) + private String scriptUrl; + /** + * 场景脚本输入项数据存储的地址
+ */ + @ApiModelProperty("场景脚本输入项数据存储的地址") + @Size(max = 255, message="场景脚本输入项数据存储的地址-dataUrl: 数据长度不能 > 255" ) + private String dataUrl; + /** + * 系统ID
+ */ + @ApiModelProperty("系统ID") + @Size(max = 32, message="系统ID-projectId: 数据长度不能 > 32" ) + private String projectId; + + /** + * 系统名称
+ */ + @ApiModelProperty("系统名称") + @Size(max = 32, message="系统ID-projectId: 数据长度不能 > 32" ) + private String projectName; + /** + * 租户号
+ */ + @ApiModelProperty("租户号") + @Size(max = 32, message="租户号-tenantId: 数据长度不能 > 32" ) + private String tenantId; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSceneName() { + return sceneName; + } + + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + + public String getScriptCode() { + return scriptCode; + } + + public void setScriptCode(String scriptCode) { + this.scriptCode = scriptCode; + } + + public Integer getCurrentVersionId() { + return currentVersionId; + } + + public void setCurrentVersionId(Integer currentVersionId) { + this.currentVersionId = currentVersionId; + } + + public String getScriptUrl() { + return scriptUrl; + } + + public void setScriptUrl(String scriptUrl) { + this.scriptUrl = scriptUrl; + } + + public String getDataUrl() { + return dataUrl; + } + + public void setDataUrl(String dataUrl) { + this.dataUrl = dataUrl; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfo.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfo.java new file mode 100644 index 0000000..756fe4c --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfo.java @@ -0,0 +1,255 @@ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.util.Date; + +public class AtuScriptInfo { + /** + * 脚本ID
+ */ + @ApiModelProperty("脚本ID") + @Size(max = 32, message="脚本ID-id: 数据长度不能 > 32" ) + private String id; + /** + * 脚本目录ID
+ */ + @ApiModelProperty("脚本目录ID") + @Size(max = 32, message="脚本目录ID-groupId: 数据长度不能 > 32" ) + private String groupId; + /** + * 脚本名称
+ */ + @ApiModelProperty("脚本名称") + @Size(max = 90, message="脚本名称-scriptName: 数据长度不能 > 90" ) + private String scriptName; + /** + * 脚本编号
+ */ + @ApiModelProperty("脚本编号") + private String scriptCode; + /** + * 脚本类型
+ */ + @ApiModelProperty("脚本类型") + @Size(max = 32, message="脚本类型-scriptType: 数据长度不能 > 32" ) + private String scriptType; + /** + * 最新版本ID
+ */ + @ApiModelProperty("最新版本ID") + private Integer latestVersionId; + /** + * 脚本地址
+ */ + @ApiModelProperty("脚本地址") + @Size(max = 255, message="脚本地址-scriptUrl: 数据长度不能 > 255" ) + private String scriptUrl; + /** + * 脚本快照数据地址
+ */ + @ApiModelProperty("脚本快照数据地址") + @Size(max = 255, message="脚本快照数据地址-dataUrl: 数据长度不能 > 255" ) + private String dataUrl; + /** + * 是否删除
+ */ + @ApiModelProperty("是否删除") + @Size(max = 1, message="是否删除-isDeleted: 数据长度不能 > 1" ) + private String isDeleted; + /** + * 系统ID
+ */ + @ApiModelProperty("系统ID") + @Size(max = 32, message="系统ID-projectId: 数据长度不能 > 32" ) + private String projectId; + /** + * 租户号
+ */ + @ApiModelProperty("租户号") + @Size(max = 32, message="租户号-tenantId: 数据长度不能 > 32" ) + private String tenantId; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + @Size(max = 32, message="创建人-createdBy: 数据长度不能 > 32" ) + private String createdBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 更新人
+ */ + @ApiModelProperty("更新人") + @Size(max = 32, message="更新人-updatedBy: 数据长度不能 > 32" ) + private String updatedBy; + /** + * 更新时间
+ */ + @ApiModelProperty("更新时间") + private Date updatedTime; + /** + * 应用ID
+ */ + @ApiModelProperty("应用ID") + @Size(max = 32, message="应用ID-appId: 数据长度不能 > 32" ) + private String appId; + /** + * 应用包名
+ */ + @ApiModelProperty("应用包名") + private String appPackage; + /** + * 应用平台
+ */ + @ApiModelProperty("应用平台") + private String platform; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public String getScriptName() { + return scriptName; + } + + public void setScriptName(String scriptName) { + this.scriptName = scriptName; + } + + public String getScriptCode() { + return scriptCode; + } + + public void setScriptCode(String scriptCode) { + this.scriptCode = scriptCode; + } + + public String getScriptType() { + return scriptType; + } + + public void setScriptType(String scriptType) { + this.scriptType = scriptType; + } + + public Integer getLatestVersionId() { + return latestVersionId; + } + + public void setLatestVersionId(Integer latestVersionId) { + this.latestVersionId = latestVersionId; + } + + public String getScriptUrl() { + return scriptUrl; + } + + public void setScriptUrl(String scriptUrl) { + this.scriptUrl = scriptUrl; + } + + public String getDataUrl() { + return dataUrl; + } + + public void setDataUrl(String dataUrl) { + this.dataUrl = dataUrl; + } + + public String getIsDeleted() { + return isDeleted; + } + + public void setIsDeleted(String isDeleted) { + this.isDeleted = isDeleted; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppPackage() { + return appPackage; + } + + public void setAppPackage(String appPackage) { + this.appPackage = appPackage; + } + + public String getPlatform() { + return platform; + } + + public void setPlatform(String platform) { + this.platform = platform; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfoDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfoDetailDto.java new file mode 100644 index 0000000..83c7999 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfoDetailDto.java @@ -0,0 +1,20 @@ +package net.northking.cctp.executePlan.feign.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; + +@JsonSerialize +@ApiModel(description = "脚本信息表") +public class AtuScriptInfoDetailDto extends AtuScriptInfo implements Serializable +{ + @ApiModelProperty("版本名称") + private String versionName; + @ApiModelProperty("创建人") + private String creator; + @ApiModelProperty("更新人") + private String modifier; + +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfoFeignDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfoFeignDto.java new file mode 100644 index 0000000..378e5a9 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfoFeignDto.java @@ -0,0 +1,42 @@ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.executePlan.dto.planInfo.AppList; +import net.northking.cctp.executePlan.dto.planInfo.DeviceList; + +import java.util.List; + +public class AtuScriptInfoFeignDto { + @ApiModelProperty("脚本id集合") + private List scriptId; + + @ApiModelProperty("应用集合") + private List appLists; + + @ApiModelProperty("设备集合") + private List deviceLists; + + public List getScriptId() { + return scriptId; + } + + public void setScriptId(List scriptId) { + this.scriptId = scriptId; + } + + public List getAppLists() { + return appLists; + } + + public void setAppLists(List appLists) { + this.appLists = appLists; + } + + public List getDeviceLists() { + return deviceLists; + } + + public void setDeviceLists(List deviceLists) { + this.deviceLists = deviceLists; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfoResultDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfoResultDto.java new file mode 100644 index 0000000..ce0c1e9 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/AtuScriptInfoResultDto.java @@ -0,0 +1,100 @@ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModelProperty; + +import java.util.Map; + +public class AtuScriptInfoResultDto { + @ApiModelProperty("是否存在PC/接口脚本") + private boolean hasPC = false; + + @ApiModelProperty("是否存在移动脚本") + private boolean hasMob = false; + + @ApiModelProperty("是否存在安卓脚本") + private boolean hasAndroid = false; + ; + + @ApiModelProperty("是否存在IOS脚本") + private boolean hasIOS = false; + ; + + @ApiModelProperty("是否存在B/S脚本") + private boolean hasBS = false; + ; + + @ApiModelProperty("是否存在C/S脚本") + private boolean hasCS = false; + ; + + @ApiModelProperty("是否存在接口脚本") + private boolean hasAPI = false; + ; + + @ApiModelProperty("脚本Map") + private Map scriptMap; + + public Map getScriptMap() { + return scriptMap; + } + + public void setScriptMap(Map scriptMap) { + this.scriptMap = scriptMap; + } + + public boolean isHasPC() { + return hasPC; + } + + public void setHasPC(boolean hasPC) { + this.hasPC = hasPC; + } + + public boolean isHasMob() { + return hasMob; + } + + public void setHasMob(boolean hasMob) { + this.hasMob = hasMob; + } + + public boolean isHasAndroid() { + return hasAndroid; + } + + public void setHasAndroid(boolean hasAndroid) { + this.hasAndroid = hasAndroid; + } + + public boolean isHasIOS() { + return hasIOS; + } + + public void setHasIOS(boolean hasIOS) { + this.hasIOS = hasIOS; + } + + public boolean isHasBS() { + return hasBS; + } + + public void setHasBS(boolean hasBS) { + this.hasBS = hasBS; + } + + public boolean isHasCS() { + return hasCS; + } + + public void setHasCS(boolean hasCS) { + this.hasCS = hasCS; + } + + public boolean isHasAPI() { + return hasAPI; + } + + public void setHasAPI(boolean hasAPI) { + this.hasAPI = hasAPI; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/CltDictItem.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/CltDictItem.java new file mode 100644 index 0000000..b2267a3 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/CltDictItem.java @@ -0,0 +1,355 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2021 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import net.northking.cctp.common.db.entity.Entity; +import net.northking.cctp.common.saas.db.TenantPartition; + +import javax.validation.constraints.Size; +import java.util.Date; + + +/** + * 字典条目 + * + *

文件内容由代码生成器产生,请不要手动修改!
+ * createdate: 2021-03-02 14:07:04
+ * @author: maven-cctp-plugin
+ * @since: 1.0
+ */ +@ApiModel(description = "字典条目") +public class CltDictItem extends TenantPartition implements Entity +{ + public static final String KEY_id = "id"; + public static final String KEY_idx = "idx"; + public static final String KEY_itemCode = "itemCode"; + public static final String KEY_itemName = "itemName"; + public static final String KEY_catalogId = "catalogId"; + public static final String KEY_dictLocal = "dictLocal"; + public static final String KEY_systemDefault = "systemDefault"; + public static final String KEY_enabled = "enabled"; + public static final String KEY_createdBy = "createdBy"; + public static final String KEY_createdTime = "createdTime"; + public static final String KEY_updatedBy = "updatedBy"; + public static final String KEY_updatedTime = "updatedTime"; + public static final String KEY_tenantId = "tenantId"; + + /** + * 主键ID
+ */ + @ApiModelProperty("主键ID") + @Size(max = 32, message="主键ID-id: 数据长度不能 > 32" ) + private String id; + /** + * 序号
+ */ + @ApiModelProperty("序号") + private Integer idx; + /** + * 字典条目代码
+ */ + @ApiModelProperty("字典条目代码") + @Size(max = 30, message="字典条目代码-itemCode: 数据长度不能 > 30" ) + private String itemCode; + /** + * 字典条目名称
+ */ + @ApiModelProperty("字典条目名称") + @Size(max = 255, message="字典条目名称-itemName: 数据长度不能 > 255" ) + private String itemName; + /** + * 字典类型ID
+ */ + @ApiModelProperty("字典类型ID") + @Size(max = 32, message="字典类型ID-catalogId: 数据长度不能 > 32" ) + private String catalogId; + /** + * 语言地区
+ */ + @ApiModelProperty("语言地区") + @Size(max = 20, message="语言地区-dictLocal: 数据长度不能 > 20" ) + private String dictLocal; + /** + * 是否系统默认
+ */ + @ApiModelProperty("是否系统默认") + private Boolean systemDefault; + /** + * 是否启用
+ */ + @ApiModelProperty("是否启用") + private Boolean enabled; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + @Size(max = 32, message="创建人-createdBy: 数据长度不能 > 32" ) + private String createdBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 更新人
+ */ + @ApiModelProperty("更新人") + @Size(max = 32, message="更新人-updatedBy: 数据长度不能 > 32" ) + private String updatedBy; + /** + * 更新时间
+ */ + @ApiModelProperty("更新时间") + private Date updatedTime; + /** + * 租户
+ */ + @ApiModelProperty("租户") + @Size(max = 32, message="租户-tenantId: 数据长度不能 > 32" ) + private String tenantId; + + /** + * 主键ID
+ */ + public String getId() + { + return id; + } + + /** + * 主键ID
+ * + * @param id 主键ID + */ + public void setId(String id) + { + this.id = id; + } + /** + * 序号
+ */ + public Integer getIdx() + { + return idx; + } + + /** + * 序号
+ * + * @param idx 序号 + */ + public void setIdx(Integer idx) + { + this.idx = idx; + } + /** + * 字典条目代码
+ */ + public String getItemCode() + { + return itemCode; + } + + /** + * 字典条目代码
+ * + * @param itemCode 字典条目代码 + */ + public void setItemCode(String itemCode) + { + this.itemCode = itemCode; + } + /** + * 字典条目名称
+ */ + public String getItemName() + { + return itemName; + } + + /** + * 字典条目名称
+ * + * @param itemName 字典条目名称 + */ + public void setItemName(String itemName) + { + this.itemName = itemName; + } + /** + * 字典类型ID
+ */ + public String getCatalogId() + { + return catalogId; + } + + /** + * 字典类型ID
+ * + * @param catalogId 字典类型ID + */ + public void setCatalogId(String catalogId) + { + this.catalogId = catalogId; + } + /** + * 语言地区
+ */ + public String getDictLocal() + { + return dictLocal; + } + + /** + * 语言地区
+ * + * @param dictLocal 语言地区 + */ + public void setDictLocal(String dictLocal) + { + this.dictLocal = dictLocal; + } + /** + * 是否系统默认
+ */ + public Boolean getSystemDefault() + { + return systemDefault; + } + + /** + * 是否系统默认
+ * + * @param systemDefault 是否系统默认 + */ + public void setSystemDefault(Boolean systemDefault) + { + this.systemDefault = systemDefault; + } + /** + * 是否启用
+ */ + public Boolean getEnabled() + { + return enabled; + } + + /** + * 是否启用
+ * + * @param enabled 是否启用 + */ + public void setEnabled(Boolean enabled) + { + this.enabled = enabled; + } + /** + * 创建人
+ */ + public String getCreatedBy() + { + return createdBy; + } + + /** + * 创建人
+ * + * @param createdBy 创建人 + */ + public void setCreatedBy(String createdBy) + { + this.createdBy = createdBy; + } + /** + * 创建时间
+ */ + public Date getCreatedTime() + { + if(createdTime != null) + { + return (Date)createdTime.clone(); + } + return null; + } + + /** + * 创建时间
+ * + * @param createdTime 创建时间 + */ + public void setCreatedTime(Date createdTime) + { + if(createdTime != null) + { + this.createdTime = (Date)createdTime.clone(); + } + } + /** + * 更新人
+ */ + public String getUpdatedBy() + { + return updatedBy; + } + + /** + * 更新人
+ * + * @param updatedBy 更新人 + */ + public void setUpdatedBy(String updatedBy) + { + this.updatedBy = updatedBy; + } + /** + * 更新时间
+ */ + public Date getUpdatedTime() + { + if(updatedTime != null) + { + return (Date)updatedTime.clone(); + } + return null; + } + + /** + * 更新时间
+ * + * @param updatedTime 更新时间 + */ + public void setUpdatedTime(Date updatedTime) + { + if(updatedTime != null) + { + this.updatedTime = (Date)updatedTime.clone(); + } + } + /** + * 租户
+ */ + public String getTenantId() + { + return tenantId; + } + + /** + * 租户
+ * + * @param tenantId 租户 + */ + public void setTenantId(String tenantId) + { + this.tenantId = tenantId; + } + + public CltDictItem() + { + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/DictCatalogSearchDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/DictCatalogSearchDto.java new file mode 100644 index 0000000..c938505 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/DictCatalogSearchDto.java @@ -0,0 +1,35 @@ +package net.northking.cctp.executePlan.feign.dto; + +import java.io.Serializable; +import java.util.List; + +/** + *

Title: DictCatalogSearchDto

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/9/26 20:40 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class DictCatalogSearchDto implements Serializable { + + private List resultList; + private String tenantId; + + public List getResultList() { + return resultList; + } + + public void setResultList(List resultList) { + this.resultList = resultList; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/MdBusComponentInfoDetailDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/MdBusComponentInfoDetailDto.java new file mode 100644 index 0000000..5c6f62a --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/MdBusComponentInfoDetailDto.java @@ -0,0 +1,304 @@ +/* +* Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved. +* +*/ +package net.northking.cctp.executePlan.feign.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Date; + +/** +* Restful接口--资源详情--数据传输对象:业务组件参数信息_编辑 +* +* createdate: 2022-10-10 16:53:15
+* @author: maven-cctp-plugin
+* @since: 1.0
+*/ +@JsonSerialize +@ApiModel(description = "业务组件列表") +public class MdBusComponentInfoDetailDto implements Serializable +{ + + /** + * 主键
+ */ + @ApiModelProperty("主键") + @Size(max = 32, message="主键-id: 数据长度不能 > 32" ) + private String id; + /** + * 组件名称
+ */ + @ApiModelProperty("组件名称") + private String comName; + /** + * 组件类型1-接口,2-pcbs,3-pccs,4-安卓,5-ios
+ */ + @ApiModelProperty("组件类型1-接口,2-pcbs,3-pccs,4-安卓,5-ios") + private Integer comType; + /** + * 说明
+ */ + @ApiModelProperty("说明") + private String memo; + /** + * 系统空间
+ */ + @ApiModelProperty("系统空间") + private String projectId; + /** + * 脚本内容
+ */ + @ApiModelProperty("脚本内容") + private String scriptContent; + /** + * 是否推荐使用0-推荐1-不推荐
+ */ + @ApiModelProperty("是否推荐使用0-推荐1-不推荐") + private Integer isDeprecated; + /** + * 组件复杂度
+ */ + @ApiModelProperty("组件复杂度") + private Integer complexity; + /** + * 逻辑删除0-可用1-已删除
+ */ + @ApiModelProperty("逻辑删除0-可用1-已删除") + private Integer isDeleted; + /** + * 组件版本号
+ */ + @ApiModelProperty("组件版本号") + private String comVersion; + /** + * 目录树id
+ */ + @ApiModelProperty("目录树id") + private String treeId; + /** + * 创建人
+ */ + @ApiModelProperty("创建人") + private String createdBy; + /** + * 创建时间
+ */ + @ApiModelProperty("创建时间") + private Date createdTime; + /** + * 修改人
+ */ + @ApiModelProperty("修改人") + private String updatedBy; + /** + * 修改时间
+ */ + @ApiModelProperty("修改时间") + private Date updatedTime; + /** + * 租户id
+ */ + @ApiModelProperty("租户id") + private String tenantId; + + @ApiModelProperty("参数json") + private String paramJson; + @ApiModelProperty("组件json") + private String comJson; + + /** + * 共享标识0-未共享,1-已共享
+ */ + @ApiModelProperty("共享标识0-未共享,1-已共享") + private Integer sharedFlag; + /** + * 负责人id
+ */ + @ApiModelProperty("负责人id") + @Size(max = 32, message="负责人id-principalId: 数据长度不能 > 32" ) + private String principalId; + + private String sharedBy; + private Date sharedTime; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getComName() { + return comName; + } + + public void setComName(String comName) { + this.comName = comName; + } + + public Integer getComType() { + return comType; + } + + public void setComType(Integer comType) { + this.comType = comType; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getScriptContent() { + return scriptContent; + } + + public void setScriptContent(String scriptContent) { + this.scriptContent = scriptContent; + } + + public Integer getIsDeprecated() { + return isDeprecated; + } + + public void setIsDeprecated(Integer isDeprecated) { + this.isDeprecated = isDeprecated; + } + + public Integer getComplexity() { + return complexity; + } + + public void setComplexity(Integer complexity) { + this.complexity = complexity; + } + + public Integer getIsDeleted() { + return isDeleted; + } + + public void setIsDeleted(Integer isDeleted) { + this.isDeleted = isDeleted; + } + + public String getComVersion() { + return comVersion; + } + + public void setComVersion(String comVersion) { + this.comVersion = comVersion; + } + + public String getTreeId() { + return treeId; + } + + public void setTreeId(String treeId) { + this.treeId = treeId; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getParamJson() { + return paramJson; + } + + public void setParamJson(String paramJson) { + this.paramJson = paramJson; + } + + public String getComJson() { + return comJson; + } + + public void setComJson(String comJson) { + this.comJson = comJson; + } + + public Integer getSharedFlag() { + return sharedFlag; + } + + public void setSharedFlag(Integer sharedFlag) { + this.sharedFlag = sharedFlag; + } + + public String getPrincipalId() { + return principalId; + } + + public void setPrincipalId(String principalId) { + this.principalId = principalId; + } + + public String getSharedBy() { + return sharedBy; + } + + public void setSharedBy(String sharedBy) { + this.sharedBy = sharedBy; + } + + public Date getSharedTime() { + return sharedTime; + } + + public void setSharedTime(Date sharedTime) { + this.sharedTime = sharedTime; + } +} \ No newline at end of file diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/PlanPageQueryDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/PlanPageQueryDto.java new file mode 100644 index 0000000..34e8f07 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/PlanPageQueryDto.java @@ -0,0 +1,13 @@ +package net.northking.cctp.executePlan.feign.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class PlanPageQueryDto { + + private List allList; + + private String setName; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/PlanScriptPageDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/PlanScriptPageDto.java new file mode 100644 index 0000000..57bac4d --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/PlanScriptPageDto.java @@ -0,0 +1,13 @@ +package net.northking.cctp.executePlan.feign.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class PlanScriptPageDto { + + private List resultDtoList; + + private AtuScriptInfoResultDto infoDto; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/PlanScriptQueryPageDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/PlanScriptQueryPageDto.java new file mode 100644 index 0000000..2c70d8a --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/PlanScriptQueryPageDto.java @@ -0,0 +1,13 @@ +package net.northking.cctp.executePlan.feign.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class PlanScriptQueryPageDto { + + private String planId; + + private List scriptList; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/UserQueryDto.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/UserQueryDto.java new file mode 100644 index 0000000..1c847bc --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/feign/dto/UserQueryDto.java @@ -0,0 +1,18 @@ +package net.northking.cctp.executePlan.feign.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class UserQueryDto { + /** + * 用户中文名称
+ */ + @ApiModelProperty("用户中文名称") + private String userChnName; + @ApiModelProperty(value = "租户id") + private String tenantId; + + @ApiModelProperty("用户中文名称") + private String userChnNames; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/job/PlanBatchTaskDataUpdateJob.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/job/PlanBatchTaskDataUpdateJob.java new file mode 100644 index 0000000..9a34b1d --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/job/PlanBatchTaskDataUpdateJob.java @@ -0,0 +1,711 @@ +package net.northking.cctp.executePlan.job; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.thread.ExecutorBuilder; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import net.northking.cctp.common.enums.FileBusinessTypeEnum; +import net.northking.cctp.common.s3.NKFile; +import net.northking.cctp.common.s3.SimpleStorageService; +import net.northking.cctp.common.security.authentication.NKSecurityContext; +import net.northking.cctp.executePlan.api.service.AtuPlanInfoApiService; +import net.northking.cctp.executePlan.api.service.AtuPlanTaskApiService; +import net.northking.cctp.executePlan.api.service.MessageCenterService; +import net.northking.cctp.executePlan.api.third.feilang.service.FeiLangService; +import net.northking.cctp.executePlan.constants.MsgConstant; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.constants.RabbitConstant; +import net.northking.cctp.executePlan.constants.RedisConstant; +import net.northking.cctp.executePlan.db.entity.*; +import net.northking.cctp.executePlan.db.service.*; +import net.northking.cctp.executePlan.dto.planBatch.*; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanRunDto; +import net.northking.cctp.executePlan.enums.MobilePlatformEnum; +import net.northking.cctp.executePlan.feign.PublicFeignClient; +import net.northking.cctp.executePlan.utils.MinioPathUtils; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.AmqpAdmin; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; + +import java.io.File; +import java.util.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + *

Title: PlanBatchTaskDataUpdateJob

+ *

Description: 计划批次任务数据更新

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/13 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +@EnableScheduling +@Configuration +public class PlanBatchTaskDataUpdateJob { + + private final static Logger logger = LoggerFactory.getLogger(PlanBatchTaskDataUpdateJob.class); + + @Autowired + private AtuPlanInfoService planInfoService; + + @Autowired + private AtuPlanBatchService planBatchService; + + @Autowired + private AtuPlanTaskService planTaskService; + + @Autowired + private AtuPlanTaskApiService planTaskApiService; + + @Autowired + private AtuPlanInfoApiService planInfoApiService; + + @Autowired + private AmqpAdmin amqpAdmin; + + @Autowired + private AtuPlanScriptLinkService planScriptLinkService; + + @Autowired + private AtuPlanAppLinkService planAppLinkService; + + @Autowired + private AtuPlanDeviceLinkService planDeviceLinkService; + + @Autowired + private PublicFeignClient publicFeignClient; + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private FeiLangService feiLangService; + + @Autowired + private SimpleStorageService simpleStorageService; + + @Autowired + private AtuPlanEnvLinkService planEnvLinkService; + + @Autowired + MessageCenterService messageCenterService; + + @Autowired + private RedissonClient redisson; + + public static final int EXECUTOR_CORE_POOL_SIZE = 2 * 2 + 2; + public static final int EXECUTOR_MAX_POOL_SIZE = 10; + public static final int EXECUTOR_LINKED_BLOCKING_SIZE = 50; + + private static final ExecutorService executor = ExecutorBuilder.create() + .setCorePoolSize(EXECUTOR_CORE_POOL_SIZE) + .setMaxPoolSize(EXECUTOR_MAX_POOL_SIZE) + .setWorkQueue(new LinkedBlockingDeque<>(EXECUTOR_LINKED_BLOCKING_SIZE)) + .build(); + + @Scheduled(fixedRateString = "${atu.plan.batchCountUpdateJob:20000}") + private void batchSumDataUpdate() { + logger.debug("同步缓存中计划批次统计数据----start----"); + // 1. 获取缓存中所有的批次统计数据 + String patternKey = RedisConstant.CLUSTER_KEY_PREFIX + "*" + RedisConstant.CLUSTER_KEY_SUFFIX + + RedisConstant.BATCH_SCRIPT_SUM_KEY + "*"; + Set batchKeySet = redisTemplate.keys(patternKey); + if (CollUtil.isEmpty(batchKeySet)) { + logger.debug("不存在批次缓存统计数据----end----"); + return; + } + logger.debug("缓存中计划批次统计数据量 => " + batchKeySet.size()); + batchKeySet.forEach(key -> { + Map entries = redisTemplate.opsForHash().entries(key); + if (CollUtil.isEmpty(entries)) { + logger.info("缓存[" + key + "]中无统计数据"); + return; + } + String batchId = key.substring(key.lastIndexOf(":") + 1); + String clusterKeyPrefix = RedisConstant.CLUSTER_KEY_PREFIX + batchId.substring(0, 4) + + RedisConstant.CLUSTER_KEY_SUFFIX; + // 2. 遍历判断该批次是否已完成 + int waitTotal = 0; + Object waitStatusObj = entries.get(clusterKeyPrefix + PlanConstant.TASK_WAIT_EXECUTE_STATUS); + if (ObjectUtil.isNotNull(waitStatusObj)) { + waitTotal = Integer.parseInt(waitStatusObj.toString()); + } + int runningTotal = 0; + Object runningStatusObj = entries.get(clusterKeyPrefix + PlanConstant.TASK_START_EXECUTE_STATUS); + if (ObjectUtil.isNotNull(runningStatusObj)) { + runningTotal = Integer.parseInt(runningStatusObj.toString()); + } + + if (waitTotal != 0 || runningTotal != 0) { + // 该批次还未完成 + return; + } + // 2.1. 完成则更新数据库中的批次统计数据 + int total = 0; + Object scriptTotalObj = entries.get(clusterKeyPrefix + PlanConstant.SCRIPT_TOTAL); + if (ObjectUtil.isNotNull(scriptTotalObj)) { + total = Integer.parseInt(scriptTotalObj.toString()); + } + int successTotal = 0; + Object successStatusObj = entries.get(clusterKeyPrefix + PlanConstant.TASK_EXECUTE_SUCCESS_STATUS); + if (ObjectUtil.isNotNull(successStatusObj)) { + successTotal = Integer.parseInt(successStatusObj.toString()); + } + int failTotal = 0; + Object failStatusObj = entries.get(clusterKeyPrefix + PlanConstant.TASK_EXECUTE_FAIL_STATUS); + if (ObjectUtil.isNotNull(failStatusObj)) { + failTotal = Integer.parseInt(failStatusObj.toString()); + if (failTotal < 0) { + failTotal = 0; + } + } + int assertFailTotal = 0; + Object assertFailStatusObj = entries.get(clusterKeyPrefix + PlanConstant.TASK_ASSERT_FAIL_STATUS); + if (ObjectUtil.isNotNull(assertFailStatusObj)) { + assertFailTotal = Integer.parseInt(assertFailStatusObj.toString()); + } + int timeoutTotal = 0; + Object timeoutStatusObj = entries.get(clusterKeyPrefix + PlanConstant.TASK_TIMEOUT_STATUS); + if (ObjectUtil.isNotNull(timeoutStatusObj)) { + timeoutTotal = Integer.parseInt(timeoutStatusObj.toString()); + } + int cancelTotal = 0; + Object cancelStatusObj = entries.get(clusterKeyPrefix + PlanConstant.TASK_CANCEL_STATUS); + if (ObjectUtil.isNotNull(cancelStatusObj)) { + cancelTotal = Integer.parseInt(cancelStatusObj.toString()); + } + + // 更新批次表 + AtuPlanBatch planBatch = new AtuPlanBatch(); + planBatch.setId(batchId); + planBatch.setSuccessNum(successTotal); + planBatch.setExecFailNum(failTotal); + planBatch.setAssertFailNum(assertFailTotal); + planBatch.setTimeoutNum(timeoutTotal); + planBatch.setCancelNum(cancelTotal); + + planBatch.setSuccessRate(MsgConstant.PLAN_BATCH_SUCCESS_RATE); + if (successTotal > 0 && total > 0) { + planBatch.setSuccessRate(NumberUtil.decimalFormat(MsgConstant.PATTERN_HASH_DOT_HASH_HASH, NumberUtil.div(successTotal, total))); + } + // 查询批次最先开始执行的任务的开始时间 + if (planBatch.getStartTime() == null) { + Long firstTaskStartTime = planTaskService.queryBatchFirstTaskStartTime(batchId); + if (ObjectUtil.isNotNull(firstTaskStartTime)) { + planBatch.setStartTime(new Date(firstTaskStartTime)); + } + } + // 任务状态判断 + String planStatus = ""; + if (cancelTotal > 0) { + planStatus = PlanConstant.PLAN_CANCEL_STATUS; + // 修改为取消状态 + planBatch.setStatus(PlanConstant.BATCH_CANCEL_STATUS); + } else { + planStatus = PlanConstant.PLAN_FINISH_STATUS; + // 修改为已完成状态 + planBatch.setStatus(PlanConstant.BATCH_FINISH_STATUS); + } + + // 查询批次最后执行完成的任务的结束时间 + Long lastTaskEndTime = planTaskService.queryBatchLastTaskEndTime(batchId); + if (ObjectUtil.isNotNull(lastTaskEndTime)) { + planBatch.setEndTime(new Date(lastTaskEndTime)); + } + logger.debug("更新批次信息"); + planBatchService.updateByPrimaryKey(planBatch); + + // 删除任务队列 + amqpAdmin.deleteQueue(RabbitConstant.TASK_EXEC_QUEUE_PC_KEY + batchId); + // 移动端删除各个平台对于的队列 + MobilePlatformEnum[] platformEnums = MobilePlatformEnum.values(); + for (MobilePlatformEnum platformEnum : platformEnums) { + amqpAdmin.deleteQueue(RabbitConstant.TASK_EXEC_QUEUE_MOB_KEY + platformEnum.getName() + "." + batchId); + } + amqpAdmin.deleteQueue(RabbitConstant.TASK_EXEC_QUEUE_API_KEY + batchId); + + //获取更新后的批次信息 + AtuPlanBatchDetailDto atuPlanBatchDetailDto = planBatchService.queryBatchDetailById(planBatch.getId()); + + // 判断是否计划最后一批次 + AtuPlanInfo planInfo = planInfoService.queryByLastBatchId(batchId); + if (ObjectUtil.isNotNull(planInfo)) { + // 是则更新计划表 + planInfo.setStatus(planStatus); + planInfo.setWaitingNum(waitTotal); + planInfo.setRunningNum(runningTotal); + planInfo.setSuccessNum(successTotal); + planInfo.setExecFailNum(failTotal); + planInfo.setAssertFailNum(assertFailTotal); + planInfo.setTimeoutNum(timeoutTotal); + planInfo.setCancelNum(cancelTotal); + //不用代码生成的方法 + planInfoService.updatePlanResultById(planInfo); + } + + executor.execute(() -> { + // 保存设备性能数据 + saveDevicePerData(atuPlanBatchDetailDto); + }); + + // 2.2. 删除缓存中已完成批次的记录 + logger.debug("删除批次统计缓存 => " + key); + redisTemplate.delete(key); + + // 收尾处理 + AtuPlanInfo batchPlanInfo = planInfoService.findByBatchId(batchId); + if (batchPlanInfo != null) { + handleEnd(batchPlanInfo, atuPlanBatchDetailDto); + } + }); + logger.debug("同步缓存中计划批次统计数据----end----"); + } + + /** + * 失败重试检查 + * @param planInfo 计划信息 + * @param planBatch 批次信息 + * @return 是否需要重试 + */ + private boolean failRetryCheck(AtuPlanInfo planInfo, AtuPlanBatch planBatch) { + if (planInfo.getFailRetry() && PlanConstant.TASK_RETRY_STRATEGY_PACKAGE.equals(planInfo.getRetryStrategy())) { + Object o = redisTemplate.opsForHash().get(RedisConstant.PLAN_BATCH_RETRY_COUNT, planBatch.getId()); + if (o != null) { + int count = Integer.parseInt(o.toString()); + logger.info("计划-批次【{}-{}】重试次数还剩下:{}次", planInfo.getPlanName(), planBatch.getBatch(), count); + if (count == 0) { // 重试已完成 + redisTemplate.opsForHash().delete(RedisConstant.PLAN_BATCH_RETRY_COUNT, planBatch.getId()); + return false; + } + // 查询批次下的失败任务 + List taskIds = planTaskService.queryAllFailIdList(planBatch.getId()); + List resultIds = new ArrayList<>(taskIds); + BatchRetryDto dto = new BatchRetryDto(); + dto.setTaskIdList(resultIds); + logger.info("计划-批次【{}-{}】需要重试的任务数量:{}", planInfo.getPlanName(), planBatch.getBatch(), taskIds.size()); + if (!taskIds.isEmpty()) { + redisTemplate.opsForHash().put(RedisConstant.PLAN_BATCH_RETRY_COUNT, planBatch.getId(), String.valueOf(--count)); + planTaskApiService.taskRetry(dto); + } else { + redisTemplate.opsForHash().delete(RedisConstant.PLAN_BATCH_RETRY_COUNT, planBatch.getId()); // 没有失败的任务,清除redis信息,不需要重试 + return false; + } + return true; + } + } + return false; + } + + private void saveDevicePerData(AtuPlanBatchDetailDto atuPlanBatchDetailDto) { + String batchId = atuPlanBatchDetailDto.getId(); + String tenantId = atuPlanBatchDetailDto.getTenantId(); + if (StrUtil.isBlank(tenantId)) { + logger.error("获取批次计划中的租户id异常"); + return; + } + logger.debug("统计并保存批次设备性能数据"); + // 查询该批次下所有的移动端任务性能文件地址 + List perDataPathList = planTaskService.queryMobilePerDataPathByBatchId(batchId); + if (CollUtil.isEmpty(perDataPathList)) { + logger.debug("该批次无性能数据"); + return; + } + logger.debug("perDataPathList => {}", JSONUtil.toJsonStr(perDataPathList)); + Map deviceAppPerMap = new HashMap<>(); + for (String perDataPath : perDataPathList) { + MobileTaskPerformanceDto taskPerInfo = null; + try { + taskPerInfo = MinioPathUtils.downloadFileCoverObj(simpleStorageService, + tenantId, perDataPath, MobileTaskPerformanceDto.class); + } catch (Exception e) { + logger.error("获取任务性能数据异常:{}", perDataPath); + } + logger.debug("taskPerInfo => {}", JSONUtil.toJsonStr(taskPerInfo)); + if (taskPerInfo == null) { + logger.debug("任务性能数据为空:{}", perDataPath); + continue; + } + String deviceAppKey = taskPerInfo.getDeviceId() + "-" + taskPerInfo.getAppId(); + BatchMobilePerformanceDto deviceAppPer = new BatchMobilePerformanceDto(); + if (deviceAppPerMap.containsKey(deviceAppKey)) { + deviceAppPer = deviceAppPerMap.get(deviceAppKey); + } + // 添加安装时间 + deviceAppPer.setAppInstallTimeList(defaultListAddData(deviceAppPer.getAppInstallTimeList(), taskPerInfo.getAppInstallTime())); + // 添加启动时间 + deviceAppPer.setAppActiveTimeList(defaultListAddData(deviceAppPer.getAppActiveTimeList(), taskPerInfo.getAppActiveTime())); + deviceAppPer.setAppCpuList(defaultListAddList(deviceAppPer.getAppCpuList(), taskPerInfo.getAppCpuList())); + deviceAppPer.setAppMemoList(defaultListAddList(deviceAppPer.getAppMemoList(), taskPerInfo.getAppMemoList())); + deviceAppPer.setAppFlowList(defaultListAddList(deviceAppPer.getAppFlowList(), taskPerInfo.getAppFlowList())); + deviceAppPer.setDeviceCpuList(defaultListAddList(deviceAppPer.getDeviceCpuList(), taskPerInfo.getDeviceCpuList())); + deviceAppPer.setDeviceMemoList(defaultListAddList(deviceAppPer.getDeviceMemoList(), taskPerInfo.getDeviceMemoList())); + deviceAppPer.setDeviceFlowList(defaultListAddList(deviceAppPer.getDeviceFlowList(), taskPerInfo.getDeviceFlowList())); + deviceAppPer.setDeviceTemperatureList(defaultListAddList(deviceAppPer.getDeviceTemperatureList(), taskPerInfo.getDeviceTemperatureList())); + deviceAppPerMap.put(deviceAppKey, deviceAppPer); + } + logger.debug("deviceAppPerMap => {}", JSONUtil.toJsonStr(deviceAppPerMap)); + if (CollUtil.isEmpty(deviceAppPerMap)) { + logger.debug("任务性能数据整合后为空"); + return; + } + + List appInfoDtoList = new ArrayList<>(); + deviceAppPerMap.forEach((deviceAppKey, deviceAppPer) -> { + BatchAppInfoDto appInfoDto = new BatchAppInfoDto(); + appInfoDto.setDeviceId(deviceAppKey.split("-")[0]); + appInfoDto.setAppId(deviceAppKey.split("-")[1]); + + // APP安装耗时 + appInfoDto.setInstallTime(getListAvgValueDiv1000(deviceAppPer.getAppInstallTimeList(), MsgConstant.LETTER_S)); + appInfoDto.setMaxInstallTime(getListMaxValueDiv1000(deviceAppPer.getAppInstallTimeList(), MsgConstant.LETTER_S)); + + // app启动耗时 + appInfoDto.setStartElapsedTime(getListAvgValueDiv1000(deviceAppPer.getAppActiveTimeList(), MsgConstant.LETTER_S)); + appInfoDto.setMaxStartElapsedTime(getListMaxValueDiv1000(deviceAppPer.getAppActiveTimeList(), MsgConstant.LETTER_S)); + + // app cpu使用率 + appInfoDto.setAppCpu(getListAvgValue(deviceAppPer.getAppCpuList(), MsgConstant.PERCENTAGE)); + appInfoDto.setMaxAppCpu(getListMaxValue(deviceAppPer.getAppCpuList(), MsgConstant.PERCENTAGE)); + + // app内存使用 + appInfoDto.setAppMemory(getListAvgValue(deviceAppPer.getAppMemoList(), MsgConstant.LETTER_M)); + appInfoDto.setMaxAppMemory(getListMaxValue(deviceAppPer.getAppMemoList(), MsgConstant.LETTER_M)); + + // app流量使用 + appInfoDto.setAppFlow(getListAvgValue(deviceAppPer.getAppFlowList(), MsgConstant.LETTER_M)); + appInfoDto.setMaxAppFlow(getListMaxValue(deviceAppPer.getAppFlowList(), MsgConstant.LETTER_M)); + + // 设备cpu使用率 + appInfoDto.setDeviceCpu(getListAvgValue(deviceAppPer.getDeviceCpuList(), MsgConstant.PERCENTAGE)); + appInfoDto.setMaxDeviceCpu(getListMaxValue(deviceAppPer.getDeviceCpuList(), MsgConstant.PERCENTAGE)); + + // 设备内存使用 + appInfoDto.setDeviceMemory(getListAvgValue(deviceAppPer.getDeviceMemoList(), MsgConstant.LETTER_M)); + appInfoDto.setMaxDeviceMemory(getListMaxValue(deviceAppPer.getDeviceMemoList(), MsgConstant.LETTER_M)); + + // 设备流量使用 + appInfoDto.setDeviceFlow(getListAvgValue(deviceAppPer.getDeviceFlowList(), MsgConstant.LETTER_M)); + appInfoDto.setMaxDeviceFlow(getListMaxValue(deviceAppPer.getDeviceFlowList(), MsgConstant.LETTER_M)); + + // 设备电池温度 + appInfoDto.setCellTemperature(getListAvgValue(deviceAppPer.getDeviceTemperatureList(), MsgConstant.TEMPERATURE_DEGREE)); + appInfoDto.setMaxCellTemperature(getListMaxValue(deviceAppPer.getDeviceTemperatureList(), MsgConstant.TEMPERATURE_DEGREE)); + appInfoDtoList.add(appInfoDto); + }); + + logger.debug("设备性能数据为:{}", appInfoDtoList.size()); + // 保存整合数据 + File file = MinioPathUtils.objectToJsonFile(appInfoDtoList); + try { + NKFile nkFile = simpleStorageService.upload(tenantId, file, true, batchId, FileBusinessTypeEnum.BATCH_TASK_PERFORMANCE_SUMMARY); + String path = nkFile.getId(); + logger.debug("整合数据保存地址 => {}", path); + AtuPlanBatch byPrimaryKey = this.planBatchService.findByPrimaryKey(batchId); + String oldPerDataPath = byPrimaryKey.getPerDataPath(); + // 保存批次性能文件地址 + AtuPlanBatch planBatch = new AtuPlanBatch(); + planBatch.setId(batchId); + planBatch.setPerDataPath(path); + this.planBatchService.updateByPrimaryKey(planBatch); + // 删除旧的性能文件 + if (StrUtil.isNotBlank(oldPerDataPath)){ + String[] pathUrl = MinioPathUtils.idToPath(oldPerDataPath); + try { + simpleStorageService.delete(pathUrl[0], "/" + pathUrl[1]); + } catch (Exception e) { + logger.error("文件删除删除失败", e); + } + } + } catch (Exception e) { + logger.error("文件上传异常", e); + } + } + + private String getListMaxValue(List list, String union) { + String maxValue = "0.00" + union; + if (CollUtil.isNotEmpty(list)) { + double max = list.stream().mapToDouble(Double::doubleValue).max().orElse(0); + maxValue = max + union; + } + return maxValue; + } + + private String getListAvgValue(List list, String union) { + String avgValue = MsgConstant.ZERO_DOT + union; + if (CollUtil.isNotEmpty(list)) { + double avg = list.stream().mapToDouble(Double::doubleValue).average().orElse(0); + avgValue = NumberUtil.roundStr(avg, 2) + union; + } + return avgValue; + } + + private String getListMaxValueDiv1000(List list, String union) { + String maxValue = MsgConstant.ZERO_DOT + union; + if (CollUtil.isNotEmpty(list)) { + long max = list.stream().mapToLong(Long::longValue).max().orElse(0); + double maxDiv = NumberUtil.div(max, 1000); + maxValue = NumberUtil.round(maxDiv, 2) + union; + } + return maxValue; + } + + private String getListAvgValueDiv1000(List list, String union) { + String avgValue = MsgConstant.ZERO_DOT + union; + if (CollUtil.isNotEmpty(list)) { + double avg = list.stream().mapToLong(Long::longValue).average().orElse(0); + double avgDiv = NumberUtil.div(avg, 1000); + avgValue = NumberUtil.round(avgDiv, 2) + union; + } + return avgValue; + } + + private static List defaultListAddData(List list, Long data) { + if (CollUtil.isEmpty(list)) { + list = CollUtil.newArrayList(); + } + if (data == null) { + return list; + } + list.add(data); + return list; + } + + private static List defaultListAddList(List list, List data) { + if (CollUtil.isEmpty(list)) { + list = CollUtil.newArrayList(); + } + if (CollUtil.isEmpty(data)) { + return list; + } + list.addAll(data); + return list; + } + + /** + * 收尾处理 + * + * @param planInfo 批次计划信息 + * @param planBatch 批次信息 + */ + private void handleEnd(AtuPlanInfo planInfo, AtuPlanBatchDetailDto planBatch) { + if (PlanConstant.BATCH_CANCEL_STATUS.equals(planBatch.getStatus())) { // 如果是取消,不需要执行收尾处理 + return; + } + // 检查计划是否需要重试,如果需要并且是执行完成批次后再执行失败的任务,那么获取失败任务,批量重试。 + if (PlanConstant.BATCH_FINISH_STATUS.equals(planBatch.getStatus()) && planInfo.getFailRetry()) { + boolean isRetry = false; + try { + isRetry = failRetryCheck(planInfo, planBatch); + } catch (Exception e) { + logger.error("批次{}下失败任务重试失败", planBatch.getId(), e); + } + if (isRetry) { + logger.info("计划需要对失败的任务进行重试..."); + return; + } + } + // 计划是否被其他计划设为前置执行计划 + List planIdList = planInfoService.queryFollowUpPlanIdList(planInfo.getId()); + if (CollUtil.isNotEmpty(planIdList)) { + for (String id : planIdList) { + AtuPlanRunDto atuPlanRunDto = new AtuPlanRunDto(); + atuPlanRunDto.setPlanId(id); + atuPlanRunDto.setExecutedBy(planInfo.getPrincipalId()); + atuPlanRunDto.setTriggerType(PlanConstant.TRIGGER_TYPE_AUTO); + planInfoApiService.run(atuPlanRunDto); + } + } + // 计划是否需要发送邮件,失败用例是否生成失败计划 + NKSecurityContext.setTenantId(planInfo.getTenantId()); + NKSecurityContext.setUserId(planInfo.getCreatedBy()); + // 发送到飞狼 + + executor.execute(() -> { + RLock rLock = redisson.getLock(RedisConstant.BATCH_MESSAGE_LOCK_PRE + planBatch.getId()); + try { + if (rLock.tryLock(0, 90, TimeUnit.SECONDS)) { + //推送消息中心弹窗 + try { + messageCenterService.sendMessage(planInfo, planBatch); + } catch (Exception e) { + logger.error("推送消息中心失败" + e); + } finally { + rLock.unlock(); + } + } + } catch (InterruptedException e) { + logger.info("推送消息中心失败" + planBatch.getId()); + } + //判断是否发送到飞狼 此处 + if (planInfo.getSendMail()) { + // 判断飞狼user是否存在 + if (StrUtil.isNotBlank(planInfo.getMailAddress())) { + try { + feiLangService.sendMessage(planInfo, planBatch); + } catch (Exception e) { + logger.error("飞狼推送失败", e); + } + } + } + }); + + // 判断执行失败是否生成新的计划 + if (planInfo.getFailCreatePlan()) { + // 判断是否有执行失败的任务 + if (planBatch.getExecFailNum() > 0) { + // 生成新的计划信息 + createFailCasePlan(planInfo, planBatch); + } + } + } + + /** + * 生成失败用例计划 + * + * @param planInfo 原计划信息 + * @param planBatch 批次信息 + */ + private void createFailCasePlan(AtuPlanInfo planInfo, AtuPlanBatchDetailDto planBatch) { + String batchId = planBatch.getId(); + // 根据失败任务查询失败用例,并生成新的用例集 + AtuPlanTask queryParams = new AtuPlanTask(); + queryParams.setBatchId(batchId); + List planTaskList = planTaskService.query(queryParams); + if (CollUtil.isEmpty(planTaskList)) { + logger.debug("批次[{}]无任务生成", batchId); + return; + } + + // 将任务根据脚本进行分组 + Map> scriptTaskMap = planTaskList.stream() + .collect(Collectors.groupingBy(AtuPlanTask::getScriptId)); + Set>> entries = scriptTaskMap.entrySet(); + String newPlanId = IdUtil.simpleUUID(); + List scriptLinkList = new ArrayList<>(); + for (Map.Entry> entry : entries) { + String scriptId = entry.getKey(); + List scriptTaskList = entry.getValue(); + // 将任务分成成功和失败 + List successTaskList = scriptTaskList.stream() + .filter(task -> task.getStatus().equals(PlanConstant.TASK_EXECUTE_SUCCESS_STATUS)) + .collect(Collectors.toList()); + // 失败任务 + scriptTaskList.removeAll(successTaskList); + if (CollUtil.isEmpty(scriptTaskList)) { + continue; + } + // 将脚本绑定至新计划 + AtuPlanTask planTask = scriptTaskList.get(0); + AtuPlanScriptLink scriptLink = new AtuPlanScriptLink(); + scriptLink.setPlanId(newPlanId); + scriptLink.setScriptId(scriptId); + scriptLink.setScriptType(planTask.getCaseType()); + scriptLinkList.add(scriptLink); + } + + if (CollUtil.isEmpty(scriptLinkList)) { + logger.debug("任务全部成功"); + return; + } + + // 复制计划信息(修改计划名称,去除触发方式信息) + AtuPlanInfo newPlan = new AtuPlanInfo(); + BeanUtil.copyProperties(planInfo, newPlan); + newPlan.setId(newPlanId); + String planName = planInfo.getPlanName() + "-" + planBatch.getBatch() + "-失败用例"; + // 校验名称是否存在 + int num = 0; + while (true) { + AtuPlanInfo countPlan = new AtuPlanInfo(); + String name = num == 0 ? planName : planName + "(" + num + ")"; + countPlan.setPlanName(name); + long count = planInfoService.count(countPlan); + if (count > 0) { + num++; + } else { + planName = name; + break; + } + } + newPlan.setPlanName(planName); + newPlan.setCronExpr(""); + newPlan.setUpFrontPlanId(""); + newPlan.setWebhookUrl(""); + newPlan.setWebhookToken(""); + //补充 + newPlan.setHasCorn(false); + newPlan.setHasUpFront(false); + newPlan.setHasWebhook(false); + newPlan.setLastBatchId(""); + newPlan.setWaitingNum(0); + newPlan.setRunningNum(0); + newPlan.setSuccessNum(0); + newPlan.setExecFailNum(0); + newPlan.setAssertFailNum(0); + newPlan.setTimeoutNum(0); + newPlan.setCancelNum(0); + //重置状态为新建 + newPlan.setStatus(PlanConstant.PLAN_NEW_STATUS); + newPlan.setLastExecTime(null); + newPlan.setNextExecTime(null); + newPlan.setPrincipalId(planBatch.getExecutedBy()); + planInfoService.insert(newPlan); + + // 绑定应用 + AtuPlanAppLink appLinkQuery = new AtuPlanAppLink(); + appLinkQuery.setPlanId(planInfo.getId()); + List appLinkList = planAppLinkService.query(appLinkQuery); + if (CollUtil.isNotEmpty(appLinkList)) { + for (AtuPlanAppLink planAppLink : appLinkList) { + planAppLink.setId(IdUtil.simpleUUID()); + planAppLink.setPlanId(newPlan.getId()); + } + planAppLinkService.insertByBatch(appLinkList); + } + // 绑定设备 + AtuPlanDeviceLink deviceLinkQuery = new AtuPlanDeviceLink(); + deviceLinkQuery.setPlanId(planInfo.getId()); + List deviceLinkList = planDeviceLinkService.query(deviceLinkQuery); + if (CollUtil.isNotEmpty(deviceLinkList)) { + for (AtuPlanDeviceLink planDeviceLink : deviceLinkList) { + planDeviceLink.setId(IdUtil.simpleUUID()); + planDeviceLink.setPlanId(newPlan.getId()); + } + planDeviceLinkService.insertByBatch(deviceLinkList); + } + + // 绑定环境 + AtuPlanEnvLink envLinkQuery = new AtuPlanEnvLink(); + envLinkQuery.setPlanId(planInfo.getId()); + List envLinkList = planEnvLinkService.query(envLinkQuery); + List newEnvLinkList = new ArrayList<>(); + if (CollUtil.isNotEmpty(envLinkList)) { + for (AtuPlanEnvLink envLink : envLinkList) { + AtuPlanEnvLink newEnvLink = new AtuPlanEnvLink(); + newEnvLink.setPlanId(newPlanId); + newEnvLink.setEnvId(envLink.getEnvId()); + newEnvLink.setSort(envLink.getSort()); + newEnvLinkList.add(newEnvLink); + } + planEnvLinkService.insertByBatch(newEnvLinkList); + } + + // 绑定脚本 + planScriptLinkService.insertByBatch(scriptLinkList); + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/job/TaskExecTimeoutJob.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/job/TaskExecTimeoutJob.java new file mode 100644 index 0000000..ccb48c0 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/job/TaskExecTimeoutJob.java @@ -0,0 +1,137 @@ +package net.northking.cctp.executePlan.job; + +import cn.hutool.core.collection.CollUtil; +import net.northking.cctp.executePlan.api.service.AtuPlanSceneCaseTaskApiService; +import net.northking.cctp.executePlan.api.service.AtuPlanTaskApiService; +import net.northking.cctp.executePlan.config.AtuPlanConfig; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanSceneCaseTask; +import net.northking.cctp.executePlan.db.entity.AtuPlanTask; +import net.northking.cctp.executePlan.db.entity.AtuPlanTaskRecord; +import net.northking.cctp.executePlan.db.service.AtuPlanSceneCaseTaskService; +import net.northking.cctp.executePlan.db.service.AtuPlanTaskRecordService; +import net.northking.cctp.executePlan.dto.planTask.AtuPlanTaskExtendDto; +import net.northking.cctp.executePlan.dto.planTask.AtuTaskExecResultDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.integration.redis.util.RedisLockRegistry; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; + +import java.util.List; +import java.util.concurrent.locks.Lock; +import java.util.stream.Collectors; + +@EnableScheduling +@Configuration +public class TaskExecTimeoutJob { + + private final static Logger logger = LoggerFactory.getLogger(TaskExecTimeoutJob.class); + + @Autowired + private AtuPlanTaskApiService planTaskApiService; + + @Autowired + private AtuPlanSceneCaseTaskService sceneCaseTaskService; + + @Autowired + private AtuPlanSceneCaseTaskApiService sceneCaseTaskApiService; + + @Autowired + private RedisLockRegistry redisLockRegistry; + + private final static String TIMEOUT_LOCK = "TIMEOUT_LOCK"; + + @Autowired + private AtuPlanConfig atuPlanConfig; + + @Autowired + private AtuPlanTaskRecordService atuPlanTaskRecordService; + + + /** + * 超时时间,默认3分钟,单位秒 + */ + public static final int TIMEOUT = 3 * 60; + + public static final String ERROR_MSG = "引擎执行任务超时"; + public static final String WAIT_TIMEOUT_ERROR_MSG = "任务等待超时,自动取消"; + + @Scheduled(initialDelay = 10 * 1000, fixedDelay = 60 * 1000) + private void handleTaskExecTimeout() { + // 加锁,避免集群模式下未知异常 + Lock lock = redisLockRegistry.obtain(TIMEOUT_LOCK); + boolean b = lock.tryLock(); + try { + if (b) { + // 查询正在执行中且心跳时间超过n分钟的任务 + List taskList = planTaskApiService.queryExecTimeoutTask(TIMEOUT); + logger.debug("执行超时任务数量:{}", taskList.size()); + taskTimeoutHandle(taskList, PlanConstant.TASK_TIMEOUT_STATUS, ERROR_MSG); + + List waitTimeoutTask = planTaskApiService.queryWaitTimeoutTask(atuPlanConfig.getWaitTimeout()); + List reTryTasks = atuPlanTaskRecordService.queryReTryTaskByTaskIds(waitTimeoutTask.stream().map(AtuPlanTask::getId).collect(Collectors.toList())); + List reTryTaskIds = reTryTasks.stream().map(AtuPlanTaskRecord::getTaskId).collect(Collectors.toList()); + waitTimeoutTask.removeIf(task -> reTryTaskIds.contains(task.getId())); + logger.debug("等待超时任务数量:{}", waitTimeoutTask.size()); + taskTimeoutHandle(waitTimeoutTask, PlanConstant.TASK_CANCEL_STATUS, WAIT_TIMEOUT_ERROR_MSG); + + List sceneCaseTaskList = sceneCaseTaskService.queryExecTimeoutTask(TIMEOUT); + logger.debug("场景节点执行超时任务数量:{}", sceneCaseTaskList.size()); + sceneTaskTimeoutHandle(sceneCaseTaskList, PlanConstant.TASK_TIMEOUT_STATUS, ERROR_MSG); + List sceneWaitTimeoutTask = sceneCaseTaskService.queryWaitTimeoutTask(atuPlanConfig.getWaitTimeout()); + List reTrySceneCaseTask = atuPlanTaskRecordService.queryReTryTaskByTaskIds(sceneWaitTimeoutTask.stream().map(AtuPlanSceneCaseTask::getTaskId).collect(Collectors.toList())); + List reTrySceneCaseTaskIds = reTrySceneCaseTask.stream().map(AtuPlanTaskRecord::getTaskId).collect(Collectors.toList()); + sceneWaitTimeoutTask.removeIf(sceneCaseTask -> reTrySceneCaseTaskIds.contains(sceneCaseTask.getId())); + logger.debug("场景节点等待超时任务数量:{}", sceneWaitTimeoutTask.size()); + sceneTaskTimeoutHandle(sceneWaitTimeoutTask, PlanConstant.TASK_CANCEL_STATUS, WAIT_TIMEOUT_ERROR_MSG); + } + } finally { + if (b) { + lock.unlock(); + } + } + } + + private void sceneTaskTimeoutHandle(List sceneCaseTaskList, String status, String errorMsg) { + if (CollUtil.isNotEmpty(sceneCaseTaskList)) { + + AtuTaskExecResultDto taskExecResult = new AtuTaskExecResultDto(); + taskExecResult.setCaseType(PlanConstant.SCRIPT_TYPE_SCENE); + taskExecResult.setStatus(status); + taskExecResult.setMessage(errorMsg); + taskExecResult.setCurrentTime(System.currentTimeMillis()); + + for (AtuPlanSceneCaseTask sceneCaseTask : sceneCaseTaskList) { + AtuPlanTaskExtendDto taskExtendDto = planTaskApiService.queryTaskExtendById(sceneCaseTask.getTaskId()); + if (taskExtendDto == null) { + logger.error("任务[{}]信息不存在", sceneCaseTask.getTaskId()); + logger.error("删除任务[{}]的节点任务信息", sceneCaseTask.getTaskId()); + AtuPlanSceneCaseTask delParams = new AtuPlanSceneCaseTask(); + delParams.setTaskId(sceneCaseTask.getTaskId()); + sceneCaseTaskService.deleteByExample(delParams); + continue; + } + taskExecResult.setPlanId(taskExtendDto.getPlanId()); + taskExecResult.setBatchId(taskExtendDto.getBatchId()); + taskExecResult.setCaseId(taskExtendDto.getCaseId()); + taskExecResult.setTaskId(sceneCaseTask.getId()); + AtuPlanTask planTask = new AtuPlanTask(); + BeanUtils.copyProperties(taskExtendDto, planTask); + // 场景节点执行失败,执行下一节点 + sceneCaseTaskApiService.queryNextNodeInfo(taskExecResult, sceneCaseTask, planTask); + } + } + } + + private void taskTimeoutHandle(List taskList, String status, String errorMsg) { + if (CollUtil.isNotEmpty(taskList)) { + for (AtuPlanTask planTask : taskList) { + planTaskApiService.taskExecFailUpdate(planTask, status, errorMsg); + } + } + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/pub/ats/TestPlanExecutionToAtsReportPub.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/pub/ats/TestPlanExecutionToAtsReportPub.java new file mode 100644 index 0000000..0f9cc85 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/pub/ats/TestPlanExecutionToAtsReportPub.java @@ -0,0 +1,33 @@ +package net.northking.cctp.executePlan.pub.ats; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.constants.BaseDefineDependencyConstants; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.northking.cctp.executePlan.api.service.AtuPlanInfoApiService; +import net.northking.cctp.executePlan.pub.dto.TestPlanScriptExecutionDetailDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Api(tags = "执行计划脚本执行情况(服务间调用)") +@RequestMapping("/pub") +@RestController +public class TestPlanExecutionToAtsReportPub { + + @Autowired + private AtuPlanInfoApiService apiService; + + @ApiOperation(value = "ATS获取执行计划中脚本执行情况") + @PostMapping(value = "/scriptExecutionDetail") + public ResponseVO> scriptExecutionDetail() { + ResponseVO> responseVO = new ResponseVO<>(); + List result = apiService.scriptExecutionDetail(); + responseVO.setCode(BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS); + responseVO.setData(result); + return responseVO; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/pub/dto/ScriptFirstExecutionDTO.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/pub/dto/ScriptFirstExecutionDTO.java new file mode 100644 index 0000000..4ea7d73 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/pub/dto/ScriptFirstExecutionDTO.java @@ -0,0 +1,21 @@ +package net.northking.cctp.executePlan.pub.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class ScriptFirstExecutionDTO { + + @ApiModelProperty(value = "首次执行成功脚本Id", example = "123456") + private String scriptId; + @ApiModelProperty(value = "首次执行成功日期", example = "2024-02-22 15:07:00") + private Long firstExecutionTime; + + @ApiModelProperty(value = "首次执行成功计划id", example = "2024-02-22 15:07:00") + private String firstExecutionPlanId; + + @ApiModelProperty(value = "首次执行成功计划名称", example = "sssss") + private String firstExecutionPlanName; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/pub/dto/TestPlanScriptExecutionDetailDTO.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/pub/dto/TestPlanScriptExecutionDetailDTO.java new file mode 100644 index 0000000..34595b2 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/pub/dto/TestPlanScriptExecutionDetailDTO.java @@ -0,0 +1,73 @@ +package net.northking.cctp.executePlan.pub.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +public class TestPlanScriptExecutionDetailDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "执行月份", example = "2024-02") + private String month; + + @ApiModelProperty(value = "脚本类型(1-接口,2-UI)", example = "1") + private Integer scriptType; + + @ApiModelProperty(value = "脚本id", example = "14879753961997440") + private String scriptId; + + @ApiModelProperty(value = "脚本编号", example = "S000001") + private String scriptCode; + + @ApiModelProperty(value = "脚本名称", example = "sssss") + private String scriptName; + + @ApiModelProperty(value = "脚本负责人", example = "14879753961997440") + private Long scriptManager; + + @ApiModelProperty(value = "脚本创建时间", example = "2024-02-22 15:07:00") + private Date scriptCreateTime; + + @ApiModelProperty(value = "规范扫描结果", example = "0") + private Integer result; + + @ApiModelProperty(value = "测试计划id", example = "14879753961997440") + private String testPlanId; + + @ApiModelProperty(value = "测试计划名称", example = "sssss") + private String testPlanName; + + @ApiModelProperty(value = "测试计划负责人", example = "14879753961997440") + private Long testPlanManager; + + @ApiModelProperty(value = "系统id", example = "14879753961997440") + private Long systemId; + + @ApiModelProperty(value = "计划标签", example = "测试环境,验证环境") + private String tag; + + @ApiModelProperty(value = "首次执行成功日期", example = "2024-02-22 15:07:00") + private Date firstExecutionTime; + + @ApiModelProperty(value = "首次执行成功计划id", example = "2024-02-22 15:07:00") + private String firstExecutionPlanId; + + @ApiModelProperty(value = "首次执行成功计划名称", example = "sssss") + private String firstExecutionPlanName; + + @ApiModelProperty(value = "执行成功次数", example = "5") + private Integer executionSuccessNum; + + @ApiModelProperty(value = "引用脚本计划数", example = "5") + private Integer refScriptPlanNum; + + @ApiModelProperty(value = "是否组员", example = "1") + private Integer isTeamMember; + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/AbstractQuartzJob.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/AbstractQuartzJob.java new file mode 100644 index 0000000..d03cb94 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/AbstractQuartzJob.java @@ -0,0 +1,100 @@ +package net.northking.cctp.executePlan.quartz; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.extra.spring.SpringUtil; +import net.northking.cctp.executePlan.api.service.AtuPlanInfoApiService; +import net.northking.cctp.executePlan.constants.QuartzConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; + +/** + *

Title: AbstractQuartzJob

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/29 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public abstract class AbstractQuartzJob implements Job { + + protected static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); + + /** + * 线程本地变量 + */ + private static final ThreadLocal THREAD_LOCAL = new ThreadLocal<>(); + + @Override + public void execute(JobExecutionContext context) + { + AtuPlanInfo planInfo = new AtuPlanInfo(); + BeanUtil.copyProperties(context.getMergedJobDataMap().get(QuartzConstant.PLAN_TASK_PROPERTIES), planInfo); + try + { + before(context, planInfo); + if (planInfo != null) + { + doExecute(context, planInfo); + } + after(context, planInfo, null); + } + catch (Exception e) + { + log.error("任务执行异常 - :", e); + after(context, planInfo, e); + } + } + + /** + * 执行前 + * + * @param context 工作执行上下文对象 + * @param planInfo 调度计划 + */ + protected void before(JobExecutionContext context, AtuPlanInfo planInfo) + { + log.info("调度计划[{}-{}]被触发调用",planInfo.getId(), planInfo.getPlanName()); + THREAD_LOCAL.set(new Date()); + } + + /** + * 任务派发后 + * @param context 工作执行上下文对象 + * @param planInfo 调度计划 + * @param e 异常 + */ + protected void after(JobExecutionContext context, AtuPlanInfo planInfo, Exception e) + { + Date startTime = THREAD_LOCAL.get(); + long runMs = System.currentTimeMillis() - startTime.getTime(); + if(e!=null){ + log.info("调度计划[{}-{}]派发失败,派发共耗时:{}秒", planInfo.getId(), planInfo.getPlanName(), runMs/1000.0); + log.warn("调度计划派发失败原因",e); + }else{ + log.info("调度计划[{}-{}]已成功派发,耗时:{}秒", planInfo.getId(), planInfo.getPlanName(),runMs/1000.0); + } + log.trace("计划内容:{}", planInfo); + THREAD_LOCAL.remove(); + + // 修改下一次执行时间 + log.info("更新下一次执行时间"); + planInfo.setLastExecTime(new Date()); + SpringUtil.getBean(AtuPlanInfoApiService.class).updatePlanNextRunTime(planInfo); + } + + /** + * 执行方法,由子类重载 + * + * @param context 工作执行上下文对象 + * @param planInfo 系统计划任务 + * @throws Exception 执行过程中的异常 + */ + protected abstract void doExecute(JobExecutionContext context, AtuPlanInfo planInfo) throws Exception; +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/JobInvokeUtil.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/JobInvokeUtil.java new file mode 100644 index 0000000..19e7cca --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/JobInvokeUtil.java @@ -0,0 +1,73 @@ +package net.northking.cctp.executePlan.quartz; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import net.northking.cctp.executePlan.constants.QuartzConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import org.apache.commons.lang3.StringUtils; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + *

Title: JobInvokeUtil

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/29 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class JobInvokeUtil { + + /** + * 执行方法 + * + * @param planInfo 调度计划信息 + */ + public static void invokeMethod(AtuPlanInfo planInfo) throws Exception + { + String beanName = QuartzConstant.PLAN_TASK_EXECUTE_BEAN; + String methodName = QuartzConstant.PLAN_TASK_EXECUTE_METHOD; + + if (!isValidClassName(beanName)) + { + Object bean = SpringUtil.getBean(beanName); + invokeMethod(bean, methodName, planInfo); + } + else + { + Object bean = Class.forName(beanName).newInstance(); + invokeMethod(bean, methodName, planInfo); + } + } + + /** + * 调用任务方法 + * + * @param bean 目标对象 + * @param methodName 方法名称 + * @param planInfo 方法参数 + */ + private static void invokeMethod(Object bean, String methodName, AtuPlanInfo planInfo) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException + { + if (ObjectUtil.isNotNull(planInfo)){ + Method method = bean.getClass().getDeclaredMethod(methodName, AtuPlanInfo.class); + method.invoke(bean, planInfo); + } + } + + /** + * 校验是否为为class包名 + * + * @param invokeTarget 名称 + * @return true是 false否 + */ + public static boolean isValidClassName(String invokeTarget) + { + return StringUtils.countMatches(invokeTarget, ".") > 1; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/PlanTaskExecute.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/PlanTaskExecute.java new file mode 100644 index 0000000..36e530b --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/PlanTaskExecute.java @@ -0,0 +1,39 @@ +package net.northking.cctp.executePlan.quartz; + +import net.northking.cctp.executePlan.api.service.AtuPlanInfoApiService; +import net.northking.cctp.executePlan.constants.PlanConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import net.northking.cctp.executePlan.dto.planInfo.AtuPlanRunDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + *

Title: PlanTaskExecute

+ *

Description:反射调用

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/29 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +@Component("planTaskExecute") +public class PlanTaskExecute { + + private final static Logger logger = LoggerFactory.getLogger(PlanTaskExecute.class); + + @Autowired + private AtuPlanInfoApiService planInfoApiService; + + public void execute(AtuPlanInfo planInfo){ + logger.info("planTaskExecute 开始执行..."); + AtuPlanRunDto runDto = new AtuPlanRunDto(); + runDto.setPlanId(planInfo.getId()); + runDto.setTriggerType(PlanConstant.TRIGGER_TYPE_AUTO); + runDto.setExecutedBy(planInfo.getPrincipalId()); + planInfoApiService.run(runDto); + logger.info("planTaskExecute 执行结束..."); + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/QuartzJobExecution.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/QuartzJobExecution.java new file mode 100644 index 0000000..2b42f39 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/QuartzJobExecution.java @@ -0,0 +1,29 @@ +package net.northking.cctp.executePlan.quartz; + +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import org.quartz.JobExecutionContext; + +/** + *

Title: QuartzJobExecution

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/29 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class QuartzJobExecution extends AbstractQuartzJob{ + /** + * 执行方法,由子类重载 + * + * @param context 工作执行上下文对象 + * @param planInfo 系统计划任务 + * @throws Exception 执行过程中的异常 + */ + @Override + protected void doExecute(JobExecutionContext context, AtuPlanInfo planInfo) throws Exception { + log.info("调度计划[{}-{}]开始执行派发操作", planInfo.getId(), planInfo.getPlanName()); + JobInvokeUtil.invokeMethod(planInfo); + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/ScheduleConfig.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/ScheduleConfig.java new file mode 100644 index 0000000..ad1cbb1 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/ScheduleConfig.java @@ -0,0 +1,59 @@ +package net.northking.cctp.executePlan.quartz; + +import net.northking.cctp.executePlan.constants.MsgConstant; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +import javax.sql.DataSource; +import java.util.Properties; + +/** + * 定时任务配置 + * + * @author chenjianfeng + */ +@Configuration +public class ScheduleConfig +{ + @Bean(name = MsgConstant.ATU_PLAN_SCH) + public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) + { + SchedulerFactoryBean factory = new SchedulerFactoryBean(); + factory.setDataSource(dataSource); + + // quartz参数 + Properties prop = new Properties(); + prop.put(MsgConstant.SCH_INS_NAME, MsgConstant.ATU_PLAN_SCH); + prop.put(MsgConstant.SCH_INS_ID, MsgConstant.AUTO); + // 线程池配置 + prop.put(MsgConstant.THR_POOL_CLASS, MsgConstant.SIMP_THRE_POOL); + prop.put(MsgConstant.THR_POOL_THR_COUNT, MsgConstant.THR_POOL_THR_COUNT_CONFIGURATION); + prop.put(MsgConstant.THR_POOL_THR_PRI, MsgConstant.THR_POOL_THR_PRI_CONFIGURATION); + // JobStore配置 + prop.put(MsgConstant.JOBSTO_CLASS, MsgConstant.JDBC_JOBSTORE_TX); + // 集群配置 + prop.put(MsgConstant.JOBSTO_ISCLU, MsgConstant.STR_TRUE); + prop.put(MsgConstant.JOBSTO_ACQUIRE_LOCK, MsgConstant.STR_TRUE); + prop.put(MsgConstant.JOBSTO_CLU_CHECK_INTER, MsgConstant.JOBSTO_CLU_CHECK_INTER_CONFIGURATION); + prop.put(MsgConstant.JOBSTO_MAX_MIS_TO_HANDLE_AT_TIME, MsgConstant.JOBSTO_MAX_MIS_TO_HANDLE_AT_TIME_CONFIGURATION); + prop.put(MsgConstant.JOBSTO_TX_ISO_LEVEL, MsgConstant.STR_TRUE); + + // sqlserver 启用 + prop.put(MsgConstant.JOBSTO_MIS_FIRE_THRE, MsgConstant.JOBSTO_MIS_FIRE_THRE_CONFIGURATION); + prop.put(MsgConstant.JOBSTO_TABLE_PRE, MsgConstant.QRTZ); + factory.setQuartzProperties(prop); + + factory.setSchedulerName(MsgConstant.ATU_PLAN_SCH); + // 延时启动 + factory.setStartupDelay(1); + factory.setApplicationContextSchedulerContextKey(MsgConstant.APP_CON_KEY); + // 可选,QuartzScheduler + // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 + factory.setOverwriteExistingJobs(true); + // 设置自动启动,默认为true + factory.setAutoStartup(true); + + return factory; + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/ScheduleUtils.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/ScheduleUtils.java new file mode 100644 index 0000000..9775358 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/quartz/ScheduleUtils.java @@ -0,0 +1,168 @@ +package net.northking.cctp.executePlan.quartz; + +import net.northking.cctp.executePlan.constants.QuartzConstant; +import net.northking.cctp.executePlan.db.entity.AtuPlanInfo; +import org.apache.commons.lang3.StringUtils; +import org.quartz.*; +import org.quartz.impl.calendar.BaseCalendar; +import org.quartz.impl.triggers.CronTriggerImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; +import java.util.List; + +/** + *

Title: ScheduleService

+ *

Description:

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2022/12/29 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ + +public class ScheduleUtils { + + private final static Logger logger = LoggerFactory.getLogger(ScheduleUtils.class); + + /** + * job是否存在 + * @param scheduler 调度器 + * @param jobId ID + */ + public static Boolean checkExists(Scheduler scheduler, String jobId){ + return checkExists(scheduler, jobId, QuartzConstant.JOB_GROUP_DEFAULT); + } + + /** + * 创建定时任务 + * @param scheduler 调度器 + * @param planInfo 计划信息 + */ + public static void createScheduleJob(Scheduler scheduler, AtuPlanInfo planInfo){ + Class jobClass = QuartzJobExecution.class; + + // 构建job信息 + String jobId = planInfo.getId(); + JobKey jobKey = getJobKey(jobId, QuartzConstant.JOB_GROUP_DEFAULT); + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobKey).build(); + + //判空 + if(StringUtils.isBlank(planInfo.getCronExpr())){ + return; + } + // 表达式调度构建器 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(planInfo.getCronExpr()); + + try { + // 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger() + .withIdentity(getTriggerKey(jobId, QuartzConstant.JOB_GROUP_DEFAULT)) + .withSchedule(cronScheduleBuilder) + .build(); + // 放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(QuartzConstant.PLAN_TASK_PROPERTIES, planInfo); + + // 判断是否存在 + if (scheduler.checkExists(jobKey)) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(jobKey); + } + + Date firstRunTime = scheduler.scheduleJob(jobDetail, trigger); + logger.info(jobDetail.getKey() + " 将运行于:" + firstRunTime); + + } catch (Exception e) { + logger.error("创建Job失败", e); + } + } + + /** + * job是否存在 + * @param scheduler 调度器 + * @param jobId ID + * @param jobGroup group + */ + public static Boolean checkExists(Scheduler scheduler, String jobId, String jobGroup){ + JobKey jobKey = getJobKey(jobId, jobGroup); + try { + return scheduler.checkExists(jobKey); + }catch (Exception e){ + logger.error("删除Job失败", e); + } + return false; + } + + /** + * 删除job + * @param scheduler 调度器 + * @param jobId ID + */ + public static void deleteJob(Scheduler scheduler, String jobId){ + deleteJob(scheduler, jobId, QuartzConstant.JOB_GROUP_DEFAULT); + } + + /** + * 删除job + * @param scheduler 调度器 + * @param jobId ID + * @param jobGroup group + */ + public static void deleteJob(Scheduler scheduler, String jobId, String jobGroup){ + JobKey jobKey = getJobKey(jobId, jobGroup); + try { + scheduler.deleteJob(jobKey); + }catch (Exception e){ + logger.error("删除Job失败", e); + } + } + + /** + * 获取下几次执行时间 + * @param cronExpr Cron表达式 + * @param num 次数 + * @return 结果集 + */ + public static List getNextTriggerTimes(String cronExpr, int num){ + try { + CronTriggerImpl cronTrigger = new CronTriggerImpl(); + cronTrigger.setCronExpression(cronExpr); + BaseCalendar cal = new BaseCalendar(); + return TriggerUtils.computeFireTimes(cronTrigger, cal, num); + }catch (Exception e){ + logger.error("获取下几次执行时间失败", e); + } + return null; + } + + /** + * 获取下一次执行时间 + * @param cronExpr Cron表达式 + * @return 下一次执行时间 + */ + public static Date getNextOneTriggerTime(String cronExpr){ + List nextTriggerTimes = getNextTriggerTimes(cronExpr, 1); + if (nextTriggerTimes != null && nextTriggerTimes.size() > 0){ + return nextTriggerTimes.get(0); + } + return null; + } + + + /** + * 构建任务触发对象 + */ + public static TriggerKey getTriggerKey(String jobId, String jobGroup){ + return TriggerKey.triggerKey(QuartzConstant.PLAN_TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 构建任务键对象 + */ + public static JobKey getJobKey(String jobId, String jobGroup) + { + return JobKey.jobKey(QuartzConstant.PLAN_TASK_CLASS_NAME + jobId, jobGroup); + } +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/EnvNameUtils.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/EnvNameUtils.java new file mode 100644 index 0000000..670d241 --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/EnvNameUtils.java @@ -0,0 +1,48 @@ +package net.northking.cctp.executePlan.utils; + +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.constants.BaseDefineDependencyConstants; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.entity.Environment; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.exception.InvalidException; +import com.hzbank.testteam.autotest.dependencies.baseDefineDependency.vo.ResponseVO; +import net.northking.cctp.common.feign.ApiAtsEnviromentFeign; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class EnvNameUtils { + + private static final Logger logger = LoggerFactory.getLogger(EnvNameUtils.class); + + @Autowired + private ApiAtsEnviromentFeign apiAtsEnviromentFeign; + + public String getEnvName(String envId) { + if (StringUtils.isNotBlank(envId)) { + Long id = null; + try { + id = Long.valueOf(envId); + } catch (NumberFormatException e) { + logger.error("环境Id类型转化异常"); + throw new InvalidException("环境Id类型转化异常"); + } + List envIds = new ArrayList<>(); + envIds.add(id); + ResponseVO> responseVo = apiAtsEnviromentFeign.getEnvInfoById(envIds); + if (responseVo == null || !responseVo.getCode().equals(BaseDefineDependencyConstants.SYSTEM_RESPONSE_CODE_SUCCESS)) { + throw new InvalidException("服务间调用获取环境信息失败"); + } + + if (responseVo.getData() != null) { + return responseVo.getData().get(0).getName(); + } + } + return null; + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/MinioPathUtils.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/MinioPathUtils.java new file mode 100644 index 0000000..45fa47a --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/MinioPathUtils.java @@ -0,0 +1,167 @@ +package net.northking.cctp.executePlan.utils; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSON; +import net.northking.cctp.common.exception.PlatformRuntimeException; +import net.northking.cctp.common.s3.SimpleStorageService; +import net.northking.cctp.common.util.UUIDUtil; +import net.northking.cctp.executePlan.exception.ExecPlanError; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.io.*; +import java.nio.charset.StandardCharsets; + +/** + * @author chenjianfeng + */ +@Component +public class MinioPathUtils { + private static final Logger logger = LoggerFactory.getLogger(MinioPathUtils.class); + + private static final String TEMP_FILE_PATH = MinioPathUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + + public static final String DIAGONAL = "/"; + + public static final String UNDERLINE = "_"; + + /** + * 第一个是租户id,第二个是文件id,第三个是文件名 + * @param fileId + * @return + */ + public static String[] idToPath(String fileId) { + String[] result = new String[3]; + if (fileId.startsWith("/") || fileId.startsWith("_")) { + fileId = fileId.substring(1); + } + if (fileId.endsWith("/") || fileId.endsWith("_")) { + fileId = fileId.substring(0, fileId.length() - 1); + } + int index = fileId.indexOf("_"); + result[0] = fileId.substring(0, index); //租户id + result[1] = fileId.substring(index + 1); //文件id + result[2] = result[1]; //文件名 + return result; + } + + public static File objectToJsonFile(T t) { + String objectStr = JSON.toJSONString(t); + byte[] bytes; + bytes = objectStr.getBytes(StandardCharsets.UTF_8); + //获取脚本输入流 + ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); + File tempFilePath = new File(TEMP_FILE_PATH); + if (!tempFilePath.exists()) { + tempFilePath.mkdirs(); + } + File file = new File(TEMP_FILE_PATH + "/tempFile" + UUIDUtil.create32UUID() + ".json"); + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(file); + byte[] readBytes = new byte[1024 * 1024]; + int length; + while ((length = inputStream.read(readBytes, 0, readBytes.length)) > 0) { + fileOutputStream.write(readBytes,0,length); + } + fileOutputStream.flush(); + } catch (Exception e) { + logger.error("object写入文件出错"); + }finally { + try { + inputStream.close(); + } catch (IOException e) { + logger.error("关闭文件流异常", e); + } + try { + if (null != fileOutputStream) { + fileOutputStream.close(); + } + } catch (IOException e) { + logger.error("关闭文件流异常", e); + } + } + return file; + } + + public static T getFileContent(InputStream inputStream, Class clazz) { + InputStreamReader streamReader = null; + BufferedReader reader = null; + T t = null; + try { + streamReader = new InputStreamReader(inputStream,StandardCharsets.UTF_8); + reader = new BufferedReader(streamReader); + StringBuilder builder = new StringBuilder(); + String temp; + while (null != (temp = reader.readLine())) { + builder.append(temp); + } + String jsonStr = builder.toString(); + if (StringUtils.hasText(jsonStr)) { + t = JSON.parseObject(JSON.parse(jsonStr).toString(), clazz); + } + } catch (IOException e) { + logger.error("读取文件内容失败"); + throw new PlatformRuntimeException(ExecPlanError.DOWNLOAD_SCRIPT_FAIL); + }finally { + if (null != streamReader) { + try { + streamReader.close(); + } catch (IOException e) { + logger.error("关闭文件流异常", e); + } + } + if (null != reader) { + try { + reader.close(); + } catch (IOException e) { + logger.error("关闭文件流异常", e); + } + } + } + return t; + } + + /** + * 文件下载并转换成对象 + * @param filePath 文件地址 + * @param clazz 需转换的对象 + * @return 结果 + */ + public static T downloadFileCoverObj(SimpleStorageService simpleStorageService, String tenantId, + String filePath, Class clazz){ + File file = null; + T t = null; + if (StrUtil.isBlank(filePath)){ + logger.debug("需下载的文件地址为空"); + return t; + } + try { + logger.debug("需下载的文件地址:{}", filePath); + String path = filePath.replace(tenantId, ""); + path = path.replace("_","/"); + logger.debug("转换后的地址:{}", path); + file = simpleStorageService.downloadAsFile(tenantId, path); + byte[] bytes = FileUtil.readBytes(file); + if (bytes != null){ + String jsonStr = new String(bytes, StandardCharsets.UTF_8); + t = JSONUtil.toBean(jsonStr, clazz); + } + } catch (Exception e) { + logger.error("读取结果文件失败", e); + } finally { + // 删除下载的临时文件 + if (file != null) { + if (!file.delete()) { + logger.error("临时文件删除失败, file => " + file.getAbsolutePath()); + } + } + } + return t; + } + +} diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/PercentageCalculatorUtil.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/PercentageCalculatorUtil.java new file mode 100644 index 0000000..a54839c --- /dev/null +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/utils/PercentageCalculatorUtil.java @@ -0,0 +1,143 @@ +package net.northking.cctp.executePlan.utils; + +import cn.hutool.core.collection.CollUtil; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +/** + *

Title: PercentageCalculatorUtil

+ *

Description: 百分比计算

+ * + * @Author chenjianfeng + * @Version V1.0 + * @Date 2023/9/26 17:09 + *

Copyright (c) 京北方信息技术股份有限公司 Corporation 2022 . All rights reserved.

+ */ +public class PercentageCalculatorUtil { + + public static final int ONE_HUNDRED = 100; + + public static List