车联网初始化基础系统
commit
9ca487fc0c
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,438 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AutoImportSettings">
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="f46403b6-513c-4e7c-a74f-331186dfe228" name="更改" comment="">
|
||||
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/logs/vehicle.log" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-common/pom.xml" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/pom.xml" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/src/main/java/com/mobai/TrainLoadApplication.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/src/main/java/com/mobai/controller/FluxMqController.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/src/main/java/com/mobai/controller/Sample.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/src/main/java/com/mobai/domain/req/FluxLoginReq.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/src/main/java/com/mobai/mq/fluxmq/FluxMqInit.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/src/main/java/com/mobai/mq/rabbitmq/Custom.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/src/main/java/com/mobai/service/FluxService.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/src/main/java/com/mobai/service/FluxServiceImpl.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/target/classes/com/mobai/TrainLoadApplication.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/target/classes/com/mobai/controller/FluxMqController.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/target/classes/com/mobai/controller/Sample.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/target/classes/com/mobai/domain/req/FluxLoginReq.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/target/classes/com/mobai/mq/fluxmq/FluxMqInit.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/target/classes/com/mobai/mq/rabbitmq/Custom.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/target/classes/com/mobai/service/FluxService.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-load/target/classes/com/mobai/service/FluxServiceImpl.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/pom.xml" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/TrainNetWorkingApplication.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/common/HttpStatus.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/common/PageList.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/common/Result.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/common/SystemConstant.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/common/pool/FixedThreadPool.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/common/pool/ScheduledThreadPool.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/config/ExceptionAdvice.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/config/MyMetaObjectHandler.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/config/MybatisPlusConfig.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/controller/IndexController.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/controller/Sample.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/controller/VehicleController.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/controller/VehicleInstanceController.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/controller/VehiclePositionController.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/controller/VehicleUnifiedController.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/controller/VerifyController.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/domain/PositionRouteInfo.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/domain/Vehicle.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/domain/model/MqttServerModel.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/domain/model/PositionModel.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/domain/model/TaskModel.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/domain/req/CheckPositionReq.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/domain/req/GearReq.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/domain/req/MsgReq.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/domain/req/VehicleCreateAddReq.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/domain/req/VehicleInstanceListReq.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/domain/resp/UnifiedTaskResp.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/domain/resp/VehicleInstanceResp.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/mapper/PositionRouteMapper.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/mapper/VehicleMapper.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/service/PositionRouteService.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/service/VehicleInstanceService.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/service/VehicleService.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/service/VehicleUnifiedService.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/service/impl/PositionRouteServiceImpl.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/service/impl/VechileServiceImpl.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/service/impl/VehicleInstanceServiceImpl.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/service/impl/VehicleUnifiedServiceImpl.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/utils/CalculateCheckDigit.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/utils/ConversionUtil.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/utils/Convert.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/utils/MD5Util.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/utils/ReflectUtils.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/utils/VehicleUtils.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/vehicle/1" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/vehicle/VehicleInstance.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/vehicle/api/ClientAdmin.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/vehicle/api/req/VehicleConnectionReq.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/vehicle/core/LocalContainer.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/vehicle/core/VehicleConfiguration.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/vehicle/model/VehicleData.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/vehicle/model/properties/MqttProperties.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/java/com/mobai/vehicle/thread/VehicleThread.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/application.yml" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/data.sql" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/schema.sql" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/css/app.949a0224.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/css/chunk-22cea610.3c7f5ad9.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/css/chunk-510f32e7.1510e3c5.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/css/chunk-630a64ed.9a9361c6.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/css/chunk-cefe5306.0a41cd80.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/css/chunk-elementUI.c1c3b808.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/css/chunk-libs.3dfb7769.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/favicon.ico" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/fonts/element-icons.535877f5.woff" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/fonts/element-icons.732389de.ttf" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/img/404.a57b6f31.png" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/img/404_cloud.0f4bc32b.png" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/index.html" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/js/app.967d9126.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/js/chunk-019c66da.ded8571e.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/js/chunk-22cea610.a50359dd.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/js/chunk-510f32e7.18a692c7.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/js/chunk-630a64ed.8295bd3f.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/js/chunk-cefe5306.756dde8f.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/js/chunk-elementUI.2491fb2f.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/src/main/resources/static/js/chunk-libs.2ec7c235.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/application.yml" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/TrainNetWorkingApplication.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/common/HttpStatus.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/common/PageList$PageListBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/common/PageList.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/common/Result.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/common/SystemConstant.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/common/pool/FixedThreadPool.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/common/pool/ScheduledThreadPool.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/config/ExceptionAdvice.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/config/MyMetaObjectHandler.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/config/MybatisPlusConfig.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/controller/IndexController.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/controller/VehicleController.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/controller/VehicleInstanceController.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/controller/VehiclePositionController.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/controller/VehicleUnifiedController.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/controller/VerifyController.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/PositionRouteInfo$PositionRouteInfoBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/PositionRouteInfo.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/Vehicle$VehicleBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/Vehicle.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/model/MqttServerModel$MqttServerModelBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/model/MqttServerModel.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/model/PositionModel$PositionModelBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/model/PositionModel.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/model/TaskModel$TaskModelBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/model/TaskModel.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/req/CheckPositionReq$CheckPositionReqBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/req/CheckPositionReq.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/req/GearReq$GearReqBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/req/GearReq.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/req/MsgReq$MsgReqBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/req/MsgReq.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/req/VehicleCreateAddReq$VehicleCreateAddReqBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/req/VehicleCreateAddReq.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/req/VehicleInstanceListReq$VehicleInstanceListReqBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/req/VehicleInstanceListReq.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/resp/UnifiedTaskResp$UnifiedTaskRespBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/resp/UnifiedTaskResp.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/resp/VehicleInstanceResp$VehicleInstanceRespBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/domain/resp/VehicleInstanceResp.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/mapper/PositionRouteMapper.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/mapper/VehicleMapper.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/service/PositionRouteService.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/service/VehicleInstanceService.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/service/VehicleService.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/service/VehicleUnifiedService.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/service/impl/PositionRouteServiceImpl.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/service/impl/VechileServiceImpl.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/service/impl/VehicleInstanceServiceImpl.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/service/impl/VehicleUnifiedServiceImpl.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/utils/CalculateCheckDigit.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/utils/ConversionUtil.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/utils/Convert.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/utils/MD5Util.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/utils/ReflectUtils.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/utils/VehicleUtils.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/vehicle/VehicleInstance$VehicleInstanceBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/vehicle/VehicleInstance.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/vehicle/api/ClientAdmin.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/vehicle/api/req/VehicleConnectionReq$VehicleConnectionReqBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/vehicle/api/req/VehicleConnectionReq.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/vehicle/core/LocalContainer.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/vehicle/core/VehicleConfiguration.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/vehicle/model/VehicleData$VehicleDataBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/vehicle/model/VehicleData.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/vehicle/model/properties/MqttProperties$MqttPropertiesBuilder.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/vehicle/model/properties/MqttProperties.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/com/mobai/vehicle/thread/VehicleThread.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/data.sql" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/schema.sql" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/css/app.949a0224.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/css/chunk-22cea610.3c7f5ad9.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/css/chunk-510f32e7.1510e3c5.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/css/chunk-630a64ed.9a9361c6.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/css/chunk-cefe5306.0a41cd80.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/css/chunk-elementUI.c1c3b808.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/css/chunk-libs.3dfb7769.css" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/favicon.ico" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/fonts/element-icons.535877f5.woff" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/fonts/element-icons.732389de.ttf" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/img/404.a57b6f31.png" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/img/404_cloud.0f4bc32b.png" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/index.html" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/js/app.967d9126.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/js/chunk-019c66da.ded8571e.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/js/chunk-22cea610.a50359dd.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/js/chunk-510f32e7.18a692c7.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/js/chunk-630a64ed.8295bd3f.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/js/chunk-cefe5306.756dde8f.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/js/chunk-elementUI.2491fb2f.js" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/train-networking/target/classes/static/js/chunk-libs.2ec7c235.js" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="FileTemplateManagerImpl">
|
||||
<option name="RECENT_TEMPLATES">
|
||||
<list>
|
||||
<option value="Interface" />
|
||||
<option value="Class" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
<option name="ROOT_SYNC" value="SYNC" />
|
||||
</component>
|
||||
<component name="MavenImportPreferences">
|
||||
<option name="generalSettings">
|
||||
<MavenGeneralSettings>
|
||||
<option name="mavenHome" value="C:/maven/apache-maven-3.6.3" />
|
||||
<option name="userSettingsFile" value="C:\maven\apache-maven-3.6.3\conf\settings.xml" />
|
||||
</MavenGeneralSettings>
|
||||
</option>
|
||||
<option name="importingSettings">
|
||||
<MavenImportingSettings>
|
||||
<option name="jdkForImporter" value="17" />
|
||||
</MavenImportingSettings>
|
||||
</option>
|
||||
</component>
|
||||
<component name="MavenRunner">
|
||||
<option name="jreName" value="17" />
|
||||
<option name="vmOptions" value="-Dfile.encoding=GBK" />
|
||||
</component>
|
||||
<component name="ProjectColorInfo">{
|
||||
"associatedIndex": 8
|
||||
}</component>
|
||||
<component name="ProjectId" id="2h1o67JDJOT3DqlRlCtxF5lSyFl" />
|
||||
<component name="ProjectLevelVcsManager" settingsEditedManually="true">
|
||||
<ConfirmationsSetting value="2" id="Add" />
|
||||
</component>
|
||||
<component name="ProjectViewState">
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent">{
|
||||
"keyToString": {
|
||||
"RequestMappingsPanelOrder0": "0",
|
||||
"RequestMappingsPanelOrder1": "1",
|
||||
"RequestMappingsPanelWidth0": "75",
|
||||
"RequestMappingsPanelWidth1": "75",
|
||||
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"WebServerToolWindowFactoryState": "false",
|
||||
"jdk.selected.JAVA_MODULE": "17",
|
||||
"last_opened_file_path": "D:/muyu/train_project/train-common/src/main/java/com/mobai",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.standard": "true",
|
||||
"node.js.detected.package.stylelint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
"node.js.selected.package.standard": "",
|
||||
"node.js.selected.package.stylelint": "",
|
||||
"node.js.selected.package.tslint": "(autodetect)",
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"project.structure.last.edited": "模块",
|
||||
"project.structure.proportion": "0.15",
|
||||
"project.structure.side.proportion": "0.2",
|
||||
"settings.editor.selected.configurable": "vcs.Git",
|
||||
"vue.rearranger.settings.migration": "true"
|
||||
},
|
||||
"keyToStringList": {
|
||||
"ChangesTree.GroupingKeys": [
|
||||
"directory",
|
||||
"module"
|
||||
]
|
||||
}
|
||||
}</component>
|
||||
<component name="RecentsManager">
|
||||
<key name="CreateClassDialog.RecentsKey">
|
||||
<recent name="com.mobai.domain.req" />
|
||||
<recent name="com.mobai.service.impl" />
|
||||
<recent name="com.mobai.service" />
|
||||
</key>
|
||||
<key name="CopyFile.RECENT_KEYS">
|
||||
<recent name="D:\muyu\train_project\train-common\src\main\java\com\mobai" />
|
||||
<recent name="D:\muyu\train_project\train-load\src\main\java\com\mobai" />
|
||||
<recent name="D:\muyu\train_project\Train_NetWorking\src\main\resources" />
|
||||
<recent name="D:\muyu\train_project\Train_NetWorking\src\main\java\com" />
|
||||
</key>
|
||||
<key name="MoveFile.RECENT_KEYS">
|
||||
<recent name="D:\muyu\train_project" />
|
||||
</key>
|
||||
<key name="CopyClassDialog.RECENTS_KEY">
|
||||
<recent name="com.mobai.controller" />
|
||||
<recent name="com.mobai.domain" />
|
||||
</key>
|
||||
</component>
|
||||
<component name="RunDashboard">
|
||||
<option name="configurationTypes">
|
||||
<set>
|
||||
<option value="SpringBootApplicationConfigurationType" />
|
||||
</set>
|
||||
</option>
|
||||
</component>
|
||||
<component name="RunManager" selected="Spring Boot.TrainLoadApplication">
|
||||
<configuration default="true" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
|
||||
<option name="SPRING_BOOT_MAIN_CLASS" />
|
||||
<option name="UPDATE_ACTION_UPDATE_POLICY" value="UpdateClassesAndResources" />
|
||||
<method v="2">
|
||||
<option name="MakeProject" enabled="true" />
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration name="TrainLoadApplication" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
|
||||
<option name="MAIN_CLASS_NAME" value="com.mobai.TrainLoadApplication" />
|
||||
<module name="train-load" />
|
||||
<extension name="coverage">
|
||||
<pattern>
|
||||
<option name="PATTERN" value="com.mobai.common.*" />
|
||||
<option name="ENABLED" value="true" />
|
||||
</pattern>
|
||||
</extension>
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration default="true" type="JetRunConfigurationType">
|
||||
<module name="train_project" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration default="true" type="KotlinStandaloneScriptRunConfigurationType">
|
||||
<module name="train_project" />
|
||||
<option name="filePath" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration name="TrainLoadApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
|
||||
<module name="train-load" />
|
||||
<option name="SPRING_BOOT_MAIN_CLASS" value="com.mobai.TrainLoadApplication" />
|
||||
<option name="UPDATE_ACTION_UPDATE_POLICY" value="UpdateClassesAndResources" />
|
||||
<extension name="coverage">
|
||||
<pattern>
|
||||
<option name="PATTERN" value="com.mobai.*" />
|
||||
<option name="ENABLED" value="true" />
|
||||
</pattern>
|
||||
</extension>
|
||||
<method v="2">
|
||||
<option name="MakeProject" enabled="true" />
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration name="TrainNetWorkingApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
|
||||
<module name="train-networking" />
|
||||
<option name="SPRING_BOOT_MAIN_CLASS" value="com.mobai.TrainNetWorkingApplication" />
|
||||
<option name="UPDATE_ACTION_UPDATE_POLICY" value="UpdateClassesAndResources" />
|
||||
<extension name="coverage">
|
||||
<pattern>
|
||||
<option name="PATTERN" value="com.mobai.*" />
|
||||
<option name="ENABLED" value="true" />
|
||||
</pattern>
|
||||
</extension>
|
||||
<method v="2">
|
||||
<option name="MakeProject" enabled="true" />
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration default="true" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
|
||||
<option name="SPRING_BOOT_MAIN_CLASS" />
|
||||
<option name="UPDATE_ACTION_UPDATE_POLICY" value="UpdateClassesAndResources" />
|
||||
<method v="2">
|
||||
<option name="MakeProject" enabled="true" />
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<recent_temporary>
|
||||
<list>
|
||||
<item itemvalue="Spring Boot.TrainNetWorkingApplication" />
|
||||
<item itemvalue="Spring Boot.TrainLoadApplication" />
|
||||
<item itemvalue="应用程序.TrainLoadApplication" />
|
||||
</list>
|
||||
</recent_temporary>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
|
||||
<component name="SvnConfiguration">
|
||||
<configuration>C:\Users\墨白\AppData\Roaming\Subversion</configuration>
|
||||
</component>
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="默认任务">
|
||||
<changelist id="f46403b6-513c-4e7c-a74f-331186dfe228" name="更改" comment="" />
|
||||
<created>1716770766774</created>
|
||||
<option name="number" value="Default" />
|
||||
<option name="presentableId" value="Default" />
|
||||
<updated>1716770766774</updated>
|
||||
<workItem from="1716770767940" duration="3579000" />
|
||||
<workItem from="1716774378386" duration="12152000" />
|
||||
<workItem from="1716800548020" duration="141000" />
|
||||
<workItem from="1716800719338" duration="552000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
<option name="version" value="3" />
|
||||
</component>
|
||||
<component name="Vcs.Log.Tabs.Properties">
|
||||
<option name="TAB_STATES">
|
||||
<map>
|
||||
<entry key="MAIN">
|
||||
<value>
|
||||
<State>
|
||||
<option name="FILTERS">
|
||||
<map>
|
||||
<entry key="branch">
|
||||
<value>
|
||||
<list>
|
||||
<option value="master" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
</map>
|
||||
</option>
|
||||
</State>
|
||||
</value>
|
||||
</entry>
|
||||
</map>
|
||||
</option>
|
||||
</component>
|
||||
<component name="XSLT-Support.FileAssociations.UIState">
|
||||
<expand />
|
||||
<select />
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,657 @@
|
|||
2024-05-27 08:58:20.131 [main] INFO com.mobai.TrainNetWorkingApplication:55 - Starting VehicleSimulationApplication using Java 17.0.10 on MoBai with PID 20012 (D:\mobai\train_project\Train_NetWorking\target\classes started by 墨白 in D:\mobai\train_project)
|
||||
2024-05-27 08:58:20.140 [main] INFO com.mobai.TrainNetWorkingApplication:631 - No active profile set, falling back to 1 default profile: "default"
|
||||
2024-05-27 08:58:22.974 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer:108 - Tomcat initialized with port(s): 81 (http)
|
||||
2024-05-27 08:58:22.996 [main] INFO org.apache.catalina.core.StandardService:173 - Starting service [Tomcat]
|
||||
2024-05-27 08:58:22.997 [main] INFO org.apache.catalina.core.StandardEngine:173 - Starting Servlet engine: [Apache Tomcat/9.0.79]
|
||||
2024-05-27 08:58:23.335 [main] INFO o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]:173 - Initializing Spring embedded WebApplicationContext
|
||||
2024-05-27 08:58:23.336 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext:292 - Root WebApplicationContext: initialization completed in 3052 ms
|
||||
2024-05-27 08:58:23.395 [main] INFO com.zaxxer.hikari.HikariDataSource:110 - HikariPool-1 - Starting...
|
||||
2024-05-27 08:58:37.850 [main] INFO com.zaxxer.hikari.HikariDataSource:123 - HikariPool-1 - Start completed.
|
||||
2024-05-27 08:58:37.914 [main] INFO o.s.b.autoconfigure.h2.H2ConsoleAutoConfiguration:98 - H2 console available at '/h2-console'. Database available at 'jdbc:h2:file:~/vehicle/db'
|
||||
2024-05-27 08:58:39.137 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext:591 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vehicleController': Unsatisfied dependency expressed through field 'vehicleService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\mobai\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
2024-05-27 08:58:39.140 [main] INFO com.zaxxer.hikari.HikariDataSource:350 - HikariPool-1 - Shutdown initiated...
|
||||
2024-05-27 08:58:39.247 [main] INFO com.zaxxer.hikari.HikariDataSource:352 - HikariPool-1 - Shutdown completed.
|
||||
2024-05-27 08:58:39.261 [main] INFO org.apache.catalina.core.StandardService:173 - Stopping service [Tomcat]
|
||||
2024-05-27 08:58:39.369 [main] INFO o.s.b.a.l.ConditionEvaluationReportLoggingListener:136 -
|
||||
|
||||
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
|
||||
2024-05-27 08:58:39.888 [main] ERROR org.springframework.boot.SpringApplication:821 - Application run failed
|
||||
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vehicleController': Unsatisfied dependency expressed through field 'vehicleService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\mobai\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:662)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:642)
|
||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955)
|
||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:921)
|
||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
|
||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731)
|
||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
|
||||
at com.mobai.TrainNetWorkingApplication.main(VehicleSimulationApplication.java:18)
|
||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\mobai\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:662)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:642)
|
||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)
|
||||
... 20 common frames omitted
|
||||
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\mobai\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)
|
||||
... 34 common frames omitted
|
||||
Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.util.Assert.notNull(Assert.java:201)
|
||||
at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:122)
|
||||
at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:73)
|
||||
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
|
||||
... 44 common frames omitted
|
||||
2024-05-27 08:59:54.312 [main] INFO com.mobai.TrainNetWorkingApplication:55 - Starting VehicleSimulationApplication using Java 17.0.10 on MoBai with PID 25136 (D:\mobai\train_project\Train_NetWorking\target\classes started by 墨白 in D:\mobai\train_project)
|
||||
2024-05-27 08:59:54.318 [main] DEBUG com.mobai.TrainNetWorkingApplication:56 - Running with Spring Boot v2.7.15, Spring v5.3.29
|
||||
2024-05-27 08:59:54.320 [main] INFO com.mobai.TrainNetWorkingApplication:631 - No active profile set, falling back to 1 default profile: "default"
|
||||
2024-05-27 08:59:57.315 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer:108 - Tomcat initialized with port(s): 81 (http)
|
||||
2024-05-27 08:59:57.431 [main] INFO org.apache.catalina.core.StandardService:173 - Starting service [Tomcat]
|
||||
2024-05-27 08:59:57.432 [main] INFO org.apache.catalina.core.StandardEngine:173 - Starting Servlet engine: [Apache Tomcat/9.0.79]
|
||||
2024-05-27 08:59:58.155 [main] INFO o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]:173 - Initializing Spring embedded WebApplicationContext
|
||||
2024-05-27 08:59:58.156 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext:292 - Root WebApplicationContext: initialization completed in 3678 ms
|
||||
2024-05-27 08:59:58.216 [main] INFO com.zaxxer.hikari.HikariDataSource:110 - HikariPool-1 - Starting...
|
||||
2024-05-27 09:00:09.804 [main] ERROR com.zaxxer.hikari.pool.HikariPool:594 - HikariPool-1 - Exception during pool initialization.
|
||||
org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-214]
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:510)
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:477)
|
||||
at org.h2.message.DbException.get(DbException.java:223)
|
||||
at org.h2.message.DbException.get(DbException.java:199)
|
||||
at org.h2.message.DbException.get(DbException.java:188)
|
||||
at org.h2.engine.Engine.validateUserAndPassword(Engine.java:393)
|
||||
at org.h2.engine.Engine.createSession(Engine.java:206)
|
||||
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:338)
|
||||
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:122)
|
||||
at org.h2.Driver.connect(Driver.java:59)
|
||||
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
|
||||
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364)
|
||||
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206)
|
||||
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476)
|
||||
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561)
|
||||
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
|
||||
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
|
||||
at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.lambda$logDataSources$1(H2ConsoleAutoConfiguration.java:86)
|
||||
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
|
||||
at java.base/java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:395)
|
||||
at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258)
|
||||
at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258)
|
||||
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)
|
||||
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
|
||||
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
|
||||
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
|
||||
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
|
||||
at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.logDataSources(H2ConsoleAutoConfiguration.java:92)
|
||||
at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.lambda$h2Console$0(H2ConsoleAutoConfiguration.java:68)
|
||||
at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.withThreadContextClassLoader(H2ConsoleAutoConfiguration.java:77)
|
||||
at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.h2Console(H2ConsoleAutoConfiguration.java:68)
|
||||
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
|
||||
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
|
||||
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
|
||||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213)
|
||||
at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:213)
|
||||
at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:204)
|
||||
at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(ServletContextInitializerBeans.java:98)
|
||||
at org.springframework.boot.web.servlet.ServletContextInitializerBeans.<init>(ServletContextInitializerBeans.java:86)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:262)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:236)
|
||||
at org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:53)
|
||||
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4940)
|
||||
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
|
||||
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328)
|
||||
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318)
|
||||
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
|
||||
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
|
||||
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
|
||||
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
|
||||
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866)
|
||||
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:795)
|
||||
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
|
||||
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328)
|
||||
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318)
|
||||
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
|
||||
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
|
||||
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
|
||||
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
|
||||
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866)
|
||||
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:249)
|
||||
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
|
||||
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:428)
|
||||
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
|
||||
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:922)
|
||||
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
|
||||
at org.apache.catalina.startup.Tomcat.start(Tomcat.java:486)
|
||||
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123)
|
||||
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104)
|
||||
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:481)
|
||||
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:211)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:184)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162)
|
||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:577)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
|
||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731)
|
||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
|
||||
at com.mobai.TrainNetWorkingApplication.main(VehicleSimulationApplication.java:18)
|
||||
2024-05-27 09:00:09.919 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext:591 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vehicleController': Unsatisfied dependency expressed through field 'vehicleService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\mobai\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
2024-05-27 09:00:09.927 [main] INFO org.apache.catalina.core.StandardService:173 - Stopping service [Tomcat]
|
||||
2024-05-27 09:00:09.943 [main] INFO o.s.b.a.l.ConditionEvaluationReportLoggingListener:136 -
|
||||
|
||||
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
|
||||
2024-05-27 09:00:09.971 [main] ERROR org.springframework.boot.SpringApplication:821 - Application run failed
|
||||
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vehicleController': Unsatisfied dependency expressed through field 'vehicleService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\mobai\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:662)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:642)
|
||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955)
|
||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:921)
|
||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
|
||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731)
|
||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
|
||||
at com.mobai.TrainNetWorkingApplication.main(VehicleSimulationApplication.java:18)
|
||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\mobai\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:662)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:642)
|
||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)
|
||||
... 20 common frames omitted
|
||||
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\mobai\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)
|
||||
... 34 common frames omitted
|
||||
Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.util.Assert.notNull(Assert.java:201)
|
||||
at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:122)
|
||||
at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:73)
|
||||
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
|
||||
... 44 common frames omitted
|
||||
2024-05-27 09:01:45.482 [main] INFO com.mobai.TrainNetWorkingApplication:55 - Starting VehicleSimulationApplication using Java 17.0.10 on MoBai with PID 28404 (D:\muyu\train_project\Train_NetWorking\target\classes started by 墨白 in D:\muyu\train_project)
|
||||
2024-05-27 09:01:45.484 [main] DEBUG com.mobai.TrainNetWorkingApplication:56 - Running with Spring Boot v2.7.15, Spring v5.3.29
|
||||
2024-05-27 09:01:45.485 [main] INFO com.mobai.TrainNetWorkingApplication:631 - No active profile set, falling back to 1 default profile: "default"
|
||||
2024-05-27 09:01:46.590 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer:108 - Tomcat initialized with port(s): 81 (http)
|
||||
2024-05-27 09:01:46.609 [main] INFO org.apache.catalina.core.StandardService:173 - Starting service [Tomcat]
|
||||
2024-05-27 09:01:46.610 [main] INFO org.apache.catalina.core.StandardEngine:173 - Starting Servlet engine: [Apache Tomcat/9.0.79]
|
||||
2024-05-27 09:01:46.805 [main] INFO o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]:173 - Initializing Spring embedded WebApplicationContext
|
||||
2024-05-27 09:01:46.806 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext:292 - Root WebApplicationContext: initialization completed in 1262 ms
|
||||
2024-05-27 09:01:46.846 [main] INFO com.zaxxer.hikari.HikariDataSource:110 - HikariPool-1 - Starting...
|
||||
2024-05-27 09:01:58.114 [main] ERROR com.zaxxer.hikari.pool.HikariPool:594 - HikariPool-1 - Exception during pool initialization.
|
||||
org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-214]
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:510)
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:477)
|
||||
at org.h2.message.DbException.get(DbException.java:223)
|
||||
at org.h2.message.DbException.get(DbException.java:199)
|
||||
at org.h2.message.DbException.get(DbException.java:188)
|
||||
at org.h2.engine.Engine.validateUserAndPassword(Engine.java:393)
|
||||
at org.h2.engine.Engine.createSession(Engine.java:206)
|
||||
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:338)
|
||||
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:122)
|
||||
at org.h2.Driver.connect(Driver.java:59)
|
||||
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
|
||||
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364)
|
||||
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206)
|
||||
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476)
|
||||
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561)
|
||||
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
|
||||
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
|
||||
at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.lambda$logDataSources$1(H2ConsoleAutoConfiguration.java:86)
|
||||
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
|
||||
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
|
||||
at java.base/java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:395)
|
||||
at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258)
|
||||
at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258)
|
||||
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)
|
||||
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
|
||||
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
|
||||
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
|
||||
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
|
||||
at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.logDataSources(H2ConsoleAutoConfiguration.java:92)
|
||||
at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.lambda$h2Console$0(H2ConsoleAutoConfiguration.java:68)
|
||||
at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.withThreadContextClassLoader(H2ConsoleAutoConfiguration.java:77)
|
||||
at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.h2Console(H2ConsoleAutoConfiguration.java:68)
|
||||
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
|
||||
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
|
||||
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
|
||||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
|
||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213)
|
||||
at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:213)
|
||||
at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:204)
|
||||
at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(ServletContextInitializerBeans.java:98)
|
||||
at org.springframework.boot.web.servlet.ServletContextInitializerBeans.<init>(ServletContextInitializerBeans.java:86)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:262)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:236)
|
||||
at org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:53)
|
||||
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4940)
|
||||
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
|
||||
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328)
|
||||
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318)
|
||||
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
|
||||
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
|
||||
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
|
||||
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
|
||||
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866)
|
||||
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:795)
|
||||
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
|
||||
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328)
|
||||
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318)
|
||||
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
|
||||
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
|
||||
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
|
||||
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
|
||||
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866)
|
||||
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:249)
|
||||
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
|
||||
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:428)
|
||||
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
|
||||
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:922)
|
||||
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
|
||||
at org.apache.catalina.startup.Tomcat.start(Tomcat.java:486)
|
||||
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123)
|
||||
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104)
|
||||
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:481)
|
||||
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:211)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:184)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162)
|
||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:577)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
|
||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731)
|
||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
|
||||
at com.mobai.TrainNetWorkingApplication.main(VehicleSimulationApplication.java:18)
|
||||
2024-05-27 09:01:58.200 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext:591 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vehicleController': Unsatisfied dependency expressed through field 'vehicleService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\muyu\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
2024-05-27 09:01:58.204 [main] INFO org.apache.catalina.core.StandardService:173 - Stopping service [Tomcat]
|
||||
2024-05-27 09:01:58.214 [main] INFO o.s.b.a.l.ConditionEvaluationReportLoggingListener:136 -
|
||||
|
||||
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
|
||||
2024-05-27 09:01:58.231 [main] ERROR org.springframework.boot.SpringApplication:821 - Application run failed
|
||||
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vehicleController': Unsatisfied dependency expressed through field 'vehicleService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\muyu\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:662)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:642)
|
||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955)
|
||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:921)
|
||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
|
||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731)
|
||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
|
||||
at com.mobai.TrainNetWorkingApplication.main(VehicleSimulationApplication.java:18)
|
||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\muyu\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:662)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:642)
|
||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)
|
||||
... 20 common frames omitted
|
||||
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\muyu\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)
|
||||
... 34 common frames omitted
|
||||
Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.util.Assert.notNull(Assert.java:201)
|
||||
at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:122)
|
||||
at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:73)
|
||||
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
|
||||
... 44 common frames omitted
|
||||
2024-05-27 09:03:19.776 [main] INFO com.mobai.TrainNetWorkingApplication:55 - Starting VehicleSimulationApplication using Java 17.0.10 on MoBai with PID 4108 (D:\muyu\train_project\Train_NetWorking\target\classes started by 墨白 in D:\muyu\train_project)
|
||||
2024-05-27 09:03:19.780 [main] DEBUG com.mobai.TrainNetWorkingApplication:56 - Running with Spring Boot v2.7.15, Spring v5.3.29
|
||||
2024-05-27 09:03:19.781 [main] INFO com.mobai.TrainNetWorkingApplication:631 - No active profile set, falling back to 1 default profile: "default"
|
||||
2024-05-27 09:03:20.898 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer:108 - Tomcat initialized with port(s): 81 (http)
|
||||
2024-05-27 09:03:20.909 [main] INFO org.apache.catalina.core.StandardService:173 - Starting service [Tomcat]
|
||||
2024-05-27 09:03:20.909 [main] INFO org.apache.catalina.core.StandardEngine:173 - Starting Servlet engine: [Apache Tomcat/9.0.79]
|
||||
2024-05-27 09:03:21.080 [main] INFO o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]:173 - Initializing Spring embedded WebApplicationContext
|
||||
2024-05-27 09:03:21.080 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext:292 - Root WebApplicationContext: initialization completed in 1246 ms
|
||||
2024-05-27 09:03:21.109 [main] INFO com.zaxxer.hikari.HikariDataSource:110 - HikariPool-1 - Starting...
|
||||
2024-05-27 09:03:30.937 [main] INFO com.zaxxer.hikari.HikariDataSource:123 - HikariPool-1 - Start completed.
|
||||
2024-05-27 09:03:30.947 [main] INFO o.s.b.autoconfigure.h2.H2ConsoleAutoConfiguration:98 - H2 console available at '/h2-console'. Database available at 'jdbc:h2:file:~/vehicle/db'
|
||||
2024-05-27 09:03:31.027 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext:591 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vehicleController': Unsatisfied dependency expressed through field 'vehicleService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\muyu\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
2024-05-27 09:03:31.028 [main] INFO com.zaxxer.hikari.HikariDataSource:350 - HikariPool-1 - Shutdown initiated...
|
||||
2024-05-27 09:03:31.030 [main] INFO com.zaxxer.hikari.HikariDataSource:352 - HikariPool-1 - Shutdown completed.
|
||||
2024-05-27 09:03:31.034 [main] INFO org.apache.catalina.core.StandardService:173 - Stopping service [Tomcat]
|
||||
2024-05-27 09:03:31.043 [main] INFO o.s.b.a.l.ConditionEvaluationReportLoggingListener:136 -
|
||||
|
||||
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
|
||||
2024-05-27 09:03:31.065 [main] ERROR org.springframework.boot.SpringApplication:821 - Application run failed
|
||||
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vehicleController': Unsatisfied dependency expressed through field 'vehicleService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\muyu\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:662)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:642)
|
||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955)
|
||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:921)
|
||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
|
||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731)
|
||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
|
||||
at com.mobai.TrainNetWorkingApplication.main(VehicleSimulationApplication.java:18)
|
||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\muyu\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:662)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:642)
|
||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)
|
||||
... 20 common frames omitted
|
||||
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\muyu\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)
|
||||
... 34 common frames omitted
|
||||
Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.util.Assert.notNull(Assert.java:201)
|
||||
at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:122)
|
||||
at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:73)
|
||||
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
|
||||
... 44 common frames omitted
|
||||
2024-05-27 09:31:49.807 [main] INFO com.mobai.TrainNetWorkingApplication:55 - Starting TrainNetWorkingApplication using Java 17.0.10 on MoBai with PID 24424 (D:\muyu\train_project\Train_NetWorking\target\classes started by 墨白 in D:\muyu\train_project)
|
||||
2024-05-27 09:31:49.810 [main] DEBUG com.mobai.TrainNetWorkingApplication:56 - Running with Spring Boot v2.7.15, Spring v5.3.29
|
||||
2024-05-27 09:31:49.811 [main] INFO com.mobai.TrainNetWorkingApplication:631 - No active profile set, falling back to 1 default profile: "default"
|
||||
2024-05-27 09:31:51.601 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer:108 - Tomcat initialized with port(s): 81 (http)
|
||||
2024-05-27 09:31:51.624 [main] INFO org.apache.catalina.core.StandardService:173 - Starting service [Tomcat]
|
||||
2024-05-27 09:31:51.624 [main] INFO org.apache.catalina.core.StandardEngine:173 - Starting Servlet engine: [Apache Tomcat/9.0.79]
|
||||
2024-05-27 09:31:51.873 [main] INFO o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]:173 - Initializing Spring embedded WebApplicationContext
|
||||
2024-05-27 09:31:51.873 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext:292 - Root WebApplicationContext: initialization completed in 1977 ms
|
||||
2024-05-27 09:31:51.918 [main] INFO com.zaxxer.hikari.HikariDataSource:110 - HikariPool-1 - Starting...
|
||||
2024-05-27 09:32:02.195 [main] INFO com.zaxxer.hikari.HikariDataSource:123 - HikariPool-1 - Start completed.
|
||||
2024-05-27 09:32:02.218 [main] INFO o.s.b.autoconfigure.h2.H2ConsoleAutoConfiguration:98 - H2 console available at '/h2-console'. Database available at 'jdbc:h2:file:~/vehicle/db'
|
||||
2024-05-27 09:32:02.430 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext:591 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vehicleController': Unsatisfied dependency expressed through field 'vehicleService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\muyu\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
2024-05-27 09:32:02.431 [main] INFO com.zaxxer.hikari.HikariDataSource:350 - HikariPool-1 - Shutdown initiated...
|
||||
2024-05-27 09:32:02.440 [main] INFO com.zaxxer.hikari.HikariDataSource:352 - HikariPool-1 - Shutdown completed.
|
||||
2024-05-27 09:32:02.447 [main] INFO org.apache.catalina.core.StandardService:173 - Stopping service [Tomcat]
|
||||
2024-05-27 09:32:02.475 [main] INFO o.s.b.a.l.ConditionEvaluationReportLoggingListener:136 -
|
||||
|
||||
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
|
||||
2024-05-27 09:32:02.528 [main] ERROR org.springframework.boot.SpringApplication:821 - Application run failed
|
||||
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vehicleController': Unsatisfied dependency expressed through field 'vehicleService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\muyu\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:662)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:642)
|
||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955)
|
||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:921)
|
||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
|
||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731)
|
||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
|
||||
at com.mobai.TrainNetWorkingApplication.main(TrainNetWorkingApplication.java:18)
|
||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'vechileServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\muyu\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:662)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:642)
|
||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)
|
||||
... 20 common frames omitted
|
||||
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vehicleMapper' defined in file [D:\muyu\train_project\Train_NetWorking\target\classes\com\mobai\mapper\VehicleMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391)
|
||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)
|
||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)
|
||||
... 34 common frames omitted
|
||||
Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
|
||||
at org.springframework.util.Assert.notNull(Assert.java:201)
|
||||
at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:122)
|
||||
at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:73)
|
||||
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
|
||||
... 44 common frames omitted
|
||||
2024-05-27 09:48:42.660 [main] INFO com.mobai.TrainNetWorkingApplication:55 - Starting TrainNetWorkingApplication using Java 17.0.10 on MoBai with PID 20264 (D:\muyu\train_project\Train_NetWorking\target\classes started by 墨白 in D:\muyu\train_project)
|
||||
2024-05-27 09:48:42.666 [main] DEBUG com.mobai.TrainNetWorkingApplication:56 - Running with Spring Boot v2.7.15, Spring v5.3.29
|
||||
2024-05-27 09:48:42.667 [main] INFO com.mobai.TrainNetWorkingApplication:631 - No active profile set, falling back to 1 default profile: "default"
|
||||
2024-05-27 09:48:43.835 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'com.dtflys.forest.springboot.ForestAutoConfiguration' of type [com.dtflys.forest.springboot.ForestAutoConfiguration$$EnhancerBySpringCGLIB$$8f9c07cd] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 09:48:43.870 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'forestProperties' of type [com.dtflys.forest.config.SpringForestProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 09:48:43.871 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'forestObjectFactory' of type [com.dtflys.forest.reflection.SpringForestObjectFactory] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 09:48:43.873 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'forestInterceptorFactory' of type [com.dtflys.forest.interceptor.SpringInterceptorFactory] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 09:48:43.899 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'forest-com.dtflys.forest.springboot.properties.ForestConfigurationProperties' of type [com.dtflys.forest.springboot.properties.ForestConfigurationProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 09:48:43.960 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'forestConfiguration' of type [com.dtflys.forest.config.ForestConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 09:48:43.965 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'forestConverterBeanListener' of type [com.dtflys.forest.spring.ConverterBeanListener] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 09:48:44.020 [main] INFO com.dtflys.forest.scanner.ClassPathClientScanner:159 - [Forest] Created Forest Client Bean with name 'clientAdmin' and Proxy of 'com.mobai.vehicle.api.ClientAdmin' client interface
|
||||
2024-05-27 09:48:44.478 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer:108 - Tomcat initialized with port(s): 81 (http)
|
||||
2024-05-27 09:48:44.491 [main] INFO org.apache.catalina.core.StandardService:173 - Starting service [Tomcat]
|
||||
2024-05-27 09:48:44.492 [main] INFO org.apache.catalina.core.StandardEngine:173 - Starting Servlet engine: [Apache Tomcat/9.0.79]
|
||||
2024-05-27 09:48:44.732 [main] INFO o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]:173 - Initializing Spring embedded WebApplicationContext
|
||||
2024-05-27 09:48:44.732 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext:292 - Root WebApplicationContext: initialization completed in 1985 ms
|
||||
2024-05-27 09:48:44.790 [main] INFO com.zaxxer.hikari.HikariDataSource:110 - HikariPool-1 - Starting...
|
||||
2024-05-27 09:48:54.698 [main] INFO com.zaxxer.hikari.HikariDataSource:123 - HikariPool-1 - Start completed.
|
||||
2024-05-27 09:48:54.707 [main] INFO o.s.b.autoconfigure.h2.H2ConsoleAutoConfiguration:98 - H2 console available at '/h2-console'. Database available at 'jdbc:h2:file:~/vehicle/db'
|
||||
2024-05-27 09:48:55.992 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer:220 - Tomcat started on port(s): 81 (http) with context path ''
|
||||
2024-05-27 09:48:56.004 [main] INFO com.mobai.TrainNetWorkingApplication:61 - Started TrainNetWorkingApplication in 14.067 seconds (JVM running for 15.395)
|
||||
2024-05-27 09:48:56.009 [main] INFO com.mobai.vehicle.core.VehicleConfiguration:40 - 初始开始,批量从数据库当中加载数据到内存当中,每次[10]条
|
||||
2024-05-27 09:48:56.145 [main] DEBUG com.mobai.mapper.VehicleMapper.selectPage_mpCount:137 - ==> Preparing: SELECT COUNT(*) AS total FROM vehicle
|
||||
2024-05-27 09:48:56.163 [main] DEBUG com.mobai.mapper.VehicleMapper.selectPage_mpCount:137 - ==> Parameters:
|
||||
2024-05-27 09:48:56.180 [main] DEBUG com.mobai.mapper.VehicleMapper.selectPage_mpCount:137 - <== Total: 1
|
||||
2024-05-27 09:48:56.185 [main] DEBUG com.mobai.mapper.VehicleMapper.selectPage:137 - ==> Preparing: SELECT vin,remaining_battery,battery_level,total_mileage,create_time FROM vehicle LIMIT ?
|
||||
2024-05-27 09:48:56.185 [main] DEBUG com.mobai.mapper.VehicleMapper.selectPage:137 - ==> Parameters: 10(Long)
|
||||
2024-05-27 09:48:56.188 [main] DEBUG com.mobai.mapper.VehicleMapper.selectPage:137 - <== Total: 3
|
||||
2024-05-27 09:48:56.228 [main] DEBUG com.mobai.service.impl.VehicleInstanceServiceImpl:60 - 构建车辆对象: [VIN12345678912345]
|
||||
2024-05-27 09:48:56.229 [main] DEBUG com.mobai.service.impl.VehicleInstanceServiceImpl:60 - 构建车辆对象: [VIN123456789DIJE4]
|
||||
2024-05-27 09:48:56.229 [main] DEBUG com.mobai.service.impl.VehicleInstanceServiceImpl:60 - 构建车辆对象: [VIN12345678911111]
|
||||
2024-05-27 09:48:56.229 [main] DEBUG com.mobai.vehicle.core.VehicleConfiguration:45 - 第[1]页,[3]条
|
||||
2024-05-27 09:48:56.229 [main] INFO com.mobai.vehicle.core.VehicleConfiguration:50 - 数据加载完成,耗时:223 MS
|
||||
2024-05-27 15:21:49.662 [SpringApplicationShutdownHook] INFO com.mobai.vehicle.core.VehicleConfiguration:67 - 数据库同步
|
||||
2024-05-27 15:21:49.691 [SpringApplicationShutdownHook] INFO com.mobai.service.impl.VechileServiceImpl:89 - 同步数据库开始
|
||||
2024-05-27 15:21:49.700 [SpringApplicationShutdownHook] INFO com.mobai.service.impl.VechileServiceImpl:111 - 同步数据库结束 - 耗时:[8MS],同步量:[0辆],成功:[0辆],失败:[0辆]
|
||||
2024-05-27 15:21:49.701 [SpringApplicationShutdownHook] INFO com.mobai.vehicle.core.VehicleConfiguration:70 - 下线所有车辆
|
||||
2024-05-27 15:21:49.701 [SpringApplicationShutdownHook] INFO com.mobai.vehicle.core.VehicleConfiguration:74 - 关闭线程池
|
||||
2024-05-27 15:21:49.705 [SpringApplicationShutdownHook] WARN o.s.c.annotation.CommonAnnotationBeanPostProcessor:185 - Destroy method on bean with name 'vehicleConfiguration' threw an exception: java.lang.NoClassDefFoundError: com/mobai/common/pool/ScheduledThreadPool
|
||||
2024-05-27 15:21:49.707 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource:350 - HikariPool-1 - Shutdown initiated...
|
||||
2024-05-27 15:21:49.714 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource:352 - HikariPool-1 - Shutdown completed.
|
||||
2024-05-27 16:28:51.580 [main] INFO com.mobai.TrainNetWorkingApplication:55 - Starting TrainNetWorkingApplication using Java 17.0.10 on MoBai with PID 22912 (D:\muyu\train_project\train-networking\target\classes started by 墨白 in D:\muyu\train_project)
|
||||
2024-05-27 16:28:51.585 [main] DEBUG com.mobai.TrainNetWorkingApplication:56 - Running with Spring Boot v2.7.15, Spring v5.3.29
|
||||
2024-05-27 16:28:51.586 [main] INFO com.mobai.TrainNetWorkingApplication:631 - No active profile set, falling back to 1 default profile: "default"
|
||||
2024-05-27 16:28:52.793 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'com.dtflys.forest.springboot.ForestAutoConfiguration' of type [com.dtflys.forest.springboot.ForestAutoConfiguration$$EnhancerBySpringCGLIB$$564c6bd5] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 16:28:52.833 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'forestProperties' of type [com.dtflys.forest.config.SpringForestProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 16:28:52.835 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'forestObjectFactory' of type [com.dtflys.forest.reflection.SpringForestObjectFactory] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 16:28:52.837 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'forestInterceptorFactory' of type [com.dtflys.forest.interceptor.SpringInterceptorFactory] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 16:28:52.861 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'forest-com.dtflys.forest.springboot.properties.ForestConfigurationProperties' of type [com.dtflys.forest.springboot.properties.ForestConfigurationProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 16:28:52.926 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'forestConfiguration' of type [com.dtflys.forest.config.ForestConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 16:28:52.931 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'forestConverterBeanListener' of type [com.dtflys.forest.spring.ConverterBeanListener] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2024-05-27 16:28:52.981 [main] INFO com.dtflys.forest.scanner.ClassPathClientScanner:159 - [Forest] Created Forest Client Bean with name 'clientAdmin' and Proxy of 'com.mobai.vehicle.api.ClientAdmin' client interface
|
||||
2024-05-27 16:28:53.359 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer:108 - Tomcat initialized with port(s): 81 (http)
|
||||
2024-05-27 16:28:53.371 [main] INFO org.apache.catalina.core.StandardService:173 - Starting service [Tomcat]
|
||||
2024-05-27 16:28:53.373 [main] INFO org.apache.catalina.core.StandardEngine:173 - Starting Servlet engine: [Apache Tomcat/9.0.79]
|
||||
2024-05-27 16:28:53.540 [main] INFO o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]:173 - Initializing Spring embedded WebApplicationContext
|
||||
2024-05-27 16:28:53.540 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext:292 - Root WebApplicationContext: initialization completed in 1846 ms
|
||||
2024-05-27 16:28:53.593 [main] INFO com.zaxxer.hikari.HikariDataSource:110 - HikariPool-1 - Starting...
|
||||
2024-05-27 16:28:53.924 [main] INFO com.zaxxer.hikari.HikariDataSource:123 - HikariPool-1 - Start completed.
|
||||
2024-05-27 16:28:53.935 [main] INFO o.s.b.autoconfigure.h2.H2ConsoleAutoConfiguration:98 - H2 console available at '/h2-console'. Database available at 'jdbc:h2:file:~/vehicle/db'
|
||||
2024-05-27 16:28:55.411 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer:220 - Tomcat started on port(s): 81 (http) with context path ''
|
||||
2024-05-27 16:28:55.424 [main] INFO com.mobai.TrainNetWorkingApplication:61 - Started TrainNetWorkingApplication in 4.671 seconds (JVM running for 6.461)
|
||||
2024-05-27 16:28:55.429 [main] INFO com.mobai.vehicle.core.VehicleConfiguration:40 - 初始开始,批量从数据库当中加载数据到内存当中,每次[10]条
|
||||
2024-05-27 16:28:55.543 [main] DEBUG com.mobai.mapper.VehicleMapper.selectPage_mpCount:137 - ==> Preparing: SELECT COUNT(*) AS total FROM vehicle
|
||||
2024-05-27 16:28:55.565 [main] DEBUG com.mobai.mapper.VehicleMapper.selectPage_mpCount:137 - ==> Parameters:
|
||||
2024-05-27 16:28:55.584 [main] DEBUG com.mobai.mapper.VehicleMapper.selectPage_mpCount:137 - <== Total: 1
|
||||
2024-05-27 16:28:55.588 [main] DEBUG com.mobai.mapper.VehicleMapper.selectPage:137 - ==> Preparing: SELECT vin,remaining_battery,battery_level,total_mileage,create_time FROM vehicle LIMIT ?
|
||||
2024-05-27 16:28:55.588 [main] DEBUG com.mobai.mapper.VehicleMapper.selectPage:137 - ==> Parameters: 10(Long)
|
||||
2024-05-27 16:28:55.591 [main] DEBUG com.mobai.mapper.VehicleMapper.selectPage:137 - <== Total: 3
|
||||
2024-05-27 16:28:55.638 [main] DEBUG com.mobai.service.impl.VehicleInstanceServiceImpl:60 - 构建车辆对象: [VIN12345678912345]
|
||||
2024-05-27 16:28:55.639 [main] DEBUG com.mobai.service.impl.VehicleInstanceServiceImpl:60 - 构建车辆对象: [VIN123456789DIJE4]
|
||||
2024-05-27 16:28:55.639 [main] DEBUG com.mobai.service.impl.VehicleInstanceServiceImpl:60 - 构建车辆对象: [VIN12345678911111]
|
||||
2024-05-27 16:28:55.639 [main] DEBUG com.mobai.vehicle.core.VehicleConfiguration:45 - 第[1]页,[3]条
|
||||
2024-05-27 16:28:55.639 [main] INFO com.mobai.vehicle.core.VehicleConfiguration:50 - 数据加载完成,耗时:212 MS
|
||||
2024-05-27 17:02:13.624 [SpringApplicationShutdownHook] INFO com.mobai.vehicle.core.VehicleConfiguration:67 - 数据库同步
|
||||
2024-05-27 17:02:13.628 [SpringApplicationShutdownHook] INFO com.mobai.service.impl.VechileServiceImpl:90 - 同步数据库开始
|
||||
2024-05-27 17:02:13.630 [SpringApplicationShutdownHook] INFO com.mobai.service.impl.VechileServiceImpl:112 - 同步数据库结束 - 耗时:[1MS],同步量:[0辆],成功:[0辆],失败:[0辆]
|
||||
2024-05-27 17:02:13.631 [SpringApplicationShutdownHook] INFO com.mobai.vehicle.core.VehicleConfiguration:70 - 下线所有车辆
|
||||
2024-05-27 17:02:13.631 [SpringApplicationShutdownHook] INFO com.mobai.vehicle.core.VehicleConfiguration:74 - 关闭线程池
|
||||
2024-05-27 17:02:13.635 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource:350 - HikariPool-1 - Shutdown initiated...
|
||||
2024-05-27 17:02:13.637 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource:352 - HikariPool-1 - Shutdown completed.
|
|
@ -0,0 +1,23 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.mobai</groupId>
|
||||
<artifactId>train_project</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<packaging>pom</packaging>
|
||||
<modules>
|
||||
<module>train-networking</module>
|
||||
<module>train-common</module>
|
||||
<module>train-load</module>
|
||||
</modules>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>17</maven.compiler.source>
|
||||
<maven.compiler.target>17</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
</project>
|
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.mobai</groupId>
|
||||
<artifactId>train_project</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>train-common</artifactId>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>17</maven.compiler.source>
|
||||
<maven.compiler.target>17</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<mybatisplus.version>3.5.1</mybatisplus.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.24</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-log4j2</artifactId>
|
||||
<version>3.2.4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-generator</artifactId>
|
||||
<version>${mybatisplus.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
|
@ -0,0 +1,13 @@
|
|||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\req\FluxLoginReq.java
|
||||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\model\TaskModel.java
|
||||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\req\MsgReq.java
|
||||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\resp\VehicleInstanceResp.java
|
||||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\req\VehicleInstanceListReq.java
|
||||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\model\PositionModel.java
|
||||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\model\MqttServerModel.java
|
||||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\req\CheckPositionReq.java
|
||||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\Vehicle.java
|
||||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\PositionRouteInfo.java
|
||||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\req\GearReq.java
|
||||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\resp\UnifiedTaskResp.java
|
||||
D:\muyu\train_project\train-common\src\main\java\com\mobai\domain\req\VehicleCreateAddReq.java
|
|
@ -0,0 +1,43 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.mobai</groupId>
|
||||
<artifactId>train_project</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>train-load</artifactId>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>17</maven.compiler.source>
|
||||
<maven.compiler.target>17</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.mobai</groupId>
|
||||
<artifactId>train-networking</artifactId>
|
||||
<version>1.0.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-bootstrap</artifactId>
|
||||
<version>3.1.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<version>3.2.4</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
|
@ -0,0 +1,11 @@
|
|||
package com.mobai;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class TrainLoadApplication {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(TrainLoadApplication.class);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package com.mobai.controller;
|
||||
|
||||
import com.mobai.common.Result;
|
||||
import com.mobai.domain.req.FluxLoginReq;
|
||||
import com.mobai.service.FluxService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
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;
|
||||
|
||||
/**
|
||||
* @ClassName FluxMqController
|
||||
* @Description 描述
|
||||
* @Author SaiSai.Liu
|
||||
* @Date 2024/5/27 9:59
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("fluxmq/")
|
||||
public class FluxMqController {
|
||||
@Autowired
|
||||
private FluxService fluxService;
|
||||
|
||||
@PostMapping("/login/")
|
||||
public Result login (@RequestBody FluxLoginReq fluxLoginReq){
|
||||
return fluxService.login(fluxLoginReq);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
// This file is auto-generated, don't edit it. Thanks.
|
||||
package com.mobai.controller;
|
||||
|
||||
import com.aliyun.tea.*;
|
||||
|
||||
public class Sample {
|
||||
|
||||
/**
|
||||
* 使用AK&SK初始化账号Client
|
||||
* @return Client
|
||||
* @throws Exception
|
||||
*/
|
||||
public static com.aliyun.ecs20140526.Client createClient() throws Exception {
|
||||
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
|
||||
// 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
|
||||
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
|
||||
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
|
||||
.setAccessKeyId("LTAI5tKaz3hHJ8pkgF7iem8b")
|
||||
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
|
||||
.setAccessKeySecret("CApa5sl414bKC8GwD8uBtINuT26Ocj");
|
||||
// Endpoint 请参考 https://api.aliyun.com/product/Ecs
|
||||
config.endpoint = "ecs.cn-zhangjiakou.aliyuncs.com";
|
||||
return new com.aliyun.ecs20140526.Client(config);
|
||||
}
|
||||
|
||||
public static void main(String[] args_) throws Exception {
|
||||
java.util.List<String> args = java.util.Arrays.asList(args_);
|
||||
com.aliyun.ecs20140526.Client client = Sample.createClient();
|
||||
com.aliyun.ecs20140526.models.RunInstancesRequest runInstancesRequest = new com.aliyun.ecs20140526.models.RunInstancesRequest()
|
||||
.setRegionId("cn-zhangjiakou")
|
||||
.setLaunchTemplateName("basic_model")
|
||||
.setLaunchTemplateId("lt-8vb71bkyjwcqmcd98ah4");
|
||||
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
|
||||
try {
|
||||
// 复制代码运行请自行打印 API 的返回值
|
||||
client.runInstancesWithOptions(runInstancesRequest, runtime);
|
||||
} catch (TeaException error) {
|
||||
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
|
||||
// 错误 message
|
||||
System.out.println(error.getMessage());
|
||||
// 诊断地址
|
||||
System.out.println(error.getData().get("Recommend"));
|
||||
com.aliyun.teautil.Common.assertAsString(error.message);
|
||||
} catch (Exception _error) {
|
||||
TeaException error = new TeaException(_error.getMessage(), _error);
|
||||
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
|
||||
// 错误 message
|
||||
System.out.println(error.getMessage());
|
||||
// 诊断地址
|
||||
// System.out.println(error.getData().get("Recommend"));
|
||||
com.aliyun.teautil.Common.assertAsString(error.message);
|
||||
}
|
||||
System.out.println("实例创建成功");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package com.mobai.domain.req;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @ClassName FluxLoginReq
|
||||
* @Description 描述
|
||||
* @Author SaiSai.Liu
|
||||
* @Date 2024/5/27 10:05
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class FluxLoginReq {
|
||||
private String username;
|
||||
private String password;
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
package com.mobai.mq.fluxmq;
|
||||
|
||||
import okhttp3.*;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @ClassName FluxMqInit
|
||||
* @Description 描述
|
||||
* @Author SaiSai.Liu
|
||||
* @Date 2024/5/27 9:57
|
||||
*/
|
||||
public class FluxMqInit {
|
||||
public Response loginFluxMq(){
|
||||
OkHttpClient client = new OkHttpClient().newBuilder()
|
||||
.build();
|
||||
MediaType mediaType = MediaType.parse("application/json");
|
||||
RequestBody body = RequestBody.create(mediaType, "{\r\n \"username\": \"fluxmq\",\r\n \"password\": \"fluxmq\"\r\n}");
|
||||
Request request = new Request.Builder()
|
||||
.url("http://fluxmq.muyu.icu/public/login")
|
||||
.method("POST", body)
|
||||
.addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)")
|
||||
.addHeader("Content-Type", "application/json")
|
||||
.build();
|
||||
Response response = null;
|
||||
try {
|
||||
response = client.newCall(request).execute();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package com.mobai.mq.rabbitmq;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
/**
|
||||
* @ClassName Custom
|
||||
* @Description 描述
|
||||
* @Author SaiSai.Liu
|
||||
* @Date 2024/5/26 15:25
|
||||
*/
|
||||
public class Custom {
|
||||
// @Autowired
|
||||
// private RabbitTemplate rabbitTemplate;
|
||||
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package com.mobai.service;
|
||||
|
||||
import com.mobai.common.Result;
|
||||
import com.mobai.domain.req.FluxLoginReq;
|
||||
|
||||
/**
|
||||
* @ClassName FluxService
|
||||
* @Description 描述
|
||||
* @Author SaiSai.Liu
|
||||
* @Date 2024/5/27 10:01
|
||||
*/
|
||||
public interface FluxService {
|
||||
Result login(FluxLoginReq fluxLoginReq);
|
||||
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
package com.mobai.service;
|
||||
|
||||
import com.mobai.common.Result;
|
||||
import com.mobai.domain.req.FluxLoginReq;
|
||||
import okhttp3.*;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @ClassName FluxServiceImpl
|
||||
* @Description 描述
|
||||
* @Author SaiSai.Liu
|
||||
* @Date 2024/5/27 10:01
|
||||
*/
|
||||
@Service
|
||||
public class FluxServiceImpl implements FluxService {
|
||||
|
||||
@Override
|
||||
public Result login(FluxLoginReq fluxLoginReq) {
|
||||
OkHttpClient client = new OkHttpClient().newBuilder()
|
||||
.build();
|
||||
MediaType mediaType = MediaType.parse("application/json");
|
||||
RequestBody body = RequestBody.create(mediaType,fluxLoginReq.toString());
|
||||
Request request = new Request.Builder()
|
||||
.url("http://fluxmq.muyu.icu/public/login")
|
||||
.method("POST", body)
|
||||
.addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)")
|
||||
.addHeader("Content-Type", "application/json")
|
||||
.build();
|
||||
Response response = null;
|
||||
try {
|
||||
response = client.newCall(request).execute();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,106 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.mobai</groupId>
|
||||
<artifactId>train-networking</artifactId>
|
||||
<version>1.0.0</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>17</maven.compiler.source>
|
||||
<maven.compiler.target>17</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<mybatisplus.version>3.5.1</mybatisplus.version>
|
||||
</properties>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<relativePath>org.springframework.boot</relativePath>
|
||||
<version>2.7.15</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- mqtt3 -->
|
||||
<dependency>
|
||||
<groupId>org.eclipse.paho</groupId>
|
||||
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
|
||||
<version>1.2.5</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- mybatis-plus 所需依赖 -->
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||
<version>${mybatisplus.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-generator</artifactId>
|
||||
<version>${mybatisplus.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.freemarker</groupId>
|
||||
<artifactId>freemarker</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 使用h2内存数据库 -->
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba.fastjson2</groupId>
|
||||
<artifactId>fastjson2</artifactId>
|
||||
<version>2.0.42</version>
|
||||
</dependency>
|
||||
|
||||
<!-- http调用框架 -->
|
||||
<dependency>
|
||||
<groupId>com.dtflys.forest</groupId>
|
||||
<artifactId>forest-spring-boot-starter</artifactId>
|
||||
<version>1.5.33</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
<version>1.2.73</version>
|
||||
</dependency>
|
||||
|
||||
<!--常用工具类 -->
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.aliyun</groupId>
|
||||
<artifactId>ecs20140526</artifactId>
|
||||
<version>5.1.8</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
</project>
|
|
@ -0,0 +1,20 @@
|
|||
package com.mobai;
|
||||
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 车辆模拟启动类
|
||||
* @date 2023/11/9
|
||||
*/
|
||||
@SpringBootApplication
|
||||
@MapperScan(value = "com.mobai.mapper")
|
||||
public class TrainNetWorkingApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(TrainNetWorkingApplication.class, args);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
package com.mobai.common;
|
||||
|
||||
/**
|
||||
* 返回状态码
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class HttpStatus {
|
||||
/**
|
||||
* 操作成功
|
||||
*/
|
||||
public static final int SUCCESS = 200;
|
||||
|
||||
/**
|
||||
* 对象创建成功
|
||||
*/
|
||||
public static final int CREATED = 201;
|
||||
|
||||
/**
|
||||
* 请求已经被接受
|
||||
*/
|
||||
public static final int ACCEPTED = 202;
|
||||
|
||||
/**
|
||||
* 操作已经执行成功,但是没有返回数据
|
||||
*/
|
||||
public static final int NO_CONTENT = 204;
|
||||
|
||||
/**
|
||||
* 资源已被移除
|
||||
*/
|
||||
public static final int MOVED_PERM = 301;
|
||||
|
||||
/**
|
||||
* 重定向
|
||||
*/
|
||||
public static final int SEE_OTHER = 303;
|
||||
|
||||
/**
|
||||
* 资源没有被修改
|
||||
*/
|
||||
public static final int NOT_MODIFIED = 304;
|
||||
|
||||
/**
|
||||
* 参数列表错误(缺少,格式不匹配)
|
||||
*/
|
||||
public static final int BAD_REQUEST = 400;
|
||||
|
||||
/**
|
||||
* 未授权
|
||||
*/
|
||||
public static final int UNAUTHORIZED = 401;
|
||||
|
||||
/**
|
||||
* 访问受限,授权过期
|
||||
*/
|
||||
public static final int FORBIDDEN = 403;
|
||||
|
||||
/**
|
||||
* 资源,服务未找到
|
||||
*/
|
||||
public static final int NOT_FOUND = 404;
|
||||
|
||||
/**
|
||||
* 不允许的http方法
|
||||
*/
|
||||
public static final int BAD_METHOD = 405;
|
||||
|
||||
/**
|
||||
* 资源冲突,或者资源被锁
|
||||
*/
|
||||
public static final int CONFLICT = 409;
|
||||
|
||||
/**
|
||||
* 不支持的数据,媒体类型
|
||||
*/
|
||||
public static final int UNSUPPORTED_TYPE = 415;
|
||||
|
||||
/**
|
||||
* 系统内部错误
|
||||
*/
|
||||
public static final int ERROR = 500;
|
||||
|
||||
/**
|
||||
* 接口未实现
|
||||
*/
|
||||
public static final int NOT_IMPLEMENTED = 501;
|
||||
|
||||
/**
|
||||
* 系统警告消息
|
||||
*/
|
||||
public static final int WARN = 601;
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package com.mobai.common;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: Saisai.Liu
|
||||
* @date: 2023/12/2
|
||||
* @Description: 分页集合
|
||||
* @Version: 1.0
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PageList<T> {
|
||||
|
||||
/**
|
||||
* 分页数据
|
||||
*/
|
||||
private List<T> rows;
|
||||
|
||||
/**
|
||||
* 总条数
|
||||
*/
|
||||
private long total;
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
package com.mobai.common;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 响应信息主体
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
@Data
|
||||
public class Result<T> implements Serializable {
|
||||
/**
|
||||
* 成功
|
||||
*/
|
||||
public static final int SUCCESS = HttpStatus.SUCCESS;
|
||||
/**
|
||||
* 失败
|
||||
*/
|
||||
public static final int FAIL = HttpStatus.ERROR;
|
||||
private static final long serialVersionUID = 1L;
|
||||
/**
|
||||
* 系统警告消息
|
||||
*/
|
||||
private static final int WARN = HttpStatus.WARN;
|
||||
|
||||
private int code;
|
||||
|
||||
private String msg;
|
||||
|
||||
private T data;
|
||||
|
||||
public static <T> Result<T> success () {
|
||||
return restResult(null, SUCCESS, "操作成功");
|
||||
}
|
||||
|
||||
public static <T> Result<T> success (T data) {
|
||||
return restResult(data, SUCCESS, "操作成功");
|
||||
}
|
||||
|
||||
public static <T> Result<T> success (T data, String msg) {
|
||||
return restResult(data, SUCCESS, msg);
|
||||
}
|
||||
|
||||
public static <T> Result<T> error () {
|
||||
return restResult(null, FAIL, "操作失败");
|
||||
}
|
||||
|
||||
public static <T> Result<T> error (String msg) {
|
||||
return restResult(null, FAIL, msg);
|
||||
}
|
||||
|
||||
public static <T> Result<T> error (T data) {
|
||||
return restResult(data, FAIL, "操作失败");
|
||||
}
|
||||
|
||||
public static <T> Result<T> error (T data, String msg) {
|
||||
return restResult(data, FAIL, msg);
|
||||
}
|
||||
|
||||
public static <T> Result<T> error (int code, String msg) {
|
||||
return restResult(null, code, msg);
|
||||
}
|
||||
|
||||
public static <T> Result<T> warn () {
|
||||
return restResult(null, WARN, "操作失败");
|
||||
}
|
||||
|
||||
public static <T> Result<T> warn (String msg) {
|
||||
return restResult(null, WARN, msg);
|
||||
}
|
||||
|
||||
public static <T> Result<T> warn (T data) {
|
||||
return restResult(data, WARN, "操作失败");
|
||||
}
|
||||
|
||||
public static <T> Result<T> warn (T data, String msg) {
|
||||
return restResult(data, WARN, msg);
|
||||
}
|
||||
|
||||
public static <T> Result<T> warn (int code, String msg) {
|
||||
return restResult(null, code, msg);
|
||||
}
|
||||
|
||||
private static <T> Result<T> restResult (T data, int code, String msg) {
|
||||
Result<T> apiResult = new Result<>();
|
||||
apiResult.setCode(code);
|
||||
apiResult.setData(data);
|
||||
apiResult.setMsg(msg);
|
||||
return apiResult;
|
||||
}
|
||||
|
||||
public static <T> Boolean isError (Result<T> ret) {
|
||||
return !isSuccess(ret);
|
||||
}
|
||||
|
||||
public static <T> Boolean isSuccess (Result<T> ret) {
|
||||
return Result.SUCCESS == ret.getCode();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package com.mobai.common;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 系统常量
|
||||
* @date 2023/11/15
|
||||
*/
|
||||
public class SystemConstant {
|
||||
|
||||
/**
|
||||
* 百公里电耗
|
||||
*/
|
||||
public final static BigDecimal powerConsumption = new BigDecimal(10000);
|
||||
|
||||
public final static BigDecimal hundredKilometers = new BigDecimal(100);
|
||||
|
||||
/**
|
||||
* 报文起始位
|
||||
*/
|
||||
public static final String MSG_START = "7E ";
|
||||
|
||||
/**
|
||||
* 报文结束位
|
||||
*/
|
||||
public static final String MSG_END = "7E";
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
package com.mobai.common.pool;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 可控最大并发数线程池
|
||||
* @Date 2023-12-5 下午 01:51
|
||||
*/
|
||||
public class FixedThreadPool {
|
||||
|
||||
/**
|
||||
* 可重用固定个数的线程池
|
||||
*/
|
||||
private final static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(15);
|
||||
|
||||
|
||||
/**
|
||||
* 线程池提交任务
|
||||
* @param thread 线程
|
||||
*/
|
||||
public static Future<?> submit(Thread thread){
|
||||
return fixedThreadPool.submit(thread);
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭线程池
|
||||
*/
|
||||
public static void shutDown(){
|
||||
fixedThreadPool.shutdown();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package com.mobai.common.pool;
|
||||
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 线程池
|
||||
* @Date 2023-11-17 上午 09:16
|
||||
*/
|
||||
public class ScheduledThreadPool {
|
||||
|
||||
/**
|
||||
* 周期性线程池 CPU 数量 * 2 + 1
|
||||
*/
|
||||
private static final ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(
|
||||
Runtime.getRuntime().availableProcessors() * 2 + 1);
|
||||
|
||||
public static ScheduledFuture<?> submit (Runnable thread){
|
||||
// 参数分别是: 任务, 多久后开始执行, 每隔多久执行一次(周期),时间单位
|
||||
return submit(thread, 1);
|
||||
}
|
||||
|
||||
public static ScheduledFuture<?> submit (Runnable thread, long period){
|
||||
// 参数分别是: 任务, 多久后开始执行, 每隔多久执行一次(周期),时间单位
|
||||
return scheduledThreadPool.scheduleAtFixedRate(thread, 0, period, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭线程池
|
||||
*/
|
||||
public static void shutdown() {
|
||||
scheduledThreadPool.shutdown();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package com.mobai.config;
|
||||
|
||||
import com.mobai.common.Result;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 异常类
|
||||
* @date 2023/11/15
|
||||
*/
|
||||
@RestControllerAdvice
|
||||
public class ExceptionAdvice {
|
||||
|
||||
/**
|
||||
* 运行时异常拦截
|
||||
* @param runtimeException 运行时异常
|
||||
* @return 公共返回结果
|
||||
*/
|
||||
@ExceptionHandler(value = RuntimeException.class)
|
||||
public Result<String> runtimeExceptionHandler(RuntimeException runtimeException){
|
||||
return Result.error(runtimeException.getMessage());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package com.mobai.config;
|
||||
|
||||
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.ibatis.reflection.MetaObject;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 填充公共字段
|
||||
*
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class MyMetaObjectHandler implements MetaObjectHandler {
|
||||
@Override
|
||||
public void insertFill(MetaObject metaObject) {
|
||||
log.info("start insert fill...");
|
||||
this.setFieldValByName("createTime", new Date(), metaObject);
|
||||
this.setFieldValByName("updateTime", new Date(), metaObject);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateFill(MetaObject metaObject) {
|
||||
log.info("start update fill...");
|
||||
this.setFieldValByName("updateTime", new Date(), metaObject);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
package com.mobai.config;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.DbType;
|
||||
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* mybatisplus 配置
|
||||
*/
|
||||
@Configuration
|
||||
public class MybatisPlusConfig {
|
||||
/**
|
||||
* 老版本,目前已失效
|
||||
* @return
|
||||
*/
|
||||
/**@Bean
|
||||
public PaginationInterceptor paginationInterceptor() {
|
||||
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
|
||||
return paginationInterceptor;
|
||||
}*/
|
||||
|
||||
|
||||
/**
|
||||
* 新的分页插件,一缓和二缓遵循mybatis的规则,
|
||||
*/
|
||||
@Bean
|
||||
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
||||
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
||||
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
|
||||
return interceptor;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package com.mobai.controller;
|
||||
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description index页跳转
|
||||
* @date 2023/12/1
|
||||
*/
|
||||
@Log4j2
|
||||
@Controller
|
||||
public class IndexController {
|
||||
|
||||
@RequestMapping("/")
|
||||
public String hello(){
|
||||
log.debug("重定向到 - /static/index 页面");
|
||||
return "forward:/static/index.html";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
// This file is auto-generated, don't edit it. Thanks.
|
||||
package com.mobai.controller;
|
||||
|
||||
import com.aliyun.tea.TeaException;
|
||||
|
||||
public class Sample {
|
||||
|
||||
/**
|
||||
* 使用AK&SK初始化账号Client
|
||||
* @return Client
|
||||
* @throws Exception
|
||||
*/
|
||||
public static com.aliyun.ecs20140526.Client createClient() throws Exception {
|
||||
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
|
||||
// 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
|
||||
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
|
||||
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
|
||||
.setAccessKeyId("LTAI5tKaz3hHJ8pkgF7iem8b")
|
||||
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
|
||||
.setAccessKeySecret("CApa5sl414bKC8GwD8uBtINuT26Ocj");
|
||||
// Endpoint 请参考 https://api.aliyun.com/product/Ecs
|
||||
config.endpoint = "ecs.cn-zhangjiakou.aliyuncs.com";
|
||||
return new com.aliyun.ecs20140526.Client(config);
|
||||
}
|
||||
|
||||
public static void main(String[] args_) throws Exception {
|
||||
java.util.List<String> args = java.util.Arrays.asList(args_);
|
||||
com.aliyun.ecs20140526.Client client = Sample.createClient();
|
||||
com.aliyun.ecs20140526.models.RunInstancesRequest runInstancesRequest = new com.aliyun.ecs20140526.models.RunInstancesRequest()
|
||||
.setRegionId("cn-zhangjiakou")
|
||||
.setLaunchTemplateName("basic_model")
|
||||
.setLaunchTemplateId("lt-8vb71bkyjwcqmcd98ah4");
|
||||
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
|
||||
try {
|
||||
// 复制代码运行请自行打印 API 的返回值
|
||||
client.runInstancesWithOptions(runInstancesRequest, runtime);
|
||||
} catch (TeaException error) {
|
||||
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
|
||||
// 错误 message
|
||||
System.out.println(error.getMessage());
|
||||
// 诊断地址
|
||||
System.out.println(error.getData().get("Recommend"));
|
||||
com.aliyun.teautil.Common.assertAsString(error.message);
|
||||
} catch (Exception _error) {
|
||||
TeaException error = new TeaException(_error.getMessage(), _error);
|
||||
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
|
||||
// 错误 message
|
||||
System.out.println(error.getMessage());
|
||||
// 诊断地址
|
||||
// System.out.println(error.getData().get("Recommend"));
|
||||
com.aliyun.teautil.Common.assertAsString(error.message);
|
||||
}
|
||||
System.out.println("实例创建成功");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
package com.mobai.controller;
|
||||
|
||||
import com.mobai.common.Result;
|
||||
import com.mobai.domain.Vehicle;
|
||||
import com.mobai.domain.req.VehicleCreateAddReq;
|
||||
import com.mobai.service.VehicleService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 用户控制层
|
||||
* @date 2023/11/9
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/vehicle")
|
||||
public class VehicleController {
|
||||
|
||||
@Autowired
|
||||
private VehicleService vehicleService;
|
||||
|
||||
@GetMapping("/list")
|
||||
public Result<List<Vehicle>> list(){
|
||||
return Result.success(vehicleService.list());
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据输入的数量进行车辆随机生成
|
||||
* @param sum 车辆总数
|
||||
* @return 结果集
|
||||
*/
|
||||
@GetMapping("/gen/{sum}")
|
||||
public Result<String> generate(@PathVariable(value = "sum") Integer sum){
|
||||
vehicleService.generate(sum);
|
||||
return Result.success();
|
||||
}
|
||||
/**
|
||||
* 根据输入的数量进行车辆随机生成
|
||||
* @param vehicleCreateAddReq 车辆总数
|
||||
* @return 结果集
|
||||
*/
|
||||
@PostMapping("/create")
|
||||
public Result<String> create(@RequestBody VehicleCreateAddReq vehicleCreateAddReq){
|
||||
vehicleService.create(vehicleCreateAddReq.getVinStr());
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 删除车辆
|
||||
* @param vin 车辆总数
|
||||
* @return 结果集
|
||||
*/
|
||||
@DeleteMapping("/{vin}")
|
||||
public Result<String> delete(@PathVariable("vin") String vin){
|
||||
this.vehicleService.delete(vin);
|
||||
return Result.success(null,"删除成功");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,118 @@
|
|||
package com.mobai.controller;
|
||||
|
||||
import com.mobai.common.PageList;
|
||||
import com.mobai.common.Result;
|
||||
import com.mobai.domain.req.CheckPositionReq;
|
||||
import com.mobai.domain.req.GearReq;
|
||||
import com.mobai.domain.req.MsgReq;
|
||||
import com.mobai.domain.req.VehicleInstanceListReq;
|
||||
import com.mobai.domain.resp.VehicleInstanceResp;
|
||||
import com.mobai.service.VehicleInstanceService;
|
||||
import com.mobai.vehicle.core.LocalContainer;
|
||||
import com.mobai.vehicle.model.VehicleData;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 车辆实例控制层
|
||||
* @Date 2023-11-25 上午 10:01
|
||||
*/
|
||||
@Log4j2
|
||||
@RestController
|
||||
@RequestMapping("/vehicle/instance")
|
||||
public class VehicleInstanceController {
|
||||
|
||||
@Autowired
|
||||
private VehicleInstanceService vehicleInstanceService;
|
||||
|
||||
/**
|
||||
* 查询车辆集合
|
||||
* @param vehicleInstanceListReq 车辆列表查询对象
|
||||
* @return 结果
|
||||
*/
|
||||
@PostMapping("/list")
|
||||
public Result<PageList<VehicleInstanceResp>> list(@RequestBody VehicleInstanceListReq vehicleInstanceListReq){
|
||||
PageList<VehicleInstanceResp> pageList = vehicleInstanceService.queryList(vehicleInstanceListReq);
|
||||
return Result.success(pageList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据车辆VIN获取车辆数据
|
||||
* @param vin VIN
|
||||
* @return 车辆数据
|
||||
*/
|
||||
@GetMapping("/data/{vin}")
|
||||
public Result<VehicleData> getVehicleData(@PathVariable("vin") String vin){
|
||||
return Result.success(LocalContainer.getVehicleInstance(vin).getVehicleData());
|
||||
}
|
||||
|
||||
/**
|
||||
* 车辆连接初始化
|
||||
* @param vin vin
|
||||
* @return 初始化
|
||||
*/
|
||||
@PostMapping("/client/init/{vin}")
|
||||
public Result<String> vehicleClientInit(@PathVariable("vin") String vin){
|
||||
this.vehicleInstanceService.vehicleClientInit(vin);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 车辆连接初始化
|
||||
* @param vin vin
|
||||
* @return 初始化
|
||||
*/
|
||||
@PostMapping("/client/close/{vin}")
|
||||
public Result<String> vehicleClientClose(@PathVariable("vin") String vin){
|
||||
this.vehicleInstanceService.vehicleClientClose(vin);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 选择车辆轨迹
|
||||
* @param checkPositionReq 轨迹选择
|
||||
* @return 操作提示
|
||||
*/
|
||||
@PostMapping("/position/check")
|
||||
public Result<String> checkPosition(@RequestBody CheckPositionReq checkPositionReq){
|
||||
this.vehicleInstanceService.checkPosition(checkPositionReq);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 车辆报文操作
|
||||
* @return 操作提示
|
||||
*/
|
||||
@PostMapping("/msg")
|
||||
public Result<String> msg(@RequestBody MsgReq msgReq){
|
||||
this.vehicleInstanceService.msg(msgReq);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 车辆档位操作
|
||||
* @return 操作提示
|
||||
*/
|
||||
@PostMapping("/gear")
|
||||
public Result<String> gear(@RequestBody GearReq gearReq){
|
||||
this.vehicleInstanceService.gear(gearReq);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置车辆故障状态
|
||||
* @param statusKey
|
||||
* @param vin
|
||||
* @param statusValue
|
||||
* @return
|
||||
*/
|
||||
@PutMapping("/status/{vin}/{statusKey}/{statusValue}")
|
||||
public Result<String> editStatus(@PathVariable("statusKey") String statusKey,
|
||||
@PathVariable("vin") String vin,
|
||||
@PathVariable("statusValue") Integer statusValue){
|
||||
this.vehicleInstanceService.editStatus(vin, statusKey, statusValue);
|
||||
return Result.success();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
package com.mobai.controller;
|
||||
|
||||
import com.mobai.common.Result;
|
||||
import com.mobai.domain.PositionRouteInfo;
|
||||
import com.mobai.service.PositionRouteService;
|
||||
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.RestController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 车辆路径控制层
|
||||
* @Date 2023-11-27 上午 10:50
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/vehicle/position")
|
||||
public class VehiclePositionController {
|
||||
|
||||
@Autowired
|
||||
private PositionRouteService positionRouteService;
|
||||
|
||||
@GetMapping("/list")
|
||||
public Result<List<String>> listAll(){
|
||||
List<PositionRouteInfo> positionRouteInfos = positionRouteService.list();
|
||||
List<String> list = positionRouteInfos.stream().map(PositionRouteInfo::getName)
|
||||
.toList();
|
||||
return Result.success(list);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
package com.mobai.controller;
|
||||
|
||||
import com.mobai.common.Result;
|
||||
import com.mobai.domain.resp.UnifiedTaskResp;
|
||||
import com.mobai.service.VehicleUnifiedService;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 车辆一键操作控制层
|
||||
* @date 2023/12/6
|
||||
*/
|
||||
@Log4j2
|
||||
@RestController
|
||||
@RequestMapping("/vehicle/unified")
|
||||
public class VehicleUnifiedController {
|
||||
|
||||
@Autowired
|
||||
private VehicleUnifiedService vehicleUnifiedService;
|
||||
|
||||
/**
|
||||
* 一键上线
|
||||
*/
|
||||
@PostMapping("/online")
|
||||
public Result<String> unifiedOnline(){
|
||||
this.vehicleUnifiedService.unifiedOnline();
|
||||
return Result.success(null,"已成功发布一键上线任务");
|
||||
}
|
||||
|
||||
/**
|
||||
* 一键离线
|
||||
*/
|
||||
@PostMapping("/offline")
|
||||
public Result<String> unifiedOffline(){
|
||||
this.vehicleUnifiedService.unifiedOffline();
|
||||
return Result.success(null,"已成功发布一键离线任务");
|
||||
}
|
||||
|
||||
/**
|
||||
* 一键上报
|
||||
*/
|
||||
@PostMapping("/send")
|
||||
public Result<String> unifiedSend(){
|
||||
this.vehicleUnifiedService.unifiedSend();
|
||||
return Result.success(null,"已成功发布一键上报任务");
|
||||
}
|
||||
|
||||
/**
|
||||
* 一键重置路径
|
||||
*/
|
||||
@PostMapping("/position")
|
||||
public Result<String> unifiedPosition(){
|
||||
this.vehicleUnifiedService.unifiedPosition();
|
||||
return Result.success(null,"已成功发布一键上报任务");
|
||||
}
|
||||
|
||||
/**
|
||||
* 一键取消上报
|
||||
*/
|
||||
@PostMapping("/stop")
|
||||
public Result<String> unifiedStop(){
|
||||
this.vehicleUnifiedService.unifiedStop();
|
||||
return Result.success(null,"已成功发布取消上报任务");
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取一键执行状态
|
||||
* @return 执行结果
|
||||
*/
|
||||
@GetMapping("/status")
|
||||
public Result<UnifiedTaskResp> unifiedStatus(){
|
||||
return Result.success(this.vehicleUnifiedService.unifiedStatus());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
package com.mobai.controller;
|
||||
|
||||
import com.mobai.common.Result;
|
||||
import com.mobai.domain.model.MqttServerModel;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 车辆上线默认类
|
||||
* @Date 2023-11-30 下午 02:59
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/verify")
|
||||
public class VerifyController {
|
||||
|
||||
|
||||
@Value("${mqtt.server.host}")
|
||||
private String broker;
|
||||
|
||||
@Value("${mqtt.server.topic}")
|
||||
private String topic;
|
||||
|
||||
|
||||
/**
|
||||
* 新增车辆默认上线主题
|
||||
* @return 默认返回test
|
||||
*/
|
||||
@PostMapping("/vehicleConnection")
|
||||
public Result<MqttServerModel> vehicleConnection(){
|
||||
return Result.success(
|
||||
MqttServerModel.builder()
|
||||
.broker(broker)
|
||||
.topic(topic)
|
||||
.build()
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
package com.mobai.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 路径信息
|
||||
* @Date 2023-11-20 上午 09:28
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@TableName("route_info")
|
||||
public class PositionRouteInfo {
|
||||
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
@TableId("id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 名称
|
||||
*/
|
||||
@TableField(value = "name")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 数据
|
||||
*/
|
||||
@TableField(value = "data")
|
||||
private String routeData;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@TableField(value = "create_time")
|
||||
private Date createTime;
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
package com.mobai.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.mobai.utils.VehicleUtils;
|
||||
import com.mobai.vehicle.VehicleInstance;
|
||||
import com.mobai.vehicle.model.VehicleData;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 车辆信息
|
||||
* @date 2023/11/9
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@TableName("vehicle")
|
||||
public class Vehicle {
|
||||
|
||||
/**
|
||||
* VIN
|
||||
*/
|
||||
@TableId(value = "vin")
|
||||
private String vin;
|
||||
|
||||
/**
|
||||
* 电池剩余电量
|
||||
*/
|
||||
@TableField("remaining_battery")
|
||||
private BigDecimal remainingBattery;
|
||||
|
||||
/**
|
||||
* 电池电量
|
||||
*/
|
||||
@TableField("battery_level")
|
||||
private BigDecimal batteryLevel;
|
||||
|
||||
/**
|
||||
* 总里程
|
||||
*/
|
||||
@TableField("total_mileage")
|
||||
private BigDecimal totalMileage;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@TableField("create_time")
|
||||
private Date createTime;
|
||||
|
||||
/**
|
||||
* 生成车辆数据
|
||||
* @return 车辆数据
|
||||
*/
|
||||
public static Vehicle gen() {
|
||||
return Vehicle.create(VehicleUtils.genVin());
|
||||
|
||||
}
|
||||
/**
|
||||
* 生成车辆数据
|
||||
* @return 车辆数据
|
||||
*/
|
||||
public static Vehicle create(String vin) {
|
||||
BigDecimal battery = VehicleUtils.genBattery();
|
||||
return Vehicle.builder()
|
||||
.vin(vin)
|
||||
.createTime(new Date())
|
||||
.batteryLevel(battery)
|
||||
.remainingBattery(battery)
|
||||
.totalMileage(BigDecimal.ZERO)
|
||||
.build();
|
||||
|
||||
}
|
||||
|
||||
public static Vehicle instanceBuild (VehicleInstance vehicleInstance) {
|
||||
VehicleData vehicle = vehicleInstance.getVehicleData();
|
||||
return Vehicle.builder()
|
||||
.vin(vehicleInstance.getVin())
|
||||
.remainingBattery(vehicle.getRemainingBattery())
|
||||
.totalMileage(vehicle.getMileage())
|
||||
.build();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package com.mobai.domain.model;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: Mqtt服务器模型
|
||||
* @Date 2024-3-26 上午 09:53
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MqttServerModel {
|
||||
|
||||
/**
|
||||
* MQTT服务节点
|
||||
*/
|
||||
private String broker;
|
||||
|
||||
/**
|
||||
* MQTT订阅主题
|
||||
*/
|
||||
private String topic;
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package com.mobai.domain.model;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 位置模型
|
||||
* @Date 2023-11-20 上午 09:36
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PositionModel {
|
||||
/**
|
||||
* 经度
|
||||
*/
|
||||
private String longitude;
|
||||
|
||||
/**
|
||||
* 维度
|
||||
*/
|
||||
private String latitude;
|
||||
|
||||
public static PositionModel strBuild (String positionStr) {
|
||||
String[] split = positionStr.split(",");
|
||||
return PositionModel.builder()
|
||||
.longitude(split[0])
|
||||
.latitude(split[1])
|
||||
.build();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,121 @@
|
|||
package com.mobai.domain.model;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 任务执行模型
|
||||
* @date 2023/12/4
|
||||
*/
|
||||
@Data
|
||||
@Log4j2
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class TaskModel {
|
||||
|
||||
/**
|
||||
* 任务状态 默认为false状态
|
||||
*/
|
||||
private final AtomicBoolean unifiedStatus = new AtomicBoolean(Boolean.FALSE);
|
||||
|
||||
private CountDownLatch countDownLatch ;
|
||||
|
||||
/**
|
||||
* 任务是否可以执行
|
||||
* @return 是否有任务执行
|
||||
*/
|
||||
public boolean isExecution(){
|
||||
return !unifiedStatus.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* 任务名称
|
||||
*/
|
||||
private String taskName;
|
||||
/**
|
||||
* 任务执行总数
|
||||
*/
|
||||
private Integer taskExecutionSum = 0;
|
||||
|
||||
/**
|
||||
* 任务执行时间
|
||||
*/
|
||||
private long taskStartTime;
|
||||
|
||||
/**
|
||||
* 提交当前线程任务
|
||||
* @param taskName 任务名称
|
||||
* @param taskExecutionSum 任务总数
|
||||
*/
|
||||
public void submit(String taskName,Integer taskExecutionSum){
|
||||
if (!this.isExecution()){
|
||||
throw new RuntimeException("["+this.taskName+"]的任务正在进行中,请等待任务执行完成再次发布一键任务");
|
||||
}
|
||||
unifiedStatus.set(Boolean.TRUE);
|
||||
this.taskName = taskName;
|
||||
this.countDownLatch = new CountDownLatch(taskExecutionSum);
|
||||
this.taskExecutionSum = taskExecutionSum;
|
||||
this.taskSuccessSum = new AtomicInteger();
|
||||
this.taskErrorSum = new AtomicInteger();
|
||||
this.taskStartTime = System.currentTimeMillis();
|
||||
log.info("[{}]任务执行开始", this.taskName);
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行结束
|
||||
*/
|
||||
public void down(){
|
||||
log.info("[{}]任务执行结束,耗时:[{}]MS", this.taskName, System.currentTimeMillis() - taskStartTime);
|
||||
this.taskName = null;
|
||||
this.taskExecutionSum = 0;
|
||||
this.taskSuccessSum.set(0);
|
||||
this.taskErrorSum.set(0);
|
||||
unifiedStatus.set(Boolean.FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 任务成功执行总数
|
||||
*/
|
||||
private AtomicInteger taskSuccessSum = new AtomicInteger();
|
||||
|
||||
/**
|
||||
* 累计成功
|
||||
*/
|
||||
public void incrementSuccess(){
|
||||
this.taskSuccessSum.incrementAndGet();
|
||||
}
|
||||
/**
|
||||
* 获取成功数量
|
||||
*/
|
||||
public int getSuccessSum(){
|
||||
return this.taskSuccessSum.incrementAndGet();
|
||||
}
|
||||
|
||||
/**
|
||||
* 任务执行失败总数
|
||||
*/
|
||||
private AtomicInteger taskErrorSum = new AtomicInteger();
|
||||
|
||||
/**
|
||||
* 累计失败
|
||||
*/
|
||||
public void incrementError(){
|
||||
this.taskErrorSum.incrementAndGet();
|
||||
}
|
||||
/**
|
||||
* 获取失败数量
|
||||
*/
|
||||
public int getErrorSum(){
|
||||
return this.taskErrorSum.incrementAndGet();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package com.mobai.domain.req;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 车辆选择轨迹
|
||||
* @Date 2023-11-27 上午 11:04
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class CheckPositionReq {
|
||||
|
||||
/**
|
||||
* VIN
|
||||
*/
|
||||
private String vin;
|
||||
|
||||
/**
|
||||
* 轨迹标签
|
||||
*/
|
||||
private String positionCode;
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package com.mobai.domain.req;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description:
|
||||
* @Date 2023-11-27 下午 02:37
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class GearReq {
|
||||
|
||||
/**
|
||||
* VIN
|
||||
*/
|
||||
private String vin;
|
||||
|
||||
/**
|
||||
* 档位
|
||||
*/
|
||||
private String gear;
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package com.mobai.domain.req;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: msg请求实体类
|
||||
* @Date 2023-11-27 下午 02:15
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MsgReq {
|
||||
|
||||
/**
|
||||
* 车辆VIN
|
||||
*/
|
||||
private String vin;
|
||||
|
||||
/**
|
||||
* 消息编码
|
||||
*/
|
||||
private String msgCode;
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
package com.mobai.domain.req;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 车辆添加
|
||||
* @Date 2023-12-2 上午 08:58
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class VehicleCreateAddReq {
|
||||
|
||||
/**
|
||||
* 车辆添加VIN
|
||||
*/
|
||||
private String vinStr;
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
package com.mobai.domain.req;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 车辆请求
|
||||
* @Date 2023-11-25 上午 10:03
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class VehicleInstanceListReq {
|
||||
|
||||
/**
|
||||
* 分页
|
||||
*/
|
||||
private Long page;
|
||||
|
||||
/**
|
||||
* 分页大小
|
||||
*/
|
||||
private Long pageSize;
|
||||
|
||||
/**
|
||||
* VIN
|
||||
*/
|
||||
private String vin;
|
||||
|
||||
/**
|
||||
* 上线优先展示
|
||||
*/
|
||||
private boolean online;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
package com.mobai.domain.resp;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 一键执行任务结果集
|
||||
* @date 2023/12/5
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class UnifiedTaskResp {
|
||||
/**
|
||||
* 任务状态 默认为false状态
|
||||
*/
|
||||
private boolean unifiedStatus;
|
||||
|
||||
/**
|
||||
* 任务名称
|
||||
*/
|
||||
private String taskName;
|
||||
|
||||
/**
|
||||
* 任务执行总数
|
||||
*/
|
||||
private Integer taskExecutionSum;
|
||||
|
||||
/**
|
||||
* 任务执行时间
|
||||
*/
|
||||
private long taskStartTime;
|
||||
|
||||
/**
|
||||
* 任务成功执行总数
|
||||
*/
|
||||
private Integer taskSuccessSum;
|
||||
|
||||
|
||||
/**
|
||||
* 任务执行失败总数
|
||||
*/
|
||||
private Integer taskErrorSum;
|
||||
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
package com.mobai.domain.resp;
|
||||
|
||||
import com.mobai.vehicle.VehicleInstance;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 车辆实例控制层响应结果
|
||||
* @Date 2023-11-25 上午 10:04
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class VehicleInstanceResp {
|
||||
|
||||
/**
|
||||
* VIN
|
||||
*/
|
||||
private String vin;
|
||||
|
||||
/**
|
||||
* 是否在线
|
||||
*/
|
||||
private boolean isOnline;
|
||||
|
||||
/**
|
||||
* 路线轨迹编码
|
||||
*/
|
||||
private String positionCode;
|
||||
|
||||
/**
|
||||
* 路线剩余定位点
|
||||
*/
|
||||
private Integer positionLength = 0;
|
||||
|
||||
/**
|
||||
* 消息状态
|
||||
*/
|
||||
private String msgCode;
|
||||
|
||||
|
||||
/**
|
||||
* 档位
|
||||
*/
|
||||
private String gear = "P";
|
||||
|
||||
/**
|
||||
* 里程
|
||||
*/
|
||||
private BigDecimal mileage;
|
||||
|
||||
public static VehicleInstanceResp instanceBuild (VehicleInstance vehicleInstance) {
|
||||
return VehicleInstanceResp.builder()
|
||||
.vin(vehicleInstance.getVin())
|
||||
.isOnline(vehicleInstance.isOnline())
|
||||
.positionCode(vehicleInstance.getPositionCode())
|
||||
.positionLength(vehicleInstance.getPositionQueue().size())
|
||||
.gear(vehicleInstance.getVehicleData().getGear())
|
||||
.msgCode(vehicleInstance.getMsgCode())
|
||||
.mileage(vehicleInstance.getVehicleData().getMileage())
|
||||
.build();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
package com.mobai.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.mobai.domain.PositionRouteInfo;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 轨迹路径 mapper
|
||||
* @Date 2023-11-20 上午 09:32
|
||||
*/
|
||||
public interface PositionRouteMapper extends BaseMapper<PositionRouteInfo> {
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package com.mobai.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.mobai.domain.Vehicle;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 车辆 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author Saisai.Liu
|
||||
* @since 2022-07-05
|
||||
*/
|
||||
public interface VehicleMapper extends BaseMapper<Vehicle> {
|
||||
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package com.mobai.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.mobai.domain.PositionRouteInfo;
|
||||
import com.mobai.domain.model.PositionModel;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 路径轨迹业务层
|
||||
* @Date 2023-11-20 上午 09:33
|
||||
*/
|
||||
public interface PositionRouteService extends IService<PositionRouteInfo> {
|
||||
|
||||
|
||||
/**
|
||||
* 根据轨迹ID获取轨迹详情
|
||||
* @param routeId 轨迹ID
|
||||
* @return 轨迹ID
|
||||
*/
|
||||
public List<PositionModel> getPositionModelByRouteId(Long routeId);
|
||||
|
||||
/**
|
||||
* 根据轨迹 编号查询 估计详情
|
||||
* @param positionCode 轨迹编号
|
||||
* @return
|
||||
*/
|
||||
List<PositionModel> getPositionModelByRouteName (String positionCode);
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
package com.mobai.service;
|
||||
|
||||
import com.mobai.common.PageList;
|
||||
import com.mobai.domain.Vehicle;
|
||||
import com.mobai.domain.req.CheckPositionReq;
|
||||
import com.mobai.domain.req.GearReq;
|
||||
import com.mobai.domain.req.MsgReq;
|
||||
import com.mobai.domain.req.VehicleInstanceListReq;
|
||||
import com.mobai.domain.resp.VehicleInstanceResp;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 车辆实例业务层
|
||||
* @date 2023/11/22
|
||||
*/
|
||||
public interface VehicleInstanceService {
|
||||
|
||||
/**
|
||||
* 根据车辆生成车辆实例
|
||||
* @param vehicle 车辆信息
|
||||
*/
|
||||
public void init(Vehicle vehicle);
|
||||
|
||||
|
||||
/**
|
||||
* 车辆结果对象
|
||||
*
|
||||
* @param vehicleInstanceListReq 车辆查询
|
||||
*
|
||||
* @return 车辆对象
|
||||
*/
|
||||
PageList<VehicleInstanceResp> queryList (VehicleInstanceListReq vehicleInstanceListReq);
|
||||
|
||||
/**
|
||||
* 车辆客户端初始化
|
||||
* @param vin vin
|
||||
*/
|
||||
void vehicleClientInit (String vin);
|
||||
|
||||
/**
|
||||
* 车辆客户端关闭
|
||||
* @param vin vin
|
||||
*/
|
||||
void vehicleClientClose (String vin);
|
||||
|
||||
/**
|
||||
* 选择车辆轨迹
|
||||
* @param checkPositionReq 切换轨迹
|
||||
*/
|
||||
void checkPosition (CheckPositionReq checkPositionReq);
|
||||
|
||||
/**
|
||||
* 车辆消息操作
|
||||
* @param msgReq
|
||||
*/
|
||||
void msg (MsgReq msgReq);
|
||||
|
||||
/**
|
||||
* 设置档位
|
||||
* @param gearReq
|
||||
*/
|
||||
void gear (GearReq gearReq);
|
||||
|
||||
/**
|
||||
* 修改车辆报文
|
||||
* @param vin vin
|
||||
* @param statusKey 状态键
|
||||
* @param statusValue 状态值
|
||||
*/
|
||||
void editStatus (String vin, String statusKey, Integer statusValue);
|
||||
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
package com.mobai.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.mobai.domain.Vehicle;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 车辆 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author Saisai.Liu
|
||||
* @since 2022-07-05
|
||||
*/
|
||||
public interface VehicleService extends IService<Vehicle> {
|
||||
|
||||
/**
|
||||
* 根据数量生成测试车辆
|
||||
* @param sum 数量
|
||||
*/
|
||||
void generate(Integer sum);
|
||||
|
||||
/**
|
||||
* 创建IVN
|
||||
* @param vinStr VIN
|
||||
*/
|
||||
void create (String vinStr);
|
||||
|
||||
/**
|
||||
* 同步数据库
|
||||
*/
|
||||
void syncDb();
|
||||
|
||||
/**
|
||||
* 通过VIN删除车辆
|
||||
* @param vin vin
|
||||
*/
|
||||
void delete(String vin);
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
package com.mobai.service;
|
||||
|
||||
import com.mobai.domain.resp.UnifiedTaskResp;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 一键设置业务层
|
||||
* @date 2023/12/6
|
||||
*/
|
||||
public interface VehicleUnifiedService {
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 一键上线
|
||||
*/
|
||||
public void unifiedOnline();
|
||||
|
||||
/**
|
||||
* 一键离线
|
||||
*/
|
||||
public void unifiedOffline();
|
||||
|
||||
/**
|
||||
* 一键上报
|
||||
*/
|
||||
public void unifiedSend();
|
||||
|
||||
/**
|
||||
* 一键重置路径
|
||||
*/
|
||||
void unifiedPosition ();
|
||||
|
||||
/**
|
||||
* 一键取消上报
|
||||
*/
|
||||
public void unifiedStop();
|
||||
|
||||
/**
|
||||
* 一键执行状态
|
||||
* @return 一键执行状态
|
||||
*/
|
||||
UnifiedTaskResp unifiedStatus();
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
package com.mobai.service.impl;
|
||||
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.mobai.domain.PositionRouteInfo;
|
||||
import com.mobai.domain.model.PositionModel;
|
||||
import com.mobai.mapper.PositionRouteMapper;
|
||||
import com.mobai.service.PositionRouteService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 路径轨迹业务实现层
|
||||
* @Date 2023-11-20 上午 09:34
|
||||
*/
|
||||
@Service
|
||||
public class PositionRouteServiceImpl extends ServiceImpl<PositionRouteMapper, PositionRouteInfo> implements PositionRouteService {
|
||||
/**
|
||||
* 根据轨迹ID获取轨迹详情
|
||||
* @param routeId 轨迹ID
|
||||
* @return 轨迹ID
|
||||
*/
|
||||
@Override
|
||||
public List<PositionModel> getPositionModelByRouteId(Long routeId) {
|
||||
PositionRouteInfo positionRouteInfo = this.getById(routeId);
|
||||
return JSONArray.parseArray(positionRouteInfo.getRouteData(), String.class)
|
||||
.stream()
|
||||
.map(PositionModel::strBuild)
|
||||
.toList();
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据轨迹 编号查询 估计详情
|
||||
*
|
||||
* @param positionCode 轨迹编号
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<PositionModel> getPositionModelByRouteName(String positionCode) {
|
||||
LambdaQueryWrapper<PositionRouteInfo> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(PositionRouteInfo::getName, positionCode);
|
||||
PositionRouteInfo positionRouteInfo = getOne(queryWrapper);
|
||||
return JSONArray.parseArray(positionRouteInfo.getRouteData(), String.class)
|
||||
.stream()
|
||||
.map(PositionModel::strBuild)
|
||||
.toList();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,142 @@
|
|||
package com.mobai.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
|
||||
import com.mobai.domain.Vehicle;
|
||||
import com.mobai.mapper.VehicleMapper;
|
||||
import com.mobai.service.VehicleInstanceService;
|
||||
import com.mobai.service.VehicleService;
|
||||
import com.mobai.vehicle.VehicleInstance;
|
||||
import com.mobai.vehicle.core.LocalContainer;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 车辆 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author Saisai.Liu
|
||||
* @since 2022-07-05
|
||||
*/
|
||||
@Log4j2
|
||||
@Service
|
||||
public class VechileServiceImpl extends ServiceImpl<VehicleMapper, Vehicle> implements VehicleService {
|
||||
|
||||
|
||||
@Autowired
|
||||
private VehicleInstanceService vehicleInstanceService;
|
||||
|
||||
/**
|
||||
* 根据数量生成测试车辆
|
||||
*
|
||||
* @param sum 数量
|
||||
*/
|
||||
@Override
|
||||
@Transactional
|
||||
public void generate(Integer sum) {
|
||||
List<Vehicle> vehicleList = Stream.generate(Vehicle::gen).limit(sum).toList();
|
||||
this.saveBatch(vehicleList);
|
||||
vehicleList.forEach(vehicleInstanceService::init);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建IVN
|
||||
*
|
||||
* @param vinStr VIN
|
||||
*/
|
||||
@Override
|
||||
@Transactional
|
||||
public void create(String vinStr) {
|
||||
String[] vinList = vinStr.split("\n");
|
||||
StringBuilder errorMsg = new StringBuilder();
|
||||
for (String vin : vinList) {
|
||||
if (vin.length() != 17) {
|
||||
errorMsg.append("vin[").append(vin).append("]").append("不为17位\n");
|
||||
} else {
|
||||
LambdaQueryWrapper<Vehicle> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(Vehicle::getVin, vin);
|
||||
long count = this.count(queryWrapper);
|
||||
if (count == 1) {
|
||||
errorMsg.append("vin[").append(vin).append("]").append("已经存在\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!errorMsg.isEmpty()) {
|
||||
throw new RuntimeException(errorMsg.toString());
|
||||
}
|
||||
List<Vehicle> vehicleList = Arrays.stream(vinList).map(Vehicle::create).toList();
|
||||
this.saveBatch(vehicleList);
|
||||
vehicleList.forEach(vehicleInstanceService::init);
|
||||
}
|
||||
|
||||
/**
|
||||
* 同步数据库
|
||||
*/
|
||||
@Override
|
||||
public void syncDb() {
|
||||
try {
|
||||
// vehicleInstanceService.isTaskStatus();
|
||||
log.info("同步数据库开始");
|
||||
long startTime = System.currentTimeMillis();
|
||||
Collection<VehicleInstance> vehicleInstanceList = LocalContainer.getOnlineVehicleInstance();
|
||||
// 成功数量
|
||||
AtomicInteger syncSuccessSum = new AtomicInteger();
|
||||
List<Vehicle> vehicleList = vehicleInstanceList.stream()
|
||||
.filter(VehicleInstance::isOnline)
|
||||
.map(Vehicle::instanceBuild)
|
||||
.toList();
|
||||
vehicleList.forEach(vehicle -> {
|
||||
LambdaUpdateWrapper<Vehicle> updateWrapper = new LambdaUpdateWrapper<>();
|
||||
updateWrapper.set(Vehicle::getRemainingBattery, vehicle.getRemainingBattery());
|
||||
updateWrapper.set(Vehicle::getTotalMileage, vehicle.getTotalMileage());
|
||||
updateWrapper.eq(Vehicle::getVin, vehicle.getVin());
|
||||
try {
|
||||
this.update(updateWrapper);
|
||||
syncSuccessSum.incrementAndGet();
|
||||
log.debug("车辆:[{}] - 数据同步成功 - 电池容量:[{}毫安] 总公里数量:[{}KM]", vehicle.getVin(), vehicle.getRemainingBattery(), vehicle.getTotalMileage());
|
||||
} catch (Exception exception) {
|
||||
log.error("车辆:[{}] - 数据同步失败 - 电池容量:[{}毫安] 总公里数量:[{}KM]", vehicle.getVin(), vehicle.getRemainingBattery(), vehicle.getTotalMileage());
|
||||
}
|
||||
});
|
||||
log.info("同步数据库结束 - 耗时:[{}MS],同步量:[{}辆],成功:[{}辆],失败:[{}辆]",
|
||||
System.currentTimeMillis() - startTime, vehicleList.size(), syncSuccessSum.get(), vehicleList.size() - syncSuccessSum.get());
|
||||
} catch (Exception exception) {
|
||||
log.error("数据同步异常:{}", exception.getMessage(), exception);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过VIN删除车辆
|
||||
*
|
||||
* @param vin vin
|
||||
*/
|
||||
@Override
|
||||
public void delete(String vin) {
|
||||
VehicleInstance vehicleInstance = LocalContainer.getVehicleInstance(vin);
|
||||
// 先判断车辆是否在上报数据,上报则停止
|
||||
if (vehicleInstance.isSend()) {
|
||||
vehicleInstance.stopSend();
|
||||
}
|
||||
// 判断车辆是否在线,若在线则让车辆下线
|
||||
if (vehicleInstance.isOnline()) {
|
||||
vehicleInstance.closeClient();
|
||||
}
|
||||
// 进行缓存删除
|
||||
LocalContainer.removeByVin(vin);
|
||||
// 删除数据库
|
||||
this.removeById(vin);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,206 @@
|
|||
package com.mobai.service.impl;
|
||||
|
||||
import com.mobai.common.PageList;
|
||||
import com.mobai.common.Result;
|
||||
import com.mobai.domain.Vehicle;
|
||||
import com.mobai.domain.model.MqttServerModel;
|
||||
import com.mobai.domain.model.PositionModel;
|
||||
import com.mobai.domain.req.CheckPositionReq;
|
||||
import com.mobai.domain.req.GearReq;
|
||||
import com.mobai.domain.req.MsgReq;
|
||||
import com.mobai.domain.req.VehicleInstanceListReq;
|
||||
import com.mobai.domain.resp.VehicleInstanceResp;
|
||||
import com.mobai.service.PositionRouteService;
|
||||
import com.mobai.service.VehicleInstanceService;
|
||||
import com.mobai.utils.MD5Util;
|
||||
import com.mobai.utils.ReflectUtils;
|
||||
import com.mobai.vehicle.VehicleInstance;
|
||||
import com.mobai.vehicle.api.ClientAdmin;
|
||||
import com.mobai.vehicle.api.req.VehicleConnectionReq;
|
||||
import com.mobai.vehicle.core.LocalContainer;
|
||||
import com.mobai.vehicle.model.VehicleData;
|
||||
import com.mobai.vehicle.model.properties.MqttProperties;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 车辆实例业务实现层
|
||||
* @date 2023/11/22
|
||||
*/
|
||||
@Log4j2
|
||||
@Service
|
||||
public class VehicleInstanceServiceImpl implements VehicleInstanceService {
|
||||
|
||||
@Autowired
|
||||
private PositionRouteService positionRouteService;
|
||||
|
||||
@Autowired
|
||||
private ClientAdmin clientAdmin;
|
||||
|
||||
/**
|
||||
* 根据车辆生成车辆实例
|
||||
*
|
||||
* @param vehicle 车辆信息
|
||||
*/
|
||||
@Override
|
||||
public void init(Vehicle vehicle) {
|
||||
VehicleInstance vehicleInstance = new VehicleInstance();
|
||||
vehicleInstance.setVehicle(vehicle);
|
||||
vehicleInstance.setVehicleData(VehicleData.vehicleBuild(vehicle));
|
||||
LocalContainer.setVehicleInstance(vehicleInstance);
|
||||
log.debug("构建车辆对象: [{}]", vehicle.getVin());
|
||||
}
|
||||
|
||||
/**
|
||||
* 车辆结果对象
|
||||
*
|
||||
* @param vehicleInstanceListReq 车辆查询
|
||||
*
|
||||
* @return 车辆对象
|
||||
*/
|
||||
@Override
|
||||
public PageList<VehicleInstanceResp> queryList (VehicleInstanceListReq vehicleInstanceListReq) {
|
||||
Stream<VehicleInstance> stream = LocalContainer.vehicleDataMap.values()
|
||||
.stream();
|
||||
if (StringUtils.isNotBlank(vehicleInstanceListReq.getVin())){
|
||||
stream = stream.filter(vehicleInstance ->
|
||||
vehicleInstance.getVin().contains(vehicleInstanceListReq.getVin()));
|
||||
}
|
||||
|
||||
if (vehicleInstanceListReq.isOnline()){
|
||||
stream = stream.sorted(Comparator.comparingInt(o -> (o.isOnline() ? 0 : 1)));
|
||||
}
|
||||
|
||||
return PageList.<VehicleInstanceResp>builder()
|
||||
.total(LocalContainer.total())
|
||||
.rows(
|
||||
stream
|
||||
.map(VehicleInstanceResp::instanceBuild)
|
||||
.skip((vehicleInstanceListReq.getPage() - 1) * vehicleInstanceListReq.getPageSize())
|
||||
.limit(vehicleInstanceListReq.getPageSize())
|
||||
.toList()
|
||||
)
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 车辆客户端初始化
|
||||
*
|
||||
* @param vin vin
|
||||
*/
|
||||
@Override
|
||||
public void vehicleClientInit (String vin) {
|
||||
log.info("vin[{}],开始上线", vin);
|
||||
VehicleInstance vehicleInstance = LocalContainer.getVehicleInstance(vin);
|
||||
if (vehicleInstance == null){
|
||||
throw new RuntimeException("没有【"+vin+"】车辆");
|
||||
}
|
||||
String timestamp = String.valueOf(System.currentTimeMillis());
|
||||
VehicleConnectionReq connectionReq = VehicleConnectionReq.builder()
|
||||
.vin(vin)
|
||||
.timestamp(timestamp)
|
||||
.userName(MD5Util.encrypted(vin+timestamp))
|
||||
.nonce(MD5Util.encrypted(UUID.randomUUID().toString().replace("-", "")))
|
||||
.build();
|
||||
Result<MqttServerModel> result = clientAdmin.vehicleConnection(connectionReq);
|
||||
if (result.getCode() != 200){
|
||||
log.error("车辆:[{}],申请上线异常:[{}]", vin, result.getMsg());
|
||||
throw new RuntimeException("远程服务器没有【"+vin+"】车辆");
|
||||
}
|
||||
MqttServerModel mqttServerModel = result.getData();
|
||||
MqttProperties mqttProperties = MqttProperties.builder()
|
||||
.broker(mqttServerModel.getBroker())
|
||||
.topic(mqttServerModel.getTopic())
|
||||
.clientId(vin)
|
||||
.username(connectionReq.getUserName())
|
||||
.password(vin + connectionReq.getTimestamp() + connectionReq.getNonce())
|
||||
.build();
|
||||
vehicleInstance.setMqttProperties(mqttProperties);
|
||||
vehicleInstance.initClient();
|
||||
|
||||
log.info("vin[{}],上线成功", vin);
|
||||
}
|
||||
|
||||
/**
|
||||
* 车辆客户端关闭
|
||||
*
|
||||
* @param vin vin
|
||||
*/
|
||||
@Override
|
||||
public void vehicleClientClose (String vin) {
|
||||
VehicleInstance vehicleInstance = LocalContainer.getVehicleInstance(vin);
|
||||
vehicleInstance.closeClient();
|
||||
}
|
||||
|
||||
/**
|
||||
* 选择车辆轨迹
|
||||
*
|
||||
* @param checkPositionReq 切换轨迹
|
||||
*/
|
||||
@Override
|
||||
public void checkPosition (CheckPositionReq checkPositionReq) {
|
||||
VehicleInstance vehicleInstance = LocalContainer.getVehicleInstance(checkPositionReq.getVin());
|
||||
List<PositionModel> positionModelList =
|
||||
this.positionRouteService.getPositionModelByRouteName(checkPositionReq.getPositionCode());
|
||||
vehicleInstance.settingPosition(positionModelList);
|
||||
vehicleInstance.setPositionCode(checkPositionReq.getPositionCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 车辆消息操作
|
||||
*
|
||||
* @param msgReq
|
||||
*/
|
||||
@Override
|
||||
public void msg (MsgReq msgReq) {
|
||||
VehicleInstance vehicleInstance = LocalContainer.getVehicleInstance(msgReq.getVin());
|
||||
switch (msgReq.getMsgCode()){
|
||||
case "上报" -> {
|
||||
if(vehicleInstance.getVehicleThread() == null){
|
||||
vehicleInstance.initVehicleThread();
|
||||
}
|
||||
vehicleInstance.startSend();
|
||||
}
|
||||
case "暂停" -> vehicleInstance.pauseSend();
|
||||
case "停止" -> vehicleInstance.stopSend();
|
||||
default -> throw new RuntimeException("车辆消息事件错误");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置档位
|
||||
*
|
||||
* @param gearReq
|
||||
*/
|
||||
@Override
|
||||
public void gear (GearReq gearReq) {
|
||||
VehicleInstance vehicleInstance = LocalContainer.getVehicleInstance(gearReq.getVin());
|
||||
vehicleInstance.setGear(gearReq.getGear());
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改车辆报文
|
||||
*
|
||||
* @param vin vin
|
||||
* @param statusKey 状态键
|
||||
* @param statusValue 状态值
|
||||
*/
|
||||
@Override
|
||||
public void editStatus (String vin, String statusKey, Integer statusValue) {
|
||||
VehicleInstance vehicleInstance = LocalContainer.getVehicleInstance(vin);
|
||||
VehicleData vehicleData = vehicleInstance.getVehicleData();
|
||||
ReflectUtils.invokeSetter(vehicleData, statusKey, statusValue);
|
||||
}
|
||||
|
||||
// private final AtomicBoolean unifiedStatus = new AtomicBoolean(Boolean.TRUE);
|
||||
|
||||
}
|
|
@ -0,0 +1,280 @@
|
|||
package com.mobai.service.impl;
|
||||
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.mobai.common.pool.FixedThreadPool;
|
||||
import com.mobai.domain.PositionRouteInfo;
|
||||
import com.mobai.domain.model.PositionModel;
|
||||
import com.mobai.domain.model.TaskModel;
|
||||
import com.mobai.domain.resp.UnifiedTaskResp;
|
||||
import com.mobai.service.PositionRouteService;
|
||||
import com.mobai.service.VehicleInstanceService;
|
||||
import com.mobai.service.VehicleUnifiedService;
|
||||
import com.mobai.vehicle.VehicleInstance;
|
||||
import com.mobai.vehicle.core.LocalContainer;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 一键设置业务实现层
|
||||
* @date 2023/12/6
|
||||
*/
|
||||
@Log4j2
|
||||
@Service
|
||||
public class VehicleUnifiedServiceImpl implements VehicleUnifiedService {
|
||||
|
||||
@Autowired
|
||||
private VehicleInstanceService vehicleInstanceService;
|
||||
|
||||
@Autowired
|
||||
private PositionRouteService positionRouteService;
|
||||
|
||||
|
||||
/**
|
||||
* 任务执行模型
|
||||
*/
|
||||
private final TaskModel taskModel = new TaskModel();
|
||||
|
||||
/**
|
||||
* 一键上线
|
||||
*/
|
||||
@Override
|
||||
public void unifiedOnline () {
|
||||
// 获取离线车辆VIN
|
||||
List<String> vinList = LocalContainer.getOfflineVehicleInstance()
|
||||
.stream()
|
||||
.map(VehicleInstance::getVin)
|
||||
.toList();
|
||||
taskModel.submit("一键上线", vinList.size());
|
||||
new Thread(() -> {
|
||||
int vinSize = 0, executionSize = 15;
|
||||
do {
|
||||
int startIndex = vinSize++ * executionSize;
|
||||
// 进行分页开启车辆
|
||||
List<String> executionVinList = vinList.stream()
|
||||
.skip(startIndex)
|
||||
.limit(executionSize)
|
||||
.toList();
|
||||
CountDownLatch countDownLatch = new CountDownLatch(executionVinList.size());
|
||||
Map<String, Thread> startVehicleThread = new ConcurrentHashMap<>();
|
||||
executionVinList.forEach(vin -> {
|
||||
Thread thread = new Thread(() -> {
|
||||
try {
|
||||
vehicleInstanceService.vehicleClientInit(vin);
|
||||
startVehicleThread.remove(vin);
|
||||
}catch (Exception interruptedException){
|
||||
log.error(interruptedException);
|
||||
}
|
||||
});
|
||||
startVehicleThread.put(vin, thread);
|
||||
FixedThreadPool.submit(thread);
|
||||
});
|
||||
|
||||
try {
|
||||
boolean await = countDownLatch.await(5, TimeUnit.SECONDS);
|
||||
log.info(
|
||||
"开始:[{}], 结束:[{}],未上线成功:[{}], vin:[{}]",
|
||||
startIndex, startIndex+executionVinList.size(),
|
||||
startVehicleThread.size(),
|
||||
JSONObject.toJSONString(executionVinList));
|
||||
if (!await){
|
||||
startVehicleThread.values().forEach(Thread::interrupt);
|
||||
}
|
||||
} catch (InterruptedException ignored) {}
|
||||
if (executionVinList.size() < executionSize){
|
||||
break;
|
||||
}
|
||||
}while (true);
|
||||
taskModel.down();
|
||||
}).start();
|
||||
}
|
||||
|
||||
/**
|
||||
* 一键离线
|
||||
*/
|
||||
@Override
|
||||
public void unifiedOffline () {
|
||||
List<VehicleInstance> onlineVehicleInstanceList = LocalContainer.getOnlineVehicleInstance();
|
||||
new Thread(() -> {
|
||||
try {
|
||||
// 筛选出在线车辆使用并行流操作先停止车辆上报动作再进行车辆离线操作
|
||||
onlineVehicleInstanceList
|
||||
.stream()
|
||||
.parallel()
|
||||
.forEach(vehicleInstance -> {
|
||||
try {
|
||||
vehicleInstance.stopSend();
|
||||
vehicleInstance.closeClient();
|
||||
taskModel.incrementSuccess();
|
||||
}catch (Exception exception){
|
||||
log.error("车辆离线异常:{}", exception.getMessage());
|
||||
taskModel.incrementError();
|
||||
}
|
||||
});
|
||||
} catch (Exception exception) {
|
||||
log.error("车辆一键离线报错:{}", exception.getMessage(), exception);
|
||||
}
|
||||
taskModel.down();
|
||||
});
|
||||
// taskModel.submit("一键离线", onlineVehicleInstanceList.size(), taskThread);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 一键上报
|
||||
*/
|
||||
@Override
|
||||
public void unifiedSend () {
|
||||
List<VehicleInstance> vehicleInstanceList = LocalContainer.getOnlineVehicleInstance();
|
||||
if (vehicleInstanceList.isEmpty()){
|
||||
throw new RuntimeException("还没有车辆连接到服务器,请先让车辆上线");
|
||||
}
|
||||
// 获取到所有路径
|
||||
List<PositionRouteInfo> positionRouteInfoList = positionRouteService.list();
|
||||
// 路径长度
|
||||
int positionSize = positionRouteInfoList.size();
|
||||
// 随机数
|
||||
Random random = new Random();
|
||||
Thread taskThread = new Thread(() -> {
|
||||
try {
|
||||
|
||||
vehicleInstanceList
|
||||
.stream()
|
||||
.parallel()
|
||||
.forEach(vehicleInstance -> {
|
||||
try {
|
||||
// 随机一个路径结果
|
||||
int positionIndex = random.nextInt(0, positionSize);
|
||||
PositionRouteInfo positionRouteInfo = positionRouteInfoList.get(positionIndex);
|
||||
String positionCode = positionRouteInfo.getName();
|
||||
List<PositionModel> positionModelList = JSONArray.parseArray(positionRouteInfo.getRouteData(), String.class)
|
||||
.stream()
|
||||
.map(PositionModel::strBuild)
|
||||
.toList();
|
||||
// 设置车辆路径
|
||||
vehicleInstance.settingPosition(positionModelList);
|
||||
vehicleInstance.setPositionCode(positionCode);
|
||||
// 设置车辆档位
|
||||
vehicleInstance.setGear("D");
|
||||
// 开启线程进行上报
|
||||
if (vehicleInstance.getVehicleThread() == null) {
|
||||
vehicleInstance.initVehicleThread();
|
||||
}
|
||||
vehicleInstance.startSend();
|
||||
taskModel.incrementSuccess();
|
||||
}catch (Exception exception){
|
||||
log.info("车辆设置一键上报失败:{}", exception.getMessage());
|
||||
taskModel.incrementError();
|
||||
}
|
||||
});
|
||||
} catch (Exception exception) {
|
||||
log.error("车辆一键上报报错:{}", exception.getMessage(), exception);
|
||||
}
|
||||
taskModel.down();
|
||||
});
|
||||
// taskModel.submit("一键上报", vehicleInstanceList.size(),taskThread);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 一键重置路径
|
||||
*/
|
||||
@Override
|
||||
public void unifiedPosition () {
|
||||
List<VehicleInstance> vehicleInstanceList = LocalContainer.getOnlineVehicleInstance();
|
||||
Thread taskThread = new Thread(() -> {
|
||||
try {
|
||||
// 获取到所有路径
|
||||
List<PositionRouteInfo> positionRouteInfoList = positionRouteService.list();
|
||||
// 路径长度
|
||||
int positionSize = positionRouteInfoList.size();
|
||||
// 随机数
|
||||
Random random = new Random();
|
||||
|
||||
vehicleInstanceList
|
||||
.stream()
|
||||
.parallel()
|
||||
.forEach(vehicleInstance -> {
|
||||
try {
|
||||
// 随机一个路径结果
|
||||
int positionIndex = random.nextInt(0, positionSize);
|
||||
PositionRouteInfo positionRouteInfo = positionRouteInfoList.get(positionIndex);
|
||||
String positionCode = positionRouteInfo.getName();
|
||||
List<PositionModel> positionModelList = JSONArray.parseArray(positionRouteInfo.getRouteData(), String.class)
|
||||
.stream()
|
||||
.map(PositionModel::strBuild)
|
||||
.toList();
|
||||
// 设置车辆路径
|
||||
vehicleInstance.settingPosition(positionModelList);
|
||||
vehicleInstance.setPositionCode(positionCode);
|
||||
taskModel.incrementSuccess();
|
||||
} catch (Exception exception) {
|
||||
log.error("车辆设置路线异常:[{}]", exception.getMessage());
|
||||
taskModel.incrementError();
|
||||
}
|
||||
});
|
||||
} catch (Exception exception) {
|
||||
log.error("车辆一键重置路径报错:{}", exception.getMessage(), exception);
|
||||
}
|
||||
taskModel.down();
|
||||
});
|
||||
// taskModel.submit("一键重置路径",vehicleInstanceList.size(), taskThread);
|
||||
}
|
||||
|
||||
/**
|
||||
* 一键取消上报
|
||||
*/
|
||||
@Override
|
||||
public void unifiedStop () {
|
||||
List<VehicleInstance> onlineVehicleInstanceList = LocalContainer.getOnlineVehicleInstance();
|
||||
Thread taskThread = new Thread(() -> {
|
||||
try {
|
||||
LocalContainer.getOnlineVehicleInstance()
|
||||
.stream()
|
||||
.parallel()
|
||||
.forEach(vehicleInstance -> {
|
||||
try {
|
||||
vehicleInstance.stopSend();
|
||||
taskModel.incrementSuccess();
|
||||
}catch (Exception exception){
|
||||
log.info("车辆一键取消上报发生错误:{}", exception.getMessage());
|
||||
taskModel.incrementError();
|
||||
}
|
||||
});
|
||||
taskModel.down();
|
||||
} catch (Exception exception) {
|
||||
log.error("车辆一键取消上报报错:{}", exception.getMessage(), exception);
|
||||
}
|
||||
});
|
||||
|
||||
// taskModel.submit("一键取消上报", onlineVehicleInstanceList.size(), taskThread);
|
||||
}
|
||||
|
||||
/**
|
||||
* 一键执行状态
|
||||
*
|
||||
* @return 一键执行状态
|
||||
*/
|
||||
@Override
|
||||
public UnifiedTaskResp unifiedStatus() {
|
||||
boolean unifiedStatus = this.taskModel.getUnifiedStatus().get();
|
||||
return UnifiedTaskResp.builder()
|
||||
.unifiedStatus(unifiedStatus)
|
||||
.taskErrorSum(this.taskModel.getErrorSum())
|
||||
.taskExecutionSum(this.taskModel.getTaskExecutionSum())
|
||||
.taskSuccessSum(this.taskModel.getSuccessSum())
|
||||
.taskName(this.taskModel.getTaskName())
|
||||
.taskStartTime(System.currentTimeMillis() - this.taskModel.getTaskStartTime())
|
||||
.build();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
package com.mobai.utils;
|
||||
|
||||
/**
|
||||
* 校验位计算
|
||||
*/
|
||||
public class CalculateCheckDigit {
|
||||
|
||||
/**
|
||||
* 不去空格
|
||||
* @param sHex
|
||||
* @return
|
||||
*/
|
||||
public static String makeCheck(String sHex){
|
||||
return makeCheckSum(sHex.replace(" ", ""));
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算校验位 ,返回十六进制校验位
|
||||
* */
|
||||
private static String makeCheckSum(String data) {
|
||||
int dSum = 0;
|
||||
int length = data.length();
|
||||
int index = 0;
|
||||
// 遍历十六进制,并计算总和
|
||||
while (index < length) {
|
||||
// 截取2位字符
|
||||
String s = data.substring(index, index + 2);
|
||||
// 十六进制转成十进制 , 并计算十进制的总和
|
||||
dSum += Integer.parseInt(s, 16);
|
||||
index = index + 2;
|
||||
}
|
||||
|
||||
// 用256取余,十六进制最大是FF,FF的十进制是255
|
||||
int mod = dSum % 256;
|
||||
// 余数转成十六进制
|
||||
String checkSumHex = Integer.toHexString(mod);
|
||||
length = checkSumHex.length();
|
||||
if (length < 2) {
|
||||
// 校验位不足两位的,在前面补0
|
||||
checkSumHex = "0" + checkSumHex;
|
||||
}
|
||||
return checkSumHex;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
package com.mobai.utils;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
public class ConversionUtil {
|
||||
|
||||
/**
|
||||
* 字符串转化成为16进制字符串
|
||||
* @param s
|
||||
* @return
|
||||
*/
|
||||
public static String strToSixteen(String s) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
int length = s.length();
|
||||
for (int i = 0; i < length; i++) {
|
||||
int ch = s.charAt(i);
|
||||
String s4 = Integer.toHexString(ch);
|
||||
sb.append(s4 + " ");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static void main (String[] args) {
|
||||
// String str = "<?xml version=\"1.0\"?>\n" +
|
||||
// "<monitorRoot type=\"param\"><synchronizeSyptom event=\"0\" initial=\"true\"><Action_ECG><Rhythm>Sinus</Rhythm><HR>80</HR><EMD>No Change</EMD><Conduct>0</Conduct></Action_ECG><Action_Osat value=\"94\" isRelativePercent=\"false\"/><Action_BP isRelativePercent=\"false\"><Shrink value=\"120\"/><Stretch value=\"80\"/></Action_BP><Action_Resp breathType=\"Normal\" value=\"14\" isRelativePercent=\"false\"/><Action_etCO2 value=\"34\" isRelativePercent=\"false\"/><Action_Temperature value=\"35.2\"/><Action_CVP value=\"6.0\"/><Action_PAPDia value=\"10\"/><Action_PAPSys value=\"25\"/><Action_WP value=\"9\"/></synchronizeSyptom></monitorRoot>";
|
||||
// String strToSixteen = strToSixteen(str);
|
||||
// System.out.println(str);
|
||||
// System.out.println(str.length());
|
||||
// System.out.println(strToSixteen);
|
||||
// System.out.println(strToSixteen.replace(" ", "").length());
|
||||
|
||||
String hexStr = "3C3F786D6C2076657273696F6E3D22312E30223F3E0D0A3C6D6F6E69746F72526F6F7420747970653D22706172616D223E3C73796E6368726F6E697A65537970746F6D206576656E743D22302220696E697469616C3D2274727565223E3C416374696F6E5F4543473E3C52687974686D3E53696E75733C2F52687974686D3E3C48523E38303C2F48523E3C454D443E4E6F204368616E67653C2F454D443E3C436F6E647563743E303C2F436F6E647563743E3C2F416374696F6E5F4543473E3C416374696F6E5F4F7361742076616C75653D2239342220697352656C617469766550657263656E743D2266616C7365222F3E3C416374696F6E5F425020697352656C617469766550657263656E743D2266616C7365223E3C536872696E6B2076616C75653D22313230222F3E3C537472657463682076616C75653D223830222F3E3C2F416374696F6E5F42503E3C416374696F6E5F5265737020627265617468547970653D224E6F726D616C222076616C75653D2231342220697352656C617469766550657263656E743D2266616C7365222F3E3C416374696F6E5F6574434F322076616C75653D2233342220697352656C617469766550657263656E743D2266616C7365222F3E3C416374696F6E5F54656D70657261747572652076616C75653D2233352E32222F3E3C416374696F6E5F4356502076616C75653D22362E30222F3E3C416374696F6E5F5041504469612076616C75653D223130222F3E3C416374696F6E5F5041505379732076616C75653D223235222F3E3C416374696F6E5F57502076616C75653D2239222F3E3C2F73796E6368726F6E697A65537970746F6D3E3C2F6D6F6E69746F72526F6F743E0D0A";
|
||||
String hexStringToString = hexStringToString(hexStr);
|
||||
System.out.println(hexStr);
|
||||
System.out.println(hexStr.length());
|
||||
System.out.println(hexStringToString);
|
||||
System.out.println(hexStringToString.length());
|
||||
}
|
||||
|
||||
/**
|
||||
* 16进制转换成为string类型字符串
|
||||
* @param s
|
||||
* @return
|
||||
*/
|
||||
public static String hexStringToString(String s) {
|
||||
if (s == null || s.equals("")) {
|
||||
return null;
|
||||
}
|
||||
s = s.replace(" ", "");
|
||||
byte[] baKeyword = new byte[s.length() / 2];
|
||||
for (int i = 0; i < baKeyword.length; i++) {
|
||||
try {
|
||||
baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
try {
|
||||
s = new String(baKeyword, StandardCharsets.UTF_8);
|
||||
} catch (Exception e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
return s;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,893 @@
|
|||
package com.mobai.utils;
|
||||
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.Charset;
|
||||
import java.text.NumberFormat;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 类型转换器
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class Convert {
|
||||
/**
|
||||
* 转换为字符串<br>
|
||||
* 如果给定的值为null,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
* @param defaultValue 转换错误时的默认值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static String toStr (Object value, String defaultValue) {
|
||||
if (null == value) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (value instanceof String) {
|
||||
return (String) value;
|
||||
}
|
||||
return value.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为字符串<br>
|
||||
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static String toStr (Object value) {
|
||||
return toStr(value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为字符<br>
|
||||
* 如果给定的值为null,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
* @param defaultValue 转换错误时的默认值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Character toChar (Object value, Character defaultValue) {
|
||||
if (null == value) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (value instanceof Character) {
|
||||
return (Character) value;
|
||||
}
|
||||
|
||||
final String valueStr = toStr(value, null);
|
||||
return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为字符<br>
|
||||
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Character toChar (Object value) {
|
||||
return toChar(value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为byte<br>
|
||||
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
* @param defaultValue 转换错误时的默认值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Byte toByte (Object value, Byte defaultValue) {
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (value instanceof Byte) {
|
||||
return (Byte) value;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).byteValue();
|
||||
}
|
||||
final String valueStr = toStr(value, null);
|
||||
if (StringUtils.isEmpty(valueStr)) {
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
return Byte.parseByte(valueStr);
|
||||
} catch (Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为byte<br>
|
||||
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Byte toByte (Object value) {
|
||||
return toByte(value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为Short<br>
|
||||
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
* @param defaultValue 转换错误时的默认值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Short toShort (Object value, Short defaultValue) {
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (value instanceof Short) {
|
||||
return (Short) value;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).shortValue();
|
||||
}
|
||||
final String valueStr = toStr(value, null);
|
||||
if (StringUtils.isEmpty(valueStr)) {
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
return Short.parseShort(valueStr.trim());
|
||||
} catch (Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为Short<br>
|
||||
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Short toShort (Object value) {
|
||||
return toShort(value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为Number<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
* @param defaultValue 转换错误时的默认值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Number toNumber (Object value, Number defaultValue) {
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return (Number) value;
|
||||
}
|
||||
final String valueStr = toStr(value, null);
|
||||
if (StringUtils.isEmpty(valueStr)) {
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
return NumberFormat.getInstance().parse(valueStr);
|
||||
} catch (Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为Number<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Number toNumber (Object value) {
|
||||
return toNumber(value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为int<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
* @param defaultValue 转换错误时的默认值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Integer toInt (Object value, Integer defaultValue) {
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (value instanceof Integer) {
|
||||
return (Integer) value;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).intValue();
|
||||
}
|
||||
final String valueStr = toStr(value, null);
|
||||
if (StringUtils.isEmpty(valueStr)) {
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
return Integer.parseInt(valueStr.trim());
|
||||
} catch (Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为int<br>
|
||||
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Integer toInt (Object value) {
|
||||
return toInt(value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为Integer数组<br>
|
||||
*
|
||||
* @param str 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Integer[] toIntArray (String str) {
|
||||
return toIntArray(",", str);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为Long数组<br>
|
||||
*
|
||||
* @param str 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Long[] toLongArray (String str) {
|
||||
return toLongArray(",", str);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为Integer数组<br>
|
||||
*
|
||||
* @param split 分隔符
|
||||
* @param split 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Integer[] toIntArray (String split, String str) {
|
||||
if (StringUtils.isEmpty(str)) {
|
||||
return new Integer[]{};
|
||||
}
|
||||
String[] arr = str.split(split);
|
||||
final Integer[] ints = new Integer[arr.length];
|
||||
for (int i = 0 ; i < arr.length ; i++) {
|
||||
final Integer v = toInt(arr[i], 0);
|
||||
ints[i] = v;
|
||||
}
|
||||
return ints;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为Long数组<br>
|
||||
*
|
||||
* @param split 分隔符
|
||||
* @param str 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Long[] toLongArray (String split, String str) {
|
||||
if (StringUtils.isEmpty(str)) {
|
||||
return new Long[]{};
|
||||
}
|
||||
String[] arr = str.split(split);
|
||||
final Long[] longs = new Long[arr.length];
|
||||
for (int i = 0 ; i < arr.length ; i++) {
|
||||
final Long v = toLong(arr[i], null);
|
||||
longs[i] = v;
|
||||
}
|
||||
return longs;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为String数组<br>
|
||||
*
|
||||
* @param str 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static String[] toStrArray (String str) {
|
||||
return toStrArray(",", str);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为String数组<br>
|
||||
*
|
||||
* @param split 分隔符
|
||||
* @param split 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static String[] toStrArray (String split, String str) {
|
||||
return str.split(split);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为long<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
* @param defaultValue 转换错误时的默认值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Long toLong (Object value, Long defaultValue) {
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (value instanceof Long) {
|
||||
return (Long) value;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).longValue();
|
||||
}
|
||||
final String valueStr = toStr(value, null);
|
||||
if (StringUtils.isEmpty(valueStr)) {
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
// 支持科学计数法
|
||||
return new BigDecimal(valueStr.trim()).longValue();
|
||||
} catch (Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为long<br>
|
||||
* 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Long toLong (Object value) {
|
||||
return toLong(value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为double<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
* @param defaultValue 转换错误时的默认值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Double toDouble (Object value, Double defaultValue) {
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (value instanceof Double) {
|
||||
return (Double) value;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).doubleValue();
|
||||
}
|
||||
final String valueStr = toStr(value, null);
|
||||
if (StringUtils.isEmpty(valueStr)) {
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
// 支持科学计数法
|
||||
return new BigDecimal(valueStr.trim()).doubleValue();
|
||||
} catch (Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为double<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Double toDouble (Object value) {
|
||||
return toDouble(value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为Float<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
* @param defaultValue 转换错误时的默认值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Float toFloat (Object value, Float defaultValue) {
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (value instanceof Float) {
|
||||
return (Float) value;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).floatValue();
|
||||
}
|
||||
final String valueStr = toStr(value, null);
|
||||
if (StringUtils.isEmpty(valueStr)) {
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
return Float.parseFloat(valueStr.trim());
|
||||
} catch (Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为Float<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Float toFloat (Object value) {
|
||||
return toFloat(value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为boolean<br>
|
||||
* String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
* @param defaultValue 转换错误时的默认值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Boolean toBool (Object value, Boolean defaultValue) {
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (value instanceof Boolean) {
|
||||
return (Boolean) value;
|
||||
}
|
||||
String valueStr = toStr(value, null);
|
||||
if (StringUtils.isEmpty(valueStr)) {
|
||||
return defaultValue;
|
||||
}
|
||||
valueStr = valueStr.trim().toLowerCase();
|
||||
switch (valueStr) {
|
||||
case "true":
|
||||
case "yes":
|
||||
case "ok":
|
||||
case "1":
|
||||
return true;
|
||||
case "false":
|
||||
case "no":
|
||||
case "0":
|
||||
return false;
|
||||
default:
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为boolean<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static Boolean toBool (Object value) {
|
||||
return toBool(value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为Enum对象<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||
*
|
||||
* @param clazz Enum的Class
|
||||
* @param value 值
|
||||
* @param defaultValue 默认值
|
||||
*
|
||||
* @return Enum
|
||||
*/
|
||||
public static <E extends Enum<E>> E toEnum (Class<E> clazz, Object value, E defaultValue) {
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (clazz.isAssignableFrom(value.getClass())) {
|
||||
@SuppressWarnings("unchecked")
|
||||
E myE = (E) value;
|
||||
return myE;
|
||||
}
|
||||
final String valueStr = toStr(value, null);
|
||||
if (StringUtils.isEmpty(valueStr)) {
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
return Enum.valueOf(clazz, valueStr);
|
||||
} catch (Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为Enum对象<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
|
||||
*
|
||||
* @param clazz Enum的Class
|
||||
* @param value 值
|
||||
*
|
||||
* @return Enum
|
||||
*/
|
||||
public static <E extends Enum<E>> E toEnum (Class<E> clazz, Object value) {
|
||||
return toEnum(clazz, value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为BigInteger<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
* @param defaultValue 转换错误时的默认值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static BigInteger toBigInteger (Object value, BigInteger defaultValue) {
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (value instanceof BigInteger) {
|
||||
return (BigInteger) value;
|
||||
}
|
||||
if (value instanceof Long) {
|
||||
return BigInteger.valueOf((Long) value);
|
||||
}
|
||||
final String valueStr = toStr(value, null);
|
||||
if (StringUtils.isEmpty(valueStr)) {
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
return new BigInteger(valueStr);
|
||||
} catch (Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为BigInteger<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static BigInteger toBigInteger (Object value) {
|
||||
return toBigInteger(value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为BigDecimal<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
* @param defaultValue 转换错误时的默认值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static BigDecimal toBigDecimal (Object value, BigDecimal defaultValue) {
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
if (value instanceof BigDecimal) {
|
||||
return (BigDecimal) value;
|
||||
}
|
||||
if (value instanceof Long) {
|
||||
return new BigDecimal((Long) value);
|
||||
}
|
||||
if (value instanceof Double) {
|
||||
return BigDecimal.valueOf((Double) value);
|
||||
}
|
||||
if (value instanceof Integer) {
|
||||
return new BigDecimal((Integer) value);
|
||||
}
|
||||
final String valueStr = toStr(value, null);
|
||||
if (StringUtils.isEmpty(valueStr)) {
|
||||
return defaultValue;
|
||||
}
|
||||
try {
|
||||
return new BigDecimal(valueStr);
|
||||
} catch (Exception e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为BigDecimal<br>
|
||||
* 如果给定的值为空,或者转换失败,返回默认值<br>
|
||||
* 转换失败不会报错
|
||||
*
|
||||
* @param value 被转换的值
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
public static BigDecimal toBigDecimal (Object value) {
|
||||
return toBigDecimal(value, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将对象转为字符串<br>
|
||||
* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
|
||||
*
|
||||
* @param obj 对象
|
||||
*
|
||||
* @return 字符串
|
||||
*/
|
||||
public static String utf8Str (Object obj) {
|
||||
return str(obj, "utf-8");
|
||||
}
|
||||
|
||||
/**
|
||||
* 将对象转为字符串<br>
|
||||
* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
|
||||
*
|
||||
* @param obj 对象
|
||||
* @param charsetName 字符集
|
||||
*
|
||||
* @return 字符串
|
||||
*/
|
||||
public static String str (Object obj, String charsetName) {
|
||||
return str(obj, Charset.forName(charsetName));
|
||||
}
|
||||
|
||||
/**
|
||||
* 将对象转为字符串<br>
|
||||
* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
|
||||
*
|
||||
* @param obj 对象
|
||||
* @param charset 字符集
|
||||
*
|
||||
* @return 字符串
|
||||
*/
|
||||
public static String str (Object obj, Charset charset) {
|
||||
if (null == obj) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (obj instanceof String) {
|
||||
return (String) obj;
|
||||
} else if (obj instanceof byte[]) {
|
||||
return str((byte[]) obj, charset);
|
||||
} else if (obj instanceof Byte[]) {
|
||||
byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj);
|
||||
return str(bytes, charset);
|
||||
} else if (obj instanceof ByteBuffer) {
|
||||
return str((ByteBuffer) obj, charset);
|
||||
}
|
||||
return obj.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 将byte数组转为字符串
|
||||
*
|
||||
* @param bytes byte数组
|
||||
* @param charset 字符集
|
||||
*
|
||||
* @return 字符串
|
||||
*/
|
||||
public static String str (byte[] bytes, String charset) {
|
||||
return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
|
||||
}
|
||||
|
||||
/**
|
||||
* 解码字节码
|
||||
*
|
||||
* @param data 字符串
|
||||
* @param charset 字符集,如果此字段为空,则解码的结果取决于平台
|
||||
*
|
||||
* @return 解码后的字符串
|
||||
*/
|
||||
public static String str (byte[] data, Charset charset) {
|
||||
if (data == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (null == charset) {
|
||||
return new String(data);
|
||||
}
|
||||
return new String(data, charset);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将编码的byteBuffer数据转换为字符串
|
||||
*
|
||||
* @param data 数据
|
||||
* @param charset 字符集,如果为空使用当前系统字符集
|
||||
*
|
||||
* @return 字符串
|
||||
*/
|
||||
public static String str (ByteBuffer data, String charset) {
|
||||
if (data == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return str(data, Charset.forName(charset));
|
||||
}
|
||||
|
||||
/**
|
||||
* 将编码的byteBuffer数据转换为字符串
|
||||
*
|
||||
* @param data 数据
|
||||
* @param charset 字符集,如果为空使用当前系统字符集
|
||||
*
|
||||
* @return 字符串
|
||||
*/
|
||||
public static String str (ByteBuffer data, Charset charset) {
|
||||
if (null == charset) {
|
||||
charset = Charset.defaultCharset();
|
||||
}
|
||||
return charset.decode(data).toString();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------- 全角半角转换
|
||||
|
||||
/**
|
||||
* 半角转全角
|
||||
*
|
||||
* @param input String.
|
||||
*
|
||||
* @return 全角字符串.
|
||||
*/
|
||||
public static String toSBC (String input) {
|
||||
return toSBC(input, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 半角转全角
|
||||
*
|
||||
* @param input String
|
||||
* @param notConvertSet 不替换的字符集合
|
||||
*
|
||||
* @return 全角字符串.
|
||||
*/
|
||||
public static String toSBC (String input, Set<Character> notConvertSet) {
|
||||
char[] c = input.toCharArray();
|
||||
for (int i = 0 ; i < c.length ; i++) {
|
||||
if (null != notConvertSet && notConvertSet.contains(c[i])) {
|
||||
// 跳过不替换的字符
|
||||
continue;
|
||||
}
|
||||
|
||||
if (c[i] == ' ') {
|
||||
c[i] = '\u3000';
|
||||
} else if (c[i] < '\177') {
|
||||
c[i] = (char) (c[i] + 65248);
|
||||
|
||||
}
|
||||
}
|
||||
return new String(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* 全角转半角
|
||||
*
|
||||
* @param input String.
|
||||
*
|
||||
* @return 半角字符串
|
||||
*/
|
||||
public static String toDBC (String input) {
|
||||
return toDBC(input, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 替换全角为半角
|
||||
*
|
||||
* @param text 文本
|
||||
* @param notConvertSet 不替换的字符集合
|
||||
*
|
||||
* @return 替换后的字符
|
||||
*/
|
||||
public static String toDBC (String text, Set<Character> notConvertSet) {
|
||||
char[] c = text.toCharArray();
|
||||
for (int i = 0 ; i < c.length ; i++) {
|
||||
if (null != notConvertSet && notConvertSet.contains(c[i])) {
|
||||
// 跳过不替换的字符
|
||||
continue;
|
||||
}
|
||||
|
||||
if (c[i] == '\u3000') {
|
||||
c[i] = ' ';
|
||||
} else if (c[i] > '\uFF00' && c[i] < '\uFF5F') {
|
||||
c[i] = (char) (c[i] - 65248);
|
||||
}
|
||||
}
|
||||
String returnString = new String(c);
|
||||
|
||||
return returnString;
|
||||
}
|
||||
|
||||
/**
|
||||
* 数字金额大写转换 先写个完整的然后将如零拾替换成零
|
||||
*
|
||||
* @param n 数字
|
||||
*
|
||||
* @return 中文大写数字
|
||||
*/
|
||||
public static String digitUppercase (double n) {
|
||||
String[] fraction = {"角", "分"};
|
||||
String[] digit = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
|
||||
String[][] unit = {{"元", "万", "亿"}, {"", "拾", "佰", "仟"}};
|
||||
|
||||
String head = n < 0 ? "负" : "";
|
||||
n = Math.abs(n);
|
||||
|
||||
String s = "";
|
||||
for (int i = 0 ; i < fraction.length ; i++) {
|
||||
s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", "");
|
||||
}
|
||||
if (s.length() < 1) {
|
||||
s = "整";
|
||||
}
|
||||
int integerPart = (int) Math.floor(n);
|
||||
|
||||
for (int i = 0 ; i < unit[0].length && integerPart > 0 ; i++) {
|
||||
String p = "";
|
||||
for (int j = 0 ; j < unit[1].length && n > 0 ; j++) {
|
||||
p = digit[integerPart % 10] + unit[1][j] + p;
|
||||
integerPart = integerPart / 10;
|
||||
}
|
||||
s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s;
|
||||
}
|
||||
return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
package com.mobai.utils;
|
||||
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.SecureRandom;
|
||||
|
||||
@Log4j2
|
||||
public class MD5Util {
|
||||
|
||||
private static final Integer SALT_LENGTH = 12;
|
||||
|
||||
/**
|
||||
* 将指定byte数组转换成16进制字符串
|
||||
* @param b 字节数组
|
||||
* @return 返回结果字符串
|
||||
*/
|
||||
public static String byteToHexString(byte[] b) {
|
||||
StringBuilder hexString = new StringBuilder();
|
||||
for (byte value : b) {
|
||||
String hex = Integer.toHexString(value & 0xFF);
|
||||
if (hex.length() == 1) {
|
||||
hex = '0' + hex;
|
||||
}
|
||||
hexString.append(hex.toUpperCase());
|
||||
}
|
||||
return hexString.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得加密后的口令
|
||||
* @param str 需要加密的字符串
|
||||
* @return 加密后的字符串
|
||||
*/
|
||||
public static String encrypted (String str) {
|
||||
try {
|
||||
// 声明加密后的口令数组变量
|
||||
byte[] pwd = null;
|
||||
// 随机数生成器
|
||||
SecureRandom random = new SecureRandom();
|
||||
// 声明盐数组变量
|
||||
byte[] salt = new byte[SALT_LENGTH];
|
||||
// 将随机数放入盐变量中
|
||||
random.nextBytes(salt);
|
||||
|
||||
// 声明消息摘要对象
|
||||
MessageDigest md = null;
|
||||
// 创建消息摘要
|
||||
md = MessageDigest.getInstance("MD5");
|
||||
// 将盐数据传入消息摘要对象
|
||||
md.update(salt);
|
||||
// 将口令的数据传给消息摘要对象
|
||||
md.update(str.getBytes(StandardCharsets.UTF_8));
|
||||
// 获得消息摘要的字节数组
|
||||
byte[] digest = md.digest();
|
||||
|
||||
// 因为要在口令的字节数组中存放盐,所以加上盐的字节长度
|
||||
pwd = new byte[digest.length + SALT_LENGTH];
|
||||
// 将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐
|
||||
System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);
|
||||
// 将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节
|
||||
System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);
|
||||
// 将字节数组格式加密后的口令转化为16进制字符串格式的口令
|
||||
return byteToHexString(pwd);
|
||||
}catch (Exception exception){
|
||||
log.info("md5加密失败:[{}]", str, exception);
|
||||
return str;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,314 @@
|
|||
package com.mobai.utils;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.lang.reflect.*;
|
||||
|
||||
/**
|
||||
* 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
public class ReflectUtils {
|
||||
private static final String SETTER_PREFIX = "set";
|
||||
|
||||
private static final String GETTER_PREFIX = "get";
|
||||
|
||||
private static final String CGLIB_CLASS_SEPARATOR = "$$";
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class);
|
||||
|
||||
/**
|
||||
* 调用Getter方法.
|
||||
* 支持多级,如:对象名.对象名.方法
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <E> E invokeGetter (Object obj, String propertyName) {
|
||||
Object object = obj;
|
||||
for (String name : StringUtils.split(propertyName, ".")) {
|
||||
String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name);
|
||||
object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{});
|
||||
}
|
||||
return (E) object;
|
||||
}
|
||||
|
||||
/**
|
||||
* 调用Setter方法, 仅匹配方法名。
|
||||
* 支持多级,如:对象名.对象名.方法
|
||||
*/
|
||||
public static <E> void invokeSetter (Object obj, String propertyName, E value) {
|
||||
Object object = obj;
|
||||
String[] names = StringUtils.split(propertyName, ".");
|
||||
for (int i = 0 ; i < names.length ; i++) {
|
||||
if (i < names.length - 1) {
|
||||
String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]);
|
||||
object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{});
|
||||
} else {
|
||||
String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]);
|
||||
invokeMethodByName(object, setterMethodName, new Object[]{value});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <E> E getFieldValue (final Object obj, final String fieldName) {
|
||||
Field field = getAccessibleField(obj, fieldName);
|
||||
if (field == null) {
|
||||
logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 ");
|
||||
return null;
|
||||
}
|
||||
E result = null;
|
||||
try {
|
||||
result = (E) field.get(obj);
|
||||
} catch (IllegalAccessException e) {
|
||||
logger.error("不可能抛出的异常{}", e.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数.
|
||||
*/
|
||||
public static <E> void setFieldValue (final Object obj, final String fieldName, final E value) {
|
||||
Field field = getAccessibleField(obj, fieldName);
|
||||
if (field == null) {
|
||||
// throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 ");
|
||||
logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 ");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
field.set(obj, value);
|
||||
} catch (IllegalAccessException e) {
|
||||
logger.error("不可能抛出的异常: {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 直接调用对象方法, 无视private/protected修饰符.
|
||||
* 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用.
|
||||
* 同时匹配方法名+参数类型,
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <E> E invokeMethod (final Object obj, final String methodName, final Class<?>[] parameterTypes,
|
||||
final Object[] args) {
|
||||
if (obj == null || methodName == null) {
|
||||
return null;
|
||||
}
|
||||
Method method = getAccessibleMethod(obj, methodName, parameterTypes);
|
||||
if (method == null) {
|
||||
logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 ");
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return (E) method.invoke(obj, args);
|
||||
} catch (Exception e) {
|
||||
String msg = "method: " + method + ", obj: " + obj + ", args: " + args + "";
|
||||
throw convertReflectionExceptionToUnchecked(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 直接调用对象方法, 无视private/protected修饰符,
|
||||
* 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用.
|
||||
* 只匹配函数名,如果有多个同名函数调用第一个。
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <E> E invokeMethodByName (final Object obj, final String methodName, final Object[] args) {
|
||||
Method method = getAccessibleMethodByName(obj, methodName, args.length);
|
||||
if (method == null) {
|
||||
// 如果为空不报错,直接返回空。
|
||||
logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 ");
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
// 类型转换(将参数数据类型转换为目标方法参数类型)
|
||||
Class<?>[] cs = method.getParameterTypes();
|
||||
for (int i = 0 ; i < cs.length ; i++) {
|
||||
if (args[i] != null && !args[i].getClass().equals(cs[i])) {
|
||||
if (cs[i] == String.class) {
|
||||
args[i] = Convert.toStr(args[i]);
|
||||
if (StringUtils.endsWith((String) args[i], ".0")) {
|
||||
args[i] = StringUtils.substringBefore((String) args[i], ".0");
|
||||
}
|
||||
} else if (cs[i] == Integer.class) {
|
||||
args[i] = Convert.toInt(args[i]);
|
||||
} else if (cs[i] == Long.class) {
|
||||
args[i] = Convert.toLong(args[i]);
|
||||
} else if (cs[i] == Double.class) {
|
||||
args[i] = Convert.toDouble(args[i]);
|
||||
} else if (cs[i] == Float.class) {
|
||||
args[i] = Convert.toFloat(args[i]);
|
||||
} else if (cs[i] == boolean.class || cs[i] == Boolean.class) {
|
||||
args[i] = Convert.toBool(args[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return (E) method.invoke(obj, args);
|
||||
} catch (Exception e) {
|
||||
String msg = "method: " + method + ", obj: " + obj + ", args: " + args + "";
|
||||
throw convertReflectionExceptionToUnchecked(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问.
|
||||
* 如向上转型到Object仍无法找到, 返回null.
|
||||
*/
|
||||
public static Field getAccessibleField (final Object obj, final String fieldName) {
|
||||
// 为空不报错。直接返回 null
|
||||
if (obj == null) {
|
||||
return null;
|
||||
}
|
||||
Validate.notBlank(fieldName, "fieldName can't be blank");
|
||||
for (Class<?> superClass = obj.getClass() ; superClass != Object.class ; superClass = superClass.getSuperclass()) {
|
||||
try {
|
||||
Field field = superClass.getDeclaredField(fieldName);
|
||||
makeAccessible(field);
|
||||
return field;
|
||||
} catch (NoSuchFieldException e) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
|
||||
* 如向上转型到Object仍无法找到, 返回null.
|
||||
* 匹配函数名+参数类型。
|
||||
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
|
||||
*/
|
||||
public static Method getAccessibleMethod (final Object obj, final String methodName,
|
||||
final Class<?>... parameterTypes) {
|
||||
// 为空不报错。直接返回 null
|
||||
if (obj == null) {
|
||||
return null;
|
||||
}
|
||||
Validate.notBlank(methodName, "methodName can't be blank");
|
||||
for (Class<?> searchType = obj.getClass() ; searchType != Object.class ; searchType = searchType.getSuperclass()) {
|
||||
try {
|
||||
Method method = searchType.getDeclaredMethod(methodName, parameterTypes);
|
||||
makeAccessible(method);
|
||||
return method;
|
||||
} catch (NoSuchMethodException e) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
|
||||
* 如向上转型到Object仍无法找到, 返回null.
|
||||
* 只匹配函数名。
|
||||
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
|
||||
*/
|
||||
public static Method getAccessibleMethodByName (final Object obj, final String methodName, int argsNum) {
|
||||
// 为空不报错。直接返回 null
|
||||
if (obj == null) {
|
||||
return null;
|
||||
}
|
||||
Validate.notBlank(methodName, "methodName can't be blank");
|
||||
for (Class<?> searchType = obj.getClass() ; searchType != Object.class ; searchType = searchType.getSuperclass()) {
|
||||
Method[] methods = searchType.getDeclaredMethods();
|
||||
for (Method method : methods) {
|
||||
if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) {
|
||||
makeAccessible(method);
|
||||
return method;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
|
||||
*/
|
||||
public static void makeAccessible (Method method) {
|
||||
if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers()))
|
||||
&& !method.isAccessible()) {
|
||||
method.setAccessible(true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
|
||||
*/
|
||||
public static void makeAccessible (Field field) {
|
||||
if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())
|
||||
|| Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) {
|
||||
field.setAccessible(true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处
|
||||
* 如无法找到, 返回Object.class.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> Class<T> getClassGenricType (final Class clazz) {
|
||||
return getClassGenricType(clazz, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过反射, 获得Class定义中声明的父类的泛型参数的类型.
|
||||
* 如无法找到, 返回Object.class.
|
||||
*/
|
||||
public static Class getClassGenricType (final Class clazz, final int index) {
|
||||
Type genType = clazz.getGenericSuperclass();
|
||||
|
||||
if (!(genType instanceof ParameterizedType)) {
|
||||
logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType");
|
||||
return Object.class;
|
||||
}
|
||||
|
||||
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
|
||||
|
||||
if (index >= params.length || index < 0) {
|
||||
logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
|
||||
+ params.length);
|
||||
return Object.class;
|
||||
}
|
||||
if (!(params[index] instanceof Class)) {
|
||||
logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
|
||||
return Object.class;
|
||||
}
|
||||
|
||||
return (Class) params[index];
|
||||
}
|
||||
|
||||
public static Class<?> getUserClass (Object instance) {
|
||||
if (instance == null) {
|
||||
throw new RuntimeException("Instance must not be null");
|
||||
}
|
||||
Class clazz = instance.getClass();
|
||||
if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) {
|
||||
Class<?> superClass = clazz.getSuperclass();
|
||||
if (superClass != null && !Object.class.equals(superClass)) {
|
||||
return superClass;
|
||||
}
|
||||
}
|
||||
return clazz;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 将反射时的checked exception转换为unchecked exception.
|
||||
*/
|
||||
public static RuntimeException convertReflectionExceptionToUnchecked (String msg, Exception e) {
|
||||
if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException
|
||||
|| e instanceof NoSuchMethodException) {
|
||||
return new IllegalArgumentException(msg, e);
|
||||
} else if (e instanceof InvocationTargetException) {
|
||||
return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException());
|
||||
}
|
||||
return new RuntimeException(msg, e);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
package com.mobai.utils;
|
||||
|
||||
import com.mobai.domain.model.PositionModel;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.Random;
|
||||
|
||||
public class VehicleUtils {
|
||||
|
||||
/**
|
||||
* 生成VIN
|
||||
* @return 返回结果对象
|
||||
*/
|
||||
public static String genVin() {
|
||||
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
Random random = new Random();
|
||||
StringBuilder sb = new StringBuilder(17);
|
||||
for (int i = 0; i < 17; i++) {
|
||||
int index = (int) (random.nextFloat() * characters.length());
|
||||
sb.append(characters.charAt(index));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static Random random = new Random();
|
||||
|
||||
/**
|
||||
* 生成电池额度
|
||||
* @return 电池额度
|
||||
*/
|
||||
public static BigDecimal genBattery(){
|
||||
return BigDecimal.valueOf(random.nextInt(60, 80) * 1000L);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 两点之间的距离
|
||||
* @param startPositionModel 开始定位点
|
||||
* @param endPositionModel 结束定位点
|
||||
* @return
|
||||
*/
|
||||
public static BigDecimal distance(PositionModel startPositionModel, PositionModel endPositionModel){
|
||||
double lon1 = Double.parseDouble(startPositionModel.getLongitude());
|
||||
double lat1 = Double.parseDouble(startPositionModel.getLatitude());
|
||||
double lon2 = Double.parseDouble(endPositionModel.getLongitude());
|
||||
double lat2 = Double.parseDouble(endPositionModel.getLatitude());
|
||||
double lon1Rad = Math.toRadians(lon1);
|
||||
double lat1Rad = Math.toRadians(lat1);
|
||||
double lon2Rad = Math.toRadians(lon2);
|
||||
double lat2Rad = Math.toRadians(lat2);
|
||||
double earthRadius = 6371; // 地球半径(以公里为单位)
|
||||
|
||||
double latDiff = lat2Rad - lat1Rad;
|
||||
double lonDiff = lon2Rad - lon1Rad;
|
||||
|
||||
double a = Math.sin(latDiff / 2) * Math.sin(latDiff / 2) +
|
||||
Math.cos(lat1Rad) * Math.cos(lat2Rad) *
|
||||
Math.sin(lonDiff / 2) * Math.sin(lonDiff / 2);
|
||||
|
||||
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
||||
|
||||
double distance = earthRadius * c;
|
||||
return BigDecimal.valueOf(distance).setScale(2, RoundingMode.HALF_UP);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成电池浮动
|
||||
* @return 电池浮动值
|
||||
*/
|
||||
public static BigDecimal batteryFloat(){
|
||||
Random rand = new Random();
|
||||
// 生成0.00-0.31之间的随机数
|
||||
double num = rand.nextDouble() * 0.31;
|
||||
// 加上0.90,得到0.90-1.21之间的随机数
|
||||
num += 0.90;
|
||||
// 保留两位小数
|
||||
num = (double) Math.round(num * 100) / 100;
|
||||
return BigDecimal.valueOf(num);
|
||||
}
|
||||
|
||||
/**
|
||||
* 给予开始和结束的值生成数据
|
||||
* @param start 起始范围
|
||||
* @param end 截止范围
|
||||
* @return 返回结果
|
||||
*/
|
||||
public static String genValue(int start, int end){
|
||||
Random rand = new Random();
|
||||
return String.valueOf(rand.nextInt(start, end));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
1、收集系统 - MQTT接受数据
|
||||
1.1上报kafka
|
||||
2、主流程
|
||||
2.1、消费者按照分区主动拉取车辆报文
|
||||
2.2、解析车辆报文,把报文信息转换为实体对象
|
||||
2.3、解析系统 - 业务拆分(拆解主、从流程)
|
||||
2.4、IOTDB搭建
|
||||
2.5、封装IOTDB插件
|
||||
2.6、解析系统:存储到IOTDB当中
|
||||
2.7、封装三级缓存插件、并保证数据一致性
|
||||
3、解析系统:执行从流程,规范与规则
|
||||
3.1、执行车辆实时数据 - 业务预留
|
||||
3.2、执行车辆故障报警 - 业务预留
|
||||
3.3、执行车辆电子围栏 - 业务预留
|
||||
4、车辆管理:
|
||||
4.1、车辆上线、下线
|
||||
4.2、车辆标签
|
||||
4.3、电子围栏
|
||||
4.4、电子围栏 - 新增
|
||||
4.5、电子围栏 - 回显/修改
|
||||
4.6、电子围栏 - 列表/查看
|
||||
4.7、电子围栏 - 删除
|
||||
4.8、车辆电子围栏预警业务
|
||||
4.9、车辆故障维护
|
||||
4.10、车辆故障解析
|
||||
4.11、搭建MQ消息系统
|
||||
4.12、车辆故障记录
|
||||
|
||||
|
||||
https://gitea.qinmian.online/Mobai/NetworkingCar.git
|
|
@ -0,0 +1,308 @@
|
|||
package com.mobai.vehicle;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.mobai.common.SystemConstant;
|
||||
import com.mobai.common.pool.ScheduledThreadPool;
|
||||
import com.mobai.domain.Vehicle;
|
||||
import com.mobai.domain.model.PositionModel;
|
||||
import com.mobai.utils.CalculateCheckDigit;
|
||||
import com.mobai.utils.ConversionUtil;
|
||||
import com.mobai.utils.VehicleUtils;
|
||||
import com.mobai.vehicle.model.VehicleData;
|
||||
import com.mobai.vehicle.model.properties.MqttProperties;
|
||||
import com.mobai.vehicle.thread.VehicleThread;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.eclipse.paho.client.mqttv3.MqttClient;
|
||||
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
|
||||
import org.eclipse.paho.client.mqttv3.MqttException;
|
||||
import org.eclipse.paho.client.mqttv3.MqttMessage;
|
||||
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
|
||||
import static com.mobai.common.SystemConstant.*;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 车辆实例
|
||||
* @date 2023/11/16
|
||||
*/
|
||||
@Data
|
||||
@Log4j2
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class VehicleInstance {
|
||||
|
||||
/**
|
||||
* 路线轨迹编码
|
||||
*/
|
||||
private String positionCode;
|
||||
|
||||
/**
|
||||
* 路径队列
|
||||
*/
|
||||
private LinkedBlockingQueue<PositionModel> positionQueue = new LinkedBlockingQueue<>();
|
||||
/**
|
||||
* 车辆
|
||||
*/
|
||||
private Vehicle vehicle;
|
||||
/**
|
||||
* 实例数据
|
||||
*/
|
||||
private VehicleData vehicleData;
|
||||
/**
|
||||
* 上一个定位点
|
||||
*/
|
||||
private PositionModel lastPosition;
|
||||
/**
|
||||
* 车辆工作线程
|
||||
*/
|
||||
private VehicleThread vehicleThread;
|
||||
/**
|
||||
* 消息状态
|
||||
*/
|
||||
private String msgCode;
|
||||
/**
|
||||
* 线程提交回调
|
||||
*/
|
||||
private ScheduledFuture<?> scheduledFuture;
|
||||
|
||||
/**
|
||||
* 链接上报
|
||||
*/
|
||||
private MqttClient client = null;
|
||||
|
||||
|
||||
/**
|
||||
* Mqtt配置
|
||||
*/
|
||||
private MqttProperties mqttProperties;
|
||||
|
||||
|
||||
/***
|
||||
* 获取当前车辆VIN
|
||||
* @return VIN
|
||||
*/
|
||||
public String getVin() {
|
||||
return this.vehicle.getVin();
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送消息
|
||||
* @param msg 消息
|
||||
*/
|
||||
public void sendMsg(String msg) {
|
||||
//得到16进制报文
|
||||
String sHex = ConversionUtil.strToSixteen(msg);
|
||||
//计算校验和
|
||||
String makeCheck = CalculateCheckDigit.makeCheck(sHex);
|
||||
msg = MSG_START + sHex + makeCheck + " " + MSG_END;
|
||||
// 创建消息并设置 QoS
|
||||
MqttMessage message = new MqttMessage(msg.getBytes());
|
||||
message.setQos(this.mqttProperties.getQos());
|
||||
// 发布消息
|
||||
try {
|
||||
client.publish(this.mqttProperties.getTopic(), message);
|
||||
} catch (MqttException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化客户端
|
||||
*/
|
||||
public void initClient () {
|
||||
try {
|
||||
client = new MqttClient(mqttProperties.getBroker(), mqttProperties.getClientId(), new MemoryPersistence());
|
||||
// 连接参数
|
||||
MqttConnectOptions options = new MqttConnectOptions();
|
||||
// 设置用户名和密码
|
||||
if (Objects.nonNull(mqttProperties.getUsername()) && Objects.nonNull(mqttProperties.getPassword())) {
|
||||
options.setUserName(mqttProperties.getUsername());
|
||||
options.setPassword(mqttProperties.getPassword().toCharArray());
|
||||
}
|
||||
|
||||
options.setConnectionTimeout(1);
|
||||
options.setKeepAliveInterval(20);
|
||||
// 连接
|
||||
client.connect(options);
|
||||
log.debug("车辆:[{}] 客户端初始化成功连接配置:{}", getVin(),
|
||||
JSONObject.toJSONString(this.mqttProperties));
|
||||
} catch (MqttException e) {
|
||||
log.error("车辆:[{}] 客户端初始化异常", getVin(), e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否连接在线
|
||||
* @return 在线返回true,不在线为false
|
||||
*/
|
||||
public boolean isOnline () {
|
||||
if (this.client == null){
|
||||
return false;
|
||||
}
|
||||
return this.client.isConnected();
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否建立车辆模拟线程
|
||||
* @return 建立返回true不建立返回false
|
||||
*/
|
||||
public boolean isSend(){
|
||||
return this.vehicleThread != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭连接
|
||||
*/
|
||||
public void closeClient(){
|
||||
if (this.client != null){
|
||||
try {
|
||||
// 断开连接
|
||||
this.client.disconnect();
|
||||
// 关闭连接
|
||||
this.client.close();
|
||||
log.debug("车辆:[{}] 客户端下线成功", getVin());
|
||||
} catch (MqttException e) {
|
||||
log.error("车辆:[{}] 客户端关闭异常:[{}]",getVin(), e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化车辆路线
|
||||
* @param positionModelList 路线集合
|
||||
*/
|
||||
public void settingPosition(List<PositionModel> positionModelList){
|
||||
positionQueue.clear();
|
||||
positionModelList.forEach(positionQueue::offer);
|
||||
log.info("车辆:{} 设置路径成功", this.getVin());
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化线程
|
||||
*/
|
||||
public void initVehicleThread() {
|
||||
if (this.positionCode == null){
|
||||
throw new RuntimeException("车辆["+getVin()+"]为选中路径");
|
||||
}
|
||||
VehicleThread vehicleThread = new VehicleThread();
|
||||
vehicleThread.setVehicleInstance(this);
|
||||
this.setVehicleThread(vehicleThread);
|
||||
ScheduledFuture<?> scheduledFuture = ScheduledThreadPool.submit(vehicleThread);
|
||||
this.setScheduledFuture(scheduledFuture);
|
||||
log.info("初始化车辆上报模拟线程开始:[{}]", this.getVin());
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始上报线程
|
||||
*/
|
||||
public void startSend() {
|
||||
this.msgCode = "上报";
|
||||
if (this.vehicleThread != null){
|
||||
this.vehicleThread.resume();
|
||||
}
|
||||
log.info("车辆[{}],开始上报", this.getVin());
|
||||
}
|
||||
|
||||
/**
|
||||
* 暂停上报线程
|
||||
*/
|
||||
public void pauseSend() {
|
||||
this.msgCode = "暂停";
|
||||
if (this.vehicleThread != null) {
|
||||
this.vehicleThread.pause();
|
||||
}
|
||||
log.info("车辆[{}],暂停上报", this.getVin());
|
||||
}
|
||||
|
||||
/**
|
||||
* 结束发送
|
||||
*/
|
||||
public void stopSend() {
|
||||
this.msgCode = "停止";
|
||||
if (this.vehicleThread != null){
|
||||
this.vehicleThread.stop();
|
||||
}
|
||||
log.info("车辆[{}],停止上报", this.getVin());
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消执行
|
||||
*/
|
||||
public void cancelExecution() {
|
||||
scheduledFuture.cancel(true);
|
||||
this.vehicleThread = null;
|
||||
this.scheduledFuture = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟车辆数据
|
||||
*/
|
||||
public String imitateData() {
|
||||
String gear = this.vehicleData.getGear();
|
||||
if (!"D".equals(gear)){
|
||||
log.info("车辆不是动车档位,不进行模拟数据");
|
||||
return null;
|
||||
}
|
||||
// 获取上一次定位点
|
||||
PositionModel lastPositionModel = this.lastPosition == null ? positionQueue.poll() : this.lastPosition;
|
||||
// 获取当前定位点
|
||||
PositionModel currentPositionModel = positionQueue.poll();
|
||||
if (currentPositionModel == null) {
|
||||
return "表示当前定位点已经跑完,需要其他操作";
|
||||
}
|
||||
// 两点之间的距离
|
||||
BigDecimal distance = VehicleUtils.distance(lastPositionModel, currentPositionModel);
|
||||
// 车辆总里程 相加
|
||||
vehicleData.setMileage(vehicleData.getMileage().add(distance));
|
||||
// 定位点填写
|
||||
vehicleData.setLongitude(currentPositionModel.getLongitude());
|
||||
vehicleData.setLatitude(currentPositionModel.getLatitude());
|
||||
// 当前电量减少
|
||||
// 电池浮动
|
||||
BigDecimal batteryFloat = VehicleUtils.batteryFloat();
|
||||
// 百公里占比
|
||||
BigDecimal hundredKMScale = distance.divide(SystemConstant.hundredKilometers).setScale(3, RoundingMode.HALF_UP);
|
||||
// 使用电量
|
||||
BigDecimal powerUsage = powerConsumption.multiply(hundredKMScale)
|
||||
.multiply(batteryFloat)
|
||||
.setScale(2, RoundingMode.HALF_UP);
|
||||
// 剩余电量
|
||||
vehicleData.setRemainingBattery(vehicleData.getRemainingBattery().subtract(powerUsage));
|
||||
// 百公里消耗量
|
||||
vehicleData.setFuelConsumptionRate(
|
||||
powerConsumption.multiply(batteryFloat).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_UP).toString()
|
||||
);
|
||||
// 计算总速度
|
||||
vehicleData.setSpeed(
|
||||
distance.divide(new BigDecimal(2))
|
||||
.multiply(new BigDecimal("3600"))
|
||||
.setScale(2, RoundingMode.HALF_UP).toString()
|
||||
);
|
||||
vehicleData.imitateBase();
|
||||
vehicleData.imitateMotor();
|
||||
vehicleData.imitateBatteryPack();
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 更改车辆档位
|
||||
* @param gear
|
||||
*/
|
||||
public void setGear (String gear) {
|
||||
this.vehicleData.setGear(gear);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package com.mobai.vehicle.api;
|
||||
|
||||
import com.dtflys.forest.annotation.BaseRequest;
|
||||
import com.dtflys.forest.annotation.JSONBody;
|
||||
import com.dtflys.forest.annotation.Post;
|
||||
import com.mobai.common.Result;
|
||||
import com.mobai.domain.model.MqttServerModel;
|
||||
import com.mobai.vehicle.api.req.VehicleConnectionReq;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 客户端的管理
|
||||
* @Date 2023-11-28 上午 10:20
|
||||
*/
|
||||
@BaseRequest(
|
||||
baseURL = "${adminHost}"
|
||||
)
|
||||
public interface ClientAdmin {
|
||||
|
||||
@Post("${adminTopicUri}")
|
||||
public Result<MqttServerModel> vehicleConnection(@JSONBody VehicleConnectionReq vehicleConnectionReq);
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
package com.mobai.vehicle.api.req;
|
||||
|
||||
import com.alibaba.fastjson.annotation.JSONField;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 车辆获取连接地址
|
||||
* @Date 2023-11-28 上午 10:32
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class VehicleConnectionReq {
|
||||
|
||||
/**
|
||||
* {
|
||||
* "vehicleVin": "VIN1234567894",
|
||||
* "timestamp": "11111",
|
||||
* "username": "你好",
|
||||
* "nonce": "33"
|
||||
* }
|
||||
*/
|
||||
|
||||
/**
|
||||
* vin
|
||||
*/
|
||||
@JSONField(name = "vehicleVin")
|
||||
private String vin;
|
||||
|
||||
/**
|
||||
* 时间戳
|
||||
*/
|
||||
private String timestamp;
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
@JSONField(name = "username")
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 随机字符串
|
||||
*/
|
||||
private String nonce;
|
||||
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
package com.mobai.vehicle.core;
|
||||
|
||||
import com.mobai.vehicle.VehicleInstance;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @description: 车辆容器
|
||||
* @Date 2023-11-16 下午 02:30
|
||||
*/
|
||||
public class LocalContainer {
|
||||
|
||||
/**
|
||||
* 车辆容器
|
||||
*/
|
||||
public static final Map<String, VehicleInstance> vehicleDataMap = new HashMap<>();
|
||||
|
||||
/**
|
||||
* 添加车辆
|
||||
* @param vehicleInstance 车辆信息
|
||||
*/
|
||||
public static void setVehicleInstance(List<VehicleInstance> vehicleInstance){
|
||||
vehicleInstance.forEach(LocalContainer::setVehicleInstance);
|
||||
}
|
||||
public static void setVehicleInstance(VehicleInstance vehicleInstance){
|
||||
String vin = vehicleInstance.getVehicle().getVin();
|
||||
if (!vehicleDataMap.containsKey(vin)) {
|
||||
vehicleDataMap.put(vin, vehicleInstance);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取车辆信息
|
||||
* @param vin vin
|
||||
* @return 车辆实例
|
||||
*/
|
||||
public static VehicleInstance getVehicleInstance(String vin){
|
||||
return vehicleDataMap.get(vin);
|
||||
}
|
||||
|
||||
/**
|
||||
* 车辆上线总数
|
||||
* @return
|
||||
*/
|
||||
public static long total () {
|
||||
return vehicleDataMap.size();
|
||||
}
|
||||
|
||||
public static Collection<VehicleInstance> getVehicleInstanceAll () {
|
||||
return vehicleDataMap.values();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取在线车辆
|
||||
* @return 在线车辆集合
|
||||
*/
|
||||
public static List<VehicleInstance> getOnlineVehicleInstance(){
|
||||
return vehicleDataMap.values().stream().filter(VehicleInstance::isOnline).toList();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取离线车辆
|
||||
* @return 离线车辆集合
|
||||
*/
|
||||
public static List<VehicleInstance> getOfflineVehicleInstance(){
|
||||
return vehicleDataMap.values().stream().filter(vehicleInstance -> !vehicleInstance.isOnline()).toList();
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过VIN删除
|
||||
* @param vin 车辆VIN
|
||||
*/
|
||||
public static void removeByVin(String vin) {
|
||||
vehicleDataMap.remove(vin);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
package com.mobai.vehicle.core;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.mobai.common.pool.FixedThreadPool;
|
||||
import com.mobai.common.pool.ScheduledThreadPool;
|
||||
import com.mobai.domain.Vehicle;
|
||||
import com.mobai.service.VehicleInstanceService;
|
||||
import com.mobai.service.VehicleService;
|
||||
import com.mobai.vehicle.VehicleInstance;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.boot.ApplicationArguments;
|
||||
import org.springframework.boot.ApplicationRunner;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import javax.annotation.PreDestroy;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description 配置
|
||||
* @date 2023/11/9
|
||||
*/
|
||||
@Log4j2
|
||||
@Configuration
|
||||
@AllArgsConstructor
|
||||
public class VehicleConfiguration implements ApplicationRunner {
|
||||
|
||||
private final VehicleService vehicleService;
|
||||
|
||||
private final VehicleInstanceService vehicleInstanceService;
|
||||
|
||||
/**
|
||||
* 初始化加载汽车数据到内存当中
|
||||
*/
|
||||
public void vehiclePageInit (){
|
||||
long startTime = System.currentTimeMillis();
|
||||
int page = 0, pageSize = 10;
|
||||
log.info("初始开始,批量从数据库当中加载数据到内存当中,每次[{}]条", pageSize);
|
||||
while (true){
|
||||
Page<Vehicle> vehiclePage = vehicleService.page(new Page<>(page++, pageSize));
|
||||
List<Vehicle> vehicleList = vehiclePage.getRecords();
|
||||
vehicleList.forEach(vehicleInstanceService::init);
|
||||
log.debug("第[{}]页,[{}]条", page, vehicleList.size());
|
||||
if (vehicleList.size() < pageSize){
|
||||
break;
|
||||
}
|
||||
}
|
||||
log.info("数据加载完成,耗时:{} MS", System.currentTimeMillis() - startTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run (ApplicationArguments args) {
|
||||
this.vehiclePageInit();
|
||||
// 提交给线程池 一分钟 执行一次
|
||||
// ThreadPool.submit(new Thread(vehicleService::syncDb), 30);
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭程序前操作
|
||||
*/
|
||||
@PreDestroy
|
||||
public void destroy(){
|
||||
|
||||
|
||||
log.info("数据库同步");
|
||||
vehicleService.syncDb();
|
||||
|
||||
log.info("下线所有车辆");
|
||||
List<VehicleInstance> onlineVehicleInstanceList = LocalContainer.getOnlineVehicleInstance();
|
||||
onlineVehicleInstanceList.forEach(VehicleInstance::closeClient);
|
||||
|
||||
log.info("关闭线程池");
|
||||
ScheduledThreadPool.shutdown();
|
||||
FixedThreadPool.shutDown();
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,520 @@
|
|||
package com.mobai.vehicle.model;
|
||||
|
||||
|
||||
import com.mobai.domain.Vehicle;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import static com.mobai.utils.VehicleUtils.genValue;
|
||||
|
||||
/**
|
||||
* @author 牧鱼
|
||||
* @Classname VehicleData
|
||||
* @Description 车辆模拟数据对象
|
||||
* @Date 2021/8/5
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class VehicleData {
|
||||
/**
|
||||
* VIN
|
||||
*/
|
||||
private String vin;
|
||||
/**
|
||||
* 行驶路线
|
||||
*/
|
||||
private String drivingRoute;
|
||||
|
||||
/**
|
||||
* 经度
|
||||
*/
|
||||
private String longitude;
|
||||
|
||||
/**
|
||||
* 维度
|
||||
*/
|
||||
private String latitude;
|
||||
|
||||
/**
|
||||
* 速度
|
||||
*/
|
||||
private String speed;
|
||||
|
||||
/**
|
||||
* 里程
|
||||
*/
|
||||
private BigDecimal mileage;
|
||||
|
||||
/**
|
||||
* 总电压
|
||||
*/
|
||||
private String voltage;
|
||||
|
||||
/**
|
||||
* 总电流
|
||||
*/
|
||||
private String current;
|
||||
|
||||
/**
|
||||
* 绝缘电阻
|
||||
*/
|
||||
private String resistance;
|
||||
|
||||
/**
|
||||
* 档位
|
||||
*/
|
||||
private String gear = "P";
|
||||
|
||||
/**
|
||||
* 加速踏板行程值
|
||||
*/
|
||||
private String accelerationPedal;
|
||||
|
||||
/**
|
||||
* 制动踏板行程值
|
||||
*/
|
||||
private String brakePedal;
|
||||
|
||||
/**
|
||||
* 燃料消耗率
|
||||
*/
|
||||
private String fuelConsumptionRate;
|
||||
|
||||
/**
|
||||
* 电机控制器温度
|
||||
*/
|
||||
private String motorControllerTemperature;
|
||||
|
||||
/**
|
||||
* 电机转速
|
||||
*/
|
||||
private String motorSpeed;
|
||||
|
||||
/**
|
||||
* 电机转矩
|
||||
*/
|
||||
private String motorTorque;
|
||||
|
||||
/**
|
||||
* 电机温度
|
||||
*/
|
||||
private String motorTemperature;
|
||||
|
||||
/**
|
||||
* 电机电压
|
||||
*/
|
||||
private String motorVoltage;
|
||||
|
||||
/**
|
||||
* 电机电流
|
||||
*/
|
||||
private String motorCurrent;
|
||||
|
||||
/**
|
||||
* 动力电池剩余电量SOC
|
||||
*/
|
||||
private BigDecimal remainingBattery;
|
||||
|
||||
/**
|
||||
* 电池总容量
|
||||
*/
|
||||
private BigDecimal batteryLevel;
|
||||
|
||||
/**
|
||||
* 当前状态允许的最大反馈功率
|
||||
*/
|
||||
private String maximumFeedbackPower;
|
||||
|
||||
/**
|
||||
* 当前状态允许最大放电功率
|
||||
*/
|
||||
private String maximumDischargePower;
|
||||
|
||||
/**
|
||||
* BMS自检计数器
|
||||
*/
|
||||
private String selfCheckCounter;
|
||||
|
||||
/**
|
||||
* 动力电池充放电电流
|
||||
*/
|
||||
private String totalBatteryCurrent;
|
||||
|
||||
/**
|
||||
* 动力电池负载端总电压V3
|
||||
*/
|
||||
private String totalBatteryVoltage;
|
||||
|
||||
/**
|
||||
* 单次最大电压
|
||||
*/
|
||||
private String singleBatteryMaxVoltage;
|
||||
|
||||
/**
|
||||
* 单体电池最低电压
|
||||
*/
|
||||
private String singleBatteryMinVoltage;
|
||||
|
||||
/**
|
||||
* 单体电池最高温度
|
||||
*/
|
||||
private String singleBatteryMaxTemperature;
|
||||
|
||||
/**
|
||||
* 单体电池最低温度
|
||||
*/
|
||||
private String singleBatteryMinTemperature;
|
||||
|
||||
/**
|
||||
* 动力电池可用容量
|
||||
*/
|
||||
private String availableBatteryCapacity;
|
||||
|
||||
/**
|
||||
* 车辆状态
|
||||
*/
|
||||
private int vehicleStatus = 1;
|
||||
|
||||
/**
|
||||
* 充电状态
|
||||
*/
|
||||
private int chargingStatus = 1;
|
||||
|
||||
/**
|
||||
* 运行状态
|
||||
*/
|
||||
private int operatingStatus = 1;
|
||||
|
||||
/**
|
||||
* SOC
|
||||
*/
|
||||
private int socStatus = 1;
|
||||
|
||||
/**
|
||||
* 可充电储能装置工作状态
|
||||
*/
|
||||
private int chargingEnergyStorageStatus = 1;
|
||||
|
||||
/**
|
||||
* 驱动电机状态
|
||||
*/
|
||||
private int driveMotorStatus = 1;
|
||||
|
||||
/**
|
||||
* 定位是否有效
|
||||
*/
|
||||
private int positionStatus = 1;
|
||||
|
||||
/**
|
||||
* EAS(汽车防盗系统)状态
|
||||
*/
|
||||
private int easStatus = 1;
|
||||
|
||||
/**
|
||||
* PTC(电动加热器)状态
|
||||
*/
|
||||
private int ptcStatus = 1;
|
||||
|
||||
/**
|
||||
* EPS(电动助力系统)状态
|
||||
*/
|
||||
private int epsStatus = 1;
|
||||
|
||||
/**
|
||||
* ABS(防抱死)状态
|
||||
*/
|
||||
private int absStatus = 1;
|
||||
|
||||
/**
|
||||
* MCU(电机/逆变器)状态
|
||||
*/
|
||||
private int mcuStatus = 1;
|
||||
|
||||
/**
|
||||
* 动力电池加热状态
|
||||
*/
|
||||
private int heatingStatus = 1;
|
||||
|
||||
/**
|
||||
* 动力电池当前状态
|
||||
*/
|
||||
private int batteryStatus = 1;
|
||||
|
||||
/**
|
||||
* 动力电池保温状态
|
||||
*/
|
||||
private int batteryInsulationStatus = 1;
|
||||
|
||||
/**
|
||||
* DCDC(电力交换系统)状态
|
||||
*/
|
||||
private int dcdcStatus = 1;
|
||||
|
||||
/**
|
||||
* CHG(充电机)状态
|
||||
*/
|
||||
private int chgStatus = 1;
|
||||
|
||||
/**
|
||||
* 车辆状态 报文
|
||||
*/
|
||||
private String vehicleStatusMsg;
|
||||
/**
|
||||
* 智能硬件 报文
|
||||
*/
|
||||
private String smartHardwareMsg;
|
||||
/**
|
||||
* 电池报文
|
||||
*/
|
||||
private String batteryMsg;
|
||||
|
||||
public String getMsg(){
|
||||
//第一位VIN
|
||||
return vin +
|
||||
// 当前时间戳
|
||||
System.currentTimeMillis() +
|
||||
//第二位经度 longitude latitude
|
||||
getValue(longitude, 11) +
|
||||
//第三位维度 longitude latitude
|
||||
getValue(latitude, 10) +
|
||||
//车速
|
||||
getValue(speed, 6) +
|
||||
//总里程
|
||||
getValue(mileage == null ? "" : mileage.toString(), 11) +
|
||||
// 总电压
|
||||
getValue(voltage, 6) +
|
||||
//总电流
|
||||
getValue(current, 5) +
|
||||
//绝缘电阻 79 - 87
|
||||
getValue(resistance, 9) +
|
||||
//档位
|
||||
(gear == null ? "D" : gear) +
|
||||
// 加速踏板行程值
|
||||
getValue(accelerationPedal, 2) +
|
||||
// 制动踏板行程值
|
||||
getValue(brakePedal, 2) +
|
||||
// 燃料消耗率
|
||||
getValue(fuelConsumptionRate, 5) +
|
||||
//电机控制器温度
|
||||
getValue(motorControllerTemperature, 6) +
|
||||
//电机转速
|
||||
getValue(motorSpeed, 5) +
|
||||
//点击转矩
|
||||
getValue(motorTorque, 4) +
|
||||
//电机温度
|
||||
getValue(motorTemperature, 6) +
|
||||
//电机电压
|
||||
getValue(motorVoltage, 5) +
|
||||
//电机电流
|
||||
getValue(motorCurrent, 8) +
|
||||
//动力电池剩余电量SOC
|
||||
getValue(remainingBattery == null ? "" : remainingBattery.toString(), 6) +
|
||||
//当前状态允许的最大反馈功率
|
||||
getValue(maximumFeedbackPower, 6) +
|
||||
//当前状态允许最大放电功率
|
||||
getValue(maximumDischargePower, 6) +
|
||||
//BMS自检计数器
|
||||
getValue(selfCheckCounter, 2) +
|
||||
//动力电池充放电电流
|
||||
getValue(totalBatteryCurrent, 5) +
|
||||
//动力电池负载端总电压V3
|
||||
getValue(totalBatteryVoltage, 6) +
|
||||
//单次最大电压
|
||||
getValue(singleBatteryMaxVoltage, 4) +
|
||||
//单体电池最低电压
|
||||
getValue(singleBatteryMinVoltage, 4) +
|
||||
//单体电池最高温度
|
||||
getValue(singleBatteryMaxTemperature, 6) +
|
||||
//单体电池最低温度
|
||||
getValue(singleBatteryMinTemperature, 6) +
|
||||
//动力电池可用容量
|
||||
getValue(availableBatteryCapacity, 6) +
|
||||
//车辆状态
|
||||
vehicleStatus +
|
||||
//充电状态
|
||||
chargingStatus +
|
||||
//运行状态
|
||||
operatingStatus +
|
||||
//SOC
|
||||
socStatus +
|
||||
//可充电储能装置工作状态
|
||||
chargingEnergyStorageStatus +
|
||||
//驱动电机状态
|
||||
driveMotorStatus +
|
||||
//定位是否有效
|
||||
positionStatus +
|
||||
//EAS
|
||||
easStatus +
|
||||
//PTC
|
||||
ptcStatus +
|
||||
//EPS
|
||||
epsStatus +
|
||||
//ABS
|
||||
absStatus +
|
||||
//MCU
|
||||
mcuStatus +
|
||||
//动力电池加热状态
|
||||
heatingStatus +
|
||||
//动力电池当前状态
|
||||
batteryStatus +
|
||||
//动力电池保温状态
|
||||
batteryInsulationStatus +
|
||||
//DCDC
|
||||
dcdcStatus +
|
||||
//CHG
|
||||
chgStatus;
|
||||
}
|
||||
|
||||
public String getValue(String val , int valLength){
|
||||
if(val == null){
|
||||
val = "";
|
||||
}
|
||||
int length = val.length();
|
||||
if (length > valLength){
|
||||
return val.substring( 0 , valLength);
|
||||
}
|
||||
val = val + "0".repeat(valLength - length);
|
||||
return val;
|
||||
}
|
||||
|
||||
/**
|
||||
* 汽车对象构造企业VIN
|
||||
* @param vehicle 汽车对象
|
||||
* @return 汽车数据对象
|
||||
*/
|
||||
public static VehicleData vehicleBuild (Vehicle vehicle) {
|
||||
return VehicleData.builder()
|
||||
.vin(vehicle.getVin())
|
||||
.gear("P")
|
||||
.remainingBattery(vehicle.getRemainingBattery())
|
||||
.batteryLevel(vehicle.getBatteryLevel())
|
||||
.mileage(vehicle.getTotalMileage())
|
||||
.vehicleStatus(1)
|
||||
.chargingStatus(1)
|
||||
.operatingStatus(1)
|
||||
.socStatus(1)
|
||||
.chargingEnergyStorageStatus(1)
|
||||
.driveMotorStatus(1)
|
||||
.positionStatus(1)
|
||||
.easStatus(1)
|
||||
.ptcStatus(1)
|
||||
.epsStatus(1)
|
||||
.absStatus(1)
|
||||
.mcuStatus(1)
|
||||
.heatingStatus(1)
|
||||
.batteryStatus(1)
|
||||
.batteryInsulationStatus(1)
|
||||
.dcdcStatus(1)
|
||||
.chgStatus(1)
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟基础项
|
||||
*/
|
||||
public void imitateBase(){
|
||||
// 总电压
|
||||
this.voltage = genValue(110, 750);
|
||||
// 总电流
|
||||
this.current = genValue(3, 50);
|
||||
// 绝缘电阻
|
||||
this.resistance = genValue(0,30000);
|
||||
// 加速踏板行程值
|
||||
this.accelerationPedal = genValue(0, 10);
|
||||
// 制动踏板行程值
|
||||
this.brakePedal = genValue(0, 10);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 模拟电机数据
|
||||
*/
|
||||
public void imitateMotor(){
|
||||
// 电机控制器温度
|
||||
this.motorControllerTemperature = genValue(0, 100);
|
||||
// 电机转速
|
||||
this.motorSpeed = genValue(0, 99999);
|
||||
// 电机转矩
|
||||
this.motorTorque = genValue(0, 1000);
|
||||
// 电机温度
|
||||
this.motorTemperature = genValue(0, 150);
|
||||
// 电机电压
|
||||
this.motorVoltage = genValue(110, 300);
|
||||
// 电机电流
|
||||
this.motorCurrent = genValue(0, 15000);
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟电池包数据
|
||||
*/
|
||||
public void imitateBatteryPack(){
|
||||
// 当前状态允许的最大反馈功率
|
||||
this.maximumFeedbackPower = genValue(0, 100);
|
||||
// 当前状态允许最大放电功率
|
||||
this.maximumDischargePower = genValue(0, 100);
|
||||
// BMS自检计数器
|
||||
this.selfCheckCounter = genValue(0, 15);
|
||||
// 动力电池充放电电流
|
||||
this.totalBatteryCurrent = genValue(0, 15);
|
||||
// 动力电池负载端总电压V3
|
||||
this.totalBatteryVoltage = genValue(220, 750);
|
||||
// 单体电池最高电压
|
||||
this.singleBatteryMaxVoltage = genValue(3, 5);
|
||||
// 单体电池最低电压
|
||||
this.singleBatteryMinVoltage = genValue(3, 5);
|
||||
// 单体电池最高温度
|
||||
this.singleBatteryMaxTemperature = genValue(0, 100);
|
||||
// 单体电池最低温度
|
||||
this.singleBatteryMinTemperature = genValue(0, 100);
|
||||
// 动力电池可用容量
|
||||
this.availableBatteryCapacity = genValue(0,100 );
|
||||
}
|
||||
/**
|
||||
车辆状态
|
||||
vehicleStatus;
|
||||
充电状态
|
||||
chargingStatus;
|
||||
运行状态
|
||||
operatingStatus;
|
||||
SOC
|
||||
socStatus;
|
||||
可充电储能装置工作状态
|
||||
chargingEnergyStorageStatus;
|
||||
驱动电机状态
|
||||
driveMotorStatus;
|
||||
定位是否有效
|
||||
positionStatus;
|
||||
*/
|
||||
|
||||
/**
|
||||
EAS(汽车防盗系统)状态
|
||||
easStatus;
|
||||
PTC(电动加热器)状态
|
||||
ptcStatus;
|
||||
EPS(电动助力系统)状态
|
||||
epsStatus;
|
||||
ABS(防抱死)状态
|
||||
absStatus;
|
||||
MCU(电机/逆变器)状态
|
||||
mcuStatus;
|
||||
*/
|
||||
|
||||
/**
|
||||
动力电池加热状态
|
||||
heatingStatus;
|
||||
动力电池当前状态
|
||||
batteryStatus;
|
||||
动力电池保温状态
|
||||
batteryInsulationStatus;
|
||||
DCDC(电力交换系统)状态
|
||||
dcdcStatus;
|
||||
CHG(充电机)状态
|
||||
chgStatus;
|
||||
*/
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
package com.mobai.vehicle.model.properties;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author Saisai.Liu
|
||||
* @version 1.0
|
||||
* @description Mqtt配置类
|
||||
* @date 2023/11/8
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MqttProperties {
|
||||
|
||||
/**
|
||||
* 节点
|
||||
*/
|
||||
private String broker;
|
||||
|
||||
/**
|
||||
* 主题
|
||||
*/
|
||||
private String topic;
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
private String username;
|
||||
|
||||
/**
|
||||
* 密码
|
||||
*/
|
||||
private String password;
|
||||
|
||||
/**
|
||||
* 节点ID
|
||||
*/
|
||||
private String clientId;
|
||||
private int qos = 0;
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
package com.mobai.vehicle.thread;
|
||||
|
||||
import com.mobai.vehicle.VehicleInstance;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
|
||||
@Log4j2
|
||||
public class VehicleThread implements Runnable {
|
||||
|
||||
/**
|
||||
* 是否停止线程
|
||||
*/
|
||||
private volatile boolean isStop = false;
|
||||
|
||||
/**
|
||||
* 设置是否暂停
|
||||
*/
|
||||
private volatile boolean isPaused;
|
||||
|
||||
/**
|
||||
* 车辆实例对象
|
||||
*/
|
||||
private VehicleInstance vehicleInstance;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
if (!isStop){
|
||||
if (!isPaused){
|
||||
log.info("{} - 上报数据", this.vehicleInstance.getVin());
|
||||
String imitateResult = this.vehicleInstance.imitateData();
|
||||
if (imitateResult == null){
|
||||
this.vehicleInstance.sendMsg(
|
||||
this.vehicleInstance.getVehicleData().getMsg()
|
||||
);
|
||||
}else {
|
||||
log.warn("车辆[{}]数据模拟:{}", this.vehicleInstance.getVin(), imitateResult);
|
||||
}
|
||||
}else {
|
||||
log.info("暂停模拟和上报:[{}]", this.vehicleInstance.getVin());
|
||||
}
|
||||
}else {
|
||||
log.info("终止模拟和上报:[{}]", this.vehicleInstance.getVin());
|
||||
vehicleInstance.cancelExecution();
|
||||
}
|
||||
}catch (Throwable throwable){
|
||||
log.error("车辆模拟输出错误:{}", this.vehicleInstance.getVin(), throwable);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 暂停线程
|
||||
*/
|
||||
public void pause() {
|
||||
isPaused = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始线程
|
||||
*/
|
||||
public void resume() {
|
||||
isPaused = false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 停止方法
|
||||
*/
|
||||
public void stop(){
|
||||
this.isStop = true;
|
||||
}
|
||||
|
||||
public void setVehicleInstance(VehicleInstance vehicleInstance) {
|
||||
this.vehicleInstance = vehicleInstance;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
server:
|
||||
port: 81
|
||||
spring:
|
||||
mvc:
|
||||
static-path-pattern: /static/**
|
||||
|
||||
datasource:
|
||||
username: muyu
|
||||
password: 123456
|
||||
# 如果需要数据本地化,则改成 file 方式
|
||||
# jdbc:h2:mem:testDB;DB_CLOSE_DELAY=-1
|
||||
url: jdbc:h2:file:~/vehicle/db;AUTO_SERVER=TRUE;DB_CLOSE_DELAY=-1
|
||||
driver-class-name: org.h2.Driver
|
||||
h2:
|
||||
# 开启这个配置就可以通过 web 页面访问了,例如:http://localhost:8080/springboot-h2/h2-console
|
||||
console:
|
||||
enabled: true
|
||||
settings:
|
||||
# 开启h2 console 跟踪 方便调试 默认 false
|
||||
trace: true
|
||||
# 允许console 远程访问 默认false
|
||||
web-allow-others: true
|
||||
# h2 访问路径上下文
|
||||
path: /h2-console
|
||||
sql:
|
||||
init:
|
||||
schema-locations: classpath:schema.sql
|
||||
data-locations: classpath:data.sql
|
||||
mode: always
|
||||
continue-on-error: true
|
||||
|
||||
|
||||
# mybatis-plus 配置
|
||||
mybatis-plus:
|
||||
mapper-locations: classpath*:/com.mobai.mapper/**/*.xml
|
||||
#实体扫描,多个package用逗号或者分号分隔
|
||||
typeAliasesPackage: com.dmo.entity
|
||||
global-config:
|
||||
#数据库相关配置
|
||||
db-config:
|
||||
#主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
|
||||
id-type: AUTO
|
||||
#字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"
|
||||
field-strategy: NOT_NULL
|
||||
#驼峰下划线转换
|
||||
column-underline: true
|
||||
logic-delete-value: -1
|
||||
logic-not-delete-value: 0
|
||||
#原生配置
|
||||
configuration:
|
||||
# 打印sql
|
||||
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||
map-underscore-to-camel-case: true
|
||||
cache-enabled: false
|
||||
call-setters-on-nulls: true
|
||||
jdbc-type-for-null: 'null'
|
||||
|
||||
# 日志输出配置
|
||||
logging:
|
||||
level:
|
||||
com.mobai: DEBUG
|
||||
com.mobai.service: DEBUG
|
||||
com.mobai.mapper: DEBUG
|
||||
com.mobai.vehicle: DEBUG
|
||||
root: INFO
|
||||
org:
|
||||
springframework:
|
||||
security: WARN
|
||||
web: ERROR
|
||||
file:
|
||||
path: ./logs
|
||||
name: './logs/vehicle.log'
|
||||
pattern:
|
||||
file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n'
|
||||
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n'
|
||||
# http调用框架
|
||||
forest:
|
||||
max-connections: 1000 # 连接池最大连接数
|
||||
connect-timeout: 3000 # 连接超时时间,单位为毫秒
|
||||
read-timeout: 3000 # 数据读取超时时间,单位为毫秒
|
||||
variables:
|
||||
adminHost: ${mqtt.admin.host}
|
||||
adminTopicUri: ${mqtt.admin.topic-uri}
|
||||
log-enabled: false
|
||||
|
||||
# 服务器配置
|
||||
mqtt:
|
||||
server:
|
||||
host: tcp://39.98.45.160:1883
|
||||
topic: test1
|
||||
admin:
|
||||
host: http://127.0.0.1:${server.port}
|
||||
topic-uri: /verify/vehicleConnection
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,14 @@
|
|||
create table if not exists vehicle (
|
||||
`vin` char (17) primary key not null,
|
||||
`remaining_battery` DOUBLE not null,
|
||||
`total_mileage` DOUBLE not null,
|
||||
`battery_level` DOUBLE not null,
|
||||
`create_time` datetime not null
|
||||
) ;
|
||||
|
||||
create table if not exists route_info (
|
||||
`id` int primary key not null ,
|
||||
`name` char (3) not null,
|
||||
`data` CLOB not null,
|
||||
`create_time` datetime not null
|
||||
) ;
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
.wscn-http404-container[data-v-c095f994]{-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);position:absolute;top:40%;left:50%}.wscn-http404[data-v-c095f994]{position:relative;width:1200px;padding:0 50px;overflow:hidden}.wscn-http404 .pic-404[data-v-c095f994]{position:relative;float:left;width:600px;overflow:hidden}.wscn-http404 .pic-404__parent[data-v-c095f994]{width:100%}.wscn-http404 .pic-404__child[data-v-c095f994]{position:absolute}.wscn-http404 .pic-404__child.left[data-v-c095f994]{width:80px;top:17px;left:220px;opacity:0;-webkit-animation-name:cloudLeft-data-v-c095f994;animation-name:cloudLeft-data-v-c095f994;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}.wscn-http404 .pic-404__child.mid[data-v-c095f994]{width:46px;top:10px;left:420px;opacity:0;-webkit-animation-name:cloudMid-data-v-c095f994;animation-name:cloudMid-data-v-c095f994;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1.2s;animation-delay:1.2s}.wscn-http404 .pic-404__child.right[data-v-c095f994]{width:62px;top:100px;left:500px;opacity:0;-webkit-animation-name:cloudRight-data-v-c095f994;animation-name:cloudRight-data-v-c095f994;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}@-webkit-keyframes cloudLeft-data-v-c095f994{0%{top:17px;left:220px;opacity:0}20%{top:33px;left:188px;opacity:1}80%{top:81px;left:92px;opacity:1}to{top:97px;left:60px;opacity:0}}@keyframes cloudLeft-data-v-c095f994{0%{top:17px;left:220px;opacity:0}20%{top:33px;left:188px;opacity:1}80%{top:81px;left:92px;opacity:1}to{top:97px;left:60px;opacity:0}}@-webkit-keyframes cloudMid-data-v-c095f994{0%{top:10px;left:420px;opacity:0}20%{top:40px;left:360px;opacity:1}70%{top:130px;left:180px;opacity:1}to{top:160px;left:120px;opacity:0}}@keyframes cloudMid-data-v-c095f994{0%{top:10px;left:420px;opacity:0}20%{top:40px;left:360px;opacity:1}70%{top:130px;left:180px;opacity:1}to{top:160px;left:120px;opacity:0}}@-webkit-keyframes cloudRight-data-v-c095f994{0%{top:100px;left:500px;opacity:0}20%{top:120px;left:460px;opacity:1}80%{top:180px;left:340px;opacity:1}to{top:200px;left:300px;opacity:0}}@keyframes cloudRight-data-v-c095f994{0%{top:100px;left:500px;opacity:0}20%{top:120px;left:460px;opacity:1}80%{top:180px;left:340px;opacity:1}to{top:200px;left:300px;opacity:0}}.wscn-http404 .bullshit[data-v-c095f994]{position:relative;float:left;width:300px;padding:30px 0;overflow:hidden}.wscn-http404 .bullshit__oops[data-v-c095f994]{font-size:32px;line-height:40px;color:#1482f0;margin-bottom:20px;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__headline[data-v-c095f994],.wscn-http404 .bullshit__oops[data-v-c095f994]{font-weight:700;opacity:0;-webkit-animation-name:slideUp-data-v-c095f994;animation-name:slideUp-data-v-c095f994;-webkit-animation-duration:.5s;animation-duration:.5s}.wscn-http404 .bullshit__headline[data-v-c095f994]{font-size:20px;line-height:24px;color:#222;margin-bottom:10px;-webkit-animation-delay:.1s;animation-delay:.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__info[data-v-c095f994]{font-size:13px;line-height:21px;color:grey;margin-bottom:30px;-webkit-animation-delay:.2s;animation-delay:.2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__info[data-v-c095f994],.wscn-http404 .bullshit__return-home[data-v-c095f994]{opacity:0;-webkit-animation-name:slideUp-data-v-c095f994;animation-name:slideUp-data-v-c095f994;-webkit-animation-duration:.5s;animation-duration:.5s}.wscn-http404 .bullshit__return-home[data-v-c095f994]{display:block;float:left;width:110px;height:36px;background:#1482f0;border-radius:100px;text-align:center;color:#fff;font-size:14px;line-height:36px;cursor:pointer;-webkit-animation-delay:.3s;animation-delay:.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes slideUp-data-v-c095f994{0%{-webkit-transform:translateY(60px);transform:translateY(60px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes slideUp-data-v-c095f994{0%{-webkit-transform:translateY(60px);transform:translateY(60px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}
|
|
@ -0,0 +1 @@
|
|||
@supports(-webkit-mask:none) and (not (cater-color:#fff)){.login-container .el-input input{color:#fff}}.login-container .el-input{display:inline-block;height:47px;width:85%}.login-container .el-input input{background:transparent;border:0;-webkit-appearance:none;border-radius:0;padding:12px 5px 12px 15px;color:#fff;height:47px;caret-color:#fff}.login-container .el-input input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #283443 inset!important;box-shadow:inset 0 0 0 1000px #283443!important;-webkit-text-fill-color:#fff!important}.login-container .el-form-item{border:1px solid hsla(0,0%,100%,.1);background:rgba(0,0,0,.1);border-radius:5px;color:#454545}.login-container[data-v-5d9ae9a2]{min-height:100%;width:100%;background-color:#2d3a4b;overflow:hidden}.login-container .login-form[data-v-5d9ae9a2]{position:relative;width:520px;max-width:100%;padding:160px 35px 0;margin:0 auto;overflow:hidden}.login-container .tips[data-v-5d9ae9a2]{font-size:14px;color:#fff;margin-bottom:10px}.login-container .tips span[data-v-5d9ae9a2]:first-of-type{margin-right:16px}.login-container .svg-container[data-v-5d9ae9a2]{padding:6px 5px 6px 15px;color:#889aa4;vertical-align:middle;width:30px;display:inline-block}.login-container .title-container[data-v-5d9ae9a2]{position:relative}.login-container .title-container .title[data-v-5d9ae9a2]{font-size:26px;color:#eee;margin:0 auto 40px auto;text-align:center;font-weight:700}.login-container .show-pwd[data-v-5d9ae9a2]{position:absolute;right:10px;top:7px;font-size:16px;color:#889aa4;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
|
|
@ -0,0 +1 @@
|
|||
.dashboard-container[data-v-3e145b52]{margin:30px}.dashboard-text[data-v-3e145b52]{font-size:30px;line-height:46px}
|
|
@ -0,0 +1 @@
|
|||
.app-container[data-v-3ebe39a8]{padding:10px 5px 0 10px;background-color:#f4f4f5}.el-row[data-v-3ebe39a8]{&:last-child{margin-bottom:0}}.bg-purple[data-v-3ebe39a8]{background:#f4f4f5}.grid-content[data-v-3ebe39a8]{border-radius:4px;overflow-x:hidden;overflow-y:auto}.grid-content[data-v-3ebe39a8]::-webkit-scrollbar{width:4px}.grid-content[data-v-3ebe39a8]::-webkit-scrollbar-thumb{border-radius:10px;background:rgba(0,0,0,.2)}.grid-content[data-v-3ebe39a8]::-webkit-scrollbar-track{border-radius:0;background:rgba(0,0,0,.1)}.vehicleDiv[data-v-3ebe39a8]{height:50px;margin:0 0 10px 0}.contentMain[data-v-3ebe39a8]{margin-top:10px}.vehicleDataTab[data-v-3ebe39a8]{width:100%;overflow-y:auto;overflow-x:hidden}.vehicleDataTab[data-v-3ebe39a8]::-webkit-scrollbar{width:4px}.vehicleDataTab[data-v-3ebe39a8]::-webkit-scrollbar-thumb{border-radius:10px;background:rgba(0,0,0,.2)}.vehicleDataTab[data-v-3ebe39a8]::-webkit-scrollbar-track{border-radius:0;background:rgba(0,0,0,.1)}.el-form-item__label[data-v-3ebe39a8]{padding:0}.el-form-item[data-v-3ebe39a8]{margin-bottom:5px}
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;-webkit-box-shadow:0 0 10px #29d,0 0 5px #29d;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translateY(-4px);transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;-webkit-box-sizing:border-box;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}
|
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 96 KiB |
Binary file not shown.
After Width: | Height: | Size: 4.7 KiB |
|
@ -0,0 +1 @@
|
|||
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><link rel=icon href=/favicon.ico><title>车辆</title><link href=/static/css/app.949a0224.css rel=preload as=style><link href=/static/css/chunk-elementUI.c1c3b808.css rel=preload as=style><link href=/static/css/chunk-libs.3dfb7769.css rel=preload as=style><link href=/static/js/app.967d9126.js rel=preload as=script><link href=/static/js/chunk-elementUI.2491fb2f.js rel=preload as=script><link href=/static/js/chunk-libs.2ec7c235.js rel=preload as=script><link href=/static/css/chunk-elementUI.c1c3b808.css rel=stylesheet><link href=/static/css/chunk-libs.3dfb7769.css rel=stylesheet><link href=/static/css/app.949a0224.css rel=stylesheet></head><body><noscript><strong>We're sorry but 车辆 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script>(function(e){function t(t){for(var n,o,c=t[0],i=t[1],l=t[2],f=0,d=[];f<c.length;f++)o=c[f],Object.prototype.hasOwnProperty.call(a,o)&&a[o]&&d.push(a[o][0]),a[o]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);s&&s(t);while(d.length)d.shift()();return u.push.apply(u,l||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,o=1;o<r.length;o++){var c=r[o];0!==a[c]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={runtime:0},a={runtime:0},u=[];function c(e){return i.p+"static/js/"+({}[e]||e)+"."+{"chunk-019c66da":"ded8571e","chunk-cefe5306":"756dde8f","chunk-22cea610":"a50359dd","chunk-510f32e7":"18a692c7","chunk-630a64ed":"8295bd3f"}[e]+".js"}function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.e=function(e){var t=[],r={"chunk-cefe5306":1,"chunk-22cea610":1,"chunk-510f32e7":1,"chunk-630a64ed":1};o[e]?t.push(o[e]):0!==o[e]&&r[e]&&t.push(o[e]=new Promise((function(t,r){for(var n="static/css/"+({}[e]||e)+"."+{"chunk-019c66da":"31d6cfe0","chunk-cefe5306":"0a41cd80","chunk-22cea610":"3c7f5ad9","chunk-510f32e7":"1510e3c5","chunk-630a64ed":"9a9361c6"}[e]+".css",a=i.p+n,u=document.getElementsByTagName("link"),c=0;c<u.length;c++){var l=u[c],f=l.getAttribute("data-href")||l.getAttribute("href");if("stylesheet"===l.rel&&(f===n||f===a))return t()}var d=document.getElementsByTagName("style");for(c=0;c<d.length;c++){l=d[c],f=l.getAttribute("data-href");if(f===n||f===a)return t()}var s=document.createElement("link");s.rel="stylesheet",s.type="text/css",s.onload=t,s.onerror=function(t){var n=t&&t.target&&t.target.src||a,u=new Error("Loading CSS chunk "+e+" failed.\n("+n+")");u.code="CSS_CHUNK_LOAD_FAILED",u.request=n,delete o[e],s.parentNode.removeChild(s),r(u)},s.href=a;var h=document.getElementsByTagName("head")[0];h.appendChild(s)})).then((function(){o[e]=0})));var n=a[e];if(0!==n)if(n)t.push(n[2]);else{var u=new Promise((function(t,r){n=a[e]=[t,r]}));t.push(n[2]=u);var l,f=document.createElement("script");f.charset="utf-8",f.timeout=120,i.nc&&f.setAttribute("nonce",i.nc),f.src=c(e);var d=new Error;l=function(t){f.onerror=f.onload=null,clearTimeout(s);var r=a[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;d.message="Loading chunk "+e+" failed.\n("+n+": "+o+")",d.name="ChunkLoadError",d.type=n,d.request=o,r[1](d)}a[e]=void 0}};var s=setTimeout((function(){l({type:"timeout",target:f})}),12e4);f.onerror=f.onload=l,document.head.appendChild(f)}return Promise.all(t)},i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var l=window["webpackJsonp"]=window["webpackJsonp"]||[],f=l.push.bind(l);l.push=t,l=l.slice();for(var d=0;d<l.length;d++)t(l[d]);var s=f;r()})([]);</script><script src=/static/js/chunk-elementUI.2491fb2f.js></script><script src=/static/js/chunk-libs.2ec7c235.js></script><script src=/static/js/app.967d9126.js></script></body></html>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-22cea610"],{"26fc":function(t,s,a){t.exports=a.p+"static/img/404_cloud.0f4bc32b.png"},"8cdb":function(t,s,a){"use strict";a.r(s);var e=function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"wscn-http404-container"},[a("div",{staticClass:"wscn-http404"},[t._m(0),a("div",{staticClass:"bullshit"},[a("div",{staticClass:"bullshit__oops"},[t._v("OOPS!")]),t._m(1),a("div",{staticClass:"bullshit__headline"},[t._v(t._s(t.message))]),a("div",{staticClass:"bullshit__info"},[t._v("Please check that the URL you entered is correct, or click the button below to return to the homepage.")]),a("a",{staticClass:"bullshit__return-home",attrs:{href:""}},[t._v("Back to home")])])])])},c=[function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"pic-404"},[e("img",{staticClass:"pic-404__parent",attrs:{src:a("a36b"),alt:"404"}}),e("img",{staticClass:"pic-404__child left",attrs:{src:a("26fc"),alt:"404"}}),e("img",{staticClass:"pic-404__child mid",attrs:{src:a("26fc"),alt:"404"}}),e("img",{staticClass:"pic-404__child right",attrs:{src:a("26fc"),alt:"404"}})])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"bullshit__info"},[t._v("All rights reserved "),a("a",{staticStyle:{color:"#20a0ff"},attrs:{href:"https://wallstreetcn.com",target:"_blank"}},[t._v("wallstreetcn")])])}],i={name:"Page404",computed:{message:function(){return"The webmaster said that you can not enter this page..."}}},l=i,n=(a("dd53"),a("2877")),r=Object(n["a"])(l,e,c,!1,null,"c095f994",null);s["default"]=r.exports},a36b:function(t,s,a){t.exports=a.p+"static/img/404.a57b6f31.png"},b0a8:function(t,s,a){},dd53:function(t,s,a){"use strict";a("b0a8")}}]);
|
|
@ -0,0 +1 @@
|
|||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-510f32e7"],{3985:function(e,t,n){},"92f2":function(e,t,n){},"9ed6":function(e,t,n){"use strict";n.r(t);var r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"login-container"},[n("el-form",{ref:"loginForm",staticClass:"login-form",attrs:{model:e.loginForm,rules:e.loginRules,"auto-complete":"on","label-position":"left"}},[n("div",{staticClass:"title-container"},[n("h3",{staticClass:"title"},[e._v("车辆模拟")])]),n("el-form-item",{attrs:{prop:"username"}},[n("span",{staticClass:"svg-container"},[n("svg-icon",{attrs:{"icon-class":"user"}})],1),n("el-input",{ref:"username",attrs:{placeholder:"Username",name:"username",type:"text",tabindex:"1","auto-complete":"on",readonly:""},model:{value:e.loginForm.username,callback:function(t){e.$set(e.loginForm,"username",t)},expression:"loginForm.username"}})],1),n("el-form-item",{attrs:{prop:"password"}},[n("span",{staticClass:"svg-container"},[n("svg-icon",{attrs:{"icon-class":"password"}})],1),n("el-input",{ref:"password",attrs:{type:"text",placeholder:"Password",name:"password",tabindex:"2","auto-complete":"on"},nativeOn:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.handleLogin(t)}},model:{value:e.loginForm.password,callback:function(t){e.$set(e.loginForm,"password",t)},expression:"loginForm.password"}})],1),n("el-button",{staticStyle:{width:"100%","margin-bottom":"30px"},attrs:{loading:e.loading,type:"primary"},nativeOn:{click:function(t){return t.preventDefault(),e.handleLogin(t)}}},[e._v("进入")])],1)],1)},o=[],s={name:"Login",data:function(){return{loginForm:{username:"你永远是最棒的",password:"加油,一切都是值得的"},loginRules:{username:[{required:!0,trigger:"blur"}],password:[{required:!0,trigger:"blur"}]},loading:!1,passwordType:"password",redirect:void 0}},watch:{$route:{handler:function(e){this.redirect=e.query&&e.query.redirect},immediate:!0}},methods:{handleLogin:function(){var e=this;this.$refs.loginForm.validate((function(t){if(!t)return console.log("error submit!!"),!1;e.loading=!0,e.$store.dispatch("user/login",e.loginForm).then((function(){e.$router.push({path:e.redirect||"/"}),e.loading=!1})).catch((function(){e.loading=!1})),e.$router.push({path:e.redirect||"/"})}))}}},a=s,i=(n("d1bd"),n("f8c5"),n("2877")),l=Object(i["a"])(a,r,o,!1,null,"5d9ae9a2",null);t["default"]=l.exports},d1bd:function(e,t,n){"use strict";n("92f2")},f8c5:function(e,t,n){"use strict";n("3985")}}]);
|
|
@ -0,0 +1 @@
|
|||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-630a64ed"],{"30fb":function(t,a,e){"use strict";e("7148")},7148:function(t,a,e){},9406:function(t,a,e){"use strict";e.r(a);var n=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"dashboard-container"},[e("div",{staticClass:"dashboard-text"},[t._v("name: "+t._s(t.name))])])},s=[],c=e("5530"),i=e("2f62"),o={name:"Dashboard",computed:Object(c["a"])({},Object(i["b"])(["name"]))},r=o,u=(e("30fb"),e("2877")),b=Object(u["a"])(r,n,s,!1,null,"3e145b52",null);a["default"]=b.exports}}]);
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue