From c57d9580edb59fd9bbe40b15fc85ade881eb2928 Mon Sep 17 00:00:00 2001 From: "PC-20200604TTHR\\Administrator" <349091389@qq.com> Date: Thu, 28 Mar 2024 09:31:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/pom.xml | 55 + .../main/java/com/mh/common/dto/RespDTO.java | 26 + .../mh/common/exception/BaseErrorInfo.java | 9 + .../com/mh/common/exception/CommonNum.java | 50 + .../mh/common/exception/GlobalException.java | 52 + .../exception/ServiceRuntimeException.java | 64 + .../java/com/mh/common/http/HttpResult.java | 96 ++ .../java/com/mh/common/http/HttpStatus.java | 149 ++ .../java/com/mh/common/page/ColumnFilter.java | 32 + .../com/mh/common/page/MybatisPageHelper.java | 63 + .../java/com/mh/common/page/PageRequest.java | 46 + .../java/com/mh/common/page/PageResult.java | 61 + .../com/mh/common/service/CurdService.java | 50 + .../com/mh/common/utils/DateTimeUtils.java | 32 + .../java/com/mh/common/utils/FileUtils.java | 42 + .../java/com/mh/common/utils/IOUtils.java | 26 + .../java/com/mh/common/utils/PoiUtils.java | 41 + .../com/mh/common/utils/ReflectionUtils.java | 78 + .../java/com/mh/common/utils/StringUtils.java | 19 + pom.xml | 74 + user-service/HELP.md | 33 + user-service/lib/.idea/lib.iml | 9 + user-service/lib/.idea/misc.xml | 6 + user-service/lib/.idea/modules.xml | 8 + user-service/lib/.idea/vcs.xml | 6 + user-service/lib/.idea/workspace.xml | 99 ++ user-service/lib/RXTXcomm.jar | Bin 0 -> 60984 bytes user-service/pom.xml | 203 +++ .../com/mh/user/UserServiceApplication.java | 57 + .../com/mh/user/annotation/SysLogger.java | 15 + .../user/annotation/applicationListener.java | 23 + .../java/com/mh/user/aspect/DaoAspect.java | 91 ++ .../java/com/mh/user/aspect/SysLogAspect.java | 127 ++ .../com/mh/user/component/ReceiveHandler.java | 71 + .../java/com/mh/user/config/CorsConfig.java | 41 + .../java/com/mh/user/config/DruidConfig.java | 117 ++ .../config/DruidDataSourceProperties.java | 172 +++ .../mh/user/config/DruidStatViewServlet.java | 17 + .../com/mh/user/config/KaptchaConfig.java | 56 + .../mh/user/config/PrimessionInterceptor.java | 68 + .../java/com/mh/user/config/QuartzConfig.java | 54 + .../com/mh/user/config/RabbitmqConfig.java | 87 ++ .../mh/user/config/RestTemplateConfig.java | 14 + .../com/mh/user/config/SwaggerConfig.java | 49 + .../com/mh/user/config/WebSecurityConfig.java | 83 ++ .../java/com/mh/user/constants/Constant.java | 18 + .../com/mh/user/constants/SocketMessage.java | 33 + .../com/mh/user/constants/SysConstants.java | 11 + .../mh/user/controller/AreaController.java | 38 + .../user/controller/BuildingController.java | 90 ++ .../mh/user/controller/ChartController.java | 56 + .../user/controller/ChillersController.java | 140 ++ .../user/controller/DataResultController.java | 328 ++++ .../user/controller/DeviceInfoController.java | 57 + .../controller/DeviceManageController.java | 299 ++++ .../mh/user/controller/EnergyController.java | 109 ++ .../user/controller/EnergyDataController.java | 41 + .../user/controller/MeterInfoController.java | 30 + .../controller/ProjectInfoController.java | 29 + .../java/com/mh/user/controller/SendTest.java | 51 + .../user/controller/SerialPortController.java | 195 +++ .../controller/StrategyInfoController.java | 28 + .../mh/user/controller/SysDeptController.java | 46 + .../mh/user/controller/SysLogController.java | 60 + .../user/controller/SysLoginController.java | 98 ++ .../mh/user/controller/SysMenuController.java | 50 + .../mh/user/controller/SysRoleController.java | 132 ++ .../mh/user/controller/SysUserController.java | 140 ++ .../user/controller/SystemInfoController.java | 29 + .../mh/user/controller/TestController.java | 102 ++ .../com/mh/user/dto/DeviceMessageDTO.java | 33 + .../com/mh/user/dto/DisplayBoxDataDTO.java | 35 + .../java/com/mh/user/dto/TableInfoDTO.java | 21 + .../user/dynamic/config/DataSourceConfig.java | 77 + .../config/MyBatisMapperScannerConfig.java | 28 + .../datasource/DataSourceContextHolder.java | 23 + .../dynamic/datasource/DataSourceObject.java | 71 + .../dynamic/datasource/DynamicDataSource.java | 44 + .../com/mh/user/entity/AddCronJobReq.java | 34 + .../com/mh/user/entity/AddSimpleJobReq.java | 27 + .../com/mh/user/entity/AlarmInfoEntity.java | 21 + .../mh/user/entity/AlarmInfoSumEntity.java | 20 + .../mh/user/entity/AlarmValueSetEntity.java | 13 + .../mh/user/entity/AnalysisMonthEntity.java | 46 + .../mh/user/entity/AnalysisYearEntity.java | 27 + .../java/com/mh/user/entity/AreaEntity.java | 32 + .../java/com/mh/user/entity/BaseEntity.java | 41 + .../com/mh/user/entity/BuildingEntity.java | 19 + .../com/mh/user/entity/ChillersEntity.java | 58 + .../com/mh/user/entity/ControlSetEntity.java | 17 + .../java/com/mh/user/entity/DBEntity.java | 91 ++ .../mh/user/entity/DataResultChEntity.java | 24 + .../mh/user/entity/DataResultClEntity.java | 23 + .../com/mh/user/entity/DataResultEntity.java | 22 + .../java/com/mh/user/entity/DeleteJobReq.java | 25 + .../mh/user/entity/DeviceCodeParamEntity.java | 27 + .../mh/user/entity/DeviceFloorTempEntity.java | 18 + .../com/mh/user/entity/DeviceInfoEntity.java | 20 + .../mh/user/entity/DeviceInstallEntity.java | 31 + .../user/entity/DeviceInstallTempEntity.java | 113 ++ .../mh/user/entity/DeviceManageEntity.java | 66 + .../mh/user/entity/DeviceParameterEntity.java | 35 + .../com/mh/user/entity/DeviceStateEntity.java | 21 + .../com/mh/user/entity/EnergyDataEntity.java | 18 + .../java/com/mh/user/entity/EnergyEntity.java | 22 + .../com/mh/user/entity/EnergySumEntity.java | 18 + .../com/mh/user/entity/ExceptionEntity.java | 33 + .../mh/user/entity/ExceptionTableData.java | 35 + .../com/mh/user/entity/FirstTableEntity.java | 29 + .../mh/user/entity/GatewayManageEntity.java | 33 + .../java/com/mh/user/entity/GaugeEntity.java | 31 + .../java/com/mh/user/entity/HostValue.java | 30 + .../com/mh/user/entity/MaintainSumEntity.java | 22 + .../com/mh/user/entity/MeterInfoEntity.java | 21 + .../java/com/mh/user/entity/OrderEntity.java | 35 + .../mh/user/entity/OrderMessageEntity.java | 46 + .../com/mh/user/entity/ProjectInfoEntity.java | 18 + .../mh/user/entity/RegisterAddrEntity.java | 15 + .../com/mh/user/entity/ReportParamEntity.java | 35 + .../mh/user/entity/StrategyInfoEntity.java | 14 + .../com/mh/user/entity/SystemInfoEntity.java | 11 + .../user/entity/TableChartMessageEntity.java | 27 + .../com/mh/user/entity/TableDataEntity.java | 33 + .../com/mh/user/entity/TableInfoEntity.java | 32 + .../java/com/mh/user/entity/TestEntity.java | 48 + .../user/entity/UploadDeviceFloorEntity.java | 31 + .../entity/UploadDeviceInstallEntity.java | 109 ++ .../com/mh/user/entity/UseForecastEntity.java | 18 + .../com/mh/user/entity/chart/AxisLine.java | 23 + .../mh/user/entity/chart/BaseChartEntity.java | 45 + .../com/mh/user/entity/chart/ChartEntity.java | 50 + .../com/mh/user/entity/chart/Feature.java | 31 + .../mh/user/entity/chart/GetChartParams.java | 35 + .../java/com/mh/user/entity/chart/Legend.java | 27 + .../com/mh/user/entity/chart/LineStyle.java | 21 + .../java/com/mh/user/entity/chart/Series.java | 29 + .../com/mh/user/entity/chart/SplitLine.java | 21 + .../java/com/mh/user/entity/chart/Title.java | 25 + .../java/com/mh/user/entity/chart/Unit.java | 37 + .../java/com/mh/user/entity/chart/XAxis.java | 21 + .../java/com/mh/user/entity/chart/YAxis.java | 31 + .../com/mh/user/job/CollectionLoopRunner.java | 255 ++++ .../java/com/mh/user/job/DealDataJob.java | 153 ++ .../java/com/mh/user/job/JobChillers.java | 41 + .../main/java/com/mh/user/job/JobCloud.java | 41 + .../src/main/java/com/mh/user/job/JobDDC.java | 39 + .../main/java/com/mh/user/job/JobFactory.java | 45 + .../main/java/com/mh/user/job/JobMeter.java | 39 + .../main/java/com/mh/user/job/JobTest.java | 32 + .../com/mh/user/manage/QuartzManager.java | 259 ++++ .../com/mh/user/manage/SerialPortManager.java | 233 +++ .../com/mh/user/manage/SerialPortManages.java | 345 +++++ .../com/mh/user/mapper/AlarmInfoMapper.java | 117 ++ .../java/com/mh/user/mapper/AreaMapper.java | 18 + .../com/mh/user/mapper/BuildingMapper.java | 93 ++ .../com/mh/user/mapper/ControlSetMapper.java | 46 + .../com/mh/user/mapper/DataResultMapper.java | 264 ++++ .../mh/user/mapper/DeviceCodeParamMapper.java | 92 ++ .../com/mh/user/mapper/DeviceInfoMapper.java | 91 ++ .../mh/user/mapper/DeviceInstallMapper.java | 216 +++ .../com/mh/user/mapper/EnergyDataMapper.java | 81 + .../java/com/mh/user/mapper/EnergyMapper.java | 228 +++ .../com/mh/user/mapper/MeterInfoMapper.java | 31 + .../com/mh/user/mapper/ProjectInfoMapper.java | 30 + .../mh/user/mapper/RegisterAddrMapper.java | 23 + .../mh/user/mapper/StrategyInfoMapper.java | 24 + .../com/mh/user/mapper/SysDeptMapper.java | 29 + .../java/com/mh/user/mapper/SysLogMapper.java | 54 + .../com/mh/user/mapper/SysMenuMapper.java | 36 + .../com/mh/user/mapper/SysRoleDeptMapper.java | 23 + .../com/mh/user/mapper/SysRoleMapper.java | 65 + .../com/mh/user/mapper/SysRoleMenuMapper.java | 28 + .../com/mh/user/mapper/SysUserMapper.java | 61 + .../com/mh/user/mapper/SysUserRoleMapper.java | 30 + .../com/mh/user/mapper/SystemInfoMapper.java | 18 + .../com/mh/user/mapper/chart/ChartMapper.java | 73 + .../chillers/ChillerControlOrderMapper.java | 100 ++ .../user/mapper/chillers/ChillersMapper.java | 184 +++ .../mapper/chillers/DataHistoryMapper.java | 25 + .../user/mapper/chillers/DealDataMapper.java | 102 ++ .../mapper/chillers/DeviceDisplayMapper.java | 45 + .../mapper/chillers/DeviceManageMapper.java | 171 +++ .../mapper/chillers/DeviceParamMapper.java | 93 ++ .../user/mapper/chillers/ExceptionMapper.java | 37 + .../mapper/chillers/GatewayManageMapper.java | 97 ++ .../mh/user/mapper/chillers/GaugeMapper.java | 31 + .../mh/user/mapper/chillers/ReportMapper.java | 40 + .../mapper/provider/AlarmInfoProvider.java | 56 + .../mapper/provider/BuildingProvider.java | 38 + .../mapper/provider/DataResultProvider.java | 237 +++ .../mapper/provider/DeviceInfoProvider.java | 23 + .../provider/DeviceInstallProvider.java | 85 ++ .../mapper/provider/EnergyDataProvider.java | 309 ++++ .../user/mapper/provider/EnergyProvider.java | 378 +++++ .../mapper/provider/MaintainInfoProvider.java | 52 + .../mapper/provider/MeterInfoProvider.java | 20 + .../mapper/provider/StrategyInfoProvider.java | 21 + .../user/mapper/provider/SysLogProvider.java | 37 + .../user/mapper/provider/SysRoleProvider.java | 33 + .../user/mapper/provider/SysUserProvider.java | 38 + .../mapper/provider/UseForecastProvider.java | 48 + .../java/com/mh/user/model/BaseModel.java | 37 + .../java/com/mh/user/model/BuildingModel.java | 10 + .../java/com/mh/user/model/ChillerModel.java | 28 + .../java/com/mh/user/model/DeviceModel.java | 10 + .../com/mh/user/model/DeviceTypeModel.java | 9 + .../java/com/mh/user/model/EnergyModel.java | 16 + .../java/com/mh/user/model/EnergyParam.java | 17 + .../com/mh/user/model/OrderParamModel.java | 17 + .../java/com/mh/user/model/QueueParam.java | 13 + .../com/mh/user/model/SerialPortModel.java | 13 + .../main/java/com/mh/user/model/SysDept.java | 27 + .../main/java/com/mh/user/model/SysDict.java | 24 + .../main/java/com/mh/user/model/SysLog.java | 30 + .../main/java/com/mh/user/model/SysMenu.java | 36 + .../main/java/com/mh/user/model/SysRole.java | 16 + .../java/com/mh/user/model/SysRoleDept.java | 14 + .../java/com/mh/user/model/SysRoleMenu.java | 14 + .../main/java/com/mh/user/model/SysUser.java | 41 + .../java/com/mh/user/model/SysUserRole.java | 14 + .../java/com/mh/user/netty/ClientManage.java | 169 +++ .../java/com/mh/user/netty/EchoServer.java | 52 + .../com/mh/user/netty/EchoServerHandler.java | 575 +++++++ .../com/mh/user/netty/NettyChillerClient.java | 95 ++ .../user/netty/NettyChillerClientHandler.java | 315 ++++ .../user/netty/NettyChillerControlClient.java | 98 ++ .../netty/NettyChillerControlHandler.java | 315 ++++ .../mh/user/netty/NettyChillerDDCClient.java | 96 ++ .../netty/NettyChillerDDCClientHandler.java | 297 ++++ .../java/com/mh/user/netty/NettyClient.java | 90 ++ .../com/mh/user/netty/NettyClientHandler.java | 190 +++ .../com/mh/user/netty/NettyEchoServer.java | 180 +++ .../com/mh/user/netty/NettyMeterClient.java | 95 ++ .../user/netty/NettyMeterClientHandler.java | 261 ++++ .../user/netty/ServerChannelInitializer.java | 33 + .../java/com/mh/user/primary/Clients.java | 70 + .../com/mh/user/provide/ChillersProvider.java | 32 + .../mh/user/provide/DeviceManageProvider.java | 70 + .../mh/user/provide/DeviceParamProvider.java | 45 + .../mh/user/provide/ExceptionProvider.java | 44 + .../user/provide/GatewayManageProvider.java | 44 + .../com/mh/user/provide/GaugeProvider.java | 26 + .../user/security/GrantedAuthorityImpl.java | 29 + .../user/security/JwtAuthenticatioToken.java | 45 + .../security/JwtAuthenticationFilter.java | 35 + .../security/JwtAuthenticationProvider.java | 39 + .../com/mh/user/security/JwtUserDetails.java | 74 + .../user/security/UserDetailsServiceImpl.java | 41 + .../user/serialport/SerialPortListener.java | 161 ++ .../serialport/SerialPortSendReceive.java | 223 +++ .../mh/user/serialport/SerialPortSingle.java | 195 +++ .../mh/user/serialport/SerialPortThread.java | 77 + .../mh/user/serialport/SerialPortUtil.java | 232 +++ .../mh/user/serialport/SerialResquest.java | 118 ++ .../com/mh/user/serialport/SerialTool.java | 274 ++++ .../com/mh/user/service/AlarmInfoService.java | 62 + .../java/com/mh/user/service/AreaService.java | 10 + .../com/mh/user/service/BuildingService.java | 60 + .../mh/user/service/ControlSetService.java | 10 + .../mh/user/service/DataResultService.java | 85 ++ .../user/service/DeviceCodeParamService.java | 37 + .../mh/user/service/DeviceInfoService.java | 21 + .../mh/user/service/DeviceInstallService.java | 118 ++ .../mh/user/service/EnergyDataService.java | 13 + .../com/mh/user/service/EnergyService.java | 64 + .../mh/user/service/GatewayManageService.java | 10 + .../com/mh/user/service/MeterInfoService.java | 9 + .../mh/user/service/ProjectInfoService.java | 15 + .../mh/user/service/RegisterAddrService.java | 9 + .../mh/user/service/StrategyInfoService.java | 9 + .../com/mh/user/service/SysDeptService.java | 21 + .../com/mh/user/service/SysDictService.java | 21 + .../com/mh/user/service/SysLogService.java | 22 + .../com/mh/user/service/SysMenuService.java | 29 + .../com/mh/user/service/SysRoleService.java | 61 + .../com/mh/user/service/SysUserService.java | 45 + .../mh/user/service/SystemInfoService.java | 9 + .../mh/user/service/chart/ChartService.java | 25 + .../service/chart/impl/ChartServiceImpl.java | 168 +++ .../service/chillers/ChillersService.java | 60 + .../service/chillers/DataHistoryService.java | 16 + .../service/chillers/DealDataService.java | 46 + .../chillers/DeviceDisplayService.java | 23 + .../service/chillers/DeviceManageService.java | 39 + .../service/chillers/DeviceParamService.java | 40 + .../service/chillers/ExceptionService.java | 23 + .../chillers/GatewayManageService.java | 55 + .../user/service/chillers/GaugeService.java | 19 + .../service/chillers/OrderMessageService.java | 39 + .../user/service/chillers/ReportService.java | 18 + .../chillers/impl/ChillersServiceImpl.java | 289 ++++ .../chillers/impl/DataHistoryServiceImpl.java | 27 + .../chillers/impl/DealDataServiceImpl.java | 107 ++ .../impl/DeviceDisplayServiceImpl.java | 37 + .../impl/DeviceManageServiceImpl.java | 77 + .../chillers/impl/DeviceParamServiceImpl.java | 76 + .../chillers/impl/ExceptionServiceImpl.java | 47 + .../impl/GatewayManageServiceImpl.java | 103 ++ .../chillers/impl/GaugeServiceImpl.java | 51 + .../impl/OrderMessageServiceImpl.java | 82 + .../chillers/impl/ReportServiceImpl.java | 36 + .../service/impl/AlarmInfoServiceImpl.java | 58 + .../mh/user/service/impl/AreaServiceImpl.java | 21 + .../service/impl/BuildingServiceImpl.java | 65 + .../service/impl/ControlSetServiceImpl.java | 30 + .../service/impl/DataResultServiceImpl.java | 299 ++++ .../impl/DeviceCodeParamServiceImpl.java | 62 + .../service/impl/DeviceInfoServiceImpl.java | 38 + .../impl/DeviceInstallServiceImpl.java | 158 ++ .../service/impl/EnergyDataServiceImpl.java | 66 + .../user/service/impl/EnergyServiceImpl.java | 120 ++ .../service/impl/MeterInfoServiceImpl.java | 21 + .../service/impl/ProjectInfoServiceImpl.java | 28 + .../service/impl/RegisterAddrServiceImpl.java | 21 + .../service/impl/StrategyInfoServiceImpl.java | 21 + .../user/service/impl/SysDeptServiceImpl.java | 81 + .../user/service/impl/SysLogServiceImpl.java | 70 + .../user/service/impl/SysMenuServiceImpl.java | 113 ++ .../user/service/impl/SysRoleServiceImpl.java | 129 ++ .../user/service/impl/SysUserServiceImpl.java | 202 +++ .../service/impl/SystemInfoServiceImpl.java | 20 + .../com/mh/user/sqlmapper/SysDeptMapper.xml | 152 ++ .../com/mh/user/sqlmapper/SysDictMapper.xml | 195 +++ .../com/mh/user/sqlmapper/SysLogMapper.xml | 210 +++ .../com/mh/user/sqlmapper/SysMenuMapper.xml | 216 +++ .../mh/user/sqlmapper/SysRoleDeptMapper.xml | 117 ++ .../com/mh/user/sqlmapper/SysRoleMapper.xml | 153 ++ .../mh/user/sqlmapper/SysRoleMenuMapper.xml | 132 ++ .../com/mh/user/sqlmapper/SysUserMapper.xml | 218 +++ .../mh/user/sqlmapper/SysUserRoleMapper.xml | 81 + .../main/java/com/mh/user/utils/AESUtil.java | 60 + .../user/utils/AnalysisReceiveOrder485.java | 764 ++++++++++ .../main/java/com/mh/user/utils/CRC16.java | 253 ++++ .../main/java/com/mh/user/utils/DateUtil.java | 311 ++++ .../com/mh/user/utils/ExchangeStringUtil.java | 1323 +++++++++++++++++ .../java/com/mh/user/utils/FileUtils.java | 66 + .../com/mh/user/utils/GetReadOrder485.java | 413 +++++ .../java/com/mh/user/utils/HeartUtil.java | 79 + .../java/com/mh/user/utils/HttpUtils.java | 44 + .../main/java/com/mh/user/utils/IPUtils.java | 67 + .../java/com/mh/user/utils/JwtTokenUtils.java | 216 +++ .../com/mh/user/utils/PasswordEncoder.java | 115 ++ .../java/com/mh/user/utils/PasswordUtils.java | 40 + .../com/mh/user/utils/QuerySendThread.java | 38 + .../java/com/mh/user/utils/SecurityUtils.java | 107 ++ .../com/mh/user/utils/SendOrderUtils.java | 191 +++ .../java/com/mh/user/utils/SimpleWeather.java | 146 ++ .../com/mh/user/utils/SpringBeanUtil.java | 54 + .../com/mh/user/utils/SpringContextUtils.java | 45 + .../src/main/java/com/mh/user/utils/Test.java | 130 ++ .../com/mh/user/utils/ThreadPoolService.java | 46 + .../com/mh/user/utils/TimeDifferenceUtil.java | 49 + .../java/com/mh/user/utils/WeatherUtil.java | 225 +++ .../main/java/com/mh/user/vo/LoginBean.java | 19 + user-service/src/main/resources/bootstrap.yml | 113 ++ .../src/main/resources/log4j.properties | 32 + user-service/src/main/resources/socket.yml | 12 + .../test/java/com/mh/user/DealDataTest.java | 23 + .../test/java/com/mh/user/ExceptionTest.java | 44 + .../test/java/com/mh/user/ReportTest1.java | 103 ++ .../test/java/com/mh/user/SysUserTest.java | 31 + .../test/java/com/mh/user/TestJwtUtils.java | 159 ++ .../mh/user/UserServiceApplicationTests.java | 65 + .../java/com/mh/user/chart/ChartTest.java | 69 + .../java/com/mh/user/device/CRC16Test.java | 77 + .../java/com/mh/user/device/DeviceTest.java | 171 +++ .../java/com/mh/user/param/ParamTest.java | 65 + .../user/receive/AnalysisReceiveOrder485.java | 301 ++++ .../java/com/mh/user/receive/receiveTest.java | 40 + .../java/com/mh/user/socket/BIOServer.java | 86 ++ .../java/com/mh/user/socket/NIOServer.java | 246 +++ .../java/com/mh/user/socket/NIOServer2.java | 96 ++ .../java/com/mh/user/socket/NIOServerV3.java | 204 +++ .../com/mh/user/socket/NettyClientTest.java | 58 + .../com/mh/user/socket/NettyEchoServer.java | 182 +++ 375 files changed, 30136 insertions(+) create mode 100644 common/pom.xml create mode 100644 common/src/main/java/com/mh/common/dto/RespDTO.java create mode 100644 common/src/main/java/com/mh/common/exception/BaseErrorInfo.java create mode 100644 common/src/main/java/com/mh/common/exception/CommonNum.java create mode 100644 common/src/main/java/com/mh/common/exception/GlobalException.java create mode 100644 common/src/main/java/com/mh/common/exception/ServiceRuntimeException.java create mode 100644 common/src/main/java/com/mh/common/http/HttpResult.java create mode 100644 common/src/main/java/com/mh/common/http/HttpStatus.java create mode 100644 common/src/main/java/com/mh/common/page/ColumnFilter.java create mode 100644 common/src/main/java/com/mh/common/page/MybatisPageHelper.java create mode 100644 common/src/main/java/com/mh/common/page/PageRequest.java create mode 100644 common/src/main/java/com/mh/common/page/PageResult.java create mode 100644 common/src/main/java/com/mh/common/service/CurdService.java create mode 100644 common/src/main/java/com/mh/common/utils/DateTimeUtils.java create mode 100644 common/src/main/java/com/mh/common/utils/FileUtils.java create mode 100644 common/src/main/java/com/mh/common/utils/IOUtils.java create mode 100644 common/src/main/java/com/mh/common/utils/PoiUtils.java create mode 100644 common/src/main/java/com/mh/common/utils/ReflectionUtils.java create mode 100644 common/src/main/java/com/mh/common/utils/StringUtils.java create mode 100644 pom.xml create mode 100644 user-service/HELP.md create mode 100644 user-service/lib/.idea/lib.iml create mode 100644 user-service/lib/.idea/misc.xml create mode 100644 user-service/lib/.idea/modules.xml create mode 100644 user-service/lib/.idea/vcs.xml create mode 100644 user-service/lib/.idea/workspace.xml create mode 100644 user-service/lib/RXTXcomm.jar create mode 100644 user-service/pom.xml create mode 100644 user-service/src/main/java/com/mh/user/UserServiceApplication.java create mode 100644 user-service/src/main/java/com/mh/user/annotation/SysLogger.java create mode 100644 user-service/src/main/java/com/mh/user/annotation/applicationListener.java create mode 100644 user-service/src/main/java/com/mh/user/aspect/DaoAspect.java create mode 100644 user-service/src/main/java/com/mh/user/aspect/SysLogAspect.java create mode 100644 user-service/src/main/java/com/mh/user/component/ReceiveHandler.java create mode 100644 user-service/src/main/java/com/mh/user/config/CorsConfig.java create mode 100644 user-service/src/main/java/com/mh/user/config/DruidConfig.java create mode 100644 user-service/src/main/java/com/mh/user/config/DruidDataSourceProperties.java create mode 100644 user-service/src/main/java/com/mh/user/config/DruidStatViewServlet.java create mode 100644 user-service/src/main/java/com/mh/user/config/KaptchaConfig.java create mode 100644 user-service/src/main/java/com/mh/user/config/PrimessionInterceptor.java create mode 100644 user-service/src/main/java/com/mh/user/config/QuartzConfig.java create mode 100644 user-service/src/main/java/com/mh/user/config/RabbitmqConfig.java create mode 100644 user-service/src/main/java/com/mh/user/config/RestTemplateConfig.java create mode 100644 user-service/src/main/java/com/mh/user/config/SwaggerConfig.java create mode 100644 user-service/src/main/java/com/mh/user/config/WebSecurityConfig.java create mode 100644 user-service/src/main/java/com/mh/user/constants/Constant.java create mode 100644 user-service/src/main/java/com/mh/user/constants/SocketMessage.java create mode 100644 user-service/src/main/java/com/mh/user/constants/SysConstants.java create mode 100644 user-service/src/main/java/com/mh/user/controller/AreaController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/BuildingController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/ChartController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/ChillersController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/DataResultController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/DeviceInfoController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/DeviceManageController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/EnergyController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/EnergyDataController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/MeterInfoController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/ProjectInfoController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/SendTest.java create mode 100644 user-service/src/main/java/com/mh/user/controller/SerialPortController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/StrategyInfoController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/SysDeptController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/SysLogController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/SysLoginController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/SysMenuController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/SysRoleController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/SysUserController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/SystemInfoController.java create mode 100644 user-service/src/main/java/com/mh/user/controller/TestController.java create mode 100644 user-service/src/main/java/com/mh/user/dto/DeviceMessageDTO.java create mode 100644 user-service/src/main/java/com/mh/user/dto/DisplayBoxDataDTO.java create mode 100644 user-service/src/main/java/com/mh/user/dto/TableInfoDTO.java create mode 100644 user-service/src/main/java/com/mh/user/dynamic/config/DataSourceConfig.java create mode 100644 user-service/src/main/java/com/mh/user/dynamic/config/MyBatisMapperScannerConfig.java create mode 100644 user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceContextHolder.java create mode 100644 user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceObject.java create mode 100644 user-service/src/main/java/com/mh/user/dynamic/datasource/DynamicDataSource.java create mode 100644 user-service/src/main/java/com/mh/user/entity/AddCronJobReq.java create mode 100644 user-service/src/main/java/com/mh/user/entity/AddSimpleJobReq.java create mode 100644 user-service/src/main/java/com/mh/user/entity/AlarmInfoEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/AlarmInfoSumEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/AlarmValueSetEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/AnalysisMonthEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/AnalysisYearEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/AreaEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/BaseEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/BuildingEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/ChillersEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/ControlSetEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DBEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DataResultChEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DataResultClEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DataResultEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DeleteJobReq.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DeviceCodeParamEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DeviceFloorTempEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DeviceInfoEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DeviceInstallTempEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DeviceManageEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DeviceParameterEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/DeviceStateEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/EnergyDataEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/EnergyEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/EnergySumEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/ExceptionEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/ExceptionTableData.java create mode 100644 user-service/src/main/java/com/mh/user/entity/FirstTableEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/GatewayManageEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/GaugeEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/HostValue.java create mode 100644 user-service/src/main/java/com/mh/user/entity/MaintainSumEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/MeterInfoEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/OrderEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/OrderMessageEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/ProjectInfoEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/RegisterAddrEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/ReportParamEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/StrategyInfoEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/SystemInfoEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/TableChartMessageEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/TableDataEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/TableInfoEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/TestEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/UploadDeviceFloorEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/UploadDeviceInstallEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/UseForecastEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/AxisLine.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/BaseChartEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/ChartEntity.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/Feature.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/GetChartParams.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/Legend.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/LineStyle.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/Series.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/SplitLine.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/Title.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/Unit.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/XAxis.java create mode 100644 user-service/src/main/java/com/mh/user/entity/chart/YAxis.java create mode 100644 user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java create mode 100644 user-service/src/main/java/com/mh/user/job/DealDataJob.java create mode 100644 user-service/src/main/java/com/mh/user/job/JobChillers.java create mode 100644 user-service/src/main/java/com/mh/user/job/JobCloud.java create mode 100644 user-service/src/main/java/com/mh/user/job/JobDDC.java create mode 100644 user-service/src/main/java/com/mh/user/job/JobFactory.java create mode 100644 user-service/src/main/java/com/mh/user/job/JobMeter.java create mode 100644 user-service/src/main/java/com/mh/user/job/JobTest.java create mode 100644 user-service/src/main/java/com/mh/user/manage/QuartzManager.java create mode 100644 user-service/src/main/java/com/mh/user/manage/SerialPortManager.java create mode 100644 user-service/src/main/java/com/mh/user/manage/SerialPortManages.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/AlarmInfoMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/AreaMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/BuildingMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/ControlSetMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/DataResultMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/DeviceInfoMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/EnergyDataMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/EnergyMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/MeterInfoMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/ProjectInfoMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/RegisterAddrMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/StrategyInfoMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/SysDeptMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/SysLogMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/SysMenuMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/SysRoleDeptMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/SysRoleMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/SysRoleMenuMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/SysUserMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/SysUserRoleMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/SystemInfoMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/chart/ChartMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/chillers/ChillerControlOrderMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/chillers/ChillersMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/chillers/DataHistoryMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/chillers/DealDataMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/chillers/DeviceDisplayMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/chillers/DeviceManageMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/chillers/DeviceParamMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/chillers/ExceptionMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/chillers/GatewayManageMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/chillers/GaugeMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/chillers/ReportMapper.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/AlarmInfoProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/BuildingProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/DataResultProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/DeviceInfoProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/DeviceInstallProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/EnergyDataProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/EnergyProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/MaintainInfoProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/MeterInfoProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/StrategyInfoProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/SysLogProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/SysRoleProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/SysUserProvider.java create mode 100644 user-service/src/main/java/com/mh/user/mapper/provider/UseForecastProvider.java create mode 100644 user-service/src/main/java/com/mh/user/model/BaseModel.java create mode 100644 user-service/src/main/java/com/mh/user/model/BuildingModel.java create mode 100644 user-service/src/main/java/com/mh/user/model/ChillerModel.java create mode 100644 user-service/src/main/java/com/mh/user/model/DeviceModel.java create mode 100644 user-service/src/main/java/com/mh/user/model/DeviceTypeModel.java create mode 100644 user-service/src/main/java/com/mh/user/model/EnergyModel.java create mode 100644 user-service/src/main/java/com/mh/user/model/EnergyParam.java create mode 100644 user-service/src/main/java/com/mh/user/model/OrderParamModel.java create mode 100644 user-service/src/main/java/com/mh/user/model/QueueParam.java create mode 100644 user-service/src/main/java/com/mh/user/model/SerialPortModel.java create mode 100644 user-service/src/main/java/com/mh/user/model/SysDept.java create mode 100644 user-service/src/main/java/com/mh/user/model/SysDict.java create mode 100644 user-service/src/main/java/com/mh/user/model/SysLog.java create mode 100644 user-service/src/main/java/com/mh/user/model/SysMenu.java create mode 100644 user-service/src/main/java/com/mh/user/model/SysRole.java create mode 100644 user-service/src/main/java/com/mh/user/model/SysRoleDept.java create mode 100644 user-service/src/main/java/com/mh/user/model/SysRoleMenu.java create mode 100644 user-service/src/main/java/com/mh/user/model/SysUser.java create mode 100644 user-service/src/main/java/com/mh/user/model/SysUserRole.java create mode 100644 user-service/src/main/java/com/mh/user/netty/ClientManage.java create mode 100644 user-service/src/main/java/com/mh/user/netty/EchoServer.java create mode 100644 user-service/src/main/java/com/mh/user/netty/EchoServerHandler.java create mode 100644 user-service/src/main/java/com/mh/user/netty/NettyChillerClient.java create mode 100644 user-service/src/main/java/com/mh/user/netty/NettyChillerClientHandler.java create mode 100644 user-service/src/main/java/com/mh/user/netty/NettyChillerControlClient.java create mode 100644 user-service/src/main/java/com/mh/user/netty/NettyChillerControlHandler.java create mode 100644 user-service/src/main/java/com/mh/user/netty/NettyChillerDDCClient.java create mode 100644 user-service/src/main/java/com/mh/user/netty/NettyChillerDDCClientHandler.java create mode 100644 user-service/src/main/java/com/mh/user/netty/NettyClient.java create mode 100644 user-service/src/main/java/com/mh/user/netty/NettyClientHandler.java create mode 100644 user-service/src/main/java/com/mh/user/netty/NettyEchoServer.java create mode 100644 user-service/src/main/java/com/mh/user/netty/NettyMeterClient.java create mode 100644 user-service/src/main/java/com/mh/user/netty/NettyMeterClientHandler.java create mode 100644 user-service/src/main/java/com/mh/user/netty/ServerChannelInitializer.java create mode 100644 user-service/src/main/java/com/mh/user/primary/Clients.java create mode 100644 user-service/src/main/java/com/mh/user/provide/ChillersProvider.java create mode 100644 user-service/src/main/java/com/mh/user/provide/DeviceManageProvider.java create mode 100644 user-service/src/main/java/com/mh/user/provide/DeviceParamProvider.java create mode 100644 user-service/src/main/java/com/mh/user/provide/ExceptionProvider.java create mode 100644 user-service/src/main/java/com/mh/user/provide/GatewayManageProvider.java create mode 100644 user-service/src/main/java/com/mh/user/provide/GaugeProvider.java create mode 100644 user-service/src/main/java/com/mh/user/security/GrantedAuthorityImpl.java create mode 100644 user-service/src/main/java/com/mh/user/security/JwtAuthenticatioToken.java create mode 100644 user-service/src/main/java/com/mh/user/security/JwtAuthenticationFilter.java create mode 100644 user-service/src/main/java/com/mh/user/security/JwtAuthenticationProvider.java create mode 100644 user-service/src/main/java/com/mh/user/security/JwtUserDetails.java create mode 100644 user-service/src/main/java/com/mh/user/security/UserDetailsServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/serialport/SerialPortListener.java create mode 100644 user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java create mode 100644 user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java create mode 100644 user-service/src/main/java/com/mh/user/serialport/SerialPortThread.java create mode 100644 user-service/src/main/java/com/mh/user/serialport/SerialPortUtil.java create mode 100644 user-service/src/main/java/com/mh/user/serialport/SerialResquest.java create mode 100644 user-service/src/main/java/com/mh/user/serialport/SerialTool.java create mode 100644 user-service/src/main/java/com/mh/user/service/AlarmInfoService.java create mode 100644 user-service/src/main/java/com/mh/user/service/AreaService.java create mode 100644 user-service/src/main/java/com/mh/user/service/BuildingService.java create mode 100644 user-service/src/main/java/com/mh/user/service/ControlSetService.java create mode 100644 user-service/src/main/java/com/mh/user/service/DataResultService.java create mode 100644 user-service/src/main/java/com/mh/user/service/DeviceCodeParamService.java create mode 100644 user-service/src/main/java/com/mh/user/service/DeviceInfoService.java create mode 100644 user-service/src/main/java/com/mh/user/service/DeviceInstallService.java create mode 100644 user-service/src/main/java/com/mh/user/service/EnergyDataService.java create mode 100644 user-service/src/main/java/com/mh/user/service/EnergyService.java create mode 100644 user-service/src/main/java/com/mh/user/service/GatewayManageService.java create mode 100644 user-service/src/main/java/com/mh/user/service/MeterInfoService.java create mode 100644 user-service/src/main/java/com/mh/user/service/ProjectInfoService.java create mode 100644 user-service/src/main/java/com/mh/user/service/RegisterAddrService.java create mode 100644 user-service/src/main/java/com/mh/user/service/StrategyInfoService.java create mode 100644 user-service/src/main/java/com/mh/user/service/SysDeptService.java create mode 100644 user-service/src/main/java/com/mh/user/service/SysDictService.java create mode 100644 user-service/src/main/java/com/mh/user/service/SysLogService.java create mode 100644 user-service/src/main/java/com/mh/user/service/SysMenuService.java create mode 100644 user-service/src/main/java/com/mh/user/service/SysRoleService.java create mode 100644 user-service/src/main/java/com/mh/user/service/SysUserService.java create mode 100644 user-service/src/main/java/com/mh/user/service/SystemInfoService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chart/ChartService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chart/impl/ChartServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/ChillersService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/DataHistoryService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/DealDataService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/DeviceDisplayService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/DeviceManageService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/DeviceParamService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/ExceptionService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/GatewayManageService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/GaugeService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/OrderMessageService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/ReportService.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/impl/ChillersServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/impl/DataHistoryServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/impl/DealDataServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/impl/DeviceDisplayServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/impl/DeviceManageServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/impl/DeviceParamServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/impl/ExceptionServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/impl/GatewayManageServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/impl/GaugeServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/impl/OrderMessageServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/chillers/impl/ReportServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/AlarmInfoServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/AreaServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/BuildingServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/ControlSetServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/DeviceCodeParamServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/DeviceInfoServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/EnergyDataServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/EnergyServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/MeterInfoServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/ProjectInfoServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/RegisterAddrServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/StrategyInfoServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/SysDeptServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/SysLogServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/SysMenuServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/SysRoleServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/SysUserServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/service/impl/SystemInfoServiceImpl.java create mode 100644 user-service/src/main/java/com/mh/user/sqlmapper/SysDeptMapper.xml create mode 100644 user-service/src/main/java/com/mh/user/sqlmapper/SysDictMapper.xml create mode 100644 user-service/src/main/java/com/mh/user/sqlmapper/SysLogMapper.xml create mode 100644 user-service/src/main/java/com/mh/user/sqlmapper/SysMenuMapper.xml create mode 100644 user-service/src/main/java/com/mh/user/sqlmapper/SysRoleDeptMapper.xml create mode 100644 user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMapper.xml create mode 100644 user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMenuMapper.xml create mode 100644 user-service/src/main/java/com/mh/user/sqlmapper/SysUserMapper.xml create mode 100644 user-service/src/main/java/com/mh/user/sqlmapper/SysUserRoleMapper.xml create mode 100644 user-service/src/main/java/com/mh/user/utils/AESUtil.java create mode 100644 user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java create mode 100644 user-service/src/main/java/com/mh/user/utils/CRC16.java create mode 100644 user-service/src/main/java/com/mh/user/utils/DateUtil.java create mode 100644 user-service/src/main/java/com/mh/user/utils/ExchangeStringUtil.java create mode 100644 user-service/src/main/java/com/mh/user/utils/FileUtils.java create mode 100644 user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java create mode 100644 user-service/src/main/java/com/mh/user/utils/HeartUtil.java create mode 100644 user-service/src/main/java/com/mh/user/utils/HttpUtils.java create mode 100644 user-service/src/main/java/com/mh/user/utils/IPUtils.java create mode 100644 user-service/src/main/java/com/mh/user/utils/JwtTokenUtils.java create mode 100644 user-service/src/main/java/com/mh/user/utils/PasswordEncoder.java create mode 100644 user-service/src/main/java/com/mh/user/utils/PasswordUtils.java create mode 100644 user-service/src/main/java/com/mh/user/utils/QuerySendThread.java create mode 100644 user-service/src/main/java/com/mh/user/utils/SecurityUtils.java create mode 100644 user-service/src/main/java/com/mh/user/utils/SendOrderUtils.java create mode 100644 user-service/src/main/java/com/mh/user/utils/SimpleWeather.java create mode 100644 user-service/src/main/java/com/mh/user/utils/SpringBeanUtil.java create mode 100644 user-service/src/main/java/com/mh/user/utils/SpringContextUtils.java create mode 100644 user-service/src/main/java/com/mh/user/utils/Test.java create mode 100644 user-service/src/main/java/com/mh/user/utils/ThreadPoolService.java create mode 100644 user-service/src/main/java/com/mh/user/utils/TimeDifferenceUtil.java create mode 100644 user-service/src/main/java/com/mh/user/utils/WeatherUtil.java create mode 100644 user-service/src/main/java/com/mh/user/vo/LoginBean.java create mode 100644 user-service/src/main/resources/bootstrap.yml create mode 100644 user-service/src/main/resources/log4j.properties create mode 100644 user-service/src/main/resources/socket.yml create mode 100644 user-service/src/test/java/com/mh/user/DealDataTest.java create mode 100644 user-service/src/test/java/com/mh/user/ExceptionTest.java create mode 100644 user-service/src/test/java/com/mh/user/ReportTest1.java create mode 100644 user-service/src/test/java/com/mh/user/SysUserTest.java create mode 100644 user-service/src/test/java/com/mh/user/TestJwtUtils.java create mode 100644 user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java create mode 100644 user-service/src/test/java/com/mh/user/chart/ChartTest.java create mode 100644 user-service/src/test/java/com/mh/user/device/CRC16Test.java create mode 100644 user-service/src/test/java/com/mh/user/device/DeviceTest.java create mode 100644 user-service/src/test/java/com/mh/user/param/ParamTest.java create mode 100644 user-service/src/test/java/com/mh/user/receive/AnalysisReceiveOrder485.java create mode 100644 user-service/src/test/java/com/mh/user/receive/receiveTest.java create mode 100644 user-service/src/test/java/com/mh/user/socket/BIOServer.java create mode 100644 user-service/src/test/java/com/mh/user/socket/NIOServer.java create mode 100644 user-service/src/test/java/com/mh/user/socket/NIOServer2.java create mode 100644 user-service/src/test/java/com/mh/user/socket/NIOServerV3.java create mode 100644 user-service/src/test/java/com/mh/user/socket/NettyClientTest.java create mode 100644 user-service/src/test/java/com/mh/user/socket/NettyEchoServer.java diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..46ba43c --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,55 @@ + + + + com.mh + mh_esi + 1.0-SNAPSHOT + + 4.0.0 + + com.mh + common + 0.0.1-SNAPSHOT + jar + + + UTF-8 + UTF-8 + 1.8 + 1.8 + 1.8 + + + + + com.alibaba + fastjson + 1.2.31 + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.2.13 + + + + org.springframework.boot + spring-boot-starter-web + + + + commons-beanutils + commons-beanutils + 1.9.3 + + + + org.apache.poi + poi-ooxml + 4.0.1 + + + diff --git a/common/src/main/java/com/mh/common/dto/RespDTO.java b/common/src/main/java/com/mh/common/dto/RespDTO.java new file mode 100644 index 0000000..06cb8d6 --- /dev/null +++ b/common/src/main/java/com/mh/common/dto/RespDTO.java @@ -0,0 +1,26 @@ +package com.mh.common.dto; + +import java.io.Serializable; + +public class RespDTO implements Serializable{ + + + public int code = 0; + public String error = ""; + public T data; + + public static RespDTO onSuc(Object data) { + RespDTO resp = new RespDTO(); + resp.data = data; + return resp; + } + + @Override + public String toString() { + return "RespDTO{" + + "code=" + code + + ", error='" + error + '\'' + + ", data=" + data + + '}'; + } +} diff --git a/common/src/main/java/com/mh/common/exception/BaseErrorInfo.java b/common/src/main/java/com/mh/common/exception/BaseErrorInfo.java new file mode 100644 index 0000000..83a7af2 --- /dev/null +++ b/common/src/main/java/com/mh/common/exception/BaseErrorInfo.java @@ -0,0 +1,9 @@ +package com.mh.common.exception; + +public interface BaseErrorInfo { + /** 错误码*/ + int getResultCode(); + + /** 错误描述*/ + String getResultMsg(); +} diff --git a/common/src/main/java/com/mh/common/exception/CommonNum.java b/common/src/main/java/com/mh/common/exception/CommonNum.java new file mode 100644 index 0000000..5141a1b --- /dev/null +++ b/common/src/main/java/com/mh/common/exception/CommonNum.java @@ -0,0 +1,50 @@ +package com.mh.common.exception; + +public enum CommonNum implements BaseErrorInfo { + /** + * 自定义错误信息 + */ + SUCCESS(200, "成功!"), + BODY_NOT_MATCH(400,"请求的数据格式不符!"), + SIGNATURE_NOT_MATCH(401,"请求的数字签名不匹配!"), + NOT_FOUND(404, "未找到该资源!"), + INTERNAL_SERVER_ERROR(500, "服务器内部错误!"), + SERVER_BUSY(503,"服务器正忙,请稍后再试!"), + + OK(0, ""), + FAIL(-1, "操作失败"), + RPC_ERROR(-2,"远程调度失败"), + USER_NOT_FOUND(1000,"用户不存在"), + USER_PASSWORD_ERROR(1001,"密码错误"), + GET_TOKEN_FAIL(1002,"获取token失败"), + TOKEN_IS_NOT_MATCH_USER(1003,"请使用自己的token进行接口请求"), + BLOG_IS_NOT_EXIST(2001,"该博客不存在"); + + /** + * 错误码 + */ + private int resultCode; + + /** + * 错误描述 + */ + private String resultMsg; + + + CommonNum(int resultCode, String resultMsg) { + this.resultCode = resultCode; + this.resultMsg = resultMsg; + } + + @Override + public int getResultCode() { + return resultCode; + } + + @Override + public String getResultMsg() { + return resultMsg; + } +} + + diff --git a/common/src/main/java/com/mh/common/exception/GlobalException.java b/common/src/main/java/com/mh/common/exception/GlobalException.java new file mode 100644 index 0000000..188411a --- /dev/null +++ b/common/src/main/java/com/mh/common/exception/GlobalException.java @@ -0,0 +1,52 @@ +package com.mh.common.exception; +import com.mh.common.http.HttpResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +@ControllerAdvice +public class GlobalException { + private static final Logger logger = LoggerFactory.getLogger(GlobalException.class); + + /** + * 处理自定义异常 + * @param e + * @return + */ + @ResponseBody + @ExceptionHandler(value = ServiceRuntimeException.class) + public HttpResult serviceRuntimeException(ServiceRuntimeException e){ + logger.error("发生业务异常!原因是:{}",e.getMessage()); + return HttpResult.error(e.getCode(),e.getMessage()); + + } + + /** + * 处理空指针异常 + * @param e + * @return + */ + @ResponseBody + @ExceptionHandler(value = NullPointerException.class) + public HttpResult exceptionHandler(NullPointerException e){ + logger.error("发生空指针异常!原因是:",e); + return HttpResult.error(CommonNum.BODY_NOT_MATCH.toString()); + + } + + /** + * 其它异常 + * @param e + * @return + */ + @ResponseBody + @ExceptionHandler(value = Exception.class) + public HttpResult exceptionHandler(Exception e){ + logger.error("发生空指针异常!原因是:",e); + return HttpResult.error(CommonNum.INTERNAL_SERVER_ERROR.toString()); + + } + +} diff --git a/common/src/main/java/com/mh/common/exception/ServiceRuntimeException.java b/common/src/main/java/com/mh/common/exception/ServiceRuntimeException.java new file mode 100644 index 0000000..c659a54 --- /dev/null +++ b/common/src/main/java/com/mh/common/exception/ServiceRuntimeException.java @@ -0,0 +1,64 @@ +package com.mh.common.exception; + +public class ServiceRuntimeException extends RuntimeException{ + /** + * 错误码 + */ + private int code; + /** + * 错误信息 + */ + private String message; + + public ServiceRuntimeException(String message){ + super(message); + this.message = message; + + } + + public ServiceRuntimeException(int code,String message){ + super(message); + this.code = code; + this.message = message; + + } + + //Throwable是Error和Exception的父类,用来定义所有可以作为异常被抛出来的类。 + public ServiceRuntimeException(int code,String message,Throwable cause){ + super(message,cause); + this.code = code; + this.message = message; + + } + + public ServiceRuntimeException(BaseErrorInfo baseErrorInfo){ + super(baseErrorInfo.getResultMsg()); + this.code = baseErrorInfo.getResultCode(); + this.message = baseErrorInfo.getResultMsg(); + } + + public ServiceRuntimeException(BaseErrorInfo baseErrorInfo,Throwable cause){ + super(baseErrorInfo.getResultMsg(),cause); + this.code = baseErrorInfo.getResultCode(); + this.message = baseErrorInfo.getResultMsg(); + } + + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + @Override + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} + diff --git a/common/src/main/java/com/mh/common/http/HttpResult.java b/common/src/main/java/com/mh/common/http/HttpResult.java new file mode 100644 index 0000000..c320830 --- /dev/null +++ b/common/src/main/java/com/mh/common/http/HttpResult.java @@ -0,0 +1,96 @@ +package com.mh.common.http; + +/** + * HTTP结果封装 + * @author Louis + * @date Jan 12, 2019 + */ +public class HttpResult { + + private int code = 200; // 为成功 + private String msg; // 消息 + private Object data; // 数据对象 + private int count; // 记录数 + + public static HttpResult error() { + + return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员"); + } + + public static HttpResult error(String msg) + { + return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg); + } + + public static HttpResult error(int code, String msg) { + HttpResult r = new HttpResult(); + r.setCode(code); + r.setMsg(msg); + return r; + } + + public static HttpResult ok(String msg) { + HttpResult r = new HttpResult(); + r.setMsg(msg); + return r; + } + + public static HttpResult ok(Object data) { + HttpResult r = new HttpResult(); + r.setData(data); + return r; + } + + public static HttpResult ok(String msg, Object data) { + HttpResult r = new HttpResult(); + r.setMsg(msg); + r.setData(data); + return r; + } + + public static HttpResult ok(int count, Object data) { + HttpResult r = new HttpResult(); + r.setCount(count); + r.setData(data); + return r; + } + + public static HttpResult ok() { + HttpResult r = new HttpResult(); + r.setMsg("success"); + r.setCode(200); + return r; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } +} diff --git a/common/src/main/java/com/mh/common/http/HttpStatus.java b/common/src/main/java/com/mh/common/http/HttpStatus.java new file mode 100644 index 0000000..1c73e17 --- /dev/null +++ b/common/src/main/java/com/mh/common/http/HttpStatus.java @@ -0,0 +1,149 @@ +package com.mh.common.http; + +/** + * Constants enumerating the HTTP status codes. + * All status codes defined in RFC1945 (HTTP/1.0), RFC2616 (HTTP/1.1), and + * RFC2518 (WebDAV) are listed. + * + * + * + * @since 4.0 + */ +public interface HttpStatus { + + // --- 1xx Informational --- + + /** {@code 100 Continue} (HTTP/1.1 - RFC 2616) */ + public static final int SC_CONTINUE = 100; + /** {@code 101 Switching Protocols} (HTTP/1.1 - RFC 2616)*/ + public static final int SC_SWITCHING_PROTOCOLS = 101; + /** {@code 102 Processing} (WebDAV - RFC 2518) */ + public static final int SC_PROCESSING = 102; + + // --- 2xx Success --- + + /** {@code 200 OK} (HTTP/1.0 - RFC 1945) */ + public static final int SC_OK = 200; + /** {@code 201 Created} (HTTP/1.0 - RFC 1945) */ + public static final int SC_CREATED = 201; + /** {@code 202 Accepted} (HTTP/1.0 - RFC 1945) */ + public static final int SC_ACCEPTED = 202; + /** {@code 203 Non Authoritative Information} (HTTP/1.1 - RFC 2616) */ + public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203; + /** {@code 204 No Content} (HTTP/1.0 - RFC 1945) */ + public static final int SC_NO_CONTENT = 204; + /** {@code 205 Reset Content} (HTTP/1.1 - RFC 2616) */ + public static final int SC_RESET_CONTENT = 205; + /** {@code 206 Partial Content} (HTTP/1.1 - RFC 2616) */ + public static final int SC_PARTIAL_CONTENT = 206; + /** + * {@code 207 Multi-Status} (WebDAV - RFC 2518) + * or + * {@code 207 Partial Update OK} (HTTP/1.1 - draft-ietf-http-v11-spec-rev-01?) + */ + public static final int SC_MULTI_STATUS = 207; + + // --- 3xx Redirection --- + + /** {@code 300 Mutliple Choices} (HTTP/1.1 - RFC 2616) */ + public static final int SC_MULTIPLE_CHOICES = 300; + /** {@code 301 Moved Permanently} (HTTP/1.0 - RFC 1945) */ + public static final int SC_MOVED_PERMANENTLY = 301; + /** {@code 302 Moved Temporarily} (Sometimes {@code Found}) (HTTP/1.0 - RFC 1945) */ + public static final int SC_MOVED_TEMPORARILY = 302; + /** {@code 303 See Other} (HTTP/1.1 - RFC 2616) */ + public static final int SC_SEE_OTHER = 303; + /** {@code 304 Not Modified} (HTTP/1.0 - RFC 1945) */ + public static final int SC_NOT_MODIFIED = 304; + /** {@code 305 Use Proxy} (HTTP/1.1 - RFC 2616) */ + public static final int SC_USE_PROXY = 305; + /** {@code 307 Temporary Redirect} (HTTP/1.1 - RFC 2616) */ + public static final int SC_TEMPORARY_REDIRECT = 307; + + // --- 4xx Client Error --- + + /** {@code 400 Bad Request} (HTTP/1.1 - RFC 2616) */ + public static final int SC_BAD_REQUEST = 400; + /** {@code 401 Unauthorized} (HTTP/1.0 - RFC 1945) */ + public static final int SC_UNAUTHORIZED = 401; + /** {@code 402 Payment Required} (HTTP/1.1 - RFC 2616) */ + public static final int SC_PAYMENT_REQUIRED = 402; + /** {@code 403 Forbidden} (HTTP/1.0 - RFC 1945) */ + public static final int SC_FORBIDDEN = 403; + /** {@code 404 Not Found} (HTTP/1.0 - RFC 1945) */ + public static final int SC_NOT_FOUND = 404; + /** {@code 405 Method Not Allowed} (HTTP/1.1 - RFC 2616) */ + public static final int SC_METHOD_NOT_ALLOWED = 405; + /** {@code 406 Not Acceptable} (HTTP/1.1 - RFC 2616) */ + public static final int SC_NOT_ACCEPTABLE = 406; + /** {@code 407 Proxy Authentication Required} (HTTP/1.1 - RFC 2616)*/ + public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407; + /** {@code 408 Request Timeout} (HTTP/1.1 - RFC 2616) */ + public static final int SC_REQUEST_TIMEOUT = 408; + /** {@code 409 Conflict} (HTTP/1.1 - RFC 2616) */ + public static final int SC_CONFLICT = 409; + /** {@code 410 Gone} (HTTP/1.1 - RFC 2616) */ + public static final int SC_GONE = 410; + /** {@code 411 Length Required} (HTTP/1.1 - RFC 2616) */ + public static final int SC_LENGTH_REQUIRED = 411; + /** {@code 412 Precondition Failed} (HTTP/1.1 - RFC 2616) */ + public static final int SC_PRECONDITION_FAILED = 412; + /** {@code 413 Request Entity Too Large} (HTTP/1.1 - RFC 2616) */ + public static final int SC_REQUEST_TOO_LONG = 413; + /** {@code 414 Request-URI Too Long} (HTTP/1.1 - RFC 2616) */ + public static final int SC_REQUEST_URI_TOO_LONG = 414; + /** {@code 415 Unsupported Media Type} (HTTP/1.1 - RFC 2616) */ + public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415; + /** {@code 416 Requested Range Not Satisfiable} (HTTP/1.1 - RFC 2616) */ + public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; + /** {@code 417 Expectation Failed} (HTTP/1.1 - RFC 2616) */ + public static final int SC_EXPECTATION_FAILED = 417; + + /** + * Static constant for a 418 error. + * {@code 418 Unprocessable Entity} (WebDAV drafts?) + * or {@code 418 Reauthentication Required} (HTTP/1.1 drafts?) + */ + // not used + // public static final int SC_UNPROCESSABLE_ENTITY = 418; + + /** + * Static constant for a 419 error. + * {@code 419 Insufficient Space on Resource} + * (WebDAV - draft-ietf-webdav-protocol-05?) + * or {@code 419 Proxy Reauthentication Required} + * (HTTP/1.1 drafts?) + */ + public static final int SC_INSUFFICIENT_SPACE_ON_RESOURCE = 419; + /** + * Static constant for a 420 error. + * {@code 420 Method Failure} + * (WebDAV - draft-ietf-webdav-protocol-05?) + */ + public static final int SC_METHOD_FAILURE = 420; + /** {@code 422 Unprocessable Entity} (WebDAV - RFC 2518) */ + public static final int SC_UNPROCESSABLE_ENTITY = 422; + /** {@code 423 Locked} (WebDAV - RFC 2518) */ + public static final int SC_LOCKED = 423; + /** {@code 424 Failed Dependency} (WebDAV - RFC 2518) */ + public static final int SC_FAILED_DEPENDENCY = 424; + + // --- 5xx Server Error --- + + /** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */ + public static final int SC_INTERNAL_SERVER_ERROR = 500; + /** {@code 501 Not Implemented} (HTTP/1.0 - RFC 1945) */ + public static final int SC_NOT_IMPLEMENTED = 501; + /** {@code 502 Bad Gateway} (HTTP/1.0 - RFC 1945) */ + public static final int SC_BAD_GATEWAY = 502; + /** {@code 503 Service Unavailable} (HTTP/1.0 - RFC 1945) */ + public static final int SC_SERVICE_UNAVAILABLE = 503; + /** {@code 504 Gateway Timeout} (HTTP/1.1 - RFC 2616) */ + public static final int SC_GATEWAY_TIMEOUT = 504; + /** {@code 505 HTTP Version Not Supported} (HTTP/1.1 - RFC 2616) */ + public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505; + + /** {@code 507 Insufficient Storage} (WebDAV - RFC 2518) */ + public static final int SC_INSUFFICIENT_STORAGE = 507; + +} diff --git a/common/src/main/java/com/mh/common/page/ColumnFilter.java b/common/src/main/java/com/mh/common/page/ColumnFilter.java new file mode 100644 index 0000000..9a1a5ac --- /dev/null +++ b/common/src/main/java/com/mh/common/page/ColumnFilter.java @@ -0,0 +1,32 @@ +package com.mh.common.page; + +/** + * 分页查询列过滤器 + * @author Louis + * @date Aug 19, 2018 + */ +public class ColumnFilter { + + /** + * 过滤列名 + */ + private String name; + /** + * 查询的值 + */ + private String value; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/common/src/main/java/com/mh/common/page/MybatisPageHelper.java b/common/src/main/java/com/mh/common/page/MybatisPageHelper.java new file mode 100644 index 0000000..7e6d4b1 --- /dev/null +++ b/common/src/main/java/com/mh/common/page/MybatisPageHelper.java @@ -0,0 +1,63 @@ +package com.mh.common.page; + +import java.util.List; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.mh.common.utils.ReflectionUtils; + +/** + * MyBatis 分页查询助手 + * @author Louis + * @date Jan 12, 2019 + */ +public class MybatisPageHelper { + + public static final String findPage = "findPage"; + + /** + * 分页查询, 约定查询方法名为 “findPage” + * @param pageRequest 分页请求 + * @param mapper Dao对象,MyBatis的 Mapper + * @param + * @return + */ + public static PageResult findPage(PageRequest pageRequest, Object mapper) { + return findPage(pageRequest, mapper, findPage); + } + + /** + * 调用分页插件进行分页查询 + * @param pageRequest 分页请求 + * @param mapper Dao对象,MyBatis的 Mapper + * @param queryMethodName 要分页的查询方法名 + * @param args 方法参数 + * @return + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static PageResult findPage(PageRequest pageRequest, Object mapper, String queryMethodName, Object... args) { + // 设置分页参数 + int pageNum = pageRequest.getPageNum(); + int pageSize = pageRequest.getPageSize(); + PageHelper.startPage(pageNum, pageSize); + // 利用反射调用查询方法 + Object result = ReflectionUtils.invoke(mapper, queryMethodName, args); + return getPageResult(pageRequest, new PageInfo((List) result)); + } + + /** + * 将分页信息封装到统一的接口 + * @param pageRequest + * @return + */ + private static PageResult getPageResult(PageRequest pageRequest, PageInfo pageInfo) { + PageResult pageResult = new PageResult(); + pageResult.setPageNum(pageInfo.getPageNum()); + pageResult.setPageSize(pageInfo.getPageSize()); + pageResult.setTotalSize(pageInfo.getTotal()); + pageResult.setTotalPages(pageInfo.getPages()); + pageResult.setContent(pageInfo.getList()); + return pageResult; + } + +} diff --git a/common/src/main/java/com/mh/common/page/PageRequest.java b/common/src/main/java/com/mh/common/page/PageRequest.java new file mode 100644 index 0000000..97ed3dd --- /dev/null +++ b/common/src/main/java/com/mh/common/page/PageRequest.java @@ -0,0 +1,46 @@ +package com.mh.common.page; + +import java.util.HashMap; +import java.util.Map; + +/** + * 分页请求 + * @author Louis + * @date Aug 19, 2018 + */ +public class PageRequest { + /** + * 当前页码 + */ + private int pageNum = 1; + /** + * 每页数量 + */ + private int pageSize = 10; + /** + * 每页数量 + */ + private Map columnFilters = new HashMap(); + + public int getPageNum() { + return pageNum; + } + public void setPageNum(int pageNum) { + this.pageNum = pageNum; + } + public int getPageSize() { + return pageSize; + } + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + public Map getColumnFilters() { + return columnFilters; + } + public void setColumnFilters(Map columnFilters) { + this.columnFilters = columnFilters; + } + public ColumnFilter getColumnFilter(String name) { + return columnFilters.get(name); + } +} diff --git a/common/src/main/java/com/mh/common/page/PageResult.java b/common/src/main/java/com/mh/common/page/PageResult.java new file mode 100644 index 0000000..2c9ad52 --- /dev/null +++ b/common/src/main/java/com/mh/common/page/PageResult.java @@ -0,0 +1,61 @@ +package com.mh.common.page; + +import java.util.List; + +/** + * 分页返回结果 + * @author Louis + * @date Jan 12, 2019 + */ +public class PageResult { + /** + * 当前页码 + */ + private int pageNum; + /** + * 每页数量 + */ + private int pageSize; + /** + * 记录总数 + */ + private long totalSize; + /** + * 页码总数 + */ + private int totalPages; + /** + * 分页数据 + */ + private List content; + public int getPageNum() { + return pageNum; + } + public void setPageNum(int pageNum) { + this.pageNum = pageNum; + } + public int getPageSize() { + return pageSize; + } + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + public long getTotalSize() { + return totalSize; + } + public void setTotalSize(long totalSize) { + this.totalSize = totalSize; + } + public int getTotalPages() { + return totalPages; + } + public void setTotalPages(int totalPages) { + this.totalPages = totalPages; + } + public List getContent() { + return content; + } + public void setContent(List content) { + this.content = content; + } +} diff --git a/common/src/main/java/com/mh/common/service/CurdService.java b/common/src/main/java/com/mh/common/service/CurdService.java new file mode 100644 index 0000000..a76e871 --- /dev/null +++ b/common/src/main/java/com/mh/common/service/CurdService.java @@ -0,0 +1,50 @@ +package com.mh.common.service; + +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; + +import java.util.List; + +/** + * 通用CURD接口 + */ +public interface CurdService { + + /** + * 保存操作 + * @param record + * @return + */ + int save(T record); + + /** + * 删除操作 + * @param record + * @return + */ + int delete(T record); + + /** + * 批量删除操作 + * @param records + */ + int delete(List records); + + /** + * 根据ID查询 + * @param id + * @return + */ + T findById(Long id); + + /** + * 分页查询 + * 这里统一封装了分页请求和结果,避免直接引入具体框架的分页对象, 如MyBatis或JPA的分页对象 + * 从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,替换ORM框架也不会 + * 影响服务层以上的分页接口,起到了解耦的作用 + * @param pageRequest 自定义,统一分页查询请求 + * @return PageResult 自定义,统一分页查询结果 + */ + PageResult findPage(PageRequest pageRequest); + +} \ No newline at end of file diff --git a/common/src/main/java/com/mh/common/utils/DateTimeUtils.java b/common/src/main/java/com/mh/common/utils/DateTimeUtils.java new file mode 100644 index 0000000..ae7d735 --- /dev/null +++ b/common/src/main/java/com/mh/common/utils/DateTimeUtils.java @@ -0,0 +1,32 @@ +package com.mh.common.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 日期时间相关工具 + * @author Louis + * @date Jan 14, 2019 + */ +public class DateTimeUtils { + + public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + /** + * 获取当前标准格式化日期时间 + * @param date + * @return + */ + public static String getDateTime() { + return getDateTime(new Date()); + } + + /** + * 标准格式化日期时间 + * @param date + * @return + */ + public static String getDateTime(Date date) { + return (new SimpleDateFormat(DATE_FORMAT)).format(date); + } +} diff --git a/common/src/main/java/com/mh/common/utils/FileUtils.java b/common/src/main/java/com/mh/common/utils/FileUtils.java new file mode 100644 index 0000000..addd5af --- /dev/null +++ b/common/src/main/java/com/mh/common/utils/FileUtils.java @@ -0,0 +1,42 @@ +package com.mh.common.utils; + +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; + +/** + * 文件相关操作 + * @author Louis + * @date Jan 14, 2019 + */ +public class FileUtils { + + /** + * 下载文件 + * @param response + * @param file + * @param newFileName + */ + public static void downloadFile(HttpServletResponse response, File file, String newFileName) { + try { + response.setHeader("Content-Disposition", "attachment; filename=" + new String(newFileName.getBytes("ISO-8859-1"), "UTF-8")); + BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); + InputStream is = new FileInputStream(file.getAbsolutePath()); + BufferedInputStream bis = new BufferedInputStream(is); + int length = 0; + byte[] temp = new byte[1 * 1024 * 10]; + while ((length = bis.read(temp)) != -1) { + bos.write(temp, 0, length); + } + bos.flush(); + bis.close(); + bos.close(); + is.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/common/src/main/java/com/mh/common/utils/IOUtils.java b/common/src/main/java/com/mh/common/utils/IOUtils.java new file mode 100644 index 0000000..1c0c9b0 --- /dev/null +++ b/common/src/main/java/com/mh/common/utils/IOUtils.java @@ -0,0 +1,26 @@ +package com.mh.common.utils; + +import java.io.Closeable; +import java.io.IOException; + +/** + * IO相关工具类 + * @author Louis + * @date Oct 29, 2018 + */ +public class IOUtils { + + /** + * 关闭对象,连接 + * @param closeable + */ + public static void closeQuietly(final Closeable closeable) { + try { + if (closeable != null) { + closeable.close(); + } + } catch (final IOException ioe) { + // ignore + } + } +} diff --git a/common/src/main/java/com/mh/common/utils/PoiUtils.java b/common/src/main/java/com/mh/common/utils/PoiUtils.java new file mode 100644 index 0000000..29badd6 --- /dev/null +++ b/common/src/main/java/com/mh/common/utils/PoiUtils.java @@ -0,0 +1,41 @@ +//package com.mh.common.utils; +// +//import java.io.File; +//import java.io.FileNotFoundException; +//import java.io.FileOutputStream; +//import java.io.IOException; +//import java.io.OutputStream; +// +//import org.apache.poi.ss.usermodel.Workbook; +// +///** +// * POI相关操作 +// * @author Louis +// * @date Jan 14, 2019 +// */ +//public class PoiUtils { +// +// /** +// * 生成Excel文件 +// * @param workbook +// * @param fileName +// * @return +// */ +// public static File createExcelFile(Workbook workbook, String fileName) { +// OutputStream stream = null; +// File file = null; +// try { +// file = File.createTempFile(fileName, ".xlsx"); +// stream = new FileOutputStream(file.getAbsoluteFile()); +// workbook.write(stream); +// } catch (FileNotFoundException e) { +// e.printStackTrace(); +// } catch (IOException e) { +// e.printStackTrace(); +// } finally { +// IOUtils.closeQuietly(workbook); +// IOUtils.closeQuietly(stream); +// } +// return file; +// } +//} diff --git a/common/src/main/java/com/mh/common/utils/ReflectionUtils.java b/common/src/main/java/com/mh/common/utils/ReflectionUtils.java new file mode 100644 index 0000000..57c1a38 --- /dev/null +++ b/common/src/main/java/com/mh/common/utils/ReflectionUtils.java @@ -0,0 +1,78 @@ +package com.mh.common.utils; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * 反射相关辅助方法 + * @author Louis + * @date Aug 19, 2018 + */ +public class ReflectionUtils { + + + /** + * 根据方法名调用指定对象的方法 + * @param object 要调用方法的对象 + * @param method 要调用的方法名 + * @param args 参数对象数组 + * @return + */ + public static Object invoke(Object object, String method, Object... args) { + Object result = null; + Class clazz = object.getClass(); + Method queryMethod = getMethod(clazz, method, args); + if(queryMethod != null) { + try { + result = queryMethod.invoke(object, args); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } else { + try { + throw new NoSuchMethodException(clazz.getName() + " 类中没有找到 " + method + " 方法。"); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } + return result; + } + + /** + * 根据方法名和参数对象查找方法 + * @param clazz + * @param name + * @param args 参数实例数据 + * @return + */ + public static Method getMethod(Class clazz, String name, Object[] args) { + Method queryMethod = null; + Method[] methods = clazz.getMethods(); + for(Method method:methods) { + if(method.getName().equals(name)) { + Class[] parameterTypes = method.getParameterTypes(); + if(parameterTypes.length == args.length) { + boolean isSameMethod = true; + for(int i=0; i + + 4.0.0 + com.mh + mh_esi + 1.0-SNAPSHOT + pom + + common + user-service + + + org.springframework.boot + spring-boot-starter-parent + 2.2.5.RELEASE + + + + UTF-8 + UTF-8 + 1.8 + Hoxton.SR3 + 2.9.2 + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.jolokia + jolokia-core + + + io.springfox + springfox-swagger2 + ${swagger.version} + + + io.springfox + springfox-swagger-ui + ${swagger.version} + + + org.springframework.boot + spring-boot-starter-aop + 2.2.5.RELEASE + + + org.rxtx + rxtx + 2.1.7 + + + com.github.purejavacomm + purejavacomm + 1.0.1.RELEASE + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + diff --git a/user-service/HELP.md b/user-service/HELP.md new file mode 100644 index 0000000..5ea1b3b --- /dev/null +++ b/user-service/HELP.md @@ -0,0 +1,33 @@ +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) +* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/maven-plugin/) +* [Spring Web](https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#boot-features-developing-web-applications) + +### Guides +The following guides illustrate how to use some features concretely: + +* [Service Registration and Discovery](https://spring.io/guides/gs/service-registration-and-discovery/) +* [Circuit Breaker](https://spring.io/guides/gs/circuit-breaker/) +* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) +* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) +* [Building REST services with Spring](https://spring.io/guides/tutorials/bookmarks/) + +# Spring Cloud Netflix Maintenance Mode + +The dependencies listed below are in maintenance mode. We do not recommend adding them to +new projects: + +* Hystrix +* Hystrix Dashboard + +The decision to move most of the Spring Cloud Netflix projects to maintenance mode was +a response to Netflix not continuing maintenance of many of the libraries that we provided +support for. + +Please see [this blog entry](https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now#spring-cloud-netflix-projects-entering-maintenance-mode) +for more information on maintenance mode and a list of suggested replacements for those +libraries. diff --git a/user-service/lib/.idea/lib.iml b/user-service/lib/.idea/lib.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/user-service/lib/.idea/lib.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/user-service/lib/.idea/misc.xml b/user-service/lib/.idea/misc.xml new file mode 100644 index 0000000..28a804d --- /dev/null +++ b/user-service/lib/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/user-service/lib/.idea/modules.xml b/user-service/lib/.idea/modules.xml new file mode 100644 index 0000000..b0c4ff6 --- /dev/null +++ b/user-service/lib/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/user-service/lib/.idea/vcs.xml b/user-service/lib/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/user-service/lib/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/user-service/lib/.idea/workspace.xml b/user-service/lib/.idea/workspace.xml new file mode 100644 index 0000000..1347e5a --- /dev/null +++ b/user-service/lib/.idea/workspace.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1663641449492 + + + + + + + + + + + + \ No newline at end of file diff --git a/user-service/lib/RXTXcomm.jar b/user-service/lib/RXTXcomm.jar new file mode 100644 index 0000000000000000000000000000000000000000..e1e75034a3841c4382dc220a3ebc75a5dcc92113 GIT binary patch literal 60984 zcmb5W1C(UV(ltD7+s3qQ+qP}nJ#E{zZF73swr$(S-_L#S``?#$t*>fj)~Q-?suDXR zBX&lVoFou1@(=LuXMIx$`;Y(hfcOFYLt0pgpITf-g!Xgv#}A+%a*|-+e@OuTQ%vsv zyczjh;{U%{nqNj-L|9RYMq1=fdVEYulA2})Mv|Iha(t>mfo`60`@n%lLYhikdd9gN z7$WrqqaO>C%nUf?ko?(%1nmG#6*Z;s5S7yHkoe5}*5Sqh;2#Ys_SQxf{r;K1%3lqE z{70ke{#!4Azdtp#ai;y3#DDK6*gqxAZT}(k_h9_@uR;5lkf5!#wUC3ki?IWZp_RU) zqjVHMWG@}E(9zPWMTZ6`XB$ z%^MJ(AJZU%h=3SK3nw?UsWp{;hO#yzbER#fUK6uI*lnt+K$Mil<3&=S5QVw%+!z+= zc>VjXT$SkDZNNE>#>?gAa9Bn!7DNW`$PvHV*PzT&bPEe1Jm52M9@0F@qUDQU_g@gws$1zVYBTu|xke%&Y|77T*nd0mTQ{8_PaZGnR0xzAj=@;vfn zG@ZPk+RFJ8Y8I4TBwnIv-Y)H$*j6$3TV7(uD+~AdUalaJZdIya0MSI`cxQnr;EdX}-iyVG3lriArxL%xBi1U**)V_cebEK5;XyCCH z*%}zo&InBc%8dO%dq>MqCdXGP%_J8kFK283Tsfc3Dq&8#MKUbEY|QDPk}gLL!OOXl^|)rX*hOE!NRaoY0Z z8JJ|$vlbcdQ?reZ$&H!QS%WH&TQ1ty)>Y^AQW=;83M@*vMgAm;Anm|fL;)=VE8UCN z2rpeYbsJC*)HtUamTK_JJJBDDQ~OU2C{a+85N+*^pTJ0AYm%!NVpJ5dA>Pj9W242h z_tvt^JD1rRAY7>pabo8Oa!{z;B^E2XrC`9}6kt@&FfK#jLtSHfI-GEti*5o<_7rnn zy8|`|DXPitQ3B+EF$5U-(@s|&9pUG_o8$31QW^G`WiLV!`+n3q1^TP7@t)k7O>TAXkcu?;g(q z7y!yc4K)zR6)G4-Nb)70Xdw4oaePYbX}?R1(ALp(1yFzCJs_RKTxHvQ0{w;g7xD?Q zx^FdA1@iAOkM}<@FKpv%ZS0`$Wc$z6ZLOefi6jrt&AMWgak1D~S695?{gM>Jf}l&? z6$mMipCrN0zbfs3)nawIYodBedpiI|jnV@K0tER2#0ng6+zRQVXU zouO4$N!BI5%h!#7Zti}8&Pl2D$SqDP0TOV9TD5Hl$j_;*o>Y(NBO7_RMT;0uG$0x} zn;j=6&73%<&sr9iO-rv!%N&Q@HZ%CB)O%0-NX$jB{y>+#uNiL`m^HE_-rb_&jF@S$ z8V^MKWqLsnZE~`+D&G$}a~kgSS7j8JiS&A{JyMI+zTQe})dY?jU=b7=k1cBIZ#N1* zgUoP&CCf|#ZQT#fLoL?P+BX$v5Xi5N!n~x=1*zA2+}cs$w0TEJ@-8m=1?_$&t3wm? z5<3V`ZrZ_d>;mRr{5fUb!O!Tl1$>qWkmvC4iD_f0vfCl!XITrfvA;H7b-0CJ!4At; zb9$cx?>W^Lkc`kzw5;#*w6Ux`4OLN%m6p|eM9zn}RAckJMoxLYDuF8d^qcxD;+p77 zB-pN`9Z-=*bLd9Q(VJ#GW@S91+~+boBc)wxVpZRy*P}jC|G#1trQ@q2f<~A3qp?{vV+vZe(oZWNu>q9~(uGs=J=z1J2j` zED>!dS83yPJfK4Oe0;Gm0x(p5ldsAw>Y9U+J^HHZE0eTE^lZH}%Yb1*)@kN3c4?)Q z9J^rNTz!77+gY*T`p)5cPzdgebO~(tzPIRR|vWv4a6u^Kb$lrJE;uvq6SGsS>i-Js{Uf zw<4lVN*^o=XPqQ$2g<+qrd6Ccun{T8~(tD z63tuTAQ=dP2PgomU{Q1 zXRGZe4JN}lmb@a?FA8nVBhGZlWsgm#fa;rAUKd?u-nx1V^X+28;Famrbd{YOrq5oK zA42d;kjoY-VE6DRm;qH))`ckOC)y~XGR*#pl&!=oaZ**>_Z3XJn4 zd;{g&GP^NEQUy4R{Ek!&!gNJJ73G7R*Lt3euHu~US4m-c#yoX;;eAAK!2f^+t$Va96Jde$(#30yhqg1cmgOJNs< zu`~-4jhtrCfI6#hgEY%Mtudo_ar|ZqDVY6>>RVxm3jGZ+HwS2$-y#1b&+xDrGQW#x zeBgSI_2aZwz9!4rHBkXWdY9~Yz3bqcUMuS$Slc8+^K|36rQ^jB`Mobt-#c{i9$OMh zba8zY1oIM9Zckx;`tM=#^y3KPtl(|)Z@S9wTG``cTPOIHu!=XPHw%FhZRG9z^sL;G zSufhDdB%zu_l-_sFcFwxK_tCFdDrgay$%cZDL#d#y^rYo1-S>`dn;0Q`Nu9JxMo)c z<||qC9`B_3%OJ{MmiZm7#f*)BJHw|LuxN*IeE|=OT-tYl44nq17Tx?=OM)H3Tz3>*f}9}+4y8<$qTe$!zK#&$C^-8l1_`pn6vvnmsbLSYSuaF!cR zW6c@c=+}3n%o$YTgG#1EbGM>1>ogz_6mQ*Bs-#0bG94GvoT9)~;QCpR`-P-KpaOY3 zt%(GGrL;q*=sFPNIHb9pKLMUR6Z3Z>wsu>e}3< z2yy8|4PbdW&1NJsIB|MkQAQ>5fn8P!lso3UG$r1r%@`uN3Y+a zYSnpaOp3HF7{~qHA9D5dUe9<|**bHW>UbUicROwgOzufFJ6Rt{0WkWZJQ(0ZK>Vpv zvJSj?rRVoL7((Y2d4A(K2uw5fIL)rOl`jkO1y zok!b)&xFa(EL*Fk)t7Dz1L%*=SxB^!)f$dcV<&>A2{J-Gg+^hGE*o$V4tqq~y}c>J zhN2C3>$XxoDx|v9-nwc7sVn);2_YrO#!(cuQiu%69b+dg#VH$nZ_ed%%| zw4&doWxK1!ciBx{J6o-xYl+hYAGN=e;y0BHIB=Mxo%Kt zN*nAfh@)4k0JE*b&>rLXI0n2!z21VT(}^?*YP%(47LwQQ%750YMpMq!q0b9k0<5e} z%6rpVW_8m;!&V*vmwbPT--JWl>WfX&Eld(QMp^i)n5ZElI2&3)@4@PM zI*;&37{rAIB8>A#D(Mz%Y5KY?{Xzdy|-h#6{rvb4JlC+!ZapI@2C%Lr7a&uNXDq(;38$*ORwzC7E za&eV05V9p&B}RbwV!RRcmmQ=Ge6iZ)IWAqcq$<{M`;_9@Uw2PY zZ}ncJJfa^qLt>96>kgM6&}oi2Uc50RPaDx`P7O|r5w__-N&{(>A@!)UH@mTO>d?@h z;=6yL8?Fb2S5nS~z0olO)x%t$!<)2LDZovRRob6>QW&2_JV6r>FH1ql2&6PD8E@D? z#;!jaBqJ*n!@$GJ5@XvSM&mn09Xp% z4{?vV=1%5;xEgZw^bjm1RNY5741+-2W!st|jZb-`n>=#*X=Q+f^o0O=VK|JMK`-Kz zCuilS$rWvGfMpU+s-B-M5Vag;oR75>w$ZB7KTY;{i)X_d&;rJP!$i1?;S>(ks(8O+ zb3=8BHpS=`qnF|a@isttj8e19e#4@JD0b=lH~V&252mJpZhhEk3dj7^ygULRKGzlupW1x#4GNoYn{syDn_U{nw~9iqC68eT zl_WuyL}j2}K{v#R0vscAqiR#yw-kTFEp%q6N_pINI3%O2W-QvJamqkxfdctndGk^;EMJlp+D3OQO|fk)0P$#FJekIg z-_nPA-C!i=5gWw3Har71K79W2FAjcZCL%%q_~DNF@B9mr|LLmAy4n~!IGUN;Ntru3 z8Gm2@&DS``_Q>?|!3TfkB~gUu;?76hl%l=DHw}^mE}~wGsnq)s8!t6#y0OCY_`(@y zF6yTY$&{s7W)KlW(7wi7=lvggPiur0U_<3q^9Lf6*FyHMIsa&q$p zH-%xwVAi^50%!F}Fn>fOZea4v3S4<^xq|;?QeiAlvmjcF{EGnMQt+PbAStaZyvx5|jz=_>@?*PKm#VfvBWenUs#Mz`D4@lcPgwt8dcIVA6-oHlharnIB@_T%gzP+^n zo8UtK&m(AKVs7f}U`#~+&oPt#_VW3Wxf2Rkj5dmyS(Gc3*F-jmim-H}z!8xHAAl4* zudVBUZ^($7*t@dqZow>vd^C7%jNl1FoA%9 zLVue*JGzc$_TnSRNefKTx9*P<}GugA1`ylx8071JC+8$ zZ;3P=*$9D)92@ee!{jI`o-J}OwgMWpCFIdO-pAm=)yj61d$B`eL;oT+Iox9n$HM{J zj{D23wnDh*f)fz_8rM?##E!5blEH65U_$7W&5ebpco^L3Q&F#!K~Rfa?y+h->T7Mg znm*0lAXTbFq2Y%44^p;$lvKGB*K>eR_MZJ*g_cac!Ft3gXjV$|n?EyddL-fKGv}Mv z`gToC-5keNaaNKuOov2g%FOl?GHKWZFlu*kPMo~;HlE#7B0g~I;4cAlZ-W5ap z_|dN`^7dwErNzDb||M+`9h69Wp`wsU;&nUb@u^fn3tqoR3@{)rqiVF%^{nI3)}3%3=Dys_$j{v76~F^d<&D(0FJmSI8BDApSIjM%9QW$Ihx zJqTi0@{ff!UJ6}*|AOzwg!*{H7fT4F#Oye5=@qW&nk)>5lRAi(3TEcP1VKXh?H%96 zjL5ov$5)X1`NSP-+cpi9HrD$b{#MS|4f{b=!Q>1>%oL?R2#{K0&c(HsbZo7c^@v8k zR^YXg>89J$c?lu0`3W(aqYrI0t5F2rS@M9W;ll?9Ze*shiI&)2QkrQHG|MpX?aa&A8=nbiDn)ql583(D4rz{Ij^j>7?F)d>f?9 zjl7)I+%B6J7rd7oBc3V9aNEMb!U z?jrNf>*#iGsfWOqoU3VP+X0XpeL-||5G8V@HQbV=dQSwb`^$`mTkd(204lQ5^+VHh8BeKC4g@ z!fDD42tkmB0lMpyH%}H@!>Hb2fb-f705{YV z4p+AzR1EgGVNY*<05O-#H84BW80_t^{7gxN#1y@654qS#pXWpjA+9`}rhsKv99DtWxohRZ4qu~i;PAy^-NcAk<9-qJ&=mHUT zj>nLVUfw=X4mExXorU)HtyleisC1uYZmdLdGwqV}UigYc@%6LG?%Ryc+hXia+lF@- zM5rVcg|6KykxB&kCV)BZxvCTHHf|>CU-cA({AU83n}QuvcChqB51u1eA)mw#!)q<* zA7J!CPx`kc$2PGSW8OexGM5C&znj4Jpzg({<}gU1Jd5rCX>h^BA?ZhGWLflGm}i<| zp7ZMxF+U>H&S?xfY84u+OTsQ?YsYa?MUWu;VHzOb3VK|;zs|2C;gO~b5g)}j0S>RT zlI`%=vE%zCsds+1N-q|NW~-1t|AV&%Tl-yV_zlwMe@iz0uUi?@-$1pN)0PDM-pclt zn%B}z#C1jRo^wHM;C`dSH4pEvrMAYdb1 zoOxTqDa@UyP;Ll%U{u$lX(INv57%^0D`8hwULmpUNmlzhbr% zmc$QDDrtyRi{fe)UdGu?hi~79D4UQ zOW}STFZ6Ee5Ok4`vFxv&s9glX`uwK5U?ymzEz1dm0nvK~Z%SnTB6(}Wj88fk?%%o6 z@RR&Cz}8r>2Y1L93e}V{7XX#bt}*>tC-x`f@PIW=CUw^XTLkm(PPYgnc;$xSwnQ&7 z@{_~+bp|%Wu?T~tf9))`DJHPe-@4=A-&z;n#@j#68NW{v1#SOnUHm;EQK}wp$O|Z6 z((w~g!Rp`@2r8w}DrSgc{`}Am**tvb`Oq!Y_Ik*9es|nhq#|6p=`O| z$$VAbMMbd-Fq_ZN`&xq~na*STB$+)0`iwDYY6`k#P*jhe z6H6woiao{W#_%&ICcPLfr{B>*t^6#kr>zjIl7ps3cj_oPbJykDr?M^Yj$AS|0oV|D0xZ` zowRDoh`qN*C$);E|EdXpbE@q9sAnh35TwAJzRrziBz|2oB3!~C39xEv;@8I>27fAzsZp!wzQZECXeR_iwky$wiO@Q$MO5OtHuYiaDnOB6FOg?frw(VB{vwQ@I^en&Te#Ei)) z787BSNljd=l2al?N1Xf6h^J&SSYhTGJkm_~b^ujui-FN`J^cLDKx^HuH{7qZ){KXa zW+D|A%_c*gb&ILPt17EcHGWrn!XP^iE_lj?a|R0AV9x{#u4>|nh*B66K@{Fb+r-e6 zsb^Qdu3_1nN$)~@M+X!nLdz5UUYI}Nr=*bKH!pWFO&#kR0nA*O%l zSyB-&WM43FiL6-V`NiyU0sZN(fHe6-?Oc@gM*;rW_%q9JoB3TsJ~?qMVWb@+?!hXK zQBh^mNoxulzL!3s7YRa^NYnW@FL8ZuBk`ORU7I!U?+JZ+nJJlrhVcl~x1<}MyQ(Xro0GDFf+%+{plq*Su0Yl<#}%Ko*bcJmTzBjmN2a6P|a z+V@dhFQ78~MTb;{W&#hUBc(*xlonG^Rb)~jP9Xh55t~!$J6%=u*u@!1XPJg0Z@Mwi z`{93b9V|PmTc(y-$rRPAuVjFF2W&C)aIoG_e^`stubOPTK6A%RAghFANQYa^W4elR z0r_;F9fZF_GNu8<+qo>t$c%Eh1)%IK&$&WcA{+f;iyn3;q8bp`Nqn;C>xQ zZAlIzYx7~cChgSUo_dyS`z&R~e>n5jd73>AmCE^}a3N22W)&wRk@`n@Rjy;d(|r5t z87yxRDvn+<$#Ss~O@vF<#Cf5NItf3yf#QMg@Z5;+SSlHrb|8O&99!1N*a3+_+5EyB z^fSx{Y>QjwH+!&=7j+gQ#_WCtk9$U4xRiUR+DN9ua-ZMth^21Y_LhUs>5hVhB z$vj)L@OsvwGE_@ilzuBeLAWsHUI9QuSw(Yn7;-)`vj_t&Dm&DjEA5lHp-GI)SoouE zHGDnVURH;ZIZAqs13l$JU9%dN$>uEfNdQ02#W8cqWT2MvCwocVd9`y0V|8EXtLkv) z;H7I_XZljQ|H9Srt>HBVg8Ky#n?A;|>(-9WzP3(Ef%Ii)LZQ5cA*;{lM{dVAKGLBjt8Vx03(Bx#T{UZ$Wk81xn3j`e0T3hSrL3k~BwNJZ4yZ zX|FU6cYEQ>TbA@twe+wArg0ovG?zAM$^~Dfg8bSHq9RmFZG6Ytmi5jI;s6*()TY&u z)hcwtR4oZll*P-@1o+F|#-Iz$F`!95sUFqDPxNYiq;z)X z^Z}A7(`^8%xLH3hwmK;eCXaAyYymPSE!-izeLaXbK+Ii95<3B*DxExLvxYiH-bHvr znSjOYp>@q^Ex`2rAc#c;;K=#l1v_h8(nEUNmSXJZt-VaJ@Vnadp?4r~5v8(QqOy3C zt8N4y{LP^mVWxMkas7_$=qLk{Uu@|-283L%DHuAN>iZ8L6r5Nde%$cYkuZ%kk8D zQKG%^;~ID15O}{)ZMz{1zEC#-VcC%<7-x>yV-#hL%$K%jc4UeBh8;ps*;KPb|7O4U z>od#LZgPCEI%r~^VA?^T;)-MkVHyxj)L_VB-ARv49-7t64bdR<1CkT0isO^?s_*i` zW!+p<=w`rlu)w{5zI1?<FVHNlt@1E|8U5Z4;2^&SwzFVkg`m0`)MWPiHl(bO{3%k%h{# z&+*8=(h@icGgpSiel4hj{WwN-ldZ45oBk@zb2bRsiMQcEqC+p)L zylBjxj5qlDK;jpuuHDnN^m@eCE>CCB8wyZJVv!r4dcaVkBiq#wQYEV_1==q8fdN-l z5={#5F^aK9=OStL01(U{fnVO7y&piNbE1^;@6JiDW@TGS=bvzY znRLPeAt*5rKYj$k|2wkaKShU#GYArW7jYXqXD3A`2V;Hfzim5XMM+sCdE`$S&bc8v z1$Z!OIFKp@4ePN2pj(a5bSC}|U$amwNeq3dw0IW_CVS)cj8-C0B<)-XEF{0zUe(=R zJpEm`YueHynL1iihNsNCtR?QP-*+ERYhFL-$H~|N_q9CNR&M(^|rH`XL;i2SNNi z)Qc4a?o2O@#jm&n((7G__(nOy>+ctBMKUGR>X$-6SYmCm7 zZQ4vU{O6Pm>9v7XtLXKenG!#TyqHb6;^P+CbkQU-6kb@Q6GG0Cyx${>t|X)L z9wL9!YA2>rOb?>@m&czp`xnL8QyGXIu!uf%ho&#Bs~c64HrkJ!s;F%WzvRo$2NQG> zJ?4U+>2FonL;OJC92PGp)>wUZ2(@Ju4Mk zwPUXY={`ZqHi{;U$vNd5R!GzJSOqk@y`zCoOF~b>7Mr7?nZr5WgF@ZIvYr6h%!n@E zLp+@@;!dM+<=4O{x~j5Y8A{q+R-6|XrB&HFyVKm)UJB6WB(gz%g0Ov2U8DVl`vF~4 z)QWHK((F4b^8Y5u@c-q?{1f-G&QAXg_}1}LHs55~;2-BqHhWZ!bcI}>T;!DYu=)1i z{%r7mMrHXS_%xYX4Y9&yiYsT$oj`zoeAk#__=K=tKX4)G4U5E)Y7f#jR<4fHRyMYL zyt4q71?GYRu$Yxc0d5~(?KG4EZAD!~E_d~!ayfAU@$rO0Rn+R;*2+r0;OX@fn+H;Ix zFQ@Cj-U)_qZuRrX{+u7EtLE;by~^;)8a}Aq{V7khK67@$7N4)fmlvM!Bdv?>K*YKx zW+4DU9cpsFzc@N1W5r1*KaQn%CnfA7k~i-_Gfo=?K4b^jODG?7XIsZ>;yZ{^gqSa2 zQ&B&>00y|&JMYIusfq&Tq%xBNpIpN;cM14W;iLzPliQ8WD!B>5Yy5f|%k)R6fLZMx z(B_U*sNn%|_$Ms7j(E zB?cUT392m*S93B|)%b*?*#Z7~}a&e67TFIwq z&L5yUw+U<8{HM#f1g$a+np8{S&l|z{mHnT4{nPLR#xPltup*oVQ8S}v`b>=N7}}9M z(B{WIN%$I48@9eNF@;Gn zQ#AuBq|NMg8(}yy=S~LmVcIh1)dQ$DXil!(HL$;)@^WqgG`Nc>@CJ&ODVh2QW%CB! zOTg*MdP4Vv()CV_ptVZO=gr)b_U>}igu$7i;31&oOjGh0%6ayLK8Hix zz$or=9`?f#m8s~#3(BzeA%hIaor5%{m~m~f_iBghf`@N`%Wr@mSlx4oaAU-oevJXW z%XK<;Ie-^b3#d^?wm}j!!8@Y(Tj;MVgO>(DsOITVuiK%V&i58pY^y@qtM-(jB3Ap$ zK`A*GclFZwUA_8$S8w^>)w^`iF8y1f zfV|9BND-#(4#zVd-!$(&M>T*Cz+d`OF-3-9@LOM!d`G?i-}>^~i1-ic=UZR?2k8Uh zrnG>V`DTthjYr`r=+PSoZ)>$MBgs;m^+I*}6x-P7CxOM@6vTCxu%bfe{2LJrl7*+xqAuu~Ty0a>I0x8p3gk$Q|YY zzfTYgX2KDJ6@nQ`$Xw?X=!2VLCXi6_XUWUg8v!%W7UcMB>yquEnW6VENa&=DQv2!B zcBq2Mp>=}Gpm|t4G5ef?G3?4yM}DW#(2v3NnK06aELA&)x5?1UP7fc}qR#itG+)Ro zLxA5tGfPJ;h9s&op$mIYw z4)Jj2Pm=~@P#%D+_RXhs=Eo6fGx)`ZcoiK= zHj}#vrlU&M*+GgeryqiQE`M;^#^Hjph6}6jovoy~w6;(rQa8~`&}YPdHaMtVUd#$& z*j`RwGHNhCXs0BL8LZyMt#7?-YFLFOc1sE@TE9W*O5PJ&PYryw?i~r1BzLU*U=R)2f5WdI_g$r)6A*t3aPs^$@jXXd9@SA&W-Yg@p(q6U%b0$Ea z`Vje!06n@?1C%>dj=!ax6s%^QlbHtc%(`wQ#7^OOjH-Two+6T;>9QnBLg|EGFH?v2 zbNN|8dM2P_ei1p2i%PEK9#jLF`x4S8b4d?0y-bC1u`QPcbBCrkyaN8_wYFHaFVExz zFGQ6_Z9dC{3J-}*m}5_hzd$+4YdPPgyw(Oq%0FehosTX#S{F5vxB>Iv-j@mcM8{t^ z0p#@6P1E@7;1a38x^F}s1&{s#6R3DI?B+(KA}v@-ldwwE4Tg0Mnl(jyvt)#3to5># zsX3X1Qk+WHM3b3b!Ad@1J6fEIbDRn7FjWKAyn>5Bc*8t(pl*jtX4j=;?-1A!#+up= z`EWS8Z;b#B=Qz1p#W1%?SYnYez?AOd#|C}|>YsgyoAuOkkki;_&Y7(!E2TX@m$A=L zGo_Qg^DPZDI7u1&a=SRn&>TQwd2lT){9Q-KwhS&5%ER*d!@xcSLuK`V+}X1fPBJAx z0L_K+8*hV^UG)L^Cep}8iEOp}pa(tGEzl~0HVqWGyS-@Z^RVlaF|0!gpR~mL^s+J# z)9xA&|18MSydd2gp#py9)!b7H(xZ~LUK(c1iv`RAc~n-k=p45IOGr4pUbYUWRO-Fm zC8tH?nH8p!hgUha!Ln%#TWxLr39@c?3DXkH299TgBpJW5{@;_`##eYH96hTZGgU5kF^7o|uezeBc?qmr=O43 zItp0hXEQ%hYmIdbN2E0>SrL0)${cu`fi0agymRvqNC(i^&GK48qh-5ysGy z88iE8{q>0jaRj*qfdqf{QRuYJd-uWpF~0R^%F=LaQTaJGWDui9y-4@WZBV5)WX#Yc zpy!c4B8br5PoBcz>eZffz z#^9qHgW?HAMWY!nal=<&uKDo9p&FF*OA_M^h<8=}fRuI95>)kwri^h>9AQv$VcQF# zKGiUCvKj~f{Ted2w7Ailr@PIE@H-MSpL^HeEUJY61n89)a62NW-L64 zoY(Z)V(MCZ(~kDN1=PEc6q?8qjp|yI#vL1G0U{lJX0Djl!)6|lDvYbOGx@;7s72z< z?fa|{tU0Xrz-R*3Z__@p*vAOg4={0SuKu^HGdIxFV)u7#x^#R&UGfP}u+wC^d6vH6 zp3wjlkH&D*X2E}LELNakf*5_^Ikv0tNpRDt-fjCu-3LlP&b#9`?8Lxx9^T9dwFMPV zex--?@}}672+zxo9eX@SdS|H2angBUXGv<(pLxC_n{eiy%@Ib}!rV*2daF+B;MB@Y{L#r%b!^sgJkgDHEF#zl5j`rxxvEMph7v;F;{J-S{Lqjh@wz7w z`;inJY~cWS_2cSCt81^M>x@`CR(3mBb~~Cvj4Z|2W z5il=fH}d;oEOj=S!l}(%Cd4wRWX!cO-0X9pv`yP@0=HXqHn4HGO6JMOz;KVU%mTU7 z3SXdx8%OBbz`jJ+L=seK%)$`}?IMPO7{fydp?!$fZK9}>61rb8ZCgT2peIysD%qf$ z860V564;%U^KBA2?r_I`y^)G=|iBe@zi@i!qHZDP!0)ETjs@C7Ha%DlIJ4GzM^ zymaO{`?_qI?YkYOF5GOCs{3}c0@i+$S8zNSnmUjQT+yH~wBxA3k*C3nF;0HU+JYof zuQ^aN_Durkci1vK{A#e$pD@jRv^0f)_6Sj^Xo^vCX5q^w#XXSk*>q#w5(UtaHxMe& z#wDfr)eUj#JRJr}4nk<|LaZne7fLiPdiNQ_@B4j+CMYOFW()4kmI8skvL=bTS%ftJ zf4wFU;sJP57Ig9oe6SW`mXVk$2s`8jg&%QNkiJw z>VG?+LxHHOkhUD+d5iRFp1$CqKw4P+NLXz0@m0Z4w>UK`Bi7c8grt+7Q{rm0n6~`nuv!(y znD!c;#>iL*jf*Lq5j}Hg=%n*l&`69B;rViFBeJ3qV-8?-h1S32U9;N|hQx@4r*!cg zX)xl_{=*t~6)NoWADK=Uop9lG-;szHIRDPw`75>euZ-I7lkRVK=U;iE)=Fy%Nc`{@ zeth^^2NV?HyTrMO{B2~RBpnddfmRgi@a}n_48D6nO7Hct`6^8N^vM z_Yd|nFL}7<7&(2uK0bkdSjtK9@nR1W;D!7Igy6O=VhmR1*&^bD1~g1Rd(Px|4_pLX zj3EZvsie+>4o+c(lmJ0@tM4lt=d-c?zgHk5|AR!-_cg~BoQFtWMgjdj2<&a2$ z4VstLQxZQg&`8jszo*bNk!R5w3Zy~cJQ-vGmpZ&XB%PpABW9#U6Vzj&N~)|6P80F# zUT1E1w-N>{G1-|PKQJ12cLq>rXf@?z*&?0J(PAfnpIe9gNf+0GqXK@4Hr{Y743i|D zV{a%(*^W!A5VPn7cvI-dE1xv{*=hu1vzONouok6+F*Tj5ke?}TT2OS7I2SqbflBGv zGGov;JiTzJ3S3+(Uw!C3gmjp#$r*nZMr@o@cFJ4_u(nhcZ{-;L*5e>*+223c%JIlZU-f) zJspIUN984pdZEjrecQ*us8c`kthB|FMnaa&nMpSmz|K;cB_Tog9S zN52r%P$$cL*P0R!+C}HvEM%9jj0Tc(;rgFkfl%>5fu6}TYD>U~SKbf%urR#g`cFUH(qQeg=zv7u45imMc(aTo>-0^C@?5~om5>9nc<3Icf1 zu0&AoAY4wT+(4lmSYD)*SYE6YSzhSU50XDIB8D>={Mv8$c86&A*mm*jFePSwM>YD) zEd(%4%kX>>#?)f|X{_pGoU`=l?IoM9mJ5g8zF?>I@#ej6Iy-IAPC(Yc%40#9m^$TX z-O{OACcnmKN0S-pO6sUVvEy(UGh?hzDXTZl*@n0_;sdz8HKRM4>1p4$?8`&(1kk*# zC)H!JUoQLbdYmWeQ%g{oB$<i(lrAO|a`^PjjCdZ;NE(=7xoLvgUr$;edLWv?o)0y~K-;qmZ|sx!~%< zce()z_}_=oh#8k$ys3SsIq3|3+wSIc}CQ&voh&`VqbCY&(G(Ft;Jf0 zt^zOrb(FHzgLwq&&(ZnrgZZb%c1)YAf5f;heVO>CFTtI0=Kw)Knnl9DPcOr^_LcrwQcPf00dwS)n@p;QbsI6--M#lM3 zvi)f!V_%?VBu$FrM^s-WZD=K8rfm|VrL3chi{rrfd<4Eeq|4HKY9HWS1%jk zlN{&~C?ZZ{eZo1^6GH5Xk9yO3DLfZ@@&e!vB#@&`|cBTHr{9A&&TQTlw{JYf0aG>+QU(U|lJ zLS!IXySGNP56y6+J!xAZNf;L7s9RF`{R(6#k)7K!9B`+{5V8L)sCJrt+=!Fr;`;T_ zRX0NOgp+wlbdA8E=8hW^lr^C`NV+2)**W=d+sA%=Jtn5noiT%L)UJ2F4t2&}-pG zhZ4K&wR%O^toTx@qQDN7LID8FGo+;F1Unm{-%nAcT3u9_ZSvTXVOtc*Ox>Mh1XuQR z%O2Bx|3%~%d{&S!dmg*2)MN;E*sVM%P!x^<$RW>`Qe#Dp^RN$rYlIhBGEaVcP*pWV zGCxUjuJqdBiq;-Ukj^YW5YVhApV)k4^GtG@okL!Lbh!0i3((3h4)|^u6_2_9kGOY? zu53-zMk}`Mif!ArZQDl0M#Z*m+jdg1U9nxcsolH3-n;wsx!?VD*BCQnWsLmDn(KM> zXpVnxWFOH|hmAn+1Y271e49MbJ;A&}`c2Da$|ISC?71X;z{=wd9mJX~|c=TWK!2spvmqD0Qg!-*65 zJx3F}WH zi&(n)-neJ%l9tg#%i{pKeDWl}XvA;w)II=Du^8~^KY$*lAnJIdj?i0W^WU@Z>v5=R zm)Jy`q;NY{*XGo>w!FpG!nio$Heo@~NfxQI3h*GSY~!0Zc|fR>4KQoiUs zeFPsBna7#E8Ztqli8tFpB=SRNVriFI_Tc@-5J2wt){9RJh5WA=BLD9g`cF;NIrh)_ z#yKOU#YQ78K>)Te?6- zwV*h7Q-|Zr`}x^fOt$VcfK_fOVT=TBvfQG)pmu*aED8#SR`PgRFf$BHa0Ys-e13n; zvgi4*HLKYps4N&iSsV28&N3PyjaG=0tJW6E8Z@z^M$2;~{|1zfLvT>m>Fx0KH3A&m zIbjULifb;9l6}-^dtAjPsSWLh!=3?AL+h2y$+Dp@r9{5ceHnah2!%z zJh@qKLGpHqULZ>~v1aJnvQa}Zy1!xM0oGP_^$8=VzrpC=D~A4ZWcqWx`coxRgK$GW z!0;h$AH9$X26nI`9`MZ>&m+mHgfyTeZ${`JAT<@Mp(@$uNb6*#QZa>@UN zbY~D<#V|XZ(cTc4wG@2EBz7IKw^(Vx9j<#dU`d*>!x}bKr(wJ*qsV2OonZzeSa0osivLrPb!jz8raFPT|+{X-?zaReVEFA2q+aC>Ku#m8n_kBQ5SkRsqCj|1_Mt zoI46|#mf3lmlQbaQewu1p7YqlKt~Iu{N`BfEnX^Zt7z z#}q9aQxf6JC?Ft9SFEIY(?jflR0=gEIxRY~ACyjJEJ;&pAfX)ou}XYm#*N9-MOh5A z2I#p@bB-trnfeMYMgBkBww_;XIw=b^`?Vui8-i8C1X_k++G?j8B4M8IT>5brnv2Qg zmoCIH)rW~P5Z(gAQ!DhP4MRp)V6kKlN++Ud@0Bp@zbu1NsA8XGFl>COQqsN*9tk`q zjiclW+3T$Gh39NLA1U{Wrbi@ClmIR*819psT=&glKJ#J6SdG)j4TWF}?j*^^(pMWi zYHZ5fL71d~WWgXOJV6&csN>JN{cc&cIfwIk28|!vKdxapnWPRTma}1s1J$jnzh~;b z*~P!A6f~(?J!LnkQfTna7&k@PN(~+no$lbnT`_vO%wMwsXoFcrU^Rs@Rw2Og=1_2I6)?9P)O3RG zuLaC&tlko1y3#ZS7&ar_VfFW&e-1=VQ6?$VAV z-WYZ?Q^Y~l_oo3nYN_Y!3F&6Lw1j;T4-@is2=R43Qefb!71qgw4PlLEaH9PL4&i%} z?%2)~i@Xh4D7RS36zu#BhTvknIAQW37c^=)09Y&r?n)V z!JX5*f)V8F}Ul zP*(FNcAs2*QYjGottk`A+@P60T;=v3%FEaePi!f@(rSs>@o%24_6u~fqJ zCOY#}{iUWQPojK#iQRy%=VOO`Gh}QoQ{~xR{>K^jRF*&)rVhLw*r1`Hu~{FYqCLJQ zN`cqUMwX+!$DQ298HaJ_{d`ll6PFvtGd>?+^?TiY`qlw;#)~m4_F}vyoa5yxIOF*? zTu-&#qh?AtA72^8M>54FZ&-cv#<(52%SKfay8SG%^s9Um!vssju|>=%(RS^KmLLrl2cG2!@J693T#>yW zMb9BKE<|>0`6y59gDr=x9&b3{R?E}$(@tEC&%b(?0{x49u!c7V0aJA@U82z#^ki*8 z`V)QAS0AorY6uqOFUv{_KRYj8*n9Tfqn(mr7gfYxXEzkfd-}3MgHV!Ep0kzx`ThTOB8H zfIGc{5PeyKsp?Hv6~d;YHSxl>Wff4u(D2iocOtJduvP3@M}n2%@;;mPHk;PWrf!BF=S>8(^e^Qu7uw6}aAQsZEI!^F7}DKz<>3c-1E4)wXc_WiwOl zuzF3{5^-27qD|f@XsBaY=CPKM$%PdacPOti#LjAd7lI0Z1BcabZ zsQh1aZ7K4P2CK`KPC}(V@Cxzwj#8(9xE21h%d+aTknz7WAYcD=Fp;rU zbT%~mO@au!85-L;ncLd@V|V#4jt79|lWD<)?;W4&8J_By9_cZOPfb=g7#{grwiBPI zmQ<1*pORdKr=^gPnru^vF*MS%n~@ziHqvwX`FB56)6x?(kmFJkfROcnd=Ym9IZ8$) zE^agS43z)8_{Kzu&6AP^tes|Nl$0Fpk^! z%@GBeVzCB)FMv6~gG^AcgCvrp;TI!fQz&>-lL!^EEwkn-MP;|N?2H~Uv=15pf$RA^ zvEh(9?2wQitzBQAx&6VUe!;wI0tPW#o@v-&4se*p%DxZDUayY{poLaT<}bt?}F<+>Fi4Yoc=Z7-wLGB{6AhjwAHnz3&5sOnvV4!;aSegO*bSInlX zSC*z-^l!qsE}_#d>zN{yr*3#FqqQ>KnQJDHalHko06YBbS@uoM=Ie& znK~)wjI7|;zW%rYBC&x~D-wq6wtq)sG>5D|zZVV$0IE}RSD5E|9|l93P-=%ubCvBI z4&9hS9l~%r;~+D6TxQwf!MovtOkxp^qkpJ6-d%B>Nb81C)t`0p`eAYmWYmB&bws&q zv|k??Peu^f#g0A4)|&ca@&*kn?Zr4tU>4n9GkxH&;nh)E2df7)0gJptqgEr0rOE^a z!tzYX{w>jq{HQvX_Q)&9i}}cP&{HF(wmVm6X}T>%Gn@k<|B zW~Y?qxBEY=(#%0@dMKaPzy7}+?Ebwp^)F`FzhdjJT)q6-?=}u@$#LO|U6>BPCA5;T z_b)JEadF?_d;JICk*HemnH!mxE#63VrHDv)o&bCj>|O8;py9ad9S?} z&qxsjT|njcfvq5xqYX);wLvR=44fxah8rr<274%=9f`L*!L4Y`R%}L4ZuEqror}>9 z>dYY+`o5R6vMLBgSxZbm&9i0h#H>T5O+PwC<8WpnA!D%IE_R_|M%yl&`<=I~SH1>p zm(1CqX+T?ycH=vj{d9Yy>NvgOpTB4uF!RPuLEDrp|2w-(F2GGZK+t4zzuCaYaHmehZ$GuZ0jz2^;}lb(zL`X zvM-+-q^;o`>4GxIu`A|_O2`sIbWs1zA&Li6AWLyiEMHDZygrn;&v-0+K$P6%F2I$J zn^j0iwp@_R!v*|a`Hi9?v`r}!NyAAspd(Fe&%eyPEULo+IWpX zS=p}g(>^E4ozLsPf7-v~U4BoH;x@{T#{agY7|Tja_VdAe&of0y8^c)8Fr<4G~u?Xs_5TbRY0T;=Td=BC}@+dkj+jRJ!Vm9( zR5~Dh&xB->HhnnZMyLwQsGTa1Auf8ZZEiTdI4O|Pg|fRMQ8_fl)CanXpaG5@4*ptL zrcgTX%&lLev6nsgJ?8dVZFiU@67y{(@%FoXU#lU9eI4-NC>Z8tV@H22RLmYTmJwAJ z!?@%dGpwa#PfYTa3bp>Z%dp~Q>Pp3t^FM6CP$Zw3yif4h|83p*chcuCbAy7u>;EKB zcqgpyJj6i?2%!r*VCJTjGI z{f*f))%ib+@?~lR2%kpz=MMFv-$wa&kysYWBo{cz-$wZ=^(1u(9E^iHb=2e781y!| zbnMB@OXg9}Oyaf-snOAfjERxaij0ZT(T)tN5pjZCs5=j*l=kI3n&y&m>Yok~ZR>w| zOF+6}P?*4~3iY-ZQc@olG8C4JA1;Z>fqovzB0`xTG&^Bt;6%@X(TTn=6E)6nWwG3s z!>4rb4U+bh@D!_$Gcb)SJXL;znMzt@Y#KgjcsD<3UC^!zhKDCkiI=S#MJ;3HY>dkDwoz9Zzc)R3eyvAR9R7$rK7_hVX|`o{-0o&#SlQDct@VCVrRGWbhB8{FeY3 zR>6N7WtCJLj&r_^%CbSG?QRQ9==-4 z0b3IY33}O+5k`_L&dF#aW=CF<@E|hJ3c2qLjvNN3J?+QPU4uQLEjSi0&vC@J9%Wow zJ$gM(J#Jk-ei@)I+=h<^%iRt1x48=~RMo#NnCXL**=d-00Y*j8=vK?~8F&jt@|vns zh9-shIT5EVq4qqWym!Hd&*r)1k|aGm<}eXxtT}~@kIas~@Ga`A^bwl0%Y<5!dtpPJ z9_nFa5H_JgFB2-nrr5W%9IcLIW>p+YTeNpE`2CTnTfoP9sp241rVDhHs*JLUL&=~D z_fbRdR1Y@I0{UJ8$-Uqufa;tgoOfv?T|R+ydp}GyBXp10IoU8gKQ*9QUtS;cVSZKlKI-H*-h3#?8ZJ@nnXs_{D6Y%_C?$P5H{4j>acf=zWQkhp|Phd zNGTfjR8J+Y6l&AAw-NN%Cg*~0tu%)$|2>O9Y}zitI_%oeCbsFFfIBj*sMl-)Yi%vK zLw@O2Sli&$XBTeBpDJ6a&C_|be7q}Wj7xQFLh@kaiQ(2k)nsDnaK7LPGmW`)viT9Q zR}``G!yEuUjPa$E>I=y?A;HpJqxf&crO|dI4OEaQ5~LF7AveR{^b?l&)pbMTyRqv>P#($*r(AJI*cbRsxuHq6# znD(qpjb}U>*7$~i>&&jeEskt*^C4a2h{qjm)UdM6{^vFi?JHP}^t%4m1j?XlCY3c3 zq)(Ntb3IXQc;8tKOH6mC6rO2YArc0z zeb9%H5M#7)-8{s+Qc)mze9v}%*{X3%E328`I93sXQa@Ro`A=(5fXlu85!{1H7~pgf zIV=RNCf*q<5P+no9&8@IKIwTXPqahw8`YrgXJ%aL{#`V?({8@|Az8I8$3u=aM9&$p zCZrUj#M$b*`@|PGHAimbV235D8PS9jB%7=CDMhT7A0gh+pPQ!^c{8m$y_nl<`9fO5 zH>GUdgB0tr>F4L5kL_Z+6D#2Epc9^p>qt(4m2Gb1;gxE;<295Yeb6z~>qDJd{mCh| z?}+~h)D^{=#>{^15&j;i`*(Q!B|h{CkAKC7GzSr~8jU5BK5MlNIm7k_T6^SaL|bY7 z&zFV5GW%UF>^j6~qYwxy?V+xj$dx$glI=ob{hC#`^l#te5QpLLny2J2!K%_q3fw#2!oNZvC6)^;eun z9aFb}okyKjaoe^NYTCrPHL5Ex*7sRSWAR;_U|#yS)E!#rONNf&E7jm`_Y?0I&c|Q9 zkRPL0w87unPk438^5NF+bYs5KN+Sb$$@j>q5oqO&5Qca5QFBd@>tA^YkvH=kBN28i z5R9RZVTdq98kFdj7@<$f4a!Z*^=k~b464ym=dp4dU~9;a(`DsOQIoit2c?Xxo=Of9 z(XUV!xs^iT!Yk(bZkkZfqsthwW#;?KolpLf>wy(`S3$ zavS)GQr-162}{u)9wfI6Dm1H+mPDY^H1l>OsAW&# zUd#m$K^9`-Z-m8ItAi((7*IxeaPJGxWfFy^Iuu8*b*t0FR=o?Q|FU^uX7$aMs-h2; zaISo8Q4-pUrj`_S@J*q#snzz;MtRsKKDc1yrV6I=z09OR6fyWSN;GA%5S(IT1l?Z| zx0#aUu)+2U%CJ7>W73}fk|?IMf)eDs`E`g;g2@3Ov@iJNGf8xSa5V+5v^dkHdZKzL zgi>h=%LPB{kyPtjE^JfL!JSun`r_eQ>d{8c)L22@N4VVKrinixU+B1LgX;m*hf1yvgP3|G%unL4R!HtxC1 zfq}Nez?>zlnny9wu;#f*8pFm36^#wu#u?qZ28m-fYCFkgTfW1xMrJ8dr&pBW;+l|JaK-Ug^UiWMhNV%6|uA|>ke$bqepUp_|pY0wR-59vRP1sq@ClsgrGfp?1j<`ixys?D%0De^ zq0JN7Yb7EuVmE+J8 z(n778fR{N4Bu3Ipy@5`RympWBI|B(|@q1=RULHofY7wTM$U!}zpW*pNKkk+kl6UC6 ze;$5+g5O9@fP}7SQs3>xBo^YuBsJ`foUhFj&InCko$U!X3xLPX2lsM}j`J}41*Zok z^#h{^ar#xPaH9mxT^Eq&XD&BS_!Xch#sj?&h6e^y@U3~WX2n$)A5zZs&mjFmAlr-sewo*@!*5* zcK(`Mb#|fVdLBeN!X&to+^Ohh(COr3sAj{{07X(~s?FW3=`nnnt;A4S3=cF?{I+z>7xmT;!orN9+P=bin`KsjgmhigV|m$=((ADQ}CNUEKO%} zySnH-tP9_>IYyW=)1)%H`gnh>VX84Y=@@$H4Bx~nwdIDd&JG8xz@vlJE0R4soH;w% zhmlXQ3^L~Fj%MJBpHeFFUo8r>SbHjI_-JLjuQ}y*D*n+XlAacx{`)cevdeag25!+|(#Y}ljB zR;m{5&FV%xheVR{YXD!65B zyqb0%Jy-9Zix=OGdw}*+{sa+2i5BiUN!2?5iviX<8L!!x0>G-=WA`V%oXTwiYRv_M z1`w@iar}WSK@A$zC8^A=N$#C|mClWsb!tm9nP+B-sVW|H z!mH$ywI}>p?ENfE#U8<`5Tu+z?Ttiu z)cho0Hp{;Itb;gm%TrJ1}zM&3r!<*`rDvFzqR~In0H|f~b7B*+yHWgXJ?WHshJ> zHHF{lq&W^|?3ntWvqeJV#-kG*K5Jp5T9Dj;tYpHY7%M5soYGv-u1GA=o)0ci{dF1j zAbnOxP-*eWoy(1s4~82WbhH)x%_E^=}u`KdYm^0WBmRnNf85&T=|%PF*^!N6cI) z+VNyFZqymvBVIuz(H5oV5vtvRw`z-yCNdwOY@=01)iHz2VOq@{G#pZ^-LkOhj+sY| zm%iX^Cp(r`*_ZjCm2CkXQL-y9u_<@Q5WSV9M!GSKJ;YLIu5I4Fa zd~oY$+0yz%?EB%bvk+CA0df6O8oaC4Kh%$4WG>-4kEy&A+{g-)v7W0g>i0(SOtJ;R8@UExUsC?-|HE^8EZBj&4zok(Rq%ha>sdc(|LAQzk%3(ycw&W zj$`$e-A~;5PP`SuaYLlrpOaNLSF|XBwT_GR9@M`O=5@9Tczme(`TVX3S*_59*3gb! zgZ%?yu}sNW4zSpmt!5>eI_-#bY-0^AahhJZzTy*%bT&;LrP@~Sp?BEp(@7CeHA|+Sr``#wgL2;yzSOce;}X&wKAT2XW06dYroLly+fK=Bk@oNZ zBKr(5Wv2-1{4~Gk@iX`?XGdKOiJjDC@>heU-ignLg5ixo3AB{m%U>yv9+YPMr(SM z{GuHZsgIAF&Y?e$JdX{;a9sqwLrTZ0e}bOWz}tVfW{36%}bc2lkVRECMb<7#rT2ZA0H;f3fLe?)z^UDrZxW8rOiRSL01JTK0#De~; zBHF7$8(cra_p_*cU6D=GnVG25s_QO&MDCf_fOsZLxzeim2`uh5#F=GQkTJ;GRRclU z&%*V!#*Ll%Asc`iJ?dAihDh`q8Ac4kwIAIaJzT2Un*kVblklMlqGx{*7I4VK$3u7G zabLMw5C;5GHz1Z=pt_el@wEvbKR4-#Wr?!*bUuxw2f%$^L9(1GQD@{!TY+#VR-BG- zC&`KP0;}USR_j}{!?VrNnXAKfI{Qa^tA}RmyOQHeR>9?-xnB!25$98L7$rh|=PS_2 zqZ1Qec(05;SjZ{D!c{j73CxlV?G${R5A{uq{%PW#&n5A1th#KJ4#KJMP#z32U2e;>jKK9W* z(>!>;m6bhCMFPutIL|}xDR#%hjFsp2qa)fcARXa^k;U|ZS5j&IOd`P3gl_mXI^=1C z{I#kTtl@TL3v=1GPy zvS;%{jh)KX;Y6(H9X4gC0I8!)Y_lkY0s%h8Q&kK#0?XRV!|-*_pWnKSeH<{#vt`7i?DCx6m*O=2w%G+l z7d;7XVXtW?YNu)^TSFuUG3RgG8@}y>?Ckcne31-yR~|eS{s(yPf=dz~XNQDoGq_)+ zvIxcGvYLq%qzbU)o3QYzla#=s$S6AvdxssY<6tjQE{mgHGGeQj0VO9hYbRf*QTEDI z?!o>;iv_*uQN~(e@Xoj~VT}8@lFt^wg0VwWqmD8PDhMy^@Pigq&#Y(jzt>NP^NNi$)UC zMTWGSY{OM5#>R-d)@mS~hcX=}ZeGFpc7Z)_-}c5NFk;v|O*^z~F1v+I&rV z7=|IpiD_Vl)BvdgJn2uupP!>MLw*c@r}s6OMhilpI~WEUp5uN=swCMFQMAbWI~!hw z#&mOnv%!iCNj9$t-qx`5n`DUyU-W@8p9k462`fu`?O;@;jg_NeI~M2qvU+sX90T~q zcU8)6&zbR0>spqhvhSY38%)_=esSnvKruL!fIkI)VU7SiGB7YvC?o;x3aOScX6W?| zDS=b4#)~h>OQ_3Bpv_C9&x=3)OE~>YFvLqV#)}_F74e;6&$-EWLVM_8UHk`3W;9OG zLdlmP_;-<%(_l8V{558ZmC!CW+UhvClTOc3eP~Zegig9$^1yq6bw%)#AbHtb3ED_^ z$V88w;9|L4v?1=G933$?NPy1ocgSM2Qdivfvd6+TUd6$?+MLBc^;rvKJo8y|WIVT7 zKgf8HvS-P77_%42coehe$#@*Im&kbHyG!N0OuBRA8|LBkY9};XV4uOZMHzSxtN(13 z63>859Qj-`nEuu(_3xvC@Gq*tAEQFy_s{19 zB_B^h7DkM@JES0jt_UhnEP|vu)EUM(i*D#;wOkSk(`&Ii_0IxIShXCEc=j0EuG@~s zwdzSoU);!3HeW+bXzZogXjps>XP3{!TG<|v3`Du4-e=(=6oP83+^nEn2S_oxG{R5P zqYZ^QbqSqOSm;7gaE*tmQ|jfcc+(#xdmNi=_=sz=r(F`?Nsi1EVi69)#UfBK0D;P2K&0E*li)(PoOp_%j-Cy(e zIDIO!G~c%PfXRXG!OM@CXF_~{fW)xqX03VzGzN40@H3d{sJ2m=FwuKU{OAiHtUc3X zUKsXhk~=DfD`^lhe+5NGo~}|N1!>iqp+STQp%D!7%+YWteV#*c+l8_sWj3u*oq!bzFTv*2zBG*}%E11ZO7V5)8$(hL$(PnVP z?hYSi@f!DWY9?K?@vX+Xl!Glsd9FjqZHu9vQ^>0YVyW1>045a%vxUmZlXErk85=lz z>1?s?;)cHk(RGTTb@roo4!dg%6Itt}jkWNnw}@+A9V1=HgZ%EGoJ;mrY*upJoXT2u zH)~ICTebGyKtkiATmxvh77xqcPM^3g_T&A%T>|Z~HvTP`dHrp>^zYCo`X8bHKZs`W zpXNQf&(xmGe3A6z&@x&L+|Y>H4+%{czd+z!e~1DJr1;|otg1Ra6BA%FspH zjH-1^!9EJrAzd_*D{zSy5ZJ!LR66QriR_Av%4Bf3@%8^&L*uykZi_B_?ae8v2@SG! zoSsP)Hb7Z=7^2k2 zOurdw7;Dwk&xAtWA1ISgilGvv8-%s?t`LeNH6jO-FIG_6j0@aQ-t6#dJa#7eqtS?g zv~@MI%YqQRhEMc(CU!2e&F+TgPO+dGQsy0NK_gI@cKe5q-{MbReQ(wY@D)V&8aN|S z`*1ez-ecED z+&-xWO*&mWrbku1y#2L+Jyx^JX zVGI8jz5VEO9K_0fm4tV*V~zL}0JeE8=*Qn7c_r%4i_jr@W$NDz|CYGzt#Au)|4XE^ z8_Da~FXl}S;upL<7M0MDLdIOn?5N3`;frSQ=O*Ky(HZIZDync zmvUE>UB4PqUf~Q&#o=Qzvfwuxrxsfui z%6Z6Qi@QnyO5rO)c8= zBhmgtq*~t}Rkt-kxJ{wGEiTHj&dR5orQ!yGe((y&;+Emz*Dc7VatkYsB|i3IVK6_n zIV7Oz(5KbYL7lN^i{Xmv;DKa`sv1QGeF{7-`K>j(8Q5f1j;_Pz=Zjdkz0~#T z*aI@GjgiNrhKV3lZ$yN&trDD>X0VnPQ)VY4!qO_>2&-w!E->T>5m)oafe@SfiuYjm zI2XyLrjIPJz+PX7V4AJaP6CK2nZMG2VWTcfcT%Roa({N;WOqJCog z6~Gl~OG`h!LJSKG%tcJ&Q!z8PRSQ3aA@v>k#;_PUX{Jks z34%N5B4XrP>dk>YYs_M2o^ahx>O(<`Njb+prAfIf_L7%Jy6xf#x+$rULYzkTLXDYS!9X#7Uq*^1T~7l_QOY``F(Nze z^Iw>Vb0bJrY*;r17%G*SrpM>8v?{%DjL0ZNC!9(L%c!FC~m{=~gJt20H_ zalG4s{9;NgMYT`~1N<&086qKq=zSXIQ{av8tpt-f-{62mrbbyw+d6B9xVcQFIx$4o z&T5h$dS>?tXb5H6Euz>zxizKN{7mjJDwfB!HVt{!|lXr~rFTuht7`;Dha zvkVB!4chxNncJl}cTgkk1rV0ZF@PlBT<}xOqC=2E*kI?aO=>*YiXei4qE?cM1R_Es zPJnvSqC{JeTijhWF#phb|55?0v1WndwmeuiO%l!bOHA(~U}R6p7oaP00A&CCf%#Hb z;9y`kWLT&xa4p&%Tyz6D$DgbK;+;f%=ry29**EH6eSy6J@8$(KA&mUBf!iVSfGK*3 z?MlBKDPB^vDEMM+dq|O;0wd9{LFunh=jiMA}#1Yt|kHIPFidgNSg(Ov>gIwrP$SR%fX zEdqGj!=!JD2ao{SjS^O39mR~y!)SJy}fO?V#$^{tQM<5Kj42J zEa~2p+qMbKGF(oGtJ8?+L^$rXiMemb$3KcNFsWr(%3`E#E-Wvs7%G~^NM~}hI6wUT zm#?vS%7bF*9fC-W`YADZZJkf-I>78o&oxJdK)%-Wiz=H2pCV!i1(~gDTBTJ}`-DsL zipZo(j}=P2@+9gwplz+*waU>O%VF_t2)D=q!gK%fw=e6)vbz>z_QrCmbIf@<)7?&zz99pocy1~y)yrfGwi_Omz{z-a~6 zZ@q6zR0Z78*{!f0yk&8NGNw|wTBN`U8uNj8P2b_l-^=m4x@(ryHB zxW?0SsHrP!Ti^zb_fOnUq;Qa6W-mn6X2fsZ5HA6x1LcY219<5I?$q_`s^-5Wg|6AFdPdv=W(zl##bYs52ZZv^FD8 zV?_!~DVlo&|FmivBXF;Oqi~`x2x0Oqu{0NyE0h)gQe}TLQl|}MXop+tOLK0qjcDn# zF;m`x`2av5Rto|I+8koGXf#4|sTp!%%Lnkn9kMKLz-loz=7qTZFCXam+A|@Vkna9y zh)06W&?YQ{c&SqdEt&ZX!H$(xVVBldjQn9R28>Q2w+J{i8s~Q7DW!E#@gorJd^%$D z_-xxtG7kq}cCZS!3fAd|g)z=t|2#R=3L&tzt0UZ?(vYto;8K*I&sb)RYa4S5kJ*_p zM2{Vw1(EGRc0&}sta(U}93souSs$AZbu|HBC(AfN_6EJC8DDjoU&S!9CRRU%%*!=C z0R>|~f78x*^JaPyj(m^N<9GuW?M_*-XUvTD#9;35&j`Snr>0h^CfKxoHV7u?h!%qL zANB@cH&@gVe2Z(8uOkW33`lq4taJyfbVp;?oidABD}CYqEb&*-zEFDSDf{(>U3c0aT{Yl2HV7c_aLOB1`r73VG<>8(ZtI|7eM z&%8xvU7li38|t;qM*d7k+OOdBGaarOFYQjPFTYS+g1vB>XW8=pO1c38a-09s9qs(4 z9o_x@#2LzaGiBfQdNZTiYe;wcWgo}C9TscBN@hb(!I7+_X+@~ zCP2^?ik6H_5Y-yynr!C2s0s|&I@Ff*${?^64!6+CkUcA)483!^IP1Wp>;7Hmw<@;) z=U&k#N=axjk;*)0|1(4+g10DT{7(In2DkMxM^#CLX%B8OsDyW}uPN2A4 z?~DB%R?2f}$fPU(?z0)SM;Y0**KN8(<9H0Huq~0uh|UE2tu1( z5L0F47{5m+laDVt45p;jVf0rSQww;z#8w&SqlbIrNEK&;t0x_X8kOX{L!6x6jq7(1 zC*|+R#fM%u%BfnX2a!l~Rpl9WF1 zlU)|&B?fx|d3j7vAHjBb)Qk9{gMhKjz_L5P5>$m$B1^XKt6vD5MN?r3h>s*m=RF{t z)*Mm~e0nOdPJsTe6uyeWe*HY^!e}bq-o>d?kB66K0M!@%-mu5% z7R+U8uoJ^Ca%U0IYdvhO#AcOAvt3x=q%8P(pyKT8ShfEh`tG$30a3^V_9>*TyElSi z=>Q%>0=ruKm3hkzYY8}#^1!l|F3CK`!EIDe`aQ*ZAsk!{*JIW~x!iT_HoW0qL|6Zyjwfszz&0=}0XBGD0xMES;x=YJb=cG7(!oc@CSZIq@FpJ;0RL zq>(qIrQ-lJt#yo?I*~ZNMStP8W`?=K*bIPM&_hDMS0Avf6M781us@jyIt%AG)L1NQ zDdBP{%OJ1~?wmCX=YP;GcUVJAh=|Fg9^qlzOm`G%L%YtE-*HW?VVa(1_q#0>jCl1v z1$gQfibib=s9Gdy4LXYWkjUzcJ8%b21Suv&L|g`aVo-4!&LJOp1 zVCmB0nQP|Es4$AKTlrV5@&_#l%~;c9hql6LG5p;3vS8a3XV$Y@WVa$FD8S`aEC8H* zo*^xIm9i-T9&83Gt#F42+5zXuZS?|C7mw{!b>~f#Rqw z*?9@_rz?`TEAs8{u(vd!&%Z)F;44o|0ih@U~YC7!@1L(r5%+MYwW zeTE-jLfqz|vhriS{+>GkR9?jwtvzVZ!5UQ~_SF{%ZWa}a2da8L)-F9;!9LAXB$KL3oeG`DSZ!f$LL z>;IX;hxKpx!at+zzcF|J8Teyrc%oKP6qpFWl*r@T7nqb6pe#SkEEKarCXp$`l(WO6 zYGq`Fl0m#4ghfI``j3FI7gsD6l||^8&z+ucA@0TB_v>doLdt~*7?M-_^!-#|2A#`!&hKV8&^$VBQM2sO$>FRyCB}`SwQkAR9&KA73!7Z$b~@c23-E-STyymzUZOV4$k=w1 z)^11czsydg#XJwYqRF}sHf2aT-=*SA(M2^WPsii$wu>2k90eY0j870cVWRvx8`5Vw37h}ctr;_bzs|0&RWo5x0NrMBb3PQT4a*wGeei!L#8% zOnVOU+=TdLYPW~D;WllJ^g2pqdt2X z+}k%qW&7VCs(*Kg68+zPLjQjlyy{#%WN5|z;_xW`r+Lt;*6csLgToq3Fr|$D8pwyK z?DuchL24C6z3_jmgX0hXVjWb82ndppWORIxM`>VSq-Ui6$-p#w7D*imLk&}j4*T0x7-(0YjZx(|b z3YV(A{i16dJiDX4y1Ko+;=;yz>F>4_+`;o}#;@{oWmRQWRb^LIpZkX|TyB^j?vWgO z?l0RvzwG-RZvv1%p}!n~0=$7B1_hl61%*A!fmT6kp?48{p<`qD9Au)y_5~ex$;nP{ zy7Zz+p%OsEj#K;P(EuZMQbl3((w>p1dYL~CK<(@^d+qblvk!Zn$fO3wfTR%d1#4pt z*pm*J!EtA9LCB2uoWQeB1GQeVf0#hUVfc?r3|dW!4{A*!XHp{MvkyAINCW_?W_)4{SPFfrLi+Os`p#d56rP;Pg;WyFtAq~ z9_+M6<|gWb3i|4j46#OBqIsh)IBa%LPgeUFdKpIR5)MS738M9*5u@d!GuUm8SBLDO zN0>Nlj#{G*)Ujud-QY$XIkHD?(XeMuTC)y7vFQ$9B%{&nJ5vuxu<4H6Fh(XgKEn@c zI6i|9P_b(cUo@jt?K{&CSg>o3+;B#4uw5NGvkzdgZ4X-`4s4=-vu_XD(~Wpx+a9|? zk7#nZIBw3|vPSnDxN(hev2Tyv(nh;Fa`)ciMuT%~Pu%jxg}mde9t4I6%lyu=6WZ+t z8D9gI@kD^P_Y6H4$ghTTKXS6A#ogu3Sl8!8`LVU-0drm z{720+5R?1jV{lGTB!do{L0|%?Z_2M-j~t2gY;qjq&>)Caaasm9L|lfTY4CY$N&C_o{BL$F-G^dyH9AV-ixY7c%RDzxZ6Rn$Xm?EGOd)!Sn})__R`ANo zIg`Qi@Nh9YZ!9L>jR%k)yJlhFC8+`or9Tdie+0ePAgEFkX#Q)rp0|`tqHxz71&fFj z-rCW9r+0;3=9M1vAq(JL$UU;m*1`-a7!XX3mB*b|*_UwxFg9x?fZYyw#(8NBp4r6{ zhxjVoYk0{7!|M%!^VAtYyAg)f?N4F(VCv4_tGKBPu7SMa?9SWEcu5Ac?Y)4Ap6ce4 zv~yG&Xt~9KTDl1X2x)3Y#e&uJU0`-cj4*q`^O82X8CYMLVoNS0=HZWhD6f(_eBLC+g*6c@wq|R>Zd+ z6AAi5ZXhQ1<10dKQ1=#jeMx|K<~01U=|$jh>{JEnKyTupkbgWn)YjPdiFJ*I8>dl9 zLNl8#741CS>Bu?QKTCvspQ)d4eMdnZhFyV;J~(H8hxr5Mt9tL`B?$N{Z!hH~3AktZ zCa1s7_C^!-iv+-Ef*%^u-YH@#WK(7zaN>kTP_9<7?PO^LvB09%8J&Fij8#{sWN8JV z89*lll}R-fXre@&f2g#mf|i`tI@-@fqh+r!*Z1#VqMm|tK%Wh9pWkkQiKCu3XNm!F?Y2TvG; z){OHRu7>7>Vt#`A*zNkTeB`h@Es2p!B(d7x)TuHxGA-;XyM>iYMy8n-1^>ON3h)!D z0km6u5>^)%@|W0>6JPm#Bpp4nB(X@2GcpF2U?k5)!s)gSAm27~A zx{#*w$OrGV(9+V0%!ARm?^feF2(DCX%EF=rxy#wo`=|bfcE;VOz7G_@@jnjmPGVIn4#TK$8dfd64IolQXA+Sa3xew(fml3&Um+cMeqyA>F)TW58v&nnoK+5aG_cL< zB)dieoTZ(a!4e)yO!)2cN8&!ec0#6|l3OW*>hWl^5swvpb1Q5eV(_F`Wt+-9z*G*~ z%c(EJdSjJfKM9cI^nm9`(S+iUsX^n87i)G(G(rh9F5_nBLK>|Uds|rU?SUGqf$?fy z05U|yK!aPzxj*8Ma`72lKQ<+EdsN~{9FDL0x*WuPXUuWR9oEyGX?sCOD}EzGCXP7Ta^F|fk?VzuN)@ZcD+;5CH5?Sd+&KC#urIcTS7chC-j zS<0khT$o8#suVW^aWPxa;Nmp048jPt`1y_M%OImWB!?;TIt2tgaK*GY5{hxRLVj`C zTF7(%VdW)rQz=>^4m~BASBL-pLYMZ?)#vlPc(>G)yjFSqHn9W)l*3XG7`g z_)GIi`DltBTZxmb5|(IlCkvRVt>#lpdcaj8L{sn-wGv@8 z@8q3Hjwm`2A+PEN#cK|soS6wGRFn-Jmprj@`v`Ni2edMH=Fwex*TENB+*5PF)3{>P zlA#M4X$wQBDcXoT1ulG}NxOtkr&$6+qwVnVVj{9vekjf0q}6TRXSYI%pAA}JXI;DJ!Ac4FwH#pxed{&_{^Tjf^6UszEQ!{+ zm`bHke`ete;$+Cnhs#O@Nu&KdrGnH`!JzG^7kAy%f{^h8&k%-ST7Q)E<7UFK8S-)m z2HBxR?7CA2tBQYF*WdrlmTK_C-NF2WVk^?hE}1h6j(knFVxAz?j;FBXj%@v28cX&h z@FpV$aJ!S)1(IEhKD-47#+3z?In)s2gD=#>a^HZ%I3==O5v28+8T>JIC)_E)CKt61 zIkU|4aPX#QF-4HNoGESWeFz54DRO$ePrJh zJz|SoYO?^GO@a7KFcNnNX)$=4vYa%tJz&S5_-SBv6wzy=8)j5+Cb$vOmf2E0~ zR%?8*X$DbOtfC1QNE>r38Pv3JQONh z_tI1)FS+{K)|U(0>iA+O18k~3T6(gbyK@eGT) z1nraz77+tgNIjEmmtb2!q39Q!6y49b4rH zPc5Xa|Ghn(R_Obl!6tah{#I=c+*E)Y0-QcPw_n!{HEuB4Ekvh(Ot0n(d1pXOLW^#{ zs!1Y_GKw)cPD{#|wO#xsSkYMKbeD;6&b5uoW5U)H>t7Vt25mZ5Hm(QIE0b!~){KNd zZvy^sUU40yDS)TfSejO>NED?}i6~0AADr&beT|#U%GO~=_6$YjQSnWIcShOGwi5F1 zyzG7;in%`4Qchw}$6H@RZo#tq&UbktN0VTY$LXd%KCWMAv|LjRI_L-`5NV}jB*6Kn6^_{;kGO4|@(31>xfXV5 zjdyiUr6Qb(=0OcAfekW&j%^U8T@WQ3G}OyZ6)t77_^5ECvWzU4LBmjabq=v$B)Q_G zx$2~PsQlG6q^Y?%BC};VGW7Dgf^rKp`0Nt8l6H+(1gV8JM5&d(A&XCGK%BSm*+pzg zQYkZ~WEM6cqL(%xqZhnDMxav?wBJ1Zksn||$j-edoQ>6~A8}016_pp>`K0hAt7*tr zTqGR)Io2tbo8>EMh?fBX%ZSh>;iGldu_o(e%ZqxLy63_?nt3_JJMx8D5&csseX|Ps zMrm|TZFEjaObw!MP#ZRjAiyaaMxg>`zKv1rWQdeqRpthogWn3{WCX11m%JTq289|8 z_8M+NHVFwWI-z}D?2ECKL1bd9S!`EC(F1b`g;!W?w-WUwV_oe84Uebd_@~4;Z&s#0 z)RzXtmk5L|L0}Dv{7Y46zcM3~>IAtKQGs1mWWO^b6qgZ-%Q(3fo#YXiIwjk@;LAJ+Y<_H!pY-R^-Ar=WtS;M4jI%*JBXQuJ2LdzJpsE$e`Wj? zA36*q_Z`Gt;h~275FLM9kN5o!hQW=5V}FY8Vh=5CA$LH3E`63=)sBW+0(4Ha=D)xtI5n z73Mnk2>n86_QE(hpsLT?4R-XxNj<`r2e|`8*9~ln$cq=#XZ*sO^*ORj`+)$rD{4pQ z4Kq_K?4)<4R<>^e|@JD8e3bp&Du68Ru@6Ei>4X zpxLNdY}iO-xpX1vy;5PV2bKuLQKB_`rfR7d9JjtCID&IgJ2Q+a)m(i)XMOVXfP0tg zO7^O}GR`S&sg+&&d&%_3`_$$U=vBr$+^vwKr&~c+YrANRD*RVQ{(Je5A+3nrY%h^- z?VrCkpCsOlG47;U$2h>MIaZ%UvDQ2!QElC(pl2xuWlfbtsF|T)1x?XlEnl>_Tr}B~ zRW;d=RWjLPtx9Q?LJ3V_sXOqiYWPg1U0wM1b(#??Yz5dB5;Bd)Yi+kO7YIC?>2v=c zus{0x;P7uu1~(xw9*114MNIA=`?3QD7Ff7J>a|+?9_cc>{8cIQAPI@eu?3lM4Jh!7 zR5Z03XTB`q@Y8ZY#ILZPmTlghOXhb0H|WyuFMP-+i7A>O*b<3WpH$l!I{ds4bmfmb z7qX+%Ru5fvN#17c(`h1IB2?B z&bCtFW?0v%6Lxh zux>Sp0!*hRpG`wQM1D3nSOu`suG7KzNsTo|f=^|g1S`(vteBIYGt=yo(@AtP({$N* z=bkOjccj-{q&F{x2GHUctyqWzNKnWz;5=J%PP$NTMCbJ&h}Ebi@1b0H6zDU9$b2aZ zJjK#;sqn1Y`Lk`xGW#%|$q`uav!B zEPgm!d~&k*WTp4WOzD!58F!p5Mj9t@E!OF7zfk>+${zj^T|75)YWTny&ESE)6-g9H zFpO^qvc?>3$Q~_$8RKRGtnRlrJArn(e}Ct^wLX3=>x`FPzw_xH%;;lHJlkQY>4V)+ zXV4aW!0f6Wz$%7m3o}8p_CzZ)4__SN?eIr!*WbLccd5l71}(({VL2j%PbP7;VpawcT%Dx2w9=TYP90bbxV!u!>f+Dm=E`l<2 zf}em8jTRhAphl}dg)DmBNHE^Ln@wpu+VX{Y5Yqgg3Mi7o9j5QY!3v6m*o-NvgxJc- z_t{PjRbuS)%=ck?M~-~_O4P1lNOM$PYR(no4UZA*1MDB>W6kZT0p}aCUjKip&&mD; zw*H@^P0`rFT>t;<&S+BAw!&7$;91H3ZR+BJz2d@ZV#sBW#I-iHT(>pr+-@&bFD}*c zD63(ck%M$I$TeuV++gC$+AI%6sWf{GS|*okUI9=-424lB8jKE4Pr?)yE3M&1K@k=Z zP;&PJNBAX=xRdo*?aCIhThz>bl3_dj_iE{Nx{K*^s%NJIQV-9>$tiy(1nzQSF6Jj{ z04GY?*$5G1gYJN-Gk19DB+S^v&opl-9RtoNu2Oxq0RmJaPL0`;Jx5Boi`7V8aSlQ{ zdmK@FDUp#QW2K=JW$r%wO?9pnrrudbm+i6VjkM1aSrXZ-QKPK@nC>#;k*p@I-@%~+ z&4wLBFd2gI^aC@DxaN?{ewpCyub$t z$*@DayN;8nACKWVJBak#S6I!>X$d^fodj~{t}frEpccZ5sT z7I_<@ucn1V#f(DHnu|Ds5QWHMuaO1*c7VnJuK!i8zC$%pxN)K_wZ2^lZ=AoXBZb z9B4NG$QyqX?v?1Y28-*|n@pH%j<3hJ+ZEQz_K*{E`*Ha4E)_=ZQ)(0U0V(3e3L=rW;OHQ*%`9%hx_;ywYZ{+lb`7!?B{6f@H&4(4U z>9LB{0961XJ%AG;K}5m&EZNt#Swh#{dBD2VxPh` zfUSBFQNLXzFy1b1cyvnHigS@eAz7#_PUx0+FR)N_MM5eu%>q{OF%?r^jtV3Qr6vo2 zTMQaJce2Nxg}D&8P|J6Pz#Adt6=MH;e#ITa@P=_jp;P!E99rrR3h!rmIo-~^3oypBNv^g`uBO6Zyt^>C z%QL7CimwWqUYXl`fznPfhHlUARCAv&zN8G_!bSaQkHJea zUegP4@ExWz-)7;$It6gt$<}V;>%hJ<_m0 zW%*AU%nn#N-7q)W0ua6^S(b~6b@=@04k$ih*D-eTvu=@Co{?@uE6etiz3rFf0dXZ+~)Ex`krG5i3NoEQvSs+{;n!zk`otnjB8;1&7%bLxk5MsYpy!k^-R zwwOdYdOG%c0X=auH~yEKe6v2Pd|2CXmrfG@R?21rX{X)h)nND`mk*uGLG3!M=Rw>L z?Z8x0mj>U}0he&OB;lvz9b@>ao(Y}ujo7c-X^Sr>9TlvTKLfbKXIL!asfE{5h0pN) zKRNx5Uf)=_WnZ|v&-T>c!nrh;c_^#sPCHSZw!;Y;BY;m4WAt;-MU=3If7-*?+hZpf zpqNr*7r4dk!)9S3DogMW0{0Glzh>(HQ|1Ab6`E!hH2Q%Ai3#}ox=y!s=zcmo!tjBncais6z~9}LqQwyG?&T@L7#l!9X}6&-x617WfmZ~{Q3O+> zEw|scqPdqo?L%@?Bwh^OBtl=hsU%KGOkhoC-gOI$pvm-cG%`noXe55cOw?{wqFUQpl&a>h6ji zddkzRpGNVW3nE99NIP7s<>Ev-U)Jis>C0@>JU0YMO5#jIx$iL@r@iM9ve{=TyeR5!)b*mub{MCoXwh&05BJs1l&st6s%CCM+4l@B07 zw2VbcZY>)r7&^94Lzn5IjB=*yuF)ITUmly9zbiCP3%N1ZaTz?;hSc|7h7LHE8vS{d z!nl4aG)c|Z*^o#Bl9ga9;PP-@$cCtg72XU7-AtbhDg8A}f`AA9OLEWjRX-b*D5S@? z#R^11-431OJE)uyH!Ct1&0Q;6pxNMe5n`L&{d$P8;AorQreiKY0}jw!P+40+(;hN| zC60f>ddMC%UJs0`;p*SGtPIew=fyDyPy*9Rmr5W zQXqDM3&Dw#U{3;#7XezqPSPzGV*vKEgi>C5LCr8{nD*%a!LXp4^u9;q0s4Wt)*#8S zq?_zM19r;W@6JVrf?RY@lo5mTek2J!66XScsmc;utKt;IViXre%s-1Ew49-TAE2UV z39t=cnJ3WHa0^v$A>N6eF5;+bQuW&W8i>_!Khcs+8=iID;g7*aibGYt(DEzf2hhHo z*eU8V&Uhx>&_#)t3H-f>nWU~!hpAdA>+r}5KXK=p)Os(mP4nN=PLZV^#1rQ)N{iWQ zgTUlOOHvOPLT58hi(Bksry2WBW@qj&lIiNXg=}Z=+synA3#95}RK3Ru-QD$n+g;)u zMiJIH?+Fs6rciVq!O7dTV5t~{MGd$7=5OG!$m9%^mqDF3ZkZgDXxph!>2>i z%5}`BwM2@CNs4EFapLsZU9bNBM5Au5kzPI%0 zbPMyPuw$ge$*RhUsme>?;fo2biVdua6KOr-6$IG`6v(SF2kVUQvPU@%`HZ7}VN}nb zXgwaF8@^H{`xMd@lb9BD#t1n)-SQmlCuuTq?)Dw7$e!?$bLJAT>ts*8qntob6Usus zWz%_j!=cTIqeb!C5ccu#;7cQ`A2+8}AbQv*u7Uj`BVM+b0YjfT@X|8u4Au_=W+!=E zW1F@<{{1I*SxbDFCgo2#4lyz|ohibHk=4^!)zedMZ+ zTlA~pWx9_t`y>~H;1;^K-Sczdk@<%0pG}N#HP@IL=(j2b^8fX3{oSDOzk)aaYZLQd z4lxdJH|(Xk`|WC{l7(`%iZzEgnjEd8aBG-kqY0oj2kJJlR0rOwqXt>mkuC9NsgPJc zBu??#p9e}Ldf`7LS%IXk17iaL9<~G^g7}aipJ^?>e|P-8I9++(>SVh&IiAXJ{|>xf zLf+YSru#9uJ7Uz!QW?_=2gC*W@LP{6*#AvaG=*yKBQrfiDOZ1UD@N$jxv_<>rGTLXHtK;RJ23F)PF z^}x6WuN)c>;X5+64h)_>a)WTDjh^e?wJ(3dH^!I2Bb^8`&kdO4e=@=&ogt$AUL3$R zj6rtmpUPeoC5VEMZChO+z6Uq(3hu>&1(ASmw&~a$! ziO)`f>=f8l2C9*7)GgV*IBaAqeJ1s5f#{Up#R0lTa*OGG2jRuPA@GZV@RZuM1>q&Q zaRtgjdI9&FfxsrX;qaq__(AT4P>Bfo%&TAgujvveWZ<%Wk1>s zzdD})v-qiu0CRGFmY1cS1A9QfIf7qC(zVpp1fRR1;TJ&lH=sag!XgN`* zy`_Sk&Qe4g(n;A?Yb%VAX2a8~JB?qr^tZ{yv32>c=+gk)3U3U*X_~C0nzt7IO43S&>Ju6Q}?TDQ?ipp}LWDgs@Wm!q!p5`#ErXi$%8 zerE-b+gI;is1e!!xfw;99UQqAipd#{yNS-RWwF^_HnJ$Sq-I~$oNGeVaHN!&>Q==+ z1^K$)ikPwZg306UAk8GrK8&vBcRMJE91|Q+F=zl~V8M+6lX(BQ3ud>(e1KQgru5C3 z;c2-cFwKp6=-RGm=xRBdHi%dXS! z_(0+av_#wF=}lAql&eez7Nr%q@bE`q_E=_qG8N_k4<7$!YRpG@%1Vy1ZuJ6F3)6gt z^MXK05hu(Lcz6^1Qe#jyV_a#&;8qf5VcNV<8L^-88%yLi4BTvCw=fLe3Ox2kp_*kR z*wMM~Kw%%vn?et^%6~VkRV&m|^yXLmkB{Ek+pWgj45rN1QUMVnPl5K=8pe{YFF?1b z%thsYtR08jMw4F?44QSYE)QLV4))Hu~78v z=n!Q6D(i5R;bmBGE;;7>hsMRWf8NqnD))NfXE&-J&EAt)Zb!!V`c{cZe(4&SZJB+` z+TQ9T`n7p+k5~Ng%rm3$My@WvcNLam(<%K@$X?`ba?s=tGsm`NR#|7^qKM->g+PX7 z0ZVc0>0xrJxb!jC2yc9+d$<)**zXbAxX!HM)hl_#_u#7T(pG|V*kD$0u(slCEqQ}d zHQaNHEyDTiVYzs2oaQ)gL!&G@Oxx?2Qn0EqDJm(HA0}TJLt|8r-KpMDF6m9gAr7!l z!+g5KB%NZ8+^id=d z(9f6$&A3inxi0bBxfDa45=t&p)F^3?%`cLxtXEv1P_;>^O`?7BjTY!-CsCYaTOhx! zkp-Dc)4^wid)-{YgY#BK-8<2!tO^f3cJ`c zHlZDwA0p5*61&tcLH&(BPz-__*k|eP!A8{5*_Wpf#mx`y(i<2pVydE~ZRzn(C_1Ln zInb3LgRVFTiE?d}zU5HN$2r3hw?{pYbU`n-IcMdtgdjAV#E&PCY_H$N65Mc9$j8(U zZhnj8n*&UcuD0;Yl*On~x@ZcnBJ`aWs>%@Vj& z@F1qmAp;ejd7na$XiV{W-fEpksN##WK;QZP^ zjuBI3^?sUHvQQ%!>nNv?(=%jdcxfvqs+MCerT)SU-6c@mwR{orvqh|Ba2h5ZK!(Z? z=)weozD=z+grFv@P35D>D6T!T3hp;S`c9vty>emA>E#A$fSe?#_3cG+sq9a#KR|Ke zeoU6H$sWYKDXcxR3hGbaRSv2u)M0v*$wkN%%MEfzX%6?O*aIHFJ{Af;V{B*YR@|V3 z(hVIRC`cr+3BfuQ3}$JVWRb(%Eg*i~ zNtf9F8XIgOb9@dZKG{{S8{0C!Ag295KZ_83POqJa=)qb1i z@Hs7nBVBJ%``9vvJ3ww~;A8DTF#(O8XlPKEmLoc%UrfU97X;QVV2*G)VqZ+!S2B&% zO=JJJ7otK&9<~L*0s6YCl6sDdXn#W1>|ig!eCy*4!IVf|2L{a9iB zU}ODg0c;AA#J$jgCiCYHNr*M7y+UMbI$=lP&%r@$N}B_1cv3nEML0+9;sFjaB{1i3 z=QlbYT!d_|mp6VtJn3}tRJOQ@hXX9p8LkD}z2GnY5aoBJx|3Um`M~Qb`+vw9xc(en z70l=wh&@h%rU1Cf9X&ze#AF$zp{ZLjN>=89Xu^A(BU`PCJ=ZT>91+lEvY zq~GQOK{lh_nt<;eBpxXfXA?-Fd8tHgHqiOUIj+p<1Fp7rbiQW;P!-& zz9FeJz+SGmTJ0UzN5%redxvSRC92KJfkP~V@iNC@ygODFE$4R|?`pc*_I&%Z2VFC2^TL&B5 z!(My5p$?z7^(`F}JG=pEqR0J~jy2Nn1Ehf8@H93xb>!8F;Rg!0Vp)Kea9$Ha^vCsW zIf9EBz3_%(`d>^~yg)4Kjg}l2lvqxL=xKa9T`CcCCWXnwNp)eY zV)>^D(pw5L0umU2e5q9J7w;C4^yv-{2Pd$GQpYjm6aPra$MaTmB9$g1AU;Bl64+UO(Bf3*V ze+Bo%>!+qPGGyfU(*`m>0Y97$iTzy+RgcL2AWhPZP%q1TNX$rtnMF+BiR;lr2jI$B zP!}f*SN}-U2F19vAUE#NC)@}r_@eKOjhv&$Hq_m{M({pHm?ls&GA+V!9IS0oZgGWL z*OYl;d~Zi4rE_6?rBC<#mHzQVsa8~Vb$3nVdw879RgXY_p}JK4&hpu>LRv&-MH<48u3~;}D*2`UiPxJ~+PD58}Kh@q}sj_H5P<>*1ZV7cMlP zls#Lz&(iabj7m<3kw2uU!1La)JUY26#IwdgUF?3#&`zpA)(EFhAnW9_-&?XaK2?%g zR3Pniz6=mfCckPFv!uo^7c&{H6SC8lw$>`y#HScONpKa&-w%dr3@{Zcmac$y6-Sn= zg`x%cJ_|TeNWZg(ZMX$`lN5f$9w3RArP|Q0L zOUDh3Pmb{&yc*yuH0d@*9rPyM-;46}5Kc|896I65LYY6BA3lQfkOfvmO zlBSLCzRD8c|0LELq0T@xXFKT4Q-)hn#o!2{F=uNDr^wQdVt)2pZ@yI6oKeut{6cJL zH@=uJni&;}gf3BXfu4LpKb;x)Sd2;Ej~O~y%rUB9F&r$40qIuLgESoK4?2cBUZS2? z@)u8eb7y3+XsweRmqt@MjiqY=M}94CFe@Rdz&k=Ep6_IGK&?FlCs;zfl1qyD5U+Ub zl}uHH(cs?R)GR1 zC}we-T7`9xilT%(@n`6XjwP{7L@?P%pGVQ7nX8}Sn zV<&Y9hgbSciBF1O5GB?K*G6rVZpp*lW;|Ax)qamH6s6vT>37)_!s5e8`C+4&4~;u zCro9l&7`DsdOSz;h%WaI&Ay-$Bxzn(-#?HJ&a)}1c=IxeW_o;w|L8jZ?pf~jz4QZE z>63smhrQgPL9;z836K9Mr{IoG?)8`aYf9+{l@hPH(h&yfktR;k0b;x{7zSgAfV#hg zdN8B|CS?t-a@$BD_iiOOR?5y>T}4&Q(<+|$C7h4kTIAtrC~CYAa%w9q@iM(rrP^`p$%7t4QACz3 zN2y>1Qx(Xz9n8D~scW!<7Z}(?nyxV(_Vf`d_N6Atgj27K(4ie?W9?t`id-lsk^W$N znoTk!uY@HrkD|7AQjR885a?D15xO&?Oep3FJoU4?1Ei8n2VmOZ0OO8(?C!jkiD-Nc zo-mckX#5$T)K23geH0GBR&lDmtZk6}cM_o!WCjwI3_LcC=M*`~Evl6S!IIeityL&V z8#kCczRga2*_&b2Sr(lSr(Ghq4LvLKuJm-uvXg>4tJ0v_EDFU97_8%yDC3nV<5nuB z1(V`=lhS#Ul6jM|dDLQg)Qz5&1mg@8iNX|#L#$9GUw~C|$u)b{@mmV+2?e)v>+K(J zt^rY|9GdzC%;nDCfzzN9ck;tsvMI!2WXc};xw+Qor|?CGK4LFv!j$sGL6wV zM+h6|}*XL&Wt%a;I+X(N1^_E{vIG zQf5SoLr1i2I5cVs*>H2s11d2`FKa{|&;&k-*5JMOX2`8IK$#-WcX5KTz_Xi}qpGHm ztYh{K_!H!bW})YBHD*XlB{6B`(8)IZAA>1C-BfD#Bijj1Q?F1eZ2iDFP8Yn+osKS1|EwK{WE}FR^qG1Cb=>{Li5VPmtnwrIR3BFU~Bma znSMSLo`H&472!cP$}2uWe%5rc$T=Z4p-7fMYd^^7vMLM>AfF?{Jo`QH7x`h$dEc5T zuguKf-;x}>?^Kc>Fji%9vC;&7L&V8S)P^Ks%Al4|%NU8IDPDV=Flld9EVbj!M-Su0 zWI+pDMq-PBM4d#zW_hbdp;_(P)AXuna6LEI>smUR))@#*BVAz%&2k^IRDaa6(Qoc; zCylBML%_<<-s%Ttgz!_kEwoz%k`cwuiKN?%Bn_U2}M=w;tJMH}*aFio7SgcH+fy zod5oa=5Nrh&_uH~A4424*t=dEB5gi9Lw$o<=VtdUUu|6`KVP(#Gf6z)qSK2p+=m$& zMCUH{Q=bf4+(akxBNM{)X3(S#VrJkcy+^*?vJ;pP(nXvY%t1`km?V_A1+r&0%aIgd zS`@9l0sV*3kW?fNclve{^L(cx{%`*I-|rmS|GsnosmA)3+y`Y##|oVrM~N z)F(Z7kj52M+^G`{RNM&@Con4;DWi|Nc+JJh$ckhZviII(Wn^@-QpUaZ zSHzc;nG%_0&##qP_U@9sMMg-z*|Ng_-2TbE*VXrTJU$QZ!#&T>`<&0~jL-R;&-<+` zJwIs_(9!UHl{NQS^2|9kb0}M{O08n=j04<=)|b^#?vefj&zu^vzRa^e`~r7qasHNe zOZMTMySFwoK(;fmO0A#zw_dHi;%RqzU%Zf8&ukw_b(1=OPCe1|EOXT$gmq4bQOUC@ z;i+-%^~50lA1}4!7zu2@1dA!dJvHJBA@C{Fs$0Ia&g_YGrZTYcckE-kgJmCN7_Tr+ zoYnT?augmntF@`qaJ)Sw^#-vF@^?6it zgO+4<%4w+|Ty+g4zok#Oj=DXr80x-I6?UHWEZ$t?E!y!-LLr8@n;B1rLn_7RBBzOB z^e^QbWT~D1atESS!4%PaaWlWvIpY<*jg|EYJF3!w>_8raIrSBS!V7n}t0gO|YZYH| zGSJ#3i9=Y+B#E4?N63Zq#0Jy>x(~z<<#DlR;cK4q%pX4f^kH2ePzxD%vxdgVP2U}YBJn`v6 zuNN1&7YF&CXU-_D)_Pgs-el?Gf_%D>bWi;o#~H4U-SAvE!4k7#XT8ff^T*mfak9`8 z6Zf?p2O_x|Y5ZJBJrftTJjl`*;qYb3kC7W#Vv!quwf;(8$&2~5EcjL08>ALwu2||k zq?K}0l*S4-fhVy~m$NTtU*RQ*#<#(r!>`iWkV?S$G&R3WL?t+7-t*rkP{FA*>x(~j^f}w!@BQ4&`QZ&@ z32f$ELD|fS-fK`}>NQaOSlj|0=qdc#^E}86ig08Di#%&}^~E`Dq8Fo{n$qXJZjdP` zWE-@&b%v8~m&HzniP;#jW4e(?iy>wx@WG6T<*3_C+%FIGm&z3w0-8?AEXq83c1G@u zI>ePZ&zLP{O4Cilwiy0G_m%`NPFHWn`uh?QFVixZA%v7ZZ*V>)u2L{_^+K?_i?&zq z)zHt{3KCh-qO5#ygIqTAn{++*l}HmZ`;r506wTdeNEcFS$e>cXlz!!|>*ftZw3I z+d}Ggu~;vPVV-WPcaArRhjViSto;~5E9GEClojJ;C0|(vW7;g6oa@5)igmX$Zlq|< zwJMpBw`(;|I^zpp`xw^Ly4#;%K>sw%Ca7$o^bvGuQfvF>mS04)1Bc!1*qH5xV>a>| z;@-T_$Ml58Pkx+Mc-D^{%aC@wTx}F@k#xBi%Y@PHq-$X8DfSM=|7!>IXgry(at{f^o8gme9+I3qGJnlvbP7X8JOQe z__I*AH;0-zf_V~JNNm5*4{F#~N&MQUEKkavAf7y4T^sb0`|N8oX-B@VKCd2lTimEC zd@cm>;Lu}Ycg3QGyK-HPE=>r8*{N5-hG{FE|H5K4lCgTt2&GNDkSLEgAIvxPQX|xk z%(t=rAHIZ0s;pO89vM3-9Q^+pHOywY>%Es7WRHp%9r#xbyR%2fGv#8iL_cg>m(*`1 z#aP`azKUcht4m;eF~7@?myxndlGs}z=A31*QjoG5^QlO$vl~vG@^Mv+Stp;BWz#Qg z89lLqmEt^rN?Ya21s!9Rj}LL(#=V%w#Zt5A9603V+4k87xZnCP_;cF@wG`Xl7exI5 z#T;FSNPEY1Y_<05P{q#D(j1Cbc}}4p?te!eHCmG}O+dUmc541ULQlZ1U9Pd-<3#)o|U- z3ke_Ra`9ed4B|@(>l&~J)ENwfI#yVwbqBi4UJd@95uy3aFlA~0$ETjenb86+Ig+9l zz|M1>e0V^C_1|r4#sVWsQRpml=3;Emse~TcWR+Df-^FF&7&W2oP;7JFO>h9MqcB zA8U>HKzRmkFh}$IzqYFA8r~z(q1aV(DdCADtT?#g2sTmF zYqM)<=H5;T=)KaHc{4Ww_Z_K7rfFzE1yw-4y8A%x*h74+I>%Lbf;!<2H19L_Yr1Fh zO}IKTeAKmOlpLwIHKeJFsfoHgWc-roGR)2keIA3;r;Mfh(0l)Ao9?s!tADqcCfMv) zCp))!42}9*i;v%~Ls;3Wv+17p*WVvywmye__peg6zhRGuYeVnYOGwNO41N?VW>l!+ zSTlS3~wDyx!c#!>YAL>?UcBra9odH zW>V9I*hTL;*X*=qj7xeRA63Z^m}N$En}2V#>a1F z>Q(sOR^+=LZ>x_%vg#f3qY}Ip1cI7+UC?abZ>8%3B{4HU2=YtG)u^toHgw%7QWKt9 z)mPPg&+fIplx#!Lr^F?6JxR0aB)j<)ivlkRc?#8579#atxo<-+X)<0EToy>36i~bD zs?ww=k~4OSMtve&VvvGTe2;mUl6OSqJ2vU64tdd>bAzzfDaFpO>wL{a5J$Jf$dX~( z&4`<=v;|w2ikN9GNbX)TKDRYs-MIa&hU38l-D|U!&nM5kk5iu&2u^c~t>F=Bga6&0 zsA>9@;++aFP5XGPgmqGHOhEWBD}NZYC8cXBzGvz<^UMx@+gvFfjVK+?`!yWR#qtnx zd(Eam=&Vl=J+C(3`NbdABer?9Qqj=G)!963QCXZ`iB|Hw|tT`;S@EP zHm$RAXo|rJ_mx?u+PL)`nv^f}-NBdls~ndJtvO9x|EOV)V%s&_r~KNZ3Or$X6Fb;^ zds$aJH}y5$ zkdr>t7pF@7bG|2HZRe?q)fsVpH{#pMsWOY9o5ftb zaq7<0rH%Ty20@aPl?$&;C4x53NbPoz(s@VOYv7XyI)q=NO=@PjJfe87iP)-%b$2;F z72on)LYja{Jbi3hzp_kj#|mj;q(j(Bi)--Y1y>rokZyL7OiE>Px|2#djQ*?++Bwgr zXh_y68dX(x=(PN?)rU*CaqM7XA~hyjLnb(3?3U?UCsTt-HCKWbmaD%x;FdgpyhzA7 zu1EC#xxo_$|D9$Rw=dGp)$)bQYbqB5JFe(uEttBuJE`zke5`LRj*dPb9%QOZz{V4^ zB3RckoCAs16!IxpFBeEj7UHKd6&t~R#a*PnY4Vw;wQ6P`};lPntIf2UDe6rJ69=(iD8=sBUY8>RP!-1v=2*&aW9Q`le$ zcTZ{OJ?CbiF)h<~>sRXCw(yS8FWqe{-_EnQ-mb70v8jNUwkQ2#X=Ukt$VaBJXN}F?cCY50om-sQZ}I zia4v|Qr~OC>^iZ|hsSR-#-wm`7n2(E@+<{3#gET zH5zmT+f$j;UGU{=VD^3SAV2tP5|kdv4g^Bh*6BWC3Tg-a|Cs?gY^owQoEW^l;0D(J zP+^>)V$fiUcg$@atu3tgJ+z_2zBm8-ZXVd74Xk5Eu`C2kRM24RF1BC^(aPE$^=<&2 z>A&vjQVDn^pwbXakO!#)sO2})*23D-32M%C6>~A~u8)Qd0Lu0uN)IUbA<8w(6x`v8 zbO<19fSO0OWf^=tMB%|qv5T}IR0Xz7fdiEi13cm#qVQs-$V&N>hJuaEejpM&C<0RA zq&ZB%%xEwnBg+Eiu>!h5z4*sielrxWNi%`tPz)jT3x!Y2HqZfzgos;Dhhz>G)+Q@D z?C^Up=rpZJwQG&QG-j|y0espbC31EYnyQ_xHBh&<71Z494(4KhD?b~M4>bM_R1Bys zq{PaF%)*>Ip3p^TY22qf^~+-)1fXsw1ER86l+;V8Hm*SoW>lr~X-9hylPj z`BK?AFoNWOJ{a|)Dl4L6G0Q@<<*L{SFozcyM~7q<@D8i>o1kW=~jDIYKOCg!~}v_VA8~V0Dm^JW+|5g@Ek4 z8g;%97l@kwXel5&FGe`;JxIqx4>SHC24w%hsP!!ub_D2XIUwfd$lhR3En|On0L0*A z82!Q_JGwx%EHoJfgs7$erDs8YMHoz~kkU@tVc-$oGSIC=ev=J#tR=}k3i{s?L*55~ zdT&x&c!-KwWylYtQRlWpEhq?-?E}cgLtM>4qz6=}cUs|K^7CuZKX|5q*%ai56o_Y8 z2MOMZ0rCg6B0mH`ZOo^8jw1b8uErPcEQ literal 0 HcmV?d00001 diff --git a/user-service/pom.xml b/user-service/pom.xml new file mode 100644 index 0000000..d652165 --- /dev/null +++ b/user-service/pom.xml @@ -0,0 +1,203 @@ + + + 4.0.0 + + com.mh + mh_esi + 1.0-SNAPSHOT + + com.mh + user-service + 0.0.1-SNAPSHOT + user-service + jar + Demo project for Spring Boot + + + 1.8 + Hoxton.SR3 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + import + + + + org.springframework.boot + spring-boot-starter-quartz + + + org.springframework.cloud + spring-cloud-starter-config + 2.2.2.RELEASE + + + com.github.ben-manes.caffeine + caffeine + 2.8.8 + + + com.alibaba + fastjson + 1.2.41 + + + + + + + + + + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.2 + + + + mysql + mysql-connector-java + + + + com.alibaba + druid-spring-boot-starter + 1.1.18 + + + com.microsoft.sqlserver + mssql-jdbc + runtime + + + + log4j + log4j + 1.2.17 + + + io.netty + netty-all + 5.0.0.Alpha2 + + + + com.github.penggle + kaptcha + 2.3.2 + + + + org.springframework.boot + spring-boot-starter-security + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + com.mh + common + 0.0.1-SNAPSHOT + + + + de.codecentric + spring-boot-admin-starter-client + 2.2.2 + + + + org.projectlombok + lombok + true + + + + tk.mybatis + mapper + 3.3.9 + + + org.apache.commons + commons-pool2 + + + net.sf.json-lib + json-lib + 2.4 + jdk15 + + + org.springframework.boot + spring-boot-starter-amqp + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + + src/main/java + + **/sqlmapper/*.xml + + false + + + src/main/resources + + **/*.* + + true + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.7.2 + + + + + diff --git a/user-service/src/main/java/com/mh/user/UserServiceApplication.java b/user-service/src/main/java/com/mh/user/UserServiceApplication.java new file mode 100644 index 0000000..8ec61f4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/UserServiceApplication.java @@ -0,0 +1,57 @@ +package com.mh.user; + +import com.mh.user.constants.Constant; +import com.mh.user.job.CollectionLoopRunner; +import com.mh.user.netty.EchoServer; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.utils.GetReadOrder485; +import lombok.extern.slf4j.Slf4j; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.scheduling.annotation.EnableScheduling; +import javax.annotation.PreDestroy; + + +@SpringBootApplication(scanBasePackages = "com.mh.user") +@EnableScheduling +//@ServletComponentScan +public class UserServiceApplication extends SpringBootServletInitializer { + + private static final Logger log = Logger.getLogger(UserServiceApplication.class); + + @Autowired + DeviceCodeParamService deviceCodeParamService; + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(UserServiceApplication.class); + } + + public static void main(String[] args) { //一共四个地方要修改,UserServiceApplication,RabbitmqConfig,log4j,bootstrap,DealDataJob + + SpringApplication.run(UserServiceApplication.class, args); + //System.out.println(Constant.projectId); + //Constant.projectId=7; + //System.out.println(Constant.projectId); + GetReadOrder485 getReadOrder485=new GetReadOrder485(); + getReadOrder485.createOrderParam("2"); //生成采集参数,1新珠江,2广合科技,3广大科技,6珠江国际,7保利山庄,8东莞迎宾馆 + try{ + new EchoServer(6001).start(); // 调用服务器的start方法,网关作为客户端,6006新珠江,6001广合科技,6077广大科技 +// new EchoServer2(6013).start(); // 6028(6006)珠江国际,5000保利山庄,6004东莞迎宾馆 +// log.info("测试日志路径========!"); + }catch (Exception e){ + System.out.println("端口已占用!"); + } + } + + @PreDestroy + public void destory() { + //关闭应用前 关闭端口 + } + +} diff --git a/user-service/src/main/java/com/mh/user/annotation/SysLogger.java b/user-service/src/main/java/com/mh/user/annotation/SysLogger.java new file mode 100644 index 0000000..0b5f36b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/annotation/SysLogger.java @@ -0,0 +1,15 @@ +package com.mh.user.annotation; + +import java.lang.annotation.*; + +/** + * Created by fangzhipeng on 2017/7/12. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SysLogger { + + String value() default ""; // 模块 + String optDesc() default ""; // 业务操作描述 +} diff --git a/user-service/src/main/java/com/mh/user/annotation/applicationListener.java b/user-service/src/main/java/com/mh/user/annotation/applicationListener.java new file mode 100644 index 0000000..5ba461e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/annotation/applicationListener.java @@ -0,0 +1,23 @@ +package com.mh.user.annotation; +import javax.servlet.ServletContextAttributeEvent; +import javax.servlet.ServletContextAttributeListener; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; + +@WebListener +public class applicationListener implements ServletContextListener,ServletContextAttributeListener{ + + @Override + public void contextDestroyed(ServletContextEvent arg0) { + System.getProperties().remove("log4jDirKey"); + } + + @Override + public void contextInitialized(ServletContextEvent arg0) { + String log4jDir=arg0.getServletContext().getRealPath("/"); + System.setProperty("log4jDirKey", log4jDir); +// System.out.println(log4jDir); + } + +} diff --git a/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java b/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java new file mode 100644 index 0000000..cb54017 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java @@ -0,0 +1,91 @@ +package com.mh.user.aspect; + +import java.util.Date; + +import javax.servlet.http.HttpServletRequest; + +import com.mh.common.utils.StringUtils; +import com.mh.user.utils.SecurityUtils; +import org.apache.commons.beanutils.BeanUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * DAO切面,插入创建人,创建时间,修改人,修改时间 + * @author Louis + * @date Oct 29, 2018 + */ +@Aspect +@Component +@Configuration +public class DaoAspect { + private static final String createBy = "createBy"; + private static final String createTime = "createTime"; + private static final String lastUpdateBy = "lastUpdateBy"; + private static final String lastUpdateTime = "lastUpdateTime"; + + @Pointcut("execution(* com.mh.*.mapper.*.update*(..))") + public void daoUpdate() { + } + + @Pointcut("execution(* com.mh.*.mapper.*.insert*(..))") + public void daoCreate() { + } + + @Around("daoUpdate()") + public Object doAroundUpdate(ProceedingJoinPoint pjp) throws Throwable { + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (attributes == null) { + return pjp.proceed(); + } + HttpServletRequest request = attributes.getRequest(); + String token = request.getHeader("token"); + String username = getUserName(); + if (token != null && username != null) { + Object[] objects = pjp.getArgs(); + if (objects != null && objects.length > 0) { + for (Object arg : objects) { + BeanUtils.setProperty(arg, lastUpdateBy, username); + BeanUtils.setProperty(arg, lastUpdateTime, new Date()); + } + } + } + Object object = pjp.proceed(); + return object; + + } + + @Around("daoCreate()") + public Object doAroundCreate(ProceedingJoinPoint pjp) throws Throwable { + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (attributes == null) { + return pjp.proceed(); + } + Object[] objects = pjp.getArgs(); + if (objects != null && objects.length > 0) { + for (Object arg : objects) { + String username = getUserName(); + if (username != null) { + if (StringUtils.isBlank(BeanUtils.getProperty(arg, createBy))) { + BeanUtils.setProperty(arg, createBy, username); + } + if (StringUtils.isBlank(BeanUtils.getProperty(arg, createTime))) { + BeanUtils.setProperty(arg, createTime, new Date()); + } + } + } + } + Object object = pjp.proceed(); + return object; + } + + private String getUserName() { + return SecurityUtils.getUsername(); + } +} diff --git a/user-service/src/main/java/com/mh/user/aspect/SysLogAspect.java b/user-service/src/main/java/com/mh/user/aspect/SysLogAspect.java new file mode 100644 index 0000000..74b8a70 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/aspect/SysLogAspect.java @@ -0,0 +1,127 @@ +package com.mh.user.aspect; + +import javax.servlet.http.HttpServletRequest; + +import com.mh.user.annotation.SysLogger; +import com.mh.user.model.SysLog; +import com.mh.user.service.SysLogService; +import com.mh.user.utils.HttpUtils; +import com.mh.user.utils.IPUtils; +import com.mh.user.utils.SecurityUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.alibaba.fastjson.JSONObject; + +import java.lang.reflect.Method; +import java.text.SimpleDateFormat; +import java.util.Date; + + +/** + * 系统日志,切面处理类,记录日志 + */ +@Aspect +@Component +public class SysLogAspect { + + @Autowired + private SysLogService sysLogService; + + //@Pointcut("execution(* com.mh.*.service.*.*(..))") + @Pointcut("@annotation(com.mh.user.annotation.SysLogger)") + public void logPointCut() { + + } + + @Around("logPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable { + long beginTime = System.currentTimeMillis(); + // 执行方法 + Object result = point.proceed(); + // 执行时长(毫秒) + long time = System.currentTimeMillis() - beginTime; + // 保存日志 + saveSysLog(point, time); + return result; + + } + + private void saveSysLog(ProceedingJoinPoint joinPoint, long time) { + SysLog sysLog = new SysLog(); + String methodName = joinPoint.getSignature().getName(); + Method method = currentMethod(joinPoint,methodName); + SysLogger sysLogger = method.getAnnotation(SysLogger.class); + String module = sysLogger.value(); //操作模块 + String optDesc=sysLogger.optDesc(); //操作描述 + sysLog.setOperation(module); + sysLog.setOptDesc(optDesc); + String userName = SecurityUtils.getUsername(); //用户名称 + if(joinPoint.getTarget() instanceof SysLogService) { + return ; + } + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + + // 请求的方法名 + String className = joinPoint.getTarget().getClass().getName(); + String methodName1 = signature.getName(); + sysLog.setMethod(className + "." + methodName1 + "()"); + + // 请求的参数 + Object[] args = joinPoint.getArgs(); + try{ + String params = JSONObject.toJSONString(args[0]); + if(params.length() > 200) { + params = params.substring(0, 200) + "..."; + } + sysLog.setParams(params); + } catch (Exception e){ + } + // 获取request + HttpServletRequest request = HttpUtils.getHttpServletRequest(); + // 设置IP地址 + sysLog.setIp(IPUtils.getIpAddr(request)); + String ip=IPUtils.getRemoteIp(); + // 用户名 + sysLog.setUserName(userName); + Date date1 = SecurityUtils.getLoginTime(); + // 登录时间 + sysLog.setCreateTime(date1); + Date date=new Date(); + // 最后操作时间 + sysLog.setLastUpdateTime(date); + // 执行时长(毫秒) + sysLog.setTime(time); + // 保存系统日志 + sysLogService.save(sysLog); + } + + /** + * 获取当前执行的方法 + * + * @param joinPoint 连接点 + * @param methodName 方法名称 + * @return 方法 + */ + private Method currentMethod(JoinPoint joinPoint, String methodName) { + /** + * 获取目标类的所有方法,找到当前要执行的方法 + */ + Method[] methods = joinPoint.getTarget().getClass().getMethods(); + Method resultMethod = null; + for (Method method : methods) { + if (method.getName().equals(methodName)) { + resultMethod = method; + break; + } + } + return resultMethod; + } + +} diff --git a/user-service/src/main/java/com/mh/user/component/ReceiveHandler.java b/user-service/src/main/java/com/mh/user/component/ReceiveHandler.java new file mode 100644 index 0000000..afb4662 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/component/ReceiveHandler.java @@ -0,0 +1,71 @@ +package com.mh.user.component; + +import com.alibaba.druid.sql.visitor.functions.Isnull; +import com.alibaba.fastjson.JSONObject; +import com.mh.user.config.RabbitmqConfig; +import com.mh.user.model.QueueParam; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.rabbitmq.client.AMQP; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.impl.AMQImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.log4j.Logger; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +/** + * 队列消费接收消息 + */ +@Component +public class ReceiveHandler { + + private static final Logger log = Logger.getLogger(ReceiveHandler.class); + //监听队列 +// @RabbitListener(bindings = @QueueBinding( +// value = @Queue(value = "queue_zjjd", durable = "true"), +// exchange = @Exchange( +// value = "topic.exchange", +// ignoreDeclarationExceptions = "true", +// type = ExchangeTypes.TOPIC +// ), +// key = {"topic.#.zjjd.#"}),ackMode = "MANUAL") + @RabbitListener(queues = RabbitmqConfig.QUEUE_NAME,containerFactory = "simpleRabbitListenerContainerFactory") + public void rece_msg(String msg,Channel channel, Message message) throws IOException { + log.info("当前线程:{},收到的简单消息:{}"+Thread.currentThread().getName()+msg); + try { + String show=""; + if(msg!=null && msg.length()>0){ + JSONObject JSONObj=JSONObject.parseObject(msg); + AnalysisReceiveOrder485 analysisReceive=new AnalysisReceiveOrder485(); + QueueParam queueParam=new QueueParam(); + queueParam.setRecData(JSONObj.getString("recData")); + queueParam.setDeviceType(JSONObj.getString("deviceType")); + queueParam.setRegisterAddr(JSONObj.getString("registerAddr")); + queueParam.setProjectID(JSONObj.getString("projectID")); + queueParam.setCopyTime(JSONObj.getString("copyTime")); + String deviceType=JSONObj.getString("deviceType"); + show=deviceType+",数据:"+JSONObj.getString("recData"); + log.info("从队列接受到的信息-->"+show); + if(deviceType!=null && deviceType.equals("电表")){ + analysisReceive.analysisMeterQueue(queueParam); + }else if(deviceType.equals("冷量计")){ + analysisReceive.analysisCloudQueue(queueParam); + } + } + //告诉服务器收到这条消息 已经被我消费了 可以在队列删掉 这样以后就不会再发了 否则消息服务器以为这条消息没处理掉 重启应用后还会在发 + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + } catch (Exception e) { +// e.printStackTrace(); + //丢弃这条消息 + channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false); + log.info("消费队列信息异常"); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/config/CorsConfig.java b/user-service/src/main/java/com/mh/user/config/CorsConfig.java new file mode 100644 index 0000000..0f057a2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/CorsConfig.java @@ -0,0 +1,41 @@ +package com.mh.user.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 跨域配置 + * @author Louis + * @date Oct 29, 2018 + */ +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + + @Autowired(required = false) + private PrimessionInterceptor primessionInterceptor; + + /** + * 注册拦截器 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + + registry.addInterceptor(primessionInterceptor); + } + + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") // 允许跨域访问的路径 + .allowedOrigins("*") // 允许跨域访问的源 + .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // 允许请求方法 + .maxAge(168000) // 预检间隔时间 + .allowedHeaders("*") // 允许头部设置 + .allowCredentials(true); // 是否发送cookie + } + +} diff --git a/user-service/src/main/java/com/mh/user/config/DruidConfig.java b/user-service/src/main/java/com/mh/user/config/DruidConfig.java new file mode 100644 index 0000000..3823b5d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/DruidConfig.java @@ -0,0 +1,117 @@ +package com.mh.user.config; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.Filter; +import javax.servlet.Servlet; +import javax.sql.DataSource; + +import com.alibaba.druid.wall.WallConfig; +import com.alibaba.druid.wall.WallFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-03-13 + * @throws : + */ +@Configuration +@EnableConfigurationProperties({DruidDataSourceProperties.class}) +public class DruidConfig { + @Autowired + private DruidDataSourceProperties properties; + + @Bean + @ConditionalOnMissingBean + public DataSource druidDataSource() { + DruidDataSource druidDataSource = new DruidDataSource(); + druidDataSource.setDriverClassName(properties.getDriverClassName()); + druidDataSource.setUrl(properties.getUrl()); + druidDataSource.setUsername(properties.getUsername()); + druidDataSource.setPassword(properties.getPassword()); + druidDataSource.setInitialSize(properties.getInitialSize()); + druidDataSource.setMinIdle(properties.getMinIdle()); + druidDataSource.setMaxActive(properties.getMaxActive()); + druidDataSource.setMaxWait(properties.getMaxWait()); + druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis()); + druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis()); + druidDataSource.setValidationQuery(properties.getValidationQuery()); + druidDataSource.setTestWhileIdle(properties.isTestWhileIdle()); + druidDataSource.setTestOnBorrow(properties.isTestOnBorrow()); + druidDataSource.setTestOnReturn(properties.isTestOnReturn()); + druidDataSource.setPoolPreparedStatements(properties.isPoolPreparedStatements()); + druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize()); + + List list=new ArrayList<>(); + WallFilter wallFilter=new WallFilter(); + WallConfig config = new WallConfig(); + //允许一次执行多条语句 + config.setMultiStatementAllow(true); + //允许非基本语句的其他语句 + //config.setNoneBaseStatementAllow(true); + wallFilter.setConfig(config); + list.add(wallFilter); + druidDataSource.setProxyFilters(list); + + try { + druidDataSource.setFilters(properties.getFilters()); + druidDataSource.init(); + } catch (SQLException e) { + e.printStackTrace(); + } + + return druidDataSource; + } + + /** + * 注册Servlet信息, 配置监控视图 + * + * @return + */ + @Bean + @ConditionalOnMissingBean + public ServletRegistrationBean druidServlet() { + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); + + //白名单: +// servletRegistrationBean.addInitParameter("allow","127.0.0.1,139.196.87.48"); + //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page. + servletRegistrationBean.addInitParameter("deny","192.168.1.222"); + //登录查看信息的账号密码, 用于登录Druid监控后台 + servletRegistrationBean.addInitParameter("loginUsername", "admin"); + servletRegistrationBean.addInitParameter("loginPassword", "admin"); + //是否能够重置数据. + servletRegistrationBean.addInitParameter("resetEnable", "true"); + return servletRegistrationBean; + + } + + /** + * 注册Filter信息, 监控拦截器 + * + * @return + */ + @Bean + @ConditionalOnMissingBean + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); + filterRegistrationBean.setFilter(new WebStatFilter()); + filterRegistrationBean.addUrlPatterns("/*"); + filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); + return filterRegistrationBean; + } +} diff --git a/user-service/src/main/java/com/mh/user/config/DruidDataSourceProperties.java b/user-service/src/main/java/com/mh/user/config/DruidDataSourceProperties.java new file mode 100644 index 0000000..69c5d14 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/DruidDataSourceProperties.java @@ -0,0 +1,172 @@ +package com.mh.user.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-03-13 + * @throws : + */ +@ConfigurationProperties(prefix = "spring.datasource.druid") +public class DruidDataSourceProperties { + + // jdbc + private String driverClassName; + private String url; + private String username; + private String password; + // jdbc connection pool + private int initialSize; + private int minIdle; + private int maxActive = 100; + private long maxWait; + private long timeBetweenEvictionRunsMillis; + private long minEvictableIdleTimeMillis; + private String validationQuery; + private boolean testWhileIdle; + private boolean testOnBorrow; + private boolean testOnReturn; + private boolean poolPreparedStatements; + private int maxPoolPreparedStatementPerConnectionSize; + // filter + private String filters; + + public int getInitialSize() { + return initialSize; + } + + public void setInitialSize(int initialSize) { + this.initialSize = initialSize; + } + + public int getMinIdle() { + return minIdle; + } + + public void setMinIdle(int minIdle) { + this.minIdle = minIdle; + } + + public int getMaxActive() { + return maxActive; + } + + public void setMaxActive(int maxActive) { + this.maxActive = maxActive; + } + + public long getMaxWait() { + return maxWait; + } + + public void setMaxWait(long maxWait) { + this.maxWait = maxWait; + } + + public long getTimeBetweenEvictionRunsMillis() { + return timeBetweenEvictionRunsMillis; + } + + public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) { + this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; + } + + public long getMinEvictableIdleTimeMillis() { + return minEvictableIdleTimeMillis; + } + + public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) { + this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; + } + + public String getValidationQuery() { + return validationQuery; + } + + public void setValidationQuery(String validationQuery) { + this.validationQuery = validationQuery; + } + + public boolean isTestWhileIdle() { + return testWhileIdle; + } + + public void setTestWhileIdle(boolean testWhileIdle) { + this.testWhileIdle = testWhileIdle; + } + + public boolean isTestOnBorrow() { + return testOnBorrow; + } + + public void setTestOnBorrow(boolean testOnBorrow) { + this.testOnBorrow = testOnBorrow; + } + + public boolean isTestOnReturn() { + return testOnReturn; + } + + public void setTestOnReturn(boolean testOnReturn) { + this.testOnReturn = testOnReturn; + } + + public boolean isPoolPreparedStatements() { + return poolPreparedStatements; + } + + public void setPoolPreparedStatements(boolean poolPreparedStatements) { + this.poolPreparedStatements = poolPreparedStatements; + } + + public int getMaxPoolPreparedStatementPerConnectionSize() { + return maxPoolPreparedStatementPerConnectionSize; + } + + public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) { + this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize; + } + + public String getFilters() { + return filters; + } + + public void setFilters(String filters) { + this.filters = filters; + } + + public String getDriverClassName() { + return driverClassName; + } + + public void setDriverClassName(String driverClassName) { + this.driverClassName = driverClassName; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + +} diff --git a/user-service/src/main/java/com/mh/user/config/DruidStatViewServlet.java b/user-service/src/main/java/com/mh/user/config/DruidStatViewServlet.java new file mode 100644 index 0000000..c87b213 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/DruidStatViewServlet.java @@ -0,0 +1,17 @@ +package com.mh.user.config; + +import com.alibaba.druid.support.http.StatViewServlet; + +/** + * druid监控视图配置 + */ +//@WebServlet(urlPatterns = "/druid/*", initParams={ +// @WebInitParam(name="allow",value="192.168.6.195"), // IP白名单 (没有配置或者为空,则允许所有访问) +// @WebInitParam(name="deny",value="192.168.6.73"), // IP黑名单 (存在共同时,deny优先于allow) +// @WebInitParam(name="loginUsername",value="admin"), // 用户名 +// @WebInitParam(name="loginPassword",value="admin"), // 密码 +// @WebInitParam(name="resetEnable",value="true") // 禁用HTML页面上的“Reset All”功能 +//}) +public class DruidStatViewServlet extends StatViewServlet { + private static final long serialVersionUID = 7359758657306626394L; +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/config/KaptchaConfig.java b/user-service/src/main/java/com/mh/user/config/KaptchaConfig.java new file mode 100644 index 0000000..434994f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/KaptchaConfig.java @@ -0,0 +1,56 @@ +package com.mh.user.config; + +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Properties; + +/** + * author:ljf + * update:2020-03-13 + * description:登陆验证码 + */ +@Configuration +public class KaptchaConfig { + + @Bean + public DefaultKaptcha getDefaultKaptcha(){ + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 图片边框,合法值:yes[默认] , no + properties.setProperty("kaptcha.border", "no"); + // 边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue.默认black + properties.setProperty("kaptcha.border.color", "105,179,90"); + // 边框厚度,合法值:>0,默认1 +// properties.setProperty("kaptcha.border.thickness", "1"); + // 图片宽,默认200 + properties.setProperty("kaptcha.image.width", "110"); + // 图片高,默认50 + properties.setProperty("kaptcha.image.height", "40"); + // 字体大小,默认40px + properties.setProperty("kaptcha.textproducer.font.size", "35"); + // 字体,默认Arial, Courier + properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑"); + // 字体颜色,合法值: r,g,b 或者 white,black,blue.默认black + properties.setProperty("kaptcha.textproducer.font.color", "blue"); + // session key,默认KAPTCHA_SESSION_KEY + properties.setProperty("kaptcha.session.key", "code"); + // session date,默认KAPTCHA_SESSION_DATE +// properties.setProperty("kaptcha.session.date", "KAPTCHA_SESSION_DATE"); + // 验证码长度,默认5 + properties.setProperty("kaptcha.textproducer.char.length", "4"); + // 文字间隔,默认2 + properties.setProperty("kaptcha.textproducer.char.space", "5"); + // 干扰 颜色,合法值: r,g,b 或者 white,black,blue.默认black +// properties.setProperty("kaptcha.noise.color", "black"); + // 更多可参考:https://blog.csdn.net/elephantboy/article/details/52795309 + + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + + return defaultKaptcha; + } + +} diff --git a/user-service/src/main/java/com/mh/user/config/PrimessionInterceptor.java b/user-service/src/main/java/com/mh/user/config/PrimessionInterceptor.java new file mode 100644 index 0000000..5e13b7f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/PrimessionInterceptor.java @@ -0,0 +1,68 @@ +package com.mh.user.config; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.mh.user.dynamic.datasource.DataSourceContextHolder; +import com.mh.user.dynamic.datasource.DataSourceObject; +import com.mh.user.entity.DBEntity; +import com.mh.user.service.SysUserService; +import com.mh.user.utils.JwtTokenUtils; +import com.mh.user.utils.AESUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author chison + * @date 2020-09-03 08:44 + * @Description 请求拦截器 + */ +@Component +public class PrimessionInterceptor implements HandlerInterceptor { + + + @Autowired + private SysUserService sysUserService; + + /** + * 根据token获取用户项目信息,对数据源进行切换 + * @param request + * @param response + * @param handler + * @return + * @throws Exception + */ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String token = request.getHeader("token"); + if (token != null && token.contains("token")) { + JSONObject jsonObject = (JSONObject) JSON.parse(token); + System.out.println("header---->" + jsonObject.get("token")); + if (jsonObject.get("token") !=null ) { + token = jsonObject.get("token").toString(); + } + System.out.println(" token==> " + token); + } + String uri = request.getRequestURI(); + System.out.println(uri); + DataSourceContextHolder.setDBType("default"); + // 除了中间库业务的请求都使用多数据源切换 +// if(!(uri.contains("/sysUser") || uri.contains("/sysRole") || uri.contains("/sysMenu") )){ +// if(token != null){ +// String userName = JwtTokenUtils.getUsernameFromToken(token); +// System.out.println(userName); +// DBEntity dbEntity = sysUserService.queryDBInfo(userName); +// dbEntity.setDB_Pwd(AESUtil.AESdecrypt(dbEntity.getDB_Pwd())); +// // 切换数据源 +// DataSourceObject dataSourceObject = new DataSourceObject(); +// String SourceName = "sqlServer-"+dbEntity.getDB_Names(); +// dataSourceObject.SwitchSQLServerDataSource(dbEntity,SourceName); +// DataSourceContextHolder.setDBType(SourceName); +// } +// } + return true; + } +} diff --git a/user-service/src/main/java/com/mh/user/config/QuartzConfig.java b/user-service/src/main/java/com/mh/user/config/QuartzConfig.java new file mode 100644 index 0000000..b12777e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/QuartzConfig.java @@ -0,0 +1,54 @@ +package com.mh.user.config; + +import com.mh.user.job.JobFactory; +import lombok.extern.slf4j.Slf4j; +import org.quartz.Scheduler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +/** + * @author ljf + * @title : Quartz配置 + * @description : + * @updateTime 2020-04-03 + * @throws : + */ +@Slf4j +@Configuration +public class QuartzConfig { + + private JobFactory jobFactory; + + /** + * @author jinhaoxun + * @description 构造器 + * @param jobFactory + */ + public QuartzConfig(JobFactory jobFactory){ + this.jobFactory = jobFactory; + } + + /** + * @author jinhaoxun + * @description 配置SchedulerFactoryBean,将一个方法产生为Bean并交给Spring容器管理 + * @return SchedulerFactoryBean + */ + @Bean + public SchedulerFactoryBean schedulerFactoryBean() { +// log.info("开始注入定时任务调度器工厂..."); + System.out.println("开始注入定时任务调度器工厂..."); + SchedulerFactoryBean factory = new SchedulerFactoryBean();// Spring提供SchedulerFactoryBean为Scheduler提供配置信息,并被Spring容器管理其生命周期 + factory.setJobFactory(jobFactory);// 设置自定义Job Factory,用于Spring管理Job bean + factory.setOverwriteExistingJobs(true);// 覆盖存在的定时任务 + factory.setStartupDelay(30); //延时30秒启动定时任务,避免系统未完全启动却开始执行定时任务的情况 +// log.info("注入定时任务调度器工厂成功!"); + System.out.println("注入定时任务调度器工厂成功!"); + return factory; + } + + @Bean(name = "scheduler") + public Scheduler scheduler() { + return schedulerFactoryBean().getScheduler(); + } +} diff --git a/user-service/src/main/java/com/mh/user/config/RabbitmqConfig.java b/user-service/src/main/java/com/mh/user/config/RabbitmqConfig.java new file mode 100644 index 0000000..7cd8f13 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/RabbitmqConfig.java @@ -0,0 +1,87 @@ +package com.mh.user.config; + +import com.mh.user.component.ReceiveHandler; +import com.mh.user.constants.Constant; +import lombok.extern.slf4j.Slf4j; +import org.apache.log4j.Logger; +import org.springframework.amqp.core.*; +import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; +import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.SimpleAsyncTaskExecutor; +import org.springframework.transaction.PlatformTransactionManager; + +/** + *队列绑定队列、绑定交换机、绑定路由KEY + */ +@Configuration +public class RabbitmqConfig { + + private static final Logger log = Logger.getLogger(RabbitmqConfig.class); + +// public static final String QUEUE_NAME = "queue_zjjd"; //采集队列,珠江酒店 + +// public static final String QUEUE_NAME = "queue_gdkj"; //采集队列,广大科技 + public static final String QUEUE_NAME = "queue_ghkj"; //采集队列,广和科技 +// public static final String QUEUE_NAME = "queue_zjgj"; //采集队列,珠江国际 +// public static final String QUEUE_NAME = "queue_blsz"; //采集队列,保利山庄 +// public static final String QUEUE_NAME = "queue_dgybg"; //采集队列,东莞迎宾馆 + public static final String EXCHANGE_NAME="topic.exchange"; //topics类型交换机============== +// public static final String ROUTINGKEY_NAME="topic.#.zjjd.#"; //路由KEY,珠江酒店 +// public static final String ROUTINGKEY_NAME="topic.#.gdkj.#"; //路由KEY,广大科技 + public static final String ROUTINGKEY_NAME="topic.#.ghkj.#"; //路由KEY,广和科技 +// public static final String ROUTINGKEY_NAME="topic.#.zjgj.#"; //路由KEY,珠江国际 +// public static final String ROUTINGKEY_NAME="topic.#.blsz.#"; //路由KEY,保利山庄 +// public static final String ROUTINGKEY_NAME="topic.#.dgybg.#"; //路由KEY,东莞迎宾馆 + + @Autowired + private CachingConnectionFactory connectionFactory; + + //声明交换机 + @Bean(EXCHANGE_NAME) + public Exchange exchange(){ + //durable(true) 持久化,mq重启之后交换机还在 + return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build(); + } + + //声明队列 + /* + * new Queue(QUEUE_EMAIL,true,false,false) + * durable="true" 持久化 rabbitmq重启的时候不需要创建新的队列 + * auto-delete 表示消息队列没有在使用时将被自动删除 默认是false + * exclusive 表示该消息队列是否只在当前connection生效,默认是false + */ + //声明队列 + @Bean(QUEUE_NAME) + public Queue queue(){ + log.info("声明队列"+QUEUE_NAME); + return new Queue(QUEUE_NAME); + } + + //ROUTINGKEY_WX队列绑定交换机,指定routingKey + @Bean + public Binding bindingQueue(@Qualifier(QUEUE_NAME) Queue queue, + @Qualifier(EXCHANGE_NAME) Exchange exchange){ + log.info(QUEUE_NAME+"队列绑定到交换机topic.exchange"); + return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY_NAME).noargs(); + } + + //应该是处理多线程消费的 + @Bean + public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(){ + SimpleRabbitListenerContainerFactory listenerContainerFactory = new SimpleRabbitListenerContainerFactory(); + listenerContainerFactory.setConnectionFactory(connectionFactory); + listenerContainerFactory.setConcurrentConsumers(3); + listenerContainerFactory.setMaxConcurrentConsumers(5); + listenerContainerFactory.setPrefetchCount(1);//预处理消息个数 + listenerContainerFactory.setAcknowledgeMode(AcknowledgeMode.MANUAL);//开启消息确认机制 + return listenerContainerFactory; + } + +} diff --git a/user-service/src/main/java/com/mh/user/config/RestTemplateConfig.java b/user-service/src/main/java/com/mh/user/config/RestTemplateConfig.java new file mode 100644 index 0000000..f6074d8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/RestTemplateConfig.java @@ -0,0 +1,14 @@ +package com.mh.user.config; + +import org.springframework.context.annotation.Configuration; + +/** + * @author ljf + * @title : + * @description : redis配置 + * @updateTime 2020-08-20 + * @throws : + */ +@Configuration +public class RestTemplateConfig { +} diff --git a/user-service/src/main/java/com/mh/user/config/SwaggerConfig.java b/user-service/src/main/java/com/mh/user/config/SwaggerConfig.java new file mode 100644 index 0000000..4079b06 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/SwaggerConfig.java @@ -0,0 +1,49 @@ +package com.mh.user.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.ParameterBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.schema.ModelRef; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Parameter; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-03-13 + * @throws : + */ +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + + @Bean + public Docket createRestApi(){ + // 添加请求参数,我们这里把token作为请求头部参数传入后端 + ParameterBuilder parameterBuilder = new ParameterBuilder(); + List parameters = new ArrayList(); + parameterBuilder.name("token").description("令牌") + .modelRef(new ModelRef("string")).parameterType("header").required(false).build(); + parameters.add(parameterBuilder.build()); + return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select() + .apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()) + .build().globalOperationParameters(parameters); +// return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select() +// .apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build(); + } + + private ApiInfo apiInfo(){ + return new ApiInfoBuilder().build(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/config/WebSecurityConfig.java b/user-service/src/main/java/com/mh/user/config/WebSecurityConfig.java new file mode 100644 index 0000000..637a2f6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/config/WebSecurityConfig.java @@ -0,0 +1,83 @@ +package com.mh.user.config; + +import com.mh.user.security.JwtAuthenticationFilter; +import com.mh.user.security.JwtAuthenticationProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler; +import org.springframework.web.cors.CorsUtils; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; + +/** + * Spring Security配置 + * @author Louis + * @date Jan 14, 2019 + */ +@Configuration +@EnableWebSecurity // 开启Spring Security +//@EnableGlobalMethodSecurity(prePostEnabled = true) // 开启权限注解,如:@PreAuthorize注解 +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Qualifier("userDetailsServiceImpl") + @Autowired + private UserDetailsService userDetailsService; + + @Override + public void configure(AuthenticationManagerBuilder auth) throws Exception { + // 使用自定义身份验证组件 + auth.authenticationProvider(new JwtAuthenticationProvider(userDetailsService)); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + // 禁用 csrf, 由于使用的是JWT,我们这里不需要csrf +// System.out.println("test0"); +// http.cors().and().csrf().disable() +// .authorizeRequests() +// // 跨域预检请求 +// .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() +// // web jars +// .antMatchers("/webjars/**").permitAll() +// // 查看SQL监控(druid) +// .antMatchers("/druid/**").permitAll() +// // 首页和登录页面 +// .antMatchers("/").permitAll() +// .antMatchers("/login").permitAll() +// // swagger +// .antMatchers("/swagger-ui.html").permitAll() +// .antMatchers("/swagger-resources/**").permitAll() +// .antMatchers("/v2/api-docs").permitAll() +// .antMatchers("/webjars/springfox-swagger-ui/**").permitAll() +// // 验证码 +// .antMatchers("/captcha.jpg**").permitAll() +// // 服务监控 +// .antMatchers("/actuator/**").permitAll() +// // 其他所有请求需要身份认证 +// .anyRequest().authenticated(); +// // 退出登录处理器 +// http.logout().logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler()); +// // token验证过滤器 +// http.addFilterBefore(new JwtAuthenticationFilter(authenticationManager()), UsernamePasswordAuthenticationFilter.class); +// System.out.println("test0_1"); + // 禁用token验证 + http.csrf().disable().authorizeRequests().anyRequest().permitAll().and().logout().permitAll(); + } + + @Bean + @Override + public AuthenticationManager authenticationManager() throws Exception { + return super.authenticationManager(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/constants/Constant.java b/user-service/src/main/java/com/mh/user/constants/Constant.java new file mode 100644 index 0000000..a4a65c6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/constants/Constant.java @@ -0,0 +1,18 @@ +package com.mh.user.constants; + +/** + * @author ljf + * @title : + * @description : 存放一些公共全局参数 + * @updateTime 2020-05-29 + * @throws : + */ +public class Constant { + + public static boolean CONTROL_WEB_FLAG = false; + public static boolean SEND_STATUS = false; // 指令发送状态 + public static boolean FLAG = false; + public static boolean WEB_FLAG = false; // 判断是否有前端指令下发 + public static int projectId=1; // 项目编号 + +} diff --git a/user-service/src/main/java/com/mh/user/constants/SocketMessage.java b/user-service/src/main/java/com/mh/user/constants/SocketMessage.java new file mode 100644 index 0000000..cc3c616 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/constants/SocketMessage.java @@ -0,0 +1,33 @@ +package com.mh.user.constants; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-06-09 + * @throws : + */ +@PropertySource("classpath:socket.yml") +@ConfigurationProperties(prefix = "socket") +@Setter +@Getter +@Component +public class SocketMessage { + + @Value("${IP}") + private String IP; + + @Value("${port}") + private int port; + + @Value("${overtime}") + private int overTime; + +} diff --git a/user-service/src/main/java/com/mh/user/constants/SysConstants.java b/user-service/src/main/java/com/mh/user/constants/SysConstants.java new file mode 100644 index 0000000..0e93a31 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/constants/SysConstants.java @@ -0,0 +1,11 @@ +package com.mh.user.constants; + +/** + * author: ljf + * desc: 系统常量值 + */ +public interface SysConstants { + + // 系统管理员用户名 + String ADMIN = "admin"; +} diff --git a/user-service/src/main/java/com/mh/user/controller/AreaController.java b/user-service/src/main/java/com/mh/user/controller/AreaController.java new file mode 100644 index 0000000..4b7c1fd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/AreaController.java @@ -0,0 +1,38 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.entity.AreaEntity; +import com.mh.user.entity.ExceptionTableData; +import com.mh.user.service.AreaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author nxr + * @title : 校区接口 + * @description : + * @updateTime 2022-06-09 + * @throws : + */ +@RestController +@RequestMapping("area") +public class AreaController { + + @Autowired + private AreaService areaService; + + @PreAuthorize("hasAuthority('sys:area:view')") + @PostMapping(value = "/findArea") + public HttpResult findArea() { + List list=areaService.findAll(); +// System.out.println("test"); + return HttpResult.ok("500",list); + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/BuildingController.java b/user-service/src/main/java/com/mh/user/controller/BuildingController.java new file mode 100644 index 0000000..cd387a4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/BuildingController.java @@ -0,0 +1,90 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.BuildingEntity; +import com.mh.user.model.BuildingModel; +import com.mh.user.service.BuildingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("building") +public class BuildingController { + + @Autowired + private BuildingService buildingService; + + //保存 + @SysLogger(value="楼栋管理",optDesc = "添加楼栋信息") + @PostMapping(value="/save") + public HttpResult saveBuilding(@RequestBody BuildingEntity buildingEntity) { + try{ + return HttpResult.ok(buildingService.saveBuilding(buildingEntity)); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + + } + + //修改 + @SysLogger(value="楼栋管理",optDesc = "编辑楼栋信息") + @PostMapping(value="/update") + public HttpResult updateBuilding(@RequestBody BuildingEntity buildingEntity) { + return HttpResult.ok(buildingService.updateBuilding(buildingEntity)); + } + + //查询所有 + @SysLogger(value="楼栋管理",optDesc = "查询楼栋信息") + @PostMapping(value = "/query") + public HttpResult queryBuilding(@RequestParam(value = "buildingId", required = false)String buildingId, + @RequestParam(value= "page", required=true)Integer page, + @RequestParam(value= "limit", required=true)Integer limit) { + try{ + int count=buildingService.getCount(buildingId, page,limit); + List records=buildingService.queryBuilding(buildingId, page,limit); + return HttpResult.ok(count,records); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + //查询楼栋名称 + @PostMapping(value="/name") + public HttpResult selectBuildingName() { + try{ + List list=buildingService.selectBuildingName(); + return HttpResult.ok(list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + + } + + // 删除多 + @PostMapping(value="/deletes") + public HttpResult delete(@RequestBody List records) { + return HttpResult.ok(buildingService.deleteBuilding(records)); + } + + // 删除单个 + @SysLogger(value="楼栋管理",optDesc = "删除楼栋信息") + @PostMapping(value="/delete") + public HttpResult delete(@RequestParam String id ) { + return HttpResult.ok(buildingService.deleteBuilding(id)); + } + + // 查询编号 + @PostMapping(value="/selectBuildingId") + public HttpResult selectBuildingId(@RequestParam String buildingName ) { + String id=buildingService.selectBuildingId(buildingName); + return HttpResult.ok(id); + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/ChartController.java b/user-service/src/main/java/com/mh/user/controller/ChartController.java new file mode 100644 index 0000000..6ca7ed4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/ChartController.java @@ -0,0 +1,56 @@ +package com.mh.user.controller; + +import com.alibaba.fastjson.JSONArray; +import com.mh.common.http.HttpResult; +import com.mh.user.entity.chart.ChartEntity; +import com.mh.user.entity.chart.GetChartParams; +import com.mh.user.service.chart.ChartService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author ljf + * @title : 图表查询接口 + * @description : + * @updateTime 2020-07-17 + * @throws : + */ +@RestController +@RequestMapping("/report") +public class ChartController { + + @Autowired + private ChartService chartService; + + @PostMapping("/getFirstColChartsData") + public HttpResult getFirstColChartsData(@RequestBody GetChartParams getChartParams) { + System.out.println(getChartParams.toString()); + // 遍历数组参数 + StringBuilder chooseIndexIds = new StringBuilder(); + int b = 0; + for (int a : + getChartParams.getChooseIndexId()) { + b = b + 1; + if (b == 1) { + chooseIndexIds = new StringBuilder(String.valueOf(a)); + } else { + chooseIndexIds.append(",").append(a); + } + } + System.out.println(chooseIndexIds); + Map map = new HashMap<>(); + map.put("choose_index_ids", chooseIndexIds.toString()); + map.put("begin_time",getChartParams.getBeginTime()); + map.put("end_time",getChartParams.getEndTime()); + map.put("type",getChartParams.getType()); + map.put("chart_id",getChartParams.getChartId()); + List chartEntityList = chartService.queryChartData(map); + System.out.println(JSONArray.toJSONString(chartEntityList)); + return HttpResult.ok("success",chartEntityList); + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/ChillersController.java b/user-service/src/main/java/com/mh/user/controller/ChillersController.java new file mode 100644 index 0000000..5308074 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/ChillersController.java @@ -0,0 +1,140 @@ +package com.mh.user.controller; + +import com.alibaba.fastjson.JSONObject; +import com.mh.common.http.HttpResult; +import com.mh.user.dto.DisplayBoxDataDTO; +import com.mh.user.dto.TableInfoDTO; +import com.mh.user.entity.GaugeEntity; +import com.mh.user.entity.HostValue; +import com.mh.user.entity.TableDataEntity; +import com.mh.user.entity.TableInfoEntity; +import com.mh.user.service.chillers.ChillersService; +import com.mh.user.service.chillers.DeviceDisplayService; +import com.mh.user.service.chillers.GaugeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 设备监控操作控制接口 + * @updateTime 2020-05-20 + * @throws : + */ +@RestController +public class ChillersController { + + private final ChillersService chillersService; + private final DeviceDisplayService deviceDisplayService; + + public ChillersController(ChillersService chillersService, DeviceDisplayService deviceDisplayService) { + this.chillersService = chillersService; + this.deviceDisplayService = deviceDisplayService; + } + + // 查询冷水机组各个部位的状态值 +// @GetMapping("/chillers") + + /** + * 查询冷水机组进出水温度值等设备数据详情 + * @param deviceType + * @param type + * @return + */ + @GetMapping("/charts/getDisplayBoxData") + public HttpResult getDisplayBoxData(@RequestParam(value = "deviceType") String deviceType, + @RequestParam(value = "type") Integer type) { + List displayBoxDataDTOS = deviceDisplayService.deviceDisplayBoxData(deviceType, String.valueOf(type)); + return HttpResult.ok("success", displayBoxDataDTOS); + } + + /** + * 主机监测详情左侧表格数据 + * @param deviceName + * @return + */ + @GetMapping("/charts/getHostTableOneData") + public HttpResult queryChillersOneTable(@RequestParam(value = "deviceName") String deviceName) { + TableInfoDTO tableInfoDTO = new TableInfoDTO<>(); + tableInfoDTO.setTableInfo(chillersService.queryLeftAndRightData(deviceName, 1)); + return HttpResult.ok("success", tableInfoDTO); + } + + /** + * 主机监测详情顶部表格数据 + * @param deviceName + * @return + */ + @GetMapping("/charts/getHostTopData") + public HttpResult queryChillersTopTable(@RequestParam(value = "deviceName", required = true) String deviceName) { + TableInfoDTO tableInfoDTO = new TableInfoDTO<>(); + tableInfoDTO.setTableInfo(chillersService.queryTopData(deviceName, 1)); + return HttpResult.ok("success", tableInfoDTO); + } + + /** + * 主机监测详情右侧一表格数据 + * @param deviceName + * @return + */ + @GetMapping("/charts/getHostTableTwoData") + public HttpResult queryChillersRightTable(@RequestParam(value = "deviceName", required = true) String deviceName) { + TableInfoDTO tableInfoDTO = new TableInfoDTO<>(); + tableInfoDTO.setTableInfo(chillersService.queryLeftAndRightData(deviceName, 2)); + return HttpResult.ok("success", tableInfoDTO); + } + + /** + * 主机监测详情右侧二表格数据 + * @param deviceName + * @return + */ + @GetMapping("/charts/getHostTableThreeData") + public HttpResult queryChillersRightTable1(@RequestParam(value = "deviceName", required = true) String deviceName) { + TableInfoDTO tableInfoDTO = new TableInfoDTO<>(); + tableInfoDTO.setTableInfo(chillersService.queryLeftAndRightData(deviceName, 3)); + return HttpResult.ok("success", tableInfoDTO); + } + + // 冷却泵、冷冻泵、冷却塔详情页顶部表格数据 + @GetMapping("/charts/getPumpOrTowerTopTableData") + public HttpResult getPumpOrTowerTopData(@RequestParam(value = "deviceName", required = true) String deviceName) { + TableInfoDTO tableInfoDTO = new TableInfoDTO<>(); + tableInfoDTO.setTableInfo(chillersService.queryLeftAndRightData(deviceName, 1)); + return HttpResult.ok("success", tableInfoDTO); + } + + // 冷却泵、冷冻泵、冷却塔详情页顶部数据 +// @GetMapping("/charts/getPumpOrTowerTopTableData") + @GetMapping("/charts/getPumpOrTowerTopData") + public HttpResult getPumpOrTowerTopTableData(@RequestParam(value = "deviceName", required = true) String deviceName) { + TableInfoDTO tableInfoDTO = new TableInfoDTO<>(); + tableInfoDTO.setTableInfo(chillersService.queryTopData(deviceName, 1)); + return HttpResult.ok("success", tableInfoDTO); + } + + + // 获取冷却/冷冻水进出水温度、主机/冷却塔温度 + @GetMapping("/operation/getTempValue") + public HttpResult getTempValue(@RequestParam(value = "deviceType", required = true) String deviceType) { + List hostValueList = chillersService.queryTempValue(deviceType); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("values", hostValueList); + return HttpResult.ok("success",jsonObject); + } + + @Autowired + private GaugeService gaugeService; + + // 设备监控页表盘分析图 + @GetMapping("/charts/getGaugeData") + public HttpResult getGaugeData(@RequestParam(value = "type") String type, @RequestParam(value = "deviceName") String deviceName) { + GaugeEntity gaugeEntity = gaugeService.getGaugeData(type,deviceName); + return HttpResult.ok("success",gaugeEntity); + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/DataResultController.java b/user-service/src/main/java/com/mh/user/controller/DataResultController.java new file mode 100644 index 0000000..e49f766 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/DataResultController.java @@ -0,0 +1,328 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.DataResultChEntity; +import com.mh.user.entity.DataResultEntity; +import com.mh.user.service.BuildingService; +import com.mh.user.service.DataResultService; +import com.mh.user.utils.ExchangeStringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.text.SimpleDateFormat; +import java.util.*; + +@RestController +@RequestMapping("dataResult") +public class DataResultController { + + @Autowired + DataResultService dataResultService; + + @Autowired + BuildingService buildingService; + + + @SysLogger(value="中央空调",optDesc = "数据分析查询") + @PostMapping(value="/query") + public HttpResult queryDataResult(@RequestParam(value = "projectID", required = false) String projectID, + @RequestParam(value= "startDate", required=false)String startDate, + @RequestParam(value= "endDate", required=false)String endDate, + @RequestParam(value= "deviceType", required=false)String deviceType, + @RequestParam(value= "page", required=true)Integer page, + @RequestParam(value= "limit", required=true)Integer limit) { + + try{ + + int count=dataResultService.getDataResultCount(projectID,startDate,endDate,deviceType,page,limit); + List records=dataResultService.queryDataResult(projectID,startDate,endDate,deviceType,page,limit); + return HttpResult.ok(count,records); + + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + @SysLogger(value="中央空调",optDesc = "能耗分析按小时查询") + @PostMapping(value="/hour") + public HttpResult queryDataResultMi(@RequestParam(value= "projectID", required=false)String projectID, + @RequestParam(value= "dateType", required=false)String dateType, + @RequestParam(value= "curDate", required=false)String curDate, + @RequestParam(value="page", required=false) int page, + @RequestParam(value="limit", required=false) int limit) { + try{ + if(projectID!=null && projectID.length()>0){ + String startDate=""; + curDate=curDate.substring(0,16)+":00"; + if (dateType.equals("1小时")){ + startDate= ExchangeStringUtil.dateRoll(1,curDate); + List records=dataResultService.queryDataResultMi(projectID,startDate,curDate,page,limit,0); + int count=dataResultService.dataResultOneMiCount(projectID,startDate,curDate); + return HttpResult.ok(count,records); + }else if (dateType.equals("2小时")){ + startDate=ExchangeStringUtil.dateRoll(2,curDate); + List records=dataResultService.queryDataResultMi(projectID,startDate,curDate,page,limit,0); + int count=dataResultService.dataResultOneMiCount(projectID,startDate,curDate); + return HttpResult.ok(count,records); + }else if (dateType.equals("8小时")){ + startDate=ExchangeStringUtil.dateRoll(8,curDate); + List records=dataResultService.queryDataResultMi(projectID,startDate,curDate,page,limit,1); + int count=dataResultService.dataResultFiveMiCount(projectID,startDate,curDate); + return HttpResult.ok(count,records); + }else if (dateType.equals("12小时")){ + startDate=ExchangeStringUtil.dateRoll(12,curDate); + List records=dataResultService.queryDataResultMi(projectID,startDate,curDate,page,limit,1); + int count=dataResultService.dataResultFiveMiCount(projectID,startDate,curDate); + return HttpResult.ok(count,records); + }else if (dateType.equals("24小时")){ + startDate=ExchangeStringUtil.dateRoll(24,curDate); + List records=dataResultService.queryDataResultMi(projectID,startDate,curDate,page,limit,2); + int count=dataResultService.dataResultFifteenMiCount(projectID,startDate,curDate); + return HttpResult.ok(count,records); + }else{ //1小时 + startDate=ExchangeStringUtil.dateRoll(1,curDate); + List records=dataResultService.queryDataResultMi(projectID,startDate,curDate,page,limit,0); + int count=dataResultService.dataResultOneMiCount(projectID,startDate,curDate); + return HttpResult.ok(count,records); + } + }else{ + return HttpResult.error(); + } + }catch (Exception e){ +// e.printStackTrace(); + return HttpResult.error(); + } + } + + @SysLogger(value="中央空调",optDesc = "能耗分析按分钟查询") + @PostMapping(value="/minute") + public HttpResult queryDataResultSec(@RequestParam(value= "projectID", required=false)String projectID, + @RequestParam(value= "dateType", required=false)String dateType, + @RequestParam(value= "curDate", required=false)String curDate, + @RequestParam(value="page",required=false) int page, + @RequestParam(value="limit",required=false) int limit) { + + try{ + SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String startDate=""; //起始时间 + String strDate=""; //遍历时间 + String strDate2=""; + curDate=curDate.substring(0,16)+":00"; + if (dateType.equals("1分钟")){ + startDate= ExchangeStringUtil.dateTime(1,curDate); + List records=dataResultService.queryDataResultSec(projectID,startDate,curDate); + String deviceAddr=records.get(0).getDeviceAddr(); + String projectName=records.get(0).getProjectName(); + +// Date date=df.parse(startDate); //顺序 + Date date=df.parse(curDate); //倒序 + List> listMap=new ArrayList>(); + for (int i=0;i<60;i++){ + Mapmap=new HashMap(); + //date.setTime(date.getTime()+1000);//顺序 + date.setTime(date.getTime()-1000);//倒序 + strDate=df.format(date); + map.put("deviceAddr",deviceAddr); + map.put("projectName",projectName); + map.put("curDate",strDate); + map.put("curValue","0"); + for (DataResultChEntity dataResult: records) { + strDate2=df.format(dataResult.getCurDate()); + if (strDate2.equals(strDate)){ + map.put("curValue",dataResult.getCurValue()); + } + } + listMap.add(map); + } + return HttpResult.ok(60,listMap); + + }else if (dateType.equals("2分钟")){ + startDate=ExchangeStringUtil.dateTime(2,curDate); + List records=dataResultService.queryDataResultSec(projectID,startDate,curDate); + String deviceAddr=records.get(0).getDeviceAddr(); + String projectName=records.get(0).getProjectName(); + //Date date=df.parse(startDate);//顺序 + Date date=df.parse(curDate); //倒序 + List> listMap=new ArrayList>(); + for (int i=0;i<120;i++){ + Mapmap=new HashMap(); + //date.setTime(date.getTime()+1000); + date.setTime(date.getTime()-1000);//倒序 + strDate=df.format(date); + map.put("deviceAddr",deviceAddr); + map.put("projectName",projectName); + map.put("curDate",strDate); + map.put("curValue","0"); + for (DataResultChEntity dataResult: records) { + strDate2=df.format(dataResult.getCurDate()); + if (strDate2.equals(strDate)){ + map.put("curValue",dataResult.getCurValue()); + } + } + listMap.add(map); + } + return HttpResult.ok(120,listMap); + }else if (dateType.equals("5分钟")){ + startDate=ExchangeStringUtil.dateTime(5,curDate); + List records=dataResultService.queryDataResultSec(projectID,startDate,curDate); + String deviceAddr=records.get(0).getDeviceAddr(); + String projectName=records.get(0).getProjectName(); + String s=startDate.substring(18,19); + if (Integer.parseInt(s)>=0 && Integer.parseInt(s)<5){ + startDate=startDate.substring(0,18)+"0"; + }else{ + startDate=startDate.substring(0,18)+"5"; + } + + //Date date=df.parse(startDate);//顺序 + Date date=df.parse(curDate); //倒序 + List> listMap=new ArrayList>(); + for (int i=0;i<60;i++){ + Mapmap=new HashMap(); + //date.setTime(date.getTime()+5000); + date.setTime(date.getTime()-5000); + strDate=df.format(date); + map.put("deviceAddr",deviceAddr); + map.put("projectName",projectName); + map.put("curDate",strDate); + map.put("curValue","0"); + for (DataResultChEntity dataResult: records) { + strDate2=df.format(dataResult.getCurDate()); + if (strDate2.equals(strDate)){ +// map.put("curDate",curDate); + map.put("curValue",dataResult.getCurValue()); + } + } + listMap.add(map); + } + + return HttpResult.ok(60,listMap); + }else if (dateType.equals("15分钟")){ + startDate=ExchangeStringUtil.dateTime(15,curDate); + List records=dataResultService.queryDataResultSec(projectID,startDate,curDate); + String deviceAddr=records.get(0).getDeviceAddr(); + String projectName=records.get(0).getProjectName(); + String s=startDate.substring(18,19); + if (Integer.parseInt(s)>=0 && Integer.parseInt(s)<5){ + startDate=startDate.substring(0,18)+"0"; + }else{ + startDate=startDate.substring(0,18)+"5"; + } + + //Date date=df.parse(startDate); + Date date=df.parse(curDate); + List> listMap=new ArrayList>(); + for (int i=0;i<180;i++){ + Mapmap=new HashMap(); + //date.setTime(date.getTime()+5000); + date.setTime(date.getTime()-5000); + strDate=df.format(date); + map.put("deviceAddr",deviceAddr); + map.put("projectName",projectName); + map.put("curDate",strDate); + map.put("curValue","0"); + for (DataResultChEntity dataResult: records) { + strDate2=df.format(dataResult.getCurDate()); + if (strDate2.equals(strDate)){ +// map.put("curDate",curDate); + map.put("curValue",dataResult.getCurValue()); + } + } + listMap.add(map); + } + + return HttpResult.ok(180,listMap); + }else if (dateType.equals("30分钟")){ + startDate=ExchangeStringUtil.dateTime(30,curDate); + List records=dataResultService.queryDataResultSec(projectID,startDate,curDate); + String deviceAddr=records.get(0).getDeviceAddr(); + String projectName=records.get(0).getProjectName(); + String s=startDate.substring(18,19); + if (Integer.parseInt(s)>=0 && Integer.parseInt(s)<5){ + startDate=startDate.substring(0,18)+"0"; + }else{ + startDate=startDate.substring(0,18)+"5"; + } + + //Date date=df.parse(startDate); + Date date=df.parse(curDate); + List> listMap=new ArrayList>(); + for (int i=0;i<180;i++){ + Mapmap=new HashMap(); + //date.setTime(date.getTime()+10000); + date.setTime(date.getTime()-10000); + strDate=df.format(date); + map.put("deviceAddr",deviceAddr); + map.put("projectName",projectName); + map.put("curDate",strDate); + map.put("curValue","0"); + for (DataResultChEntity dataResult: records) { + strDate2=df.format(dataResult.getCurDate()); + if (strDate2.equals(strDate)){ +// map.put("curDate",curDate); + map.put("curValue",dataResult.getCurValue()); + } + } + listMap.add(map); + } + return HttpResult.ok(180,listMap); + }else{ //1分钟 + startDate= ExchangeStringUtil.dateTime(1,curDate); + List records=dataResultService.queryDataResultSec(projectID,startDate,curDate); + String deviceAddr=records.get(0).getDeviceAddr(); + String projectName=records.get(0).getProjectName(); + //Date date=df.parse(startDate); + Date date=df.parse(curDate); + List> listMap=new ArrayList>(); + for (int i=0;i<60;i++){ + Mapmap=new HashMap(); + //date.setTime(date.getTime()+1000); + date.setTime(date.getTime()-1000); + strDate=df.format(date); + map.put("deviceAddr",deviceAddr); + map.put("projectName",projectName); + map.put("curDate",strDate); + map.put("curValue","0"); + for (DataResultChEntity dataResult: records) { + strDate2=df.format(dataResult.getCurDate()); + if (strDate2.equals(strDate)){ +// map.put("curDate",strDate); + map.put("curValue",dataResult.getCurValue()); + } + } + listMap.add(map); + } + return HttpResult.ok(listMap); + } + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + @SysLogger(value="中央空调",optDesc = "查询冷水机参数实时值") + @PostMapping(value="/dataNow") + public HttpResult selectDataResultNow(@RequestParam(value= "deviceAddr", required=false)String deviceAddr, + @RequestParam(value= "deviceType", required=false)String deviceType, + @RequestParam(value= "projectID", required=false)String projectID) { + + List dataNow=dataResultService.selectDataResultNow(deviceAddr, deviceType, projectID); + return HttpResult.ok("success",dataNow); + } + + @SysLogger(value="中央空调",optDesc = "查询冷水机参数值") + @PostMapping(value="/dataChiller") + public HttpResult queryDataResultChiller(@RequestParam("projectID")String projectID, + @RequestParam("deviceAddr")String deviceAddr, + @RequestParam("registerName")String registerName, + @RequestParam(value= "startDate", required=false)String startDate, + @RequestParam(value="curDate", required=false)String curDate, + @RequestParam("page")int page, + @RequestParam("limit")int limit) { + + int count=dataResultService.dataResultChillerCount(projectID,deviceAddr, registerName, startDate, curDate); + List dataChiller=dataResultService.queryDataResultChiller(projectID,deviceAddr,registerName,startDate,curDate,page,limit); + return HttpResult.ok(count,dataChiller); + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/DeviceInfoController.java b/user-service/src/main/java/com/mh/user/controller/DeviceInfoController.java new file mode 100644 index 0000000..75a8535 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/DeviceInfoController.java @@ -0,0 +1,57 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.DeviceInfoEntity; +import com.mh.user.model.ChillerModel; +import com.mh.user.model.DeviceModel; +import com.mh.user.service.DeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("deviceInfo") +public class DeviceInfoController { + + @Autowired + DeviceInfoService deviceInfoService; + + @SysLogger(value="设备信息",optDesc = "查询设备信息") + @PostMapping("/query") + public HttpResult queryMeterInfo(@RequestParam(value = "systemID") String systemID, + @RequestParam(value = "projectID") String projectID, + @RequestParam(value = "deviceType") String deviceType){ + + List list=deviceInfoService.queryDeviceInfo(systemID,projectID,deviceType); + return HttpResult.ok(list); + } + + @SysLogger(value="设备信息",optDesc = "查询冷水机列表") + @PostMapping("/list") + public HttpResult selectDevices(@RequestParam(value = "systemID") String systemID, + @RequestParam(value = "projectID") String projectID){ + List list=deviceInfoService.selectDevices(projectID); + return HttpResult.ok(list); + } + + @SysLogger(value="设备信息",optDesc = "查询多个冷水机相关信息") + @PostMapping("/chillers") + public HttpResult queryChiller(@RequestParam(value = "projectID") String projectID, + @RequestParam(value = "deviceAddr") String deviceAddr){ + List list=deviceInfoService.queryChiller(projectID,deviceAddr); + return HttpResult.ok(list); + } + + @SysLogger(value="设备信息",optDesc = "查询单个冷水机相关信息") + @PostMapping("/chiller") + public HttpResult selectChiller(@RequestParam(value = "projectID") String projectID, + @RequestParam(value = "deviceAddr") String deviceAddr){ + ChillerModel chillerModel=deviceInfoService.selectChiller(projectID,deviceAddr); + return HttpResult.ok(chillerModel); + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/DeviceManageController.java b/user-service/src/main/java/com/mh/user/controller/DeviceManageController.java new file mode 100644 index 0000000..aa1f962 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/DeviceManageController.java @@ -0,0 +1,299 @@ +package com.mh.user.controller; + +import com.alibaba.fastjson.JSONObject; +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.dto.DeviceMessageDTO; +import com.mh.user.entity.*; +import com.mh.user.manage.QuartzManager; +import com.mh.user.netty.NettyChillerControlClient; +import com.mh.user.service.chillers.DeviceDisplayService; +import com.mh.user.constants.Constant; +import com.mh.user.service.chillers.DeviceManageService; +import com.mh.user.service.chillers.DeviceParamService; +import com.mh.user.service.chillers.GatewayManageService; +import com.mh.user.utils.GetReadOrder485; +import com.mh.user.utils.QuerySendThread; +import com.mh.user.constants.SocketMessage; +import com.mh.user.utils.TimeDifferenceUtil; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.text.ParseException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : 设备管理接口 + * @updateTime 2020-05-29 + * @updateTime 2020-07-17 + * @throws : + */ +@RestController +public class DeviceManageController { + + private final DeviceDisplayService deviceDisplayService; + private final GatewayManageService gatewayManageService; + private final DeviceManageService deviceManageService; + private final DeviceParamService deviceParamService; + + public DeviceManageController(DeviceDisplayService deviceDisplayService, GatewayManageService gatewayManageService, DeviceManageService deviceManageService, DeviceParamService deviceParamService) { + this.deviceDisplayService = deviceDisplayService; + this.gatewayManageService = gatewayManageService; + this.deviceManageService = deviceManageService; + this.deviceParamService = deviceParamService; + } + + @Resource + QuartzManager quartzManager; + + @Autowired + private SocketMessage socketMessage; + + // 查询设备信息状态 + @GetMapping("/operation/getColdStation") + public HttpResult getColdStation(@RequestParam(value = "deviceType", required = true) String deviceType) { + List deviceMessageList = deviceDisplayService.queryDeviceStatus(deviceType); + Map formValues = new HashMap<>(); + formValues.put("formValues",deviceMessageList); + return HttpResult.ok("success", formValues); + } + + // 对设备进行操作处理 + @PostMapping("/operation/operationDevice") + public HttpResult operationDevice(@RequestBody List changeValues) { + String result; + try { + List orderMessageEntityList; + // type值 0:修改频率, 1:修改开关状态, 2: 关闭冷却泵之前,查询最近关闭的冷却塔时间,3: 群控手自动切换类型,4: 修改温度, 5: 修改压力 +// // 添加网页发送指令状态 update by ljf on 2020-08-07 + Constant.CONTROL_WEB_FLAG = true; + // 暂停采集 +// quartzManager.pauseJob("DDC","JobDDCGroup"); +// Thread.sleep(2000); + // 修改成不用暂停采集处理 + GetReadOrder485 getReadOrder485 = new GetReadOrder485(); + // 判断是否是去关闭冷却泵,如果是,需要检查最近冷却塔有没有关闭并且关闭时间大于8分钟 + // 判断changeValues大小 + int size = changeValues.size(); + int type = changeValues.get(0).getType(); + if (type == 3 && size == 1) { + // 生成指令 + orderMessageEntityList = getReadOrder485.createOrder(changeValues); + if (orderMessageEntityList.size() != 0) { + // 开启发送指令 + NettyChillerControlClient nettyChillerControlClient = new NettyChillerControlClient(); +// nettyChillerControlClient.connect(8081, "192.168.1.131", orderMessageEntityList); + nettyChillerControlClient.connect(socketMessage.getPort(), socketMessage.getIP(), orderMessageEntityList); + // 开启线程监测标志 + QuerySendThread querySendThread = new QuerySendThread(); + querySendThread.start(); + if (Constant.SEND_STATUS) { + result = "success"; + } else { + result = "fail"; + } + } else { + result = "fail"; + } + } else if (type == 2 && size == 1) { + TimeDifferenceUtil timeDifferenceUtil = new TimeDifferenceUtil(); + Boolean a = timeDifferenceUtil.timeDifference(socketMessage.getOverTime()); + if (a) { + // 生成指令 + orderMessageEntityList = getReadOrder485.createOrder(changeValues); + if (orderMessageEntityList.size() != 0) { + // 开启发送指令 + NettyChillerControlClient nettyChillerControlClient = new NettyChillerControlClient(); +// nettyChillerControlClient.connect(8081, "192.168.1.131", orderMessageEntityList); + nettyChillerControlClient.connect(socketMessage.getPort(), socketMessage.getIP(), orderMessageEntityList); + // 开启线程监测标志 + QuerySendThread querySendThread = new QuerySendThread(); + querySendThread.start(); + if (Constant.SEND_STATUS) { + result = "success"; + } else { + result = "fail"; + } + } else { + result = "fail"; + } + } else { + result = "冷却塔关机还没有超过8分钟"; + } + } else { + // 生成指令 + orderMessageEntityList = getReadOrder485.createOrder(changeValues); + if (orderMessageEntityList.size() != 0) { + // 开启发送指令 + NettyChillerControlClient nettyChillerControlClient = new NettyChillerControlClient(); +// nettyChillerControlClient.connect(8081, "192.168.1.131", orderMessageEntityList); + nettyChillerControlClient.connect(socketMessage.getPort(), socketMessage.getIP(), orderMessageEntityList); + // 开启线程监测标志 + QuerySendThread querySendThread = new QuerySendThread(); + querySendThread.start(); + if (Constant.SEND_STATUS) { + result = "success"; + } else { + result = "fail"; + } + } else { + result = "fail"; + } + } + Constant.CONTROL_WEB_FLAG = false; + // 不需要停止采集 +// Constant.WEB_FLAG = false; +// // 延迟5秒处理,等待线程处理数据 + Thread.sleep(500); +// // 重新开启定时采集 +// quartzManager.resumeAllJob(); +// quartzManager.resumeJob("DDC","JobDDCGroup"); + } catch (InterruptedException | ParseException e) { + e.printStackTrace(); + result = "fail"; + } + // 异常情况处理 + return HttpResult.ok(result); + } + + /** + * 查询网关信息 + * @param requestJson + * @return + */ + @PostMapping("/gateWay/getGateWayList") + public HttpResult gateWayList(@RequestBody String requestJson){ + JSONObject jsonObject =JSONObject.parseObject(requestJson); + Integer operator = null; + Integer grade = null; + if(jsonObject.get("operator") != null){ + if(jsonObject.get("operator").equals("中国移动")){ + operator = 0; + }else if(jsonObject.get("operator").equals("中国联通")){ + operator = 1; + }else if(jsonObject.get("operator").equals("中国电信")){ + operator = 2; + } + } + if(jsonObject.get("grade") != null){ + if(jsonObject.get("grade").equals("正常")){ + grade = 0; + }else if(jsonObject.get("grade").equals("不在线")){ + grade = 1; + }else if(jsonObject.get("grade").equals("异常")){ + grade = 2; + } + } + List gateWayList = gatewayManageService.queryByOther(grade,operator); + JSONObject tableData = new JSONObject(); + tableData.put("tableData",gateWayList); + return HttpResult.ok(tableData); +// System.out.println(requestJson); +// return null; + } + + /** + * 新增或更新网关信息 + * @param reqestJson + * @return + */ + @PostMapping("/gateWay/addOrUpdateGateWayInfo") + public HttpResult addOrUpdateGateWayInfo(@RequestBody GatewayManageEntity reqestJson){ + try { + System.out.println(reqestJson.toString()); + gatewayManageService.addOrUpdateGateWayInfo(reqestJson); + return HttpResult.ok(); + } catch (Exception e) { + e.printStackTrace(); + return HttpResult.error(e.getMessage()); + } + } + + /** + * 删除网关/基表/基表参数信息 + * @param requestJson + * @return + */ + @PostMapping("/device/deleteDeviceInfo") + public HttpResult deleteDeviceInfo(@RequestBody String requestJson){ + JSONObject jsonObject =JSONObject.parseObject(requestJson); + System.out.println(jsonObject.get("deviceId")); + try { + deviceManageService.deleteDeviceInfo((Integer)jsonObject.get("deviceId"),jsonObject.get("deviceType").toString()); + return HttpResult.ok(); + } catch (Exception e) { + e.printStackTrace(); + return HttpResult.error(e.getMessage()); + } + } + + /** + * 查询基表管理中的基表数据 + * @param requestJson + * @return + */ + @PostMapping("/baseMeter/getBaseMeterList") + public HttpResult getBaseMeterList(@RequestBody String requestJson){ + JSONObject jsonObject =JSONObject.parseObject(requestJson); + List list = deviceManageService.getDeviceByOther(jsonObject.get("deviceNum").toString()); + JSONObject tableData = new JSONObject(); + tableData.put("tableData",list); + return HttpResult.ok(tableData); + } + + /** + * 增加或更新基表信息数据 + * @param requestJson + * @return + */ + @PostMapping("/baseMeter/addOrUpdateBaseMeter") + public HttpResult addOrUpdateBaseMeter(@RequestBody DeviceManageEntity requestJson){ + try { + deviceManageService.addOrUpdateBaseMeter(requestJson); + return HttpResult.ok(); + } catch (Exception e) { + e.printStackTrace(); + return HttpResult.error("检查输入的设备码是否有误!"); + } + } + + /** + * 查询基表参数管理中的基表参数数据 + * @param requestJson + * @return + */ + @PostMapping("/baseMeterParam/getBaseMeterParamList") + public HttpResult getBaseMeterParamList(@RequestBody String requestJson){ + JSONObject jsonObject =JSONObject.parseObject(requestJson); + System.out.println(jsonObject.get("baseMeterType")); + String baseMeterType = (String) jsonObject.get("baseMeterType"); + List list = deviceParamService.getBaseMeterParamList(baseMeterType); + JSONObject tableData = new JSONObject(); + tableData.put("tableData",list); + return HttpResult.ok(tableData); + } + + /** + * 添加或更新基表参数信息 + * @param requestJson + * @return + */ + @PostMapping("/baseMeterParam/addOrUpdateBaseMeterParam") + public HttpResult addOrUpdateBaseMeterParam(@RequestBody DeviceParameterEntity requestJson){ + try { + deviceParamService.addOrUpdateBaseMeterParam(requestJson); + return HttpResult.ok(); + } catch (Exception e) { + e.printStackTrace(); + return HttpResult.error(e.getMessage()); + } + } + + +} diff --git a/user-service/src/main/java/com/mh/user/controller/EnergyController.java b/user-service/src/main/java/com/mh/user/controller/EnergyController.java new file mode 100644 index 0000000..33a0cd5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/EnergyController.java @@ -0,0 +1,109 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.EnergyEntity; +import com.mh.user.model.EnergyModel; +import com.mh.user.model.EnergyParam; +import com.mh.user.service.BuildingService; +import com.mh.user.service.EnergyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("energy") +public class EnergyController { + + @Autowired + EnergyService energyService; + + @Autowired + BuildingService buildingService; + + @PostMapping("/save") + public HttpResult saveEnergy(@RequestBody EnergyEntity energyEntity, @RequestParam(value = "type") int type){ + try{ + energyService.saveEnergy(energyEntity,type); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error("保存出错!"); + } + + } + + @PostMapping("/update") + public HttpResult updateEnergy(@RequestBody EnergyEntity energyEntity, @RequestParam(value = "type") int type){ + try{ + energyService.updateEnergy(energyEntity,type); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error("修改出错!"); + } + + } + + @PostMapping("/delete") + public HttpResult deleteEnergy(@RequestParam(value = "curDate") String curDate, + @RequestParam(value = "buildingId") String buildingId, + @RequestParam(value = "type") int type){ + try{ + energyService.deleteEnergy(curDate,buildingId,type); + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error("删除出错!"); + } + + } + + @SysLogger(value="中央热水",optDesc = "数据分析查询") + @PostMapping("/query") + public HttpResult queryEnergy(@RequestBody EnergyParam energyParam){ + try{ + List list; + list=energyService.queryEnergy(energyParam); + int count=energyService.getEnergyCount(energyParam); + return HttpResult.ok(count,list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + } + + //主界面水、电、单耗查询 + @SysLogger(value="中央热水",optDesc = "主界面水、电、单耗查询") + @PostMapping("/queryGroup") + public HttpResult queryEnergyGroup(@RequestParam(value = "curDate",required = true) String curDate, + @RequestParam(value = "type",required = true,defaultValue = "1") int type){ + try{ + List list; + list=energyService.queryEnergyGroup(curDate,type); + return HttpResult.ok(list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + + } + + //查询每天的用量 + @SysLogger(value="中央热水",optDesc = "查询每天的用量") + @PostMapping("/queryDay") + public HttpResult queryDayEnergy(@RequestParam(value = "buildingId",required = false) String buildingId, + @RequestParam(value = "startDate",required = false) String startDate, + @RequestParam(value = "endDate",required = false) String endDate, + @RequestParam(value = "page") int page, + @RequestParam(value = "limit") int limit){ + try{ + List list; + list=energyService.queryDayEnergy(buildingId,startDate,endDate,page,limit); + int count=energyService.getDayEnergyCount(buildingId,startDate,endDate,page,limit); + return HttpResult.ok(count,list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/EnergyDataController.java b/user-service/src/main/java/com/mh/user/controller/EnergyDataController.java new file mode 100644 index 0000000..7a7eae4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/EnergyDataController.java @@ -0,0 +1,41 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.entity.EnergyDataEntity; +import com.mh.user.entity.EnergyEntity; +import com.mh.user.model.EnergyModel; +import com.mh.user.service.EnergyDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("energyData") +public class EnergyDataController { + + @Autowired + EnergyDataService energyDataService; + + @SysLogger(value="中央空调",optDesc = "按小时、天、月、年查询用量") + @PostMapping("/query") + public HttpResult queryEnergyData(@RequestBody EnergyModel energyModel){ + try{ + String projectID=energyModel.getProjectID(); + if(projectID!=null && projectID.length()>0){ + List list=energyDataService.queryEnergyData(energyModel); + int count=energyDataService.getEnergyDataCount(energyModel); + return HttpResult.ok(count,list); + }else{ + return HttpResult.error(); + } + }catch (Exception e){ +// e.printStackTrace(); + return HttpResult.error("查询出错!"); + } + + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/MeterInfoController.java b/user-service/src/main/java/com/mh/user/controller/MeterInfoController.java new file mode 100644 index 0000000..49b67ac --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/MeterInfoController.java @@ -0,0 +1,30 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.MeterInfoEntity; +import com.mh.user.service.MeterInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("meterInfo") +public class MeterInfoController { + + @Autowired + MeterInfoService meterInfoService; + + @SysLogger(value="基表信息",optDesc = "查询基表信息") + @PostMapping("/query") + public HttpResult queryMeterInfo(@RequestParam(value = "systemID",required = false) String systemID, + @RequestParam(value = "projectID",required = false) String projectID){ + + List list=meterInfoService.queryMeterInfo(systemID,projectID); + return HttpResult.ok(list); + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/ProjectInfoController.java b/user-service/src/main/java/com/mh/user/controller/ProjectInfoController.java new file mode 100644 index 0000000..2b49870 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/ProjectInfoController.java @@ -0,0 +1,29 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.ProjectInfoEntity; +import com.mh.user.service.ProjectInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("pro") +public class ProjectInfoController { + + @Autowired + ProjectInfoService projectInfoService; + + @SysLogger(value="项目信息",optDesc = "查询项目信息") + @PostMapping("/queryPro") + public HttpResult queryProject(@RequestParam(value = "systemID")String systemID) { + List list=projectInfoService.queryProjectInfo(systemID); + + return HttpResult.ok(list); + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/SendTest.java b/user-service/src/main/java/com/mh/user/controller/SendTest.java new file mode 100644 index 0000000..b88e287 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SendTest.java @@ -0,0 +1,51 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.config.RabbitmqConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("send") +@Slf4j +public class SendTest { + + @Autowired + RabbitTemplate rabbitTemplate; + + @PostMapping(value="/test") + public HttpResult sendMsgByTopics(){ + /** + * 参数: + * 1、交换机名称 + * 2、routingKey + * 3、消息内容 + */ + for (int i=0;i<5;i++){ + String message = "恭喜您,注册成功!userId="+i; + rabbitTemplate.convertAndSend(RabbitmqConfig.EXCHANGE_NAME,"topic.#.zjjd.#",message); + log.info("SendMsg:" + message); + } + return HttpResult.ok(); + } + + @PostMapping(value="/op") + public HttpResult operate(@RequestParam("opMsg") String opMsg){ + rabbitTemplate.convertAndSend(RabbitmqConfig.EXCHANGE_NAME,"topic.zjjd",opMsg); + log.info("SendMsg:" + opMsg +" 到交换机"+RabbitmqConfig.EXCHANGE_NAME); + return HttpResult.ok(); + } + + + @PostMapping(value="/opt") + public HttpResult test(@RequestParam("opMsg") String opMsg){ + rabbitTemplate.convertAndSend(RabbitmqConfig.EXCHANGE_NAME,"topic.zjjd",opMsg); + log.info("SendMsg:" + opMsg +" 到交换机"+RabbitmqConfig.EXCHANGE_NAME); + return HttpResult.ok(); + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/SerialPortController.java b/user-service/src/main/java/com/mh/user/controller/SerialPortController.java new file mode 100644 index 0000000..42850c1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SerialPortController.java @@ -0,0 +1,195 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.constants.Constant; +import com.mh.user.entity.ControlSetEntity; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.model.SerialPortModel; +import com.mh.user.serialport.SerialPortSingle; +import com.mh.user.service.ControlSetService; +import com.mh.user.service.DeviceInstallService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("serial") +public class SerialPortController { + + @Autowired + DeviceInstallService deviceInstallService; + + @Autowired + ControlSetService controlSetService; + + //操作设备 + @PostMapping(value="/operate") + public HttpResult operateDevice(@RequestBody List params){ + try{ + SerialPortSingle serialPortSingle = new SerialPortSingle(); //发送接收类 + DeviceCodeParamEntity deviceCodeParam=new DeviceCodeParamEntity();//参数实体类 + + Constant.WEB_FLAG=true; //单抄,暂时停止采集 + for (SerialPortModel serialPortModel : + params) { + String deviceAddr=serialPortModel.getDeviceAddr();//设备通讯地址 + String deviceType=serialPortModel.getDeviceType();//设备类型 + String buildingId=serialPortModel.getBuildingId();//楼栋 + String param=serialPortModel.getParam();//操作参数 + DeviceInstallEntity deviceInstallEntity=deviceInstallService.selectDevice(deviceAddr,deviceType,buildingId); + //发送指令实体类 + deviceCodeParam.setDeviceAddr(deviceAddr); + deviceCodeParam.setDeviceType(deviceType); + deviceCodeParam.setDataPort(deviceInstallEntity.getDataPort()); + deviceCodeParam.setBaudRate(deviceInstallEntity.getBaudRate()); + deviceCodeParam.setParity(deviceInstallEntity.getParity()); + deviceCodeParam.setDataValue(serialPortModel.getDataValue());//传入相关参数值 + deviceCodeParam.setProjectID(buildingId); + String brand=deviceInstallEntity.getBrand();//品牌 + deviceCodeParam.setBrand(brand); + ControlSetEntity controlData=new ControlSetEntity(); + + //设置设备实体对象 + controlData.setBuildingId(deviceInstallEntity.getProjectID()); + + if (deviceType==null || deviceType.equals("") || deviceType.equals("热泵")){ + if (param==null || param.equals("") || param.equals("温度设定")){ + //发送指令 + deviceCodeParam.setRegisterAddr("0642"); //寄存器地址 + deviceCodeParam.setFunCode("10"); //功能码写数据 + + }else if(param.equals("时段1")){ + //发送指令 + deviceCodeParam.setRegisterAddr("0656"); //寄存器地址 + deviceCodeParam.setFunCode("10"); //功能码写数据 + //保存数据 + String time=serialPortModel.getDataValue(); + if (time.length()==8){ + String statTime=time.substring(0,2)+":"+time.substring(2,4); + String closeTime=time.substring(4,6)+":"+time.substring(6,8); + } + + }else if(param.equals("时段2")){ + //发送指令 + deviceCodeParam.setRegisterAddr("065A"); //寄存器地址 + deviceCodeParam.setFunCode("10"); //功能码写数据 + //保存数据 + String time=serialPortModel.getDataValue(); + if (time.length()==8){ + String statTime=time.substring(0,2)+":"+time.substring(2,4); + String closeTime=time.substring(4,6)+":"+time.substring(6,8); + } + + } + }else if (deviceType.equals("时控")){ + deviceCodeParam.setRegisterAddr("0011"); //寄存器地址,L3路,L1(0009),L2(000D) + deviceCodeParam.setFunCode("10"); //功能码写数据 + String time=serialPortModel.getDataValue(); + if (time.length()==16){ + //时段1 + String statTime1=time.substring(0,2)+":"+time.substring(2,4); + String closeTime1=time.substring(4,6)+":"+time.substring(6,8); + //时段2 + String statTime2=time.substring(8,10)+":"+time.substring(10,12); + String closeTime2=time.substring(12,14)+":"+time.substring(14,16); + controlData.setUseStartTime1(statTime1); + controlData.setUseCloseTime1(closeTime1); + controlData.setUseStartTime2(statTime2); + controlData.setUseCloseTime2(closeTime2); + } + + controlSetService.saveControlSet(controlData); //保存设置内容 + }else if (deviceType.equals("水位开关")){ + if (brand==null || brand.equals("") || brand.equals("中凯")){//品牌 + deviceCodeParam.setFunCode("12"); //功能码写数据 + + }else if(brand.equals("远向")){ + deviceCodeParam.setFunCode("06"); //功能码写数据 + }else if(brand.equals("顶威")){ + deviceCodeParam.setFunCode("0407"); //功能码写数据 + } + + deviceCodeParam.setDataValue(serialPortModel.getDataValue()); + + controlData.setLevelSet(serialPortModel.getDataValue()); + controlSetService.saveControlSet(controlData); + } + + serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + } + return HttpResult.ok(); + }catch(Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + //读数据 + @PostMapping(value="/read") + public HttpResult readData(@RequestBody List params){ + try{ + SerialPortSingle serialPortSingle = new SerialPortSingle(); + DeviceCodeParamEntity deviceCodeParam=new DeviceCodeParamEntity(); + + for (SerialPortModel serialPortModel : + params) { + String deviceAddr=serialPortModel.getDeviceAddr(); + String deviceType=serialPortModel.getDeviceType(); + String buildingId=serialPortModel.getBuildingId(); + String param=serialPortModel.getParam(); + DeviceInstallEntity deviceInstallEntity=deviceInstallService.selectDevice(deviceAddr,deviceType,buildingId); + + deviceCodeParam.setDeviceAddr(deviceAddr); + deviceCodeParam.setDeviceType(deviceType); + deviceCodeParam.setDataPort(deviceInstallEntity.getDataPort()); + deviceCodeParam.setBaudRate(deviceInstallEntity.getBaudRate()); + deviceCodeParam.setBrand(deviceInstallEntity.getBrand()); + + if (deviceType.equals("热泵")){ + if (param.equals("温度设定")){ + deviceCodeParam.setRegisterAddr("0641"); + deviceCodeParam.setFunCode("03"); + } + + }else if (deviceType.equals("时控")){ + + }else if (deviceType.equals("水位开关")){ + + }else if (deviceType.equals("状态检测")){ + + } + + Constant.WEB_FLAG=true; //单抄,暂时停止采集 + serialPortSingle.serialPortSend(deviceCodeParam); + } + return HttpResult.ok(); + }catch (Exception e){ + return HttpResult.error(); + } + } + + @PostMapping(value="/pump") + public HttpResult queryPumpSet(@RequestParam(value = "pumpId") String pumpId, + @RequestParam(value = "buildingId") String buildingId){ + try{ + + return HttpResult.ok(); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + @PostMapping(value="/control") + public HttpResult queryControlSet(@RequestParam(value = "buildingId") String buildingId){ + try{ + ControlSetEntity list=controlSetService.queryControlSet(buildingId); + return HttpResult.ok(list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/StrategyInfoController.java b/user-service/src/main/java/com/mh/user/controller/StrategyInfoController.java new file mode 100644 index 0000000..c55f563 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/StrategyInfoController.java @@ -0,0 +1,28 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.StrategyInfoEntity; +import com.mh.user.service.StrategyInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("strategy") +public class StrategyInfoController { + + @Autowired + StrategyInfoService strategyInfoService; + + @SysLogger(value="节能策略查询") + @RequestMapping("query") + public HttpResult queryStrategyInfo(@RequestParam(value = "systemID",required = false) String systemID, + @RequestParam(value = "projectID",required = false) String projectID){ + List list=strategyInfoService.queryStrategyInfo(systemID,projectID); + return HttpResult.ok(list); + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysDeptController.java b/user-service/src/main/java/com/mh/user/controller/SysDeptController.java new file mode 100644 index 0000000..915c7e4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysDeptController.java @@ -0,0 +1,46 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.model.SysDept; +import com.mh.user.service.SysDeptService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 机构控制器 + * @author ljf + * @date 2020-04-25 + */ +@RestController +@RequestMapping("dept") +public class SysDeptController { + + @Autowired + private SysDeptService sysDeptService; + + @PreAuthorize("hasAuthority('sys:dept:add') AND hasAuthority('sys:dept:edit')") + @PostMapping(value="/save") + public HttpResult save(@RequestBody SysDept record) { + return HttpResult.ok(sysDeptService.save(record)); + } + + @PreAuthorize("hasAuthority('sys:dept:delete')") + @PostMapping(value="/delete") + public HttpResult delete(@RequestBody List records) { + return HttpResult.ok(sysDeptService.delete(records)); + } + + @PreAuthorize("hasAuthority('sys:dept:view')") + @GetMapping(value="/findTree") + public HttpResult findTree() { + return HttpResult.ok(sysDeptService.findTree()); + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysLogController.java b/user-service/src/main/java/com/mh/user/controller/SysLogController.java new file mode 100644 index 0000000..5c40d49 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysLogController.java @@ -0,0 +1,60 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.common.page.PageRequest; +import com.mh.user.annotation.SysLogger; +import com.mh.user.model.SysLog; +import com.mh.user.service.SysLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * 日志控制器 + * @author ljf + * @date 2020-04-25 + */ +@RestController +@RequestMapping("log") +public class SysLogController { + + @Autowired + private SysLogService sysLogService; + + @PostMapping(value="/findPage") + public HttpResult findPage(@RequestBody PageRequest pageRequest) { + return HttpResult.ok(sysLogService.findPage(pageRequest)); + } + + @SysLogger(value="日志",optDesc = "查询每个操作员的日志记录") + @PostMapping(value="/findLogs") + public HttpResult findLogs(@RequestParam(value = "userName", required = false)String userName, + @RequestParam int page, + @RequestParam int limit) { + try{ + List list=sysLogService.findLogs(userName,page,limit); + int count=sysLogService.findCount(userName,page,limit); + + return HttpResult.ok(count,list); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } + + // 查询日志详情 + @SysLogger(value="日志",optDesc = "查询日志详情") + @PostMapping(value="/logInfo") + public HttpResult logInfo(@RequestParam int id){ + try{ + SysLog sysLog=sysLogService.logInfo(id); + return HttpResult.ok(sysLog); + }catch (Exception e){ + e.printStackTrace(); + return HttpResult.error(); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysLoginController.java b/user-service/src/main/java/com/mh/user/controller/SysLoginController.java new file mode 100644 index 0000000..3f63237 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysLoginController.java @@ -0,0 +1,98 @@ +package com.mh.user.controller; + +import java.awt.image.BufferedImage; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.mh.common.http.HttpResult; +import com.mh.common.utils.IOUtils; +import com.mh.user.annotation.SysLogger; +import com.mh.user.dynamic.datasource.DataSourceContextHolder; +import com.mh.user.dynamic.datasource.DataSourceObject; +import com.mh.user.entity.DBEntity; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysUser; +import com.mh.user.security.JwtAuthenticatioToken; +import com.mh.user.service.SysRoleService; +import com.mh.user.service.SysUserService; +import com.mh.user.utils.AESUtil; +import com.mh.user.utils.PasswordUtils; +import com.mh.user.utils.SecurityUtils; +import com.mh.user.vo.LoginBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.google.code.kaptcha.Constants; +import com.google.code.kaptcha.Producer; + +/** + * 登录控制器 + * @author ljf + * @date 2023-04-25 + */ +@RestController +public class SysLoginController { + + @Autowired + private Producer producer; + @Autowired + private SysUserService sysUserService; + + @Autowired + private SysRoleService sysRoleService; + + @Autowired + private AuthenticationManager authenticationManager; + + @GetMapping("captcha.jpg") + public void captcha(HttpServletResponse response, HttpServletRequest request) throws ServletException, IOException { + response.setHeader("Cache-Control", "no-store, no-cache"); + response.setContentType("image/jpeg"); + // 生成文字验证码 + String text = producer.createText(); + // 生成图片验证码 + BufferedImage image = producer.createImage(text); + // 保存到验证码到 session + request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, text); + ServletOutputStream out = response.getOutputStream(); + ImageIO.write(image, "jpg", out); + IOUtils.closeQuietly(out); + } + + /** + * 登录接口 + */ + @SysLogger(value="用户登录") + @PostMapping(value = "/login") + public HttpResult login(@RequestBody LoginBean loginBean, HttpServletRequest request) throws Exception { + String username = loginBean.getAccount(); + String password = loginBean.getPassword(); + String captcha = loginBean.getCaptcha(); + + // 用户信息 + SysUser user = sysUserService.findByName(username); + // 账号不存在、密码错误 + if (user == null) { + return HttpResult.error("账号不存在"); + } + if (!PasswordUtils.matches(user.getSalt(), password, user.getPassword())) { + return HttpResult.error("密码不正确"); + } + // 账号锁定 + if (user.getStatus() == 0) { + return HttpResult.error("账号已被锁定,请联系管理员"); + } + // 系统登录认证 + JwtAuthenticatioToken token = SecurityUtils.login(request, username, password, authenticationManager); + return HttpResult.ok(token); + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysMenuController.java b/user-service/src/main/java/com/mh/user/controller/SysMenuController.java new file mode 100644 index 0000000..e28e93f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysMenuController.java @@ -0,0 +1,50 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.model.SysMenu; +import com.mh.user.service.SysMenuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 菜单控制器 + * @author ljf + * @date 2020-04-25 + */ +@RestController +@RequestMapping("menu") +public class SysMenuController { + + @Autowired + private SysMenuService sysMenuService; + + @PostMapping(value="/save") + public HttpResult save(@RequestBody SysMenu record) { + + return HttpResult.ok(sysMenuService.save(record)); + } + + @PostMapping(value="/delete") + public HttpResult delete(@RequestBody List records) { + return HttpResult.ok(sysMenuService.delete(records)); + } + + //查询菜单树,用户ID和用户名为空则查询全部,获取菜单类型,0:获取所有菜单,包含按钮,1:获取所有菜单,不包含按钮 + @GetMapping(value="/findNavTree") + public HttpResult findNavTree(@RequestParam String systemID,@RequestParam String userName) { + return HttpResult.ok(sysMenuService.findTree(systemID,userName, 0)); + } + + @GetMapping(value="/findMenuTree") + public HttpResult findMenuTree(@RequestParam String systemID) { + return HttpResult.ok(sysMenuService.findTree(systemID,"", 0)); + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysRoleController.java b/user-service/src/main/java/com/mh/user/controller/SysRoleController.java new file mode 100644 index 0000000..551cc46 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysRoleController.java @@ -0,0 +1,132 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.common.page.PageRequest; +import com.mh.user.annotation.SysLogger; +import com.mh.user.constants.SysConstants; +import com.mh.user.mapper.SysRoleMapper; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysRoleMenu; +import com.mh.user.service.SysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Date; +import java.util.List; + +/** + * 角色控制器 + * @author ljf + * @date 2020-04-25 + */ +@RestController +@RequestMapping("role") +public class SysRoleController { + + @Autowired + private SysRoleService sysRoleService; + + @Autowired + private SysRoleMapper sysRoleMapper; + + @SysLogger(value="角色管理",optDesc = "添加或者编辑角色") + @PostMapping(value="/save") + public HttpResult save(@RequestBody SysRole record) { + SysRole role = sysRoleService.findById(record.getId()); + if(role != null) { + if(SysConstants.ADMIN.equalsIgnoreCase(role.getName())) { + return HttpResult.error("超级管理员不允许修改!"); + } + List role1=sysRoleService.findByName(record.getName()); + if (role1.size()>0){ + if(role.getId()!=role1.get(0).getId()){ + return HttpResult.error("角色名不能重复!"); + } + } + } + // 新增角色 + if((record.getId() == null || record.getId() ==0) && !sysRoleService.findByName(record.getName()).isEmpty()) { + return HttpResult.error("角色名已存在!"); + } + record.setCreateBy("admin"); + Date date=new Date(); + record.setCreateTime(date); + record.setLastUpdateTime(date); + return HttpResult.ok(sysRoleService.save(record)); + } + + // 删除多个 + @PostMapping(value="/delete") + public HttpResult delete(@RequestBody List records) { + + return HttpResult.ok(sysRoleService.delete(records)); + } + + // 删除单个 + @SysLogger(value="角色管理",optDesc = "删除角色") + @PostMapping(value="/deleteById") + public HttpResult deleteById(@RequestBody SysRole record) { + + return HttpResult.ok(sysRoleService.delete(record)); + } + + @PostMapping(value="/findPage") + public HttpResult findPage(@RequestBody PageRequest pageRequest) { + return HttpResult.ok(sysRoleService.findPage(pageRequest)); + } + + @GetMapping(value="/findAll") + public HttpResult findAll() { + return HttpResult.ok(sysRoleService.findAll()); + } + + @GetMapping(value="/findRoleMenus") + public HttpResult findRoleMenus(@RequestParam Long roleId) { + return HttpResult.ok(sysRoleService.findRoleMenus(roleId)); + } + + @SysLogger(value="角色管理",optDesc = "编辑权限") + @PostMapping(value="/saveRoleMenus") + public HttpResult saveRoleMenus(@RequestBody List records) { + for(SysRoleMenu record:records) { + SysRole sysRole = sysRoleMapper.selectByPrimaryKey(record.getRoleId()); + if(SysConstants.ADMIN.equalsIgnoreCase(sysRole.getName())) { + // 如果是超级管理员,不允许修改 + return HttpResult.error("超级管理员拥有所有菜单权限,不允许修改!"); + } + } + return HttpResult.ok(sysRoleService.saveRoleMenus(records)); + } + + @PostMapping(value="/findId") + public HttpResult findByName(@RequestParam String name) { + return HttpResult.ok(sysRoleService.findByName(name)); + } + + @PostMapping(value="/queryRoles") + public HttpResult queryRoles(@RequestParam(value = "roleName", required = false) String roleName, + @RequestParam int page, + @RequestParam int limit) { + try{ + List list=sysRoleService.queryRoles(roleName,page,limit); + int count=sysRoleService.getCount(roleName,page,limit); + return HttpResult.ok(count,list); + }catch (Exception e){ + return HttpResult.error(); + } + + } + + @PostMapping(value="/roleID") + public HttpResult findRoleID(@RequestParam String name) { + String roleID=sysRoleService.findRoleID(name); + return HttpResult.ok(roleID); + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/SysUserController.java b/user-service/src/main/java/com/mh/user/controller/SysUserController.java new file mode 100644 index 0000000..d8b791f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SysUserController.java @@ -0,0 +1,140 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.common.page.PageRequest; +import com.mh.user.annotation.SysLogger; +import com.mh.user.constants.SysConstants; +import com.mh.user.mapper.SysUserRoleMapper; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysUser; +import com.mh.user.model.SysUserRole; +import com.mh.user.service.SysRoleService; +import com.mh.user.service.SysUserService; +import com.mh.user.utils.PasswordUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 用户控制器 + * @author ljf + * @date 2020-04-25 + */ +@RestController +@RequestMapping("user") +public class SysUserController { + + @Autowired + private SysUserService sysUserService; + + @Autowired + private SysRoleService sysRoleService; + + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + + @SysLogger(value="用户管理",optDesc = "添加或者编辑用户") + @PostMapping(value="/save") + public HttpResult save(@RequestBody SysUser record) { + SysUser user = sysUserService.findById(record.getId()); + if(user != null) { + if(SysConstants.ADMIN.equalsIgnoreCase(user.getUserName())) { + return HttpResult.error("超级管理员不允许修改!"); + } + } + if(record.getPassword() != null) { + + String salt = PasswordUtils.getSalt(); + if(user == null) { + // 新增用户 + if(sysUserService.findByName(record.getUserName()) != null) { + return HttpResult.error("用户名已存在!"); + } + String password = PasswordUtils.encode(record.getPassword(), salt); + record.setSalt(salt); + record.setPassword(password); + record.setStatus(Byte.parseByte("1")); + } else { + SysUser user1=sysUserService.findByName(record.getUserName()); + if(user1!=null && user1.getId()!=record.getId()){ + return HttpResult.error("修改的用户名不能与存在的用户名相同!"); + } + // 修改用户, 且修改了密码 + if(!record.getPassword().equals(user.getPassword())) { + String password = PasswordUtils.encode(record.getPassword(), salt); + record.setSalt(salt); + record.setPassword(password); + } + } + } + + return HttpResult.ok(sysUserService.save(record)); + } + + @PostMapping(value="/delete") + public HttpResult delete(@RequestBody List records) { + for(SysUser record:records) { + SysUser sysUser = sysUserService.findById(record.getId()); + if(sysUser != null && SysConstants.ADMIN.equalsIgnoreCase(sysUser.getUserName())) { + return HttpResult.error("超级管理员不允许删除!"); + } + } + return HttpResult.ok(sysUserService.delete(records)); + } + + + @SysLogger(value="用户管理",optDesc = "删除用户") + @PostMapping(value="/deleteById") + public HttpResult deleteById(@RequestBody SysUser record) { + SysUser sysUser = sysUserService.findById(record.getId()); + if(sysUser != null && SysConstants.ADMIN.equalsIgnoreCase(sysUser.getUserName())) { + return HttpResult.error("超级管理员不允许删除!"); + }else{ + return HttpResult.ok(sysUserService.delete(record)); + } + } + + @GetMapping(value="/findByName") + public HttpResult findByUserName(@RequestParam String name) { + + return HttpResult.ok(sysUserService.findByName(name)); + } + + + @GetMapping(value="/findPermissions") + public HttpResult findPermissions(@RequestParam String systemID,@RequestParam String name) { + return HttpResult.ok(sysUserService.findPermissions(systemID,name)); + } + + @GetMapping(value="/findUserRoles") + public HttpResult findUserRoles(@RequestParam Long userId) { + return HttpResult.ok(sysUserService.findUserRoles(userId)); + } + + @PostMapping(value="/findPage") + public HttpResult findPage(@RequestBody PageRequest pageRequest) { + return HttpResult.ok(sysUserService.findPage(pageRequest)); + } + + @PostMapping(value="/queryUsers") + public HttpResult queryUsers(@RequestParam(value = "userName", required = false) String userName, + @RequestParam int page, + @RequestParam int limit) { + try{ + List list=sysUserService.queryUsers(userName,page,limit); + int count=sysUserService.getCount(userName,page,limit); + return HttpResult.ok(count,list); + }catch (Exception e){ + return HttpResult.error(); + } + + } + +} diff --git a/user-service/src/main/java/com/mh/user/controller/SystemInfoController.java b/user-service/src/main/java/com/mh/user/controller/SystemInfoController.java new file mode 100644 index 0000000..cf16e8a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/SystemInfoController.java @@ -0,0 +1,29 @@ +package com.mh.user.controller; + +import com.mh.common.http.HttpResult; +import com.mh.user.annotation.SysLogger; +import com.mh.user.entity.SystemInfoEntity; +import com.mh.user.service.SystemInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("sys") +public class SystemInfoController { + + @Autowired + SystemInfoService systemInfoService; + + @SysLogger(value="系统查询") + @PostMapping("/querySys") + public HttpResult querySystem(@RequestParam(value = "roleID")String roleID) { + List list=systemInfoService.querySystem(roleID); + + return HttpResult.ok(list); + } +} diff --git a/user-service/src/main/java/com/mh/user/controller/TestController.java b/user-service/src/main/java/com/mh/user/controller/TestController.java new file mode 100644 index 0000000..28ed700 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/controller/TestController.java @@ -0,0 +1,102 @@ +package com.mh.user.controller; + +import com.mh.user.constants.Constant; +import com.mh.user.dynamic.datasource.DataSourceContextHolder; +import com.mh.user.dynamic.datasource.DataSourceObject; +import com.mh.user.entity.DBEntity; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.manage.QuartzManager; +import com.mh.user.service.SysUserService; +import com.mh.user.utils.AESUtil; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.ExchangeStringUtil; +import com.mh.user.utils.GetReadOrder485; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +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; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.Date; + +@RestController +public class TestController { + + @Autowired + private SysUserService sysUserService; + + @Resource + QuartzManager quartzManager; + + @RequestMapping("/hello") + public String HelloWord() throws SchedulerException, InterruptedException { + // 停止JobTest + quartzManager.pauseAllJob(); + Constant.FLAG = true; + Thread.sleep(2000); + // 开始JobTest +// quartzManager.resumeAllJob(); + Constant.FLAG = false; + return "user hello word."; + } + + @RequestMapping("/startHello") + public String startHelloWord() throws SchedulerException, InterruptedException { + // 停止JobTest +// quartzManager.pauseAllJob(); +// Constant.FLAG = true; +// Thread.sleep(2000); + // 开始JobTest + quartzManager.resumeAllJob(); + Thread.sleep(2000); + Constant.FLAG = false; + return "user hello word."; + } + + @GetMapping("/test") + public void testQuery(){ +// try{ +// DBEntity dbEntity = sysUserService.queryDBInfo("admin"); +// dbEntity.setDB_Pwd(AESUtil.AESdecrypt(dbEntity.getDB_Pwd())); +// DataSourceObject dataSourceObject = new DataSourceObject(); +// String SourceName = "sqlServer-"+dbEntity.getDB_Names(); +// dataSourceObject.SwitchSQLServerDataSource(dbEntity,SourceName); +// DataSourceContextHolder.setDBType(SourceName); +// }catch (Exception e){ +// e.printStackTrace(); +// } + + AnalysisReceiveOrder485 analysis=new AnalysisReceiveOrder485(); + GetReadOrder485 getReadOrder485=new GetReadOrder485(); + DeviceCodeParamEntity deviceCodeParamEntity=new DeviceCodeParamEntity(); + deviceCodeParamEntity.setDeviceAddr("90"); + deviceCodeParamEntity.setDeviceType("冷量计"); + deviceCodeParamEntity.setRegisterAddr("34"); + deviceCodeParamEntity.setRegisterName("累积量"); + deviceCodeParamEntity.setGrade(1); + deviceCodeParamEntity.setProjectID("3"); + analysis.analysisCloudOrder485("5A0304AEF600D911B6",deviceCodeParamEntity); + +// analysis.analysisWtMeterOrder485("FEFEFE6810398710810000008116901F00006502002C006502002C0000000000000000FF3416","",""); +// analysis.analysisPumpOrder485("0303020000C184","000B","","21"); +// analysis.analysisMeterOrder485("6810470010000068810643C3BA595C346716",deviceCodeParamEntity); +// analysis.analysisRelayOrder485("220611000000013A220611000000023B220611000000033C220611000000043D220611000000053E220611000000063F22061100000007402206110000000841","0017","中凯"); +// analysis.analysisPressureOrder485("01030205157ADB","","澳升"); + +// Date date2=new Date(); +// SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// System.out.println("------时间--------"+sdf1.format(date2)); +// if (ExchangeStringUtil.isInDate(date2,"00:00:00","00:00:05")==true || +// ExchangeStringUtil.isInDate(date2,"00:00:20","00:00:25")==true || +// ExchangeStringUtil.isInDate(date2,"00:00:40","00:00:45")==true) { +// System.out.println("------时间跳出--------"+sdf1.format(date2)); +// +// } + + } + +} diff --git a/user-service/src/main/java/com/mh/user/dto/DeviceMessageDTO.java b/user-service/src/main/java/com/mh/user/dto/DeviceMessageDTO.java new file mode 100644 index 0000000..7b480e0 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dto/DeviceMessageDTO.java @@ -0,0 +1,33 @@ +package com.mh.user.dto; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : 设备信息状态 + * @updateTime 2020-05-29 + * @throws : + */ +@Setter +@Getter +public class DeviceMessageDTO { + + private String label; + private int spanLength; + private boolean openState; + private String deviceId; + private int grade; // 0:A区 1:B区 + + @Override + public String toString() { + return "DeviceMessageDTO{" + + "label='" + label + '\'' + + ", spanLength=" + spanLength + + ", openState=" + openState + + ", deviceId='" + deviceId + '\'' + + ", grade=" + grade + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/dto/DisplayBoxDataDTO.java b/user-service/src/main/java/com/mh/user/dto/DisplayBoxDataDTO.java new file mode 100644 index 0000000..9bbc40a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dto/DisplayBoxDataDTO.java @@ -0,0 +1,35 @@ +package com.mh.user.dto; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : 设备数据显示框 + * @updateTime 2020-05-29 + * @throws : + */ +@Setter +@Getter +public class DisplayBoxDataDTO { + + private String title; + private String secContent1; + private String secContent2; + private String firstDivClass; + private String deviceId; + private int grade; + + @Override + public String toString() { + return "DisplayBoxDataDTO{" + + "title='" + title + '\'' + + ", secContent1='" + secContent1 + '\'' + + ", secContent2='" + secContent2 + '\'' + + ", firstDivClass='" + firstDivClass + '\'' + + ", deviceId='" + deviceId + '\'' + + ", grade=" + grade + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/dto/TableInfoDTO.java b/user-service/src/main/java/com/mh/user/dto/TableInfoDTO.java new file mode 100644 index 0000000..56bb2ae --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dto/TableInfoDTO.java @@ -0,0 +1,21 @@ +package com.mh.user.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-25 + * @throws : + */ +@Setter +@Getter +public class TableInfoDTO { + + private List tableInfo; + +} diff --git a/user-service/src/main/java/com/mh/user/dynamic/config/DataSourceConfig.java b/user-service/src/main/java/com/mh/user/dynamic/config/DataSourceConfig.java new file mode 100644 index 0000000..19ccf1a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dynamic/config/DataSourceConfig.java @@ -0,0 +1,77 @@ +package com.mh.user.dynamic.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.mh.user.dynamic.datasource.DynamicDataSource; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; + +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + +/** + * @author chison + * @date 2020-04-02 09:39 + * @Description + */ +@Configuration +@MapperScan("com.mh.*.mapper") // 扫描DAO +public class DataSourceConfig { + + @Value("${spring.datasource.druid.url}") + private String defaultDBUrl; + @Value("${spring.datasource.druid.username}") + private String defaultDBUser; + @Value("${spring.datasource.druid.password}") + private String defaultDBPassword; + @Value("${spring.datasource.druid.driver-class-name}") + private String defaultDBDreiverName; + + + @Bean + public DynamicDataSource dynamicDataSource() { + DynamicDataSource dynamicDataSource = DynamicDataSource.getInstance(); + + DruidDataSource defaultDataSource = new DruidDataSource(); + defaultDataSource.setUrl(defaultDBUrl); + defaultDataSource.setUsername(defaultDBUser); + defaultDataSource.setPassword(defaultDBPassword); + defaultDataSource.setDriverClassName(defaultDBDreiverName); + + Map map = new HashMap<>(); + map.put("default", defaultDataSource); + dynamicDataSource.setTargetDataSources(map); + dynamicDataSource.setDefaultTargetDataSource(defaultDataSource); + + return dynamicDataSource; + } + + @Bean + public SqlSessionFactory sqlSessionFactory( + @Qualifier("dynamicDataSource") DataSource dynamicDataSource) + throws Exception { + SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); + bean.setDataSource(dynamicDataSource); + bean.setTypeAliasesPackage("com.mh.*.model"); // 扫描Model + + bean.setMapperLocations(new PathMatchingResourcePatternResolver() + .getResources("classpath*:**/sqlmapper/*.xml")); + return bean.getObject(); + + } + + @Bean(name = "sqlSessionTemplate") + public SqlSessionTemplate sqlSessionTemplate( + @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) + throws Exception { + return new SqlSessionTemplate(sqlSessionFactory); + } + +} diff --git a/user-service/src/main/java/com/mh/user/dynamic/config/MyBatisMapperScannerConfig.java b/user-service/src/main/java/com/mh/user/dynamic/config/MyBatisMapperScannerConfig.java new file mode 100644 index 0000000..7fff575 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dynamic/config/MyBatisMapperScannerConfig.java @@ -0,0 +1,28 @@ +package com.mh.user.dynamic.config; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Bean; +import tk.mybatis.spring.mapper.MapperScannerConfigurer; + +import java.util.Properties; + +/** + * @author chison + * @date 2020-04-02 09:40 + * @Description + */ +@EnableAutoConfiguration +public class MyBatisMapperScannerConfig { + @Bean + public MapperScannerConfigurer mapperScannerConfigurer() { + MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); + mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); + mapperScannerConfigurer.setBasePackage("com.mh.user.mapper"); + Properties properties = new Properties(); + properties.setProperty("notEmpty", "false"); + properties.setProperty("IDENTITY", "MYSQL"); + mapperScannerConfigurer.setProperties(properties); + return mapperScannerConfigurer; + } + +} diff --git a/user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceContextHolder.java b/user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceContextHolder.java new file mode 100644 index 0000000..7f7c010 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceContextHolder.java @@ -0,0 +1,23 @@ +package com.mh.user.dynamic.datasource; + +/** + * @author chison + * @date 2020-04-02 09:40 + * @Description 通过ThreadLocal维护一个全局唯一的map来实现数据源的动态切换 + */ +public class DataSourceContextHolder { + + private static final ThreadLocal contextHolder = new ThreadLocal(); + + public static synchronized void setDBType(String dbType){ + contextHolder.set(dbType); + } + + public static String getDBType(){ + return contextHolder.get(); + } + + public static void clearDBType(){ + contextHolder.remove(); + } +} diff --git a/user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceObject.java b/user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceObject.java new file mode 100644 index 0000000..e9524d8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dynamic/datasource/DataSourceObject.java @@ -0,0 +1,71 @@ +package com.mh.user.dynamic.datasource; + +import com.alibaba.druid.pool.DruidDataSource; +import com.mh.user.entity.DBEntity; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author chison + * @date 2020-04-02 09:40 + * @Description + */ +public class DataSourceObject { + + private Long MaxWait=6000L; + private Integer maxActive=10; + private Long timeBetweenEvictionRunsMillis=6000L; + + /** + * 切换sqlserver数据库,并动态赋值 + * @param dbInfo + * @param SourceName + */ + public void SwitchMySQLDataSource(DBEntity dbInfo, String SourceName) { + System.out.println("mysql进入数据源切换"); + System.out.println("MaxWait:"+MaxWait); + DruidDataSource dynamicDataSource = new DruidDataSource(); + dynamicDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dynamicDataSource.setUrl("jdbc:mysql://"+dbInfo.getDB_IP()+":"+dbInfo.getDB_Port()+"/"+dbInfo.getDB_Names()+"?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&autoReconnect=true"); + dynamicDataSource.setUsername(dbInfo.getDB_UserName()); + dynamicDataSource.setPassword(dbInfo.getDB_Pwd()); + dynamicDataSource.setMaxWait(MaxWait); + dynamicDataSource.setMaxActive(maxActive); + dynamicDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + + DynamicDataSource dataSource = DynamicDataSource.getInstance(); + Map map=new HashMap(); + map.put(SourceName, dynamicDataSource); + dataSource.setTargetDataSources(map); + System.out.println(dynamicDataSource.getUrl()); + System.out.println(SourceName); + } + /** + * 第二个sqlserver数据库 + * @param dbInfo + * @param SourceName + */ + public void SwitchSQLServerDataSource(DBEntity dbInfo,String SourceName) { + System.out.println("进入数据源切换"); + System.out.println("MaxWait:"+MaxWait); + DruidDataSource dynamicDataSource = new DruidDataSource(); + dynamicDataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + dynamicDataSource.setUrl("jdbc:sqlserver://"+dbInfo.getDB_IP()+":"+dbInfo.getDB_Port()+";Databasename="+dbInfo.getDB_Names()); + dynamicDataSource.setUsername(dbInfo.getDB_UserName()); + dynamicDataSource.setPassword(dbInfo.getDB_Pwd()); + System.out.println(dbInfo.getDB_UserName()); + System.out.println(dbInfo.getDB_Pwd()); + dynamicDataSource.setMaxWait(MaxWait); + dynamicDataSource.setMaxActive(maxActive); + dynamicDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + + DynamicDataSource dataSource = DynamicDataSource.getInstance(); + Map map=new HashMap(); + map.put(SourceName, dynamicDataSource); + dataSource.setTargetDataSources(map); + + System.out.println(dynamicDataSource.getUrl()); + System.out.println(SourceName); + } +} diff --git a/user-service/src/main/java/com/mh/user/dynamic/datasource/DynamicDataSource.java b/user-service/src/main/java/com/mh/user/dynamic/datasource/DynamicDataSource.java new file mode 100644 index 0000000..f7a70fd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/dynamic/datasource/DynamicDataSource.java @@ -0,0 +1,44 @@ +package com.mh.user.dynamic.datasource; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author chison + * @date 2020-04-02 09:41 + * @Description + */ +public class DynamicDataSource extends AbstractRoutingDataSource { + + private static DynamicDataSource instance; + private static byte[] lock=new byte[0]; + private static Map dataSourceMap=new HashMap(); + + @Override + public void setTargetDataSources(Map targetDataSources) { + super.setTargetDataSources(targetDataSources); + dataSourceMap.putAll(targetDataSources); + super.afterPropertiesSet();// 必须添加该句,否则新添加数据源无法识别到 + } + + public Map getDataSourceMap() { + return dataSourceMap; + } + + public static synchronized DynamicDataSource getInstance(){ + if(instance==null){ + synchronized (lock){ + if(instance==null){ + instance=new DynamicDataSource(); + } + } + } + return instance; + } + //必须实现其方法 + protected Object determineCurrentLookupKey() { + return DataSourceContextHolder.getDBType(); + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/AddCronJobReq.java b/user-service/src/main/java/com/mh/user/entity/AddCronJobReq.java new file mode 100644 index 0000000..fb53423 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AddCronJobReq.java @@ -0,0 +1,34 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : 定时任务请求类 + * @updateTime 2020-04-03 + * @throws : + */ +@Setter +@Getter +public class AddCronJobReq { + + private String jobName; + + private String jobGroupName; + + private String triggerName; + + private String triggerGroupName; + + private String jobClass; + + private String date; + + private Map params = new HashMap<>(); + +} diff --git a/user-service/src/main/java/com/mh/user/entity/AddSimpleJobReq.java b/user-service/src/main/java/com/mh/user/entity/AddSimpleJobReq.java new file mode 100644 index 0000000..31fab1c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AddSimpleJobReq.java @@ -0,0 +1,27 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : 新增Simple定时任务请求实体类 + * @updateTime 2020-04-03 + * @throws : + */ +@Setter +@Getter +public class AddSimpleJobReq { + + private String jobClass; + + private Date date; + + private Map params = new HashMap<>(); + +} diff --git a/user-service/src/main/java/com/mh/user/entity/AlarmInfoEntity.java b/user-service/src/main/java/com/mh/user/entity/AlarmInfoEntity.java new file mode 100644 index 0000000..a55dc10 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AlarmInfoEntity.java @@ -0,0 +1,21 @@ +package com.mh.user.entity; + + +import lombok.Data; + +import java.util.Date; + +@Data +public class AlarmInfoEntity { + + private Long id; + private String alarmId; + private String buildingId; + private String buildingName; + private Date alarmTime; + private String deviceAddr; + private String deviceType; + private String alarmType; + private String dealState; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/AlarmInfoSumEntity.java b/user-service/src/main/java/com/mh/user/entity/AlarmInfoSumEntity.java new file mode 100644 index 0000000..d8fef44 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AlarmInfoSumEntity.java @@ -0,0 +1,20 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class AlarmInfoSumEntity { + + private long id; + private String curDate; + private String buildingId; + private int deviceNum; + private int faultNum; + private String waterLevel; + private int waterLevelNum; + private String waterTemp; + private int waterTempNum; + private String energy; + private int energyNum; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/AlarmValueSetEntity.java b/user-service/src/main/java/com/mh/user/entity/AlarmValueSetEntity.java new file mode 100644 index 0000000..dd52bd4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AlarmValueSetEntity.java @@ -0,0 +1,13 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class AlarmValueSetEntity { + + private String waterLevel; + private String waterTemp; + private String electWater; + private String buildingId; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/AnalysisMonthEntity.java b/user-service/src/main/java/com/mh/user/entity/AnalysisMonthEntity.java new file mode 100644 index 0000000..b45ab40 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AnalysisMonthEntity.java @@ -0,0 +1,46 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class AnalysisMonthEntity { + + private Long id; + private String curDate; + private String itemType; + private String day01; + private String day02; + private String day03; + private String day04; + private String day05; + private String day06; + private String day07; + private String day08; + private String day09; + private String day10; + private String day11; + private String day12; + private String day13; + private String day14; + private String day15; + private String day16; + private String day17; + private String day18; + private String day19; + private String day20; + private String day21; + private String day22; + private String day23; + private String day24; + private String day25; + private String day26; + private String day27; + private String day28; + private String day29; + private String day30; + private String day31; + private String day32; + private String totalValue; + private String buildingId; + private String buildingName; +} diff --git a/user-service/src/main/java/com/mh/user/entity/AnalysisYearEntity.java b/user-service/src/main/java/com/mh/user/entity/AnalysisYearEntity.java new file mode 100644 index 0000000..5cc7022 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AnalysisYearEntity.java @@ -0,0 +1,27 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class AnalysisYearEntity { + + private Long id; + private String curDate; + private String itemType; + private String month01; + private String month02; + private String month03; + private String month04; + private String month05; + private String month06; + private String month07; + private String month08; + private String month09; + private String month10; + private String month11; + private String month12; + private String totalValue; + private String buildingId; + private String buildingName; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/AreaEntity.java b/user-service/src/main/java/com/mh/user/entity/AreaEntity.java new file mode 100644 index 0000000..a635d19 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/AreaEntity.java @@ -0,0 +1,32 @@ +package com.mh.user.entity; + +public class AreaEntity { + + private String areaId; + + private String areaName; + + public String getAreaId() { + return areaId; + } + + public void setAreaId(String areaId) { + this.areaId = areaId; + } + + public String getAreaName() { + return areaName; + } + + public void setAreaName(String areaName) { + this.areaName = areaName; + } + + @Override + public String toString() { + return "AreaEntity{" + + "areaId='" + areaId + '\'' + + ", areaName='" + areaName + '\'' + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/BaseEntity.java b/user-service/src/main/java/com/mh/user/entity/BaseEntity.java new file mode 100644 index 0000000..a728be9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/BaseEntity.java @@ -0,0 +1,41 @@ +package com.mh.user.entity; + + +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author ljf + * @title : + * @description : 基础实体类 + * @updateTime 2020-05-14 + * @throws : + */ +@Setter +@Getter +public class BaseEntity implements Serializable { + + static final long serialVersionUID = 42L; + + private Long id; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + @Override + public String toString() { + return "BaseEntity{" + + "id=" + id + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } + +} diff --git a/user-service/src/main/java/com/mh/user/entity/BuildingEntity.java b/user-service/src/main/java/com/mh/user/entity/BuildingEntity.java new file mode 100644 index 0000000..93b7441 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/BuildingEntity.java @@ -0,0 +1,19 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class BuildingEntity { + + private Long id; + private String buildingId; + private String buildingName; + private int levelsCount; + private int beginLevel; + private int houseCount; + private int bedCount; + private int checkInCount; + private String areaId; + private String remarks; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/ChillersEntity.java b/user-service/src/main/java/com/mh/user/entity/ChillersEntity.java new file mode 100644 index 0000000..41c595e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/ChillersEntity.java @@ -0,0 +1,58 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author ljf + * @title : + * @description :冷水机组设备实体类 + * @updateTime 2020-05-20 + * @throws : + */ +@Setter +@Getter +public class ChillersEntity extends BaseEntity { + + private String deviceCode; // 设备代码 + private String deviceNum; // 设备码 + private String collectionNum; // 冷水机组采集地址 + private String registerAddress; // 寄存器地址 + private String registerName; // 寄存器名称 + private String funCode; // 功能码 + private int digit; // 保留位数 + private String otherName; // 别名 + private int grade; // 标志 1:冷水机组设备 2:ddc设备采集参数 3:控制指令类型 4:故障类型 + private String lastValue; // 最新采集数据 + private String lastTime; // 最新采集时间 + private String dataCom; // 采集端口号 + private String ddcAddr; // DDC地址 + + // update by ljf on 2020-05-26 添加网络管理器的IP和采集的端口号 + private String IP; // IP地址 + private int port; // 端口号 + + @Override + public String toString() { + return "ChillersEntity{" + + "deviceCode='" + deviceCode + '\'' + + ", deviceNum='" + deviceNum + '\'' + + ", collectionNum='" + collectionNum + '\'' + + ", registerAddress='" + registerAddress + '\'' + + ", registerName='" + registerName + '\'' + + ", funCode='" + funCode + '\'' + + ", digit=" + digit + + ", otherName='" + otherName + '\'' + + ", grade=" + grade + + ", lastValue='" + lastValue + '\'' + + ", lastTime=" + lastTime + + ", dataCom='" + dataCom + '\'' + + ", ddcAddr='" + ddcAddr + '\'' + + ", IP='" + IP + '\'' + + ", port=" + port + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/ControlSetEntity.java b/user-service/src/main/java/com/mh/user/entity/ControlSetEntity.java new file mode 100644 index 0000000..9dfe49e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/ControlSetEntity.java @@ -0,0 +1,17 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class ControlSetEntity { + + private String buildingId; + private String levelSet; + private String useStartTime1; + private String useCloseTime1; + private String useStartTime2; + private String useCloseTime2; + private String backWaterTemp; + private String upWaterTemp; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/DBEntity.java b/user-service/src/main/java/com/mh/user/entity/DBEntity.java new file mode 100644 index 0000000..4e0ba8c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DBEntity.java @@ -0,0 +1,91 @@ +package com.mh.user.entity; + +/** + * @author chison + * @date 2020-09-02 13:37 + * @Description + */ +public class DBEntity { + + private String DB_Names; + private String DB_UserName; + private String DB_Pwd; + private String DB_Port; + private Integer DB_Type; //0:sqlserver,1:oracle,2:mysql + private String DB_IP; + private String Project_Name; + private String Project_No; + private Integer DB_IsStatus; + + public String getDB_Names() { + return DB_Names; + } + + public void setDB_Names(String DB_Names) { + this.DB_Names = DB_Names; + } + + public String getDB_UserName() { + return DB_UserName; + } + + public void setDB_UserName(String DB_UserName) { + this.DB_UserName = DB_UserName; + } + + public String getDB_Pwd() { + return DB_Pwd; + } + + public void setDB_Pwd(String DB_Pwd) { + this.DB_Pwd = DB_Pwd; + } + + public String getDB_Port() { + return DB_Port; + } + + public void setDB_Port(String DB_Port) { + this.DB_Port = DB_Port; + } + + public Integer getDB_Type() { + return DB_Type; + } + + public void setDB_Type(Integer DB_Type) { + this.DB_Type = DB_Type; + } + + public String getDB_IP() { + return DB_IP; + } + + public void setDB_IP(String DB_IP) { + this.DB_IP = DB_IP; + } + + public String getProject_Name() { + return Project_Name; + } + + public void setProject_Name(String project_Name) { + Project_Name = project_Name; + } + + public String getProject_No() { + return Project_No; + } + + public void setProject_No(String project_No) { + Project_No = project_No; + } + + public Integer getDB_IsStatus() { + return DB_IsStatus; + } + + public void setDB_IsStatus(Integer DB_IsStatus) { + this.DB_IsStatus = DB_IsStatus; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/DataResultChEntity.java b/user-service/src/main/java/com/mh/user/entity/DataResultChEntity.java new file mode 100644 index 0000000..6286d09 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DataResultChEntity.java @@ -0,0 +1,24 @@ +package com.mh.user.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +@Data +public class DataResultChEntity { + + private Long id; + private String deviceAddr; + private String deviceType; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + private Date curDate; +// private String curDate; + private String curValue; + private String funCode; + private String registerAddr; + private String registerName; + private int grade; + private String projectID; + private String projectName; +} diff --git a/user-service/src/main/java/com/mh/user/entity/DataResultClEntity.java b/user-service/src/main/java/com/mh/user/entity/DataResultClEntity.java new file mode 100644 index 0000000..ed6ccbe --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DataResultClEntity.java @@ -0,0 +1,23 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class DataResultClEntity { + private Long id; + private String deviceAddr; + private String deviceType; + private double lastValue; + private Date lastDate; + private double curValue; + private Date curDate; + private double ratio; + private double calcValue; + private int grade; + private String registerAddr; + private String registerName; + private String projectName; + private String projectID; +} diff --git a/user-service/src/main/java/com/mh/user/entity/DataResultEntity.java b/user-service/src/main/java/com/mh/user/entity/DataResultEntity.java new file mode 100644 index 0000000..e23f8d0 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DataResultEntity.java @@ -0,0 +1,22 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class DataResultEntity { + + private Long id; + private String deviceAddr; + private String deviceType; + private double lastValue; + private Date lastDate; + private double curValue; + private Date curDate; + private double ratio; + private double calcValue; + private int grade; + private String projectName; + private String projectID; +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeleteJobReq.java b/user-service/src/main/java/com/mh/user/entity/DeleteJobReq.java new file mode 100644 index 0000000..39f572d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeleteJobReq.java @@ -0,0 +1,25 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : 定时任务删除类 + * @updateTime 2020-04-03 + * @throws : + */ +@Setter +@Getter +public class DeleteJobReq { + + private String jobName; + + private String jobGroupName; + + private String triggerName; + + private String triggerGroupName; + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceCodeParamEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceCodeParamEntity.java new file mode 100644 index 0000000..cd44e9a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceCodeParamEntity.java @@ -0,0 +1,27 @@ +package com.mh.user.entity; + +import lombok.Data; +import java.util.Date; + +@Data +public class DeviceCodeParamEntity { + + private Long id; + private String deviceAddr; + private String deviceName; + private String deviceType; + private String strData; + private String dataPort; + private int baudRate; + private String parity; + private String brand; + private String funCode; + private String registerAddr; + private String registerName; + private int digit; //保留小数位 + private int grade; //级别 + private String dataValue; //传入值 + private Date createTime; + private String projectID; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceFloorTempEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceFloorTempEntity.java new file mode 100644 index 0000000..8006dd0 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceFloorTempEntity.java @@ -0,0 +1,18 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class DeviceFloorTempEntity { + + private String deviceName; + private String deviceType; + private String buildingId; + private Date installDate; + private String model; + private String specs; + private String remarks; + private String rowId; //行号 +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceInfoEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceInfoEntity.java new file mode 100644 index 0000000..deeb81b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceInfoEntity.java @@ -0,0 +1,20 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class DeviceInfoEntity { + + private Long id; + private String deviceName; //设备名称 + private String deviceType; //设备类型 + private String brand; //品牌 + private String power; //功率 + private String madeTime; //制造时间 + private String flow; //流量 + private String isFC; //是否变频 + private String motorBrand; //机电品牌 + private String projectID; //项目ID + private String systemID; //系统ID + +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java new file mode 100644 index 0000000..844769e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java @@ -0,0 +1,31 @@ +package com.mh.user.entity; + +import lombok.Data; +import java.util.Date; + +@Data +public class DeviceInstallEntity { + + private Long id; + private String deviceAddr; + private String deviceName; + private String deviceType; + private String dataCom; + private String dataPort; + private int baudRate; + private String parity; + private double ratio; + private double initValue; + private double lastValue; + private Date lastDate; + private String standard; + private String isTotal; + private String isForbid; + private int grade; + private String brand; + private String installPosition; + private Date installDate; + private String projectID; + private String remarks; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceInstallTempEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceInstallTempEntity.java new file mode 100644 index 0000000..f4ac045 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceInstallTempEntity.java @@ -0,0 +1,113 @@ +package com.mh.user.entity; + +import java.util.Date; + +public class DeviceInstallTempEntity { + + private String deviceAddr; + private String deviceName; + private String deviceType; + private int baudRate; + private String dataCom; + private double ratio; + private String buildingId; + private Date installDate; + private String remarks; + private String rowId; //行号 + + public String getDeviceAddr() { + return deviceAddr; + } + + public void setDeviceAddr(String deviceAddr) { + this.deviceAddr = deviceAddr; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public int getBaudRate() { + return baudRate; + } + + public void setBaudRate(int baudRate) { + this.baudRate = baudRate; + } + + public String getDataCom() { + return dataCom; + } + + public void setDataCom(String dataCom) { + this.dataCom = dataCom; + } + + public double getRatio() { + return ratio; + } + + public void setRatio(double ratio) { + this.ratio = ratio; + } + + public String getBuildingId() { + return buildingId; + } + + public void setBuildingId(String buildingId) { + this.buildingId = buildingId; + } + + public Date getInstallDate() { + return installDate; + } + + public void setInstallDate(Date installDate) { + this.installDate = installDate; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRowId() { + return rowId; + } + + public void setRowId(String rowId) { + this.rowId = rowId; + } + + @Override + public String toString() { + return "DeviceInstallTempEntity{" + + "deviceAddr='" + deviceAddr + '\'' + + ", deviceName='" + deviceName + '\'' + + ", deviceType='" + deviceType + '\'' + + ", baudRate=" + baudRate + + ", dataCom='" + dataCom + '\'' + + ", ratio=" + ratio + + ", buildingId='" + buildingId + '\'' + + ", installDate=" + installDate + + ", remarks='" + remarks + '\'' + + ", rowId='" + rowId + '\'' + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceManageEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceManageEntity.java new file mode 100644 index 0000000..dfbbffd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceManageEntity.java @@ -0,0 +1,66 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author ljf + * @title : + * @description :设备管理实体类 + * @updateTime 2020-05-14 + * @throws : + */ +@Setter +@Getter +public class DeviceManageEntity extends BaseEntity { + + private String deviceCode; + private String deviceNum; + private String collectionNum; + private String dataCom; + private String initialValue; + private String deviceRate; + private String price; + private int paramId; + private String paramName; + private String lastValue; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date lastDate; + private String lastDates; + private String communicationType; + private String deviceType; + private String remark; + private int grade; + private String deviceCaliber; + private String type; + private String createTimes; + private String updateTimes; + + @Override + public String toString() { + return "DeviceManageEntity{" + + "deviceCode='" + deviceCode + '\'' + + ", deviceNum='" + deviceNum + '\'' + + ", collectionNum='" + collectionNum + '\'' + + ", dataCom='" + dataCom + '\'' + + ", initialValue='" + initialValue + '\'' + + ", deviceRate='" + deviceRate + '\'' + + ", price='" + price + '\'' + + ", paramId=" + paramId + + ", paramName='" + paramName + '\'' + + ", lastValue='" + lastValue + '\'' + + ", lastDate=" + lastDate + + ", communicationType='" + communicationType + '\'' + + ", deviceType='" + deviceType + '\'' + + ", remark='" + remark + '\'' + + ", grade=" + grade + + ", deviceCaliber=" + deviceCaliber + + ", type=" + type + + ", createTime=" + createTimes + + ", updateTime=" + updateTimes + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceParameterEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceParameterEntity.java new file mode 100644 index 0000000..622ff4c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceParameterEntity.java @@ -0,0 +1,35 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description :设备参数管理实体类 + * @updateTime 2020-05-14 + * @throws : + */ +@Setter +@Getter +public class DeviceParameterEntity extends BaseEntity { + + private int paramId; // 参数编号 + private String paramName; // 参数名称,及设备类型 + private int paramBaudrate; // 采集波特率 + private String checks; // 校验位 + private int grade; // 波特率 + private String type; //操作类型 + + @Override + public String toString() { + return "DeviceParameterEntity{" + + "paramId=" + paramId + + ", paramName='" + paramName + '\'' + + ", paramBaudrate=" + paramBaudrate + + ", checks='" + checks + '\'' + + ", grade=" + grade + + ", type=" + type + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceStateEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceStateEntity.java new file mode 100644 index 0000000..c681b3d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/DeviceStateEntity.java @@ -0,0 +1,21 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class DeviceStateEntity { + + private String curDate; + private int deviceNum; + private int coolPump; + private int coolPumpFault; + private int freezePump; + private int freezePumpFault; + private int chiller; + private int chillerFault; + private int fan; + private int fanFault; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/EnergyDataEntity.java b/user-service/src/main/java/com/mh/user/entity/EnergyDataEntity.java new file mode 100644 index 0000000..fe5b116 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/EnergyDataEntity.java @@ -0,0 +1,18 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class EnergyDataEntity { + + private long id; + private String curDate; + private String ambTemp; //环境温度 + private String humidity;//湿度 + private Double water; + private Double elect; + private Double cl; + private Double cop; + private String projectID; + private String projectName; +} diff --git a/user-service/src/main/java/com/mh/user/entity/EnergyEntity.java b/user-service/src/main/java/com/mh/user/entity/EnergyEntity.java new file mode 100644 index 0000000..4cca484 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/EnergyEntity.java @@ -0,0 +1,22 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class EnergyEntity { + + private Long id; //编号 + private String curDate; //时间 + private String buildingId; //楼栋编号 + private String buildingName; //楼栋名称 + private double hotWaterValue; //热水产量 + private double useHotWater; //热水消耗 + private double electValue; //用电量 + private double electWater; //单耗 + private int checkInCount; //楼栋人数 + private double perElect; //平均用电 + private double perWater; //平均用水 + private String projectID; //项目编号 + private String projectName; //项目名称 + +} diff --git a/user-service/src/main/java/com/mh/user/entity/EnergySumEntity.java b/user-service/src/main/java/com/mh/user/entity/EnergySumEntity.java new file mode 100644 index 0000000..a280ad4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/EnergySumEntity.java @@ -0,0 +1,18 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class EnergySumEntity { + private Long id; //序号 + private String curDate; //日期 + private String buildingId; //楼栋编号 + private String projectID; //项目编号 + private String useHotWater; //用水 + private String electValue; //用电 + private String electWater; //单耗 + private String perElect; //平均用电 + private String perWater; //平均用水 + private String higTemp; //最高温度 + private String lowTemp; //最低温度 +} diff --git a/user-service/src/main/java/com/mh/user/entity/ExceptionEntity.java b/user-service/src/main/java/com/mh/user/entity/ExceptionEntity.java new file mode 100644 index 0000000..75a183b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/ExceptionEntity.java @@ -0,0 +1,33 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +@Setter +@Getter +public class ExceptionEntity { + + private Integer page; + private Integer limit; + private String beginTime; + private String endTime; + private Integer process; + + @Override + public String toString() { + return "ExceptionEntity{" + + "page=" + page + + ", limit=" + limit + + ", beginTime='" + beginTime + '\'' + + ", endTime='" + endTime + '\'' + + ", process=" + process + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/ExceptionTableData.java b/user-service/src/main/java/com/mh/user/entity/ExceptionTableData.java new file mode 100644 index 0000000..a80b0c6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/ExceptionTableData.java @@ -0,0 +1,35 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +@Getter +@Setter +public class ExceptionTableData { + + private int deviceId; + private String deviceName; + private int info; + private String timeStamp; + private String remark; + private int process; // 0(正常),1(处理中),2(异常) + + @Override + public String toString() { + return "TableData{" + + "deviceId=" + deviceId + + ", deviceName='" + deviceName + '\'' + + ", info=" + info + + ", timeStamp='" + timeStamp + '\'' + + ", remark='" + remark + '\'' + + ", process=" + process + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/FirstTableEntity.java b/user-service/src/main/java/com/mh/user/entity/FirstTableEntity.java new file mode 100644 index 0000000..cf526fb --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/FirstTableEntity.java @@ -0,0 +1,29 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-25 + * @throws : + */ +@Setter +@Getter +public class FirstTableEntity extends BaseEntity { + + private String type; + private List tableInfo; + + @Override + public String toString() { + return "FirstTableEntity{" + + "type='" + type + '\'' + + ", tableInfo=" + tableInfo + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/GatewayManageEntity.java b/user-service/src/main/java/com/mh/user/entity/GatewayManageEntity.java new file mode 100644 index 0000000..5159368 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/GatewayManageEntity.java @@ -0,0 +1,33 @@ +package com.mh.user.entity; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author ljf + * @title : + * @description :网关管理实体类 + * @updateTime 2020-05-21 + * @throws : + */ +@Data +public class GatewayManageEntity extends BaseEntity { + + + private String gatewayName; // 网关名称 + private String gatewayIP; // 网关IP地址 + private String gatewayAddress; // 网关安装地址 + private String dataCom; // 串口号 + private String createDate; // 安装时间 + private String connectDate; // 最新上线连接时间 + private int grade; // 标志位(连接状态) 0:正常;1:不在线;2:异常 + private String internetCard; // 物联网卡号 + private int operator; //0:中国移动 1:中国联通 2:中国电信 + private int gatewayPort; // 端口号 + private String type; // 操作类型 + +} diff --git a/user-service/src/main/java/com/mh/user/entity/GaugeEntity.java b/user-service/src/main/java/com/mh/user/entity/GaugeEntity.java new file mode 100644 index 0000000..2fcf244 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/GaugeEntity.java @@ -0,0 +1,31 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : 圆表盘的实体类 + * @description : + * @updateTime 2020-08-07 + * @throws : + */ +@Setter +@Getter +public class GaugeEntity { + + private String chartType; + private String title; + private String max; + private double dataValue; + + @Override + public String toString() { + return "GaugeEntity{" + + "chartType='" + chartType + '\'' + + ", title='" + title + '\'' + + ", max='" + max + '\'' + + ", dataValue=" + dataValue + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/HostValue.java b/user-service/src/main/java/com/mh/user/entity/HostValue.java new file mode 100644 index 0000000..cab0b77 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/HostValue.java @@ -0,0 +1,30 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title :主机进出水温度 + * @description : + * @updateTime 2020-07-30 + * @throws : + */ +@Setter +@Getter +public class HostValue { + + private int id; + private String type; + private double value; + + @Override + public String toString() { + return "HostValue{" + + "id=" + id + + ", type='" + type + '\'' + + ", value=" + value + + '}'; + } + +} diff --git a/user-service/src/main/java/com/mh/user/entity/MaintainSumEntity.java b/user-service/src/main/java/com/mh/user/entity/MaintainSumEntity.java new file mode 100644 index 0000000..6337068 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/MaintainSumEntity.java @@ -0,0 +1,22 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class MaintainSumEntity { + + private Long id; + private String buildingId; + private String curDate; + private int dayNum; + private String dayP; + private int weekNum; + private String weekP; + private int monthNum; + private String monthP; + private int yearNum; + private String yearP; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/MeterInfoEntity.java b/user-service/src/main/java/com/mh/user/entity/MeterInfoEntity.java new file mode 100644 index 0000000..d82949b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/MeterInfoEntity.java @@ -0,0 +1,21 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class MeterInfoEntity { + + private Long id; + private String meterName; //表名称 + private String meterType; //表类型 + private String brand; //品牌 + private String currentValue; //电流值 + private String model; //直通电表/互感电表 + private String ratio; //倍率 + private String pulse; //脉冲常数 + private String caliber; //口径 + private String range; //测量范围 + private String structural; //结构形式 + private String projectID; //项目ID + private String systemID; //系统ID +} diff --git a/user-service/src/main/java/com/mh/user/entity/OrderEntity.java b/user-service/src/main/java/com/mh/user/entity/OrderEntity.java new file mode 100644 index 0000000..6cfdb2f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/OrderEntity.java @@ -0,0 +1,35 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : 接收前端传过来的指令 + * @updateTime 2020-05-28 + * @throws : + */ +@Setter +@Getter +public class OrderEntity { + + private Integer id; + private String param; + private Integer type; // 0:修改频率, + // 1:修改开关状态, + // 2: 关闭冷却泵之前,查询最近关闭的冷却塔时间 + // 3:群控手自动模式切换 + // 4:修改温度 + // 5:修改压力 + + @Override + public String toString() { + return "OrderEntity{" + + "id=" + id + + ", param='" + param + '\'' + + ", type='" + type + '\'' + + '}'; + } + +} diff --git a/user-service/src/main/java/com/mh/user/entity/OrderMessageEntity.java b/user-service/src/main/java/com/mh/user/entity/OrderMessageEntity.java new file mode 100644 index 0000000..4eef932 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/OrderMessageEntity.java @@ -0,0 +1,46 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @author ljf + * @title : + * @description : 指令存储实体类 + * @updateTime 2020-05-28 + * @throws : + */ +@Setter +@Getter +public class OrderMessageEntity extends BaseEntity { + + private String registerAddr; + private String registerName; + private String otherName; + private String orderStr; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date sendTime; + private int sendNum; + private int status; + private int grade; + + @Override + public String toString() { + return "OrderMessageEntity{" + + "registerAddr='" + registerAddr + '\'' + + ", registerName='" + registerName + '\'' + + ", otherName='" + otherName + '\'' + + ", orderStr='" + orderStr + '\'' + + ", createTime=" + createTime + + ", sendTime=" + sendTime + + ", sendNum=" + sendNum + + ", status=" + status + + ", grade=" + grade + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/ProjectInfoEntity.java b/user-service/src/main/java/com/mh/user/entity/ProjectInfoEntity.java new file mode 100644 index 0000000..81ccd36 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/ProjectInfoEntity.java @@ -0,0 +1,18 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class ProjectInfoEntity { + + private String id; + private String projectName; //项目名称 + private String pAddress; //地址 + private int pScale; + private String pic; //图片 + private String tel; //电话 + private String systemID; //系统编号 + private String remarks; + +} + diff --git a/user-service/src/main/java/com/mh/user/entity/RegisterAddrEntity.java b/user-service/src/main/java/com/mh/user/entity/RegisterAddrEntity.java new file mode 100644 index 0000000..86cf080 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/RegisterAddrEntity.java @@ -0,0 +1,15 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class RegisterAddrEntity { + + private String registerAddr; + private String regName; + private int funFlag; + private int floatFlag; + private String grade; + private String otherName; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/ReportParamEntity.java b/user-service/src/main/java/com/mh/user/entity/ReportParamEntity.java new file mode 100644 index 0000000..6cf9248 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/ReportParamEntity.java @@ -0,0 +1,35 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-03 + * @throws : + */ +@Setter +@Getter +public class ReportParamEntity { + + private int id; + private String label; + private int parentId; + private int levelType; + private List children; + + @Override + public String toString() { + return "ReportParamEntity{" + + "id=" + id + + ", label='" + label + '\'' + + ", parentId=" + parentId + + ", levelType=" + levelType + + ", children=" + children + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/StrategyInfoEntity.java b/user-service/src/main/java/com/mh/user/entity/StrategyInfoEntity.java new file mode 100644 index 0000000..08b876e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/StrategyInfoEntity.java @@ -0,0 +1,14 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class StrategyInfoEntity { + + private Long id; + private String dataAnalysis; + private String operationOpt; + private String controlOpt; + private String projectID; + private String systemID; +} diff --git a/user-service/src/main/java/com/mh/user/entity/SystemInfoEntity.java b/user-service/src/main/java/com/mh/user/entity/SystemInfoEntity.java new file mode 100644 index 0000000..61466fb --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/SystemInfoEntity.java @@ -0,0 +1,11 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class SystemInfoEntity { + + private String id; + private String systemName; + private String roleID; +} diff --git a/user-service/src/main/java/com/mh/user/entity/TableChartMessageEntity.java b/user-service/src/main/java/com/mh/user/entity/TableChartMessageEntity.java new file mode 100644 index 0000000..37efe42 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/TableChartMessageEntity.java @@ -0,0 +1,27 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-08-07 + * @throws : + */ +@Setter +@Getter +public class TableChartMessageEntity { + + private String timeName; + private int grade; + + @Override + public String toString() { + return "TableChartMessageEntity{" + + "timeName='" + timeName + '\'' + + ", grade=" + grade + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/TableDataEntity.java b/user-service/src/main/java/com/mh/user/entity/TableDataEntity.java new file mode 100644 index 0000000..ab98c7d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/TableDataEntity.java @@ -0,0 +1,33 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-25 + * @throws : + */ +@Getter +@Setter +public class TableDataEntity { + + private int span; + private String title; + private String info; + private String infos; + private int rows; + + @Override + public String toString() { + return "TableDataEntity{" + + "span=" + span + + ", title='" + title + '\'' + + ", info='" + info + '\'' + + ", infos='" + infos + '\'' + + ", rows=" + rows + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/TableInfoEntity.java b/user-service/src/main/java/com/mh/user/entity/TableInfoEntity.java new file mode 100644 index 0000000..fe41ba2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/TableInfoEntity.java @@ -0,0 +1,32 @@ +package com.mh.user.entity; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-25 + * @throws : + */ +@Setter +@Getter +public class TableInfoEntity { + + private int rowspan; + private String td1; + private String td2; + private String td3; + + @Override + public String toString() { + return "TableInfoEntity{" + + "rowspan=" + rowspan + + ", td1='" + td1 + '\'' + + ", td2='" + td2 + '\'' + + ", td3='" + td3 + '\'' + + '}'; + } + +} diff --git a/user-service/src/main/java/com/mh/user/entity/TestEntity.java b/user-service/src/main/java/com/mh/user/entity/TestEntity.java new file mode 100644 index 0000000..a623b16 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/TestEntity.java @@ -0,0 +1,48 @@ +package com.mh.user.entity; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-08-20 + * @throws : + */ +public class TestEntity { + + private int id; + private String name; + private String sex; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + @Override + public String toString() { + return "TestEntity{" + + "id=" + id + + ", name='" + name + '\'' + + ", sex='" + sex + '\'' + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/UploadDeviceFloorEntity.java b/user-service/src/main/java/com/mh/user/entity/UploadDeviceFloorEntity.java new file mode 100644 index 0000000..ac83d8d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/UploadDeviceFloorEntity.java @@ -0,0 +1,31 @@ +package com.mh.user.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class UploadDeviceFloorEntity { + + private String deviceName; + private String deviceType; + private String buildingId; + private String model; + private String specs; + private String rowId; //行号 + + public UploadDeviceFloorEntity() { + + } + + public UploadDeviceFloorEntity(String deviceName,String deviceType, String buildingId, + String model, String specs, String rowId) { + this.deviceName = deviceName; + this.deviceType = deviceType; + this.buildingId = buildingId; + this.model = model; + this.specs = specs; + this.rowId = rowId; + } + +} diff --git a/user-service/src/main/java/com/mh/user/entity/UploadDeviceInstallEntity.java b/user-service/src/main/java/com/mh/user/entity/UploadDeviceInstallEntity.java new file mode 100644 index 0000000..2c31d83 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/UploadDeviceInstallEntity.java @@ -0,0 +1,109 @@ +package com.mh.user.entity; + +import java.util.Date; + +public class UploadDeviceInstallEntity { + + private String deviceAddr; //通讯编号 + private String deviceName; //设备名称 + private String deviceType; //设备类型 + private int baudRate; //波特率 + private String dataCom; //串口 + private double ratio; //倍率 + private String buildingId; //楼栋编号 + private String rowId; // Eexcel文件行号 + + public UploadDeviceInstallEntity() { + } + + public UploadDeviceInstallEntity(String deviceAddr, String deviceName,String deviceType, int baudRate,String dataCom, + Double ratio, String buildingId, String rowId) { + this.deviceAddr = deviceAddr; + this.deviceName = deviceName; + this.deviceType = deviceType; + this.baudRate = baudRate; + this.dataCom = dataCom; + this.ratio = ratio; + this.buildingId = buildingId; + this.rowId = rowId; + } + + public String getDeviceAddr() { + return deviceAddr; + } + + public void setDeviceAddr(String deviceAddr) { + this.deviceAddr = deviceAddr; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public int getBaudRate() { + return baudRate; + } + + public void setBaudRate(int baudRate) { + this.baudRate = baudRate; + } + + public String getDataCom() { + return dataCom; + } + + public void setDataCom(String dataCom) { + this.dataCom = dataCom; + } + + public double getRatio() { + return ratio; + } + + public void setRatio(double ratio) { + this.ratio = ratio; + } + + public String getBuildingId() { + return buildingId; + } + + public void setBuildingId(String buildingId) { + this.buildingId = buildingId; + } + + + public String getRowId() { + return rowId; + } + + public void setRowId(String rowId) { + this.rowId = rowId; + } + + @Override + public String toString() { + return "UploadDeviceInstallEntity{" + + "deviceAddr='" + deviceAddr + '\'' + + ", deviceName='" + deviceName + '\'' + + ", deviceType='" + deviceType + '\'' + + ", baudRate=" + baudRate + + ", dataCom='" + dataCom + '\'' + + ", ratio=" + ratio + + ", buildingId='" + buildingId + '\'' + + ", rowId='" + rowId + '\'' + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/UseForecastEntity.java b/user-service/src/main/java/com/mh/user/entity/UseForecastEntity.java new file mode 100644 index 0000000..bae2ac3 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/UseForecastEntity.java @@ -0,0 +1,18 @@ +package com.mh.user.entity; + +import lombok.Data; + +@Data +public class UseForecastEntity { + + private String tankId; + private String tankName; + private String wtLevelSet; + private String wtTempSet; + private String tankLevel; + private String tankTemp; + private String envTemp; + private String startDatetime; + private String buildingId; + +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/AxisLine.java b/user-service/src/main/java/com/mh/user/entity/chart/AxisLine.java new file mode 100644 index 0000000..3a50adc --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/AxisLine.java @@ -0,0 +1,23 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +public class AxisLine { + private boolean show; + private LineStyle lineStyle; + + public AxisLine(boolean show, LineStyle lineStyle) { + this.show = show; + this.lineStyle = lineStyle; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/BaseChartEntity.java b/user-service/src/main/java/com/mh/user/entity/chart/BaseChartEntity.java new file mode 100644 index 0000000..8f1b328 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/BaseChartEntity.java @@ -0,0 +1,45 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : 基础数据获取实体类 + * @description : + * @updateTime 2020-07-13 + * @throws : + */ +@Setter +@Getter +public class BaseChartEntity { + + private String chartTime; + private String indexName; + private String indexType; + private String displayType; + private int indexId; + private int width; + private String chartName; + private String timeName; + private int chartId; + private String unit; + private double data; + + @Override + public String toString() { + return "BaseChartEntity{" + + "chartTime='" + chartTime + '\'' + + ", indexName='" + indexName + '\'' + + ", indexType='" + indexType + '\'' + + ", displayType='" + displayType + '\'' + + ", indexId=" + indexId + + ", width=" + width + + ", chartName='" + chartName + '\'' + + ", timeName='" + timeName + '\'' + + ", chartId=" + chartId + + ", unit='" + unit + '\'' + + ", data=" + data + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/ChartEntity.java b/user-service/src/main/java/com/mh/user/entity/chart/ChartEntity.java new file mode 100644 index 0000000..fe21e01 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/ChartEntity.java @@ -0,0 +1,50 @@ +package com.mh.user.entity.chart; + +import com.alibaba.fastjson.annotation.JSONType; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * @author ljf + * @title :图表实体类 + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +@JSONType(orders = {"title","feature","legend","xAxis","yAxis","series","timeName"}) +public class ChartEntity { + + private Title title; + private Feature feature; + private Legend legend; + private XAxis xAxis; + private List yAxis; + private List series; + + public ChartEntity(Title title, Feature feature, Legend legend, XAxis xAxis, List yAxis, List series) { + this.title = title; + this.feature = feature; + this.legend = legend; + this.xAxis = xAxis; + this.yAxis = yAxis; + this.series = series; + } + + @Override + public String toString() { + return "ChartEntity{" + + "title=" + title + + ", feature=" + feature + + ", legend=" + legend + + ", xAxis=" + xAxis + + ", yAxis=" + yAxis + + ", series=" + series + + '}'; + } +} + + diff --git a/user-service/src/main/java/com/mh/user/entity/chart/Feature.java b/user-service/src/main/java/com/mh/user/entity/chart/Feature.java new file mode 100644 index 0000000..f9fa643 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/Feature.java @@ -0,0 +1,31 @@ +package com.mh.user.entity.chart; + +import com.alibaba.fastjson.annotation.JSONType; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Getter +@Setter +@JSONType(orders = {"state","tile","icon","name"}) +public class Feature { + private boolean[] state; + private String[] title; + private String[] icon; + private String[] name; + private String[] yAxisName; + + public Feature(boolean[] state, String[] title, String[] icon, String[] name, String[] yAxisName) { + this.state = state; + this.title = title; + this.icon = icon; + this.name = name; + this.yAxisName = yAxisName; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/GetChartParams.java b/user-service/src/main/java/com/mh/user/entity/chart/GetChartParams.java new file mode 100644 index 0000000..477fe94 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/GetChartParams.java @@ -0,0 +1,35 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Arrays; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-17 + * @throws : + */ +@Setter +@Getter +public class GetChartParams { + + private int chartId; + private int[] chooseIndexId; + private String beginTime; + private String endTime; + private String type; // 'today' 'yesterday' 'twentyFourHour' 'thisWeek' 'fourWeek' 'twelveMonth' 'fourYear' + + @Override + public String toString() { + return "GetChartParams{" + + "chartId=" + chartId + + ", chooseIndexId=" + Arrays.toString(chooseIndexId) + + ", beginTime='" + beginTime + '\'' + + ", endTime='" + endTime + '\'' + + ", type='" + type + '\'' + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/Legend.java b/user-service/src/main/java/com/mh/user/entity/chart/Legend.java new file mode 100644 index 0000000..6c56faa --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/Legend.java @@ -0,0 +1,27 @@ +package com.mh.user.entity.chart; + +import com.alibaba.fastjson.annotation.JSONType; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +@JSONType(orders = {"data","width","indexId"}) +public class Legend { + private String[] data; + private int width; + private int[] indexId; + + public Legend(String[] data, int width, int[] indexId) { + this.data = data; + this.width = width; + this.indexId = indexId; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/LineStyle.java b/user-service/src/main/java/com/mh/user/entity/chart/LineStyle.java new file mode 100644 index 0000000..b7b53bb --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/LineStyle.java @@ -0,0 +1,21 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +public class LineStyle { + private String color; + + public LineStyle(String color) { + this.color = color; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/Series.java b/user-service/src/main/java/com/mh/user/entity/chart/Series.java new file mode 100644 index 0000000..5d965b0 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/Series.java @@ -0,0 +1,29 @@ +package com.mh.user.entity.chart; + +import com.alibaba.fastjson.annotation.JSONType; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +@JSONType(orders = {"name","type","yAxisIndex","data"}) +public class Series { + private String name; + private String type; + private int yAxisIndex; + private Double[] data; + + public Series(String name, String type, int yAxisIndex, Double[] data) { + this.name = name; + this.type = type; + this.yAxisIndex = yAxisIndex; + this.data = data; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/SplitLine.java b/user-service/src/main/java/com/mh/user/entity/chart/SplitLine.java new file mode 100644 index 0000000..094faeb --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/SplitLine.java @@ -0,0 +1,21 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +public class SplitLine { + private boolean show; + + public SplitLine(boolean show) { + this.show = show; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/Title.java b/user-service/src/main/java/com/mh/user/entity/chart/Title.java new file mode 100644 index 0000000..2230feb --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/Title.java @@ -0,0 +1,25 @@ +package com.mh.user.entity.chart; + +import com.alibaba.fastjson.annotation.JSONType; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +@JSONType(orders = {"state","name"}) +public class Title { + private boolean state; + private String name; + + public Title(boolean state, String name) { + this.state = state; + this.name = name; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/Unit.java b/user-service/src/main/java/com/mh/user/entity/chart/Unit.java new file mode 100644 index 0000000..76b4cfd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/Unit.java @@ -0,0 +1,37 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description :单位实体类 + * @updateTime 2020-07-13 + * @throws : + */ +@Setter +@Getter +public class Unit { + + private int id; + private String unitName; + private String unit; + private String icon; + private String grade; + private String indexName; + private String otherName; + + @Override + public String toString() { + return "Unit{" + + "id=" + id + + ", unitName='" + unitName + '\'' + + ", unit='" + unit + '\'' + + ", icon='" + icon + '\'' + + ", grade='" + grade + '\'' + + ", indexName='" + indexName + '\'' + + ", otherName='" + otherName + '\'' + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/XAxis.java b/user-service/src/main/java/com/mh/user/entity/chart/XAxis.java new file mode 100644 index 0000000..922df29 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/XAxis.java @@ -0,0 +1,21 @@ +package com.mh.user.entity.chart; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +public class XAxis { + private String[] data; + + public XAxis(String[] data) { + this.data = data; + } +} diff --git a/user-service/src/main/java/com/mh/user/entity/chart/YAxis.java b/user-service/src/main/java/com/mh/user/entity/chart/YAxis.java new file mode 100644 index 0000000..da011b6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/entity/chart/YAxis.java @@ -0,0 +1,31 @@ +package com.mh.user.entity.chart; + +import com.alibaba.fastjson.annotation.JSONType; +import lombok.Getter; +import lombok.Setter; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +@Setter +@Getter +@JSONType(orders = {"type","name","splitLine","axisLine","show"}) +public class YAxis { + private String type; + private String name; + private SplitLine splitLine; + private AxisLine axisLine; + private boolean show; + + public YAxis(String type, String name, SplitLine splitLine, AxisLine axisLine, boolean show) { + this.type = type; + this.name = name; + this.splitLine = splitLine; + this.axisLine = axisLine; + this.show = show; + } +} diff --git a/user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java b/user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java new file mode 100644 index 0000000..73e0b94 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java @@ -0,0 +1,255 @@ +package com.mh.user.job; + +import com.mh.user.entity.AddCronJobReq; +import com.mh.user.manage.QuartzManager; +import com.mh.user.netty.EchoServer; +import com.mh.user.serialport.SerialPortListener; +import com.mh.user.serialport.SerialPortUtil; +import gnu.io.SerialPort; +import gnu.io.SerialPortEvent; +import lombok.extern.slf4j.Slf4j; +import org.apache.log4j.Logger; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : 自动执行采集程序,通过 + * @updateTime 2020-05-15 + * @throws : + */ +//@Component +public class CollectionLoopRunner implements ApplicationRunner { + + private static final Logger log = Logger.getLogger(CollectionLoopRunner.class); + + @Resource + QuartzManager quartzManager; + + public static SerialPort serialPort = null; + + @Override + public void run(ApplicationArguments args) throws Exception { +// collectionMeterAndCloud(); + log.info("==================测试日志================"); + } + + public void test() throws Exception { + System.out.println("测试定时采集开关"); + // 执行定义的定时采集程序 + Map params = new HashMap<>(); + params.put("id", "2"); + params.put("name", "test1"); + //每 1 分钟 执行一次 + AddCronJobReq addCronJobReq = new AddCronJobReq(); + addCronJobReq.setDate("0/10 * * * * ?"); +// addCronJobReq.setDate("0/5 * * * * ?"); + addCronJobReq.setJobClass("JobTest1"); + addCronJobReq.setJobGroupName("JobTestGroup1"); + addCronJobReq.setJobName("Test1"); + addCronJobReq.setParams(params); + addCronJobReq.setTriggerGroupName("triggerTestGroup1"); + addCronJobReq.setTriggerName("triggerTest1"); + quartzManager.addCronJob(addCronJobReq); + } + + /** + * 定时采集电表和冷量计 + * + * @throws Exception + */ + public void collectionMeterAndCloud() throws Exception { + // 执行定义的定时采集程序 + Map params = new HashMap<>(); + params.put("id", "6"); + params.put("name", "cloud_meter"); + AddCronJobReq addCronJobReq = new AddCronJobReq(); + //每 15 分钟 执行一次 + addCronJobReq.setDate("0 0/15 * * * ?"); + //每 3 分钟 执行一次 +// addCronJobReq.setDate("35 0/2 * * * ?"); + //每 2 分钟 执行一次 +// addCronJobReq.setDate("25 0/2 * * * ?"); + //每 1 分钟 执行一次 +// addCronJobReq.setDate("0/10 * * * * ?"); +// addCronJobReq.setDate("0/5 * * * * ?"); + addCronJobReq.setJobClass("JobCloudAndMeter"); + addCronJobReq.setJobGroupName("JobCloudAndMeterGroup"); + addCronJobReq.setJobName("CloudAndMeter"); + addCronJobReq.setParams(params); + addCronJobReq.setTriggerGroupName("triggerCloudAndMeterGroup"); + addCronJobReq.setTriggerName("triggerCloudAndMeter"); + quartzManager.addCronJob(addCronJobReq); + } + + /** + * 定时采集冷量计 + * + * @throws Exception + */ + public void collectionCloud() throws Exception { + // 执行定义的定时采集程序 + Map params = new HashMap<>(); + params.put("id", "1"); + params.put("name", "cloud"); + AddCronJobReq addCronJobReq = new AddCronJobReq(); + //每 2 分钟 执行一次 + addCronJobReq.setDate("25 0/2 * * * ?"); +// addCronJobReq.setDate("0/5 * * * * ?"); + addCronJobReq.setJobClass("JobCloud"); + addCronJobReq.setJobGroupName("JobCloudGroup"); + addCronJobReq.setJobName("Cloud"); + addCronJobReq.setParams(params); + addCronJobReq.setTriggerGroupName("triggerCloudGroup"); + addCronJobReq.setTriggerName("triggerCloud"); + quartzManager.addCronJob(addCronJobReq); + } + /** + * 定时采集电表 + * + * @throws Exception + */ + public void collectionMeter() throws Exception { + // 执行定义的定时采集程序 + Map params = new HashMap<>(); + params.put("id", "2"); + params.put("name", "meter"); + AddCronJobReq addCronJobReq = new AddCronJobReq(); + //每 3 分钟 执行一次 + addCronJobReq.setDate("35 0/2 * * * ?"); +// addCronJobReq.setDate("0/20 * * * * ?"); + addCronJobReq.setJobClass("JobMeter"); + addCronJobReq.setJobGroupName("JobMeterGroup"); + addCronJobReq.setJobName("Meter"); + addCronJobReq.setParams(params); + addCronJobReq.setTriggerGroupName("triggerMeterGroup"); + addCronJobReq.setTriggerName("triggerMeter"); + quartzManager.addCronJob(addCronJobReq); + } + + /** + * 定时采集DDC设备 + * + * @throws Exception + */ + public void collectionDDC() throws Exception { + // 执行定义的定时采集程序 + Map params = new HashMap<>(); + params.put("id", "3"); + params.put("name", "ddc"); + AddCronJobReq addCronJobReq = new AddCronJobReq(); + //每 1分钟 执行一次 +// addCronJobReq.setDate("3,33 * * * * ?"); + addCronJobReq.setDate("45 0/1 * * * ?"); + addCronJobReq.setJobClass("JobDDC"); + addCronJobReq.setJobGroupName("JobDDCGroup"); + addCronJobReq.setJobName("DDC"); + addCronJobReq.setParams(params); + addCronJobReq.setTriggerGroupName("triggerDDCGroup"); + addCronJobReq.setTriggerName("triggerDDC"); + quartzManager.addCronJob(addCronJobReq); + } + + /** + * 定时采集冷水机组设备 + * + * @throws Exception + */ + public void collectionChillers() throws Exception { + // 执行定义的定时采集程序 + Map params = new HashMap<>(); + params.put("id", "4"); + params.put("name", "chillers"); + AddCronJobReq addCronJobReq = new AddCronJobReq(); + //每3分钟 执行一次 + addCronJobReq.setDate("55 0/2 * * * ? "); +// addCronJobReq.setDate("0/30 * * * * ?"); + addCronJobReq.setJobClass("JobChillers"); + addCronJobReq.setJobGroupName("JobChillersGroup"); + addCronJobReq.setJobName("Chillers"); + addCronJobReq.setParams(params); + addCronJobReq.setTriggerGroupName("triggerChillersGroup"); + addCronJobReq.setTriggerName("triggerChillers"); + quartzManager.addCronJob(addCronJobReq); + } + + /** + * 4分钟,采集第二个冷水机组数据 + */ + public void collectionChillers1() { + // 执行定义的定时采集程序 + Map params = new HashMap<>(); + params.put("id", "5"); + params.put("name", "chillers1"); + AddCronJobReq addCronJobReq = new AddCronJobReq(); + //每 4分钟 执行一次 + addCronJobReq.setDate("0 0/5 * * * ? "); +// addCronJobReq.setDate("0/30 * * * * ?"); + addCronJobReq.setJobClass("JobChillers1"); + addCronJobReq.setJobGroupName("JobChillersGroup1"); + addCronJobReq.setJobName("Chillers1"); + addCronJobReq.setParams(params); + addCronJobReq.setTriggerGroupName("triggerChillersGroup1"); + addCronJobReq.setTriggerName("triggerChillers1"); + try { + quartzManager.addCronJob(addCronJobReq); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void testSerialPort(){ + + String portname = "COM7"; + //TestA(); + //查看所有串口 + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + ArrayList port = serialPortUtil.findPort(); + System.out.println("发现全部串口:" + port); + + System.out.println("打开指定portname:" + portname); + //打开该对应portname名字的串口 + CollectionLoopRunner.serialPort = serialPortUtil.openPort(portname, 2400, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD); + + byte[] HEX = SerialPortListener.hexStr2Byte("FEFEFE6810398710810000000103901F007C16"); + serialPortUtil.sendToPort(CollectionLoopRunner.serialPort, HEX); + + //给对应的serialPort添加监听器 + serialPortUtil.addListener(CollectionLoopRunner.serialPort, new SerialPortListener()); + + } + + public void plcAnalytic() { + String portName = "COM1"; + //查看所有串口 + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + //打开该对应portName名字的串口 + if (CollectionLoopRunner.serialPort == null) { + CollectionLoopRunner.serialPort = serialPortUtil.openPort(portName, 19200, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD); + byte[] hex = SerialPortListener.hexStr2Byte("A55A230000000022".replaceAll("\\s*", "")); + serialPortUtil.sendToPort(CollectionLoopRunner.serialPort, hex); + + //给对应的serialPort添加监听器-->设置串口的Listener + SerialPortUtil.setListenerToSerialPort(CollectionLoopRunner.serialPort, serialPortEvent -> { + if (serialPortEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + byte[] bytes = serialPortUtil.readFromPort(CollectionLoopRunner.serialPort); + + String needData = SerialPortListener.printHexString(bytes); + + //数据校验 校验数据长度、起始5A A5、数据sum位 +// if (PlcUtil.makeChecksum(needData)) { +// //数据解析方法 此处编写你的解析方法,根据获取到的数据编写适合自己的方法 +// } + } + }); + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/job/DealDataJob.java b/user-service/src/main/java/com/mh/user/job/DealDataJob.java new file mode 100644 index 0000000..9c91158 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/DealDataJob.java @@ -0,0 +1,153 @@ +package com.mh.user.job; + +import com.mh.user.netty.EchoServerHandler; +import com.mh.user.service.chillers.DealDataService; +import com.mh.user.utils.ExchangeStringUtil; +import com.mh.user.utils.SimpleWeather; +import org.apache.log4j.Logger; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @author ljf + * @title :定时处理采集回来的历史数据 + * @description : + * @updateTime 2020-07-28 + * @throws : + */ +@Component +public class DealDataJob { + + private final DealDataService dealDataService; + private final SimpleWeather simpleWeather=new SimpleWeather(); + private static final Logger log = Logger.getLogger(DealDataJob.class); + public DealDataJob(DealDataService dealDataService) { + this.dealDataService = dealDataService; + } + + /** + * 定时处理汇总数据:每2分钟处理一次,所有项目统一处理 + */ + @Scheduled(cron = "25 0/2 * * * ?") //每2分钟一次 + public void ProEnergy() { + try { + SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + String curDate=sdf1.format(date); +// dealDataService.proEnergy(curDate);//中央热水yyyy-MM-dd HH:mm:ss + + String m=curDate.substring(15,16); + if (Integer.valueOf(m)==0){ + curDate=curDate.substring(0,16)+":00"; + }else if(Integer.valueOf(m)==2){ + curDate=curDate.substring(0,16)+":00"; + }else if(Integer.valueOf(m)==4){ + curDate=curDate.substring(0,16)+":00"; + }else if(Integer.valueOf(m)==6){ + curDate=curDate.substring(0,16)+":00"; + }else if(Integer.valueOf(m)==8){ + curDate=curDate.substring(0,16)+":00"; + } + dealDataService.proEnergyData(curDate);//中央空调yyyy-MM-dd HH:mm:ss + System.out.println("---------数据分析定时汇总,每二分钟!"+curDate); + } catch (Exception e) { +// e.printStackTrace(); + } + } + /** + * 定时处理数据:每十五分钟处理一次 + */ + @Scheduled(cron = "0 0/16 * * * ?") + public void dealData() { + try { + SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + String curDate=sdf1.format(date); + dealDataService.proDeviceState(curDate); + System.out.println("---------设备状态定时汇总,每十五分钟!"+curDate); + } catch (Exception e) { +// e.printStackTrace(); + } + } + + /** + * 定时处理数据:每分钟处理一次,单个项目分别处理 + */ + @Scheduled(cron = "0 0/1 * * * ?") + public void proDataResult() { + try { + String curDate= ExchangeStringUtil.dateTime(1,""); + List list=dealDataService.queryProjectId("3"); + if (list.size()>0){ + for(String projectID:list){ + dealDataService.proDataResult(curDate,projectID); //1珠江酒店,2广合,3广大 + } + } + System.out.println("---------能效监测定时汇总,每一分钟!"+curDate); + } catch (Exception e) { +// e.printStackTrace(); + } + } + + /** + * 定时处理数据:获取环境温度和湿度,所有项目共有 + */ + @Scheduled(cron = "0 0 0/1 * * ?") //1小时保存一次温度、湿度变化值 +// @Scheduled(cron = "0 0/1 * * * ?") //1分钟 + public void saveTempHumidity() { + try { + SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + Map map=simpleWeather.queryWeather("广州"); + String curDate=sdf1.format(date); + String temperature=map.get("temperature").toString(); + String humidity=map.get("humidity").toString(); + dealDataService.saveTempHumidity(curDate,temperature,humidity); + log.info(curDate+","+temperature+"℃,"+humidity+"%"); + } catch (Exception e) { +// e.printStackTrace(); + log.error("调用获取环境温湿度接口失败!"); + } + } + + /** + * 定时处理数据:每天处理一次 + */ + @Scheduled(cron = "0 0 0 1/1 * ?") +// @Scheduled(cron = "0 0/1 * * * ?") //1分钟 + public void proEnergyDaySum() { + try { + SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd"); + Date date=new Date(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DATE, -1);// 减少一天 + String curDate=sdf1.format(calendar.getTime()); + List list=dealDataService.queryProjectId("2"); + if (list.size()>0){ + for(String projectID:list){ + dealDataService.proEnergyDaySum(curDate,projectID); + } + } + System.out.println("---------中央热水生产概况汇总,每一小时!"+curDate); + } catch (Exception e) { +// e.printStackTrace(); + } + } + + + /** + * 定时删除历史流水记录(删除前三个月的记录) + */ +// @Scheduled(cron = "0 0 0 1 1/1 ? ") +// public void deleteDataHistory() { +// try { +// dealDataService.deleteChillersDataHistory(); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + +} diff --git a/user-service/src/main/java/com/mh/user/job/JobChillers.java b/user-service/src/main/java/com/mh/user/job/JobChillers.java new file mode 100644 index 0000000..94da1f7 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/JobChillers.java @@ -0,0 +1,41 @@ +package com.mh.user.job; + +import com.mh.user.constants.SocketMessage; +import com.mh.user.netty.NettyChillerClient; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author ljf + * @title : + * @description :定时采集冷水机组参数 + * @updateTime 2020-06-24 + * @throws : + */ +/** + * :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. + * :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 + * :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, + * 否则会在3秒时再启用新的线程执行 + */ +@DisallowConcurrentExecution +@Slf4j +public class JobChillers implements Job { + + @Autowired + private SocketMessage socketMessage; + + @SneakyThrows + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + log.info("定时采集冷水机组"); +// NettyChillerClient nettyChillerClient = new NettyChillerClient(); + NettyChillerClient.connect(socketMessage.getPort(), socketMessage.getIP()); + + } +} diff --git a/user-service/src/main/java/com/mh/user/job/JobCloud.java b/user-service/src/main/java/com/mh/user/job/JobCloud.java new file mode 100644 index 0000000..d627f86 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/JobCloud.java @@ -0,0 +1,41 @@ +package com.mh.user.job; + +import com.mh.user.netty.NettyClient; +import com.mh.user.constants.SocketMessage; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author ljf + * @title : + * @description : 定时采集冷量计任务 + * @updateTime 2020-05-18 + * @throws : + */ +/** + * :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. + * :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 + * :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, + * 否则会在3秒时再启用新的线程执行 + */ +@DisallowConcurrentExecution +@Slf4j +public class JobCloud implements Job { + + @Autowired + private SocketMessage socketMessage; + + @SneakyThrows + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + // 定时采集冷量计 + log.info("定时采集冷量计"); + NettyClient nettyClient = new NettyClient(); + nettyClient.connect(socketMessage.getPort(),socketMessage.getIP()); + } +} diff --git a/user-service/src/main/java/com/mh/user/job/JobDDC.java b/user-service/src/main/java/com/mh/user/job/JobDDC.java new file mode 100644 index 0000000..3eee735 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/JobDDC.java @@ -0,0 +1,39 @@ +package com.mh.user.job; + +import com.mh.user.constants.SocketMessage; +import com.mh.user.netty.NettyChillerDDCClient; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author ljf + * @title : 定时采集DDC设备 + * @description : + * @updateTime 2020-06-09 + * @throws : + */ +/** + * :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. + * :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 + * :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, + * 否则会在3秒时再启用新的线程执行 + */ +@DisallowConcurrentExecution +@Slf4j +public class JobDDC implements Job { + + @Autowired + private SocketMessage socketMessage; + + @SneakyThrows + @Override + public void execute(JobExecutionContext jobExecutionContext) { + log.info("定时采集DDC设备"); +// NettyChillerDDCClient nettyChillerDDCClient = new NettyChillerDDCClient(); + NettyChillerDDCClient.connect(socketMessage.getPort(), socketMessage.getIP()); + } +} diff --git a/user-service/src/main/java/com/mh/user/job/JobFactory.java b/user-service/src/main/java/com/mh/user/job/JobFactory.java new file mode 100644 index 0000000..b124b49 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/JobFactory.java @@ -0,0 +1,45 @@ +package com.mh.user.job; + +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.stereotype.Component; + +/** + * @author ljf + * @title :创建JobFactory实例 + * @description : + * @updateTime 2020-04-03 + * @throws : + */ +@Component +public class JobFactory extends AdaptableJobFactory { + + /** + * AutowireCapableBeanFactory接口是BeanFactory的子类 + * 可以连接和填充那些生命周期不被Spring管理的已存在的bean实例 + */ + private AutowireCapableBeanFactory factory; + + /** + * @author jinhaoxun + * @description 构造器 + * @param factory + */ + public JobFactory(AutowireCapableBeanFactory factory) { + this.factory = factory; + } + + /** + * @author jinhaoxun + * @description 创建Job实例 + * @param bundle + * @return Object + */ + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + Object job = super.createJobInstance(bundle);// 实例化对象 + factory.autowireBean(job);// 进行注入(Spring管理该Bean) + return job;//返回对象 + } +} diff --git a/user-service/src/main/java/com/mh/user/job/JobMeter.java b/user-service/src/main/java/com/mh/user/job/JobMeter.java new file mode 100644 index 0000000..b9e6cd8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/JobMeter.java @@ -0,0 +1,39 @@ +package com.mh.user.job; + +import com.mh.user.netty.NettyMeterClient; +import com.mh.user.constants.SocketMessage; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author ljf + * @title : + * @description : 定时采集电表数据任务 + * @updateTime 2020-05-18 + * @throws : + */ +/** + * :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. + * :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 + * :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, + * 否则会在3秒时再启用新的线程执行 + */ +@DisallowConcurrentExecution +@Slf4j +public class JobMeter implements Job { + + @Autowired + private SocketMessage socketMessage; + + @SneakyThrows + @Override + public void execute(JobExecutionContext jobExecutionContext) { + log.info("定时采集电表数据任务开始"); + NettyMeterClient nettyMeterClient = new NettyMeterClient(); + nettyMeterClient.connect(socketMessage.getPort(), socketMessage.getIP()); + } +} diff --git a/user-service/src/main/java/com/mh/user/job/JobTest.java b/user-service/src/main/java/com/mh/user/job/JobTest.java new file mode 100644 index 0000000..ccbee63 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/JobTest.java @@ -0,0 +1,32 @@ +package com.mh.user.job; + +import com.mh.user.constants.Constant; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +/** + * :@DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行. + * :注意org.quartz.threadPool.threadCount线程池中线程的数量至少要多个,否则@DisallowConcurrentExecution不生效 + * :假如Job的设置时间间隔为3秒,但Job执行时间是5秒,设置@DisallowConcurrentExecution以后程序会等任务执行完毕以后再去执行, + * 否则会在3秒时再启用新的线程执行 + */ +@DisallowConcurrentExecution +@Slf4j +public class JobTest implements Job { + @SneakyThrows + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + for (int i = 0; i < 30; i++) { + if (Constant.FLAG) { + break; + } + Thread.sleep(1000); + log.info("第" + i + "个," +jobExecutionContext.getJobDetail()+"---------------------定时任务测试----------------------"); + } + + } +} diff --git a/user-service/src/main/java/com/mh/user/manage/QuartzManager.java b/user-service/src/main/java/com/mh/user/manage/QuartzManager.java new file mode 100644 index 0000000..1449998 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/manage/QuartzManager.java @@ -0,0 +1,259 @@ +package com.mh.user.manage; + +import com.mh.user.entity.AddCronJobReq; +import com.mh.user.entity.AddSimpleJobReq; +import com.mh.user.entity.DeleteJobReq; +import lombok.extern.slf4j.Slf4j; +import org.quartz.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; +import org.springframework.stereotype.Service; + +import static org.quartz.DateBuilder.futureDate; + +/** + * @author ljf + * @title : Quartz管理类 + * @description : + * @updateTime 2020-04-03 + * @throws : + */ +@Slf4j +@Service +public class QuartzManager { + + private final Scheduler scheduler; + + /** + * @author jinhaoxun + * @description 构造器 + * @param scheduler 调度器 + */ + public QuartzManager(Scheduler scheduler){ + this.scheduler = scheduler; + } + + /** + * quartz任务类包路径 + */ + private static String jobUri = "com.mh.user.job."; + + /** + * @author jinhaoxun + * @description 添加一个Simple定时任务,只执行一次的定时任务 + * @param addSimpleJobReq 参数对象 + * @param taskId 任务ID,不能同名 + * @throws RuntimeException + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void addSimpleJob(AddSimpleJobReq addSimpleJobReq, String taskId) throws Exception { + String jobUrl = jobUri + addSimpleJobReq.getJobClass(); + System.out.println(jobUrl); + try { + MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean(); + /* + * 是否并发执行 + * 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了, + * 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行 + */ + jobDetail.setConcurrent(false); + Class aClass = (Class) Class.forName(jobUrl).newInstance().getClass(); + // 任务名,任务组,任务执行类 + JobDetail job = JobBuilder.newJob(aClass).withIdentity(taskId, + "JobGroup").build(); + //增加任务ID参数 + addSimpleJobReq.getParams().put("taskId",taskId); + // 添加任务参数 + job.getJobDataMap().putAll(addSimpleJobReq.getParams()); + // 转换为时间差,秒单位 + int time = (int) (addSimpleJobReq.getDate().getTime() - System.currentTimeMillis()) / 1000; + + SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() + .withIdentity(taskId, taskId + "TriggerGroup") + .startAt(futureDate(time, DateBuilder.IntervalUnit.SECOND)) + .build(); + // 调度容器设置JobDetail和Trigger + scheduler.scheduleJob(job, trigger); + if (!scheduler.isShutdown()) { + // 启动 + scheduler.start(); + } + } catch (Exception e) { + e.printStackTrace(); + log.info("Quartz新增任务失败"); + } + } + + /** + * @author jinhaoxun + * @description 添加一个Cron定时任务,循环不断执行的定时任务 + * @param addCronJobReq 参数对象 + * @throws Exception + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void addCronJob(AddCronJobReq addCronJobReq) throws Exception { + String jobUrl = jobUri + addCronJobReq.getJobClass(); + try { + MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean(); + /* + * 是否并发执行 + * 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了, + * 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行 + */ + jobDetail.setConcurrent(false); + Class aClass = (Class) Class.forName(jobUrl).newInstance().getClass(); + // 任务名,任务组,任务执行类 + JobDetail job = JobBuilder.newJob(aClass).withIdentity(addCronJobReq.getJobName(), + addCronJobReq.getJobGroupName()).build(); + // 添加任务参数 + job.getJobDataMap().putAll(addCronJobReq.getParams()); + // 创建触发器 + CronTrigger trigger = TriggerBuilder.newTrigger() + // 触发器名,触发器组 + .withIdentity(addCronJobReq.getTriggerName(), addCronJobReq.getTriggerGroupName()) + // 触发器时间设定 + .withSchedule(CronScheduleBuilder.cronSchedule(addCronJobReq.getDate())) + .build(); + // 调度容器设置JobDetail和Trigger + scheduler.scheduleJob(job, trigger); + + if (!scheduler.isShutdown()) { + // 启动 + scheduler.start(); + } + } catch (Exception e) { + log.info("Quartz新增任务失败"); + } + } + + /** + * @author jinhaoxun + * @description 修改一个任务的触发时间 + * @param triggerName 触发器名 + * @param triggerGroupName 触发器组名 + * @param cron 时间设置,参考quartz说明文档 + * @throws Exception + */ + public void modifyJobTime(String triggerName, String triggerGroupName, String cron) throws Exception { + try { + TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); + CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + if (trigger == null) { + return; + } + String oldTime = trigger.getCronExpression(); + if (!oldTime.equalsIgnoreCase(cron)) { + // 触发器 + TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger(); + // 触发器名,触发器组 + triggerBuilder.withIdentity(triggerName, triggerGroupName); + triggerBuilder.startNow(); + // 触发器时间设定 + triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron)); + // 创建Trigger对象 + trigger = (CronTrigger) triggerBuilder.build(); + // 方式一 :修改一个任务的触发时间 + scheduler.rescheduleJob(triggerKey, trigger); + } + } catch (Exception e) { + log.info("Quartz修改任务失败"); + } + } + /** + * @author jinhaoxun + * @description 移除一个任务 + * @param deleteJobReq 参数对象 + * @throws Exception + */ + public void removeJob(DeleteJobReq deleteJobReq) throws Exception { + try { + TriggerKey triggerKey = TriggerKey.triggerKey(deleteJobReq.getTriggerName(), deleteJobReq.getTriggerGroupName()); + // 停止触发器 + scheduler.pauseTrigger(triggerKey); + // 移除触发器 + scheduler.unscheduleJob(triggerKey); + // 删除任务 + scheduler.deleteJob(JobKey.jobKey(deleteJobReq.getJobName(), deleteJobReq.getJobGroupName())); + } catch (Exception e) { + log.info("Quartz删除改任务失败"); + } + } + + /** + * @author jinhaoxun + * @description 获取任务是否存在 + * @param triggerName 触发器名 + * @param triggerGroupName 触发器组名 + * @return Boolean 返回操作结果 + * 获取任务是否存在 + * STATE_BLOCKED 4 阻塞 + * STATE_COMPLETE 2 完成 + * STATE_ERROR 3 错误 + * STATE_NONE -1 不存在 + * STATE_NORMAL 0 正常 + * STATE_PAUSED 1 暂停 + * @throws Exception + */ + public Boolean notExists(String triggerName, String triggerGroupName) throws Exception { + try { + if (scheduler.getTriggerState(TriggerKey.triggerKey(triggerName, triggerGroupName)) == Trigger.TriggerState.NORMAL){ + return true; + } + } catch (Exception e) { + log.info("Quartz获取任务是否存在失败"); + } + return false; + } + + /** + * @author jinhaoxun + * @description 关闭调度器 + * @throws RuntimeException + */ + public void shutdown() throws Exception { + try { + if(scheduler.isStarted()){ + scheduler.shutdown(true); + } + } catch (Exception e) { + log.info("Quartz关闭调度器失败"); + } + } + + //暂停所有任务 + public void pauseAllJob() throws SchedulerException { + scheduler.pauseAll(); + } + + //暂停任务 + public String pauseJob(String jobName, String jobGroup) throws SchedulerException { + JobKey jobKey = new JobKey(jobName, jobGroup); + JobDetail jobDetail = scheduler.getJobDetail(jobKey); + if (jobDetail == null) { + return "fail"; + }else { + scheduler.pauseJob(jobKey); + return "success"; + } + + } + + //恢复所有任务 + public void resumeAllJob() throws SchedulerException { + scheduler.resumeAll(); + } + + // 恢复某个任务 + public String resumeJob(String jobName, String jobGroup) throws SchedulerException { + + JobKey jobKey = new JobKey(jobName, jobGroup); + JobDetail jobDetail = scheduler.getJobDetail(jobKey); + if (jobDetail == null) { + return "fail"; + }else { + scheduler.resumeJob(jobKey); + return "success"; + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/manage/SerialPortManager.java b/user-service/src/main/java/com/mh/user/manage/SerialPortManager.java new file mode 100644 index 0000000..eb6c256 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/manage/SerialPortManager.java @@ -0,0 +1,233 @@ +package com.mh.user.manage;//package com.mh.quartz.manage; +// +//import com.mh.quartz.utils.ExchangeStringUtil; +//import gnu.io.*; +//import lombok.extern.slf4j.Slf4j; +// +//import java.io.IOException; +//import java.io.InputStream; +//import java.io.OutputStream; +//import java.util.ArrayList; +//import java.util.Enumeration; +//import java.util.TooManyListenersException; +// +///** +// * 串口管理 +// * +// * @author yangle +// */ +//@Slf4j +//public class SerialPortManager { +// +// /** +// * 查找所有可用端口 +// * +// * @return 可用端口名称列表 +// */ +// public static final ArrayList findPorts() { +// // 获得当前所有可用串口 +// Enumeration portList = CommPortIdentifier.getPortIdentifiers(); +// ArrayList portNameList = new ArrayList(); +// // 将可用串口名添加到List并返回该List +// while (portList.hasMoreElements()) { +// String portName = portList.nextElement().getName(); +// portNameList.add(portName); +// } +// return portNameList; +// } +// +// /** +// * 打开串口 +// * +// * @param portName +// * 端口名称 +// * @param baudrate +// * 波特率 +// * @return 串口对象 +// * @throws PortInUseException +// * 串口已被占用 +// */ +// public static final SerialPort openPort(String portName, int baudrate) throws PortInUseException { +// try { +// // 通过端口名识别端口 +// CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); +// // 打开端口,并给端口名字和一个timeout(打开操作的超时时间) +// CommPort commPort = portIdentifier.open(portName, 2000); +// // 判断是不是串口 +// if (commPort instanceof SerialPort) { +// SerialPort serialPort = (SerialPort) commPort; +// try { +// // 设置一下串口的波特率等参数 +// // 数据位:8 +// // 停止位:1 +// // 校验位:even +// serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, +// SerialPort.PARITY_EVEN); +// } catch (UnsupportedCommOperationException e) { +// e.printStackTrace(); +// } +// return serialPort; +// } +// } catch (NoSuchPortException e1) { +// e1.printStackTrace(); +// } +// return null; +// } +// +// /** +// * 关闭串口 +// * +// * @param serialPort +// * 待关闭的串口对象 +// */ +// public static void closePort(SerialPort serialPort) { +// if (serialPort != null){ +// serialPort.close(); +// } +// } +// +// /** +// * 往串口发送数据 +// * +// * @param serialPort +// * 串口对象 +// * @param order +// * 待发送数据 +// */ +// public static void sendToPort(SerialPort serialPort, byte[] order) { +// OutputStream out = null; +// try { +// out = serialPort.getOutputStream(); +// out.write(order); +// out.flush(); +// } catch (IOException e) { +// e.printStackTrace(); +// } finally { +// try { +// if (out != null) { +// out.close(); +// out = null; +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } +// +// /** +// * 从串口读取数据 +// * +// * @param serialPort +// * 当前已建立连接的SerialPort对象 +// * @return 读取到的数据 +// */ +// public static byte[] readFromPort(SerialPort serialPort) { +// InputStream in = null; +// byte[] bytes = {}; +// try { +// in = serialPort.getInputStream(); +// // 缓冲区大小为一个字节 +// byte[] readBuffer = new byte[1]; +// int bytesNum = in.read(readBuffer); +// while (bytesNum > 0) { +// bytes = ExchangeStringUtil.concat(bytes, readBuffer); +// bytesNum = in.read(readBuffer); +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } finally { +// try { +// if (in != null) { +// in.close(); +// in = null; +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return bytes; +// } +// +// /** +// * 添加监听器 +// * +// * @param serialPort +// * 串口对象 +// * @param listener +// * 串口存在有效数据监听 +// */ +// public static void addListener(SerialPort serialPort, DataAvailableListener listener) { +// try { +// // 给串口添加监听器 +// serialPort.addEventListener(new SerialPortListener(listener)); +// // 设置当有数据到达时唤醒监听接收线程 +// serialPort.notifyOnDataAvailable(true); +// // 设置当通信中断时唤醒中断线程 +// serialPort.notifyOnBreakInterrupt(true); +// } catch (TooManyListenersException e) { +// e.printStackTrace(); +// } +// } +// +// /** +// * 串口监听 +// */ +// public static class SerialPortListener implements SerialPortEventListener { +// +// private DataAvailableListener mDataAvailableListener; +// +// public SerialPortListener(DataAvailableListener mDataAvailableListener) { +// this.mDataAvailableListener = mDataAvailableListener; +// } +// +// public void serialEvent(SerialPortEvent serialPortEvent) { +// switch (serialPortEvent.getEventType()) { +// case SerialPortEvent.DATA_AVAILABLE: // 1.串口存在有效数据 +// if (mDataAvailableListener != null) { +// mDataAvailableListener.dataAvailable(); +// } +// break; +// +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2.输出缓冲区已清空 +// break; +// +// case SerialPortEvent.CTS: // 3.清除待发送数据 +// break; +// +// case SerialPortEvent.DSR: // 4.待发送数据准备好了 +// break; +// +// case SerialPortEvent.RI: // 5.振铃指示 +// break; +// +// case SerialPortEvent.CD: // 6.载波检测 +// break; +// +// case SerialPortEvent.OE: // 7.溢位(溢出)错误 +// break; +// +// case SerialPortEvent.PE: // 8.奇偶校验错误 +// break; +// +// case SerialPortEvent.FE: // 9.帧错误 +// break; +// +// case SerialPortEvent.BI: // 10.通讯中断 +// break; +// +// default: +// break; +// } +// } +// } +// +// /** +// * 串口存在有效数据监听 +// */ +// public interface DataAvailableListener { +// /** +// * 串口存在有效数据 +// */ +// void dataAvailable(); +// } +//} diff --git a/user-service/src/main/java/com/mh/user/manage/SerialPortManages.java b/user-service/src/main/java/com/mh/user/manage/SerialPortManages.java new file mode 100644 index 0000000..b9d75da --- /dev/null +++ b/user-service/src/main/java/com/mh/user/manage/SerialPortManages.java @@ -0,0 +1,345 @@ +package com.mh.user.manage;//package com.mh.quartz.manage; +// +//import com.mh.quartz.utils.ExchangeStringUtil; +//import gnu.io.*; +// +//import java.io.IOException; +//import java.io.InputStream; +//import java.io.OutputStream; +//import java.util.*; +//import java.util.concurrent.BlockingQueue; +//import java.util.concurrent.LinkedBlockingQueue; +// +///** +// * @author ljf +// * @title : +// * @description : +// * @updateTime 2020-04-20 +// * @throws : +// */ +//public class SerialPortManages extends Thread implements SerialPortEventListener { // SerialPortEventListener +// +// // 监听器,我的理解是独立开辟一个线程监听串口数据 +// // 串口通信管理类 +// static CommPortIdentifier portId; +// +// /* 有效连接上的端口的枚举 */ +// +// static Enumeration portList; +// InputStream inputStream; // 从串口来的输入流 +// static OutputStream outputStream;// 向串口输出的流 +// static SerialPort serialPort; // 串口的引用 +// // 堵塞队列用来存放读到的数据 +// private BlockingQueue msgQueue = new LinkedBlockingQueue(); +// +//// @Override +// /** +// * SerialPort EventListene 的方法,持续监听端口上是否有数据流 +// */ +// public void serialEvent(SerialPortEvent event) {// +// +// switch (event.getEventType()) { +// case SerialPortEvent.BI: +// case SerialPortEvent.OE: +// case SerialPortEvent.FE: +// case SerialPortEvent.PE: +// case SerialPortEvent.CD: +// case SerialPortEvent.CTS: +// case SerialPortEvent.DSR: +// case SerialPortEvent.RI: +// case SerialPortEvent.OUTPUT_BUFFER_EMPTY: +// break; +// case SerialPortEvent.DATA_AVAILABLE:// 当有可用数据时读取数据 +// byte[] readBuffer = new byte[1024]; +// int availableBytes = 0; +// try { +// availableBytes = inputStream.available(); +// while (availableBytes > 0) { +// readBuffer = SerialPortManages.readFromPort(serialPort); +// String needData = ExchangeStringUtil.printHexString(readBuffer); +// System.out.println(new Date() + " 真实收到的数据为:-----" + needData); +// availableBytes = inputStream.available(); +// msgQueue.add(needData); +// } +// } catch (IOException e) { +// } +// default: +// break; +// } +// } +// +// /** +// * 从串口读取数据 +// * +// * @param serialPort 当前已建立连接的SerialPort对象 +// * @return 读取到的数据 +// */ +// public static byte[] readFromPort(SerialPort serialPort) { +// InputStream in = null; +// byte[] bytes = {}; +// try { +// in = serialPort.getInputStream(); +// // 缓冲区大小为一个字节 +// byte[] readBuffer = new byte[1]; +// int bytesNum = in.read(readBuffer); +// while (bytesNum > 0) { +// bytes = ExchangeStringUtil.concat(bytes, readBuffer); +// bytesNum = in.read(readBuffer); +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } finally { +// try { +// if (in != null) { +// in.close(); +// in = null; +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return bytes; +// } +// +// +// /** +// * 通过程序打开COM4串口,设置监听器以及相关的参数 +// * +// * @return 返回1 表示端口打开成功,返回 0表示端口打开失败 +// */ +// public int startComPort() { +// // 通过串口通信管理类获得当前连接上的串口列表 +// portList = CommPortIdentifier.getPortIdentifiers(); +// +// while (portList.hasMoreElements()) { +// // 获取相应串口对象 +// portId = (CommPortIdentifier) portList.nextElement(); +// +// System.out.println("设备类型:--->" + portId.getPortType()); +// System.out.println("设备名称:---->" + portId.getName()); +// // 判断端口类型是否为串口 +// if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { +// // 判断如果COM4串口存在,就打开该串口 +// if (portId.getName().equals("COM3")) { +// try { +// // 打开串口名字为COM_4(名字任意),延迟为1000毫秒 +// serialPort = (SerialPort) portId.open(portId.getName(), 1000); +// +// } catch (PortInUseException e) { +// System.out.println("打开端口失败!"); +// e.printStackTrace(); +// return 0; +// } +// // 设置串口的一些读写参数 +// try { +// // 比特率、数据位、停止位、奇偶校验位 +// serialPort.setSerialPortParams(9600, +// SerialPort.DATABITS_8, SerialPort.STOPBITS_1, +// SerialPort.PARITY_EVEN); +// } catch (UnsupportedCommOperationException e) { +// e.printStackTrace(); +// return 0; +// } +// // 设置当前串口的输入输出流 +// try { +// inputStream = serialPort.getInputStream(); +// outputStream = serialPort.getOutputStream(); +// } catch (IOException e) { +// e.printStackTrace(); +// return 0; +// } +// // 给当前串口添加一个监听器 +// try { +// serialPort.addEventListener(this); +// } catch (TooManyListenersException e) { +// e.printStackTrace(); +// return 0; +// } +// // 设置监听器生效,即:当有数据时通知 +// serialPort.notifyOnDataAvailable(true); +// +// // 设置当通信中断时唤醒中断线程 +// serialPort.notifyOnBreakInterrupt(true); +// +// return 1; +// } +// } +// } +// return 0; +// } +// +// @Override +// public void run() { +// // TODO Auto-generated method stub +// try { +// System.out.println("--------------任务处理线程运行了--------------"); +// String vo = ""; +// String vos[] = new String[0]; +// while (true) { +// // 判断数组是否完整 +// // 冷量计 +// if (vos.length >= 9) { +// System.out.println("获取到数据长度: " + vos.length); +// System.out.println("串口: " + new Date() + " 完整收到的数据为:-----" + vo); +// vos = new String[0]; +// vo = ""; +//// sendOrder(); +// } else { +// // 如果堵塞队列中存在数据就将其输出 +// if (msgQueue.size() > 0) { +// if (vo == ""){ +// vo = msgQueue.peek(); +// } else { +// vo = vo + " " + msgQueue.peek(); +// } +// vos = vo.split(" ", -1); +//// getData(vos); +// msgQueue.take(); +// } +// } +// +// +// } +// } catch (Exception e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } +// } +// +// /** +// * @Description: 发送获取数据指令 +// * @Param: +// * @return: +// * @Author: LiangZF +// * @Date: 2019/1/3 +// */ +// public void sendOrder() { +// try { +// Thread.sleep(3000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// int i = 1; +// if (i == 1) { +// // 启动线程来处理收到的数据 +// try { +//// byte[] b = new byte[]{(byte) 0xFE, 0x03, 0x00, 0x00, 0x00, 0x0E, (byte) 0xC4, 0x0E}; +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6825110040010868010143C35816"); // 单相表 +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("5803004900021914"); // 冷量计 +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6830043080000068110432326536C816"); // 三相表 +//// System.out.println("发送的数据:" + ExchangeStringUtil.byteArrayToHexString(b)); +//// outputStream.write(b); +//// outputStream.flush(); +// for (int j = 0; j < 10; j++) { +// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("5803004900021914"); // 冷量计 +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6830043080000068110432326536C816"); // 三相表 +// System.out.println("发送的数据:" + ExchangeStringUtil.byteArrayToHexString(b)); +// outputStream.write(b); +// Thread.sleep(100); +// outputStream.flush(); +// } +// } catch (IOException | InterruptedException e) { +// // TODO Auto-generated catch block +// serialPort.close(); +// e.printStackTrace(); +// } finally { +// try { +// if (outputStream != null) { +// outputStream.close(); +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } +// } +// +// // 16转10计算 +// public long getNum(String num1, String num2) { +// long value = Long.parseLong(num1, 16) * 256 + Long.parseLong(num2, 16); +// return value; +// } +// +// public static void startService(){ +// SerialPortManages cRead = new SerialPortManages(); +// int i = cRead.startComPort(); +// if (i == 1) { +// // 启动线程来处理收到的数据 +// cRead.start(); +// try { +// //根据提供的文档给出的发送命令,发送16进制数据给仪器 +//// byte[] b = new byte[]{0x01, 0x03, 0x00, 0x00, 0x00, 0x0E, (byte) 0xC4, 0x0E}; +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6825110040010868010143C35816"); +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("5803004900021914"); +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6830043080000068110432326536C816"); // 三相表 +//// System.out.println("发送的数据:" + b); +//// System.out.println("发出字节数:" + b.length); +//// outputStream.write(b); +//// outputStream.flush(); +// for (int j = 0; j < 10; j++) { +// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("5803004900021914"); // 冷量计 +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6830043080000068110432326536C816"); // 三相表 +// System.out.println("发送的数据:" + ExchangeStringUtil.byteArrayToHexString(b)); +// outputStream.write(b); +// Thread.sleep(100); +// outputStream.flush(); +// } +// } catch (IOException | InterruptedException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } finally { +// try { +// if (outputStream != null) { +// outputStream.close(); +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } else { +// return; +// } +// } +// +// public static void main(String[] args) { +// SerialPortManages cRead = new SerialPortManages(); +// int i = cRead.startComPort(); +// if (i == 1) { +// // 启动线程来处理收到的数据 +// cRead.start(); +// try { +// //根据提供的文档给出的发送命令,发送16进制数据给仪器 +//// byte[] b = new byte[]{0x01, 0x03, 0x00, 0x00, 0x00, 0x0E, (byte) 0xC4, 0x0E}; +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6825110040010868010143C35816"); +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("5803004900021914"); +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6830043080000068110432326536C816"); // 三相表 +//// System.out.println("发送的数据:" + b); +//// System.out.println("发出字节数:" + b.length); +//// outputStream.write(b); +//// outputStream.flush(); +// for (int j = 0; j < 10; j++) { +// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("5803004900021914"); // 冷量计 +//// byte b[] = ExchangeStringUtil.hexStrToBinaryStr("6830043080000068110432326536C816"); // 三相表 +// System.out.println("发送的数据:" + ExchangeStringUtil.byteArrayToHexString(b)); +// outputStream.write(b); +// Thread.sleep(100); +// outputStream.flush(); +// } +// } catch (IOException | InterruptedException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } finally { +// try { +// if (outputStream != null) { +// outputStream.close(); +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } else { +// return; +// } +// } +// +//} diff --git a/user-service/src/main/java/com/mh/user/mapper/AlarmInfoMapper.java b/user-service/src/main/java/com/mh/user/mapper/AlarmInfoMapper.java new file mode 100644 index 0000000..5535032 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/AlarmInfoMapper.java @@ -0,0 +1,117 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.AlarmInfoEntity; +import com.mh.user.entity.AlarmValueSetEntity; +import com.mh.user.mapper.provider.AlarmInfoProvider; +import org.apache.ibatis.annotations.*; +import org.springframework.security.core.parameters.P; + +import java.util.List; + +@Mapper +public interface AlarmInfoMapper { + + /** + * 报警管理 + * 保存报警信息 + * @param alarmInfoEntity + */ + @Insert("insert into alarm_info(building_id,building_name,alarm_time,alarm_device,alarm_type,operate) values (" + + "#{buildingId},#{buildingName},#{alarmTime},#{alarmDevice},#{alarmType},#{operate})") + void saveAlarmInfo(AlarmInfoEntity alarmInfoEntity); + + /** + * 报警管理 + * 根据日期修改报警信息 + * @param alarmInfoEntity + */ + @Update("") + void updateAlarmInfo(AlarmInfoEntity alarmInfoEntity); + + /** + * 报警管理 + * 根据日期、设备、楼栋查询报警信息 + * @param alarmTime + * @param deviceType + * @param buildingId + * @param page + * @param limit + * @return + */ + @SelectProvider(type = AlarmInfoProvider.class,method = "queryAlarmInfo") + @Results({ + @Result(column = "building_id",property = "buildingId" ), + @Result(column = "building_name", property = "buildingName"), + @Result(column = "alarm_time", property = "alarmTime"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "alarm_type", property = "alarmType"), + @Result(column = "deal_state", property = "dealState"), + @Result(column = "id", property = "id"), + @Result(column = "device_addr", property = "deviceAddr") + }) + List queryAlarmInfo(@Param("alarmTime") String alarmTime, + @Param("deviceType") String deviceType, + @Param("buildingId") String buildingId, + @Param("dealState") String dealState, + @Param("page") int page, + @Param("limit") int limit); + + /** + * 报警管理 + * 根据日期、设备类型查询记录数 + * @return + */ + @SelectProvider(type = AlarmInfoProvider.class,method = "getAlarmInfoCount") + int getAlarmInfoCount(@Param("alarmTime") String alarmTime, + @Param("deviceType") String deviceType, + @Param("buildingId") String buildingId, + @Param("dealState") String dealState, + @Param("page") int page, + @Param("limit") int limit); + + /** + * 报警管理 + * 根据报警编号删除报警信息 + * @param id + */ + @Delete("delete from Alarm_Info where id=#{id}") + void deleteAlarmInfo(@Param("id") String id); + /////////////////////////////////////// + //警报设置 + @Insert("insert into alarm_value_set(water_level,water_temp,elect_water,building_id) values (" + + "#{waterLevel},#{waterTemp},#{electWater},#{buildingId})") + void saveAlarmValueSet(AlarmValueSetEntity alarmValueSetEntity); + + //修改 + @Update("") + void updateAlarmValueSet(AlarmValueSetEntity alarmValueSetEntity); + + //查询报警值设置记录数 + @Select("select count(*) from alarm_value_set where building_id=#{buildingId}") + int getAlarmValueSetCount(@Param("buildingId") String buildingId); + + //删除记录 + @Delete("delete from alarm_value_set") + void delAlarmValueSet(); + + ////////////////////////////////////////// + //修改状态 + @Update("update alarm_info set deal_state=#{dealState} where id=#{id}") + void updateDealState(@Param("id") String id,@Param("dealState") String dealState); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/AreaMapper.java b/user-service/src/main/java/com/mh/user/mapper/AreaMapper.java new file mode 100644 index 0000000..bde517c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/AreaMapper.java @@ -0,0 +1,18 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.AreaEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface AreaMapper { + + @Results({ @Result(property = "areaId", column = "area_id"), + @Result(property = "areaName", column = "area_name")}) + @Select("select * from area ") + List findAll(); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/BuildingMapper.java b/user-service/src/main/java/com/mh/user/mapper/BuildingMapper.java new file mode 100644 index 0000000..61848ed --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/BuildingMapper.java @@ -0,0 +1,93 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.BuildingEntity; +import com.mh.user.mapper.provider.BuildingProvider; +import com.mh.user.model.BuildingModel; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface BuildingMapper { + + /** + * 楼栋管理模块 + * 保存楼栋信息 + * @param buildingEntity + */ + @Insert("insert into building(building_id,building_name,levels_count,begin_level,house_count,bed_count,check_in_count,area_id,remarks) values (" + + " #{buildingId},#{buildingName},#{levelsCount},#{beginLevel},#{houseCount},#{bedCount},#{checkInCount},#{areaId},#{remarks})") + int saveBuilding(BuildingEntity buildingEntity); + + /** + * 楼栋管理模块 + * 保存楼栋信息 + * @param buildingEntity + */ + @Update("") + int updateBuilding(BuildingEntity buildingEntity); + + /** + * 楼栋管理模块: + * 查询楼栋资料 + * @param page + * @param limit + * @return + */ + @Results(value = { + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="levelsCount",column="levels_count"), + @Result(property="beginLevel",column="begin_level"), + @Result(property ="houseCount",column ="house_count"), + @Result(property ="bedCount",column ="bed_count"), + @Result(property="checkInCount",column="check_in_count"), + @Result(property="areaId",column="area_id"), + @Result(property="remarks",column="remarks") + }) + + @SelectProvider(type = BuildingProvider.class,method = "queryBuilding") + List queryBuilding(@Param("buildingId") String buildingId,@Param("page") int page, @Param("limit") int limit); + + /** + * 楼栋管理模块: + * 获取楼栋信息查询的总条数 + * @return + */ + @SelectProvider(type = BuildingProvider.class,method = "getCount") + int getCount(@Param("buildingId") String buildingId,@Param("page") int page, @Param("limit") int limit); + + //查询所有楼栋编号和名称 + @Results(value = { + @Result(property="buildingId",column="id"), + @Result(property="buildingName",column="building_name") + }) + @Select("select * from building ") + List selectBuildingName(); + + //查询楼栋编号 +// @Results(value = { +// @Result(property="buildingId",column="building_id") +// }) + @Select("select id from building where building_name=#{buildingName}") + String selectBuildingId(@Param("buildingName") String buildingName); + /** + * 楼栋管理模块: + * 根据名称删除楼栋信息 + * @param id + */ + @Delete("delete from building where id=#{id}") + int deleteBuilding(String id); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/ControlSetMapper.java b/user-service/src/main/java/com/mh/user/mapper/ControlSetMapper.java new file mode 100644 index 0000000..de595d5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/ControlSetMapper.java @@ -0,0 +1,46 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.ControlSetEntity; +import org.apache.ibatis.annotations.*; + +@Mapper +public interface ControlSetMapper { + + //插入记录 + @Insert("insert into control_set(building_id,level_set,use_start_time1,use_close_time1,use_start_time2,use_close_time2,back_water_temp,up_water_temp) values (" + + "#{buildingId},#{levelSet},#{useStartTime1},#{useCloseTime1},#{useStartTime2},#{useCloseTime2},#{backWaterTemp},#{upWaterTemp})") + void saveControlSet(ControlSetEntity controlSetEntity); + + //修改记录 + @Update("") + void updateControlSet(ControlSetEntity controlSetEntity); + + //查询记录数 + @Select("select count(*) from control_set where building_id=#{buildingId}") + int selectCount(@Param("buildingId") String buildingId); + + //查询记录 + @Results({ + @Result(column = "building_id",property = "buildingId" ), + @Result(column = "level_set", property = "levelSet"), + @Result(column = "use_start_time1", property = "useStartTime1"), + @Result(column = "use_close_time1", property = "useCloseTime1"), + @Result(column = "use_start_time2", property = "useStartTime2"), + @Result(column = "use_close_time2", property = "useCloseTime2"), + @Result(column = "back_water_temp", property = "backWaterTemp"), + @Result(column = "up_water_temp", property = "upWaterTemp"), + }) + @Select("select * from control_Set where building_id=#{buildingId}") + ControlSetEntity queryControlSet(@Param("buildingId") String buildingId); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/DataResultMapper.java b/user-service/src/main/java/com/mh/user/mapper/DataResultMapper.java new file mode 100644 index 0000000..6e439a0 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/DataResultMapper.java @@ -0,0 +1,264 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.DataResultClEntity; +import com.mh.user.entity.DataResultEntity; +import com.mh.user.entity.DataResultChEntity; +import com.mh.user.mapper.provider.DataResultProvider; +import com.mh.user.model.ChillerModel; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface DataResultMapper { + + //保存水电表等数据 + @Insert("insert into data_result(device_addr,deviceType,project_id,lastValue,lastDate,cur_value,cur_date,ratio,calc_value,grade) values (" + + " #{deviceAddr},#{deviceType},#{projectID},#{lastValue},#{lastDate},#{curValue},#{curDate},#{ratio},#{calcValue},#{grade})") + void saveDataResult(DataResultEntity dataResultEntity); + + @Update("") + void updateDataResult(DataResultEntity dataResultEntity); + + @Results(id="rs", value = { + @Result(property="deviceAddr",column="device_addr"), + @Result(property="deviceType",column="deviceType"), + @Result(property="projectID",column="project_id"), + @Result(property="lastValue",column="lastValue"), + @Result(property ="lastDate",column ="lastDate"), + @Result(property ="curValue",column ="cur_value"), + @Result(property="curDate",column="cur_date"), + @Result(property="ratio",column="ratio"), + @Result(property="calcValue",column="calc_Value"), + @Result(property="grade",column="grade") + }) + @SelectProvider(type = DataResultProvider.class,method = "queryDataResult") + List queryDataResult(@Param("projectID") String projectID, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("deviceType") String deviceType, + @Param("page") int page, + @Param("limit") int limit); + + + @SelectProvider(type = DataResultProvider.class,method = "getDataResultCount") + int getDataResultCount(@Param("projectID") String projectID, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("deviceType") String deviceType, + @Param("page") int page, + @Param("limit") int limit); + + + //查询单条记录 + @ResultMap("rs") + @Select("select * from data_result where cur_date=#{curDate} and device_addr=#{deviceAddr} and deviceType=#{deviceType} ") + DataResultEntity selectDataResult(@Param("curDate") String curDate, + @Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType); + + //查询是否存在记录 + @Select("select count(*) from data_result where cur_date=#{curDate} and device_addr=#{deviceAddr} and deviceType=#{deviceType} ") + int selectDataResultCount(@Param("curDate") String curDate, + @Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType); + + //---------------------------------------------------------------------------------------------- + //保存冷量计数据 + @Insert("insert into data_result_cl(device_addr,deviceType,project_id,lastValue,lastDate,cur_value,cur_date,ratio,calc_value,grade,registerAddr,registerName) values (" + + " #{deviceAddr},#{deviceType},#{projectID},#{lastValue},#{lastDate},#{curValue},#{curDate},#{ratio},#{calcValue},#{grade},#{registerAddr},#{registerName})") + void saveDataResultCl(DataResultClEntity dataResultClEntity); + + @Update("") + void updateDataResultCl(DataResultClEntity dataResultClEntity); + + @Insert("insert into data_result_cl_bak(device_addr,deviceType,project_id,lastValue,lastDate,cur_value,cur_date,ratio,calc_value,grade,registerAddr,registerName) values (" + + " #{deviceAddr},#{deviceType},#{projectID},#{lastValue},#{lastDate},#{curValue},#{curDate},#{ratio},#{calcValue},#{grade},#{registerAddr},#{registerName})") + void saveDataResultCl_bak(DataResultClEntity dataResultClEntity); + + //---------------------------------------------------------------------------------------------- + //保存冷量计数据 + @Insert("insert into data_result_ch(deviceAddr,deviceType,funCode,registerAddr,registerName,curValue,curDate,projectID,grade) values (" + + " #{deviceAddr},#{deviceType},#{funCode},#{registerAddr},#{registerName},#{curValue},#{curDate},#{projectID},#{grade})") + void saveDataResultCh(DataResultChEntity dataResultChEntity); + + @Update("") + void updateDataResultCh(DataResultChEntity dataResultChEntity); + + @Select("select count(*) from data_result_ch where curDate=#{curDate} and deviceAddr=#{deviceAddr} and registerAddr=#{registerAddr} and projectID=#{projectID}") + int selectDataResultChCount(@Param("curDate") String curDate, + @Param("deviceAddr") String deviceAddr, + @Param("registerAddr") String registerAddr, + @Param("projectID") String projectID); + + //---------------------------------------------------------------------------------------------------- + @Results(id="rsc", value = { + @Result(property="deviceAddr",column="deviceAddr"), + @Result(property="deviceType",column="deviceType"), + @Result(property="curDate",column="curDate"), + @Result(property ="curValue",column ="curValue"), + @Result(property="funCode",column="funCode"), + @Result(property="registerAddr",column="registerAddr"), + @Result(property="registerName",column="registerName"), + @Result(property="grade",column="grade"), + @Result(property="projectID",column="projectID"), + @Result(property="projectName",column="project_name") + }) + @SelectProvider(type = DataResultProvider.class,method = "queryDataResultOneMi") + List queryDataResultOneMi(@Param("projectID") String projectID, + @Param("startDate") String startDate, + @Param("curDate") String curDate, + @Param("page") int page, + @Param("limit") int limit); + + //查询记录数 +// @Select("select count(*) from data_result_one_mi where projectID=#{projectID} and curDate>=#{startDate} and curDate<=#{curDate} ") + @SelectProvider(type = DataResultProvider.class,method = "dataResultOneMiCount") + int dataResultOneMiCount(@Param("projectID") String projectID,@Param("startDate") String startDate,@Param("curDate") String curDate); + + @ResultMap("rsc") + @SelectProvider(type = DataResultProvider.class,method = "queryDataResultFiveMi") + List queryDataResultFiveMi(@Param("projectID") String projectID, + @Param("startDate") String startDate, + @Param("curDate") String curDate, + @Param("page") int page, + @Param("limit") int limit); + + +// @Select("select count(*) from data_result_five_mi where projectID=#{projectID} and curDate>=#{startDate} and curDate<=#{curDate} ") + @SelectProvider(type = DataResultProvider.class,method = "dataResultFiveMiCount") + int dataResultFiveMiCount(@Param("projectID") String projectID,@Param("startDate") String startDate,@Param("curDate") String curDate); + + + + @ResultMap("rsc") + @SelectProvider(type = DataResultProvider.class,method = "queryDataResultFifteenMi") + List queryDataResultFifteenMi(@Param("projectID") String projectID, + @Param("startDate") String startDate, + @Param("curDate") String curDate, + @Param("page") int page, + @Param("limit") int limit); + + //@Select("select count(*) from data_result_fifteen_mi where projectID=#{projectID} and curDate>=#{startDate} and curDate<=#{curDate} ") + @SelectProvider(type = DataResultProvider.class,method = "dataResultFifteenMiCount") + int dataResultFifteenMiCount(@Param("projectID") String projectID,@Param("startDate") String startDate,@Param("curDate") String curDate); + + @ResultMap("rsc") + @Select("select t1.projectID,sum(cast (t1.curValue AS decimal(18,2)))as curValue,t1.curDate,t2.project_name from data_result_ch t1 join project_info t2 on t1.projectID=t2.id " + + "where t1.projectID=#{projectID} and t1.curDate>=#{startDate} and t1.curDate<=#{curDate} group by t1.curDate,t1.projectID,t2.project_name order by t1.curDate ") + List queryDataResultCh(@Param("projectID") String projectID,@Param("startDate") String startDate,@Param("curDate") String curDate); + + //保存冷水机数据 + @Insert("insert into data_result_chiller(deviceAddr,deviceType,funCode,registerAddr,registerName,curValue,curDate,projectID,grade) values (" + + " #{deviceAddr},#{deviceType},#{funCode},#{registerAddr},#{registerName},#{curValue},#{curDate},#{projectID},#{grade})") + void saveDataResultChiller(DataResultChEntity dataResultChEntity); + + @Update("") + void updateDataResultChiller(DataResultChEntity dataResultChEntity); + + @Select("select count(*) from data_result_chiller where curDate=#{curDate} and deviceAddr=#{deviceAddr} and registerAddr=#{registerAddr} and projectID=#{projectID}") + int selectDataResultChillerCount(@Param("curDate") String curDate, + @Param("deviceAddr") String deviceAddr, + @Param("registerAddr") String registerAddr, + @Param("projectID") String projectID); + + + @Insert("insert into data_result_now(deviceAddr,deviceType,funCode,registerAddr,registerName,curValue,curDate,projectID,grade) values (" + + " #{deviceAddr},#{deviceType},#{funCode},#{registerAddr},#{registerName},#{curValue},#{curDate},#{projectID},#{grade})") + void saveDataResultNow(DataResultChEntity dataResultChEntity); + + @Delete("delete from data_result_now where deviceAddr=#{deviceAddr} and deviceType = #{deviceType} and registerAddr=#{registerAddr} and projectID=#{projectID}") + void deleteDataResultNow(@Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType, + @Param("registerAddr") String registerAddr, + @Param("projectID") String projectID); + + //实时参数读取 + @Select("select * from data_result_now where deviceAddr=#{deviceAddr} and deviceType=#{deviceType} and projectID=#{projectID} ") + List selectDataResultNow(@Param("deviceAddr") String deviceAddr, + @Param("deviceType") String deviceType, + @Param("projectID") String projectID); + + @Results({ + @Result(property="deviceAddr",column="deviceAddr"), + @Result(property="deviceType",column="deviceType"), + @Result(property="curDate",column="curDate"), + @Result(property ="curValue",column ="curValue"), + @Result(property="funCode",column="funCode"), + @Result(property="registerAddr",column="registerAddr"), + @Result(property="registerName",column="registerName"), + @Result(property="grade",column="grade"), + @Result(property="projectID",column="projectID"), + @Result(property="projectName",column="project_name") + }) + @SelectProvider(type = DataResultProvider.class,method = "queryDataResultChiller") + List queryDataResultChiller(@Param("projectID") String projectID, + @Param("deviceAddr") String deviceAddr, + @Param("registerName") String registerName, + @Param("startDate") String startDate, + @Param("curDate") String curDate, + @Param("page") int page, + @Param("limit") int limit); + + @SelectProvider(type = DataResultProvider.class,method = "dataResultChillerCount") + int dataResultChillerCount(@Param("projectID") String projectID, + @Param("deviceAddr") String deviceAddr, + @Param("registerName") String registerName, + @Param("startDate") String startDate, + @Param("curDate") String curDate); + + + //保存冷水机参数数据 + @Insert("insert into data_chiller(deviceAddr,deviceName,runState,setPoint,enterChw,leaveChw,enterCow,leaveCow,power,ratedPower,chillerAmps,refrigeration,ratedRef,chwFlow,ApproachCow,ApproachChw,cop,ratedCop,copyDate) values (" + + " #{deviceAddr},#{deviceName},#{projectID},#{lastValue},#{lastDate},#{curValue},#{curDate},#{ratio},#{calcValue},#{grade})") + void saveDataChiller(ChillerModel chillerModel); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java b/user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java new file mode 100644 index 0000000..1aa7987 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java @@ -0,0 +1,92 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.entity.OrderMessageEntity; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface DeviceCodeParamMapper { + + //插入指令参数 + @Insert("insert into device_code_param(device_addr,device_name,device_type,data_com,baudrate,brand,fun_code,register_addr,create_time)" + + "values(#{deviceAddr},#{deviceName},#{deviceType},#{dataCom},#{baudrate},#{brand},#{funCode},#{registerAddr},getDate())") + void insertDeviceCodeParam(DeviceCodeParamEntity deviceCodeParamEntity); + + //查询指令参数,传入IP和端口 + @Results(id="rs", value = { + @Result(property="id",column="id"), + @Result(property="deviceAddr",column="device_addr"), + @Result(property="deviceType",column="deviceType"), + @Result(property="dataCom",column="data_com"), + @Result(property="dataPort",column="dataPort"), + @Result(property="baudRate",column="baudrate"), + @Result(property ="brand",column ="brand"), + @Result(property ="funCode",column ="fun_code"), + @Result(property ="registerAddr",column ="register_addr"), + @Result(property ="deviceName",column ="device_name"), + @Result(property ="createTime",column ="create_time"), + @Result(property ="grade",column ="grade"), + @Result(property ="projectID",column ="project_id") + }) + @Select("select * from device_code_param where dataPort=#{gatewayPort} order by deviceType ") + List queryCodeParam(@Param("gatewayPort") String gatewayPort); + + //查询指令参数,传入串口 + @ResultMap("rs") + @Select("select t1.* from device_code_param t1 join gateway_manage t2 on t1.data_com=t2.data_com where t2.data_com=#{comName}") + List queryCodeParam2(@Param("comName") String comName); + + //查询所有指令参数 + @ResultMap("rs") + @Select("select * from device_code_param order by data_com,deviceType") + List queryCodeParam3(); + + //查询所有指令参数 + @ResultMap("rs") + @Select("select * from device_code_param where project_id=#{projectID} and deviceType=#{deviceType} and device_addr=#{deviceAddr} and register_addr=#{registerAddr}") + DeviceCodeParamEntity queryDeviceCodeParam(@Param("projectID") String projectID, + @Param("deviceType") String deviceType, + @Param("deviceAddr") String deviceAddr, + @Param("registerAddr") String registerAddr); + + //查询记录数 + @Select("select count(*) from device_code_param where project_id=#{projectId} ") + int queryCount(@Param("projectId") String projectID); + + //查询记录数,所有项目 + @Select("select count(*) from device_code_param ") + int queryCount2(); + + // 批量插入生成指令参数入数据库 + @Insert("") + void insertDeviceCodeParamList(@Param("deviceCodeParamEntityList") List deviceCodeParamEntityList); + + //查询插入 + @Insert("insert into device_code_param(device_addr,deviceName,deviceType,dataPort,baudRate,parity,brand,createTime,project_id,digit,grade) select device_addr,deviceName,deviceType,dataPort,baudRate,parity,brand,getDate(),project_id,2,grade from device_code " + + " where (deviceType='电表' or deviceType='水表') and project_id=#{ProjectID} ") + void selectInsertDeviceCodeParam(@Param("ProjectID") String ProjectID); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/DeviceInfoMapper.java b/user-service/src/main/java/com/mh/user/mapper/DeviceInfoMapper.java new file mode 100644 index 0000000..f9f5045 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/DeviceInfoMapper.java @@ -0,0 +1,91 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.DeviceInfoEntity; +import com.mh.user.mapper.provider.DeviceInfoProvider; +import com.mh.user.model.ChillerModel; +import com.mh.user.model.DeviceModel; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface DeviceInfoMapper { + + //查询仪表信息 + @SelectProvider(type = DeviceInfoProvider.class,method = "queryDeviceInfo") + @Results(value = { + @Result(property="id",column="id"), + @Result(property="deviceName",column="deviceName"), + @Result(property="deviceType",column="deviceType"), + @Result(property="brand",column="brand"), + @Result(property ="power",column ="power"), + @Result(property ="madeTime",column ="madeTime"), + @Result(property="flow",column="flow"), + @Result(property="isFC",column="isFC"), + @Result(property="motorBrand",column="motorBrand"), + @Result(property="projectID",column="project_id"), + @Result(property="systemID",column="system_id") + }) + List queryDeviceInfo(@Param("systemID") String systemID, + @Param("projectID") String projectID, + @Param("deviceType") String deviceType); + + //查询冷水机设备列表 + @Results({ + @Result(column = "device_addr",property = "deviceAddr" ), + @Result(column = "device_name", property = "deviceName") + }) + @Select("select * from device_code where project_id=#{projectID} and device_type='冷水机'") + List selectDevices(@Param("projectID") String projectID); + + + //查询多个冷水机相关信息 + @Results({ + @Result(column = "device_addr",property = "deviceAddr" ), + @Result(column = "device_name", property = "deviceName"), + @Result(column = "runState", property = "runState"), + @Result(column = "setPoint", property = "setPoint"), + @Result(column = "enterChw", property = "enterChw"), + @Result(column = "leaveChw", property = "leaveChw"), + @Result(column = "enterCow", property = "enterCow"), + @Result(column = "leaveCow", property = "leaveCow"), + @Result(column = "power", property = "power"), + @Result(column = "ratedPower", property = "ratedPower"), + @Result(column = "chillerAmps", property = "chillerAmps"), + @Result(column = "refrigeration", property = "refrigeration"), + @Result(column = "ratedRef", property = "ratedRef"), + @Result(column = "chwFlow", property = "chwFlow"), + @Result(column = "ApproachCow", property = "ApproachCow"), + @Result(column = "ApproachChw", property = "ApproachChw"), + @Result(column = "cop", property = "cop"), + @Result(column = "ratedCop", property = "ratedCop"), + @Result(column = "copyDate", property = "copyDate") + }) + @Select("select * from device_code where project_id=#{projectID} and device_addr=#{deviceAddr} ") + List queryChiller(@Param("projectID") String projectID, @Param("device_addr") String deviceAddr); + + //查询单个冷水机相关信息 + @Results({ + @Result(column = "device_addr",property = "deviceAddr" ), + @Result(column = "device_name", property = "deviceName"), + @Result(column = "runState", property = "runState"), + @Result(column = "setPoint", property = "setPoint"), + @Result(column = "enterChw", property = "enterChw"), + @Result(column = "leaveChw", property = "leaveChw"), + @Result(column = "enterCow", property = "enterCow"), + @Result(column = "leaveCow", property = "leaveCow"), + @Result(column = "power", property = "power"), + @Result(column = "ratedPower", property = "ratedPower"), + @Result(column = "chillerAmps", property = "chillerAmps"), + @Result(column = "refrigeration", property = "refrigeration"), + @Result(column = "ratedRef", property = "ratedRef"), + @Result(column = "chwFlow", property = "chwFlow"), + @Result(column = "ApproachCow", property = "ApproachCow"), + @Result(column = "ApproachChw", property = "ApproachChw"), + @Result(column = "cop", property = "cop"), + @Result(column = "ratedCop", property = "ratedCop"), + @Result(column = "copyDate", property = "copyDate") + }) + @Select("select * from chiller_data where project_id=#{projectID} and device_addr=#{deviceAddr} ") + ChillerModel selectChiller(@Param("projectID") String projectID,@Param("device_addr") String deviceAddr); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java b/user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java new file mode 100644 index 0000000..e135829 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java @@ -0,0 +1,216 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.BuildingEntity; +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.entity.DeviceInstallTempEntity; +import com.mh.user.mapper.provider.DeviceInstallProvider; +import com.mh.user.model.DeviceModel; +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.mapping.StatementType; + +import java.util.Date; +import java.util.List; + +public interface DeviceInstallMapper { + + /** + * 设备安装模块 + * 保存设备信息 + * @param deviceInstallEntity + */ + @Insert("insert into device_code(device_addr,deviceName,deviceType,dataPort,ratio,baudRate,brand,project_id,installPosition,installDate) values (" + + " #{deviceAddr},#{deviceName},#{deviceType},#{dataCom},#{ratio},#{baudRate},#{brand},#{projectID},#{installPosition},getDate())") + int saveDevice(DeviceInstallEntity deviceInstallEntity); + + /** + * 设备安装模块 + * 保存设备信息 + * @param deviceInstallEntity + */ + @Update("") + int updateDevice(DeviceInstallEntity deviceInstallEntity); + + //按id更新水电表读数和采集日期 + @Update("update device_code set lastValue=#{lastValue},lastDate=#{lastDate} where id=#{id}") + void updateLastValue(@Param("id") Long id,@Param("lastValue") double lastValue,@Param("lastDate") Date lastDate); + /** + * 设备管理模块: + * 查询设备资料 + * @param page + * @param limit + * @return + */ + @Results(id="rs", value = { + @Result(property="deviceAddr",column="device_addr"), + @Result(property="deviceName",column="deviceName"), + @Result(property="deviceType",column="deviceType"), + @Result(property="dataPort",column="dataPort"), + @Result(property="standard",column="standard"), + @Result(property ="ratio",column ="ratio"), + @Result(property ="lastValue",column ="lastValue"), + @Result(property ="lastDate",column ="lastDate"), + @Result(property="isForbid",column="isForbid"), + @Result(property="baudRate",column="baudrate"), + @Result(property="parity",column="parity"), + @Result(property="brand",column="brand"), + @Result(property="installPosition",column="installPosition"), + @Result(property="installDate",column="installDate"), + @Result(property="remarks",column="remarks"), + @Result(property ="projectID",column ="project_id"), + }) + @Select("select * from (\n" + + "select *,ROW_NUMBER() over(order by id) as rn from device_code \n" + + ") t where rn between (#{page}-1)*#{limit} and #{page}*#{limit}") + List getAllDevice(@Param("page") int page, @Param("limit") int limit); + + //查询有多个采集参数的设备 + @ResultMap("rs") + @Select("select * from device_code where Project_id=#{ProjectID} ") + List selectDeviceParams(@Param("ProjectID") String ProjectID); + + //查询有多个采集参数的设备 + @ResultMap("rs") + @Select("select * from device_code ") + List selectDeviceParams2(); + + //根据类型查询设备通讯号 + @Select("select top 1 device_addr from device_code where deviceType=#{deviceType} and project_id=#{projectID} ") + String selectDeviceAddr(@Param("deviceType") String deviceType,@Param("projectID") String projectID); + + /** + * 设备管理模块: + * 根据条件获取设备查询的总条数 + * @return + */ + @Select("select count(*) from device_code where is_use=1 ") + int getAllCount(); + + + @SelectProvider(type = DeviceInstallProvider.class,method = "queryDevice") + @ResultMap("rs") + List queryDevice(@Param("project_id") String projectID, + @Param("deviceType") String deviceType, + @Param("startDate") String startDate, + @Param("endDate")String endDate, + @Param("isUse")String isUse, + @Param("isFault")String isFault, + @Param("page") int page, + @Param("limit") int limit); + + /** + * 设备管理模块: + * 根据条件获取设备查询的总条数 + * @return + */ + @SelectProvider(type = DeviceInstallProvider.class,method = "getCount") + int getCount(@Param("project_id") String projectID, + @Param("deviceType") String deviceType, + @Param("startDate") String startDate, + @Param("endDate")String endDate, + @Param("isUse")String isUse, + @Param("isFault")String isFault, + @Param("page") int page, + @Param("limit") int limit); + + //查询设备在线情况 + @SelectProvider(type = DeviceInstallProvider.class,method = "getIsOnlineCount") + int getIsOnlineCount(@Param("isOnline") String isOnline,@Param("deviceType") String deviceType); + + //根据通讯地址和设备类型查询对应的设备信息 + @ResultMap("rs") + @Select("select * from device_code where device_addr=#{deviceAddr} and deviceType=#{deviceType} and project_id=#{projectID}") + DeviceInstallEntity selectDevice(@Param("deviceAddr") String deviceAddr,@Param("deviceType") String deviceType,@Param("projectID") String projectID); + + /** + * 设备管理模块: + * 根据通讯地址删除设备信息 + * @param id + */ + @Delete("delete from device_code where id=#{id}") + int deleteDevice(String id); + + //EXCEL导入相关处理函数 + // 清临时表 + @Delete("DELETE FROM device_install_temp") + void deleteDevice_install_temp(); + + // 保存到临时表 + @Insert("insert into device_install_temp(device_addr,device_name,device_type,baudrate,data_com,ratio,building_id,row_id)" + + " values(#{deviceAddr},#{deviceName},#{deviceType},#{baudRate},#{dataCom},#{ratio},#{buildingId},#{rowId})") + void insertDevice_install_temp(@Param("deviceAddr") String deviceAddr, + @Param("deviceName") String deviceName, + @Param("deviceType") String deviceType, + @Param("baudRate") int baudRate, + @Param("dataCom") String dataCom, + @Param("ratio") double ratio, + @Param("buildingId") String buildingId, + @Param("rowId") String rowId + ); + + // EXCEL导入查询EXCEL内容 + @Select("SELECT device_addr,device_name,device_type,baudRate,data_com,ratio, " + + " building_id,row_id, " + + " (CASE " + + " when remarks is not null then remarks + ',行号为' + convert(varchar(100),Row_id) " + + " else '' " + + " end " + + " ) as remarks " + + " FROM device_install_temp " + + " ORDER BY ISNULL(remarks,'') DESC ,row_id ") + @Options(statementType = StatementType.CALLABLE) + @Results({ + @Result(column = "device_addr",property = "deviceAddr" ), + @Result(column = "device_name", property = "deviceName"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "baudRate", property = "baudRate"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "ratio", property = "ratio"), + @Result(column = "building_id", property = "buildingId"), + @Result(column = "install_date", property = "installDate"), + @Result(column = "remarks", property = "remarks"), + @Result(column = "row_id", property = "rowId") + }) + List queryExcelDevices(); + + //查询Excel导入的数据的记录数 + @Select("SELECT COUNT(*) FROM device_install_temp ") + int queryExcelDevicesCount(); + + /** + * @author nxr + * @title :判断导入资料数据的合法 + * @description :在导入中的数据有重复 + * @updateTime 2022-06-19 + * @throws : + */ + @Update("update device_install_temp " + + " set Remarks = '数据中表号有重复' " + + " where Remarks is null " + + " and device_addr in ( select ISNULL(device_install_temp.device_addr,'') " + + " from device_install_temp " + + " group by device_addr " + + " having count(*) > 1)") + void updateDevice_install_temp__multiple(); + + //从临时表查询插入 + @Insert("insert into device_install(device_addr,device_name,device_type,data_com,baudRate,ratio,building_id) select device_addr,device_name,device_type,data_com,baudRate,ratio,building_id from device_install_temp") + void insertFromDevice_install_temp(); + + //修改启动状态 + @Update("update device_install set is_use=#{isUse} where device_addr=#{deviceAddr}") + void updateDeviceIsUse(@Param("isUse") String isUse, @Param("deviceAddr") String deviceAddr); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/EnergyDataMapper.java b/user-service/src/main/java/com/mh/user/mapper/EnergyDataMapper.java new file mode 100644 index 0000000..e612192 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/EnergyDataMapper.java @@ -0,0 +1,81 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.EnergyDataEntity; +import com.mh.user.mapper.provider.EnergyDataProvider; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface EnergyDataMapper { + + //按10分钟 + @SelectProvider(type = EnergyDataProvider.class,method = "queryEnergyDataMi") + @Results(id="rs",value = { + @Result(property="curDate",column="cur_date"), + @Result(property="projectID",column="project_id"), + @Result(property="projectName",column="project_name"), + @Result(property="ambTemp",column="amb_Temp"), + @Result(property ="humidity",column ="humidity"), + @Result(property ="water",column ="water"), + @Result(property="elect",column="elect"), + @Result(property="cl",column="cl"), + @Result(property="cop",column="cop") + }) + List queryEnergyDataMi(@Param("projectID") String projectID, + @Param("curDate") String curDate, + @Param("page") int page, @Param("limit") int limit); + + + @SelectProvider(type = EnergyDataProvider.class,method = "getEnergyDataMiCount") + int getEnergyDataMiCount(@Param("projectID") String projectID, @Param("curDate") String curDate); + + //按小时 + @SelectProvider(type = EnergyDataProvider.class,method = "queryEnergyDataHour") + @ResultMap("rs") + List queryEnergyDataHour(@Param("projectID") String projectID, + @Param("curDate") String curDate, + @Param("page") int page, @Param("limit") int limit); + + @SelectProvider(type = EnergyDataProvider.class,method = "getEnergyDataHourCount") + int getEnergyDataHourCount(@Param("projectID") String projectID, @Param("curDate") String curDate); + + //按天 + @SelectProvider(type = EnergyDataProvider.class,method = "queryEnergyDataDay") + @ResultMap("rs") + List queryEnergyDataDay(@Param("projectID") String projectID, + @Param("curDate") String curDate, + @Param("queryType") int queryType, + @Param("page") int page, + @Param("limit") int limit); + + @SelectProvider(type = EnergyDataProvider.class,method = "getEnergyDataDayCount") + int getEnergyDataDayCount(@Param("projectID") String projectID, @Param("curDate") String curDate, @Param("queryType") int queryType); + + //按月 + @SelectProvider(type = EnergyDataProvider.class,method = "queryEnergyDataMonth") + @ResultMap("rs") + List queryEnergyDataMonth(@Param("projectID") String projectID, + @Param("curDate") String curDate, + @Param("queryType") int queryTyp, + @Param("page") int page, @Param("limit") int limit); + + @SelectProvider(type = EnergyDataProvider.class,method = "getEnergyDataMonthCount") + int getEnergyDataMonthCount(@Param("projectID") String projectID, @Param("curDate") String curDate, @Param("queryType") int queryType); + + //按年 + @SelectProvider(type = EnergyDataProvider.class,method = "queryEnergyDataYear") + @ResultMap("rs") + List queryEnergyDataYear(@Param("projectID") String projectID, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("queryType") int queryType, + @Param("page") int page, @Param("limit") int limit); + + @SelectProvider(type = EnergyDataProvider.class,method = "getEnergyDataYearCount") + int getEnergyDataYearCount(@Param("projectID") String projectID, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("queryType") int queryType); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/EnergyMapper.java b/user-service/src/main/java/com/mh/user/mapper/EnergyMapper.java new file mode 100644 index 0000000..2ca73d3 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/EnergyMapper.java @@ -0,0 +1,228 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.EnergyEntity; +import com.mh.user.mapper.provider.EnergyProvider; +import org.apache.ibatis.annotations.*; +import java.util.List; + +public interface EnergyMapper { + + /** + * 生产信息 + * 保存 + * @param energyEntity + */ + //按天 + @Insert("insert into energy_day(cur_date,building_id,building_name,hot_water_value,use_hot_water,elect_value,elect_water,check_in_count,per_elect,per_water) values (" + + " #{curDate},#{buildingId},#{buildingName},#{hotWaterValue},#{useHotWater},#{electValue},#{electWater},#{checkInCount},#{perElect},#{perWater})") + void saveEnergyDay(EnergyEntity energyEntity); + //按月 + @Insert("insert into energy_month(cur_date,building_id,building_name,hot_water_value,use_hot_water,elect_value,elect_water,check_in_count,per_elect,per_water) values (" + + " #{curTime},#{buildingId},#{buildingName},#{hotWaterValue},#{useHotWater},#{electValue},#{electWater},#{checkInCount},#{perElect},#{perWater})") + void saveEnergyMonth(EnergyEntity energyEntity); + //按年 + @Insert("insert into energy_month(cur_date,building_id,building_name,hot_water_value,use_hot_water,elect_value,elect_water,check_in_count,per_elect,per_water) values (" + + " #{curDate},#{buildingId},#{buildingName},#{hotWaterValue},#{useHotWater},#{electValue},#{electWater},#{checkInCount},#{perElect},#{perWater})") + void saveEnergyYear(EnergyEntity energyEntity); + /** + * 生产信息 + * 修改 + * @param energyEntity + */ + //按天 + @Update("") + void updateEnergyDay(EnergyEntity energyEntity); + //按月 + @Update("") + void updateEnergyMonth(EnergyEntity energyEntity); + //按年 + @Update("") + void updateEnergyYear(EnergyEntity energyEntity); + + /** + * 生产信息 + * 根据时间日期和楼栋编号删除记录 + * @param curDate + * @param buildingId + */ + //按天 + @Delete("delete from energy_day where cur_date=#{curDate} and building_id=#{buildingId} ") + void deleteEnergyDay(@Param("curDate") String curDate,@Param("buildingId") String buildingId); + //按月 + @Delete("delete from energy_month where cur_date=#{curDate} and building_id=#{buildingId} ") + void deleteEnergyMonth(@Param("curDate") String curDate,@Param("buildingId") String buildingId); + //按年 + @Delete("delete from energy_year where cur_date=#{curDate} and building_id=#{buildingId} ") + void deleteEnergyYear(@Param("curDate") String curDate,@Param("buildingId") String buildingId); + //------------------------------------------------------------------------------------------------- + /** + * 生产信息 + * 查询 + * @param projectID + * @param buildingId + * @param startDate + * @param queryType + * @param page + * @param limit + * @return + */ + //小时 + @SelectProvider(type = EnergyProvider.class,method = "queryEnergyHour") + @Results(id="rs",value = { + @Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="hotWaterValue",column="hot_water_value"), + @Result(property ="useHotWater",column ="use_hot_water"), + @Result(property ="electValue",column ="elect_value"), + @Result(property="electWater",column="elect_water"), + @Result(property="checkInCount",column="check_in_count"), + @Result(property="perElect",column="per_elect"), + @Result(property="perWater",column="per_water"), + @Result(property="projectID",column="project_id"), + @Result(property="projectName",column="project_name") + }) + List queryEnergyHour(@Param("projectID") String projectID, + @Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("queryType") int queryType, + @Param("page") int page, @Param("limit") int limit); + + //按天 + @SelectProvider(type = EnergyProvider.class,method = "queryEnergyDay") + @ResultMap("rs") + List queryEnergyDay(@Param("projectID") String projectID, + @Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("queryType") int queryType, + @Param("page") int page, @Param("limit") int limit); + //按月 + @SelectProvider(type = EnergyProvider.class,method = "queryEnergyMonth") + @ResultMap("rs") + List queryEnergyMonth(@Param("projectID") String projectID, + @Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("queryType") int queryType, + @Param("page") int page, @Param("limit") int limit); + //按年 + @SelectProvider(type = EnergyProvider.class,method = "queryEnergyYear") + @ResultMap("rs") + List queryEnergyYear(@Param("projectID") String projectID, + @Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("queryType") int queryType, + @Param("page") int page, @Param("limit") int limit); + + /** + * 生产信息 + * 查询记录数 + * @return + */ + //按天 + @SelectProvider(type = EnergyProvider.class,method = "getEnergyDayCount") + int getEnergyDayCount(@Param("projectID") String projectID, + @Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("queryType") int queryType); + //按月 + @SelectProvider(type = EnergyProvider.class,method = "getEnergyMonthCount") + int getEnergyMonthCount(@Param("projectID") String projectID, + @Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("queryType") int queryType); + //按年 + @SelectProvider(type = EnergyProvider.class,method = "getEnergyYearCount") + int getEnergyYearCount(@Param("projectID") String projectID, + @Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("queryType") int queryType); + + + //---------------------------------------------------------------------------------------------- + //按天 + @Results(value = { + @Result(property="curDate",column="cur_date"), + @Result(property ="useHotWater",column ="use_hot_water"), + @Result(property ="electValue",column ="elect_value"), + @Result(property="electWater",column="elect_water"), + @Result(property="perElect",column="per_elect"), + @Result(property="perWater",column="per_water") + }) + @Select("SELECT cur_date,sum(use_hot_water) as use_hot_water,sum(elect_value) as elect_value,sum(elect_water) as elect_water FROM energy_day where Left(cur_date,10)=#{curDate} GROUP BY(cur_date)") + List queryEnergyDayGroup(@Param("curDate") String curDate); + + //按月 + @Select("SELECT cur_date,sum(use_hot_water) as use_hot_water,sum(elect_value) as elect_value,sum(elect_water) as elect_water FROM energy_month where Left(cur_date,7)=#{curDate} GROUP BY(cur_date)") + List queryEnergyMonthGroup(@Param("curDate") String curDate); + + //按年 + @Select("SELECT cur_date,sum(use_hot_water) as use_hot_water,sum(elect_value) as elect_value,sum(elect_water) as elect_water FROM energy_year where Left(cur_date,4)=#{curDate} GROUP BY(cur_date)") + List queryEnergyYearGroup(@Param("curDate") String curDate); + + //查询每天的用量 + @SelectProvider(type = EnergyProvider.class,method = "queryDayEnergy") + @Results(value = { + @Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="hotWaterValue",column="hot_water_value"), + @Result(property ="useHotWater",column ="use_hot_water"), + @Result(property ="electValue",column ="elect_value"), + @Result(property="electWater",column="elect_water"), + @Result(property="checkInCount",column="check_in_count"), + @Result(property="perElect",column="per_elect"), + @Result(property="perWater",column="per_water") + }) + List queryDayEnergy(@Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("page") int page, + @Param("limit") int limit); + + @SelectProvider(type = EnergyProvider.class,method = "getDayEnergyCount") + int getDayEnergyCount(@Param("buildingId") String buildingId, + @Param("startDate") String startDate, + @Param("endDate") String endDate, + @Param("page") int page, + @Param("limit") int limit); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/MeterInfoMapper.java b/user-service/src/main/java/com/mh/user/mapper/MeterInfoMapper.java new file mode 100644 index 0000000..40759d9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/MeterInfoMapper.java @@ -0,0 +1,31 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.MeterInfoEntity; +import com.mh.user.mapper.provider.MeterInfoProvider; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface MeterInfoMapper { + + //查询仪表信息 + @SelectProvider(type = MeterInfoProvider.class,method = "queryMeterInfo") + @Results(value = { + @Result(property="id",column="id"), + @Result(property="meterName",column="meterName"), + @Result(property="meterType",column="meterType"), + @Result(property="brand",column="brand"), + @Result(property="currentValue",column="currentValue"), + @Result(property ="model",column ="model"), + @Result(property ="pulse",column ="pulse"), + @Result(property="caliber",column="caliber"), + @Result(property="range",column="range"), + @Result(property="structural",column="structural"), + @Result(property="projectID",column="project_id"), + @Result(property="systemID",column="system_id") + }) + List queryMeterInfo(@Param("systemID") String systemID, + @Param("projectID") String projectID); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/ProjectInfoMapper.java b/user-service/src/main/java/com/mh/user/mapper/ProjectInfoMapper.java new file mode 100644 index 0000000..c1ab968 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/ProjectInfoMapper.java @@ -0,0 +1,30 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.ProjectInfoEntity; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface ProjectInfoMapper { + + //查询项目列表 + @Results(value = { + @Result(property="id",column="id"), + @Result(property="projectName",column="project_name"), + @Result(property="pAddress",column="p_address"), + @Result(property="pScale",column="p_scale"), + @Result(property="pic",column="pic"), + @Result(property="tel",column="tel"), + @Result(property="systemID",column="system_id"), + @Result(property="remarks",column="remarks") + + }) + @Select("select * from Project_Info where system_id=#{systemID}") + List queryProjectInfo(@Param("systemID") String systemID ); + + //通过id查找对应的名称 + @Select("select project_name from project_info where id=#{id}") + String selectName(@Param("id") String id); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/RegisterAddrMapper.java b/user-service/src/main/java/com/mh/user/mapper/RegisterAddrMapper.java new file mode 100644 index 0000000..91d1af7 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/RegisterAddrMapper.java @@ -0,0 +1,23 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.RegisterAddrEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import java.util.List; + +@Mapper +public interface RegisterAddrMapper { + + @Results(value = { + @Result(property="registerAddr",column="registerAddr"), + @Result(property="regName",column="regName"), + @Result(property="funFlag",column="funFlag"), + @Result(property="floatFlag",column="floatFlag"), + @Result(property="grade",column="grade"), + @Result(property ="otherName",column ="otherName") + }) + @Select("select * from RegisterAddrs ") + List selectRegisterAddr(); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/StrategyInfoMapper.java b/user-service/src/main/java/com/mh/user/mapper/StrategyInfoMapper.java new file mode 100644 index 0000000..afd966d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/StrategyInfoMapper.java @@ -0,0 +1,24 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.StrategyInfoEntity; +import com.mh.user.mapper.provider.DeviceInfoProvider; +import com.mh.user.mapper.provider.StrategyInfoProvider; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface StrategyInfoMapper { + + //查询仪表信息 + @SelectProvider(type = StrategyInfoProvider.class,method = "queryStrategyInfo") + @Results(value = { + @Result(property="id",column="id"), + @Result(property="dataAnalysis",column="dataAnalysis"), + @Result(property="operationOpt",column="operation_opt"), + @Result(property="controlOpt",column="control_opt"), + @Result(property="projectID",column="project_id"), + @Result(property="systemID",column="system_id") + }) + List queryStrategyInfo(@Param("systemID") String systemID,@Param("projectID") String projectID); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/SysDeptMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysDeptMapper.java new file mode 100644 index 0000000..c567264 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysDeptMapper.java @@ -0,0 +1,29 @@ +package com.mh.user.mapper; + +import com.mh.user.model.SysDept; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * author: ljf + * desc: 部门Mapper + */ +public interface SysDeptMapper { + + int deleteByPrimaryKey(Long id); + + int insert(SysDept record); + + int insertSelective(SysDept record); + + SysDept selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysDept record); + + int updateByPrimaryKey(SysDept record); + + List findPage(); + + List findAll(); +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/mapper/SysLogMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysLogMapper.java new file mode 100644 index 0000000..e938834 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysLogMapper.java @@ -0,0 +1,54 @@ +package com.mh.user.mapper; + +import com.mh.user.mapper.provider.SysLogProvider; +import com.mh.user.model.SysLog; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * author: ljf + * desc: 系统日志Mapper + */ +@Mapper +public interface SysLogMapper { + int deleteByPrimaryKey(Long id); + + int insert(SysLog record); + + int insertSelective(SysLog record); + + SysLog selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysLog record); + + int updateByPrimaryKey(SysLog record); + + List findPage(); + + @SelectProvider(type = SysLogProvider.class,method = "findLogs") + @Results(value = { + @Result(property="createBy",column="create_by"), + @Result(property="createTime",column="create_time"), + @Result(property="ip",column="ip"), + @Result(property ="lastUpdateBy",column ="last_update_by"), + @Result(property="lastUpdateTime",column="last_update_time"), + @Result(property ="method",column ="method"), + @Result(property="operation",column="operation"), + @Result(property ="params",column ="params"), + @Result(property ="time",column ="time"), + @Result(property ="userName",column ="user_name"), + @Result(property ="loginTime",column ="login_time"), + @Result(property ="loginState",column ="login_state") + }) + List findLogs(@Param("userName") String userName,@Param("page") int page,@Param("limit") int limit ); + + @SelectProvider(type = SysLogProvider.class,method = "findCount") + int findCount(@Param("userName") String userName,@Param("page") int page,@Param("limit") int limit ); + + //查询日志详情 + @Select("select * from sys_log where id=#{id}") + SysLog logInfo(@Param("id") int id); + + List findPageByUserName(@Param(value = "userName") String userName); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/SysMenuMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysMenuMapper.java new file mode 100644 index 0000000..31e40d8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysMenuMapper.java @@ -0,0 +1,36 @@ +package com.mh.user.mapper; + +import com.mh.user.model.SysMenu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * author: ljf + * desc: 系统菜单Mapper + */ +public interface SysMenuMapper { + int deleteByPrimaryKey(Long id); + + int insert(SysMenu record); + + int insertSelective(SysMenu record); + + SysMenu selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysMenu record); + + int updateByPrimaryKey(SysMenu record); + + List findPage(); + + List findPageByName(@Param(value = "systemID") String systemID, + @Param(value = "name") String name); + + List findAll(@Param(value = "systemID") String systemID); + + List findByUserName(@Param(value = "systemID") String systemID, + @Param(value = "userName") String userName); + + List findRoleMenus(@Param(value = "roleId") Long roleId); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/SysRoleDeptMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..58495ad --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysRoleDeptMapper.java @@ -0,0 +1,23 @@ +package com.mh.user.mapper; + +import com.mh.user.model.SysRoleDept; +import org.apache.ibatis.annotations.Mapper; + +/** + * author: ljf + * desc: 角色对应部门Mapper + */ +public interface SysRoleDeptMapper { + + int deleteByPrimaryKey(Long id); + + int insert(SysRoleDept record); + + int insertSelective(SysRoleDept record); + + SysRoleDept selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysRoleDept record); + + int updateByPrimaryKey(SysRoleDept record); +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/mapper/SysRoleMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysRoleMapper.java new file mode 100644 index 0000000..20fb7d1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysRoleMapper.java @@ -0,0 +1,65 @@ +package com.mh.user.mapper; + +import com.mh.user.mapper.provider.SysRoleProvider; +import com.mh.user.mapper.provider.SysUserProvider; +import com.mh.user.model.SysRole; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * author: ljf + * desc: 系统角色Mapper + */ +@Mapper +public interface SysRoleMapper { + + //删除记录 + int deleteByPrimaryKey(@Param("id") Long id); + + //插入记录 + int insert(SysRole record); + + int insertSelective(SysRole record); + + SysRole selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysRole record); + + int updateByPrimaryKey(SysRole record); + + List findPage(); + + List findAll(); + + List findPageByName(@Param(value = "roleName") String name); + + List findByName(@Param(value = "roleName") String name); + + @Results(id="rs",value = { + @Result(property="id",column="id"), + @Result(property="name",column="role_name"), + @Result(property="createBy",column="create_by"), + @Result(property="createTime",column="create_time"), + @Result(property ="lastUpdateBy",column ="last_update_by"), + @Result(property ="lastUpdateTime",column ="last_update_time"), + @Result(property="delFlag",column="del_flag"), + @Result(property="remarks",column="remarks") + }) + @Select("select * from sys_role where role_name=#{roleName}") + SysRole findId(@Param(value = "roleName") String name); + + //查询所有角色 + @ResultMap("rs") + @SelectProvider(type = SysRoleProvider.class,method = "queryRoles") + List queryRoles(@Param("roleName") String roleName,@Param(value = "page") int page,@Param(value = "limit") int limit); + + //查询所有记录数 + @SelectProvider(type = SysRoleProvider.class,method = "getCount") + int getCount(@Param("roleName") String roleName,@Param(value = "page") int page,@Param(value = "limit") int limit); + + //根据用户名查询角色编号 + @Select("select t1.id,t1.user_name,t2.role_id from sys_user t1 join sys_user_role t2 on t1.id=t2.user_id where t1.user_name=#{name} ") + String findRoleID(@Param(value = "name") String name); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/SysRoleMenuMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..f515e13 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysRoleMenuMapper.java @@ -0,0 +1,28 @@ +package com.mh.user.mapper; + +import com.mh.user.model.SysRoleMenu; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface SysRoleMenuMapper { + int deleteByPrimaryKey(Long id); + + int insert(SysRoleMenu record); + + int insertSelective(SysRoleMenu record); + + SysRoleMenu selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysRoleMenu record); + + int updateByPrimaryKey(SysRoleMenu record); + + List findRoleMenus(@Param(value = "roleId") Long roleId); + + List findAll(); + + int deleteByRoleId(@Param(value = "roleId") Long roleId); +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/mapper/SysUserMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysUserMapper.java new file mode 100644 index 0000000..3f6808c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysUserMapper.java @@ -0,0 +1,61 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.DBEntity; +import com.mh.user.mapper.provider.AlarmInfoProvider; +import com.mh.user.mapper.provider.SysUserProvider; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysUser; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * author: ljf + * desc: 系统用户Mapper + */ +@Mapper +public interface SysUserMapper { + + /** + * 根据用户名称查询数据库信息 + * @param userName + * @return + */ + @Select("select DB_Names,DB_UserName,DB_Pwd,DB_Port,DB_IP from sys_user S LEFT JOIN Tbl_Project P ON S.DBIds = P.ID where S.user_name=#{userName}") + DBEntity queryDBInfo(@Param("userName") String userName); + + int deleteByPrimaryKey(Long id); + + int insert(SysUser record); + + int insertSelective(SysUser record); + + SysUser selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysUser record); + + int updateByPrimaryKey(SysUser record); + + List findPage(); + + SysUser findByName(@Param(value = "userName") String name); + + List findPageByName(@Param(value = "userName") String name); + + List findPageByNameAndEmail(@Param(value = "userName") String name, @Param(value = "email") String email); + + @Results(value = { + @Result(property="id",column="id"), + @Result(property="userName",column="user_name"), + @Result(property="createBy",column="create_by"), + @Result(property="createTime",column="create_time"), + @Result(property ="loginTime",column ="login_time"), + @Result(property="roleNames",column="role_name") + }) + @SelectProvider(type = SysUserProvider.class,method = "queryUsers") + List queryUsers(@Param(value = "userName") String userName,@Param(value = "page") int page, @Param(value = "limit") int limit); + + //查询所有记录数 + @SelectProvider(type = SysUserProvider.class,method = "getCount") + int getCount(@Param(value = "userName") String userName,@Param(value = "page") int page,@Param(value = "limit") int limit); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/SysUserRoleMapper.java b/user-service/src/main/java/com/mh/user/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..608bc19 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SysUserRoleMapper.java @@ -0,0 +1,30 @@ +package com.mh.user.mapper; + +import com.mh.user.model.SysUserRole; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * author: ljf + * desc: 用户对应角色Mapper + */ +public interface SysUserRoleMapper { + + int deleteByPrimaryKey(Long id); + + int insert(SysUserRole record); + + int insertSelective(SysUserRole record); + + SysUserRole selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SysUserRole record); + + int updateByPrimaryKey(SysUserRole record); + + List findUserRoles(@Param(value = "userId") Long userId); + + int deleteByUserId(@Param(value = "userId") Long userId); +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/mapper/SystemInfoMapper.java b/user-service/src/main/java/com/mh/user/mapper/SystemInfoMapper.java new file mode 100644 index 0000000..635f9e5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/SystemInfoMapper.java @@ -0,0 +1,18 @@ +package com.mh.user.mapper; + +import com.mh.user.entity.SystemInfoEntity; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface SystemInfoMapper { + //查询系统列表 + @Results(value = { + @Result(property="id",column="id"), + @Result(property="systemName",column="system_name"), + @Result(property="roleID",column="role_id") + }) + @Select("select * from System_info") + List querySystem(@Param("roleID") String roleID ); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/chart/ChartMapper.java b/user-service/src/main/java/com/mh/user/mapper/chart/ChartMapper.java new file mode 100644 index 0000000..75587c9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/chart/ChartMapper.java @@ -0,0 +1,73 @@ +package com.mh.user.mapper.chart; + +import com.mh.user.entity.chart.BaseChartEntity; +import com.mh.user.entity.chart.Unit; +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.mapping.StatementType; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * @author ljf + * @title : 表格mapper层 + * @description : + * @updateTime 2020-07-13 + * @throws : + */ +@Component +@Mapper +public interface ChartMapper { + + // 执行存储过程,获取对应的数据 +// DECLARE @return_value int +// +// EXEC @return_value = [dbo].[pro_chart] +// @choose_index_ids = N'225', +// @begin_time = N'2020-06-15 17:45:00.000', +// @end_time = N'2020-06-15 18:45:00.000', +// @type = NULL, +// @chart_id = 1 +// +// SELECT 'Return Value' = @return_value +// +// GO + + @Results({ + @Result(column = "chart_time", property = "chartTime"), + @Result(column = "index_name", property = "indexName"), + @Result(column = "index_type", property = "indexType"), + @Result(column = "display_type", property = "displayType"), + @Result(column = "index_id", property = "indexId"), + @Result(column = "width", property = "width"), + @Result(column = "chart_name", property = "chartName"), + @Result(column = "time_name", property = "timeName"), + @Result(column = "chart_id", property = "chartId"), + @Result(column = "unit", property = "unit"), + @Result(column = "data", property = "data") + }) + @Select("exec pro_chart " + + "#{map.choose_index_ids,mode=IN,jdbcType=VARCHAR}," + + "#{map.begin_time,mode=IN,jdbcType=VARCHAR}," + + "#{map.end_time,mode=IN,jdbcType=VARCHAR}," + + "#{map.type,mode=IN,jdbcType=VARCHAR}," + + "#{map.chart_id,mode=IN,jdbcType=INTEGER}") + @Options(statementType = StatementType.CALLABLE) + List callProChart(@Param("map") Map map); + + // 查询单位接口 + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "unit_name", property = "unitName"), + @Result(column = "unit", property = "unit"), + @Result(column = "icon", property = "icon"), + @Result(column = "grade", property = "grade"), + @Result(column = "other_name", property = "otherName") + }) + @Select("exec pro_unit " + + "#{map.choose_index_ids,mode=IN,jdbcType=VARCHAR}") + @Options(statementType = StatementType.CALLABLE) + List queryUnits(@Param("map") Map map); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/chillers/ChillerControlOrderMapper.java b/user-service/src/main/java/com/mh/user/mapper/chillers/ChillerControlOrderMapper.java new file mode 100644 index 0000000..613fb1c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/chillers/ChillerControlOrderMapper.java @@ -0,0 +1,100 @@ +package com.mh.user.mapper.chillers; + +import com.mh.user.entity.ChillersEntity; +import com.mh.user.entity.OrderMessageEntity; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description :关于冷水机组指令控制的持久化层,mapper层 + * @updateTime 2020-05-20 + * @throws : + */ +@Component +@Mapper +public interface ChillerControlOrderMapper { + + // 更新基表管理状态值 + @Update("update chillers_register_address set last_value = #{dataStr} and last_time = getdate() where" + + " register_address = #{registerAddr}") + void updateChillersRegisterAddress(@Param("dataStr") String dataStr, @Param("registerAddr") String registerAddr); + + // 更新发送状态status: 1(发送成功),0(发送失败) + @Update("update order_message set send_time = getdate(), send_num = #{sendNum}, status = #{status} " + + " where register_address = #{registerAddr} and create_time = #{createTime}") + void updateOrderMessage(OrderMessageEntity orderMessageEntity); + + // 通过父ID查询出对应的寄存器信息值 + @Select("select a.id, a.register_address, a.register_name, a.other_name, " + + " (select top 1 gateway_ip from gateway_manage as b where b.data_com = a.data_com) as IP," + + " (select top 1 port from gateway_manage as b where b.data_com = a.data_com) as port, " + + " (select top 1 ddc_addr from chillers_register_address as c where c.id = #{id}) as ddc_addr " + + " from chillers_register_address as a where parent_id = #{id}") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "register_address", property = "registerAddress"), + @Result(column = "register_name", property = "registerName"), + @Result(column = "other_name", property = "otherName"), + @Result(column = "IP", property = "IP"), + @Result(column = "port", property = "port"), + @Result(column = "ddc_addr", property = "ddcAddr") + }) + ChillersEntity queryChiller(@Param("id") int id); + + // 通过父ID查询出对应的寄存器信息值 + @Select("select a.id, a.register_address, a.register_name, a.other_name, " + + " (select top 1 gateway_ip from gateway_manage as b where b.data_com = a.data_com) as IP," + + " (select top 1 port from gateway_manage as b where b.data_com = a.data_com) as port, " + + " (select top 1 ddc_addr from chillers_register_address as c where c.id = 19) as ddc_addr " + + " from chillers_register_address as a where id = #{id}") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "register_address", property = "registerAddress"), + @Result(column = "register_name", property = "registerName"), + @Result(column = "other_name", property = "otherName"), + @Result(column = "IP", property = "IP"), + @Result(column = "port", property = "port"), + @Result(column = "ddc_addr", property = "ddcAddr") + }) + ChillersEntity queryChillerById(@Param("id") int id); + + // 批量插入生成的采集指令入数据库 + @Insert("") + void batchInsertOrderMessage(@Param("orderMessageEntityList") List orderMessageEntityList); + + // 查询最新关闭冷却塔指令的时间 + @Select("select top 1 send_time from order_message where status = 1 and register_name like '%冷却塔%' and order_str like '%0000' order by send_time desc") + Date queryCloseChilledLastTime(); + + // 发送指令之后,更新对应的地址对应的状态值 + @Update("update chillers_register_address set last_value = right(#{orderStr},2), last_time = getdate() " + + " where grade = 3 and register_address = #{registerAddr} and ddc_addr is null") + void updateChillersBySendDDC(OrderMessageEntity orderMessageEntity); + + // 发送指令之后,更新对应的地址对应的状态值 + @Update("update chillers_register_address set last_value = #{orderStr}, last_time = getdate() " + + " where grade = 3 and register_address = #{registerAddr} and ddc_addr is null") + void updateChillersBySendDDC1(OrderMessageEntity orderMessageEntity); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/chillers/ChillersMapper.java b/user-service/src/main/java/com/mh/user/mapper/chillers/ChillersMapper.java new file mode 100644 index 0000000..ddd2bd7 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/chillers/ChillersMapper.java @@ -0,0 +1,184 @@ +package com.mh.user.mapper.chillers; + +import com.mh.user.entity.ChillersEntity; +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.entity.TableDataEntity; +import com.mh.user.entity.TableInfoEntity; +import com.mh.user.provide.ChillersProvider; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description :关于冷水机组的持久化层,mapper层 + * @updateTime 2020-05-20 + * @throws : + */ +@Component +@Mapper +public interface ChillersMapper { + + // 查询对应设备信息 + @Select("select device_code,register_address,last_value,last_time from chillers_register_address\t\n" + + "\twhere (ddc_addr = '9999' or ddc_addr = '9998') and register_address = '09' and function_code = '1' and last_value = 1" + +// " and convert(varchar(10),getdate(),23) = convert(varchar(10),last_time,23) " + + " order by device_code ") + @Results({ + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "register_address", property = "registerAddress"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_time", property = "lastTime") + }) + List getRunningChillers(); + + // 查询对应设备信息 + @Select("select device_code,register_address,last_value,last_time from chillers_register_address " + + " where ddc_addr = '9999' " + + " and (register_address = '0A' or register_address = '0B' or register_address = '0E' or register_address = '0F') " + + " and function_code = '3' and device_code = #{device_code} ") + @Results({ + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "register_address", property = "registerAddress"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_time", property = "lastTime") + }) + List getChillersTemp(@Param("device_code") String device_code); + +// @Select("select id, device_code, device_num, collection_num, register_address, register_name, function_code, digit, other_name," + +// " data_com, last_value, last_time, create_time, update_time, " + +// " (select gateway_ip as IP from gateway_manage where data_com = c.data_com) as IP, " + +// " (select port as port from gateway_manage where data_com = c.data_com) as port " + +// " from chillers_register_address as c where c.grade = #{grade} order by c.id") + @SelectProvider(type = ChillersProvider.class, method = "queryChillersByOther") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "device_num", property = "deviceNum"), + @Result(column = "collection_num", property = "collectionNum"), + @Result(column = "register_address", property = "registerAddress"), + @Result(column = "register_name", property = "registerName"), + @Result(column = "function_code", property = "funCode"), + @Result(column = "digit", property = "digit"), + @Result(column = "other_name", property = "otherName"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_time", property = "lastTime"), + @Result(column = "create_time", property = "createTime"), + @Result(column = "update_time", property = "updateTime"), + @Result(column = "ddc_addr", property = "ddcAddr"), + @Result(column = "IP", property = "IP"), + @Result(column = "port", property = "port") + }) + // 2 代表DDC采集,1 代表串口通信,DDC地址:9999,9998 代表冷水机组通信 + List queryChillersByOther(@Param("grade") int grade, @Param("ddcAddr") String ddcAddr); + + // 获取采集DDC设备的指令集合 + @Select("select ddc_addr, (select gateway_ip as IP from gateway_manage where data_com = c.data_com) as IP, " + + " (select port as port from gateway_manage where data_com = c.data_com) as port " + + " from chillers_register_address as c where c.grade = #{grade} " + +// " and c.ddc_addr <> 8 and c.ddc_addr <> 0 and c.ddc_addr <> 9 and c.ddc_addr <> 10" + + " group by ddc_addr,data_com order by convert(int,ddc_addr)") + @Results({ + @Result(column = "ddc_addr", property = "ddcAddr"), + @Result(column = "IP", property = "IP"), + @Result(column = "port", property = "port") + }) + // 2 代表DDC采集,1 代表串口通信 + List queryChillersDDC(@Param("grade") int grade); + + + // 插入冷水机组历史流水表 + @Insert("insert into chillers_data_history(device_code, device_num, collection_num, register_address, register_name, fun_code, data_value, collection_time, local_time, grade, ddc_addr) " + + "values (#{deviceCode}, #{deviceNum}, #{collectionNum}, #{registerAddress}, #{registerName}, #{funCode}, #{lastValue}, #{lastTime,jdbcType=DATE}, #{lastTime,jdbcType=DATE}, 0, #{ddcAddr})") + int insertChillersHistory(ChillersEntity chillersEntity); + + // 更新对应的冷水机组 + @Update("update chillers_register_address set last_value = #{lastValue}, last_time = #{lastTime} where collection_num = #{collectionNum} and register_address = #{registerAddress}") + void updateChillerRegisterAddr(ChillersEntity chillersEntity); + + // 判断是否存在实时记录表 + @Select("select count(id) from data_now where device_num = #{deviceNum} and register_addr = #{registerAddr}") + int queryDataNowByOthers(ChillersEntity chillersEntity); + + // 插入实时表 + @Insert("insert into data_now(device_num, device_code, cur_flow, cur_date, grade, register_addr, ddc_addr) " + + "values (#{deviceNum}, #{deviceCode}, #{lastValue}, #{lastTime}, 0, #{registerAddress}, #{ddcAddr})") + @Options(useGeneratedKeys = true, keyProperty = "id") + int insertChillerDataNow(ChillersEntity chillersEntity); + + // 更新实时表数据 + @Update("update data_now set cur_flow = #{lastValue}, cur_date = #{lastTime} " + + " where device_num = #{deviceNum} and register_addr = #{registerAddr} and cur_date <> #{lastTime}") + void updateDataNow(ChillersEntity chillersEntity); + + // 查询冷水机组的状态,以及表格数据 + @Select("select span, title, info, infos, table_rows as rows from table_second where device_name = #{deviceName} and grade = #{grade} order by sort") + List queryTopData(@Param("deviceName") String deviceName, @Param("grade") int grade); + + @Select("select rowspan, td1, td2, td3 from table_first where device_name = #{deviceName} and grade = #{grade} order by sort") + List queryLeftAndRightData(@Param("deviceName") String deviceName, @Param("grade") int grade); + + // 批量插入历史流水表 + @Insert("") + void batchInsertChillersHistory(@Param("chillersEntityLists") List chillersEntityLists); + + // 批量更新基表管理表内容 + @Update("") + int updateRegisterAddr(@Param("chillersEntityLists") List chillersEntityLists); + + // 批量更新实时记录表内容 + @Update("") + void batchUpdateDataNow(@Param("chillersEntityLists") List chillersEntityLists); + + // 通过DDC地址查询对应的采集参数设备 + @Select("select register_address from chillers_register_address where ddc_addr = #{ddcAddr} and grade = 2") + List queryDDCAddr(@Param("ddcAddr") String ddcAddr); + + @Select("select top 1 convert(varchar(20),collection_time,120) from chillers_data_history " + + " where ddc_addr = #{ddcAddr} and register_address = #{registerAddress} order by collection_time desc ") + String queryLastChillersHistory(ChillersEntity chillersEntity); + + // 查询对应设备信息 + @Select("select device_code,register_address,last_value,last_time from chillers_register_address\t\n" + + "\twhere (ddc_addr = '9999' or ddc_addr = '9998') and register_address = '09' and function_code = '1' " + + " order by device_code ") + @Results({ + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "register_address", property = "registerAddress"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_time", property = "lastTime") + }) + List getStopChillers(); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/chillers/DataHistoryMapper.java b/user-service/src/main/java/com/mh/user/mapper/chillers/DataHistoryMapper.java new file mode 100644 index 0000000..c0b9dd2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/chillers/DataHistoryMapper.java @@ -0,0 +1,25 @@ +package com.mh.user.mapper.chillers; + +import com.mh.user.entity.DeviceManageEntity; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Options; +import org.springframework.stereotype.Component; + +/** + * @Classname DataHistoryMapper + * @Description TODO + * @Date 2020-06-03 16:13 + * @Created by LJF + */ +@Component +@Mapper +public interface DataHistoryMapper { + + // 插入冷量计和电表历史数据 + @Insert("insert into data_history(device_num, device_code, cur_flow, cur_date, grade, device_type)" + + " values(#{deviceNum},#{deviceCode},#{lastValue}, #{lastDate}, 0, #{deviceType})") + @Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id") + int insertDataHistory(DeviceManageEntity deviceManageEntity); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/chillers/DealDataMapper.java b/user-service/src/main/java/com/mh/user/mapper/chillers/DealDataMapper.java new file mode 100644 index 0000000..0425ef7 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/chillers/DealDataMapper.java @@ -0,0 +1,102 @@ +package com.mh.user.mapper.chillers; + +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.mapping.StatementType; + +import java.util.List; + +/** + * @author ljf + * @title :处理数据mapper层 + * @description : + * @updateTime 2020-07-28 + * @throws : + */ +@Mapper +public interface DealDataMapper { + + //中央热水按日、月和年汇总水、电用量,计算单耗、平均用量 + @Select("exec pro_energy #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proEnergy(@Param("curDate") String curDate); + + //中央空调按5分钟、小时、日、月和年汇电用量,冷量计算COP + @Select("exec pro_energy_data #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proEnergyData(@Param("curDate") String curDate); + + // + @Select("exec pro_data_result #{curDate,jdbcType=VARCHAR,mode=IN},#{projectID,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proDataResult(@Param("curDate") String curDate,@Param("projectID") String projectID); + + @Select("exec pro_energy_day_sum #{curDate,jdbcType=VARCHAR,mode=IN},#{projectID,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proEnergyDaySum(@Param("curDate") String curDate,@Param("projectID") String projectID); + + //汇总设备状态 + @Select("exec pro_device_state #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proDeviceState(@Param("curDate") String curDate); + + @Select("exec pro_analysis_month #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proAnalysisMonth(@Param("curDate") String curDate); + + @Select("exec pro_analysis_year #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proAnalysisYear(@Param("curDate") String curDate); + + @Select("exec pro_alarm_info_sum #{curDate,jdbcType=VARCHAR,mode=IN} ") + @Options(statementType = StatementType.CALLABLE) + void proAlarmInfoSum(@Param("curDate") String curDate); + + /////////////////////////////////////////////////////////// + @Select("exec pro_deal_data ") + @Options(statementType = StatementType.CALLABLE) + void dealData(); + + @Delete("delete from chillers_data_history where convert(varchar(7),collection_time,23) = convert(varchar(7),dateadd(month,-3,getdate()),23)") + void deleteChillersDataHistory(); + + @Delete("delete from data_history where convert(varchar(7),cur_date,23) = convert(varchar(7),dateadd(month,-12,getdate()),23)") + void deleteDataHistory(); + + + @Insert("insert into date_temperature(cur_date,amb_temp,humidity)values(#{curDate},#{ambTemp},#{humidity})") + void dateTempHumidity(@Param("curDate") String curDate, + @Param("ambTemp") String ambTemp, + @Param("humidity") String humidity); + + @Update("update date_temperature set amb_temp=#{ambTemp},humidity=#{humidity} where convert(varchar(10),cur_date,121)=#{curDate} ") + void updateDateTempHumidity(@Param("curDate") String curDate, + @Param("ambTemp") String ambTemp, + @Param("humidity") String humidity); + + @Select("select count(*) from date_temperature where convert(varchar(10),cur_date,121)=#{curDate} ") + int selectDateTempHumidity(@Param("curDate") String curDate); + + + @Insert("insert into hour_temperature(cur_date,amb_temp,humidity)values(#{curDate},#{ambTemp},#{humidity})") + void hourTempHumidity(@Param("curDate") String curDate, + @Param("ambTemp") String ambTemp, + @Param("humidity") String humidity); + + @Update("update hour_temperature set amb_temp=#{ambTemp},humidity=#{humidity} where convert(varchar(13),cur_date,121)=left(#{curDate},13)") + void updateHourTempHumidity(@Param("curDate") String curDate, + @Param("ambTemp") String ambTemp, + @Param("humidity") String humidity); + + @Select("select count(*) from hour_temperature where convert(varchar(13),cur_date,121)=left(#{curDate},13)") + int selectHourTempHumidity(@Param("curDate") String curDate); + + //查找项目ID + @Select("select id from Project_Info where system_id=#{systemID}") + List queryProjectId(@Param("systemID") String systemID ); + +// @Select("test(#{name,jdbcType=VARCHAR,mode=IN},#{gender,jdbcType=VARCHAR,mode=OUT})") +// @Options(statementType = StatementType.CALLABLE) +// void getGengder(People people); + + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/chillers/DeviceDisplayMapper.java b/user-service/src/main/java/com/mh/user/mapper/chillers/DeviceDisplayMapper.java new file mode 100644 index 0000000..e6ef1be --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/chillers/DeviceDisplayMapper.java @@ -0,0 +1,45 @@ +package com.mh.user.mapper.chillers; + +import com.mh.user.dto.DeviceMessageDTO; +import com.mh.user.dto.DisplayBoxDataDTO; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 设备数据显示持久化层 + * @updateTime 2020-05-29 + * @throws : + */ +@Component +@Mapper +public interface DeviceDisplayMapper { + + // deviceType: 设备类型(host:主机 pump:泵 tower:塔)type: 1(查询阴影值),0(查询数据框内容) + @Select("select title, sec_content1, sec_content2, first_div_class, device_id, grade from table_display_box_data " + + " where device_type = #{deviceType} and query_type = #{type}") + @Results({ + @Result(column = "title", property = "title"), + @Result(column = "sec_content1", property = "secContent1"), + @Result(column = "sec_content2", property = "secContent2"), + @Result(column = "first_div_class", property = "firstDivClass"), + @Result(column = "device_id", property = "deviceId"), + @Result(column = "grade", property = "grade") + }) + List deviceDisplayBoxData(@Param("deviceType") String deviceType, @Param("type") String type); + + // 设备信息状态显示 + @Select("select label, span_length, open_state, device_id, grade from table_device_status where device_type = #{deviceType}") + @Results({ + @Result(column = "label", property = "label"), + @Result(column = "span_length", property = "spanLength"), + @Result(column = "open_state", property = "openState"), + @Result(column = "device_id", property = "deviceId"), + @Result(column = "grade", property = "grade") + }) + List queryDeviceStatus(@Param("deviceType") String deviceType); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/chillers/DeviceManageMapper.java b/user-service/src/main/java/com/mh/user/mapper/chillers/DeviceManageMapper.java new file mode 100644 index 0000000..1d18257 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/chillers/DeviceManageMapper.java @@ -0,0 +1,171 @@ +package com.mh.user.mapper.chillers; + +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.provide.DeviceManageProvider; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description :关于设备的持久化层,mapper层 + * @updateTime 2020-05-15 + * @throws : + */ +@Component +@Mapper +public interface DeviceManageMapper { + + // 查询全部的设备信息 +// @Select("select id, device_code, device_num, collection_num, data_com, initial_value, price, param_id, param_name, last_value, last_date, communication_type, device_type, remark, grade from device_manage") + @SelectProvider(type = DeviceManageProvider.class, method = "getDeviceByOthers") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "device_num", property = "deviceNum"), + @Result(column = "collection_num", property = "collectionNum"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "initial_value", property = "initialValue"), + @Result(column = "device_rate", property = "deviceRate"), + @Result(column = "device_caliber", property = "deviceCaliber"), + @Result(column = "price", property = "price"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_date", property = "lastDates"), + @Result(column = "communication_type", property = "communicationType"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "create_time", property = "createTimes"), + @Result(column = "update_time", property = "updateTimes"), + @Result(column = "remark", property = "remark"), + @Result(column = "grade", property = "grade") + }) + List getDeviceByOther(@Param("deviceNum") String deviceNum); + + /** + * 更新基表信息 + * @param deviceManageEntity + */ + @Update("update device_manage set device_code=#{deviceCode},collection_num=#{collectionNum},data_com=#{dataCom},initial_value=#{initialValue}," + + "last_value=#{lastValue},device_caliber=#{deviceCaliber},device_rate=#{deviceRate},param_name=#{paramName}," + + "create_time=#{createTimes},update_time=#{updateTimes},device_type=#{deviceType} where device_num=#{deviceNum}") + void updateBaseMeter(DeviceManageEntity deviceManageEntity); + + /** + * 插入基表信息 + * @param deviceManageEntity + */ + @Insert("insert into device_manage(device_code,device_num,collection_num,data_com,initial_value,last_value,device_caliber,device_rate," + + "param_name,create_time,update_time,device_type) values(#{deviceCode},#{deviceNum},#{collectionNum},#{dataCom},#{initialValue}," + + "#{lastValue},#{deviceCaliber},#{deviceRate},#{paramName},getDate(),#{updateTimes},#{deviceType})") + void insertBaseMeter(DeviceManageEntity deviceManageEntity); + + + + + + + + @Select("select id, device_code, device_num, collection_num, data_com, initial_value, price, param_id, param_name, last_value, last_date, communication_type, device_type, remark, grade from device_manage") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "device_num", property = "deviceNum"), + @Result(column = "collection_num", property = "collectionNum"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "initial_value", property = "initialValue"), + @Result(column = "price", property = "price"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_date", property = "lastDate"), + @Result(column = "communication_type", property = "communicationType"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "remark", property = "remark"), + @Result(column = "grade", property = "grade") + }) + List queryAllDevice(); + + /** + * 删除设备信息 + * @param deviceId + * @param deviceType + */ + @DeleteProvider(type = DeviceManageProvider.class, method = "deleteDeviceInfo") + void deleteDeviceInfo(@Param("deviceId")Integer deviceId,@Param("deviceType")String deviceType); + + // 查询全部的设备信息 +// @Select("select id, device_code, device_num, collection_num, data_com, initial_value, price, param_id, param_name, last_value, last_date, communication_type, device_type, remark, grade from device_manage") + @SelectProvider(type = DeviceManageProvider.class, method = "queryDeviceByOthers") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "device_num", property = "deviceNum"), + @Result(column = "collection_num", property = "collectionNum"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "initial_value", property = "initialValue"), + @Result(column = "price", property = "price"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_date", property = "lastDate"), + @Result(column = "communication_type", property = "communicationType"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "remark", property = "remark"), + @Result(column = "grade", property = "grade") + }) + List queryDeviceByOther(@Param("page") int page, @Param("size") int size, @Param("deviceNum") String deviceNum); + + @SelectProvider(type = DeviceManageProvider.class, method = "queryDeviceByOthersCount") + int queryDeviceByOtherCount(@Param("deviceNum") String deviceNum); + + @Select("") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "device_num", property = "deviceNum"), + @Result(column = "collection_num", property = "collectionNum"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "initial_value", property = "initialValue"), + @Result(column = "price", property = "price"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_date", property = "lastDate"), + @Result(column = "communication_type", property = "communicationType"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "remark", property = "remark"), + @Result(column = "grade", property = "grade") + }) + List queryDevicesByType(@Param("deviceType") String deviceType); + + @Select("select id, device_code, device_num, collection_num, data_com, initial_value, price, param_id, param_name, " + + "last_value, last_date, communication_type, device_type, remark, grade from device_${tableName}") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "device_code", property = "deviceCode"), + @Result(column = "device_num", property = "deviceNum"), + @Result(column = "collection_num", property = "collectionNum"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "initial_value", property = "initialValue"), + @Result(column = "price", property = "price"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "last_value", property = "lastValue"), + @Result(column = "last_date", property = "lastDate"), + @Result(column = "communication_type", property = "communicationType"), + @Result(column = "device_type", property = "deviceType"), + @Result(column = "remark", property = "remark"), + @Result(column = "grade", property = "grade") + }) + List queryDevicesByType1(@Param("tableName") String tableName); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/chillers/DeviceParamMapper.java b/user-service/src/main/java/com/mh/user/mapper/chillers/DeviceParamMapper.java new file mode 100644 index 0000000..059484d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/chillers/DeviceParamMapper.java @@ -0,0 +1,93 @@ +package com.mh.user.mapper.chillers; + +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.entity.DeviceParameterEntity; +import com.mh.user.provide.DeviceParamProvider; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description :设备参数持久化层 + * @updateTime 2020-05-21 + * @throws : + */ +@Component +@Mapper +public interface DeviceParamMapper { + + @SelectProvider(type = DeviceParamProvider.class, method = "getBaseMeterParamList") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "param_baudrate", property = "paramBaudrate"), + @Result(column = "checks", property = "checks"), + @Result(column = "grade", property = "grade") + }) + List getBaseMeterParamList(@Param("baseMeterType")String baseMeterType); + + @Update("update device_parameter set param_name=#{paramName},param_baudrate=#{paramBaudrate},grade=#{grade},checks=#{checks} " + + "where param_id=#{paramId}") + void updateBaseMeterParam(DeviceParameterEntity deviceManageEntity); + + @Insert("insert into device_parameter(param_id,param_name,param_baudrate,grade,checks) values(#{paramId},#{paramName}," + + "#{paramBaudrate},#{grade},#{checks})") + void insertBaseMeterParam(DeviceParameterEntity deviceManageEntity); + + + + + // 添加网关设备 + @Insert("insert into device_parameter(param_id, param_name, param_baudrate, grade, checks)" + + " values (#{paramId}, #{paramName}, #{paramBaudrate}, 1, #{checks})") + void insertDeviceParam(DeviceParameterEntity deviceParameterEntity); + + // 通关网关ID删除设备 + @Delete("delete from device_parameter where id = #{id}") + void deleteDeviceParamByID(@Param("id") Long id); + + // 根据网关设备ID查询网关对应信息 + @Select("select id, param_id, param_name, param_baudrate, grade, checks from device_parameter where param_id = #{paramId}") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "param_baudrate", property = "paramBaudrate"), + @Result(column = "checks", property = "checks"), + @Result(column = "grade", property = "grade") + }) + DeviceParameterEntity queryParamById(int paramId); + + // 查询全部信息 + @Select("select id, param_id, param_name, param_baudrate, grade, checks from device_parameter") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "param_baudrate", property = "paramBaudrate"), + @Result(column = "checks", property = "checks"), + @Result(column = "grade", property = "grade") + }) + List queryAll(); + + // 根据页码和查询条件查询对应的设备信息 + @SelectProvider(type = DeviceParamProvider.class, method = "queryByOther") + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "param_id", property = "paramId"), + @Result(column = "param_name", property = "paramName"), + @Result(column = "param_baudrate", property = "paramBaudrate"), + @Result(column = "checks", property = "checks"), + @Result(column = "grade", property = "grade") + }) + List queryByOther(int page, int size, int paramId); + + // 查询对应的总数 + @SelectProvider(type = DeviceParamProvider.class, method = "queryByOtherCount") + int queryByOtherCount(int page, int size, int paramId); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/chillers/ExceptionMapper.java b/user-service/src/main/java/com/mh/user/mapper/chillers/ExceptionMapper.java new file mode 100644 index 0000000..782d4b1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/chillers/ExceptionMapper.java @@ -0,0 +1,37 @@ +package com.mh.user.mapper.chillers; + +import com.mh.user.entity.ExceptionEntity; +import com.mh.user.entity.ExceptionTableData; +import com.mh.user.provide.ExceptionProvider; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author ljf + * @title : 异常接口 + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +@Mapper +public interface ExceptionMapper { + + @SelectProvider(type = ExceptionProvider.class, method = "queryException") + @Results({ + @Result(column = "id", property = "deviceId"), + @Result(column = "register_name", property = "deviceName"), + @Result(column = "last_value", property = "info"), + @Result(column = "create_time", property = "timeStamp"), + @Result(column = "remark", property = "remark"), + @Result(column = "state", property = "process") + }) + List queryException(ExceptionEntity exceptionEntity); + + @SelectProvider(type = ExceptionProvider.class, method = "queryExceptionTotal") + int queryExceptionTotal(ExceptionEntity exceptionEntity); + + @Update("update device_exception_alarm set state = #{process}, remark = #{remark} where id = #{deviceId}") + int updateException(ExceptionTableData exceptionTableData); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/chillers/GatewayManageMapper.java b/user-service/src/main/java/com/mh/user/mapper/chillers/GatewayManageMapper.java new file mode 100644 index 0000000..8a8bfe1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/chillers/GatewayManageMapper.java @@ -0,0 +1,97 @@ +package com.mh.user.mapper.chillers; + +import com.mh.user.entity.GatewayManageEntity; +import com.mh.user.provide.GatewayManageProvider; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * author: ljf + * desc: 网关管理实现类 + * create-date: 2020-05-21 + * */ +@Component +@Mapper +public interface GatewayManageMapper { + + /** + * 根据条件查询网关信息 + * @param grade 连接状态 + * @param operator 运营商 + * @return + */ + @SelectProvider(type = GatewayManageProvider.class, method = "queryByOther") + @Results(id="rs",value = { + @Result(column = "gateway_name", property = "gatewayName"), + @Result(column = "gateway_ip", property = "gatewayIP"), + @Result(column = "gateway_address", property = "gatewayAddress"), + @Result(column = "data_com", property = "dataCom"), + @Result(column = "create_date", property = "createDate"), + @Result(column = "connect_date", property = "connectDate"), + @Result(column = "internet_card", property = "internetCard"), + @Result(column = "operator", property = "operator"), + @Result(column = "gateway_port", property = "gatewayPort"), + @Result(column = "grade", property = "grade") + }) + List queryByOther(@Param("grade") Integer grade, @Param("operator") Integer operator); + + /** + * 新增网关信息 + * @param gatewayManageEntity + */ + @Insert("insert into gateway_manage(gateway_name, gateway_ip, gateway_address, data_com,internet_card, " + + "operator, gateway_port, grade, connect_date) values(#{gatewayName},#{gatewayIP},#{gatewayAddress},#{dataCom},#{internetCard}," + + "#{operator},#{gatewayPort},#{grade},#{connectDate})") + void insertGateWayInfo(GatewayManageEntity gatewayManageEntity); + + /** + * 更新网关信息 + * @param gatewayManageEntity + */ + @Update("update gateway_manage set gateway_name = #{gatewayName}, gateway_ip = #{gatewayIP}, gateway_address = #{gatewayAddress}, " + + "data_com = #{dataCom}, internet_card = #{internetCard}, operator = #{operator}, " + + "gateway_port = #{gatewayPort}, grade = #{grade}, connect_date= #{connectDate} where id = #{id}") + void updateGateWayInfo(GatewayManageEntity gatewayManageEntity); + + // 查询全部信息 + @ResultMap("rs") + @Select("select id,gateway_name, gateway_ip, gateway_address, data_com, connect_date, internet_card, operator, gateway_port, grade from gateway_manage ") + List queryAll(); + + // 添加网关设备 + @Insert("insert into gateway_manage(gateway_name, gateway_ip, gateway_address, data_com, connect_date, grade, internet_card, operator, gateway_port)" + + " values (#{gatewayName}, #{gatewayIP}, #{gatewayAddress}, #{dataCom}, #{connectDate}, #{grade}, #{internetCard}, #{operator}, #{gatewayPort})") + void insertGatewayManage(GatewayManageEntity gatewayManageEntity); + + // 通关网关ID删除设备 + @Delete("delete from gateway_manage where id = #{gatewayID}") + void deleteGatewayManageByID(@Param("gatewayID") int gatewayID); + + // 根据网关设备ID查询网关对应信息 + @Select("select id, gateway_name, gateway_ip, gateway_address, data_com, collection_loop, connect_date, internet_card, operator, port, grade from gateway_manage where id = #{gatewayID}") + GatewayManageEntity queryGatewayByID(@Param("gatewayID") Long gatewayID); + + // 查询对应的总数 + @SelectProvider(type = GatewayManageProvider.class, method = "queryByOtherCount") + int queryByOtherCount(@Param("page") int page, @Param("size") int size, @Param("gatewayID") int gatewayID); + + // 根据IP和端口号更新服务器在线时间 + @Update("update gateway_manage set connect_date = getDate() where gateway_ip=#{IP} and convert(varchar(20),gateway_port) = #{port}") + void updateGatewayManage(@Param("IP") String IP,@Param("port") String port); + + // 根据端口号更新服务器在线时间 + @Update("update gateway_manage set connect_date = getDate() where convert(varchar(20),gateway_port) = #{port}") + void updateGatewayManage2(@Param("port") String port); + + // 根据设备类型查询数据库,找出对应的详细信息 + @Select("select id, gateway_name, gateway_ip, gateway_address, data_com, connect_date, internet_card, operator, gateway_port, grade from gateway_manage where grade = #{grade}") + GatewayManageEntity queryGatewayByGrade(@Param("grade") Long grade); + + //根据端口或者IP或者心跳包查询网关对应的项目名称 + @Select("select project_Name from project_info a join gateway_manage b on a.id=b.project_id and b.gateway_port=#{str} ") + String selectProjectName(@Param("str") String str); + + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/chillers/GaugeMapper.java b/user-service/src/main/java/com/mh/user/mapper/chillers/GaugeMapper.java new file mode 100644 index 0000000..dd6b1ee --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/chillers/GaugeMapper.java @@ -0,0 +1,31 @@ +package com.mh.user.mapper.chillers; + +import com.mh.user.entity.GaugeEntity; +import com.mh.user.entity.TableChartMessageEntity; +import com.mh.user.provide.GaugeProvider; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Component; + +/** + * @author ljf + * @title : 圆盘mapper层 + * @description : + * @updateTime 2020-08-07 + * @throws : + */ +@Component +@Mapper +public interface GaugeMapper { + + @Select("select 'detail' as chartType, last_value as dataValue, #{timeName} as title from chillers_register_address where id = #{deviceId}") + @Results({ + @Result(column = "chartType", property = "chartType"), + @Result(column = "title", property = "title"), + @Result(column = "dataValue", property = "dataValue") + }) + GaugeEntity getGaugeData(@Param("timeName") String timeName,@Param("deviceId") int deviceId); + + @Select("select time_name as timeName,grade from table_chart_message where width = #{type} and chart_name = #{deviceName}") + TableChartMessageEntity queryDeviceId(@Param("type") String type, @Param("deviceName") String deviceName); + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/chillers/ReportMapper.java b/user-service/src/main/java/com/mh/user/mapper/chillers/ReportMapper.java new file mode 100644 index 0000000..614c40d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/chillers/ReportMapper.java @@ -0,0 +1,40 @@ +package com.mh.user.mapper.chillers; + +import com.mh.user.entity.ReportParamEntity; +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.type.JdbcType; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author ljf + * @title :查询报表功能 + * @description : + * @updateTime 2020-07-03 + * @throws : + */ +@Mapper +@Component +public interface ReportMapper { + + // 查询全部的指标参数 + @Results({ + @Result(column="id", property="id", jdbcType= JdbcType.INTEGER, id=true), + @Result(column="parent_id", property="parentId", jdbcType=JdbcType.INTEGER), + @Result(column="other_name", property="label", jdbcType=JdbcType.VARCHAR), + @Result(column="level_type", property="levelType", jdbcType=JdbcType.INTEGER) + }) + @Select("select id, other_name, level_type, parent_id from report_param_manage ") + List queryAllTarget(); + + // 查询全部的指标参数 + @Results({ + @Result(column="id", property="id", jdbcType= JdbcType.INTEGER, id=true), + @Result(column="parent_id", property="parentId", jdbcType=JdbcType.INTEGER), + @Result(column="other_name", property="label", jdbcType=JdbcType.VARCHAR), + @Result(column="level_type", property="levelType", jdbcType=JdbcType.INTEGER) + }) + @Select("select id, other_name, level_type, parent_id from report_param_manage where grade = 1 or grade = 2") + List queryAllTarget1(); +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/AlarmInfoProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/AlarmInfoProvider.java new file mode 100644 index 0000000..26046a4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/AlarmInfoProvider.java @@ -0,0 +1,56 @@ +package com.mh.user.mapper.provider; + +public class AlarmInfoProvider { + + public String queryAlarmInfo(String alarmTime,String deviceType,String buildingId,String dealState, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from Alarm_info " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + if (alarmTime!= null && !alarmTime.equals("")) { + sql.append(" AND LEFT(alarm_time,10)=#{alarmTime} "); + } + if (dealState!= null && !dealState.equals("")) { + sql.append(" AND deal_state=#{dealState} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + + System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String getAlarmInfoCount(String alarmTime,String deviceType,String buildingId,String dealState, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from Alarm_info " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + if (alarmTime!= null && !alarmTime.equals("")) { + sql.append(" AND LEFT(alarm_time,10)=#{alarmTime} "); + } + if (dealState!= null && !dealState.equals("")) { + sql.append(" AND deal_state=#{dealState} "); + } + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + + System.out.println(sql.toString()); + return sql.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/BuildingProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/BuildingProvider.java new file mode 100644 index 0000000..1b74c4e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/BuildingProvider.java @@ -0,0 +1,38 @@ +package com.mh.user.mapper.provider; + +public class BuildingProvider { + + public String queryBuilding(String buildingId, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from building " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND id = #{buildingId} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + System.out.println(sql.toString()); + return sql.toString(); + } + + public String getCount(String buildingId, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from building " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND id = #{buildingId} "); + } + sql.append(" ) T "); + + System.out.println(sql.toString()); + return sql.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/DataResultProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/DataResultProvider.java new file mode 100644 index 0000000..eb12631 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/DataResultProvider.java @@ -0,0 +1,237 @@ +package com.mh.user.mapper.provider; + +public class DataResultProvider { + + public String queryDataResult(String projectID,String startDate,String endDate,String deviceType, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from data_result " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)>=#{startDate} "); + } + if (endDate!= null && !endDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)<=#{endDate} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND deviceType = #{deviceType} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String getDataResultCount(String projectID,String startDate,String endDate,String deviceType, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from data_result " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)>=#{startDate} "); + } + if (endDate!= null && !endDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)<=#{endDate} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND deviceType = #{deviceType} "); + } + sql.append(" ) T "); +// System.out.println(sql.toString()); + return sql.toString(); + } + //----------------------------------------------------------------------------------------------- + //时间显示间隔为1分钟 + public String queryDataResultOneMi(String projectID, String startDate,String curDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (select *,ROW_NUMBER() over(order by curDate) as rn from ( " + + " select projectID,curDate,sum(cast(curValue as decimal(18,2))) as curValue from data_result_one_mi " + + " where 1=1 "); + if (projectID!= null && !projectID.equals("")) { + sql.append(" AND projectID=#{projectID} "); + } + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND curDate>=#{startDate} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND curDate<=#{curDate} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" group by curDate,projectID)t1) t2 join project_info t3 ON t2.projectID=t3.id where t2.rn>(#{page}-1)*#{limit} and t2.rn<=#{page}*#{limit} order by t2.curDate desc"); + } else if (page == 0){ + sql.append(" group by curDate,projectID)t1) t2 join project_info t3 ON t2.projectID=t3.id order by t2.curDate desc"); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String dataResultOneMiCount(String projectID, String startDate,String curDate){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (select *,ROW_NUMBER() over(order by curDate) as rn from ( " + + " select projectID,curDate,sum(cast(curValue as decimal(18,2))) as curValue from data_result_one_mi " + + " where 1=1 "); + if (projectID!= null && !projectID.equals("")) { + sql.append(" AND projectID=#{projectID} "); + } + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND curDate>=#{startDate} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND curDate<=#{curDate} "); + } + sql.append(" group by curDate,projectID)t1) t2 "); +// System.out.println(sql.toString()); + return sql.toString(); + } + + + //时间显示间隔为5分钟 + public String queryDataResultFiveMi(String projectID,String startDate,String curDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (select *,ROW_NUMBER() over(order by curDate) as rn from ( " + + " select projectID,curDate,sum(cast(curValue as decimal(18,2))) as curValue from data_result_five_mi " + + " where 1=1 "); + if (projectID!= null && !projectID.equals("")) { + sql.append(" AND projectID=#{projectID} "); + } + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND curDate>=#{startDate} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND curDate<=#{curDate} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" group by curDate,projectID)t1) t2 join project_info t3 ON t2.projectID=t3.id where t2.rn>(#{page}-1)*#{limit} and t2.rn<=#{page}*#{limit} order by t2.curDate desc"); + } else if (page == 0){ + sql.append(" group by curDate,projectID)t1) t2 join project_info t3 ON t2.projectID=t3.id order by t2.curDate desc"); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String dataResultFiveMiCount(String projectID, String startDate,String curDate){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (select *,ROW_NUMBER() over(order by curDate) as rn from ( " + + " select projectID,curDate,sum(cast(curValue as decimal(18,2))) as curValue from data_result_five_mi " + + " where 1=1 "); + if (projectID!= null && !projectID.equals("")) { + sql.append(" AND projectID=#{projectID} "); + } + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND curDate>=#{startDate} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND curDate<=#{curDate} "); + } + sql.append(" group by curDate,projectID)t1) t2 "); +// System.out.println(sql.toString()); + return sql.toString(); + } + + //时间显示间隔为15分钟 + public String queryDataResultFifteenMi(String projectID,String startDate,String curDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (select *,ROW_NUMBER() over(order by curDate) as rn from ( " + + " select projectID,curDate,sum(cast(curValue as decimal(18,2))) as curValue from data_result_fifteen_mi " + + " where 1=1 "); + if (projectID!= null && !projectID.equals("")) { + sql.append(" AND projectID=#{projectID} "); + } + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND curDate>=#{startDate} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND curDate<=#{curDate} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" group by curDate,projectID)t1) t2 join project_info t3 ON t2.projectID=t3.id where t2.rn>(#{page}-1)*#{limit} and t2.rn<=#{page}*#{limit} order by t2.curDate desc"); + } else if (page == 0){ + sql.append(" group by curDate,projectID)t1) t2 join project_info t3 ON t2.projectID=t3.id order by t2.curDate desc"); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String dataResultFifteenMiCount(String projectID, String startDate,String curDate){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (select *,ROW_NUMBER() over(order by curDate) as rn from ( " + + " select projectID,curDate,sum(cast(curValue as decimal(18,2))) as curValue from data_result_five_mi " + + " where 1=1 "); + if (projectID!= null && !projectID.equals("")) { + sql.append(" AND projectID=#{projectID} "); + } + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND curDate>=#{startDate} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND curDate<=#{curDate} "); + } + sql.append(" group by curDate,projectID)t1) t2 "); +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询冷水机参数历史数据情况 + public String queryDataResultChiller(String projectID,String deviceAddr,String registerName,String startDate,String curDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (select *,ROW_NUMBER() over(order by curDate) as rn from data_result_chiller " + + " where 1=1 "); + if (projectID!= null && !projectID.equals("")) { + sql.append(" AND projectID=#{projectID} "); + } + if (deviceAddr!= null && !deviceAddr.equals("")) { + sql.append(" AND deviceAddr=#{deviceAddr} "); + } + if (registerName!= null && !registerName.equals("")) { + sql.append(" AND registerName=#{registerName} "); + } + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND curDate>=#{startDate} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND curDate<=#{curDate} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.curDate desc"); + } else if (page == 0){ + sql.append(" )T order by T.curDate desc"); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String dataResultChillerCount(String projectID,String deviceAddr,String registerName,String startDate,String curDate){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (select *,ROW_NUMBER() over(order by curDate) as rn from data_result_chiller " + + " where 1=1 "); + if (projectID!= null && !projectID.equals("")) { + sql.append(" AND projectID=#{projectID} "); + } + if (deviceAddr!= null && !deviceAddr.equals("")) { + sql.append(" AND deviceAddr=#{deviceAddr} "); + } + if (registerName!= null && !registerName.equals("")) { + sql.append(" AND registerName=#{registerName} "); + } + if (startDate!= null && !startDate.equals("")) { + sql.append(" AND curDate>=#{startDate} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND curDate<=#{curDate} "); + } + sql.append(" )T order by T.curDate desc"); +// System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/DeviceInfoProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/DeviceInfoProvider.java new file mode 100644 index 0000000..2f5918b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/DeviceInfoProvider.java @@ -0,0 +1,23 @@ +package com.mh.user.mapper.provider; + +public class DeviceInfoProvider { + + public String queryDeviceInfo(String systemID,String projectID,String deviceType){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from device_info " + + " where 1=1 "); + if (systemID != null && !systemID.equals("")){ + sql.append(" AND system_id = #{systemID} "); + } + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND deviceType = #{deviceType} "); + } + sql.append(" ) T "); +// System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/DeviceInstallProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/DeviceInstallProvider.java new file mode 100644 index 0000000..3fee0fe --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/DeviceInstallProvider.java @@ -0,0 +1,85 @@ +package com.mh.user.mapper.provider; + +public class DeviceInstallProvider { + + public String queryDevice(String buildingId,String deviceType,String startDate,String endDate,String isUse,String isFault, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from device_install " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + if (startDate != null && endDate != null) { + sql.append(" AND CONVERT(varchar(10),install_date,121)>=#{startDate} and CONVERT(varchar(10),install_date,121)<=#{endDate} "); + } +// else if (startDate == null || endDate == null){ +// sql.append(" AND CONVERT(varchar(10),install_date,121)>=GETDATE()-6 and CONVERT(varchar(10),install_date,121)<=GETDATE() "); +// } + if (isUse != null && !isUse.equals("")){ + sql.append(" AND is_use = #{isUse} "); + } + if (isFault != null && !isFault.equals("")){ + sql.append(" AND is_fault = #{isFault} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + + System.out.println(sql.toString()); + return sql.toString(); + } + + public String getCount(String buildingId,String deviceType,String startDate,String endDate,String isUse,String isFault, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from device_install " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + if (startDate != null && endDate != null) { + sql.append(" AND CONVERT(varchar(10),install_date,121)>=#{startDate} and CONVERT(varchar(10),install_date,121)<=#{endDate} "); + } +// else if (startDate == null || endDate == null){ +// sql.append(" AND CONVERT(varchar(10),install_date,121)>=GETDATE()-6 and CONVERT(varchar(10),install_date,121)<=GETDATE() "); +// } + if (isUse != null && !isUse.equals("")){ + sql.append(" AND is_use = #{isUse} "); + } + if (isFault != null && !isFault.equals("")){ + sql.append(" AND is_fault = #{isFault} "); + } + + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + + System.out.println(sql.toString()); + return sql.toString(); + } + + public String getIsOnlineCount(String isOnline,String deviceType){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from device_install " + + " where 1=1 "); + if (isOnline != null && !isOnline.equals("")){ + sql.append(" AND is_online = #{isOnline} "); + } + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + + System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/EnergyDataProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/EnergyDataProvider.java new file mode 100644 index 0000000..4417e3d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/EnergyDataProvider.java @@ -0,0 +1,309 @@ +package com.mh.user.mapper.provider; + +public class EnergyDataProvider { + + //按十分钟 + public String queryEnergyDataMi(String projectID,String curDate,int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_data_mi " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + }else{ + sql.append(" AND project_id <>'所有' "); + } + if (curDate != null && !curDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + if(projectID.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date "); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T join project_info T1 ON T.project_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T join project_info T1 ON T.project_id=T1.id order by T.cur_date "); + } + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //记录数 + public String getEnergyDataMiCount(String projectID,String curDate){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_data_mi " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + }else{ + sql.append(" AND project_id <>'所有' "); + } + if (curDate != null && !curDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + if(projectID.equals("所有")){ + sql.append(" )T "); + }else{ + sql.append(" )T join project_info T1 ON T.project_id=T1.id "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //按小时 + public String queryEnergyDataHour(String projectID,String curDate,int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_data_hour " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + }else{ + sql.append(" AND project_id <>'所有' "); + } + if (curDate != null && !curDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + if(projectID.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date "); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T join project_info T1 ON T.project_id=T1.id join hour_temperature t2 on LEFT(T.cur_date,13)=CONVERT(VARCHAR(13),t2.cur_date,121) where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T join project_info T1 ON T.project_id=T1.id join hour_temperature t2 on LEFT(T.cur_date,13)=CONVERT(VARCHAR(13),t2.cur_date,121) order by T.cur_date "); + } + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //按小时记录数 + public String getEnergyDataHourCount(String projectID,String curDate){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_data_hour " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + }else{ + sql.append(" AND project_id <>'所有' "); + } + if (curDate != null && !curDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + if(projectID.equals("所有")){ + sql.append(" )T "); + }else{ + sql.append(" )T join project_info T1 ON T.project_id=T1.id join hour_temperature t2 on LEFT(T.cur_date,13)=CONVERT(VARCHAR(13),t2.cur_date,121)"); + } + + System.out.println(sql.toString()); + return sql.toString(); + } + + //按天 + public String queryEnergyDataDay(String projectID,String curDate,int queryType,int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_data_day " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + }else{ + sql.append(" AND project_id <>'所有' "); + } + if (curDate != null && !curDate.equals("")) { + if (queryType==0){ + sql.append(" AND LEFT(cur_date,7)=#{curDate} "); + }else{ + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + } + if(projectID.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date "); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T join project_info T1 ON T.project_id=T1.id join date_temperature t2 on LEFT(T.cur_date,10)=CONVERT(VARCHAR(10),t2.cur_date,121) where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T join project_info T1 ON T.project_id=T1.id join date_temperature t2 on LEFT(T.cur_date,10)=CONVERT(VARCHAR(10),t2.cur_date,121) order by T.cur_date "); + } + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //记录数 + public String getEnergyDataDayCount(String projectID,String curDate,int queryType){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_data_day " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + }else{ + sql.append(" AND project_id <>'所有' "); + } + if (curDate != null && !curDate.equals("")) { + if (queryType==0){ + sql.append(" AND LEFT(cur_date,7)=#{curDate} "); + }else{ + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + } + if(projectID.equals("所有")){ + sql.append(" )T "); + }else{ + sql.append(" )T join project_info T1 ON T.project_id=T1.id join date_temperature t2 on LEFT(T.cur_date,10)=CONVERT(VARCHAR(10),t2.cur_date,121) "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //按月 + public String queryEnergyDataMonth(String projectID,String curDate,int queryType,int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_data_month " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + }else{ + sql.append(" AND project_id <>'所有' "); + } + if (curDate != null && !curDate.equals("")) { + if(queryType==0){ + sql.append(" AND LEFT(cur_date,4)=#{curDate} "); + }else { + sql.append(" AND LEFT(cur_date,7)=#{curDate} "); + } + } + if(projectID.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date "); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T join project_info T1 ON T.project_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T join project_info T1 ON T.project_id=T1.id order by T.cur_date "); + } + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //记录数 + public String getEnergyDataMonthCount(String projectID,String curDate,int queryType){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_data_month " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + }else{ + sql.append(" AND project_id <>'所有' "); + } + if (curDate != null && !curDate.equals("")) { + if(queryType==0){ + sql.append(" AND LEFT(cur_date,4)=#{curDate} "); + }else { + sql.append(" AND LEFT(cur_date,7)=#{curDate} "); + } + } + if(projectID.equals("所有")){ + sql.append(" )T "); + }else{ + sql.append(" )T join project_info T1 ON T.project_id=T1.id "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + public String queryEnergyDataYear(String projectID,String startDate,String endDate,int queryType,int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_data_year " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + }else{ + sql.append(" AND project_id <>'所有' "); + } + if(queryType==0){ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)<=#{endDate} "); + } + }else{ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)=#{startDate} "); + } + } + if(projectID.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date "); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T join project_info T1 ON T.project_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T join project_info T1 ON T.project_id=T1.id order by T.cur_date "); + } + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //记录数 + public String getEnergyDataYearCount(String projectID,String startDate,String endDate,int queryType){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_data_year " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + }else{ + sql.append(" AND project_id <>'所有' "); + } + if(queryType==0){ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)<=#{endDate} "); + } + }else{ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)=#{startDate} "); + } + } + if(projectID.equals("所有")){ + sql.append(" )T "); + }else{ + sql.append(" )T join project_info T1 ON T.project_id=T1.id "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/EnergyProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/EnergyProvider.java new file mode 100644 index 0000000..9cec1af --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/EnergyProvider.java @@ -0,0 +1,378 @@ +package com.mh.user.mapper.provider; + +public class EnergyProvider { + + //小时 + public String queryEnergyHour(String projectID,String buildingId,String startDate,String endDate,int queryType, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_hour " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if(queryType==0){ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,13)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,13)<=#{endDate} "); + } + }else{ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,13)=#{startDate} "); + } + } + if (buildingId != null && !buildingId.equals("") && buildingId.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date "); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T join building T1 ON T.building_id=T1.id order by T.cur_date "); + } + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //按天 + public String queryEnergyDay(String projectID,String buildingId,String startDate,String endDate,int queryType, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_day " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if(queryType==0){ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)<=#{endDate} "); + } + }else{ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=LEFT(#{startDate},10) "); + } + } + if (buildingId != null && !buildingId.equals("") && buildingId.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date "); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T join building T1 ON T.building_id=T1.id join project_info T2 ON T.project_id=T2.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T join building T1 ON T.building_id=T1.id join project_info T2 ON T.project_id=T2.id order by T.cur_date "); + } + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //按月 + public String queryEnergyMonth(String projectID,String buildingId,String startDate,String endDate,int queryType, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_Month " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if(queryType==0){ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,7)>=LEFT(#{startDate},7) "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,7)<=LEFT(#{endDate},7) "); + } + }else{ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,7)=LEFT(#{startDate},7) "); + } + } + if (buildingId != null && !buildingId.equals("") && buildingId.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date "); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T join building T1 ON T.building_id=T1.id order by T.cur_date "); + } + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //按年 + public String queryEnergyYear(String projectID,String buildingId,String startDate,String endDate,int queryType, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_year " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if(queryType==0){ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)<=#{endDate} "); + } + }else{ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,4)=#{startDate} "); + } + } + if (buildingId != null && !buildingId.equals("") && buildingId.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" )T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date "); + } else if (page == 0){ + sql.append(" )T order by T.cur_date "); + } + }else{ + if ((page != 0) && (limit != 0)){ + sql.append(" )T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit} order by T.cur_date"); + } else if (page == 0){ + sql.append(" )T join building T1 ON T.building_id=T1.id order by T.cur_date"); + } + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + //按小时 + public String getEnergyHourCount(String projectID,String buildingId,String startDate,String endDate,int queryType){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_day " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if(queryType==0){ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,13)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,13)<=#{endDate} "); + } + }else{ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,13)=#{startDate} "); + } + } + if (buildingId != null && !buildingId.equals("") && buildingId.equals("所有")){ + sql.append(" ) T "); + }else{ + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //按天 + public String getEnergyDayCount(String projectID,String buildingId,String startDate,String endDate,int queryType){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_day " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if(queryType==0){ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)<=#{endDate} "); + } + }else{ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=LEFT(#{startDate},10) "); + } + } + if (buildingId != null && !buildingId.equals("") && buildingId.equals("所有")){ + sql.append(" ) T "); + }else{ + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //按月 + public String getEnergyMonthCount(String projectID,String buildingId,String startDate,String endDate,int queryType){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_month " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if(queryType==0){ + if (startDate != null && startDate != null) { + sql.append(" AND LEFT(cur_date,7)>=#{startDate} "); + } + if (endDate != null && endDate != null) { + sql.append(" AND LEFT(cur_date,7)<=#{endDate} "); + } + }else{ + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,7)=LEFT(#{startDate},7) "); + } + } + if (buildingId != null && !buildingId.equals("") && buildingId.equals("所有")){ + sql.append(" ) T "); + }else{ + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //按年 + public String getEnergyYearCount(String projectID,String buildingId,String startDate,String endDate,int queryType){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_year " + + " where 1=1 "); + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if(queryType==0){ + if (startDate != null && startDate != null) { + sql.append(" AND LEFT(cur_date,4)>=#{startDate} "); + } + if (endDate != null && endDate != null) { + sql.append(" AND LEFT(cur_date,4)<=#{endDate} "); + } + }else{ + if (startDate != null && startDate != null) { + sql.append(" AND LEFT(cur_date,4)=#{startDate} "); + } + } + if (buildingId != null && !buildingId.equals("") && buildingId.equals("所有")){ + sql.append(" ) T "); + }else{ + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询每天的用量 + public String queryDayEnergy(String buildingId,String startDate,String endDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_day " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)<=#{endDate} "); + } + if (buildingId.equals("所有")){ + if ((page != 0) && (limit != 0)){ + sql.append(" ) T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + }else { + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + } +// System.out.println(sql.toString()); + return sql.toString(); + } + + //查询每天的用量 + public String getDayEnergyCount(String buildingId,String startDate,String endDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from energy_Month " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + }else{ + sql.append(" AND building_id <>'所有' "); + } + if (startDate != null && !startDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)>=#{startDate} "); + } + if (endDate != null && !endDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)<=#{endDate} "); + } + if (buildingId.equals("所有")){ + sql.append(" ) T"); + }else { + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + } + System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/MaintainInfoProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/MaintainInfoProvider.java new file mode 100644 index 0000000..ec78c17 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/MaintainInfoProvider.java @@ -0,0 +1,52 @@ +package com.mh.user.mapper.provider; + +public class MaintainInfoProvider { + + public String queryMaintainInfo(String curDate,String buildingId,String deviceType, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from maintain_info " + + " where 1=1 "); + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)=#{curDate} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + + System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String getMaintainInfoCount(String curDate,String buildingId,String deviceType,int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from maintain_info " + + " where 1=1 "); + if (deviceType != null && !deviceType.equals("")){ + sql.append(" AND device_type = #{deviceType} "); + } + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (curDate != null && !curDate.equals("")) { + sql.append(" AND convert(varchar(10),cur_date,121)=#{curDate} "); + } + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + + System.out.println(sql.toString()); + return sql.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/MeterInfoProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/MeterInfoProvider.java new file mode 100644 index 0000000..1b14639 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/MeterInfoProvider.java @@ -0,0 +1,20 @@ +package com.mh.user.mapper.provider; + +public class MeterInfoProvider { + + public String queryMeterInfo(String systemID,String projectID){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from meter_info " + + " where 1=1 "); + if (systemID != null && !systemID.equals("")){ + sql.append(" AND system_id = #{systemID} "); + } + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + sql.append(" ) T "); + System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/StrategyInfoProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/StrategyInfoProvider.java new file mode 100644 index 0000000..9a3a73f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/StrategyInfoProvider.java @@ -0,0 +1,21 @@ +package com.mh.user.mapper.provider; + + +public class StrategyInfoProvider { + + public String queryStrategyInfo(String systemID,String projectID){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from strategy_info " + + " where 1=1 "); + if (systemID != null && !systemID.equals("")){ + sql.append(" AND system_id = #{systemID} "); + } + if (projectID != null && !projectID.equals("")){ + sql.append(" AND project_id = #{projectID} "); + } + sql.append(" ) T "); + System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/SysLogProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/SysLogProvider.java new file mode 100644 index 0000000..619db33 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/SysLogProvider.java @@ -0,0 +1,37 @@ +package com.mh.user.mapper.provider; + +public class SysLogProvider { + + public String findLogs(String userName, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from sys_log " + + " where 1=1 "); + if (userName != null && !userName.equals("")){ + sql.append(" AND user_name = #{userName} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String findCount(String userName, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from sys_log " + + " where 1=1 "); + if (userName != null && !userName.equals("")){ + sql.append(" AND user_name = #{userName} "); + } + + sql.append(" ) T "); + + System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/SysRoleProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/SysRoleProvider.java new file mode 100644 index 0000000..7690dc7 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/SysRoleProvider.java @@ -0,0 +1,33 @@ +package com.mh.user.mapper.provider; + +public class SysRoleProvider { + public String queryRoles(String roleName, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (select *,ROW_NUMBER() over(order by id) as rn from sys_role where 1=1 "); + if (roleName != null && !roleName.equals("")){ + sql.append(" AND role_name = #{roleName} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + System.out.println(sql.toString()); + return sql.toString(); + } + + public String getCount(String roleName, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (select *,ROW_NUMBER() over(order by id) as rn from sys_role where 1=1 "); + if (roleName != null && !roleName.equals("")){ + sql.append(" AND role_name = #{roleName} "); + } + sql.append(" ) T "); + + System.out.println(sql.toString()); + return sql.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/SysUserProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/SysUserProvider.java new file mode 100644 index 0000000..e3ffbb4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/SysUserProvider.java @@ -0,0 +1,38 @@ +package com.mh.user.mapper.provider; + +public class SysUserProvider { + + public String queryUsers(String userName, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from (select t1.*,t3.role_name from sys_user t1 " + + " join sys_user_role t2 on t1.id=t2.user_id join sys_role t3 on t2.role_id=t3.id)T where 1=1 "); + if (userName != null && !userName.equals("")){ + sql.append(" AND T.user_name = #{userName} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) TT where TT.rn>(#{page}-1)*#{limit} and TT.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) TT "); + } + System.out.println(sql.toString()); + return sql.toString(); + } + + public String getCount(String userName, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from (select t1.*,t3.role_name from sys_user t1 " + + " join sys_user_role t2 on t1.id=t2.user_id join sys_role t3 on t2.role_id=t3.id)T where 1=1 "); + if (userName != null && !userName.equals("")){ + sql.append(" AND T.user_name = #{userName} "); + } + sql.append(" ) TT "); + + System.out.println(sql.toString()); + return sql.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/mapper/provider/UseForecastProvider.java b/user-service/src/main/java/com/mh/user/mapper/provider/UseForecastProvider.java new file mode 100644 index 0000000..68845ed --- /dev/null +++ b/user-service/src/main/java/com/mh/user/mapper/provider/UseForecastProvider.java @@ -0,0 +1,48 @@ +package com.mh.user.mapper.provider; + +public class UseForecastProvider { + + public String queryUseForecast(String buildingId,String tankId,String curDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select * from (" + + " select *,ROW_NUMBER() over(order by id) as rn from use_forecast " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (tankId != null && !tankId.equals("")){ + sql.append(" AND tank_id = #{tankId} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + if ((page != 0) && (limit != 0)){ + sql.append(" ) T join building T1 ON T.building_id=T1.id where T.rn>(#{page}-1)*#{limit} and T.rn<=#{page}*#{limit}"); + } else if (page == 0){ + sql.append(" ) T "); + } + System.out.println(sql.toString()); + return sql.toString(); + } + + //查询记录数 + public String getCount(String buildingId,String tankId,String curDate, int page, int limit){ + StringBuffer sql = new StringBuffer(""); + sql.append("select count(*) from (" + + " select *,ROW_NUMBER() over(order by id) as rn from use_forecast " + + " where 1=1 "); + if (buildingId != null && !buildingId.equals("")){ + sql.append(" AND building_id = #{buildingId} "); + } + if (tankId != null && !tankId.equals("")){ + sql.append(" AND tank_id = #{tankId} "); + } + if (curDate!= null && !curDate.equals("")) { + sql.append(" AND LEFT(cur_date,10)=#{curDate} "); + } + sql.append(" ) T join building T1 ON T.building_id=T1.id "); + + System.out.println(sql.toString()); + return sql.toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/model/BaseModel.java b/user-service/src/main/java/com/mh/user/model/BaseModel.java new file mode 100644 index 0000000..dd0da01 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/BaseModel.java @@ -0,0 +1,37 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +/** + * 基础模型 + * @author ljf + * @date 2020-04-25 + */ +@Setter +@Getter +public class BaseModel { + + private Long id; + + private String createBy; + + private Date createTime; + + private String lastUpdateBy; + + private Date lastUpdateTime; + + @Override + public String toString() { + return "BaseModel{" + + "id=" + id + + ", createBy='" + createBy + '\'' + + ", createTime=" + createTime + + ", lastUpdateBy='" + lastUpdateBy + '\'' + + ", lastUpdateTime=" + lastUpdateTime + + '}'; + } +} diff --git a/user-service/src/main/java/com/mh/user/model/BuildingModel.java b/user-service/src/main/java/com/mh/user/model/BuildingModel.java new file mode 100644 index 0000000..99b8912 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/BuildingModel.java @@ -0,0 +1,10 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class BuildingModel { + + private Long buildingId; + private String buildingName; +} diff --git a/user-service/src/main/java/com/mh/user/model/ChillerModel.java b/user-service/src/main/java/com/mh/user/model/ChillerModel.java new file mode 100644 index 0000000..8291fce --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/ChillerModel.java @@ -0,0 +1,28 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class ChillerModel { + + private String deviceAddr; //设备编号 + private String deviceName; //设备名称 + private String runState; //运行状态 + private String setPoint; //设定点温度 + private String enterChw; //冷藏水进水温度 + private String leaveChw; //冷藏水出水温度 + private String enterCow; //冷冻水进水温度 + private String leaveCow; //冷冻水出水温度 + private String power; //电功率 + private String ratedPower; //额定电功率 + private String chillerAmps; //电流量 + private String refrigeration; //制冷量 + private String ratedRef; //额定制冷量 + private String chwFlow; //水流率 + private String ApproachCow; //冷凝器趋近温度 + private String ApproachChw; //蒸发器趋近温度 + private String cop; //cop + private String ratedCop; //额定cop + private String copyDate; //采集时间 + +} diff --git a/user-service/src/main/java/com/mh/user/model/DeviceModel.java b/user-service/src/main/java/com/mh/user/model/DeviceModel.java new file mode 100644 index 0000000..bd13cf8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/DeviceModel.java @@ -0,0 +1,10 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class DeviceModel { + + private String deviceAddr;//通讯号 + private String deviceName;//设备名称 +} diff --git a/user-service/src/main/java/com/mh/user/model/DeviceTypeModel.java b/user-service/src/main/java/com/mh/user/model/DeviceTypeModel.java new file mode 100644 index 0000000..bf403da --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/DeviceTypeModel.java @@ -0,0 +1,9 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class DeviceTypeModel { + private String code; + private String des; +} diff --git a/user-service/src/main/java/com/mh/user/model/EnergyModel.java b/user-service/src/main/java/com/mh/user/model/EnergyModel.java new file mode 100644 index 0000000..e00e112 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/EnergyModel.java @@ -0,0 +1,16 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class EnergyModel { + + private String projectID; + private String startDate; + private String endDate; + private int queryType; + private int type; + private int page; + private int limit; + +} diff --git a/user-service/src/main/java/com/mh/user/model/EnergyParam.java b/user-service/src/main/java/com/mh/user/model/EnergyParam.java new file mode 100644 index 0000000..5613cb8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/EnergyParam.java @@ -0,0 +1,17 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class EnergyParam { + + private String projectID; + private String buildingId; + private String startDate; + private String endDate; + private int queryType; + private int page; + private int limit; + private int type; + +} diff --git a/user-service/src/main/java/com/mh/user/model/OrderParamModel.java b/user-service/src/main/java/com/mh/user/model/OrderParamModel.java new file mode 100644 index 0000000..7162725 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/OrderParamModel.java @@ -0,0 +1,17 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class OrderParamModel { + + private String dataPort; //串口或者端口 + private String deviceAddr; //通讯地址 + private String deviceType; //设备类型 + private int baudRate; //波特率 + private String brand; //品牌 + private String funCode; //功能码 + private String registerAddr; //寄存器地址 + private String dataValue; //传入值 + +} diff --git a/user-service/src/main/java/com/mh/user/model/QueueParam.java b/user-service/src/main/java/com/mh/user/model/QueueParam.java new file mode 100644 index 0000000..e5cf98f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/QueueParam.java @@ -0,0 +1,13 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class QueueParam { + + private String recData; + private String deviceType; + private String registerAddr; + private String projectID; + private String copyTime; +} diff --git a/user-service/src/main/java/com/mh/user/model/SerialPortModel.java b/user-service/src/main/java/com/mh/user/model/SerialPortModel.java new file mode 100644 index 0000000..ada73c2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SerialPortModel.java @@ -0,0 +1,13 @@ +package com.mh.user.model; + +import lombok.Data; + +@Data +public class SerialPortModel { + + private String buildingId; + private String deviceAddr; + private String deviceType; + private String param; + private String dataValue; +} diff --git a/user-service/src/main/java/com/mh/user/model/SysDept.java b/user-service/src/main/java/com/mh/user/model/SysDept.java new file mode 100644 index 0000000..744760c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysDept.java @@ -0,0 +1,27 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +public class SysDept extends BaseModel { + + private String name; + + private Long parentId; + + private Integer orderNum; + + private Byte delFlag; + + private List children; + + // 非数据库字段 + private String parentName; + // 非数据库字段 + private Integer level; + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/model/SysDict.java b/user-service/src/main/java/com/mh/user/model/SysDict.java new file mode 100644 index 0000000..a99cbd6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysDict.java @@ -0,0 +1,24 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class SysDict extends BaseModel { + + private String value; + + private String label; + + private String type; + + private String description; + + private Long sort; + + private String remarks; + + private Byte delFlag; + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/model/SysLog.java b/user-service/src/main/java/com/mh/user/model/SysLog.java new file mode 100644 index 0000000..441970c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysLog.java @@ -0,0 +1,30 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Setter +@Getter +public class SysLog extends BaseModel { + + private String userName; + + private String operation; + + private String method; + + private String params; + + private Long time; + + private String ip; + + private Date loginTime; + + private String loginState; + + private String optDesc; + +} diff --git a/user-service/src/main/java/com/mh/user/model/SysMenu.java b/user-service/src/main/java/com/mh/user/model/SysMenu.java new file mode 100644 index 0000000..4aed68b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysMenu.java @@ -0,0 +1,36 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +public class SysMenu extends BaseModel { + + private Long parentId; + + private String title; + + private String menu_name; + + private String component; + + private String path; + + private Integer menuType; + + private String icon; + + private Integer orderNum; + + private String systemID; + // 非数据库字段 + private String parentTitle; + // 非数据库字段 + private Integer level; + // 非数据库字段 + private List children; + +} diff --git a/user-service/src/main/java/com/mh/user/model/SysRole.java b/user-service/src/main/java/com/mh/user/model/SysRole.java new file mode 100644 index 0000000..4fdaf82 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysRole.java @@ -0,0 +1,16 @@ +package com.mh.user.model; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Data +public class SysRole extends BaseModel { + + private String name; + + private String remark; + + private Byte delFlag; + +} diff --git a/user-service/src/main/java/com/mh/user/model/SysRoleDept.java b/user-service/src/main/java/com/mh/user/model/SysRoleDept.java new file mode 100644 index 0000000..a54db5d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysRoleDept.java @@ -0,0 +1,14 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class SysRoleDept extends BaseModel { + + private Long roleId; + + private Long deptId; + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/model/SysRoleMenu.java b/user-service/src/main/java/com/mh/user/model/SysRoleMenu.java new file mode 100644 index 0000000..c33b0e2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysRoleMenu.java @@ -0,0 +1,14 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class SysRoleMenu extends BaseModel { + + private Long roleId; + + private Long menuId; + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/model/SysUser.java b/user-service/src/main/java/com/mh/user/model/SysUser.java new file mode 100644 index 0000000..5f21fad --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysUser.java @@ -0,0 +1,41 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Setter +@Getter +public class SysUser extends BaseModel { + + private String userName; + + private String password; + + private String salt; + + private String email; + + private String mobile; + + private Byte status; + + private Long deptId; + + private String deptName; + + private Byte delFlag; + + private String roleNames; + + private Date loginTime; + + private String systemID; + + private List userRoles = new ArrayList<>(); + + +} diff --git a/user-service/src/main/java/com/mh/user/model/SysUserRole.java b/user-service/src/main/java/com/mh/user/model/SysUserRole.java new file mode 100644 index 0000000..f40eaa4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/SysUserRole.java @@ -0,0 +1,14 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class SysUserRole extends BaseModel { + + private Long userId; + + private Long roleId; + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/netty/ClientManage.java b/user-service/src/main/java/com/mh/user/netty/ClientManage.java new file mode 100644 index 0000000..ea5fbe6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/ClientManage.java @@ -0,0 +1,169 @@ +package com.mh.user.netty; + +import com.github.benmanes.caffeine.cache.Cache; +import com.mh.user.utils.SpringContextUtils; +import io.netty.channel.ChannelHandlerContext; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : 管理客户端信息:连接数、连接时创建的对象、连接时创建的报文 + * @updateTime 2021-01-19 + * @throws : + */ +@Slf4j +public class ClientManage { + + // 创建一个map容器,管理连接的客户端 + public static Map clientMap = new HashMap<>(); + // 创建一个map容器,管理创建的对象 + public static Map echoServerHandlerMap = new HashMap<>(); + // 创建一个容器,管理生成的报文 + public static Map> orderList = new HashMap<>(); + + ApplicationContext applicationContext = SpringContextUtils.getApplicationContext(); + Cache cache = (Cache) applicationContext.getBean("caffeineCache"); + + private static ClientManage instance = null; + + // 创建一个私有的构造函数 + private ClientManage(){} + + // 创建 + public static ClientManage getInstance() { + if (null == instance) { + return new ClientManage(); + } else { + return instance; + } + } + + /** + * 保存指令 + * @param DTUId + * @param list + */ + public void saveOrderMap(String DTUId, List list) { + try { + if (cache.getIfPresent(DTUId) != null) { + log.info("==> 已存在报文"); + } else { + cache.put(DTUId, list); + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /** + * 删除map中的指令 + * @param list + */ + public void removeOrderMap(String DTUId, List list) { + // 从缓存中删除 + cache.asMap().remove(DTUId, list); + } + + public void saveEchoServerHandlerMap(String DTUId, EchoServerHandler echoServerHandler) { + try { + if (echoServerHandlerMap.get(DTUId) != null && echoServerHandlerMap.get(DTUId).equals(echoServerHandler)) { + // TODO 已存在 + log.info("==> 已存在报文"); + } else { + //如果map中没有此ctx 将连接存入map中 + echoServerHandlerMap.put(DTUId, echoServerHandler); + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /** + * 删除map中ChannelHandlerContext + */ + public void removeEchoServerHandlerMap(EchoServerHandler echoServerHandler) { + for (String key : echoServerHandlerMap.keySet()) { + if (echoServerHandlerMap.get(key) != null && echoServerHandlerMap.get(key).equals(echoServerHandler)) { + echoServerHandlerMap.remove(key); + } + } + } + + public void saveChannelMap(String DTUId, ChannelHandlerContext ctx) { + try { + if (ClientManage.clientMap.get(DTUId) != null && ClientManage.clientMap.get(DTUId).equals(ctx)) { + // TODO 已存在 + log.info("==> 已存在报文"); + } else { + //如果map中没有此ctx 将连接存入map中 + ClientManage.clientMap.put(DTUId, ctx); + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /** + * 删除map中ChannelHandlerContext + */ + public void removeChannelMap(ChannelHandlerContext ctx) { + for (String key : ClientManage.clientMap.keySet()) { + if (ClientManage.clientMap.get(key) != null && ClientManage.clientMap.get(key).equals(ctx)) { + ClientManage.clientMap.remove(key); + } + } + } + + // 通过反射修改一个实例的私有属性值 +// public void updateInstanceAttribute(ReceiveCommandDto receiveCommandDto, DTUServiceImpl dtuService) { +// try { +// EchoServerHandler echoServerHandler = echoServerHandlerMap.get(receiveCommandDto.getGatewayId()); +// Class aClass = echoServerHandler.getClass(); +// +// //获取方法对象 +// Method getTestMethod1 = aClass.getDeclaredMethod("isSendCommand"); +// //执行方法 +// Object invoke1 = getTestMethod1.invoke(echoServerHandler); +// log.info("==> 修改前的对象地址==>" + echoServerHandler.hashCode() + " 修改前的状态==>" + invoke1); +// +// //获取属性对象 +// Field sendCommand = aClass.getDeclaredField("sendCommand"); +// //修改属性值 +// sendCommand.setAccessible(true); +// sendCommand.set(echoServerHandler,true); +// +// //获取属性对象 +// Field callback = aClass.getDeclaredField("dtuServiceImpl"); +// //修改属性值 +// callback.setAccessible(true); +// callback.set(echoServerHandler,dtuService); +// +//// String sendStr = ""; +// //获取属性对象 +// Field sendStrField = aClass.getDeclaredField("sendList"); +// //修改属性值 +// sendStrField.setAccessible(true); +// sendStrField.set(echoServerHandler,receiveCommandDto.getOrderList()); +// //获取方法对象 +// Method getTestMethod = aClass.getDeclaredMethod("isSendCommand"); +// //执行方法 +// Object invoke = getTestMethod.invoke(echoServerHandler); +// log.info("==> 修改后的对象地址==>" + echoServerHandler.hashCode() + " 修改后的状态==>" + invoke); +// } catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { +// e.printStackTrace(); +// } +// } + +} diff --git a/user-service/src/main/java/com/mh/user/netty/EchoServer.java b/user-service/src/main/java/com/mh/user/netty/EchoServer.java new file mode 100644 index 0000000..2acfac5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/EchoServer.java @@ -0,0 +1,52 @@ +package com.mh.user.netty; + +import com.mh.user.UserServiceApplication; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelOption; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import lombok.extern.slf4j.Slf4j; +import org.apache.log4j.Logger; + +public class EchoServer { + + private final int port; + private static final Logger log = Logger.getLogger(EchoServer.class); + + public EchoServer(int port) { + this.port = port; + } + + public static void main(String[] args) { + +// new EchoServer(8090).start(); // 调用服务器的start方法 + } + + public void start() { + // 创建Even-LoopGroup + NioEventLoopGroup bossGroup = new NioEventLoopGroup(); // bossGroup 用于监听客户端连接,专门负责与客户端创建连接,并把连接注册到workerGroup的Selector中。 + NioEventLoopGroup workerGroup = new NioEventLoopGroup(); // workerGroup用于处理每一个连接发生的读写事件。 + try { + ServerBootstrap serverBootstrap = new ServerBootstrap(); // 2、创建Server-Bootstrap + serverBootstrap.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) // 3、指定所使用的NIO传输Channel + .localAddress(port) // 4、指定端口设置套接字 + .option(ChannelOption.SO_BACKLOG, 1204) + .childHandler(new ServerChannelInitializer()); + ChannelFuture channelFuture = serverBootstrap.bind().sync(); // 6、异步绑定服务器;调用sync()方法,阻塞式等待,直到绑定完成 + log.info("服务器启动开始监听端口:"+port); + channelFuture.channel().closeFuture().sync(); // 7、获取Channel的closeFuture,并且阻塞当前线程,直到它完成 + + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + try { + bossGroup.shutdownGracefully().sync(); // 8、关闭EventLoopGroup,关闭所有的资源 + workerGroup.shutdownGracefully().sync(); // 关闭 + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} diff --git a/user-service/src/main/java/com/mh/user/netty/EchoServerHandler.java b/user-service/src/main/java/com/mh/user/netty/EchoServerHandler.java new file mode 100644 index 0000000..ccf6b3b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/EchoServerHandler.java @@ -0,0 +1,575 @@ +package com.mh.user.netty; + +import com.alibaba.fastjson.JSONObject; +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.model.QueueParam; +import com.mh.user.serialport.SerialPortSendReceive; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.chillers.GatewayManageService; +import com.mh.user.utils.*; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; +import io.netty.util.ReferenceCountUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.log4j.Logger; +import org.springframework.context.ApplicationContext; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; + +public class EchoServerHandler extends ChannelInboundHandlerAdapter { + + private StringBuilder stringBuilder = new StringBuilder(); + private HeartUtil heartUtil = HeartUtil.getInstance(); + private boolean sendCommand = false; + private String sendStr; + private List sendList; + List deviceCodeParamList; + private static final Logger log = Logger.getLogger(EchoServerHandler.class); + // 返回发送指令的状态方法 + public boolean isSendCommand() { + return sendCommand; + } + + public void setSendCommand(boolean sendCommand) { + this.sendCommand = sendCommand; + } + + public String getSendStr() { + return sendStr; + } + + public void setSendStr(String sendStr) { + this.sendStr = sendStr; + } + + public List getSendList() { + return sendList; + } + + public void setSendList(List sendList) { + this.sendList = sendList; + } + + // 调用service层的接口信息 + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); + GatewayManageService gatewayManageService = context.getBean(GatewayManageService.class); + QueueParam queueParam=new QueueParam(); + /** + * 空闲次数 + */ + private int idleCount = 1; + private int count = 0; + private List orderList; + private int num = 0; + private int size = 0; + private int sendNum = 0; + private EchoServerHandler echoServerHandler; // 当前类的hashCode值 + private String IP; + private String port; + private String receiveStr=""; + + public EchoServerHandler() { + echoServerHandler = this; + } + /** + * 客户端连接会触发 + */ + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.info("Channel active......"); + } + + /** + * 超时处理 + * 如果120秒没有接受客户端的心跳,就触发; + * 如果超过3次,则直接关闭; + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception { + if (obj instanceof IdleStateEvent) { + IdleStateEvent event = (IdleStateEvent) obj; + if (IdleState.READER_IDLE.equals(event.state())) { //如果读通道处于空闲状态,说明没有接收到心跳命令 + System.out.println("第" + idleCount + "已经10秒没有接收到客户端的信息了"); + receiveStr =""; + num = num + 1; + if (num > size - 1) { + num = 0; + // 关闭连接 + ctx.close(); + // 继续发送下一个采集指令 +// SendOrderUtils.sendAllOrder(deviceCodeParamList.get(num),ctx,num,size); + } else { + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder(deviceCodeParamList.get(num),ctx,num,size); + } + } + } else { + super.userEventTriggered(ctx, obj); + } + } + + // 对于每一个传入的消息都要被调用 + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) { + try { + //接收到服务端发来的数据进行业务处理 + ByteBuf buf = (ByteBuf) msg; + byte[] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + buf.clear(); + // 截取IP地址 + IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", "/", ":"); + // 截取端口号 + port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", ":", ""); + if (bytes.length <= 1024) { + //将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + receiveStr = receiveStr.replace("null", ""); //去null + receiveStr = receiveStr.replace(" ", ""); //去空格 + //log.info("channelRead接收到的数据:" + receiveStr + ",length:" + receiveStr.length()); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + ReferenceCountUtil.release(msg); + } + } + + // 当前批量读取中的最后一条消息 + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception{ + //心跳包报文: 24 00 60 95 + receiveStr= receiveStr.toUpperCase();//返回值全部变成大写 + //截取去掉FE + if (receiveStr.length()>8){ + String str1=receiveStr.substring(0,8); + String str2=receiveStr.substring(8); + receiveStr=str1.replace("FE", "")+str2; + }else{ + receiveStr = receiveStr.replace("FE", ""); + } + //log.info("channelReadComplete接收到的数据: ===> " + receiveStr+",长度:"+receiveStr.length()); + log.info("channelReadComplete接收到的数据长度: ===> "+receiveStr.length()); + //心跳包处理 + if ((count == 0) && (receiveStr.length() == 8) && receiveStr.substring(0, 2).equals("24")) { + log.info("接收到心跳包 ===> " + receiveStr); + idleCount = 1; + count = 1; + port=receiveStr.substring(4,8);//心跳包包含网关端口(自己定义返回心跳包) + // 清空receiveStr + receiveStr = ""; + // 更新对应的网关在线情况 + gatewayManageService.updateGatewayManage2(port); + //根据端口或者IP或者心跳包查询网关对应的项目名称 + String projectName=gatewayManageService.selectProjectName(port); + log.info("---------------------"+projectName+"项目网关上线---------------------"); + // 生成采集指令 + deviceCodeParamList = deviceCodeParamService.queryCodeParam(port); //心跳包包含网关端口(自己定义返回心跳包) + size = deviceCodeParamList.size(); + log.info("deviceCodeParam size ===> " + size); + num = 0; + // 发送采集报文 + if (size>0) { + if (idleCount<2){ + Thread.sleep(200); + SendOrderUtils.sendAllOrder(deviceCodeParamList.get(num),ctx,num,size); + idleCount++; + }else{ + System.out.println("close this channel!"); + ctx.channel().close(); + } + }else{ + log.info("gateway not find deviceCodeParam!" ); + } + } else if (receiveStr.length() == 36 || receiveStr.length() == 40 || receiveStr.length() == 44 || receiveStr.length() == 50) { + //电表返回数据解析 + idleCount=1; +// log.info("meter receive message ===> " + receiveStr+",length:"+receiveStr.length()); + log.info("电表接收===> " + receiveStr+",长度:"+receiveStr.length()); + //解析采集的报文,并保存到数据库 + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + analysisReceiveOrder485.analysisMeterOrder485(receiveStr,deviceCodeParamList.get(num)); + //清空receiveStr + receiveStr = ""; + //判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { + num = 0; + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder(deviceCodeParamList.get(num),ctx,num,size); + System.out.println("------一轮采集完成,继续下一轮--------"); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder(deviceCodeParamList.get(num),ctx,num,size); + } + } + } else if (receiveStr.length() == 18) { + //冷量计返回数据解析 + idleCount=1; +// log.info("cloud receive message ===>" + receiveStr+",length:"+receiveStr.length()); + log.info("冷量计接收==>" + receiveStr+",长度:"+receiveStr.length()); + // 解析采集的报文,并保存到数据库 + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + analysisReceiveOrder485.analysisCloudOrder485(receiveStr,deviceCodeParamList.get(num) ); + // 清空receiveStr + receiveStr = ""; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { + num = 0; + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder(deviceCodeParamList.get(num),ctx,num,size); + System.out.println("------一轮采集完成,继续下一轮--------"); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder(deviceCodeParamList.get(num),ctx,num,size); + } + } + }else if (receiveStr.length() == 12 || receiveStr.length() == 14) { + //冷水机返回数据解析 + idleCount=1; +// log.info("chiller receive message ===>" + receiveStr+",length:"+receiveStr.length()); + log.info("冷水机接收===>" + receiveStr+",长度:"+receiveStr.length()); + // 解析采集的报文,并保存到数据库 + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + analysisReceiveOrder485.analysisChillerOrder485(receiveStr,deviceCodeParamList.get(0)); + // 清空receiveStr + receiveStr = ""; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { + num = 0; + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder(deviceCodeParamList.get(num),ctx,num,size); + System.out.println("------一轮采集完成,继续下一轮--------"); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder(deviceCodeParamList.get(num),ctx,num,size); + } + } + } else if (receiveStr.length() > 50 && receiveStr.length() < 100) { + idleCount=1; + // 清空receiveStr + receiveStr = null; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { + num = 0; + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder(deviceCodeParamList.get(num),ctx,num,size); + System.out.println("------一轮采集完成,继续下一轮--------"); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder(deviceCodeParamList.get(num),ctx,num,size); + } + } + }else if (receiveStr.length() >= 100 ){ + if (receiveStr.substring(0,2).equalsIgnoreCase("2b") && receiveStr.substring(6,8).equalsIgnoreCase("7b")){ + receiveStr=receiveStr.substring(6); + } + receiveStr=ExchangeStringUtil.hexStringToString(receiveStr) ; +// log.info("white gateway receive message ===> " + receiveStr); + log.info("白色网关接收===> " + receiveStr); + JSONObject jsonObject = JSONObject.parseObject(receiveStr); + receiveStr=""; + port=jsonObject.getString("snr"); //网关ID,从心跳包中获得 + IP=jsonObject.getString("ip"); //ip + String cmd=jsonObject.getString("cmd"); //指令模式dHeartbeat(心跳包),data(主动采集返回),reword + String name=jsonObject.getString("name"); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String time = sdf1.format(date); + if(cmd.equals("dHeartbeat")){ + JSONObject jsonHeart=new JSONObject(); + jsonHeart.put("snr",port); + jsonHeart.put("cmd","uHeartbeat"); + jsonHeart.put("recordCheckTime","30"); + jsonHeart.put("keepAliveTime","50"); //通讯保持在线间隔,秒80 + jsonHeart.put("resetTime","23:59:59"); + jsonHeart.put("ip",IP); + jsonHeart.put("time",time); + jsonHeart.put("name",name); + jsonHeart.put("heartInterval","20");//网关发起心跳包的时间间隔,秒70 + jsonHeart.put("recordMode","cover"); +// String sendStr=jsonHeart.toJSONString(); + String sendStr=jsonHeart.toString(); +// log.info("white gateway reply dHeartbeat ===>" + sendStr); + log.info("白色网关回复收到心跳包===>" + sendStr); + sendStr=ExchangeStringUtil.strTo16(sendStr); + ByteBuf buffer = ExchangeStringUtil.getByteBuf(ctx, sendStr); + Thread.sleep(200); + ctx.channel().writeAndFlush(buffer); //发送数据 +// ctx.channel().writeAndFlush(sendStr); +// ctx.channel().writeAndFlush(jsonHeart); + // 更新对应的网关在线情况 + gatewayManageService.updateGatewayManage2(port); + // 生成采集指令 + deviceCodeParamList = deviceCodeParamService.queryCodeParam(port); //心跳包包含网关端口(自己定义返回心跳包) + size = deviceCodeParamList.size(); +// log.info("white gateway receive message size ===> " + size); + log.info("白色网关接收长度===> " + size); + num = 0; + // 发送采集报文 + if (size>0) { + if (idleCount<2){ + Thread.sleep(200); + SendOrderUtils.sendAllOrder2(deviceCodeParamList.get(num),ctx,port,IP,num,size); + idleCount++; + }else{ + System.out.println("close this channel!"); + ctx.channel().close(); + } + }else{ + log.info("white gateway not find deviceCodeParam!" ); + } + }else{ + idleCount=1; + String data=jsonObject.getString("data"); + String strHex=ExchangeStringUtil.base64ToHex(data); + //返回值全部变成大写 + strHex= strHex.toUpperCase(); + //截取去掉FE + String dataStr; + if (strHex.length()>8){ + String str1=strHex.substring(0,8); + String str2=strHex.substring(8); + dataStr=str1.replace("FE", "")+str2; + }else{ + dataStr = strHex.replace("FE", ""); + } + if (dataStr.length() == 36 || dataStr.length() == 40 || dataStr.length() == 44 || dataStr.length() == 50){ +// log.info("white gateway meter receive message ===>" + dataStr); + log.info("白色网关电表接收===>" + dataStr); + //deviceCodeParamList = deviceCodeParamService.queryCodeParam("2019060600007"); //心跳包包含网关端口(自己定义返回心跳包) + // 解析采集的报文,并保存到数据库 + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + analysisReceiveOrder485.analysisMeterOrder485(dataStr,deviceCodeParamList.get(num)); //电表报文解析 +// try{ +// queueParam.setDeviceType(deviceCodeParamList.get(num).getDeviceType()); +// queueParam.setProjectID(deviceCodeParamList.get(num).getProjectID()); +// queueParam.setRegisterAddr(deviceCodeParamList.get(num).getRegisterAddr()); +// queueParam.setRecData(dataStr); +// queueParam.setCopyTime(time); +// analysisReceiveOrder485.sendQueue(queueParam); //发送到队列 +// log.info("发送消息到队列!!"); +// }catch (Exception e){ +// e.printStackTrace(); +// } + // 清空dataStr + dataStr = ""; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { +// for (int j=0;j<100;j++){ +// Thread.sleep(1000); +// Date date2=new Date(); +// System.out.println("------时间--------"+sdf1.format(date2)); +// if (ExchangeStringUtil.isInDate(date2,"00:00:00","00:00:05")==true || +// ExchangeStringUtil.isInDate(date2,"00:00:20","00:00:25")==true || +// ExchangeStringUtil.isInDate(date2,"00:00:40","00:00:45")==true) { +// System.out.println("------时间跳出--------"+sdf1.format(date2)); +// break; +// } +// } + num = 0; + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder2(deviceCodeParamList.get(num),ctx,port,IP,num,size); + System.out.println("------一轮采集完成,继续下一轮--------"); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + dataStr = null; + ctx.close(); + } else { + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder2(deviceCodeParamList.get(num),ctx,port,IP,num,size); + } + } + }else if(dataStr.length() == 12 || dataStr.length() == 14){ +// log.info("white gateway chiller receive message ===>" + dataStr); + log.info("白色网关冷水机接收===>" + dataStr); + // 解析采集的报文,并保存到数据库 + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + analysisReceiveOrder485.analysisChillerOrder485(dataStr,deviceCodeParamList.get(0)); + // 清空dataStr + dataStr = ""; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { +// for (int j=0;j<100;j++){ +// Thread.sleep(1000); +// Date date2=new Date(); +// System.out.println("------时间--------"+sdf1.format(date2)); +// if (ExchangeStringUtil.isInDate(date2,"00:00:00","00:00:05")==true || +// ExchangeStringUtil.isInDate(date2,"00:00:20","00:00:25")==true || +// ExchangeStringUtil.isInDate(date2,"00:00:40","00:00:45")==true) { +// System.out.println("------时间跳出--------"+sdf1.format(date2)); +// break; +// } +// } + num = 0; + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder2(deviceCodeParamList.get(num),ctx,port,IP,num,size); + System.out.println("------一轮采集完成,继续下一轮--------"); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + log.info("not send code and close collection!"); + num = 0; + // 关闭连接 + dataStr = null; + ctx.close(); + } else { + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder2(deviceCodeParamList.get(num),ctx,port,IP,num,size); + } + } + }else if(dataStr.length() == 18){ +// log.info("white gateway cloud receive message ===> " + dataStr); + log.info("白色网关冷量计接收===> " + dataStr); + // 解析采集的报文,并保存到数据库 + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); //冷量机报文解析 + analysisReceiveOrder485.analysisCloudOrder485(dataStr,deviceCodeParamList.get(num) ); +// try{ +// queueParam.setDeviceType(deviceCodeParamList.get(num).getDeviceType()); +// queueParam.setProjectID(deviceCodeParamList.get(num).getProjectID()); +// queueParam.setRegisterAddr(deviceCodeParamList.get(num).getRegisterAddr()); +// queueParam.setRecData(dataStr); +// queueParam.setCopyTime(time); +// analysisReceiveOrder485.sendQueue(queueParam); //发送到队列 +// }catch (Exception e){ +// e.printStackTrace(); +// } + // 清空dataStr + dataStr = ""; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { +// for (int j=0;j<100;j++){ +// Thread.sleep(1000); +// Date date2=new Date(); +// System.out.println("------时间--------"+sdf1.format(date2)); +// if (ExchangeStringUtil.isInDate(date2,"00:00:00","00:00:05")==true || +// ExchangeStringUtil.isInDate(date2,"00:00:20","00:00:25")==true || +// ExchangeStringUtil.isInDate(date2,"00:00:40","00:00:45")==true) { +// +// System.out.println("------时间跳出--------"+sdf1.format(date2)); +// break; +// } +// } + num = 0; + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder2(deviceCodeParamList.get(num),ctx,port,IP,num,size); + System.out.println("------一轮采集完成,继续下一轮--------"); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + log.info("not send code and close collection!"); + num = 0; + // 关闭连接 + dataStr = null; + ctx.close(); + } else { + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder2(deviceCodeParamList.get(num),ctx,port,IP,num,size); + } + } + }else { //if(dataStr.length() > 50) + // 清空dataStr + dataStr = null; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { + num = 0; + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder2(deviceCodeParamList.get(num),ctx,port,IP,num,size); + System.out.println("------一轮采集完成,继续下一轮--------"); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + dataStr = null; + ctx.close(); + } else { + Thread.sleep(200); + // 继续发送下一个采集指令 + SendOrderUtils.sendAllOrder2(deviceCodeParamList.get(num),ctx,port,IP,num,size); + } + } + } + } + } + ctx.flush(); + } + + // 异常捕捉 + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + //cause.printStackTrace(); // 打印异常 + ctx.close(); // 关闭该Channel + log.info("异常捕捉,执行ctx.close()......"); + } + + // 客户端断开 + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + //super.channelInactive(ctx); + ctx.close();// 关闭流 + log.info("客户端断开,执行ctx.close()......"); + } + +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyChillerClient.java b/user-service/src/main/java/com/mh/user/netty/NettyChillerClient.java new file mode 100644 index 0000000..fc27b03 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyChillerClient.java @@ -0,0 +1,95 @@ +package com.mh.user.netty; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.handler.timeout.ReadTimeoutHandler; +import io.netty.handler.timeout.WriteTimeoutHandler; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.TimeUnit; + +/** + * @author ljf + * @title : + * @description :Netty冷水机组客户端 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +@Setter +@Getter +public class NettyChillerClient { + + private volatile static NettyChillerDDCClient nettyChillerDDCClient = new NettyChillerDDCClient(); + + private int port; + private String host; + + // 构造函数传递值 继承Thread时需要 +// public NettyClient(int port, String host) { +// this.port = port; +// this.host = host; +// } + + public static void connect(int port, String host) throws InterruptedException { + // 配置客户端NIO线程组 + EventLoopGroup group = new NioEventLoopGroup(1); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) + .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { + // 基于换行符号 +// socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,4,4,-8,0)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8)); +// socketChannel.pipeline().addLast(new LengthFieldPrepender(4)); + socketChannel.pipeline().addLast(new IdleStateHandler(10,10,10, TimeUnit.SECONDS)); + // 在管道中添加我们自己的接收数据实现方法 + socketChannel.pipeline().addLast(new NettyChillerClientHandler()); +// socketChannel.pipeline().addLast(new NettyMeterClientHandler()); + } + }); + // 发起异步连接操作 + ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); + if (channelFuture.isSuccess()) { + log.info("connect server 成功---------"); + } else { + log.info("连接失败!"); + log.info("准备重连!"); +// connect(port, host); + } + + // 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程 + channelFuture.channel().closeFuture().sync(); + } catch (Exception e) { + log.error("error>>>>>>" + e.getMessage()); + } finally { + group.shutdownGracefully(); +// try { +// TimeUnit.SECONDS.sleep(5); +// connect(port, host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } + +// @SneakyThrows +// @Override +// public void run() { +// connect(port, host); +// } +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyChillerClientHandler.java b/user-service/src/main/java/com/mh/user/netty/NettyChillerClientHandler.java new file mode 100644 index 0000000..08ecbc7 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyChillerClientHandler.java @@ -0,0 +1,315 @@ +package com.mh.user.netty; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.ChillersEntity; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.chillers.ChillersService; +import com.mh.user.service.chillers.GatewayManageService; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.ExchangeStringUtil; +import com.mh.user.utils.GetReadOrder485; +import com.mh.user.utils.SpringBeanUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; +import io.netty.util.ReferenceCountUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description :客户端异步消息处理机制,采集冷水机组 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +public class NettyChillerClientHandler extends ChannelHandlerAdapter { + + private int num = 0; + private int size = 0; + private int idle_count = 0; + private String receiveStr = ""; + List deviceCodeParamList; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); + GatewayManageService gatewayManageService = context.getBean(GatewayManageService.class); + + /** + * 超时处理 + * 如果120秒没有接受客户端的心跳,就触发; + * 如果超过3次,则直接关闭; + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception { + if (obj instanceof IdleStateEvent) { + IdleStateEvent event = (IdleStateEvent) obj; + if (IdleState.READER_IDLE.equals(event.state())) { //如果读通道处于空闲状态,说明没有接收到心跳命令 + System.out.println("第" + idle_count + "已经10秒没有接收到服务器的信息了,发送第" + num + "条数据"); + if (deviceCodeParamList.get(num) == null) { + System.out.println("关闭这个不活跃的channel"); + ctx.channel().close(); + } else { + if ((num > size - 1) || (idle_count > 3)) { + System.out.println("关闭这个不活跃的channel"); + ctx.channel().close(); + } + GetReadOrder485 getReadOrder485 = new GetReadOrder485(); + String sendStr = getReadOrder485.createChillersOrder(deviceCodeParamList.get(num)); + ctx.channel().writeAndFlush(ExchangeStringUtil.getByteBuf(ctx, sendStr)); + idle_count++; + } + } + } else { + super.userEventTriggered(ctx, obj); + } + } + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + log.info("当前channel从EventLoop取消注册"); + ctx.close(); + super.channelUnregistered(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { +// super.exceptionCaught(ctx, cause); + log.info("通信异常!!"); +// // 发送采集冷水机组指令 +// GetReadOrder485 getReadOrder485 = new GetReadOrder485(); +// String sendStr = getReadOrder485.createChillersOrder(chillersEntityList.get(num)); +// // 获取采集参数个数 +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); +// receiveStr = null; + cause.printStackTrace(); + ctx.close(); +// Channel incoming = ctx.channel(); +// if (incoming.isActive()) { +// log.info("SimpleClient: " + incoming.remoteAddress() + "异常"); +// cause.printStackTrace(); +// ctx.close(); +// receiveStr = null; +// try { +// TimeUnit.SECONDS.sleep(5); +// SocketAddress remoteAddress = ctx.channel().remoteAddress(); +// String port = ExchangeStringUtil.endData(remoteAddress.toString(),":"); +// String host = ExchangeStringUtil.splitData(remoteAddress.toString(),"/",":"); +// NettyClient nettyClient = new NettyClient(); +// nettyClient.connect(Integer.parseInt(port), host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } + } + + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + super.channelActive(ctx); + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); + Date date = new Date(); + log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); + // 截取IP地址 + String IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", "/", ":"); + // 截取端口号 + String port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", ":", ""); + log.info("IP: " + IP + ",端口号: " + port); + // 更新对应的网关在线情况 + gatewayManageService.updateGatewayManage(IP, port); + // 生成采集指令 + deviceCodeParamList = deviceCodeParamService.queryCodeParam(port); + size = deviceCodeParamList.size(); + + // 发送采集冷水机组指令 + GetReadOrder485 getReadOrder485 = new GetReadOrder485(); + String sendStr = getReadOrder485.createChillersOrder(deviceCodeParamList.get(num)); + // 获取采集参数个数 + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 发送数据 + ctx.channel().writeAndFlush(buffer); + } + } + + private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { + // byte类型的数据 +// byte[] bytes = "这里是将要写往服务端的数据".getBytes(Charset.forName("utf-8")); +// String sendStr = "5803004900021914"; // 冷量计 + // 申请一个数据结构存储信息 + ByteBuf buffer = ctx.alloc().buffer(); + // 将信息放入数据结构中 + buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 + return buffer; + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + Thread.sleep(100); + ctx.close(); + log.info(ctx.channel().localAddress() + "退出链接!!"); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + try { + ByteBuf buf = (ByteBuf) msg; + byte[] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + buf.clear(); + log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); + if (bytes.length <= 36) { +// receiveStr = receiveStr.replace("null", ""); +// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + receiveStr = receiveStr.replace("null", ""); + log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + ReferenceCountUtil.release(msg); + } + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + log.info("冷水机组--数据读取接收完成: " + receiveStr); + if (receiveStr.length() == 30) { + log.info("采集完整的报文: " + receiveStr); + // 解析采集的报文,并保存到数据库 + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + analysisReceiveOrder485.analysisChillerOrder485(receiveStr,deviceCodeParamList.get(num)); + // 清空receiveStr + receiveStr = ""; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); +// // 继续发送下一个采集冷水机设备指令 +// GetReadOrder485 getReadOrder485 = new GetReadOrder485(); +// String sendStr = getReadOrder485.createChillersOrder(chillersEntityList.get(num)); +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 发送数据 +// ctx.channel().writeAndFlush(buffer); +// log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + Thread.sleep(1000); + // 继续发送下一个采集冷水机设备指令 + GetReadOrder485 getReadOrder485 = new GetReadOrder485(); + String sendStr = getReadOrder485.createChillersOrder(deviceCodeParamList.get(num)); + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 发送数据 + ctx.channel().writeAndFlush(buffer); + log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size); + } + } + } else if (receiveStr.length() == 32) { + log.info("采集完整的报文: " + receiveStr); + // 解析采集的报文,并保存到数据库 + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + analysisReceiveOrder485.analysisChillerOrder485(receiveStr,deviceCodeParamList.get(num)); + // 清空receiveStr + receiveStr = ""; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); +// // 继续发送下一个采集冷水机设备指令 +// GetReadOrder485 getReadOrder485 = new GetReadOrder485(); +// String sendStr = getReadOrder485.createChillersOrder(chillersEntityList.get(num)); +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 发送数据 +// ctx.channel().writeAndFlush(buffer); +// log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + log.info("有指令下发退出定时采集冷水机组参数"); + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + Thread.sleep(1000); + // 继续发送下一个采集冷水机设备指令 + GetReadOrder485 getReadOrder485 = new GetReadOrder485(); + String sendStr = getReadOrder485.createChillersOrder(deviceCodeParamList.get(num)); + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 2.发送数据 + ctx.channel().writeAndFlush(buffer); + log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size); + } + } + } else if (receiveStr.length() > 36) { + // 清空receiveStr + receiveStr = null; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); +// // 继续发送下一个采集冷水机设备指令 +// GetReadOrder485 getReadOrder485 = new GetReadOrder485(); +// String sendStr = getReadOrder485.createChillersOrder(chillersEntityList.get(num)); +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 发送数据 +// ctx.channel().writeAndFlush(buffer); +// log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + Thread.sleep(1000); + // 继续发送下一个采集冷水机设备指令 + GetReadOrder485 getReadOrder485 = new GetReadOrder485(); + String sendStr = getReadOrder485.createChillersOrder(deviceCodeParamList.get(num)); + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 发送数据 + ctx.channel().writeAndFlush(buffer); + log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size); + } + } + } + ctx.flush(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyChillerControlClient.java b/user-service/src/main/java/com/mh/user/netty/NettyChillerControlClient.java new file mode 100644 index 0000000..e266f9f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyChillerControlClient.java @@ -0,0 +1,98 @@ +package com.mh.user.netty; + +import com.mh.user.entity.OrderMessageEntity; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.handler.timeout.ReadTimeoutHandler; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author ljf + * @title : + * @description : 控制冷水机组和其他设备 + * @updateTime 2020-05-28 + * @throws : + */ +@Setter +@Getter +@Slf4j +public class NettyChillerControlClient { + +// private int port; +// private String host; +// private List orderMessageEntityList; + + // 构造函数传递值 继承Thread时需要 +// public NettyChillerControlClient(int port, String host) { +// this.port = port; +// this.host = host; +// } + + public void connect(int port, String host, List orderMessageEntityList) throws InterruptedException { + // 配置客户端NIO线程组 + EventLoopGroup group = new NioEventLoopGroup(1); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) + .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { + // 基于换行符号 +// socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,4,4,-8,0)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8)); +// socketChannel.pipeline().addLast(new LengthFieldPrepender(4)); + // 超过10秒钟没有数据读取自动断开连接 +// socketChannel.pipeline().addLast(new ReadTimeoutHandler(30)); + // 超过10秒没有返回触发心跳机制 update by ljf on 2021-01-30 + socketChannel.pipeline().addLast(new IdleStateHandler(10,10,6, TimeUnit.SECONDS)); + // 在管道中添加我们自己的接收数据实现方法 + socketChannel.pipeline().addLast(new NettyChillerControlHandler(orderMessageEntityList)); +// socketChannel.pipeline().addLast(new NettyMeterClientHandler()); + } + }); + // 发起异步连接操作 + ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); + if (channelFuture.isSuccess()) { + log.info("connect server 成功---------"); + } else { + log.info("连接失败!"); + log.info("准备重连!"); +// connect(port, host); + } + + // 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程 + channelFuture.channel().closeFuture().sync(); + } catch (Exception e) { + log.error(e.getMessage()); + } finally { + group.shutdownGracefully(); +// try { +// TimeUnit.SECONDS.sleep(5); +// connect(port, host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } + +// @SneakyThrows +// @Override +// public void run() { +// connect(port, host); +// } +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyChillerControlHandler.java b/user-service/src/main/java/com/mh/user/netty/NettyChillerControlHandler.java new file mode 100644 index 0000000..c74bec2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyChillerControlHandler.java @@ -0,0 +1,315 @@ +package com.mh.user.netty; + +import com.mh.user.entity.OrderMessageEntity; +import com.mh.user.service.chillers.GatewayManageService; +import com.mh.user.service.chillers.OrderMessageService; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.constants.Constant; +import com.mh.user.utils.ExchangeStringUtil; +import com.mh.user.utils.GetReadOrder485; +import com.mh.user.utils.SpringBeanUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; +import io.netty.util.ReferenceCountUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description :客户端异步消息处理机制 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +public class NettyChillerControlHandler extends ChannelHandlerAdapter { + + private int num = 0; + private int size = 0; + private String receiveStr = ""; + private int sendNum = 0; + private int idle_count = 1; + + List orderMessageEntityList; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + GatewayManageService gatewayManageService = context.getBean(GatewayManageService.class); + OrderMessageService orderMessageService = context.getBean(OrderMessageService.class); + + public NettyChillerControlHandler(List orderMessageEntityList) { + this.orderMessageEntityList = orderMessageEntityList; + } + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + log.info("当前channel从EventLoop取消注册"); +// Constant.SEND_STATUS = false; +// super.channelUnregistered(ctx); + ctx.close(); + } + + /** + * 超时处理 + * 如果120秒没有接受客户端的心跳,就触发; + * 如果超过3次,则直接关闭; + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception { + if (obj instanceof IdleStateEvent) { + IdleStateEvent event = (IdleStateEvent) obj; + if (IdleState.READER_IDLE.equals(event.state())) { //如果读通道处于空闲状态,说明没有接收到心跳命令 + System.out.println("第" + idle_count + "已经10秒没有接收到服务器的信息了,发送第" + num + "条数据"); + if (num > size - 1) { + num = 0; + // 关闭连接 + receiveStr = null; + Constant.SEND_STATUS = true; + System.out.println("关闭这个不活跃的channel"); + ctx.close(); + } else if (idle_count > 3) { + System.out.println("关闭这个不活跃的channel"); + num = 0; + // 关闭连接 + receiveStr = null; + Constant.SEND_STATUS = false; + ctx.close(); + } else { + // 发送采集DDC指令 + // 判断空值 + if (orderMessageEntityList.get(num).getRegisterAddr() == null || + orderMessageEntityList.get(num).getRegisterAddr().equalsIgnoreCase("")) { + num = 0; + // 关闭连接 + receiveStr = null; + Constant.SEND_STATUS = true; + ctx.close(); + } else { + String sendStr = orderMessageEntityList.get(num).getOrderStr(); +// // 获取采集参数个数 +// size = orderMessageEntityList.size(); + // 2.发送数据 + ByteBuf buffer = getByteBuf(ctx, sendStr); + ctx.channel().writeAndFlush(buffer); + idle_count++; + } + } + } + } else { + super.userEventTriggered(ctx, obj); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { +// super.exceptionCaught(ctx, cause); + log.info("通信异常!!"); + cause.printStackTrace(); +// receiveStr = null; +// Channel incoming = ctx.channel(); +// if (incoming.isActive()) { +// // 重新发送 +// if (sendNum > 2) { +// // 通信异常,发送失败 +// log.info("SimpleClient: " + incoming.remoteAddress() + "异常"); +// cause.printStackTrace(); +// Constant.SEND_STATUS = false; +// ctx.close(); +// } else { +// // 发送采集DDC指令 +// String sendStr = orderMessageEntityList.get(num).getOrderStr(); +// // 获取采集参数个数 +// size = orderMessageEntityList.size(); +// // 2.发送数据 +// ByteBuf buffer = getByteBuf(ctx,sendStr); +// ctx.channel().writeAndFlush(buffer); +// sendNum += 1; +// } +// } +// // 判断发送的下标,如果不等于指令数组大小 +// num = num + 1; +// if (num > size-1) { +// num = 0; +// // 关闭连接 +// receiveStr = null; +// Constant.SEND_STATUS = true; +// ctx.close(); +// } + } + + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + super.channelActive(ctx); + SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); + Date date=new Date(); + log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); + // 截取IP地址 + String IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress()+"","/", ":"); + // 截取端口号 + String port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress()+"",":", ""); + log.info("IP: " + IP + ",端口号: " + port); + // 更新对应的网关在线情况 + gatewayManageService.updateGatewayManage(IP, port); + + // 发送控制DDC指令 + String sendStr = orderMessageEntityList.get(num).getOrderStr(); + // 获取采集参数个数 + size = orderMessageEntityList.size(); + + // 2.发送数据 + ByteBuf buffer = getByteBuf(ctx,sendStr); + ctx.channel().writeAndFlush(buffer); + } + + private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { + // 申请一个数据结构存储信息 + ByteBuf buffer = ctx.alloc().buffer(); + // 将信息放入数据结构中 + buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 + return buffer; + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { +// Thread.sleep(100); + ctx.close(); + log.info(ctx.channel().localAddress() + "退出链接!!"); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// super.channelRead(ctx, msg); + // ByteBuf buf = (ByteBuf)msg; +// byte[] req = new byte[buf.readableBytes()]; +// buf.readBytes(req); +// String body = new String(req, "UTF-8"); + try { + ByteBuf buf = (ByteBuf)msg; + byte [] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + buf.clear(); + log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); +// if (bytes.length <= 24) { + if (bytes.length != 0) { +// receiveStr = receiveStr.replace("null", ""); +// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + receiveStr = receiveStr.replace("null", ""); + log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + ReferenceCountUtil.release(msg); + } + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + log.info("数据读取接收完成: " + receiveStr); + if (receiveStr.length() == 24) { + if (receiveStr.equalsIgnoreCase(orderMessageEntityList.get(num).getOrderStr())) { + // 解析采集回来的数据 + log.info("采集完整的报文: " + receiveStr + ",指令下标: " + size); + // 解析采集的报文 + // 更新发送后的指令 + OrderMessageEntity orderMessageEntity = new OrderMessageEntity(); + orderMessageEntity.setRegisterAddr(orderMessageEntityList.get(num).getRegisterAddr()); + orderMessageEntity.setCreateTime(orderMessageEntityList.get(num).getCreateTime()); + orderMessageEntity.setGrade(1); + orderMessageEntity.setSendNum(1); + orderMessageEntity.setStatus(1); + orderMessageEntity.setOrderStr(orderMessageEntityList.get(num).getOrderStr()); + orderMessageService.updateOrderMessage(orderMessageEntity); + +// // 关闭连接 +// receiveStr = null; +// Constant.SEND_STATUS = true; +// ctx.close(); + + // 清空receiveStr + receiveStr = ""; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { + num = 0; + // 关闭连接 + receiveStr = null; + Constant.SEND_STATUS = true; + ctx.close(); + } else { + Thread.sleep(4000); + // 继续发送下一个采集DDC设备指令 + String sendStr = orderMessageEntityList.get(num).getOrderStr(); + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 2.发送数据 + ctx.channel().writeAndFlush(buffer); + log.info("客户端再次往服务端发送数据" + num + ",报文: " + sendStr); + } + } + } else if ((receiveStr.length() > 24) && (num == 0)) { + // 发送采集DDC指令 + String sendStr = orderMessageEntityList.get(num).getOrderStr(); + // 获取采集参数个数 + size = orderMessageEntityList.size(); + // 2.发送数据 + ByteBuf buffer = getByteBuf(ctx,sendStr); + ctx.channel().writeAndFlush(buffer); + // 清空receiveStr + receiveStr = ""; + sendNum += 1; + } else if (sendNum > 2){ + // 更新发送后的指令 + OrderMessageEntity orderMessageEntity = new OrderMessageEntity(); + orderMessageEntity.setRegisterAddr(orderMessageEntityList.get(num).getRegisterAddr()); + orderMessageEntity.setCreateTime(orderMessageEntityList.get(num).getCreateTime()); + orderMessageEntity.setGrade(1); + orderMessageEntity.setSendNum(sendNum); + orderMessageEntity.setStatus(0); + orderMessageEntity.setOrderStr(orderMessageEntityList.get(num).getOrderStr()); + orderMessageService.updateOrderMessage(orderMessageEntity); + Constant.SEND_STATUS = false; + ctx.close(); + } else if ((receiveStr.length() > 24)) { + // 接收采集DDC的数据 + // 解析采集的报文 + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + analysisReceiveOrder485.analysisChillersDDC(receiveStr); + + // 清空receiveStr + receiveStr = ""; + // 更新发送后的指令 + OrderMessageEntity orderMessageEntity = new OrderMessageEntity(); + orderMessageEntity.setRegisterAddr(orderMessageEntityList.get(num).getRegisterAddr()); + orderMessageEntity.setCreateTime(orderMessageEntityList.get(num).getCreateTime()); + orderMessageEntity.setGrade(1); + orderMessageEntity.setSendNum(1); + orderMessageEntity.setStatus(1); + orderMessageEntity.setOrderStr(orderMessageEntityList.get(num).getOrderStr()); + orderMessageService.updateOrderMessage(orderMessageEntity); + + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; +// Thread.sleep(500); + if (num > size-1) { + num = 0; + // 关闭连接 + receiveStr = null; + Constant.SEND_STATUS = true; + ctx.close(); + } + } + ctx.flush(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyChillerDDCClient.java b/user-service/src/main/java/com/mh/user/netty/NettyChillerDDCClient.java new file mode 100644 index 0000000..408835e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyChillerDDCClient.java @@ -0,0 +1,96 @@ +package com.mh.user.netty; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.handler.timeout.ReadTimeoutHandler; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.TimeUnit; + +/** + * @author ljf + * @title : + * @description :Netty客户端,采集DDC设备数据 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +@Setter +@Getter +public class NettyChillerDDCClient { + + private volatile static NettyChillerDDCClient nettyChillerDDCClient = new NettyChillerDDCClient(); + + private int port; + private String host; + + // 构造函数传递值 继承Thread时需要 +// public NettyClient(int port, String host) { +// this.port = port; +// this.host = host; +// } + + public static void connect(int port, String host) throws InterruptedException { + // 配置客户端NIO线程组 + EventLoopGroup group = new NioEventLoopGroup(1); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) + .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { + // 基于换行符号 +// socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,4,4,-8,0)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8)); +// socketChannel.pipeline().addLast(new LengthFieldPrepender(4)); + // 超过10秒钟没有数据读取自动断开连接 +// socketChannel.pipeline().addLast(new ReadTimeoutHandler(40)); + socketChannel.pipeline().addLast(new IdleStateHandler(20,20,20, TimeUnit.SECONDS)); + // 在管道中添加我们自己的接收数据实现方法 + socketChannel.pipeline().addLast(new NettyChillerDDCClientHandler()); +// socketChannel.pipeline().addLast(new NettyMeterClientHandler()); + } + }); + // 发起异步连接操作 + ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); + if (channelFuture.isSuccess()) { + log.info("connect server 成功---------"); + } else { + log.info("连接失败!"); + log.info("准备重连!"); +// connect(port, host); + } + + // 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程 + channelFuture.channel().closeFuture().sync(); + } catch (Exception e) { + log.error(e.getMessage()); + } finally { + group.shutdownGracefully(); +// try { +// TimeUnit.SECONDS.sleep(5); +// connect(port, host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } + +// @SneakyThrows +// @Override +// public void run() { +// connect(port, host); +// } +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyChillerDDCClientHandler.java b/user-service/src/main/java/com/mh/user/netty/NettyChillerDDCClientHandler.java new file mode 100644 index 0000000..0c1e6b1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyChillerDDCClientHandler.java @@ -0,0 +1,297 @@ +package com.mh.user.netty; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.ChillersEntity; +import com.mh.user.service.chillers.ChillersService; +import com.mh.user.service.chillers.GatewayManageService; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.ExchangeStringUtil; +import com.mh.user.utils.GetReadOrder485; +import com.mh.user.utils.SpringBeanUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; +import io.netty.util.ReferenceCountUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description :客户端异步消息处理机制 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +public class NettyChillerDDCClientHandler extends ChannelHandlerAdapter { + + private int num = 0; + private int size = 0; + private int collectionSize = 0; + private String receiveStr = null; + private int idle_count = 0; + List chillersEntityList; + List chillersEntityList1; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + ChillersService chillersService = context.getBean(ChillersService.class); + GatewayManageService gatewayManageService = context.getBean(GatewayManageService.class); + + /** + * 超时处理 + * 如果120秒没有接受客户端的心跳,就触发; + * 如果超过3次,则直接关闭; + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception { + if (obj instanceof IdleStateEvent) { + IdleStateEvent event = (IdleStateEvent) obj; + if (IdleState.READER_IDLE.equals(event.state())) { //如果读通道处于空闲状态,说明没有接收到心跳命令 + System.out.println("第" + idle_count + "已经20秒没有接收到服务器的信息了,发送的第" + num + "条数据"); + if (chillersEntityList.get(num) == null) { + ctx.close(); + } else { + String sendStr = GetReadOrder485.createDDCOrder(chillersEntityList.get(num)); + ctx.channel().writeAndFlush(ExchangeStringUtil.getByteBuf(ctx, sendStr)); + if ((num > size - 1) || (idle_count > 3)) { + //System.out.println("关闭这个不活跃的channel"); + //ctx.close(); + //继续发送下一个ddc采集指令 + log.info("当前DDC无返回数据超过三次,DDC为:"+chillersEntityList.get(num).getDdcAddr()); + if (num >= size - 1){ + log.info("结束DDC采集,当前DDC=====>>>"+chillersEntityList.get(num).getDdcAddr()); + ctx.close(); + }else { + //下发下一个ddc指令之前清除前面的数据 + receiveStr = null; + //String sendStr1 = GetReadOrder485.createDDCOrder(chillersEntityList.get(++num)); + //ctx.channel().writeAndFlush(ExchangeStringUtil.getByteBuf(ctx, sendStr1)); + num++; + sendDDCOrder(chillersEntityList,chillersEntityList.get(num),ctx,num); + } + idle_count = 0; + } + idle_count++; + } + } + } else { + super.userEventTriggered(ctx, obj); + } + } + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + log.info("当前channel从EventLoop取消注册"); + super.channelUnregistered(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { +// super.exceptionCaught(ctx, cause); + log.info("通信异常!!"); + receiveStr = null; + cause.printStackTrace(); + ctx.close(); +// Channel incoming = ctx.channel(); +// if (incoming.isActive()) { +// log.info("SimpleClient: " + incoming.remoteAddress() + "异常"); +// cause.printStackTrace(); +// ctx.close(); +// receiveStr = null; +// try { +// TimeUnit.SECONDS.sleep(5); +// SocketAddress remoteAddress = ctx.channel().remoteAddress(); +// String port = ExchangeStringUtil.endData(remoteAddress.toString(),":"); +// String host = ExchangeStringUtil.splitData(remoteAddress.toString(),"/",":"); +// NettyClient nettyClient = new NettyClient(); +// nettyClient.connect(Integer.parseInt(port), host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } + } + + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + super.channelActive(ctx); + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.CONTROL_WEB_FLAG) { + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); + Date date = new Date(); + log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); + // 截取IP地址 + String IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", "/", ":"); + // 截取端口号 + String port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", ":", ""); + log.info("IP: " + IP + ",端口号: " + port); + // 更新对应的网关在线情况 + gatewayManageService.updateGatewayManage(IP, port); + // 生成采集指令 + chillersEntityList = chillersService.queryChillersDDC(2); + size = chillersEntityList.size(); + + // 发送采集DDC指令 + String sendStr = GetReadOrder485.createDDCOrder(chillersEntityList.get(num)); + // 获取采集参数个数,grade=2,代表采集DDC设备所对应的参数 + chillersEntityList1 = chillersService.queryChillersByOther(2, chillersEntityList.get(num).getDdcAddr()); + StringBuffer getStr = new StringBuffer(); + for (int i = 0; i < chillersEntityList1.size(); i++) { + getStr.append(chillersEntityList1.get(i).getRegisterAddress()); +// getStr = getStr + chillersEntityList1.get(i).getRegisterAddress(); + } + collectionSize = getStr.length() / 2; + log.info("发送的数据: " + sendStr + ",报文大小: " + collectionSize); + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 2.发送数据 + ctx.channel().writeAndFlush(buffer); + } + } + + private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { + // byte类型的数据 + // 申请一个数据结构存储信息 + ByteBuf buffer = ctx.alloc().buffer(); + // 将信息放入数据结构中 + buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 + return buffer; + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + Thread.sleep(100); + ctx.close(); + log.info(ctx.channel().localAddress() + "退出链接!!"); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + try { + ByteBuf buf = (ByteBuf) msg; + byte[] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + buf.clear(); + log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); + if (bytes.length <= (11 + collectionSize * 3) * 2) { +// if (bytes.length <= 142) { +// receiveStr = receiveStr.replace("null", ""); +// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + receiveStr = receiveStr.replace("null", ""); + log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + ReferenceCountUtil.release(msg); + } + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + log.info("接收的数据: " + receiveStr + ",报文大小: " + collectionSize); + if (receiveStr.length() == (11 + 3 * collectionSize) * 2) { +// if (receiveStr.length() == 142) { + // 解析采集回来的数据 + log.info("采集完整的报文: " + receiveStr); + + if (!Constant.CONTROL_WEB_FLAG) { + // 解析采集的报文 + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + analysisReceiveOrder485.analysisChillersDDC(receiveStr); + } + // 清空receiveStr + receiveStr = ""; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { + // 关闭连接 + receiveStr = null; + ctx.close(); +// // 设置长连接,封装发送 update by ljf on 2021-01-26 +// sendDDCOrder(chillersEntityList,chillersEntityList.get(num),ctx,num); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.CONTROL_WEB_FLAG) { + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + // 设置长连接,封装发送 update by ljf on 2021-01-26 + sendDDCOrder(chillersEntityList, chillersEntityList.get(num), ctx, num); + } + } + } else if (receiveStr.length() == 20) { +// if (receiveStr.length() == 142) { + // 解析采集回来的数据 + log.info("采集完整的报文: " + receiveStr); + // 清空receiveStr + receiveStr = ""; + // 判断发送的下标,如果不等于指令数组大小 + num = num + 1; + if (num > size - 1) { + // 关闭连接 + receiveStr = null; + ctx.close(); +// // 设置长连接,封装发送 update by ljf on 2021-01-26 +// sendDDCOrder(chillersEntityList,chillersEntityList.get(num),ctx,num); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.CONTROL_WEB_FLAG) { + log.info("有指令下发退出定时采集DDC参数"); + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + // 封装发送 + sendDDCOrder(chillersEntityList, chillersEntityList.get(num), ctx, num); + } + } + }else if (receiveStr.length() > (11 + 3 * collectionSize) * 2){ + log.info("当前DDC: "+chillersEntityList.get(num).getDdcAddr()+"长度为: "+receiveStr.length()); + receiveStr = null; + //继续后面的DDC采集 + //String sendStr1 = GetReadOrder485.createDDCOrder(chillersEntityList.get(++num)); + //ctx.channel().writeAndFlush(ExchangeStringUtil.getByteBuf(ctx, sendStr1)); + num++; + sendDDCOrder(chillersEntityList,chillersEntityList.get(num),ctx,num); + } + ctx.flush(); + } + + public void sendDDCOrder(List chillersEntityList, + ChillersEntity chillersEntity, + ChannelHandlerContext ctx, + int num) throws InterruptedException { + Thread.sleep(800); + // 继续发送下一个采集DDC设备指令 + String sendStr = GetReadOrder485.createDDCOrder(chillersEntity); + // 获取采集参数个数,grade=2,代表采集DDC设备所对应的参数 + chillersEntityList1 = chillersService.queryChillersByOther(2, chillersEntityList.get(num).getDdcAddr()); + StringBuilder getStr = new StringBuilder(); + for (ChillersEntity entity : chillersEntityList1) { + getStr.append(entity.getRegisterAddress()); + } + collectionSize = getStr.length() / 2; + log.info("发送的数据: " + sendStr + ",报文大小: " + collectionSize); + log.info("客户端再次往服务端发送数据 " + num + "," + sendStr); + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 2.发送数据 + ctx.channel().writeAndFlush(buffer); + } + +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyClient.java b/user-service/src/main/java/com/mh/user/netty/NettyClient.java new file mode 100644 index 0000000..828c646 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyClient.java @@ -0,0 +1,90 @@ +package com.mh.user.netty; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.timeout.ReadTimeoutHandler; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +/** + * @author ljf + * @title : + * @description :Netty客户端,采集冷量计 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +@Setter +@Getter +public class NettyClient { + + private int port; + private String host; + + // 构造函数传递值 继承Thread时需要 +// public NettyClient(int port, String host) { +// this.port = port; +// this.host = host; +// } + + public void connect(int port, String host) throws InterruptedException { + // 配置客户端NIO线程组 + EventLoopGroup group = new NioEventLoopGroup(1); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) + .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { + // 基于换行符号 +// socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,4,4,-8,0)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8)); +// socketChannel.pipeline().addLast(new LengthFieldPrepender(4)); + // 超过10秒钟没有数据读取自动断开连接 + socketChannel.pipeline().addLast(new ReadTimeoutHandler(10)); + // 在管道中添加我们自己的接收数据实现方法 + socketChannel.pipeline().addLast(new NettyClientHandler()); +// socketChannel.pipeline().addLast(new NettyMeterClientHandler()); + } + }); + // 发起异步连接操作 + ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); + if (channelFuture.isSuccess()) { + log.info("connect server 成功---------"); + } else { + log.info("连接失败!"); + log.info("准备重连!"); +// connect(port, host); + } + + // 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程 + channelFuture.channel().closeFuture().sync(); + } catch (Exception e) { + log.error(e.getMessage()); + } finally { + group.shutdownGracefully(); +// try { +// TimeUnit.SECONDS.sleep(5); +// connect(port, host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } + +// @SneakyThrows +// @Override +// public void run() { +// connect(port, host); +// } +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyClientHandler.java b/user-service/src/main/java/com/mh/user/netty/NettyClientHandler.java new file mode 100644 index 0000000..ba4dc80 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyClientHandler.java @@ -0,0 +1,190 @@ +package com.mh.user.netty; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.chillers.DeviceManageService; +import com.mh.user.utils.*; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; +import io.netty.util.ReferenceCountUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description :客户端异步消息处理机制 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +public class NettyClientHandler extends ChannelHandlerAdapter { + + private int num = 0; + private int size = 0; + private String receiveStr = null; + private String IP = null; + private String port = null; + List deviceManageEntityList; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); + + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + log.info("当前channel从EventLoop取消注册"); + super.channelUnregistered(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { +// super.exceptionCaught(ctx, cause); + log.info("通信异常!!"); + receiveStr = null; + Channel incoming = ctx.channel(); + if (incoming.isActive()){ + log.info("SimpleClient: " + incoming.remoteAddress() + "异常"); + cause.printStackTrace(); + ctx.close(); +// receiveStr = null; +// try { +// TimeUnit.SECONDS.sleep(5); +// SocketAddress remoteAddress = ctx.channel().remoteAddress(); +// String port = ExchangeStringUtil.endData(remoteAddress.toString(),":"); +// String host = ExchangeStringUtil.splitData(remoteAddress.toString(),"/",":"); +// NettyClient nettyClient = new NettyClient(); +// nettyClient.connect(Integer.parseInt(port), host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } + + + @Override + public void channelActive(ChannelHandlerContext ctx) { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + ctx.channel().read(); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); + Date date = new Date(); + log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); + // 截取IP地址 + IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", "/", ":"); + // 截取端口号 + port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", ":", ""); + log.info("IP: " + IP + ",端口号: " + port); + // 生成对应采集冷量计的命令 + deviceManageEntityList = deviceCodeParamService.queryCodeParam(port); + size = deviceManageEntityList.size(); + + // 封装工具类进行采集,update by ljf on 2021-01-26 + SendOrderUtils.sendCloudOrder(deviceManageEntityList.get(0),ctx,num,size); + } + + } + + private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { + // byte类型的数据 +// byte[] bytes = "这里是将要写往服务端的数据".getBytes(Charset.forName("utf-8")); +// String sendStr = "5803004900021914"; // 冷量计 + // 申请一个数据结构存储信息 + ByteBuf buffer = ctx.alloc().buffer(); + // 将信息放入数据结构中 + buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 + return buffer; + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + Thread.sleep(100); + ctx.close(); + log.info(ctx.channel().localAddress() + "退出链接!!"); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + try { + ByteBuf buf = (ByteBuf)msg; + byte [] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + buf.clear(); + log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); + if (bytes.length <= 36) { +// receiveStr = receiveStr.replace("null", ""); +// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + receiveStr = receiveStr.replace("null", ""); + log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + ReferenceCountUtil.release(msg); + } + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + log.info("采集冷量计-数据读取接收完成: " + receiveStr); +// A9 FE C2 C7 1F 90 01 58 03 04 4A 30 00 53 65 1C C4 06 + if (receiveStr.length() == 36) { + // 接收到的报文 + log.info("接收完整报文: " + receiveStr); + // 解析报文 + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + analysisReceiveOrder485.analysisCloudOrder485(receiveStr,deviceManageEntityList.get(num)); // 解析冷量计 + receiveStr = ""; + // 1.创建将要写出的数据 +// String sendStr = "5803004900021914"; + num = num + 1; + Thread.sleep(500); + if (num > size-1) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); +// 保持长连接 +// // 封装工具类进行采集,update by ljf on 2021-01-26 +// SendOrderUtils.sendCloudOrder(deviceManageEntityList.get(num),num,IP,port,ctx); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + log.info("有指令下发退出定时采集参数"); + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + // 封装工具类进行采集,update by ljf on 2021-01-26 + SendOrderUtils.sendCloudOrder(deviceManageEntityList.get(num),ctx,num,size); + } + } + + } else { + log.info(receiveStr); + receiveStr = null; + ctx.flush(); + ctx.close(); + } + + ctx.flush(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyEchoServer.java b/user-service/src/main/java/com/mh/user/netty/NettyEchoServer.java new file mode 100644 index 0000000..ea76106 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyEchoServer.java @@ -0,0 +1,180 @@ +package com.mh.user.netty; + +import com.mh.user.utils.ExchangeStringUtil; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; + +import java.io.IOException; +import java.net.InetSocketAddress; + + +/** + * @author ljf + * @title :Netty + * @description :netty 使用 + * @updateTime 2020-04-21 + * @throws : + */ +@Slf4j +public class NettyEchoServer { + + public void bind(int port) throws Exception { + // accept线程组,用来接收连接 + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + // IO 线程组,用来处理业务逻辑 + EventLoopGroup workerGroup = new NioEventLoopGroup(1); + + try { + // 服务端启动引导 + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap.group(bossGroup,workerGroup) // 绑定两个线程 + .channel(NioServerSocketChannel.class) // 指定通道类型 + .option(ChannelOption.SO_BACKLOG, 1024) // 设置TCP连接的缓冲区 + .handler(new LoggingHandler(LogLevel.INFO)) // 设置日志级别 + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + ChannelPipeline pipeline = socketChannel.pipeline(); // 获取处理器链 + pipeline.addLast(new EchoServerHandler()); // 添加新的事件处理器 + } + }); + // 通过bind启动服务 + ChannelFuture f = serverBootstrap.bind(port).sync(); + // 阻塞主线程,知道网络服务被关闭 + f.channel().closeFuture().sync(); + } catch (Exception e){ + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } + + static class EchoServerHandler extends ChannelHandlerAdapter { + + // 每当从客户端收到新的数据时,这个方法会在收到消息时被调用 + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + try { + ByteBuf buf = (ByteBuf)msg; + byte [] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + String receiveStr = ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + log.info("接收到的数据: "+ receiveStr); + + //返回16进制到客户端 + writeToClient(receiveStr,ctx,"测试"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } +// ctx.write(Unpooled.wrappedBuffer("Server message".getBytes())); +// ctx.fireChannelRead(msg); + } + + // 数据读取完后被调用 + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.flush(); + } + + // 当Netty由于IO错误或者处理器在处理事件时抛出的异常时被调用 + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } + + /** + * 客户端与服务端第一次建立连接时 执行 + * + * @param ctx + * @throws Exception + */ + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception, IOException + { + super.channelActive(ctx); + ctx.channel().read(); + InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ifsock.getAddress().getHostAddress(); + //此处不能使用ctx.close(),否则客户端始终无法与服务端建立连接 + log.info("channelActive: "+clientIp + ctx.name()); + } + + /** + * 客户端与服务端 断连时 执行 + * + * @param ctx + * @throws Exception + */ + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception, IOException + { + super.channelInactive(ctx); + InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ifsock.getAddress().getHostAddress(); + ctx.close(); //断开连接时,必须关闭,否则造成资源浪费,并发量很大情况下可能造成宕机 + System.out.println("channelInactive:"+clientIp); + } + + /** + * 服务端当read超时, 会调用这个方法 + * + * @param ctx + * @param evt + * @throws Exception + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception, IOException + { + super.userEventTriggered(ctx, evt); + InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ifsock.getAddress().getHostAddress(); + ctx.close();//超时时断开连接 + System.out.println("userEventTriggered:"+clientIp); + } + + + /** + * 公用回写数据到客户端的方法 + * @param channel + * @param mark 用于打印/log的输出 + *
//channel.writeAndFlush(msg);//不行 + *
//channel.writeAndFlush(receiveStr.getBytes());//不行 + *
在netty里,进出的都是ByteBuf,楼主应确定服务端是否有对应的编码器,将字符串转化为ByteBuf + */ + private void writeToClient(final String receiveStr, ChannelHandlerContext channel, final String mark) { + try { + ByteBuf buff = Unpooled.buffer();//netty需要用ByteBuf传输 + buff.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(receiveStr));//对接需要16进制 + channel.writeAndFlush(buff).addListener((ChannelFutureListener) future -> { + StringBuilder sb = new StringBuilder(""); + if(!StringUtils.isEmpty(mark)){ + sb.append("【").append(mark).append("】"); + } + if (future.isSuccess()) { + System.out.println(sb.toString()+"回写成功"+receiveStr); + log.info(sb.toString()+"回写成功"+receiveStr); + } else { + System.out.println(sb.toString()+"回写失败"+receiveStr); + log.error(sb.toString()+"回写失败"+receiveStr); + } + }); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("调用通用writeToClient()异常"+e.getMessage()); + log.error("调用通用writeToClient()异常:",e); + } + } + } +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyMeterClient.java b/user-service/src/main/java/com/mh/user/netty/NettyMeterClient.java new file mode 100644 index 0000000..46e13fb --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyMeterClient.java @@ -0,0 +1,95 @@ +package com.mh.user.netty; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.timeout.ReadTimeoutHandler; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +/** + * @author ljf + * @title : + * @description :Netty客户端,采集电表 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +@Setter +@Getter +public class NettyMeterClient { +// implements Runnable { + + private int port; + private String host; + + // 构造函数传递值 继承Thread时需要 + public NettyMeterClient(int port, String host) { + this.port = port; + this.host = host; + } + + public NettyMeterClient() { + super(); + } + + public void connect(int port, String host) throws InterruptedException { + // 配置客户端NIO线程组 + // 配置客户端NIO线程组 + EventLoopGroup group = new NioEventLoopGroup(1); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group).channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) + .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(1024*1024)) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { + // 基于换行符号 +// socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8)); +// // 解码转String,注意调整自己的编码格式GBK、UTF-8 +// socketChannel.pipeline().addLast(new StringEncoder(StandardCharsets.UTF_8)); + // 超过10秒钟没有数据读取自动断开连接 + socketChannel.pipeline().addLast(new ReadTimeoutHandler(20)); + // 在管道中添加我们自己的接收数据实现方法 +// socketChannel.pipeline().addLast(new NettyClientHandler()); + socketChannel.pipeline().addLast(new NettyMeterClientHandler()); + } + }); + // 发起异步连接操作 + ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); + if (channelFuture.isSuccess()) { + log.info("connect server 成功---------"); + } else { + log.info("连接失败!"); + log.info("准备重连!"); +// connect(port, host); + } + + // 等待客户端连接链路关闭future.channel().closeFuture().sync(); // 阻塞main线程 + channelFuture.channel().closeFuture().sync(); + } catch (Exception e) { + log.error(e.getMessage()); + } finally { + group.shutdownGracefully(); +// try { +// TimeUnit.SECONDS.sleep(5); +// connect(port, host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } +// +// @SneakyThrows +// @Override +// public void run() { +// connect(port, host); +// } +} diff --git a/user-service/src/main/java/com/mh/user/netty/NettyMeterClientHandler.java b/user-service/src/main/java/com/mh/user/netty/NettyMeterClientHandler.java new file mode 100644 index 0000000..444b9e5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/NettyMeterClientHandler.java @@ -0,0 +1,261 @@ +package com.mh.user.netty; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.chillers.DeviceManageService; +import com.mh.user.utils.*; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; +import io.netty.util.ReferenceCountUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description :客户端异步消息处理机制 + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +public class NettyMeterClientHandler extends ChannelHandlerAdapter { + + + private int num = 0; + private int size = 0; + private String receiveStr = null; + private String IP = ""; + private String port = ""; + List deviceManageEntityList; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); + + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + log.info("当前channel从EventLoop取消注册"); + super.channelUnregistered(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { +// super.exceptionCaught(ctx, cause); + log.info("通信异常!!"); +// receiveStr = null; + Channel incoming = ctx.channel(); + if (incoming.isActive()) { + log.info("SimpleClient: " + incoming.remoteAddress() + "异常"); + receiveStr = null; + cause.printStackTrace(); + ctx.close(); +// receiveStr = null; +// try { +// TimeUnit.SECONDS.sleep(5); +// SocketAddress remoteAddress = ctx.channel().remoteAddress(); +// String port = ExchangeStringUtil.endData(remoteAddress.toString(),":"); +// String host = ExchangeStringUtil.splitData(remoteAddress.toString(),"/",":"); +// NettyClient nettyClient = new NettyClient(); +// nettyClient.connect(Integer.parseInt(port), host); // 断线重连 +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } + } + + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { +// super.channelActive(ctx); + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + ctx.channel().read(); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); + Date date = new Date(); + log.info(ctx.channel().remoteAddress() + " " + sdf1.format(date) + "链接服务端成功!"); + + // 截取IP地址 + IP = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", "/", ":"); + // 截取端口号 + port = ExchangeStringUtil.getMidString(ctx.channel().remoteAddress() + "", ":", ""); + log.info("IP: " + IP + ",端口号: " + port); + + // 生成对应的采集指令 + // 修改生成指令(冷量计和电量一起采集) update by ljf on 2021-01-27 + deviceManageEntityList = deviceCodeParamService.queryCodeParam(port); + size = deviceManageEntityList.size(); + + log.info("初始连接报文: " + receiveStr); + receiveStr = ""; + // 保持长连接,封装发送电表工具方法 update by ljf on 2021-01-26 + SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(0),ctx,num,size); + // 1.创建将要写出的数据 +// String sendStr = "6830043080000068110432326536C816"; // 网络单相电表 +// String sendStr = "FEFEFEFE6880025007000068010243C3B216"; // 广仪三相电表 +// String collectionNum = deviceManageEntityList.get(0).getCollectionNum(); +// String sendStr = GetReadOrder485.createMeterOrder(IP, port, +// deviceManageEntityList.get(0).getDataCom(), collectionNum, "1"); +//// FileUtils.createFileAndWrite(sendStr, 0); +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); + } + + } + + private ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { + // byte类型的数据 +// byte[] bytes = "这里是将要写往服务端的数据".getBytes(Charset.forName("utf-8")); +// String sendStr = "5803004900021914"; // 冷量计 + // 申请一个数据结构存储信息 + ByteBuf buffer = ctx.alloc().buffer(); + // 将信息放入数据结构中 + buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 + return buffer; + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + Thread.sleep(500); + receiveStr = null; + ctx.close(); + log.info(ctx.channel().localAddress() + "退出链接!!"); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + try { + ByteBuf buf = (ByteBuf) msg; + byte[] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + buf.clear(); + log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); + if (bytes.length <= 62) { +// if (bytes.length <= 142) { +// receiveStr = receiveStr.replace("null", ""); +// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + receiveStr = receiveStr.replace("null", ""); + log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + ReferenceCountUtil.release(msg); + } +// super.channelRead(ctx, msg); + // ByteBuf buf = (ByteBuf)msg; +// byte[] req = new byte[buf.readableBytes()]; +// buf.readBytes(req); +// String body = new String(req, "UTF-8"); +// ByteBuf buf = (ByteBuf)msg; +// byte [] bytes = new byte[buf.readableBytes()]; +// buf.readBytes(bytes);//复制内容到字节数组bytes +// log.info("获取到的值: " + ExchangeStringUtil.bytesToHexString(bytes)); +// if (bytes.length != 0) { +//// receiveStr = receiveStr.replace("null", ""); +//// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +//// log.info(ctx.channel().remoteAddress() + " " + ctx.channel().localAddress() + " 接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); +// receiveStr = receiveStr + ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 +// receiveStr = receiveStr.replace("null", ""); +// log.info("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); +// } + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + log.info("采集电表-数据读取接收完成: " + receiveStr); +// 把receiveStr的"null"值去掉 +// a9fec2c71f9002fefefefe6839025007000068810643c3bb446c338d16c2b8 +// A9 FE C2 C7 1F 90 02 FE FE FE FE 68 39 02 50 07 00 00 68 81 06 43 C3 5B 38 6C 33 21 16 F8 12 + if ((receiveStr.length() == 62)) { +// log.info(receiveStr); + analysisReceiveOrder485.analysisMeterOrder485(receiveStr,deviceManageEntityList.get(num)); // 解析电表 + receiveStr = ""; + num = num + 1; + Thread.sleep(600); + if (num > size - 1) { + num = 0; + receiveStr = null; + // 关闭连接 + ctx.close(); +// // 保持长连接,封装发送电表工具方法 update by ljf on 2021-01-26 +// SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num),num,IP,port,ctx); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + log.info("有指令下发退出定时采集DDC参数"); + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + // 封装发送电表工具方法 update by ljf on 2021-01-26 + SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num),ctx,num,size); + // 1.创建将要写出的数据 + // fe fe fe fe 68 80 02 50 07 00 00 68 81 06 43 c3 8c 34 33 33 5c 16 +// String sendStr = "FEFEFE6880025007000068010243C3B216"; +// String collectionNum = deviceManageEntityList.get(num).getCollectionNum(); +// String sendStr = GetReadOrder485.createMeterOrder(IP, port, +// deviceManageEntityList.get(num).getDataCom(), collectionNum, "1"); +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); +// log.info("客户端再次往服务端发送数据" + num); + } + } + } else if ((receiveStr.length() > 62)) { + receiveStr = null; + num = num + 1; + Thread.sleep(500); + if (num > size - 1) { + num = 0; + receiveStr = null; + // 关闭连接 + ctx.close(); +// // 保持长连接,封装发送电表工具方法 update by ljf on 2021-01-26 +// SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num),num,IP,port,ctx); + } else { + // 添加一个状态值,判断是否继续发送指令 update by ljf on 2020-08-07 + if (Constant.WEB_FLAG) { + log.info("有指令下发退出定时采集DDC参数"); + num = 0; + // 关闭连接 + receiveStr = null; + ctx.close(); + } else { + // 封装发送电表工具方法 update by ljf on 2021-01-26 + SendOrderUtils.sendMeterOrder(deviceManageEntityList.get(num),ctx,num,size); + // 1.创建将要写出的数据 + // fe fe fe fe 68 80 02 50 07 00 00 68 81 06 43 c3 8c 34 33 33 5c 16 +// String sendStr = "FEFEFE6880025007000068010243C3B216"; +// String collectionNum = deviceManageEntityList.get(num).getCollectionNum(); +// String sendStr = GetReadOrder485.createMeterOrder(IP, port, +// deviceManageEntityList.get(num).getDataCom(), collectionNum, "1"); +// ByteBuf buffer = getByteBuf(ctx, sendStr); +// // 2.发送数据 +// ctx.channel().writeAndFlush(buffer); +// log.info("客户端再次往服务端发送数据" + num); + } + } + } + ctx.flush(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/netty/ServerChannelInitializer.java b/user-service/src/main/java/com/mh/user/netty/ServerChannelInitializer.java new file mode 100644 index 0000000..da9e03e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/netty/ServerChannelInitializer.java @@ -0,0 +1,33 @@ +package com.mh.user.netty; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.timeout.IdleStateHandler; + +import java.util.concurrent.TimeUnit; + +public class ServerChannelInitializer extends ChannelInitializer{ + + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + ChannelPipeline pipeline = socketChannel.pipeline(); + + /* LineBasedFrameDecoder的工作原理是:依次遍历ByteBuf中的可读字节, + 判断看其是否有”\n” 或 “\r\n”, 如果有就以此位置为结束位置。 + 从可读索引到结束位置的区间的字节就组成了一行。 它是以换行符为结束标志的解码器, + 支持携带结束符和不带结束符两种解码方式,同时支持配置单行的最大长度, + 如果读到了最大长度之后仍然没有发现换行符,则抛出异常,同时忽略掉之前读到的异常码流。*/ +// pipeline.addLast(new LineBasedFrameDecoder(10010)); + //字符串解码和编码 + //LineBasedFrameDecoder + StringDecoder 就是一个按行切换的文本解码器。 +// pipeline.addLast( new StringDecoder()); +// pipeline.addLast( new StringEncoder()); + // 设置读写超时操作 + // 入参说明: 读超时时间、写超时时间、所有类型的超时时间、时间格式 + pipeline.addLast(new IdleStateHandler(10, 0, 0, TimeUnit.SECONDS)); + //服务器的逻辑 + pipeline.addLast("handler", new EchoServerHandler()); + } + +} diff --git a/user-service/src/main/java/com/mh/user/primary/Clients.java b/user-service/src/main/java/com/mh/user/primary/Clients.java new file mode 100644 index 0000000..bd336a9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/primary/Clients.java @@ -0,0 +1,70 @@ +package com.mh.user.primary; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.Socket; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * @author ljf + * @title : + * @description : 使用原生的socket + * @updateTime 2020-05-20 + * @throws : + */ +public class Clients { + + Socket socketServer; + ExecutorService executorService; + + public Clients() throws IOException { + socketServer = new Socket("192.168.1.222", 10001); + // 创建新的线程池 + executorService = Executors.newCachedThreadPool(); + executorService.execute(new ClientThread(socketServer)); + } + + class ClientThread extends Thread{ + Socket socket; + BufferedReader in; + PrintWriter out; + InputStreamReader keybox = new InputStreamReader(System.in); + BufferedReader br = new BufferedReader(keybox); + public ClientThread(Socket socket) throws IOException { + this.socket = socket; + /**用于读取客户端返回的信息**/ + in = new BufferedReader(new InputStreamReader(socket.getInputStream())); + out = new PrintWriter(socket.getOutputStream()); + } + @Override + public void run() { + try { + while(true){ + String str = br.readLine(); + out.println(str); + out.flush(); + System.out.println("服务器响应"+in.readLine()); + if(str.equals("bye")){ + break; + } + } + in.close(); + out.close(); + socket.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } + + public static void main(String[] args) throws IOException { + new Clients(); + } + +} + diff --git a/user-service/src/main/java/com/mh/user/provide/ChillersProvider.java b/user-service/src/main/java/com/mh/user/provide/ChillersProvider.java new file mode 100644 index 0000000..d2fe310 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/provide/ChillersProvider.java @@ -0,0 +1,32 @@ +package com.mh.user.provide; + +import org.springframework.util.StringUtils; + +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-26 + * @throws : + */ +public class ChillersProvider { + + public String queryChillersByOther(Map param) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("select id, device_code, device_num, collection_num, register_address, register_name, function_code, digit, other_name," + + " data_com, last_value, last_time, create_time, update_time,ddc_addr, " + + " (select gateway_ip as IP from gateway_manage where data_com = c.data_com) as IP, " + + " (select port as port from gateway_manage where data_com = c.data_com) as port " + + " from chillers_register_address as c where c.grade = #{grade} "); + if (!StringUtils.isEmpty(param.get("ddcAddr"))) { + stringBuilder.append(" and ddc_addr = #{ddcAddr}"); + } +// stringBuilder.append(" order by c.id"); + // update by ljf on 2021-01-30 + stringBuilder.append(" order by device_code,register_address"); + return stringBuilder.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/provide/DeviceManageProvider.java b/user-service/src/main/java/com/mh/user/provide/DeviceManageProvider.java new file mode 100644 index 0000000..b312e3e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/provide/DeviceManageProvider.java @@ -0,0 +1,70 @@ +package com.mh.user.provide; + +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : 设备管理动态sql语句拼接 + * @updateTime 2020-05-15 + * @throws : + */ +public class DeviceManageProvider { + + public String getDeviceByOthers(Map params){ + System.out.println(params.get("deviceNum")); + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select id, device_code, device_num, collection_num, data_com, initial_value, device_rate, price, param_id, " + + "param_name, device_caliber, last_value, last_date, communication_type, create_time, update_time, device_type, remark, " + + "grade from device_manage"); + if (params.get("deviceNum") != null && !params.get("deviceNum").equals("")){ + sqlStr.append(" where device_num = #{deviceNum}"); + } + return sqlStr.toString(); + } + +// -- 分页查询(通用型) +// select top pageSize * +// from (select row_number() +// over(order by sno asc) as rownumber,* +// from student) temp_row +// where rownumber>((pageIndex-1)*pageSize); + public String queryDeviceByOthers(Map params) { + System.out.println(params); + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select top " + params.get("size") + " * from (select row_number() over(order by id asc) as rowNumber, id, device_code, device_num, collection_num, data_com, initial_value, price, param_id, " + + "param_name, last_value, last_date, communication_type, device_type, remark, grade from device_manage "); + if (params.get("deviceNum") != null && !params.get("deviceNum").equals("")){ + sqlStr.append(" where device_num = #{deviceNum}"); + } + sqlStr.append(" ) temp_row where rowNumber > (("+ params.get("page") +"-1)*" + params.get("size") + ")"); + return sqlStr.toString(); + } + + public String queryDeviceByOthersCount(Map params) { + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select count(id) from device_manage "); + if (params.get("deviceNum") != null && !params.get("deviceNum").equals("")){ + sqlStr.append(" where device_num = #{deviceNum}"); + } + return sqlStr.toString(); + } + + /** + * 删除设备信息 + * @param params + * @return + */ + public String deleteDeviceInfo(Map params){ + StringBuffer sqlStr = new StringBuffer(); + if(params.get("deviceType").equals("gateWay")){ + sqlStr.append("delete gateway_manage where gateway_id = #{deviceId}"); + } else if (params.get("deviceType").equals("baseMeterParam")){ + sqlStr.append("delete device_parameter where id = #{deviceId}"); + } else if (params.get("deviceType").equals("baseMeter")){ + sqlStr.append("delete device_manage where id = #{deviceId}"); + } + return sqlStr.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/provide/DeviceParamProvider.java b/user-service/src/main/java/com/mh/user/provide/DeviceParamProvider.java new file mode 100644 index 0000000..a34887a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/provide/DeviceParamProvider.java @@ -0,0 +1,45 @@ +package com.mh.user.provide; + +import java.util.Map; + +/** + * @author ljf + * @title : + * @description :网关管理提供类 + * @updateTime 2020-05-21 + * @throws : + */ +public class DeviceParamProvider { + + + public String getBaseMeterParamList(Map params){ + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select id,param_id,param_name,param_baudrate,grade,checks from device_parameter"); + if (params.get("baseMeterType") != null && !params.get("baseMeterType").equals("")){ + sqlStr.append(" where param_name like '%${baseMeterType}%'"); + } + return sqlStr.toString(); + } + + public String queryByOther(Map params) { + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select top " + params.get("size") + " * from (select row_number() over(order by id asc) as rowNumber, id, " + + "param_id, param_name, param_baudrate, grade, checks from device_parameter "); + if (params.get("gatewayID") != null && !params.get("gatewayID").equals("")){ + sqlStr.append(" where gateway_id = #{gatewayID}"); + } + sqlStr.append(" ) temp_row where rowNumber > (("+ params.get("page") +"-1)*" + params.get("size") + ")"); + return sqlStr.toString(); + } + + public String queryByOtherCount(Map params) { + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select top " + params.get("size") + " * from (select row_number() over(order by id asc) as rowNumber, id, " + + "param_id, param_name, param_baudrate, grade, checks from device_parameter "); + if (params.get("gatewayID") != null && !params.get("gatewayID").equals("")){ + sqlStr.append(" where gateway_id = #{gatewayID}"); + } + return sqlStr.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/provide/ExceptionProvider.java b/user-service/src/main/java/com/mh/user/provide/ExceptionProvider.java new file mode 100644 index 0000000..f848015 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/provide/ExceptionProvider.java @@ -0,0 +1,44 @@ +package com.mh.user.provide; + +import com.mh.user.entity.ExceptionEntity; + +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +public class ExceptionProvider { + + public String queryException(ExceptionEntity exceptionEntity) { + + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select top " + exceptionEntity.getLimit() + " * from (select row_number() over(order by id desc) as rowNumber, id, register_name, create_time, last_value, remark, state from device_exception_alarm where 1 = 1 "); + if (exceptionEntity.getBeginTime() != null && exceptionEntity.getEndTime() != null){ + sqlStr.append(" and convert(varchar(10),create_time,23) >= convert(varchar(10),#{beginTime}) and convert(varchar(10),create_time,23) <= convert(varchar(10),#{endTime})"); + } + if (exceptionEntity.getProcess() != null) { + sqlStr.append(" and state = #{process} "); + } + sqlStr.append(" ) temp_row where rowNumber > (("+ exceptionEntity.getPage() +"-1)*" + exceptionEntity.getLimit() + ")"); + return sqlStr.toString(); + + } + + public String queryExceptionTotal(ExceptionEntity exceptionEntity) { + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select count(id) from device_exception_alarm where 1 = 1 "); + if (exceptionEntity.getBeginTime() != null && exceptionEntity.getEndTime() != null){ + sqlStr.append(" and convert(varchar(10),create_time,23) >= convert(varchar(10),#{beginTime}) and convert(varchar(10),create_time,23) <= convert(varchar(10),#{endTime})"); + } + if (exceptionEntity.getProcess() != null) { + sqlStr.append(" and state = #{process}"); + } + return sqlStr.toString(); + + } + +} diff --git a/user-service/src/main/java/com/mh/user/provide/GatewayManageProvider.java b/user-service/src/main/java/com/mh/user/provide/GatewayManageProvider.java new file mode 100644 index 0000000..6bd1ecb --- /dev/null +++ b/user-service/src/main/java/com/mh/user/provide/GatewayManageProvider.java @@ -0,0 +1,44 @@ +package com.mh.user.provide; + +import java.util.Map; + +/** + * @author ljf + * @title : + * @description :网关管理提供类 + * @updateTime 2020-05-21 + * @throws : + */ +public class GatewayManageProvider { + + public String queryByOther(Map params) { + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select id, gateway_name, gateway_ip, gateway_address, data_com, " + + "create_date, connect_date, internet_card, operator, gateway_port, grade from gateway_manage where 1=1 "); + if(params.get("grade") != null){ + sqlStr.append(" and grade = #{grade}"); + } + if(params.get("operator") != null){ + sqlStr.append(" and operator = #{operator}"); + } + sqlStr.append(" order by id"); +// sqlStr.append("select top " + params.get("size") + " * from (select row_number() over(order by id asc) as rowNumber, id, " + +// "gateway_id, gateway_name, gateway_ip, gateway_address, data_com, collection_loop, connect_date, internet_card, operator, port, grade from gateway_manage "); +// if (params.get("gatewayID") != null && !params.get("gatewayID").equals("")){ +// sqlStr.append(" where param_id = #{paramId}"); +// } +// sqlStr.append(" ) temp_row where rowNumber > (("+ params.get("page") +"-1)*" + params.get("size") + ")"); + return sqlStr.toString(); + } + + public String queryByOtherCount(Map params) { + StringBuffer sqlStr = new StringBuffer(); + sqlStr.append("select top " + params.get("size") + " * from (select row_number() over(order by id asc) as rowNumber, id, " + + "gateway_name, gateway_ip, gateway_address, data_com, connect_date, internet_card, operator, gateway_port, grade from gateway_manage "); + if (params.get("paramId") != null && !params.get("paramId").equals("")){ + sqlStr.append(" where param_id = #{paramId}"); + } + return sqlStr.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/provide/GaugeProvider.java b/user-service/src/main/java/com/mh/user/provide/GaugeProvider.java new file mode 100644 index 0000000..88269f7 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/provide/GaugeProvider.java @@ -0,0 +1,26 @@ +package com.mh.user.provide; + +import java.util.ArrayList; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-08-07 + * @throws : + */ +public class GaugeProvider { + + /** + * type:分析图类型(0:当前制冷量,1:当前COP,2:运行功率,3:冷却水趋近度,4:当前频率,5:当前速度,6:功率,7:电流) + * deviceName:1号冷水机、2号冷水机、1~6号冷却泵、1~6号冷冻泵、1~11号冷却塔 + * @param type + * @param deviceName + * @return + */ + public String getGaugeData(String type, String deviceName) { + StringBuffer stringBuffer = new StringBuffer(); + return stringBuffer.toString(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/security/GrantedAuthorityImpl.java b/user-service/src/main/java/com/mh/user/security/GrantedAuthorityImpl.java new file mode 100644 index 0000000..281e7df --- /dev/null +++ b/user-service/src/main/java/com/mh/user/security/GrantedAuthorityImpl.java @@ -0,0 +1,29 @@ +package com.mh.user.security; +import org.springframework.security.core.GrantedAuthority; + +/** + * 权限封装 + * @author Louis + * @date Jan 14, 2019 + */ +public class GrantedAuthorityImpl implements GrantedAuthority { + + private static final long serialVersionUID = 1L; + + private String authority; + + public GrantedAuthorityImpl(String authority) { + + this.authority = authority; + System.out.println("权限列表:"+authority); + } + + public void setAuthority(String authority) { + this.authority = authority; + } + + @Override + public String getAuthority() { + return this.authority; + } +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/security/JwtAuthenticatioToken.java b/user-service/src/main/java/com/mh/user/security/JwtAuthenticatioToken.java new file mode 100644 index 0000000..0d6701e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/security/JwtAuthenticatioToken.java @@ -0,0 +1,45 @@ +package com.mh.user.security; + +import java.util.Collection; + +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +/** + * 自定义令牌对象 + * @author Louis + * @date Jan 14, 2019 + */ +public class JwtAuthenticatioToken extends UsernamePasswordAuthenticationToken { + + private static final long serialVersionUID = 1L; + + private String token; + + public JwtAuthenticatioToken(Object principal, Object credentials){ + super(principal, credentials); + } + + public JwtAuthenticatioToken(Object principal, Object credentials, String token){ + super(principal, credentials); + this.token = token; + } + + public JwtAuthenticatioToken(Object principal, Object credentials, Collection authorities, String token) { + super(principal, credentials, authorities); + this.token = token; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + +} diff --git a/user-service/src/main/java/com/mh/user/security/JwtAuthenticationFilter.java b/user-service/src/main/java/com/mh/user/security/JwtAuthenticationFilter.java new file mode 100644 index 0000000..185df17 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/security/JwtAuthenticationFilter.java @@ -0,0 +1,35 @@ +package com.mh.user.security; + +import java.io.IOException; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import com.mh.user.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; + +/** + * 登录认证过滤器 + * @author Louis + * @date Jan 14, 2019 + */ +public class JwtAuthenticationFilter extends BasicAuthenticationFilter { + + + @Autowired + public JwtAuthenticationFilter(AuthenticationManager authenticationManager) { + super(authenticationManager); + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { + // 获取token, 并检查登录状态 + SecurityUtils.checkAuthentication(request); + chain.doFilter(request, response); + System.out.println("test3"); + } + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/security/JwtAuthenticationProvider.java b/user-service/src/main/java/com/mh/user/security/JwtAuthenticationProvider.java new file mode 100644 index 0000000..6e5ac3d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/security/JwtAuthenticationProvider.java @@ -0,0 +1,39 @@ +package com.mh.user.security; + +import com.mh.user.utils.PasswordEncoder; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; + +/** + * 身份验证提供者 + * @author Louis + * @date Jan 14, 2019 + */ +public class JwtAuthenticationProvider extends DaoAuthenticationProvider { + + public JwtAuthenticationProvider(UserDetailsService userDetailsService) { + setUserDetailsService(userDetailsService); + } + + @Override + protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) + throws AuthenticationException { + if (authentication.getCredentials() == null) { + logger.debug("Authentication failed: no credentials provided"); + throw new BadCredentialsException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + + String presentedPassword = authentication.getCredentials().toString(); + String salt = ((JwtUserDetails) userDetails).getSalt(); + // 覆写密码验证逻辑 + if (!new PasswordEncoder(salt).matches(userDetails.getPassword(), presentedPassword)) { + logger.debug("Authentication failed: password does not match stored value"); + throw new BadCredentialsException(messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + } + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/security/JwtUserDetails.java b/user-service/src/main/java/com/mh/user/security/JwtUserDetails.java new file mode 100644 index 0000000..82385a5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/security/JwtUserDetails.java @@ -0,0 +1,74 @@ +package com.mh.user.security; +import java.util.Collection; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 安全用户模型 + * @author Louis + * @date Jan 14, 2019 + */ +public class JwtUserDetails implements UserDetails { + + private static final long serialVersionUID = 1L; + + private String username; + private String password; + private String salt; + private Collection authorities; + + JwtUserDetails(String username, String password, String salt, Collection authorities) { + this.username = username; + this.password = password; + this.salt = salt; + this.authorities = authorities; + } + + @Override + public String getUsername() { + return username; + } + + @JsonIgnore + @Override + public String getPassword() { + return password; + } + + public String getSalt() { + return salt; + } + + @Override + public Collection getAuthorities() { + return authorities; + } + + @JsonIgnore + @Override + public boolean isAccountNonExpired() { + return true; + } + + @JsonIgnore + @Override + public boolean isAccountNonLocked() { + return true; + } + + @JsonIgnore + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @JsonIgnore + @Override + public boolean isEnabled() { + return true; + } + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/security/UserDetailsServiceImpl.java b/user-service/src/main/java/com/mh/user/security/UserDetailsServiceImpl.java new file mode 100644 index 0000000..9e07dd4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/security/UserDetailsServiceImpl.java @@ -0,0 +1,41 @@ +package com.mh.user.security; + +import com.mh.user.model.SysUser; +import com.mh.user.service.SysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 用户登录认证信息查询 + * @author Louis + * @date Jan 14, 2019 + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + + @Autowired(required = false) + private SysUserService sysUserService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + System.out.println("test1"); + SysUser user = sysUserService.findByName(username); + if (user == null) { + throw new UsernameNotFoundException("该用户不存在"); + } + // 用户权限列表,根据用户拥有的权限标识与如 @PreAuthorize("hasAuthority('sys:menu:view')") 标注的接口对比,决定是否可以调用接口 + Set permissions = sysUserService.findPermissions(user.getSystemID(),user.getUserName()); + List grantedAuthorities = permissions.stream().map(GrantedAuthorityImpl::new).collect(Collectors.toList()); + System.out.println("获取权限列表"+grantedAuthorities); + System.out.println(user.getUserName()); + return new JwtUserDetails(user.getUserName(), user.getPassword(), user.getSalt(), grantedAuthorities); + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortListener.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortListener.java new file mode 100644 index 0000000..f911983 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortListener.java @@ -0,0 +1,161 @@ +package com.mh.user.serialport; + +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.SendOrderUtils; +import com.mh.user.utils.SpringBeanUtil; +import gnu.io.SerialPort; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; +import lombok.SneakyThrows; +import org.springframework.context.ApplicationContext; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 串口监听器 + * @author mar + * @date 2021年08月10日 09:56 + */ +public class SerialPortListener implements SerialPortEventListener { + + private String receiveStr = null; +// public static SerialPort serialPort = null; + public SerialPort serialPort = null; + private int num = 0; + private int size = 0; + List deviceManageEntityList; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + + @SneakyThrows + @Override + public void serialEvent(SerialPortEvent arg0) { + if (arg0.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); +// byte[] bytes = serialPortUtil.readFromPort(serialPort); + byte[] bytes = serialPortUtil.readFromPort(SerialPortThread.serialPort); + String byteStr = new String(bytes, 0, bytes.length).trim(); + System.out.println("===========start==========="); + receiveStr = receiveStr + printHexString(bytes); + receiveStr = receiveStr.replace("null", ""); + receiveStr = receiveStr.replace(" ", ""); + System.out.println(new Date() + "【字节数组转16进制字符串】:" + receiveStr); + System.out.println("接受服务器数据:" + receiveStr + ",大小: " + receiveStr.length()); + System.out.println("===========end==========="); + size = deviceManageEntityList.size(); + } + } + + public void serialPortSend(String comName){ + + //查看所有串口 + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + ArrayList port = serialPortUtil.findPort(); + System.out.println("发现全部串口:" + port); + if (port.contains(comName)){ + //打开该对应comName名字的串口 + if (serialPort != null) { //打开之前先关闭 + serialPortUtil.closePort(serialPort); + serialPort = null; + } + System.out.println("打开指定串口:" + comName); + serialPort = serialPortUtil.openPort(comName, 2400, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD); + //给对应的serialPort添加监听器 + serialPortUtil.addListener(serialPort, new SerialPortListener()); + try{ + //生成对应的采集指令 + deviceManageEntityList = deviceCodeParamService.queryCodeParam2(comName); + System.out.println("打印列表:"+deviceManageEntityList); + size = deviceManageEntityList.size(); +// SendOrderUtils.sendSerialPort(deviceManageEntityList.get(0), serialPort); + Thread.sleep(1000); + }catch (Exception e){ + e.printStackTrace(); + } + }else { + System.out.println("串口:"+comName+"不存在!" ); + } + } + + + /** + * 字节数组转16进制字符串 + * @param b 字节数组 + * @return 16进制字符串 + */ + public static String printHexString(byte[] b) { + StringBuilder sbf = new StringBuilder(); + for (byte value : b) { + String hex = Integer.toHexString(value & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sbf.append(hex.toUpperCase()).append(" "); + } + return sbf.toString().trim(); + } + + /** + * 十六进制字符串转byte[] + * @param hex 十六进制字符串 + * @return byte[] + */ + public static byte[] hexStr2Byte(String hex) { + if (hex == null) { + return new byte[] {}; + } + + // 奇数位补0 + if (hex.length() % 2 != 0) { + hex = "0" + hex; + } + + int length = hex.length(); + ByteBuffer buffer = ByteBuffer.allocate(length / 2); + for (int i = 0; i < length; i++) { + String hexStr = hex.charAt(i) + ""; + i++; + hexStr += hex.charAt(i); + byte b = (byte) Integer.parseInt(hexStr, 16); + buffer.put(b); + } + return buffer.array(); + } + + /** + * 16进制转换成为string类型字符串 + * @param s 待转换字符串 + */ + public static String hexStringToString(String s) { + if (s == null || "".equals(s)) { + 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; + } + +} + + + diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java new file mode 100644 index 0000000..44875d0 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java @@ -0,0 +1,223 @@ +package com.mh.user.serialport; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.utils.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.log4j.Logger; +import org.springframework.context.ApplicationContext; +//import purejavacomm.SerialPort; +import gnu.io.SerialPort; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author nxr + * @title : + * @description : 串口发送和接收处理,采集类 + * @updateTime 2022-08-10 + * @throws : + */ + +//@Slf4j +public class SerialPortSendReceive { + + private String receiveStr = null; + public SerialPort serialPort = null; + private int size = 0; + private int baudrate=9600; + private String parity=null; + List deviceManageEntityList; + private static final Logger log = Logger.getLogger(SerialPortSendReceive.class); + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + + public void serialPortSend(String comName) { + //查看所有串口 + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + ArrayList port = serialPortUtil.findPort(); +// SerialTool serialPortUtil = SerialTool.getSerialPortUtil(); +// ArrayList port = serialPortUtil.findPort(); + +// comName=comName.toUpperCase(); //转为大写 +// if (port.contains(comName)){ + try{ + //生成对应的采集指令 + deviceManageEntityList = deviceCodeParamService.queryCodeParam3(); + size = deviceManageEntityList.size(); + for (int i=0;i8){ + String str1=receiveData.substring(0,8); + String str2=receiveData.substring(8); + dataStr=str1.replace("FE", "")+str2; + }else{ + dataStr = receiveData.replace("FE", ""); + } + + String deviceType=deviceManageEntityList.get(i).getDeviceType(); + String registerAddr=deviceManageEntityList.get(i).getRegisterAddr(); + String brand=deviceManageEntityList.get(i).getBrand();//品牌 + String buildingId=deviceManageEntityList.get(i).getProjectID(); + + System.out.println("=========设备类型:"+deviceType+",长度:"+dataStr.length()); + //下面是对返回数据根据不同的设备进行相关解析处理 + try{ + if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length()==40 || dataStr.length()==50) && deviceType.equals("电表")) { + analysisReceiveOrder485.analysisMeterOrder485(dataStr,deviceManageEntityList.get(i)); + }else if ((dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { + analysisReceiveOrder485.analysisWtMeterOrder485(dataStr,registerAddr,brand,buildingId); + } + + }catch (Exception e){ +// e.printStackTrace(); + log.error(deviceManageEntityList.get(i).getDeviceType()+"保存数据库失败!"+i); + serialPortUtil.closePort(serialPort); + System.out.println("关闭"+serialPort); + Thread.sleep(10000); + } + + try{ + serialPortUtil.closePort(serialPort); + System.out.println("关闭"+serialPort); + Thread.sleep(10000); + }catch (Exception e){ + e.printStackTrace(); + } + }else{ + log.info("串口:"+comName+"不存在!"); + } + } + + }catch (Exception e){ + log.error("串口采集异常!"); + } +// }else { +// log.info("串口:"+comName+"不存在!"); +// } + } + + /** + * 字节数组转16进制字符串 + * @param b 字节数组 + * @return 16进制字符串 + */ + public static String printHexString(byte[] b) { + StringBuilder sbf = new StringBuilder(); + for (byte value : b) { + String hex = Integer.toHexString(value & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sbf.append(hex.toUpperCase()).append(" "); + } + return sbf.toString().trim(); + } + + /** + * 十六进制字符串转byte[] + * @param hex 十六进制字符串 + * @return byte[] + */ + public static byte[] hexStr2Byte(String hex) { + if (hex == null) { + return new byte[] {}; + } + // 奇数位补0 + if (hex.length() % 2 != 0) { + hex = "0" + hex; + } + + int length = hex.length(); + ByteBuffer buffer = ByteBuffer.allocate(length / 2); + for (int i = 0; i < length; i++) { + String hexStr = hex.charAt(i) + ""; + i++; + hexStr += hex.charAt(i); + byte b = (byte) Integer.parseInt(hexStr, 16); + buffer.put(b); + } + return buffer.array(); + } + + /** + * 16进制转换成为string类型字符串 + * @param s 待转换字符串 + */ + public static String hexStringToString(String s) { + if (s == null || "".equals(s)) { + 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; + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java new file mode 100644 index 0000000..a27bc43 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java @@ -0,0 +1,195 @@ +package com.mh.user.serialport; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.SendOrderUtils; +import com.mh.user.utils.SpringBeanUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.log4j.Logger; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; +//import purejavacomm.SerialPort; +import gnu.io.SerialPort; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +/** + * @author nxr + * @title : + * @description : 串口发送和接收处理,操作类 + * @updateTime 2022-08-10 + * @throws : + */ +//@Slf4j +public class SerialPortSingle { + + public SerialPort serialPort = null; + private String receiveStr = null; + private int baudrate=9600; + private static final Logger log = Logger.getLogger(SerialPortSingle.class); + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + + public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity){ + + //查看所有串口 + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + ArrayList port = serialPortUtil.findPort(); + +// SerialTool serialPortUtil = SerialTool.getSerialPortUtil(); +// ArrayList port = serialPortUtil.findPort(); + + System.out.println("发现全部串口:" + port); + String comName=deviceCodeParamEntity.getDataPort().toUpperCase(); + if (port.contains(comName)){ + try{ + baudrate=deviceCodeParamEntity.getBaudRate(); + serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD); + //向串口发送指令 + SendOrderUtils.sendSerialPort(deviceCodeParamEntity, serialPort); + log.info("单抄向串口"+serialPort+"发送指令!"); +// try{ +// Thread.sleep(1500); +// }catch (Exception e){ +// e.printStackTrace(); +// } +// +// //对返回数据进行相关解析处理 +// receiveStr=null; +// byte[] bytes = serialPortUtil.readFromPort(serialPort); //读取串口数据 +// try { +// String byteStr = new String(bytes, 0, bytes.length).trim(); +// } catch (NullPointerException e) { +// serialPortUtil.closePort(serialPort); +// try{ +// Thread.sleep(2000); +// }catch (Exception t){ +// t.printStackTrace(); +// } +// log.info("单抄串口"+serialPort+"没有数据返回!"); +// } +// System.out.println("===========start==========="); +// receiveStr = receiveStr + printHexString(bytes); +// //去掉空格和null +// receiveStr = receiveStr.replace("null", ""); +// receiveStr = receiveStr.replace(" ", ""); +// log.info("串口"+serialPort+"接收数据:" + receiveStr + ",大小: " + receiveStr.length()); + System.out.println("============end============"); + //模拟返回数据 +// receiveStr="021006420001a166";//温度设定 +// receiveStr="0210065600042161";//热泵设定时段 + receiveStr="220712000000013c";//水位设定 + //返回值全部变成大写 + String receiveData = receiveStr.toUpperCase(); + //截取去掉FE + String dataStr = receiveData.replace("FE", ""); + String deviceType=deviceCodeParamEntity.getDeviceType(); + String deviceAddr=deviceCodeParamEntity.getDeviceAddr(); + String brand=deviceCodeParamEntity.getBrand(); + String buildingId=deviceCodeParamEntity.getProjectID(); + try{ + if ((dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { + analysisReceiveOrder485.analysisWtMeterOrder485(dataStr,deviceAddr,brand,buildingId); + } else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length()==40 || dataStr.length()==50) && deviceType.equals("电表")) { + analysisReceiveOrder485.analysisMeterOrder485(dataStr,deviceCodeParamEntity); + } + }catch (Exception e){ +// e.printStackTrace(); + log.error(deviceCodeParamEntity.getDeviceType()+"单抄保存数据库失败!"+0); + serialPortUtil.closePort(serialPort); + } + + serialPortUtil.closePort(serialPort); + Constant.WEB_FLAG=false; //没有指令下发定时采集生效 + System.out.println("关闭"+serialPort); + try{ + Thread.sleep(500); + }catch (Exception e){ + e.printStackTrace(); + } + return ""; + }catch (Exception e){ + e.printStackTrace(); + } + + }else { +// System.out.println("串口:"+comName+"不存在!" ); + log.info("串口:"+comName+"不存在!"); + } + return ""; + } + /** + * 字节数组转16进制字符串 + * @param b 字节数组 + * @return 16进制字符串 + */ + public static String printHexString(byte[] b) { + StringBuilder sbf = new StringBuilder(); + for (byte value : b) { + String hex = Integer.toHexString(value & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sbf.append(hex.toUpperCase()).append(" "); + } + return sbf.toString().trim(); + } + + /** + * 十六进制字符串转byte[] + * @param hex 十六进制字符串 + * @return byte[] + */ + public static byte[] hexStr2Byte(String hex) { + if (hex == null) { + return new byte[] {}; + } + + // 奇数位补0 + if (hex.length() % 2 != 0) { + hex = "0" + hex; + } + + int length = hex.length(); + ByteBuffer buffer = ByteBuffer.allocate(length / 2); + for (int i = 0; i < length; i++) { + String hexStr = hex.charAt(i) + ""; + i++; + hexStr += hex.charAt(i); + byte b = (byte) Integer.parseInt(hexStr, 16); + buffer.put(b); + } + return buffer.array(); + } + /** + * 16进制转换成为string类型字符串 + * @param s 待转换字符串 + */ + public static String hexStringToString(String s) { + if (s == null || "".equals(s)) { + 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; + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortThread.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortThread.java new file mode 100644 index 0000000..dfec24c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortThread.java @@ -0,0 +1,77 @@ +package com.mh.user.serialport; + +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.utils.*; +import gnu.io.SerialPort; +import lombok.extern.slf4j.Slf4j; +import org.apache.log4j.Logger; +import org.springframework.context.ApplicationContext; +import java.util.List; + +/** + * @author nxr + * @title : + * @description : 串口线程处理 + * @updateTime 2022-08-10 + * @throws : + */ + +//@Slf4j +public class SerialPortThread implements Runnable{ + + private static final Logger log = Logger.getLogger(SerialPortThread.class); + private int num = 0; + private int size = 0; + public static SerialPort serialPort = null; + private String name; + public void setName(String name){ + this.name = name; + } + + List deviceManageEntityList; + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + + + public void run(){ +// SerialPortListener serial=new SerialPortListener(); +// serial.serialPortSend(name); + log.info(name+"串口创建发送接收数据线程>>>>>>>>>>>>>>"); +// System.out.println(name+"串口创建发送接收数据线程>>>>>>>>>>>>>>"); + SerialPortSendReceive serial=new SerialPortSendReceive(); + serial.serialPortSend(name); + + //查看所有串口 +// SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); +// ArrayList port = serialPortUtil.findPort(); +// System.out.println("发现全部串口:" + port); +// if (port.contains(name)){ +// //打开该对应comName名字的串口 +// if (serialPort != null) { //打开之前先关闭 +// serialPortUtil.closePort(serialPort); +// serialPort = null; +// } +// System.out.println("打开指定串口:" + name); +// serialPort = serialPortUtil.openPort(name, 2400, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD); +// //给对应的serialPort添加监听器 +// serialPortUtil.addListener(serialPort, new SerialPortListener()); +// try{ +// //生成对应的采集指令 +// deviceManageEntityList = deviceCodeParamService.queryCodeParam2(name); +// System.out.println("打印列表:"+deviceManageEntityList); +// size = deviceManageEntityList.size(); +// SendOrderUtils.sendSerialPort(deviceManageEntityList.get(0),0, serialPort); +// Thread.sleep(1000); +// }catch (Exception e){ +// e.printStackTrace(); +// } +// +// }else { +// System.out.println("串口:"+name+"不存在!" ); +// } + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortUtil.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortUtil.java new file mode 100644 index 0000000..92f2123 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortUtil.java @@ -0,0 +1,232 @@ +package com.mh.user.serialport; + +import gnu.io.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.TooManyListenersException; + +/** + * @description : 串口工具类(RXTXcomm.jar、rxtxParallel.dll和rxtxSerial.dll) + * @author nxr + * @date 2022年08月10日 09:54 + */ +public class SerialPortUtil { + + private static final Logger logger = LoggerFactory.getLogger(SerialPortUtil.class); + + private static SerialPortUtil serialPortUtil = null; + + static { + //在该类被ClassLoader加载时就初始化一个SerialTool对象 + if (serialPortUtil == null) { + serialPortUtil = new SerialPortUtil(); + } + } + + //私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象 + private SerialPortUtil() { + } + + /** + * 获取提供服务的SerialTool对象 + * @return serialPortUtil + */ + public static SerialPortUtil getSerialPortUtil() { + if (serialPortUtil == null) { + serialPortUtil = new SerialPortUtil(); + } + return serialPortUtil; + } + + /** + * 查找所有可用端口 + * @return 可用端口名称列表 + */ + public ArrayList findPort() { + //获得当前所有可用串口 + Enumeration portList = CommPortIdentifier.getPortIdentifiers(); + ArrayList portNameList = new ArrayList<>(); + //将可用串口名添加到List并返回该List + while (portList.hasMoreElements()) { + String portName = portList.nextElement().getName(); + portNameList.add(portName); + } + return portNameList; + } + + /** + * 打开串口 + * @param portName 端口名称 + * @param baudrate 波特率 19200 + * @param databits 数据位 8 + * @param parity 校验位(奇偶位) NONE :0 + * @param stopbits 停止位 1 + * @return 串口对象 + * // * @throws SerialPortParameterFailure 设置串口参数失败 + * // * @throws NotASerialPort 端口指向设备不是串口类型 + * // * @throws NoSuchPort 没有该端口对应的串口设备 + * // * @throws PortInUse 端口已被占用 + */ + public SerialPort openPort(String portName, int baudrate, int databits, int parity, int stopbits) { + try { + //通过端口名识别端口 + CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); + + //打开端口,并给端口名字和一个timeout(打开操作的超时时间) + CommPort commPort = portIdentifier.open(portName, 2000); + + //判断是不是串口 + if (commPort instanceof SerialPort) { + + SerialPort serialPort = (SerialPort) commPort; + try { + //设置一下串口的波特率等参数 + serialPort.setSerialPortParams(baudrate, databits, stopbits, parity); + } catch (UnsupportedCommOperationException e) { + } + System.out.println("Open " + portName + " sucessfully !"); + return serialPort; + } else { + logger.error("不是串口"); + } + } catch (NoSuchPortException e1) { + logger.error("没有找到端口"); + e1.printStackTrace(); + } catch (PortInUseException e2) { + logger.error("端口被占用"); + e2.printStackTrace(); + } + return null; + } + + /** + * 关闭串口 + * @param serialPort 待关闭的串口对象 + */ + public void closePort(SerialPort serialPort) { + if (serialPort != null) { + serialPort.close(); +// serialPort=null; + } + } + + /** + * 往串口发送数据 + * @param serialPort 串口对象 + * @param order 待发送数据 + * // * @throws SendDataToSerialPortFailure 向串口发送数据失败 + * // * @throws SerialPortOutputStreamCloseFailure 关闭串口对象的输出流出错 + */ + public void sendToPort(SerialPort serialPort, byte[] order) { + OutputStream out = null; + try { + out = serialPort.getOutputStream(); + out.write(order); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 从串口读取数据 + * @param serialPort 当前已建立连接的SerialPort对象 + * @return 读取到的数据 + * // * @throws ReadDataFromSerialPortFailure 从串口读取数据时出错 + * // * @throws SerialPortInputStreamCloseFailure 关闭串口对象输入流出错 + */ + public byte[] readFromPort(SerialPort serialPort) { + + InputStream in = null; + byte[] bytes = null; + + try { + in = serialPort.getInputStream(); + int bufflenth = in.available(); + + while (bufflenth != 0) { + bytes = new byte[bufflenth]; + in.read(bytes); + bufflenth = in.available(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return bytes; + } + + + /** + * 添加监听器 + * @param port 串口对象 + * @param listener 串口监听器 + * // * @throws TooManyListeners 监听类对象过多 + */ + public void addListener(SerialPort port, SerialPortEventListener listener) { + + try { + //给串口添加监听器 + port.addEventListener(listener); + //设置当有数据到达时唤醒监听接收线程 + port.notifyOnDataAvailable(true); + //设置当通信中断时唤醒中断线程 + port.notifyOnBreakInterrupt(true); + } catch (TooManyListenersException e) { +// throw new TooManyListeners(); + logger.error("太多监听器"); + e.printStackTrace(); + } + } + + /** + * 删除监听器 + * @param port 串口对象 + * @param listener 串口监听器 + * // * @throws TooManyListeners 监听类对象过多 + */ + public void removeListener(SerialPort port, SerialPortEventListener listener) { + //删除串口监听器 + port.removeEventListener(); + } + + /** + * 设置串口的Listener + * @author mar + * @date 2021/8/20 11:04 + * @param serialPort + * @param listener + */ + public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener){ + try { + //给串口添加事件监听 + serialPort.addEventListener(listener); + } catch (TooManyListenersException e) { + e.printStackTrace(); + } + //串口有数据监听 + serialPort.notifyOnDataAvailable(true); + //中断事件监听 + serialPort.notifyOnBreakInterrupt(true); + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialResquest.java b/user-service/src/main/java/com/mh/user/serialport/SerialResquest.java new file mode 100644 index 0000000..0a8b7a2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialResquest.java @@ -0,0 +1,118 @@ +package com.mh.user.serialport; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import purejavacomm.SerialPort; +import purejavacomm.SerialPortEvent; +import purejavacomm.SerialPortEventListener; + +import java.io.IOException; + +/** + * @description : 串口发送和接收(驱动purejavacomm) + * @author nxr + * @date 2022年08月10日 09:54 + */ + +public class SerialResquest { + + private static Logger logger = LoggerFactory.getLogger(SerialResquest.class); + +// public static void resquest(String portName, Integer baudrate, Integer dataBits, Integer stopBits, +// Integer parity,byte[] data) throws Exception { +// SerialPort serialPort; +// if (!GlobalCache.smap.containsKey(portName)) { +// GlobalCache.bmap.put(portName, false); +// serialPort = SerialTool.openPort(portName, baudrate, dataBits, stopBits, parity); +// GlobalCache.smap.put(portName, serialPort); +// SerialTool.addListener(new SerialPortEventListener() { +// +// @Override +// public void serialEvent(SerialPortEvent event) { +// try { +// Thread.sleep(50); +// } catch (InterruptedException e1) { +// logger.error("SerialResquest 监听异常!"+e1); +// } +// switch (event.getEventType()) { +// case SerialPortEvent.DATA_AVAILABLE: +// byte[] readBuffer = null; +// int availableBytes = 0; +// try { +// availableBytes = serialPort.getInputStream().available(); +// if (availableBytes > 0) { +// try { +// readBuffer = SerialTool.readFromPort(serialPort); +// GlobalCache.bmap.put(portName, true); +// GlobalCache.dmap.put(portName, readBuffer); +// } catch (Exception e) { +// logger.error("读取推送信息异常!"+e); +// } +// } +// } catch (IOException e) { +// logger.error("读取流信息异常!"+e); +// } +// } +// } +// +// }, serialPort); +// }else { +// serialPort = GlobalCache.smap.get(portName); +// } +// SerialTool.sendToPort(data, serialPort); +// } +// +// public static byte[] response(String portName) throws InterruptedException { +// /*if (!GlobalCache.dmap.containsKey(portName)) { +// return null; +// }*/ +// Thread.sleep(100); +// int i =0; +// while (!GlobalCache.bmap.get(portName)) { +// Thread.sleep(100); +// if (i++>30) { +// return new byte[0]; +// } +// } +// GlobalCache.bmap.put(portName, false); +// return GlobalCache.dmap.get(portName); +// } +// +// public static void close(String portName) throws IOException { +// SerialTool.closePort(GlobalCache.smap.get(portName)); +// GlobalCache.smap.remove(portName); +// } + + public static short toShort(byte b1, byte b2) { + return (short) (b1 << 8 | b2 & 0xFF); + } + + private float bytes2Float(byte[] bytes) { + String BinaryStr = bytes2BinaryStr(bytes); + // 符号位S + Long s = Long.parseLong(BinaryStr.substring(0, 1)); + // 指数位E + Long e = Long.parseLong(BinaryStr.substring(1, 9), 2); + // 位数M + String M = BinaryStr.substring(9); + float m = 0, a, b; + for (int i = 0; i < M.length(); i++) { + a = Integer.valueOf(M.charAt(i) + ""); + b = (float) Math.pow(2, i + 1); + m = m + (a / b); + } + Float f = (float) ((Math.pow(-1, s)) * (1 + m) * (Math.pow(2, (e - 127)))); + return f; + } + + private static String bytes2BinaryStr(byte[] bytes) { + StringBuffer binaryStr = new StringBuffer(); + for (int i = 0; i < bytes.length; i++) { + String str = Integer.toBinaryString((bytes[i] & 0xFF) + 0x100).substring(1); + binaryStr.append(str); + } + return binaryStr.toString(); + } + +} + diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialTool.java b/user-service/src/main/java/com/mh/user/serialport/SerialTool.java new file mode 100644 index 0000000..07750e6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/serialport/SerialTool.java @@ -0,0 +1,274 @@ +package com.mh.user.serialport; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.TooManyListenersException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import purejavacomm.CommPort; +import purejavacomm.CommPortIdentifier; +import purejavacomm.NoSuchPortException; +import purejavacomm.PortInUseException; +import purejavacomm.SerialPort; +import purejavacomm.SerialPortEventListener; +import purejavacomm.UnsupportedCommOperationException; + +/** + * @description : 串口工具类(purejavacomm) + * @author nxr + * @date 2022年08月10日 09:54 + */ + +@Component +public class SerialTool { + private static Logger logger = LoggerFactory.getLogger(SerialTool.class); + + private static SerialTool serialTool = null; + + static { + //在该类被ClassLoader加载时就初始化一个SerialTool对象 + if (serialTool == null) { + serialTool = new SerialTool(); + } + } + + + //私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象 + private SerialTool() { + } + + /** + * 获取提供服务的SerialTool对象 + * @return serialPortUtil + */ + public static SerialTool getSerialPortUtil() { + if (serialTool == null) { + serialTool = new SerialTool(); + } + return serialTool; + } + + /** + * 查找所有可用端口 + * @return 可用端口名称列表 + */ + public static final ArrayList findPort() { + // 获得当前所有可用串口 + Enumeration portList = CommPortIdentifier.getPortIdentifiers(); + ArrayList portNameList = new ArrayList(); + // 将可用串口名添加到List并返回该List + while (portList.hasMoreElements()) { + String portName = portList.nextElement().getName(); + portNameList.add(portName); + } + return portNameList; + } + + /** + * 打开串口 + * + * @param portName + * 端口名称 + * @param baudrate + * 波特率 + * @return 串口对象 +// * @throws Exception +// * @throws SerialPortParameterFailure +// * 设置串口参数失败 +// * @throws NotASerialPort +// * 端口指向设备不是串口类型 +// * @throws NoSuchPort +// * 没有该端口对应的串口设备 +// * @throws PortInUse + * 端口已被占用 + */ + public static SerialPort openPort(String portName, Integer baudrate, Integer dataBits, Integer stopBits, + Integer parity) throws Exception { + try { + + // 通过端口名识别端口 + CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); + + // 打开端口,并给端口名字和一个timeout(打开操作的超时时间) + CommPort commPort = portIdentifier.open(portName, 2000); + + // 判断是不是串口 + if (commPort instanceof SerialPort) { + SerialPort serialPort = (SerialPort) commPort; + try { + // 设置一下串口的波特率等参数 + serialPort.setSerialPortParams(baudrate, dataBits, stopBits, parity); + logger.info("串口" + portName + "打开成功"); + } catch (UnsupportedCommOperationException e) { + logger.error("设置串口" + portName + "参数失败:" + e.getMessage()); + throw e; + } + + return serialPort; + + } else { + logger.error("不是串口" + portName); + // 不是串口 + throw new Exception(); + } + } catch (NoSuchPortException e1) { + logger.error("无此串口" + portName); + throw e1; + } catch (PortInUseException e2) { + logger.error("串口使用中" + portName); + throw e2; + } catch (Exception e) { + throw e; + } + } + + public static byte[] HexString2Bytes(String src) { + if (null == src || 0 == src.length()) { + return null; + } + byte[] ret = new byte[src.length() / 2]; + byte[] tmp = src.getBytes(); + for (int i = 0; i < (tmp.length / 2); i++) { + ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]); + } + return ret; + } + // byte类型数据,转成十六进制形式; + public static byte uniteBytes(byte src0, byte src1) { + byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 })).byteValue(); + _b0 = (byte) (_b0 << 4); + byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })).byteValue(); + byte ret = (byte) (_b0 ^ _b1); + return ret; + } + + /** + * 关闭串口 + * + * @throws IOException + */ + public static synchronized void closePort(SerialPort serialPort) throws IOException { + if (serialPort != null) { + serialPort.close(); + logger.info("串口" + serialPort.getName() + "已关闭"); + serialPort=null; + } + } + + /** + * 往串口发送数据 + * + * @param order + * 待发送数据 +// * @throws SendDataToSerialPortFailure + * 向串口发送数据失败 +// * @throws SerialPortOutputStreamCloseFailure + * 关闭串口对象的输出流出错 + */ + public static void sendToPort(byte[] order, SerialPort serialPort) throws IOException { + OutputStream out = null; + try { + out = serialPort.getOutputStream(); + out.write(order); + out.flush(); + logger.info("发送数据成功" + serialPort.getName()); + } catch (IOException e) { + logger.error("发送数据失败" + serialPort.getName()); + throw e; + } finally { + try { + if (out != null) { + out.close(); + out = null; + } + } catch (IOException e) { + logger.error("关闭串口对象的输出流出错"); + throw e; + } + } + } + + /** + * 从串口读取数据 + * + * @param serialPort + * 当前已建立连接的SerialPort对象 + * @return 读取到的数据 +// * @throws ReadDataFromSerialPortFailure + * 从串口读取数据时出错 +// * @throws SerialPortInputStreamCloseFailure + * 关闭串口对象输入流出错 + */ + public static byte[] readFromPort(SerialPort serialPort) throws Exception { + + InputStream in = null; + byte[] bytes = null; + + try { + if (serialPort != null) { + in = serialPort.getInputStream(); + } else { + return null; + } + int bufflenth = in.available(); // 获取buffer里的数据长度 + while (bufflenth != 0) { + bytes = new byte[bufflenth]; // 初始化byte数组为buffer中数据的长度 + in.read(bytes); + bufflenth = in.available(); + } + } catch (Exception e) { + throw e; + } finally { + try { + if (in != null) { + in.close(); + in = null; + } + } catch (IOException e) { + throw e; + } + } + return bytes; + } + + /** + * 添加监听器 + * +// * @param port + * 串口对象 + * @param listener + * 串口监听器 +// * @throws TooManyListeners + * 监听类对象过多 + */ + public static void addListener(SerialPortEventListener listener, SerialPort serialPort) throws TooManyListenersException { + try { + // 给串口添加监听器 + serialPort.addEventListener(listener); + // 设置当有数据到达时唤醒监听接收线程 + serialPort.notifyOnDataAvailable(true); + // 设置当通信中断时唤醒中断线程 + serialPort.notifyOnBreakInterrupt(true); + + } catch (TooManyListenersException e) { + throw e; + } + } + + /** + * 删除监听器 + * @param port 串口对象 + * @param listener 串口监听器 + * // * @throws TooManyListeners 监听类对象过多 + */ + public void removeListener(SerialPort port, SerialPortEventListener listener) { + //删除串口监听器 + port.removeEventListener(); + } + +} + diff --git a/user-service/src/main/java/com/mh/user/service/AlarmInfoService.java b/user-service/src/main/java/com/mh/user/service/AlarmInfoService.java new file mode 100644 index 0000000..d633302 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/AlarmInfoService.java @@ -0,0 +1,62 @@ +package com.mh.user.service; + +import com.mh.user.entity.AlarmInfoEntity; +import com.mh.user.entity.AlarmValueSetEntity; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +public interface AlarmInfoService { + + + /** + * 报警管理 + * 保存报警信息 + * @param alarmInfoEntity + */ + void saveAlarmInfo(AlarmInfoEntity alarmInfoEntity); + + /** + * 报警管理 + * 根据日期修改报警信息 + * @param alarmInfoEntity + */ + void updateAlarmInfo(AlarmInfoEntity alarmInfoEntity); + + /** + * 报警管理 + * 根据日期、设备、楼栋查询报警信息 + * @param alarmTime + * @param deviceType + * @param buildingId + * @param page + * @param limit + * @return + */ + + List queryAlarmInfo(String alarmTime,String deviceType, + String buildingId,String dealState,int page,int limit); + + + /** + * 报警管理 + * 根据日期、设备类型查询记录数 + * @return + */ + int getAlarmInfoCount(String alarmTime,String alarmDevice, + String buildingId,String dealState,int page,int limit); + + /** + * 报警管理 + * 根据报警编号删除报警信息 + * @param id + */ + void deleteAlarmInfo(String id); + + //警报设置 + void saveAlarmValueSet(AlarmValueSetEntity alarmValueSetEntity); + + //修改处理状态 + void updateDealState(String id,String dealState); + +} diff --git a/user-service/src/main/java/com/mh/user/service/AreaService.java b/user-service/src/main/java/com/mh/user/service/AreaService.java new file mode 100644 index 0000000..969afc5 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/AreaService.java @@ -0,0 +1,10 @@ +package com.mh.user.service; + +import com.mh.user.entity.AreaEntity; + +import java.util.List; + +public interface AreaService { + + List findAll(); +} diff --git a/user-service/src/main/java/com/mh/user/service/BuildingService.java b/user-service/src/main/java/com/mh/user/service/BuildingService.java new file mode 100644 index 0000000..fa352a9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/BuildingService.java @@ -0,0 +1,60 @@ +package com.mh.user.service; + +import com.mh.user.entity.BuildingEntity; +import com.mh.user.model.BuildingModel; + +import java.util.List; + +public interface BuildingService { + + /** + * 楼栋管理模块 + * 保存楼栋信息 + * @param buildingEntity + */ + int saveBuilding(BuildingEntity buildingEntity); + + /** + * 楼栋管理模块 + * 保存楼栋信息 + * @param buildingEntity + */ + int updateBuilding(BuildingEntity buildingEntity); + + /** + * 楼栋管理模块: + * 查询楼栋资料 + * @param page + * @param limit + * @return + */ + List queryBuilding(String buildingId,int page, int limit); + + /** + * 楼栋管理模块: + * 获取楼栋信息查询的总条数 + * @return + */ + int getCount(String buildingId,int page, int limit); + + //查询楼栋名称 + List selectBuildingName(); + + //查询楼栋编号 + String selectBuildingId(String buildingName); + /** + * 楼栋管理模块: + * 根据名称删除楼栋信息 + * @param records + */ + int deleteBuilding(List records); + + + /** + * 楼栋管理模块: + * 根据名称删除楼栋信息 + * @param id + */ + int deleteBuilding(String id); + +} diff --git a/user-service/src/main/java/com/mh/user/service/ControlSetService.java b/user-service/src/main/java/com/mh/user/service/ControlSetService.java new file mode 100644 index 0000000..b1e01ce --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/ControlSetService.java @@ -0,0 +1,10 @@ +package com.mh.user.service; + +import com.mh.user.entity.ControlSetEntity; + +public interface ControlSetService { + + void saveControlSet(ControlSetEntity controlSetEntity); + + ControlSetEntity queryControlSet(String buildingId); +} diff --git a/user-service/src/main/java/com/mh/user/service/DataResultService.java b/user-service/src/main/java/com/mh/user/service/DataResultService.java new file mode 100644 index 0000000..aafc0f9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/DataResultService.java @@ -0,0 +1,85 @@ +package com.mh.user.service; + +import com.mh.user.entity.DataResultClEntity; +import com.mh.user.entity.DataResultEntity; +import com.mh.user.entity.DataResultChEntity; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; + +public interface DataResultService { + + void saveDataResult(DataResultEntity dataResultEntity) throws ParseException; + + void updateDataResult(DataResultEntity dataResultEntity); + + List queryDataResult(String projectID, + String startDate, + String endDate, + String deviceType, + int page, + int limit); + + int getDataResultCount(String projectID, + String startDate, + String endDate, + String deviceType, + int page, + int limit); + + //------------------------------------------------------------------- + //保存流量计用量 + void saveDataResultCl(DataResultClEntity dataResultClEntity) throws ParseException; + + //保存流量计用量备份 + void saveDataResultCl_bak(DataResultClEntity dataResultClEntity) throws ParseException; + + //修改流量计用量 + void updateDataResultCl(DataResultClEntity dataResultClEntity); + + //保存冷量计数据 + void saveDataResultCh(DataResultChEntity dataResultChEntity) throws ParseException; + + //修改冷量计数据 + void updateDataResultCh(DataResultChEntity dataResultChEntity); + + //查询按分钟的时间间隔 + List queryDataResultMi(String projectID,String startDate,String curDate,int page,int limit, int type); + + int dataResultOneMiCount(String projectID,String startDate,String curDate); + + int dataResultFiveMiCount(String projectID,String startDate,String curDate); + + int dataResultFifteenMiCount(String projectID,String startDate,String curDate); + + //查询按秒的时间间隔 + List queryDataResultSec(String projectID,String startDate,String curDate); + + //保存冷水机数据 + void saveDataResultChiller(DataResultChEntity dataResultChEntity); + + void updateDataResultChiller(DataResultChEntity dataResultChEntity); + + void saveDataResultNow(DataResultChEntity dataResultChEntity); + + void deleteDataResultNow(String deviceAddr, String deviceType, String registerAddr, String projectID); + + List selectDataResultNow(String deviceAddr, String deviceType, String projectID); + + List queryDataResultChiller(String projectID, + String deviceAddr, + String registerName, + String startDate, + String curDate, + int page, + int limit); + + int dataResultChillerCount(String projectID, + String deviceAddr, + String registerName, + String startDate, + String curDate); + + +} diff --git a/user-service/src/main/java/com/mh/user/service/DeviceCodeParamService.java b/user-service/src/main/java/com/mh/user/service/DeviceCodeParamService.java new file mode 100644 index 0000000..d2963f6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/DeviceCodeParamService.java @@ -0,0 +1,37 @@ +package com.mh.user.service; + +import com.mh.user.entity.DeviceCodeParamEntity; +import org.apache.ibatis.annotations.Param; + + +import java.util.List; + +public interface DeviceCodeParamService { + + //插入指令参数 + void insertDeviceCodeParam(DeviceCodeParamEntity deviceCodeParamEntity); + + //查询指令参数,传入IP和端口 + List queryCodeParam(String gatewayPort); + + //查询指令参数,传入串口 + List queryCodeParam2(String comName); + + //查询所有指令参数 + List queryCodeParam3(); + + //查询单个参数 + DeviceCodeParamEntity queryDeviceCodeParam(String projectID, String deviceType, String deviceAddr,String registerAddr); + + //查询记录数 + int queryCount(String ProjectID); + + //查询记录数 + int queryCount2(); + + // 批量插入生成指令参数入数据库 + void insertDeviceCodeParamList(List deviceCodeParamEntityList); + + //查询插入 + void selectInsertDeviceCodeParam(String ProjectID); +} diff --git a/user-service/src/main/java/com/mh/user/service/DeviceInfoService.java b/user-service/src/main/java/com/mh/user/service/DeviceInfoService.java new file mode 100644 index 0000000..d3a0bef --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/DeviceInfoService.java @@ -0,0 +1,21 @@ +package com.mh.user.service; + +import com.mh.user.entity.DeviceInfoEntity; +import com.mh.user.model.ChillerModel; +import com.mh.user.model.DeviceModel; +import org.apache.ibatis.annotations.Param; + + +import java.util.List; + +public interface DeviceInfoService { + + List queryDeviceInfo(String systemID, String projectID,String deviceType); + + //查询冷水机设备 + List selectDevices(String projectID); + + List queryChiller(String projectID, String deviceAddr); + + ChillerModel selectChiller(String projectID,String deviceAddr); +} diff --git a/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java b/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java new file mode 100644 index 0000000..58c96c1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java @@ -0,0 +1,118 @@ +package com.mh.user.service; + +import com.mh.user.entity.BuildingEntity; +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.entity.DeviceInstallTempEntity; +import com.mh.user.entity.UploadDeviceInstallEntity; +import com.mh.user.mapper.provider.DeviceInstallProvider; +import com.mh.user.model.DeviceModel; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.SelectProvider; +import org.apache.ibatis.annotations.Update; + +import java.util.Date; +import java.util.List; + +public interface DeviceInstallService { + + /** + * 设备管理模块 + * 保存设备信息 + * + * @param deviceInstallEntity + */ + int saveDevice(DeviceInstallEntity deviceInstallEntity); + + /** + * 设备管理模块 + * 保存设备信息 + * + * @param deviceInstallEntity + */ + int updateDevice(DeviceInstallEntity deviceInstallEntity); + + //按id更新水电表读数和采集日期 + void updateLastValue(Long id, double lastValue, Date lastDate); + /** + * 设备管理模块 + * 查询设备资料 + * + * @param page + * @param limit + * @return + */ + List getAllDevice(int page, int limit); + + //查询有多个采集参数的设备 + List selectDeviceParams(String ProjectID); + + //查询有多个采集参数的设备 + List selectDeviceParams2(); + + // 查询所有启用的设备 + int getAllCount(); + /** + * 设备管理模块 + * 按条件查询设备资料 + * + * @param buildingId + * @param startDate + * @param startDate + * @param page + * @param limit + * @return + */ + List queryDevice(String buildingId,String deviceType, String startDate, String endDate, String isUse, String isFault, int page, int limit); + + /** + * 设备管理模块: + * 获取设备查询的总条数 + * + * @return + */ + int getCount(String buildingId,String deviceType, String startDate, String endDate, String isUse, String isFault, int page, int limit); + + //查询设备在线情况 + int getIsOnlineCount(String isOnline,String deviceType); + + //根据通讯地址和设备类型查询对应的设备信息 + DeviceInstallEntity selectDevice(String deviceAddr,String deviceType,String buildingId); + /** + * 设备管理模块 + * 根据通讯地址删除设备信息 + * + * @param records + */ + int deleteDevice(List records); + /** + * 设备管理模块 + * 根据通讯地址删除设备信息 + * + * @param id + */ + int deleteDevice(String id); + + // Excel导入相关函数 + // 删除临时表 + void deleteDevice_install_temp(); + + // 插入临时表 + void insertDevice_install_temp(UploadDeviceInstallEntity uploadDeviceInstallEntity); + + // 查询Excel导入的数据 + List queryExcelDevices(); + + // 查询Excel导入的数据的记录数 + int queryExcelDevicesCount(); + + // 在导入中的数据有重复 + void updateDevice_install_temp__multiple(); + + //从临时表查询插入 + void insertFromDevice_install_temp(); + + //修改启动状态 + void updateDeviceIsUse(String isUse, String deviceAddr); + +} diff --git a/user-service/src/main/java/com/mh/user/service/EnergyDataService.java b/user-service/src/main/java/com/mh/user/service/EnergyDataService.java new file mode 100644 index 0000000..3b1ddf3 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/EnergyDataService.java @@ -0,0 +1,13 @@ +package com.mh.user.service; + +import com.mh.user.entity.EnergyDataEntity; +import com.mh.user.model.EnergyModel; +import java.util.List; + +public interface EnergyDataService { + + List queryEnergyData(EnergyModel energyModel); + + int getEnergyDataCount(EnergyModel energyModel); + +} diff --git a/user-service/src/main/java/com/mh/user/service/EnergyService.java b/user-service/src/main/java/com/mh/user/service/EnergyService.java new file mode 100644 index 0000000..a63f5c3 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/EnergyService.java @@ -0,0 +1,64 @@ +package com.mh.user.service; + +import com.mh.user.entity.EnergyEntity; +import com.mh.user.mapper.provider.EnergyProvider; +import com.mh.user.model.EnergyParam; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +public interface EnergyService { + + /** + * 生产信息 + * 保存 + * @param energyEntity + */ + void saveEnergy(EnergyEntity energyEntity,int type); + + /** + * 生产信息 + * 修改 + * @param energyEntity + */ + void updateEnergy(EnergyEntity energyEntity,int type); + + /** + * 生产信息 + * 根据时间日期和楼栋编号删除记录 + * @param curDate + * @param buildingId + */ + void deleteEnergy(String curDate,String buildingId,int type); + + + /** + * 生产信息 + * 查询 + * @param (type 1按天,2按月,3按年) + * @return + */ + List queryEnergy(EnergyParam energyParam); + + /** + * 生产信息 + * 查询记录数 + * @return + */ + int getEnergyCount(EnergyParam energyParam); + + /** + * 生产信息 + * 查询 + * @param curDate + * @param type (1按天,2按月,3按年) + * @return + */ + List queryEnergyGroup(String curDate, int type); + + //查询每天的用量 + List queryDayEnergy(String buildingId, String startDate, String endDate, int page, int limit); + + int getDayEnergyCount(String buildingId, String startDate, String endDate, int page, int limit); + +} diff --git a/user-service/src/main/java/com/mh/user/service/GatewayManageService.java b/user-service/src/main/java/com/mh/user/service/GatewayManageService.java new file mode 100644 index 0000000..c30d05f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/GatewayManageService.java @@ -0,0 +1,10 @@ +package com.mh.user.service; + +import com.mh.user.entity.GatewayManageEntity; + +import java.util.List; + +public interface GatewayManageService { + + List selectGateway(); +} diff --git a/user-service/src/main/java/com/mh/user/service/MeterInfoService.java b/user-service/src/main/java/com/mh/user/service/MeterInfoService.java new file mode 100644 index 0000000..e84c21e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/MeterInfoService.java @@ -0,0 +1,9 @@ +package com.mh.user.service; + +import com.mh.user.entity.MeterInfoEntity; +import java.util.List; + +public interface MeterInfoService { + + List queryMeterInfo(String systemID,String projectID); +} diff --git a/user-service/src/main/java/com/mh/user/service/ProjectInfoService.java b/user-service/src/main/java/com/mh/user/service/ProjectInfoService.java new file mode 100644 index 0000000..1697a60 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/ProjectInfoService.java @@ -0,0 +1,15 @@ +package com.mh.user.service; + +import com.mh.user.entity.ProjectInfoEntity; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +public interface ProjectInfoService { + + List queryProjectInfo(String systemID ); + + String selectName(String id); + +} diff --git a/user-service/src/main/java/com/mh/user/service/RegisterAddrService.java b/user-service/src/main/java/com/mh/user/service/RegisterAddrService.java new file mode 100644 index 0000000..0800fd7 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/RegisterAddrService.java @@ -0,0 +1,9 @@ +package com.mh.user.service; + +import com.mh.user.entity.RegisterAddrEntity; +import java.util.List; + +public interface RegisterAddrService { + //查询寄存器地址表,获取对应参数地生成相关指令 + List selectRegisterAddr(); +} diff --git a/user-service/src/main/java/com/mh/user/service/StrategyInfoService.java b/user-service/src/main/java/com/mh/user/service/StrategyInfoService.java new file mode 100644 index 0000000..f5b64bb --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/StrategyInfoService.java @@ -0,0 +1,9 @@ +package com.mh.user.service; + +import com.mh.user.entity.StrategyInfoEntity; + +import java.util.List; + +public interface StrategyInfoService { + List queryStrategyInfo(String systemID, String projectID); +} diff --git a/user-service/src/main/java/com/mh/user/service/SysDeptService.java b/user-service/src/main/java/com/mh/user/service/SysDeptService.java new file mode 100644 index 0000000..f7928ca --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SysDeptService.java @@ -0,0 +1,21 @@ +package com.mh.user.service; + + +import com.mh.common.service.CurdService; +import com.mh.user.model.SysDept; + +import java.util.List; + +/** + * 机构管理 + * @author ljf + * @date 2020-04-25 + */ +public interface SysDeptService extends CurdService { + + /** + * 查询机构树 + * @return + */ + List findTree(); +} diff --git a/user-service/src/main/java/com/mh/user/service/SysDictService.java b/user-service/src/main/java/com/mh/user/service/SysDictService.java new file mode 100644 index 0000000..3398fa6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SysDictService.java @@ -0,0 +1,21 @@ +package com.mh.user.service; + +import com.mh.common.service.CurdService; +import com.mh.user.model.SysDict; + +import java.util.List; + +/** + * 字典管理 + * @author ljf + * @date 2020-04-25 + */ +public interface SysDictService extends CurdService { + + /** + * 根据名称查询 + * @param lable + * @return + */ + List findByLable(String lable); +} diff --git a/user-service/src/main/java/com/mh/user/service/SysLogService.java b/user-service/src/main/java/com/mh/user/service/SysLogService.java new file mode 100644 index 0000000..7a9f908 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SysLogService.java @@ -0,0 +1,22 @@ +package com.mh.user.service; + + +import com.mh.common.service.CurdService; +import com.mh.user.model.SysLog; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 日志管理 + * @author ljf + * @date 2020-04-25 + */ +public interface SysLogService extends CurdService { + + List findLogs(String userName, int page, int limit ); + + int findCount(String userName,int page,int limit ); + + SysLog logInfo(int id); +} diff --git a/user-service/src/main/java/com/mh/user/service/SysMenuService.java b/user-service/src/main/java/com/mh/user/service/SysMenuService.java new file mode 100644 index 0000000..db99009 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SysMenuService.java @@ -0,0 +1,29 @@ +package com.mh.user.service; + + +import com.mh.common.service.CurdService; +import com.mh.user.model.SysMenu; + +import java.util.List; + +/** + * 菜单管理 + * @author Louis + * @date Oct 29, 2018 + */ +public interface SysMenuService extends CurdService { + + /** + * 查询菜单树,用户ID和用户名为空则查询全部 + * @param menuType 获取菜单类型,0:获取所有菜单,包含按钮,1:获取所有菜单,不包含按钮 + * @return + */ + List findTree(String systemID,String userName, int menuType); + + /** + * 根据用户名查找菜单列表 + * @param userName + * @return + */ + List findByUser(String systemID,String userName); +} diff --git a/user-service/src/main/java/com/mh/user/service/SysRoleService.java b/user-service/src/main/java/com/mh/user/service/SysRoleService.java new file mode 100644 index 0000000..0766239 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SysRoleService.java @@ -0,0 +1,61 @@ +package com.mh.user.service; + + +import com.mh.common.service.CurdService; +import com.mh.user.model.SysMenu; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysRoleMenu; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 角色管理 + * @author Louis + * @date Oct 29, 2018 + */ +public interface SysRoleService extends CurdService { + + /** + * 查询全部 + * @return + */ + List findAll(); + + /** + * 查询角色菜单集合 + * @return + */ + List findRoleMenus(Long roleId); + + /** + * 保存角色菜单 + * @param records + * @return + */ + int saveRoleMenus(List records); + + /** + * 根据名称查询 + * @param name + * @return + */ + + List findByName(String name); + + //根据名称查找编号 + SysRole findId(String name); + + //查询所有角色 + List queryRoles(String roleName, int page,int limit); + + //查询所有记录数 + int getCount( String roleName,int page,int limit); + + //根据用户名查询角色编号 + String findRoleID(String name); + +} diff --git a/user-service/src/main/java/com/mh/user/service/SysUserService.java b/user-service/src/main/java/com/mh/user/service/SysUserService.java new file mode 100644 index 0000000..c8ae775 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SysUserService.java @@ -0,0 +1,45 @@ +package com.mh.user.service; + +import com.mh.common.service.CurdService; +import com.mh.user.entity.DBEntity; +import com.mh.user.model.SysUser; +import com.mh.user.model.SysUserRole; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Set; + + +/** + * 用户管理 + * @author Louis + * @date Oct 29, 2018 + */ +public interface SysUserService extends CurdService { + + DBEntity queryDBInfo(String username); + + + SysUser findByName(String userName); + + /** + * 查找用户的菜单权限标识集合 + * @param userName + * @return + */ + Set findPermissions(String systemID,String userName); + + /** + * 查找用户的角色集合 + * @param userId + * @return + */ + List findUserRoles(Long userId); + + //查询用户 + List queryUsers(String userName,int page,int limit); + + //查询记录数 + int getCount(String userName,int page,int limit); + +} diff --git a/user-service/src/main/java/com/mh/user/service/SystemInfoService.java b/user-service/src/main/java/com/mh/user/service/SystemInfoService.java new file mode 100644 index 0000000..9f54e25 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/SystemInfoService.java @@ -0,0 +1,9 @@ +package com.mh.user.service; + +import com.mh.user.entity.SystemInfoEntity; +import java.util.List; + +public interface SystemInfoService { + //根据角色查询对应的系统 + List querySystem(String roleID ); +} diff --git a/user-service/src/main/java/com/mh/user/service/chart/ChartService.java b/user-service/src/main/java/com/mh/user/service/chart/ChartService.java new file mode 100644 index 0000000..716f44e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chart/ChartService.java @@ -0,0 +1,25 @@ +package com.mh.user.service.chart; + +import com.mh.user.entity.chart.BaseChartEntity; +import com.mh.user.entity.chart.ChartEntity; +import com.mh.user.entity.chart.Unit; + +import java.util.List; +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-13 + * @throws : + */ +public interface ChartService { + + List callProChart(Map map); + + List queryChartData(Map map); + + List queryUnits(Map map); + +} diff --git a/user-service/src/main/java/com/mh/user/service/chart/impl/ChartServiceImpl.java b/user-service/src/main/java/com/mh/user/service/chart/impl/ChartServiceImpl.java new file mode 100644 index 0000000..bfb72a7 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chart/impl/ChartServiceImpl.java @@ -0,0 +1,168 @@ +package com.mh.user.service.chart.impl; + +import com.alibaba.fastjson.JSONArray; +import com.mh.user.entity.chart.*; +import com.mh.user.mapper.chart.ChartMapper; +import com.mh.user.service.chart.ChartService; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-13 + * @throws : + */ +@Service +public class ChartServiceImpl implements ChartService { + + private final ChartMapper chartMapper; + + public ChartServiceImpl(ChartMapper chartMapper) { + this.chartMapper = chartMapper; + } + + @Override + public List callProChart(Map map) { + return chartMapper.callProChart(map); + } + + @Override + public List queryChartData(Map map) { + List baseChartEntityList = chartMapper.callProChart(map); + int listSize = baseChartEntityList.size(); + // 判断是否有数据 + if (listSize != 0) { + // 获取表名 + Title title = new Title(false, baseChartEntityList.get(0).getChartName()); + + // 获取右侧单位显示 + List units = chartMapper.queryUnits(map); + boolean[] states = new boolean[11]; + String[] titles = new String[11]; + String[] icons = new String[11]; + String[] names = new String[11]; + String[] yAxisNames = new String[11]; + int size = 0; + String title1 = ""; + for (int i = 0; i < units.size(); i++) { + if (size - 1 >= 0) { + title1 = titles[size - 1]; + } + System.out.println(title1); + if (title1.equalsIgnoreCase(units.get(i).getUnitName())) { + } else { + states[size] = Boolean.parseBoolean(units.get(i).getGrade()); + titles[size] = units.get(i).getUnitName(); + icons[size] = units.get(i).getIcon(); + // 查询指标对应c的单位名称 + names[size] = units.get(i).getIndexName(); + // 对应指标名称 + yAxisNames[size] = units.get(i).getOtherName(); + size = size + 1; + } + } + + // 获取Feature,图表显示的单位 + Feature feature = new Feature(states, titles, icons, names, yAxisNames); + + //获取不重复值,并保证元素添加的有序性,使用LinkedHashSet + Set dataSet = new LinkedHashSet<>(); // 指标名称 + Set indexIdSet = new LinkedHashSet<>(); // 指标ID + Set xAxisSet = new LinkedHashSet<>(); // 指标查询时间 + Set displayType = new LinkedHashSet<>(); // 指标显示类型 + for (BaseChartEntity baseChartEntity : baseChartEntityList) { + dataSet.add(baseChartEntity.getIndexName()); + indexIdSet.add(baseChartEntity.getIndexId()); + xAxisSet.add(baseChartEntity.getChartTime()); + displayType.add(baseChartEntity.getDisplayType()); + } + String[] indexNames = new String[dataSet.size()]; + int i = 0; + for (Object object : + dataSet) { + indexNames[i] = (String) object; + i++; + } + int width = baseChartEntityList.get(0).getWidth(); + int[] indexId = new int[indexIdSet.size()]; + i = 0; + for (Object object : + indexIdSet) { + indexId[i] = (int) object; + i++; + } + Legend legend = new Legend(indexNames, width, indexId); + + // 时间 + // 获取id值第一种方式 +// int endIndex = listSize / indexId.length; +// String[] dates = new String[endIndex]; +// for (int j = 0; j < endIndex; j++) { +// dates[j] = baseChartEntityList.get(j).getChartTime(); +// } + + String[] xAxis = new String[xAxisSet.size()]; + i = 0; + for (Object object : + xAxisSet) { + xAxis[i] = (String) object; + i++; + } + XAxis xAxis1 = new XAxis(xAxis); + + List yAxisList = new ArrayList<>(); + boolean show = true; + for (int j = 0; j < dataSet.size(); j++) { + if (j >= 2) { + show = false; + } + yAxisList.add(new YAxis("value", + indexNames[j], + new SplitLine(false), + new AxisLine(false, new LineStyle("#FFF")), + show)); + } + + // 指标显示类型 +// String[] displayTypes = new String[displayType.size()]; +// i = 0; +// for (Object object : +// displayType) { +// displayTypes[i] = (String)object; +// i++; +// } + List seriesList = new ArrayList<>(); + // 循环赋值 + int endIndex = listSize / indexId.length; + for (int j = 0; j < dataSet.size(); j++) { + // 遍历赋显示值 + Double[] doubles = new Double[endIndex]; + int a = 0; + for (int k = j * endIndex; k < (j + 1) * endIndex; k++) { + doubles[a] = baseChartEntityList.get(k).getData(); + a++; + } + // 显示指标类型 + seriesList.add(new Series(indexNames[j], + baseChartEntityList.get(j * endIndex).getDisplayType(), + j, + doubles)); + } + ChartEntity chartEntity = new ChartEntity(title, feature, legend, xAxis1, yAxisList, seriesList); + List chartEntities = new ArrayList<>(); + chartEntities.add(chartEntity); + return chartEntities; + + } else { + return null; + } + } + + @Override + public List queryUnits(Map map) { + return chartMapper.queryUnits(map); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/ChillersService.java b/user-service/src/main/java/com/mh/user/service/chillers/ChillersService.java new file mode 100644 index 0000000..1eca903 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/ChillersService.java @@ -0,0 +1,60 @@ +package com.mh.user.service.chillers; + +import com.mh.user.entity.ChillersEntity; +import com.mh.user.entity.HostValue; +import com.mh.user.entity.TableDataEntity; +import com.mh.user.entity.TableInfoEntity; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 冷水机组服务接口 + * @updateTime 2020-05-20 + * @throws : + */ +public interface ChillersService { + + // 获取进出水温度 + List queryTempValue(String deviceType); + + // 查询正在运行的冷水机组 + List getRunningChillers(); + + // 查询已停止的冷水机组 + List getStopChillers(); + + // 根据启用状态,查询冷水机组全部设备信息 + List queryChillersByOther(int grade, String ddcAddr); + + // 往数据库插入冷水机组历史流水表,返回插入后的自增id + int insertChillersHistory(ChillersEntity chillersEntity); + + // 更新基表管理信息中对应的数据 + void updateChillerRegisterAddr(ChillersEntity chillersEntity); + + // 插入或者更新实时表 + void updateDataNow(ChillersEntity chillersEntity); + + // 批量更新历史数据 + int batchUpdateRegisterAddr(List chillersEntityLists); + + List queryTopData(String deviceName, int grade); + + List queryLeftAndRightData(String deviceName, int grade); + + // 2 代表DDC采集,1 代表串口通信 + List queryChillersDDC(int grade); + + // 批量插入历史流水表 + void batchInsertChillersHistory(List chillersEntityLists); + + // 根据DDC地址和寄存器地址获取到最近采集的时间 + String queryLastChillersHistory(ChillersEntity chillersEntity); + + // 通过DDC地址查询对应的采集参数设备 + List queryDDCAddr(String ddcAddr); + +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/DataHistoryService.java b/user-service/src/main/java/com/mh/user/service/chillers/DataHistoryService.java new file mode 100644 index 0000000..a07f25a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/DataHistoryService.java @@ -0,0 +1,16 @@ +package com.mh.user.service.chillers; + +import com.mh.user.entity.DeviceManageEntity; + +/** + * @Classname DataHistoryService + * @Description TODO 冷量计和电表插入数据库流水表 + * @Date 2020-06-03 17:25 + * @Created by LJF + */ +public interface DataHistoryService { + + // 插入冷量计和电表历史数据 + int insertDataHistory(DeviceManageEntity deviceManageEntity); + +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/DealDataService.java b/user-service/src/main/java/com/mh/user/service/chillers/DealDataService.java new file mode 100644 index 0000000..49e6e10 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/DealDataService.java @@ -0,0 +1,46 @@ +package com.mh.user.service.chillers; + +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.mapping.StatementType; + +import java.util.List; + +/** + * @author ljf + * @title :处理采集数据 + * @description : + * @updateTime 2020-07-28 + * @throws : + */ +public interface DealDataService { + + void proEnergy(String curDate); + + void proEnergyData(String curDate); + + void proDataResult(String curDate,String projectID); + + void proEnergyDaySum(String curDate,String projectID); + + void proDeviceState(String curDate); + + void proAnalysisMonth(String curDate); + + void proAnalysisYear(String curDate); + + void proAlarmInfoSum(String curDate); + + void dealData(); + + void deleteChillersDataHistory(); + + void deleteDataHistory(); + + void saveTempHumidity(String curDate, String ambTemp, String humidity); + + //查找项目ID + List queryProjectId(String systemID ); + +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/DeviceDisplayService.java b/user-service/src/main/java/com/mh/user/service/chillers/DeviceDisplayService.java new file mode 100644 index 0000000..70be811 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/DeviceDisplayService.java @@ -0,0 +1,23 @@ +package com.mh.user.service.chillers; + +import com.mh.user.dto.DeviceMessageDTO; +import com.mh.user.dto.DisplayBoxDataDTO; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 设备数据显示 + * @updateTime 2020-05-29 + * @throws : + */ +public interface DeviceDisplayService { + + // 查询设备显示内容 + // deviceType: 设备类型(host:主机 pump:泵 tower:塔)type: 1(查询阴影值),0(查询数据框内容) + List deviceDisplayBoxData(String deviceType, String type); + + // 设备信息状态显示 + List queryDeviceStatus(String deviceType); +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/DeviceManageService.java b/user-service/src/main/java/com/mh/user/service/chillers/DeviceManageService.java new file mode 100644 index 0000000..469d70f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/DeviceManageService.java @@ -0,0 +1,39 @@ +package com.mh.user.service.chillers; + +import com.mh.user.entity.DeviceManageEntity; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 设备管理接口 + * @updateTime 2020-05-14 + * @throws : + */ +public interface DeviceManageService { + + // 根据设备机身表号查询对应的设备信息 + List getDeviceByOther(String deviceNum); + + void addOrUpdateBaseMeter(DeviceManageEntity deviceManageEntity); + + /** + * 删除设备信息 + * @param deviceId + * @param deviceType + */ + void deleteDeviceInfo(Integer deviceId, String deviceType); + + // 通过设备类型查询设备信息 1:广仪电表 3:冷量计 + List queryDevicesByType(String deviceType); + + // 查询全部信息 + List queryAllDevice(); + + // 根据设备ID查询对应的设备信息 + List queryDeviceByOther(int page, int size, String deviceNum); + + // 查询设备总数 + int queryDeviceByOtherCount(String deviceNum); +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/DeviceParamService.java b/user-service/src/main/java/com/mh/user/service/chillers/DeviceParamService.java new file mode 100644 index 0000000..12dee62 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/DeviceParamService.java @@ -0,0 +1,40 @@ +package com.mh.user.service.chillers; + +import com.mh.user.entity.DeviceParameterEntity; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description :设备参数实体类 + * @updateTime 2020-05-21 + * @throws : + */ +public interface DeviceParamService { + + // 根据页码查询对应数据信息 + List getBaseMeterParamList(String baseMeterType); + + + void addOrUpdateBaseMeterParam(DeviceParameterEntity deviceParameterEntity); + + // 添加网关设备 + String insertDeviceParam(DeviceParameterEntity deviceParameterEntity); + + // 根据网关ID删除网关设备 + void deleteDeviceParamByID(Long id); + + // 根据网关ID查询设备信息 + DeviceParameterEntity queryParamById(int paramId); + + // 查询全部 + List queryAll(); + + // 根据页码查询对应数据信息 + List queryByOther(int page, int size, int paramId); + + // 设备总数 + int queryByOtherCount(int page, int size, int paramId); + +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/ExceptionService.java b/user-service/src/main/java/com/mh/user/service/chillers/ExceptionService.java new file mode 100644 index 0000000..a491b14 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/ExceptionService.java @@ -0,0 +1,23 @@ +package com.mh.user.service.chillers; + +import com.mh.user.entity.ExceptionEntity; +import com.mh.user.entity.ExceptionTableData; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +public interface ExceptionService { + + List queryException(ExceptionEntity exceptionEntity); + + int queryExceptionTotal(ExceptionEntity exceptionEntity); + + String updateException(ExceptionTableData exceptionTableData); + +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/GatewayManageService.java b/user-service/src/main/java/com/mh/user/service/chillers/GatewayManageService.java new file mode 100644 index 0000000..b36f6ba --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/GatewayManageService.java @@ -0,0 +1,55 @@ +package com.mh.user.service.chillers; + +import com.mh.user.entity.GatewayManageEntity; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 网关管理服务类 + * author:ljf + * create—date:2020-05-21 + */ +public interface GatewayManageService { + + /** + * 根据条件查询网关信息 + * @param grade + * @param operator + * @return + */ + List queryByOther(Integer grade, Integer operator); + + /** + * 新增或更新网关信息 + * @param gatewayManageEntity + */ + void addOrUpdateGateWayInfo(GatewayManageEntity gatewayManageEntity); + + // 添加网关设备 + String insertGatewayManage(GatewayManageEntity gatewayManageEntity); + + // 根据网关ID删除网关设备 + void deleteGatewayManageByID(int gatewayID); + + // 根据网关ID查询设备信息 + GatewayManageEntity queryGatewayByID(Long gatewayID); + + // 查询全部 + List queryAll(); + + // 设备总数 + int queryByOtherCount(int page, int size, int gatewayID); + + // 更新网关管理器的最新连接数据 + void updateGatewayManage(String IP,String port); + + // 更新网关管理器的最新连接数据 + void updateGatewayManage2(String port); + + // 根据grade查询对应的网关路由信息 + GatewayManageEntity queryGatewayByGrade(Long grade); + + //根据端口或者IP或者心跳包查询网关对应的项目名称 + String selectProjectName(String str); +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/GaugeService.java b/user-service/src/main/java/com/mh/user/service/chillers/GaugeService.java new file mode 100644 index 0000000..ce5d20c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/GaugeService.java @@ -0,0 +1,19 @@ +package com.mh.user.service.chillers; + +import com.mh.user.entity.GaugeEntity; +import com.mh.user.entity.TableChartMessageEntity; + +/** + * @author ljf + * @title : 圆盘接口 + * @description : + * @updateTime 2020-08-07 + * @throws : + */ +public interface GaugeService { + + GaugeEntity getGaugeData(String type, String deviceName); + + TableChartMessageEntity queryDeviceId(String type, String deviceName); + +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/OrderMessageService.java b/user-service/src/main/java/com/mh/user/service/chillers/OrderMessageService.java new file mode 100644 index 0000000..d2b81fd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/OrderMessageService.java @@ -0,0 +1,39 @@ +package com.mh.user.service.chillers; + +import com.mh.user.entity.ChillersEntity; +import com.mh.user.entity.OrderMessageEntity; + +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 指令服务类 + * @updateTime 2020-05-28 + * @throws : + */ +public interface OrderMessageService { + + // 更新基表管理状态值 + void updateChillersRegisterAddress(String dataStr, String registerAddr); + + // 更新发送状态status: 1(发送成功),2(发送失败) + void updateOrderMessage(OrderMessageEntity orderMessageEntity); + + // 查询父ID对应的信息 + ChillersEntity queryChiller(int id); + + // 查询当前ID对应的信息 + ChillersEntity queryChillerById(int id); + + // 批量插入生成的采集指令入数据库 + void batchInsertOrderMessage(List orderMessageEntityList); + + // 查询最近关闭冷却塔的时间 + Date queryCloseChilledLastTime(); + + // 发送指令之后,更新对应的地址对应的状态值 + void updateChillersBySendDDC(OrderMessageEntity orderMessageEntity); + +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/ReportService.java b/user-service/src/main/java/com/mh/user/service/chillers/ReportService.java new file mode 100644 index 0000000..a984187 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/ReportService.java @@ -0,0 +1,18 @@ +package com.mh.user.service.chillers; + +import com.mh.user.entity.ReportParamEntity; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-03 + * @throws : + */ +public interface ReportService { + + List queryAllTarget(String type); + +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/impl/ChillersServiceImpl.java b/user-service/src/main/java/com/mh/user/service/chillers/impl/ChillersServiceImpl.java new file mode 100644 index 0000000..f2163ab --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/impl/ChillersServiceImpl.java @@ -0,0 +1,289 @@ +package com.mh.user.service.chillers.impl; + +import com.mh.user.entity.ChillersEntity; +import com.mh.user.entity.HostValue; +import com.mh.user.entity.TableDataEntity; +import com.mh.user.entity.TableInfoEntity; +import com.mh.user.mapper.chillers.ChillersMapper; +import com.mh.user.service.chillers.ChillersService; +import com.mh.user.utils.DateUtil; +import com.mh.user.utils.TimeDifferenceUtil; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 实现类 + * @updateTime 2020-05-20 + * @throws : + */ +@Service +public class ChillersServiceImpl implements ChillersService { + + // 构造方法注入 + private final ChillersMapper chillersMapper; + private List hostValueList; + double chillerWaterInt = 0.00; // 冷冻水回水温度 0A + double chillerWaterOut = 0.00; // 冷冻水出水温度 0B + double coldWaterInt = 0.00; // 冷却水回水温度 0E + double coldWaterOut = 0.00; // 冷却水出水温度 0F + + public ChillersServiceImpl(ChillersMapper chillersMapper, List hostValueList) { + this.chillersMapper = chillersMapper; + this.hostValueList = hostValueList; + } + + @Override + public List queryTempValue(String deviceType) { + hostValueList.clear(); + if (deviceType.equalsIgnoreCase("other")) { + List chillersEntityList = getRunningChillers(); + if (chillersEntityList.size() == 2) { + // 获取对应的冷冻水、冷却水温度 + List chillersEntityList1 = chillersMapper.getChillersTemp(chillersEntityList.get(0).getDeviceCode()); + List chillersEntityList2 = chillersMapper.getChillersTemp(chillersEntityList.get(1).getDeviceCode()); + for (int i = 0; i < chillersEntityList1.size(); i++) { + String registerAddr = chillersEntityList1.get(i).getRegisterAddress(); + if (registerAddr.equalsIgnoreCase("0A")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList1.get(i).getLastValue()); + chillerWaterInt = Double.parseDouble(String.valueOf(bigDecimal)); + } else if (registerAddr.equalsIgnoreCase("0B")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList1.get(i).getLastValue()); + chillerWaterOut = Double.parseDouble(String.valueOf(bigDecimal)); + } else if (registerAddr.equalsIgnoreCase("0E")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList1.get(i).getLastValue()); + coldWaterInt = Double.parseDouble(String.valueOf(bigDecimal)); + } else if (registerAddr.equalsIgnoreCase("0F")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList1.get(i).getLastValue()); + coldWaterOut = Double.parseDouble(String.valueOf(bigDecimal)); + } + } + for (int i = 0; i < chillersEntityList2.size(); i++) { + String registerAddr = chillersEntityList2.get(i).getRegisterAddress(); + if (registerAddr.equalsIgnoreCase("0A")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList2.get(i).getLastValue()); + chillerWaterInt = Double.parseDouble(String.valueOf(bigDecimal)) + chillerWaterInt; + } else if (registerAddr.equalsIgnoreCase("0B")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList2.get(i).getLastValue()); + chillerWaterOut = Double.parseDouble(String.valueOf(bigDecimal)) + chillerWaterOut; + } else if (registerAddr.equalsIgnoreCase("0E")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList2.get(i).getLastValue()); + coldWaterInt = Double.parseDouble(String.valueOf(bigDecimal)) + coldWaterInt; + } else if (registerAddr.equalsIgnoreCase("0F")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList2.get(i).getLastValue()); + coldWaterOut = Double.parseDouble(String.valueOf(bigDecimal)) + coldWaterOut; + } + } + // 四舍五入,保留两位小数 + BigDecimal b2 = BigDecimal.valueOf(chillerWaterOut / 2); + chillerWaterOut = b2.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + BigDecimal b1 = BigDecimal.valueOf(chillerWaterInt / 2); + chillerWaterInt = b1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + BigDecimal b4 = BigDecimal.valueOf(coldWaterOut / 2); + coldWaterOut = b4.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + BigDecimal b3 = BigDecimal.valueOf(coldWaterInt / 2); + coldWaterInt = b3.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + + } else if (chillersEntityList.size() == 1) { + // 获取对应的冷冻水、冷却水温度 + List chillersEntityList1 = chillersMapper.getChillersTemp(chillersEntityList.get(0).getDeviceCode()); + for (int i = 0; i < chillersEntityList1.size(); i++) { + String registerAddr = chillersEntityList1.get(i).getRegisterAddress(); + if (registerAddr.equalsIgnoreCase("0A")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList1.get(i).getLastValue()); + chillerWaterInt = Double.parseDouble(String.valueOf(bigDecimal)); + } else if (registerAddr.equalsIgnoreCase("0B")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList1.get(i).getLastValue()); + chillerWaterOut = Double.parseDouble(String.valueOf(bigDecimal)); + } else if (registerAddr.equalsIgnoreCase("0E")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList1.get(i).getLastValue()); + coldWaterInt = Double.parseDouble(String.valueOf(bigDecimal)); + } else if (registerAddr.equalsIgnoreCase("0F")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList1.get(i).getLastValue()); + coldWaterOut = Double.parseDouble(String.valueOf(bigDecimal)); + } + } + } else if (chillersEntityList.size() == 0) { // update by ljf on 2021-01-11 + // 获取对应的冷水机组 + List chillersEntityList3 = getStopChillers(); + // 获取对应的冷冻水、冷却水温度 + List chillersEntityList1 = chillersMapper.getChillersTemp(chillersEntityList3.get(0).getDeviceCode()); + List chillersEntityList2 = chillersMapper.getChillersTemp(chillersEntityList3.get(1).getDeviceCode()); + for (int i = 0; i < chillersEntityList1.size(); i++) { + String registerAddr = chillersEntityList1.get(i).getRegisterAddress(); + if (registerAddr.equalsIgnoreCase("0A")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList1.get(i).getLastValue()); + chillerWaterInt = Double.parseDouble(String.valueOf(bigDecimal)); + } else if (registerAddr.equalsIgnoreCase("0B")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList1.get(i).getLastValue()); + chillerWaterOut = Double.parseDouble(String.valueOf(bigDecimal)); + } else if (registerAddr.equalsIgnoreCase("0E")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList1.get(i).getLastValue()); + coldWaterInt = Double.parseDouble(String.valueOf(bigDecimal)); + } else if (registerAddr.equalsIgnoreCase("0F")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList1.get(i).getLastValue()); + coldWaterOut = Double.parseDouble(String.valueOf(bigDecimal)); + } + } + for (int i = 0; i < chillersEntityList2.size(); i++) { + String registerAddr = chillersEntityList2.get(i).getRegisterAddress(); + if (registerAddr.equalsIgnoreCase("0A")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList2.get(i).getLastValue()); + chillerWaterInt = Double.parseDouble(String.valueOf(bigDecimal)) + chillerWaterInt; + } else if (registerAddr.equalsIgnoreCase("0B")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList2.get(i).getLastValue()); + chillerWaterOut = Double.parseDouble(String.valueOf(bigDecimal)) + chillerWaterOut; + } else if (registerAddr.equalsIgnoreCase("0E")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList2.get(i).getLastValue()); + coldWaterInt = Double.parseDouble(String.valueOf(bigDecimal)) + coldWaterInt; + } else if (registerAddr.equalsIgnoreCase("0F")) { + BigDecimal bigDecimal = new BigDecimal(chillersEntityList2.get(i).getLastValue()); + coldWaterOut = Double.parseDouble(String.valueOf(bigDecimal)) + coldWaterOut; + } + } + // 四舍五入,保留两位小数 + BigDecimal b2 = BigDecimal.valueOf(chillerWaterOut / 2); + chillerWaterOut = b2.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + BigDecimal b1 = BigDecimal.valueOf(chillerWaterInt / 2); + chillerWaterInt = b1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + BigDecimal b4 = BigDecimal.valueOf(coldWaterOut / 2); + coldWaterOut = b4.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + BigDecimal b3 = BigDecimal.valueOf(coldWaterInt / 2); + coldWaterInt = b3.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + HostValue hostValue = new HostValue(); + hostValue.setId(1); + hostValue.setType("chilledOutWater"); + hostValue.setValue(chillerWaterOut); + hostValueList.add(hostValue); + HostValue hostValue1 = new HostValue(); + hostValue1.setId(2); + hostValue1.setType("chilledInWater"); + hostValue1.setValue(chillerWaterInt); + hostValueList.add(hostValue1); + HostValue hostValue2 = new HostValue(); + hostValue2.setId(3); + hostValue2.setType("coolingOutWater"); + hostValue2.setValue(coldWaterOut); + hostValueList.add(hostValue2); + HostValue hostValue3 = new HostValue(); + hostValue3.setId(4); + hostValue3.setType("coolingInWater"); + hostValue3.setValue(coldWaterInt); + hostValueList.add(hostValue3); + } else if (deviceType.equalsIgnoreCase("hostOne")) { + + } else if (deviceType.equalsIgnoreCase("hostTwo")) { + + } else if (deviceType.equalsIgnoreCase("town")) { + + } + return hostValueList; + } + + // 查询冷水机组进出水温度两者的平均值 + + @Override + public List getRunningChillers() { + return chillersMapper.getRunningChillers(); + } + + @Override + public List getStopChillers() { + return chillersMapper.getStopChillers(); + } + + @Override + public List queryChillersByOther(int grade, String ddcAddr) { + return chillersMapper.queryChillersByOther(grade, ddcAddr); + } + + @Override + public int insertChillersHistory(ChillersEntity chillersEntity) { + try { + System.out.println(chillersEntity.toString()); + // 判断是否大于等于最近插入时间的30分钟, + String lastTimeStr = queryLastChillersHistory(chillersEntity); + if (lastTimeStr == null || lastTimeStr.equalsIgnoreCase("")) { + // 格式化时间分钟为15,30,45,00 + chillersEntity.setLastTime(DateUtil.formatDateStr(chillersEntity.getLastTime())); + // 大于就插入数据库,否则就更新基表安装信息的表 + return chillersMapper.insertChillersHistory(chillersEntity); + } else { + int dValue = TimeDifferenceUtil.dValue(lastTimeStr); + if (dValue >= 30) { + // 格式化时间分钟为15,30,45,00 + chillersEntity.setLastTime(DateUtil.formatDateStr(chillersEntity.getLastTime())); + // 大于就插入数据库,否则就更新基表安装信息的表 + return chillersMapper.insertChillersHistory(chillersEntity); + } + } + // 不管时间差如何都进行更新基表安装信息 + chillersMapper.updateChillerRegisterAddr(chillersEntity); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + return 0; + } + + @Override + public void updateChillerRegisterAddr(ChillersEntity chillersEntity) { + chillersMapper.updateChillerRegisterAddr(chillersEntity); + } + + @Override + public void updateDataNow(ChillersEntity chillersEntity) { + try { + // 判断是否存在实时记录表 + int a = chillersMapper.queryDataNowByOthers(chillersEntity); + if (a == 0) { + // 不存在则进行插入处理 + chillersMapper.insertChillerDataNow(chillersEntity); + } else { + // 存在则进行更新处理 + chillersMapper.updateDataNow(chillersEntity); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public int batchUpdateRegisterAddr(List chillersEntityLists) { + return chillersMapper.updateRegisterAddr(chillersEntityLists); + } + + @Override + public List queryTopData(String deviceName, int grade) { + return chillersMapper.queryTopData(deviceName, grade); + } + + @Override + public List queryLeftAndRightData(String deviceName, int grade) { + return chillersMapper.queryLeftAndRightData(deviceName, grade); + } + + @Override + public List queryChillersDDC(int grade) { + return chillersMapper.queryChillersDDC(grade); + } + + @Override + public void batchInsertChillersHistory(List chillersEntityLists) { + chillersMapper.batchInsertChillersHistory(chillersEntityLists); + } + + @Override + public String queryLastChillersHistory(ChillersEntity chillersEntity) { + return chillersMapper.queryLastChillersHistory(chillersEntity); + } + + @Override + public List queryDDCAddr(String ddcAddr) { + return chillersMapper.queryDDCAddr(ddcAddr); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/impl/DataHistoryServiceImpl.java b/user-service/src/main/java/com/mh/user/service/chillers/impl/DataHistoryServiceImpl.java new file mode 100644 index 0000000..5695e87 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/impl/DataHistoryServiceImpl.java @@ -0,0 +1,27 @@ +package com.mh.user.service.chillers.impl; + +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.mapper.chillers.DataHistoryMapper; +import com.mh.user.service.chillers.DataHistoryService; +import org.springframework.stereotype.Service; + +/** + * @Classname DataHistoryServiceImpl + * @Description TODO + * @Date 2020-06-03 17:26 + * @Created by LJF + */ +@Service +public class DataHistoryServiceImpl implements DataHistoryService { + + private final DataHistoryMapper dataHistoryMapper; + + public DataHistoryServiceImpl(DataHistoryMapper dataHistoryMapper) { + this.dataHistoryMapper = dataHistoryMapper; + } + + @Override + public int insertDataHistory(DeviceManageEntity deviceManageEntity) { + return dataHistoryMapper.insertDataHistory(deviceManageEntity); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/impl/DealDataServiceImpl.java b/user-service/src/main/java/com/mh/user/service/chillers/impl/DealDataServiceImpl.java new file mode 100644 index 0000000..bf7c9d9 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/impl/DealDataServiceImpl.java @@ -0,0 +1,107 @@ +package com.mh.user.service.chillers.impl; + +import com.mh.user.mapper.chillers.DealDataMapper; +import com.mh.user.service.chillers.DealDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-28 + * @throws : + */ +@Service +public class DealDataServiceImpl implements DealDataService { + + private final DealDataMapper dealDataMapper; + + @Autowired + public DealDataServiceImpl(DealDataMapper dealDataMapper) { + this.dealDataMapper = dealDataMapper; + } + + @Override + public void proEnergy(String curDate) { + + dealDataMapper.proEnergy(curDate); + } + + @Override + public void proEnergyData(String curDate) { + + dealDataMapper.proEnergyData(curDate); + } + + @Override + public void proDataResult(String curDate,String projectID) { + + dealDataMapper.proDataResult(curDate,projectID); + } + + @Override + public void proEnergyDaySum(String curDate, String projectID) { + dealDataMapper.proEnergyDaySum(curDate,projectID); + } + + @Override + public void proDeviceState(String curDate) { + dealDataMapper.proDeviceState(curDate); + } + + @Override + public void proAnalysisMonth(String curDate) { + dealDataMapper.proAnalysisMonth(curDate); + } + + @Override + public void proAnalysisYear(String curDate) { + dealDataMapper.proAnalysisYear(curDate); + } + + @Override + public void proAlarmInfoSum(String curDate) { + dealDataMapper.proAlarmInfoSum(curDate); + } + + @Override + public void dealData() { + dealDataMapper.dealData(); + } + + @Override + public void deleteChillersDataHistory() { + dealDataMapper.deleteChillersDataHistory(); + } + + @Override + public void deleteDataHistory() { + dealDataMapper.deleteDataHistory(); + } + + @Override + public void saveTempHumidity(String curDate, String ambTemp, String humidity) { + String strDate=curDate.substring(0,10); + String strTime=curDate.substring(0,13)+":00:00"; + int count=dealDataMapper.selectDateTempHumidity(strDate); + if(count==0){ + dealDataMapper.dateTempHumidity(strDate,ambTemp,humidity); + }else{ + dealDataMapper.updateDateTempHumidity(strDate,ambTemp,humidity); + } + count=dealDataMapper.selectHourTempHumidity(strTime); + if(count==0){ + dealDataMapper.hourTempHumidity(strTime,ambTemp,humidity); + }else{ + dealDataMapper.updateHourTempHumidity(strTime,ambTemp,humidity); + } + } + + @Override + public List queryProjectId(String systemID) { + return dealDataMapper.queryProjectId(systemID); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/impl/DeviceDisplayServiceImpl.java b/user-service/src/main/java/com/mh/user/service/chillers/impl/DeviceDisplayServiceImpl.java new file mode 100644 index 0000000..453cf21 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/impl/DeviceDisplayServiceImpl.java @@ -0,0 +1,37 @@ +package com.mh.user.service.chillers.impl; + +import com.mh.user.dto.DeviceMessageDTO; +import com.mh.user.dto.DisplayBoxDataDTO; +import com.mh.user.mapper.chillers.DeviceDisplayMapper; +import com.mh.user.service.chillers.DeviceDisplayService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 设备数据显示实现类 + * @updateTime 2020-05-29 + * @throws : + */ +@Service +public class DeviceDisplayServiceImpl implements DeviceDisplayService { + + // 通过构造函数调用Mapper层接口 + private final DeviceDisplayMapper deviceDisplayMapper; + + public DeviceDisplayServiceImpl(DeviceDisplayMapper deviceDisplayMapper) { + this.deviceDisplayMapper = deviceDisplayMapper; + } + + @Override + public List deviceDisplayBoxData(String deviceType, String type) { + return deviceDisplayMapper.deviceDisplayBoxData(deviceType, type); + } + + @Override + public List queryDeviceStatus(String deviceType) { + return deviceDisplayMapper.queryDeviceStatus(deviceType); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/impl/DeviceManageServiceImpl.java b/user-service/src/main/java/com/mh/user/service/chillers/impl/DeviceManageServiceImpl.java new file mode 100644 index 0000000..84ccf5f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/impl/DeviceManageServiceImpl.java @@ -0,0 +1,77 @@ +package com.mh.user.service.chillers.impl; + +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.mapper.chillers.DeviceManageMapper; +import com.mh.user.service.chillers.DeviceManageService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-14 + * @throws : + */ +@Slf4j +@Component +@Service +public class DeviceManageServiceImpl implements DeviceManageService { + + // 构造方法注入 + private final DeviceManageMapper deviceManageMapper; + + @Autowired + public DeviceManageServiceImpl(DeviceManageMapper deviceManageMapper) { + this.deviceManageMapper = deviceManageMapper; + } + + @Override + public List getDeviceByOther(String deviceNum) { + return deviceManageMapper.getDeviceByOther(deviceNum); + } + + @Override + public void addOrUpdateBaseMeter(DeviceManageEntity deviceManageEntity) { + if(deviceManageEntity.getType().equals("edit")){ + deviceManageMapper.updateBaseMeter(deviceManageEntity); + }else if(deviceManageEntity.getType().equals("add")){ + deviceManageMapper.insertBaseMeter(deviceManageEntity); + } + } + + /** + * 删除设备信息 + * @param deviceId + * @param deviceType + */ + @Override + public void deleteDeviceInfo(Integer deviceId, String deviceType) { + deviceManageMapper.deleteDeviceInfo(deviceId,deviceType); + } + + @Override + public List queryDevicesByType(String deviceType) { + return deviceManageMapper.queryDevicesByType(deviceType); + } + + @Override + public List queryAllDevice() { + log.info("查询全部设备------------------"); + return deviceManageMapper.queryAllDevice(); + } + + @Override + public List queryDeviceByOther(int page, int size, String deviceNum) { + return deviceManageMapper.queryDeviceByOther(page, size, deviceNum); + } + + @Override + public int queryDeviceByOtherCount(String deviceNum) { + return deviceManageMapper.queryDeviceByOtherCount(deviceNum); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/impl/DeviceParamServiceImpl.java b/user-service/src/main/java/com/mh/user/service/chillers/impl/DeviceParamServiceImpl.java new file mode 100644 index 0000000..4a4cdee --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/impl/DeviceParamServiceImpl.java @@ -0,0 +1,76 @@ +package com.mh.user.service.chillers.impl; + +import com.mh.user.entity.DeviceParameterEntity; +import com.mh.user.mapper.chillers.DeviceParamMapper; +import com.mh.user.service.chillers.DeviceParamService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 实现类 + * @updateTime 2020-05-21 + * @throws : + */ +@Service +public class DeviceParamServiceImpl implements DeviceParamService { + + private final DeviceParamMapper deviceParamMapper; + + public DeviceParamServiceImpl(DeviceParamMapper deviceParamMapper) { + this.deviceParamMapper = deviceParamMapper; + } + + @Override + public List getBaseMeterParamList(String baseMeterType) { + return deviceParamMapper.getBaseMeterParamList(baseMeterType); + } + + @Override + public void addOrUpdateBaseMeterParam(DeviceParameterEntity deviceParameterEntity) { + if(deviceParameterEntity.getType().equals("edit")){ + deviceParamMapper.updateBaseMeterParam(deviceParameterEntity); + }else if(deviceParameterEntity.getType().equals("add")){ + deviceParamMapper.insertBaseMeterParam(deviceParameterEntity); + } + } + + @Override + public String insertDeviceParam(DeviceParameterEntity deviceParameterEntity) { + // 判断是否已经包含 + DeviceParameterEntity deviceParameterEntity1 = deviceParamMapper.queryParamById(deviceParameterEntity.getParamId()); + if (deviceParameterEntity1.getId() != null) { + return "数据重复,请重新插入"; + } else { + deviceParamMapper.insertDeviceParam(deviceParameterEntity); + return "数据插入成功"; + } + } + + @Override + public void deleteDeviceParamByID(Long id) { + deviceParamMapper.deleteDeviceParamByID(id); + } + + @Override + public DeviceParameterEntity queryParamById(int paramId) { + return deviceParamMapper.queryParamById(paramId); + } + + @Override + public List queryAll() { + return deviceParamMapper.queryAll(); + } + + @Override + public List queryByOther(int page, int size, int paramId) { + return deviceParamMapper.queryByOther(page, size, paramId); + } + + @Override + public int queryByOtherCount(int page, int size, int paramId) { + return deviceParamMapper.queryByOtherCount(page, size, paramId); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/impl/ExceptionServiceImpl.java b/user-service/src/main/java/com/mh/user/service/chillers/impl/ExceptionServiceImpl.java new file mode 100644 index 0000000..e659d11 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/impl/ExceptionServiceImpl.java @@ -0,0 +1,47 @@ +package com.mh.user.service.chillers.impl; + +import com.mh.user.entity.ExceptionEntity; +import com.mh.user.entity.ExceptionTableData; +import com.mh.user.mapper.chillers.ExceptionMapper; +import com.mh.user.service.chillers.ExceptionService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +@Service +public class ExceptionServiceImpl implements ExceptionService { + + private final ExceptionMapper exceptionMapper; + + public ExceptionServiceImpl(ExceptionMapper exceptionMapper) { + this.exceptionMapper = exceptionMapper; + } + + @Override + public List queryException(ExceptionEntity exceptionEntity) { + return exceptionMapper.queryException(exceptionEntity); + } + + @Override + public int queryExceptionTotal(ExceptionEntity exceptionEntity) { + return exceptionMapper.queryExceptionTotal(exceptionEntity); + } + + @Override + public String updateException(ExceptionTableData exceptionTableData) { + int a = exceptionMapper.updateException(exceptionTableData); + if (a != 0) { + return "success"; + } else { + return "fail"; + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/impl/GatewayManageServiceImpl.java b/user-service/src/main/java/com/mh/user/service/chillers/impl/GatewayManageServiceImpl.java new file mode 100644 index 0000000..db6b391 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/impl/GatewayManageServiceImpl.java @@ -0,0 +1,103 @@ +package com.mh.user.service.chillers.impl; + +import com.mh.user.entity.GatewayManageEntity; +import com.mh.user.mapper.chillers.GatewayManageMapper; +import com.mh.user.service.chillers.GatewayManageService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 网关管理实现类 + * @updateTime 2020-05-21 + * @throws : + */ +@Service +public class GatewayManageServiceImpl implements GatewayManageService { + + // 通过构造函数注入,引用Mapper + private final GatewayManageMapper gatewayManageMapper; + + public GatewayManageServiceImpl(GatewayManageMapper gatewayManageMapper) { + this.gatewayManageMapper = gatewayManageMapper; + } + + /** + * 按条件查询网关信息 + * @param grade + * @param operator + * @return + */ + @Override + public List queryByOther(Integer grade, Integer operator) { + return gatewayManageMapper.queryByOther(grade, operator); + } + + /** + * 新增或更新网关信息 + * @param gatewayManageEntity + */ + @Override + public void addOrUpdateGateWayInfo(GatewayManageEntity gatewayManageEntity) { + if(gatewayManageEntity.getType().equals("edit")){ + // 更新 + gatewayManageMapper.updateGateWayInfo(gatewayManageEntity); + } else if (gatewayManageEntity.getType().equals("add")) { + // 新增 + gatewayManageMapper.insertGateWayInfo(gatewayManageEntity); + } + } + @Override + public String insertGatewayManage(GatewayManageEntity gatewayManageEntity) { + // 判断是否已经包含 + GatewayManageEntity gatewayManageEntity1 = gatewayManageMapper.queryGatewayByID(gatewayManageEntity.getId()); + if (gatewayManageEntity1.getId() != null) { + return "数据重复,请重新插入"; + } else { + gatewayManageMapper.insertGatewayManage(gatewayManageEntity); + return "数据插入成功"; + } + } + + @Override + public void deleteGatewayManageByID(int gatewayID) { + gatewayManageMapper.deleteGatewayManageByID(gatewayID); + } + + @Override + public GatewayManageEntity queryGatewayByID(Long gatewayID) { + return gatewayManageMapper.queryGatewayByID(gatewayID); + } + + @Override + public List queryAll() { + return gatewayManageMapper.queryAll(); + } + + @Override + public int queryByOtherCount(int page, int size, int gatewayID) { + return gatewayManageMapper.queryByOtherCount(page, size, gatewayID); + } + + @Override + public void updateGatewayManage(String IP,String port) { + gatewayManageMapper.updateGatewayManage(IP,port); + } + + @Override + public void updateGatewayManage2(String port) { + gatewayManageMapper.updateGatewayManage2(port); + } + + @Override + public GatewayManageEntity queryGatewayByGrade(Long grade) { + return gatewayManageMapper.queryGatewayByGrade(grade); + } + + @Override + public String selectProjectName(String str) { + return gatewayManageMapper.selectProjectName(str); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/impl/GaugeServiceImpl.java b/user-service/src/main/java/com/mh/user/service/chillers/impl/GaugeServiceImpl.java new file mode 100644 index 0000000..a969d42 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/impl/GaugeServiceImpl.java @@ -0,0 +1,51 @@ +package com.mh.user.service.chillers.impl; + +import com.mh.user.entity.GaugeEntity; +import com.mh.user.entity.TableChartMessageEntity; +import com.mh.user.mapper.chillers.GaugeMapper; +import com.mh.user.service.chillers.GaugeService; +import org.springframework.stereotype.Service; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-08-07 + * @throws : + */ +@Service +public class GaugeServiceImpl implements GaugeService { + + private final GaugeMapper gaugeMapper; + + public GaugeServiceImpl(GaugeMapper gaugeMapper) { + this.gaugeMapper = gaugeMapper; + } + + + @Override + public GaugeEntity getGaugeData(String type, String deviceName) { + try { + TableChartMessageEntity tableChartMessageEntity = gaugeMapper.queryDeviceId(type, deviceName); + GaugeEntity gaugeEntity = gaugeMapper.getGaugeData(tableChartMessageEntity.getTimeName(),tableChartMessageEntity.getGrade()); + if (type.equalsIgnoreCase("0")) { + gaugeEntity.setMax("5000"); + } else if (type.equalsIgnoreCase("1")) { + gaugeEntity.setMax("20"); + } else if (type.equalsIgnoreCase("2")) { + gaugeEntity.setMax("2500"); + } else if (type.equalsIgnoreCase("3")) { + gaugeEntity.setMax("10"); + } + return gaugeEntity; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + @Override + public TableChartMessageEntity queryDeviceId(String type, String deviceName) { + return gaugeMapper.queryDeviceId(type, deviceName); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/impl/OrderMessageServiceImpl.java b/user-service/src/main/java/com/mh/user/service/chillers/impl/OrderMessageServiceImpl.java new file mode 100644 index 0000000..edb36e8 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/impl/OrderMessageServiceImpl.java @@ -0,0 +1,82 @@ +package com.mh.user.service.chillers.impl; + +import com.mh.user.entity.ChillersEntity; +import com.mh.user.entity.OrderMessageEntity; +import com.mh.user.mapper.chillers.ChillerControlOrderMapper; +import com.mh.user.service.chillers.OrderMessageService; +import com.mh.user.utils.ExchangeStringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-28 + * @throws : + */ +@Component +@Service +public class OrderMessageServiceImpl implements OrderMessageService { + + private final ChillerControlOrderMapper chillerControlOrderMapper; + + public OrderMessageServiceImpl(ChillerControlOrderMapper chillerControlOrderMapper) { + this.chillerControlOrderMapper = chillerControlOrderMapper; + } + + @Override + public void updateChillersRegisterAddress(String dataStr, String registerAddr) { + chillerControlOrderMapper.updateChillersRegisterAddress(dataStr, registerAddr); + } + + @Override + public void updateOrderMessage(OrderMessageEntity orderMessageEntity) { + chillerControlOrderMapper.updateOrderMessage(orderMessageEntity); + // 判断是否是群控指令操作,如果是,更新对应chiller_register_address表中的对应值 + if (orderMessageEntity.getOrderStr().startsWith("00")) { + if (orderMessageEntity.getRegisterAddr().equalsIgnoreCase("02") + || orderMessageEntity.getRegisterAddr().equalsIgnoreCase("04")) { + orderMessageEntity.setOrderStr( + String.valueOf( + Double.parseDouble(ExchangeStringUtil.hexToDec( + orderMessageEntity.getOrderStr().substring( + orderMessageEntity.getOrderStr().length()-4) + ))/100) + ); + chillerControlOrderMapper.updateChillersBySendDDC1(orderMessageEntity); + } else { + chillerControlOrderMapper.updateChillersBySendDDC(orderMessageEntity); + } + } + } + + @Override + public ChillersEntity queryChiller(int id) { + return chillerControlOrderMapper.queryChiller(id); + } + + @Override + public ChillersEntity queryChillerById(int id) { + return chillerControlOrderMapper.queryChillerById(id); + } + + @Override + public void batchInsertOrderMessage(List orderMessageEntityList) { + chillerControlOrderMapper.batchInsertOrderMessage(orderMessageEntityList); + } + + @Override + public Date queryCloseChilledLastTime() { + return chillerControlOrderMapper.queryCloseChilledLastTime(); + } + + @Override + public void updateChillersBySendDDC(OrderMessageEntity orderMessageEntity) { + chillerControlOrderMapper.updateChillersBySendDDC(orderMessageEntity); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/chillers/impl/ReportServiceImpl.java b/user-service/src/main/java/com/mh/user/service/chillers/impl/ReportServiceImpl.java new file mode 100644 index 0000000..dace247 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/chillers/impl/ReportServiceImpl.java @@ -0,0 +1,36 @@ +package com.mh.user.service.chillers.impl; + +import com.mh.user.entity.ReportParamEntity; +import com.mh.user.mapper.chillers.ReportMapper; +import com.mh.user.service.chillers.ReportService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-03 + * @throws : + */ +@Service +public class ReportServiceImpl implements ReportService { + + private final ReportMapper reportMapper; + + public ReportServiceImpl(ReportMapper reportMapper) { + this.reportMapper = reportMapper; + } + + @Override + public List queryAllTarget(String type) { + if (type.equalsIgnoreCase("fourWeek") + || type.equalsIgnoreCase("twelveMonth") + || type.equalsIgnoreCase("fourYear") + ) { + return reportMapper.queryAllTarget1(); + } + return reportMapper.queryAllTarget(); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/AlarmInfoServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/AlarmInfoServiceImpl.java new file mode 100644 index 0000000..9686478 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/AlarmInfoServiceImpl.java @@ -0,0 +1,58 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.AlarmInfoEntity; +import com.mh.user.entity.AlarmValueSetEntity; +import com.mh.user.mapper.AlarmInfoMapper; +import com.mh.user.service.AlarmInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AlarmInfoServiceImpl implements AlarmInfoService { + + @Autowired + AlarmInfoMapper alarmInfoMapper; + + @Override + public void saveAlarmInfo(AlarmInfoEntity alarmInfoEntity) { + alarmInfoMapper.saveAlarmInfo(alarmInfoEntity); + } + + @Override + public void updateAlarmInfo(AlarmInfoEntity alarmInfoEntity) { + alarmInfoMapper.updateAlarmInfo(alarmInfoEntity); + } + + @Override + public List queryAlarmInfo(String alarmTime, String deviceType, String buildingId,String dealState, int page, int limit) { + return alarmInfoMapper.queryAlarmInfo(alarmTime, deviceType, buildingId,dealState, page, limit); + } + + @Override + public int getAlarmInfoCount(String alarmTime, String alarmDevice, String buildingId,String dealState, int page, int limit) { + return alarmInfoMapper.getAlarmInfoCount(alarmTime, alarmDevice, buildingId,dealState, page, limit); + } + + @Override + public void deleteAlarmInfo(String id) { + alarmInfoMapper.deleteAlarmInfo(id); + } + + @Override + public void saveAlarmValueSet(AlarmValueSetEntity alarmValueSetEntity) { + try{ + alarmInfoMapper.delAlarmValueSet(); //先删除 + alarmInfoMapper.saveAlarmValueSet(alarmValueSetEntity);//后保存 + + }catch (Exception e){ + e.printStackTrace(); + } + } + + @Override + public void updateDealState(String id, String dealState) { + alarmInfoMapper.updateDealState(id,dealState); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/AreaServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/AreaServiceImpl.java new file mode 100644 index 0000000..6874f66 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/AreaServiceImpl.java @@ -0,0 +1,21 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.AreaEntity; +import com.mh.user.mapper.AreaMapper; +import com.mh.user.service.AreaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AreaServiceImpl implements AreaService { + + @Autowired + AreaMapper areaMapper; + + public List findAll(){ + + return areaMapper.findAll(); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/BuildingServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/BuildingServiceImpl.java new file mode 100644 index 0000000..1ffa992 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/BuildingServiceImpl.java @@ -0,0 +1,65 @@ +package com.mh.user.service.impl; + +import com.mh.common.http.HttpResult; +import com.mh.user.constants.SysConstants; +import com.mh.user.entity.BuildingEntity; +import com.mh.user.mapper.BuildingMapper; +import com.mh.user.model.BuildingModel; +import com.mh.user.service.BuildingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class BuildingServiceImpl implements BuildingService { + + @Autowired + private BuildingMapper buildingMapper; + + @Override + public int saveBuilding(BuildingEntity buildingEntity) { + return buildingMapper.saveBuilding(buildingEntity); + } + + @Override + public int updateBuilding(BuildingEntity buildingEntity) { + return buildingMapper.updateBuilding(buildingEntity); + } + + @Override + public List queryBuilding(String buildingId,int page, int limit) { + return buildingMapper.queryBuilding(buildingId,page,limit); + } + + @Override + public int getCount(String buildingId,int page, int limit) { + return buildingMapper.getCount(buildingId,page,limit); + } + + @Override + public List selectBuildingName(){ + return buildingMapper.selectBuildingName(); + } + + //查询楼栋编号 + @Override + public String selectBuildingId(String buildingName) { + return buildingMapper.selectBuildingId(buildingName); + } + + // 删除多个 + @Override + public int deleteBuilding(List records) { + for(BuildingEntity record:records) { + buildingMapper.deleteBuilding(record.getId().toString()); + } + return 0; + } + + // 删除单个 + @Override + public int deleteBuilding(String id) { + return buildingMapper.deleteBuilding(id); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/ControlSetServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/ControlSetServiceImpl.java new file mode 100644 index 0000000..d9f16bc --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/ControlSetServiceImpl.java @@ -0,0 +1,30 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.ControlSetEntity; +import com.mh.user.mapper.ControlSetMapper; +import com.mh.user.service.ControlSetService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ControlSetServiceImpl implements ControlSetService { + + @Autowired + ControlSetMapper controlSetMapper; + + @Override + public void saveControlSet(ControlSetEntity controlSetEntity) { + String buildingId=controlSetEntity.getBuildingId(); + int n=controlSetMapper.selectCount(buildingId); + if(n==0){ + controlSetMapper.saveControlSet(controlSetEntity); + }else{ + controlSetMapper.updateControlSet(controlSetEntity); + } + } + + @Override + public ControlSetEntity queryControlSet(String buildingId) { + return controlSetMapper.queryControlSet(buildingId); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java new file mode 100644 index 0000000..4bbc4fc --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java @@ -0,0 +1,299 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.DataResultClEntity; +import com.mh.user.entity.DataResultEntity; +import com.mh.user.entity.DataResultChEntity; +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.mapper.DataResultMapper; +import com.mh.user.mapper.DeviceInstallMapper; +import com.mh.user.service.DataResultService; +import com.mh.user.service.DeviceInstallService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +@Service +public class DataResultServiceImpl implements DataResultService { + + @Autowired + DataResultMapper dataResultMapper; + + @Autowired + DeviceInstallMapper deviceInstallMapper; + + @Autowired + DeviceInstallService deviceInstallService; + + @Override + public void saveDataResult(DataResultEntity dataResultEntity) { + + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try{ + //获取系统日期 + Date date=new Date(); + if (dataResultEntity.getCurDate()==null){ + dataResultEntity.setCurDate(date); + } + //从安装表获取设备信息 + DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType(),dataResultEntity.getProjectID()); + //判断是否有记录 +// int r = dataResultMapper.selectDataResultCount(sdf1.format(dataResultEntity.getCurDate()), +// dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType()); +// if (r==0){//插入记录 + DataResultEntity data=new DataResultEntity(); + if (dataResultEntity.getDeviceType().equals("水表") || dataResultEntity.getDeviceType().equals("电表")){ +// String str=dataResultEntity.getDeviceAddr(); +// data.setDeviceAddr(str.substring(str.length()-8,str.length())); //通讯地址 + data.setDeviceAddr(dataResultEntity.getDeviceAddr()); //通讯地址 + }else{ + data.setDeviceAddr(dataResultEntity.getDeviceAddr()); //通讯地址 + } + data.setDeviceType(dataResultEntity.getDeviceType()); //设备类型 + String curDate=sdf1.format(dataResultEntity.getCurDate()); + data.setCurDate(sdf1.parse(curDate));//当前日期 + data.setCurValue(dataResultEntity.getCurValue()); //当前读数 + data.setProjectID(deviceInstallEntity.getProjectID()); //楼栋编号 + data.setRatio(deviceInstallEntity.getRatio()); //倍率 + double lastValue=deviceInstallEntity.getLastValue(); //安装基表上次读数 + double calcValue=dataResultEntity.getCurValue()-lastValue; //计算用量 + data.setCalcValue(calcValue);//用量 + if (deviceInstallEntity.getLastDate()!=null){//上次抄表日期 + String lastDate=sdf1.format(deviceInstallEntity.getLastDate()); + data.setLastDate(sdf1.parse(lastDate)); + }else{ + String lastDate=sdf1.format(date); + data.setLastDate(sdf1.parse(lastDate)); + } + data.setLastValue(lastValue);//上次读数 + data.setGrade(dataResultEntity.getGrade());//级别 + dataResultMapper.saveDataResult(data); //插入新的记录 +// }else {//修改记录的curValue、calcValue +// DataResultEntity data2=dataResultMapper.selectDataResult(sdf1.format(dataResultEntity.getCurDate()),dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType()); +// double lastValue=data2.getLastValue(); //安装基表上次读数 +// double calcValue=dataResultEntity.getCurValue()-lastValue; //计算用量 +// String curDate=sdf1.format(dataResultEntity.getCurDate()); +// data2.setCurDate(sdf1.parse(curDate));//当前日期 +// data2.setCurValue(dataResultEntity.getCurValue());//当前读数 +// data2.setCalcValue(calcValue);//用量 +// +// dataResultMapper.updateDataResult(data2); //更新记录 +// } + //修改安装表中lastValue,lastDate的值 + deviceInstallMapper.updateLastValue(deviceInstallEntity.getId(),dataResultEntity.getCurValue(),date); + }catch (Exception e){ + e.printStackTrace(); + + } + } + + @Override + public void updateDataResult(DataResultEntity dataResultEntity) { + dataResultMapper.updateDataResult(dataResultEntity); + } + + @Override + public List queryDataResult(String projectID, String startDate, String endDate,String deviceType, int page, int limit) { + return dataResultMapper.queryDataResult(projectID,startDate,endDate,deviceType,page,limit); + } + + @Override + public int getDataResultCount(String projectID, String startDate, String endDate,String deviceType, int page, int limit) { + return dataResultMapper.getDataResultCount(projectID,startDate,endDate,deviceType,page,limit); + } + //------------------------------------------------------------------------------------- + //保存流量计用量 + @Override + public void saveDataResultCl(DataResultClEntity dataResultClEntity) throws ParseException { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try{ + //获取系统日期 + Date date=new Date(); + if (dataResultClEntity.getCurDate()==null){ + dataResultClEntity.setCurDate(date); + } + //从安装表获取设备信息 + DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(dataResultClEntity.getDeviceAddr(),dataResultClEntity.getDeviceType(),dataResultClEntity.getProjectID()); + Double lastValue=deviceInstallEntity.getLastValue(); + Double curValue=dataResultClEntity.getCurValue(); + dataResultClEntity.setRatio(deviceInstallEntity.getRatio()); //倍率 +// if ((curValue-lastValue)<1000 && (curValue-lastValue)>=0){ + if ((curValue-lastValue)>=0){ + dataResultMapper.saveDataResultCl(dataResultClEntity); //插入新的记录 + //修改安装表中lastValue,lastDate的值 + deviceInstallMapper.updateLastValue(deviceInstallEntity.getId(),curValue,date); + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + //保存流量计用量 + @Override + public void saveDataResultCl_bak(DataResultClEntity dataResultClEntity) throws ParseException { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try{ + //获取系统日期 + Date date=new Date(); + if (dataResultClEntity.getCurDate()==null){ + dataResultClEntity.setCurDate(date); + } + //从安装表获取设备信息 + DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(dataResultClEntity.getDeviceAddr(),dataResultClEntity.getDeviceType(),dataResultClEntity.getProjectID()); + Double lastValue=deviceInstallEntity.getLastValue(); + Double curValue=dataResultClEntity.getCurValue(); + dataResultClEntity.setRatio(deviceInstallEntity.getRatio()); //倍率 + dataResultMapper.saveDataResultCl_bak(dataResultClEntity); //插入新的记录 + + }catch (Exception e){ + e.printStackTrace(); + } + } + @Override + public void updateDataResultCl(DataResultClEntity dataResultClEntity) { + dataResultMapper.updateDataResultCl(dataResultClEntity); + } + + //------------------------------------------------------------------------------------- + @Override + public void saveDataResultCh(DataResultChEntity dataResultChEntity) throws ParseException { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try{ + //获取系统日期 + Date date=new Date(); + if (dataResultChEntity.getCurDate()==null){ +// dataResultChEntity.setCurDate(date); + } + //从安装表获取设备信息 +// DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(dataResultChEntity.getDeviceAddr(), dataResultChEntity.getDeviceType(), dataResultChEntity.getProjectID()); +// +// DataResultChEntity data=new DataResultChEntity(); +// data.setDeviceAddr(dataResultChEntity.getDeviceAddr()); //通讯地址 +// data.setDeviceType(dataResultChEntity.getDeviceType()); //设备类型 +// String curDate=sdf1.format(dataResultChEntity.getCurDate()); +// data.setCurDate(sdf1.parse(curDate));//当前日期 +// data.setProjectID(deviceInstallEntity.getProjectID()); //项目编号 + + String deviceAddr=dataResultChEntity.getDeviceAddr(); + String registerAddr=dataResultChEntity.getRegisterAddr(); + String curDate=sdf1.format(dataResultChEntity.getCurDate()); + String projectID=dataResultChEntity.getProjectID(); + int row=dataResultMapper.selectDataResultChCount(curDate,deviceAddr,registerAddr,projectID);//无记录 + if (row==0){ + dataResultMapper.saveDataResultCh(dataResultChEntity); //插入新的记录 + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + @Override + public void updateDataResultCh(DataResultChEntity dataResultChEntity) { + dataResultMapper.saveDataResultCh(dataResultChEntity); + } + + @Override + public List queryDataResultMi(String projectID,String startDate,String curDate,int page,int limit, int type) { + if (type==0){ + return dataResultMapper.queryDataResultOneMi(projectID,startDate,curDate,page,limit); + }else if (type==1){ + return dataResultMapper.queryDataResultFiveMi(projectID,startDate,curDate,page,limit); + }else if (type==2){ + return dataResultMapper.queryDataResultFifteenMi(projectID,startDate,curDate,page,limit); + }else { + return dataResultMapper.queryDataResultOneMi(projectID,startDate,curDate,page,limit); + } + } + + @Override + public int dataResultOneMiCount(String projectID,String startDate,String curDate) { + return dataResultMapper.dataResultOneMiCount(projectID,startDate,curDate); + } + + @Override + public int dataResultFiveMiCount(String projectID,String startDate,String curDate) { + return dataResultMapper.dataResultFiveMiCount(projectID,startDate,curDate); + } + + @Override + public int dataResultFifteenMiCount(String projectID,String startDate,String curDate) { + return dataResultMapper.dataResultFifteenMiCount(projectID,startDate,curDate); + } + + @Override + public List queryDataResultSec(String projectID,String startDate,String curDate) { + return dataResultMapper.queryDataResultCh(projectID,startDate,curDate); + } + + @Override + public void saveDataResultChiller(DataResultChEntity dataResultChEntity) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try{ + + String deviceAddr=dataResultChEntity.getDeviceAddr(); + String registerAddr=dataResultChEntity.getRegisterAddr(); + + String str=""; + if (dataResultChEntity.getCurDate()!=null){ + str=sdf1.format(dataResultChEntity.getCurDate()); + }else{ + Date date=new Date();//获取系统日期 + str=sdf1.format(date); + } + + String curDate=""; + curDate=str.substring(16)+":00"; + String projectID=dataResultChEntity.getProjectID(); + dataResultChEntity.setCurDate(sdf1.parse(curDate)); + int row=dataResultMapper.selectDataResultChillerCount(curDate,deviceAddr,registerAddr,projectID);//无记录 + if (row==0){ + dataResultMapper.saveDataResultChiller(dataResultChEntity); //插入新的记录 + }else{ + dataResultMapper.updateDataResultChiller(dataResultChEntity); //修改 + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + @Override + public void updateDataResultChiller(DataResultChEntity dataResultChEntity) { + dataResultMapper.updateDataResultChiller(dataResultChEntity); + } + + @Override + public void saveDataResultNow(DataResultChEntity dataResultChEntity) { + String deviceAddr=dataResultChEntity.getDeviceAddr(); + String registerAddr=dataResultChEntity.getRegisterAddr(); + String deviceType=dataResultChEntity.getDeviceType(); + String projectID=dataResultChEntity.getProjectID(); + dataResultMapper.deleteDataResultNow(deviceAddr,deviceType,registerAddr,projectID); + dataResultMapper.saveDataResultNow(dataResultChEntity); + } + + @Override + public void deleteDataResultNow(String deviceAddr, String deviceType, String registerAddr, String projectID) { + dataResultMapper.deleteDataResultNow(deviceAddr,deviceType,registerAddr,projectID); + } + + @Override + public List selectDataResultNow(String deviceAddr, String deviceType, String projectID) { + return dataResultMapper.selectDataResultNow(deviceAddr, deviceType, projectID); + } + + @Override + public List queryDataResultChiller(String projectID, String deviceAddr,String registerName, String startDate, String curDate, int page, int limit) { + return dataResultMapper.queryDataResultChiller(projectID,deviceAddr, registerName, startDate, curDate, page, limit); + } + + @Override + public int dataResultChillerCount(String projectID,String deviceAddr, String registerName, String startDate, String curDate) { + return dataResultMapper.dataResultChillerCount(projectID,deviceAddr,registerName,startDate,curDate); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceCodeParamServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceCodeParamServiceImpl.java new file mode 100644 index 0000000..0f6a148 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceCodeParamServiceImpl.java @@ -0,0 +1,62 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.mapper.DeviceCodeParamMapper; +import com.mh.user.service.DeviceCodeParamService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DeviceCodeParamServiceImpl implements DeviceCodeParamService { + + @Autowired + DeviceCodeParamMapper deviceCodeParamMapper; + + + @Override + public void insertDeviceCodeParam(DeviceCodeParamEntity deviceCodeParamEntity) { + deviceCodeParamMapper.insertDeviceCodeParam(deviceCodeParamEntity); + } + + @Override + public List queryCodeParam(String gatewayPort) { + return deviceCodeParamMapper.queryCodeParam(gatewayPort); + } + + @Override + public List queryCodeParam2(String comName) { + return deviceCodeParamMapper.queryCodeParam2(comName); + } + + @Override + public List queryCodeParam3() { + return deviceCodeParamMapper.queryCodeParam3(); + } + + @Override + public DeviceCodeParamEntity queryDeviceCodeParam(String projectID, String deviceType, String deviceAddr,String registerAddr) { + return deviceCodeParamMapper.queryDeviceCodeParam(projectID,deviceType,deviceAddr,registerAddr); + } + + @Override + public int queryCount(String ProjectID) { + return deviceCodeParamMapper.queryCount(ProjectID); + } + + @Override + public int queryCount2() { + return deviceCodeParamMapper.queryCount2(); + } + + @Override + public void insertDeviceCodeParamList(List deviceCodeParamEntityList) { + deviceCodeParamMapper.insertDeviceCodeParamList(deviceCodeParamEntityList); + } + + @Override + public void selectInsertDeviceCodeParam(String ProjectID) { + deviceCodeParamMapper.selectInsertDeviceCodeParam(ProjectID); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceInfoServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceInfoServiceImpl.java new file mode 100644 index 0000000..985901b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceInfoServiceImpl.java @@ -0,0 +1,38 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.DeviceInfoEntity; +import com.mh.user.mapper.DeviceInfoMapper; +import com.mh.user.model.ChillerModel; +import com.mh.user.model.DeviceModel; +import com.mh.user.service.DeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class DeviceInfoServiceImpl implements DeviceInfoService { + + @Autowired + DeviceInfoMapper deviceInfoMapper; + + @Override + public List queryDeviceInfo(String systemID, String projectID,String deviceType) { + return deviceInfoMapper.queryDeviceInfo(systemID,projectID,deviceType); + } + + @Override + public List selectDevices(String projectID) { + return deviceInfoMapper.selectDevices(projectID); + } + + @Override + public List queryChiller(String projectID, String deviceAddr) { + return deviceInfoMapper.queryChiller(projectID, deviceAddr); + } + + @Override + public ChillerModel selectChiller(String projectID, String deviceAddr) { + return deviceInfoMapper.selectChiller(projectID, deviceAddr); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java new file mode 100644 index 0000000..a4fd39a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java @@ -0,0 +1,158 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.DeviceInstallEntity; +import com.mh.user.entity.DeviceInstallTempEntity; +import com.mh.user.entity.UploadDeviceInstallEntity; +import com.mh.user.mapper.DeviceInstallMapper; +import com.mh.user.mapper.provider.DeviceInstallProvider; +import com.mh.user.model.DeviceModel; +import com.mh.user.service.DeviceInstallService; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.SelectProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +@Service +public class DeviceInstallServiceImpl implements DeviceInstallService { + + @Autowired + private DeviceInstallMapper deviceInstallMapper; + + @Override + public int saveDevice(DeviceInstallEntity deviceInstallEntity) { + return deviceInstallMapper.saveDevice(deviceInstallEntity); + } + + @Override + public int updateDevice(DeviceInstallEntity deviceInstallEntity) { + return deviceInstallMapper.updateDevice(deviceInstallEntity); + } + + @Override + public void updateLastValue(Long id, double lastValue, Date lastDate) { + deviceInstallMapper.updateLastValue(id,lastValue,lastDate); + } + + @Override + public List getAllDevice(int page, int limit) { + return deviceInstallMapper.getAllDevice(page,limit); + } + + @Override + public List selectDeviceParams(String ProjectID) { + return deviceInstallMapper.selectDeviceParams(ProjectID); + } + + @Override + public List selectDeviceParams2() { + return deviceInstallMapper.selectDeviceParams2(); + } + + // 查询所有启用的设备 + @Override + public int getAllCount(){ + return deviceInstallMapper.getAllCount(); + } + + @Override + public List queryDevice(String buildingId,String deviceType, String startDate, String endDate, String isUse,String isFault,int page, int limit) { + return deviceInstallMapper.queryDevice(buildingId,deviceType,startDate, endDate,isUse, isFault,page, limit); + } + + @Override + public int getCount(String buildingId,String deviceType, String startDate, String endDate, String isUse, String isFault, int page, int limit) { + return deviceInstallMapper.getCount(buildingId,deviceType, startDate, endDate,isUse, isFault, page, limit); + } + + //查询设备在线情况 + @Override + public int getIsOnlineCount(String isOnline,String deviceType){ + return deviceInstallMapper.getIsOnlineCount(isOnline,deviceType); + } + + //根据通讯地址和设备类型查询对应的设备信息 + @Override + public DeviceInstallEntity selectDevice(String deviceAddr, String deviceType,String buildingId) { + return deviceInstallMapper.selectDevice(deviceAddr,deviceType,buildingId); + } + + @Override + public int deleteDevice(List records) { + for(DeviceInstallEntity record:records) { + deviceInstallMapper.deleteDevice(record.getId().toString()); + } + return 0; + } + + @Override + public int deleteDevice(String id) { + return deviceInstallMapper.deleteDevice(id); + } + + //Excel导入相关处理函数 + @Override + public void deleteDevice_install_temp() { + deviceInstallMapper.deleteDevice_install_temp(); + } + + @Override + public void insertDevice_install_temp(UploadDeviceInstallEntity uploadDeviceInstallEntity) { + String deviceAddr = uploadDeviceInstallEntity.getDeviceAddr(); + String deviceName = uploadDeviceInstallEntity.getDeviceName(); + String deviceType = uploadDeviceInstallEntity.getDeviceType(); + int baudRate = uploadDeviceInstallEntity.getBaudRate(); + String dataCom = uploadDeviceInstallEntity.getDataCom(); + double ratio = uploadDeviceInstallEntity.getRatio(); + String buildingId = uploadDeviceInstallEntity.getBuildingId(); + String rowId = uploadDeviceInstallEntity.getRowId(); + deviceInstallMapper.insertDevice_install_temp(deviceAddr, deviceName, deviceType, baudRate, dataCom, ratio, buildingId, rowId); + } + + // 查询Excel导入的数据 + @Override + public List queryExcelDevices(){ + return deviceInstallMapper.queryExcelDevices(); + }; + + // 查询Excel导入的数据的记录数 + @Override + public int queryExcelDevicesCount(){ + return deviceInstallMapper.queryExcelDevicesCount(); + }; + + // 在导入中的数据有重复 + @Override + public void updateDevice_install_temp__multiple() { + deviceInstallMapper.updateDevice_install_temp__multiple(); + } + + /** + * @author nxr + * @title : + * @description :判断导入资料数据的合法性 + * @updateTime 2022-06-19 + * @throws : + */ + public void updateDevice_install_temp(){ + //判断通讯地址,在导入中的数据有重复 + deviceInstallMapper.updateDevice_install_temp__multiple(); + } + + //从临时表查询插入 + @Override + public void insertFromDevice_install_temp() { + deviceInstallMapper.insertFromDevice_install_temp(); + deviceInstallMapper.deleteDevice_install_temp(); + } + + //修改设备启用状态 + @Override + public void updateDeviceIsUse(String isUse, String deviceAddr) { + deviceInstallMapper.updateDeviceIsUse(isUse,deviceAddr); + } + +} + diff --git a/user-service/src/main/java/com/mh/user/service/impl/EnergyDataServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/EnergyDataServiceImpl.java new file mode 100644 index 0000000..d3ba164 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/EnergyDataServiceImpl.java @@ -0,0 +1,66 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.EnergyDataEntity; +import com.mh.user.mapper.EnergyDataMapper; +import com.mh.user.model.EnergyModel; +import com.mh.user.service.EnergyDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class EnergyDataServiceImpl implements EnergyDataService { + + @Autowired + EnergyDataMapper energyDataMapper; + + @Override + public List queryEnergyData(EnergyModel energyModel) { + String projectID=energyModel.getProjectID(); + String startDate=energyModel.getStartDate(); + String endDate=energyModel.getEndDate(); + int page=energyModel.getPage(); + int limit=energyModel.getLimit(); + int type=energyModel.getType(); + int queryType=energyModel.getQueryType(); + + if (type==1){ //按十分钟 + return energyDataMapper.queryEnergyDataMi(projectID,startDate,page,limit); + }else if(type==2){ //按小时 + return energyDataMapper.queryEnergyDataHour(projectID,startDate,page,limit); + }else if(type==3){ //按天 + return energyDataMapper.queryEnergyDataDay(projectID,startDate,queryType,page,limit); + }else if(type==4){ //按月 + return energyDataMapper.queryEnergyDataMonth(projectID,startDate,queryType,page,limit); + }else if(type==5){ //按年 + return energyDataMapper.queryEnergyDataYear(projectID,startDate,endDate,queryType,page,limit); + }else{ //按天,默认 + return energyDataMapper.queryEnergyDataDay(projectID,startDate,queryType,page,limit); + } + } + + @Override + public int getEnergyDataCount(EnergyModel energyModel) { + String projectID=energyModel.getProjectID(); + String startDate=energyModel.getStartDate(); + String endDate=energyModel.getEndDate(); + int type=energyModel.getType(); + int queryType=energyModel.getQueryType(); + + if (type==1){ //按十分钟 + return energyDataMapper.getEnergyDataMiCount(projectID,startDate); + }else if(type==2) { //按小时 + return energyDataMapper.getEnergyDataHourCount(projectID,startDate); + }else if(type==3) { //按天 + return energyDataMapper.getEnergyDataDayCount(projectID,startDate,queryType); + }else if(type==4) { //按月 + return energyDataMapper.getEnergyDataMonthCount(projectID,startDate,queryType); + }else if(type==5) { //按年 + return energyDataMapper.getEnergyDataYearCount(projectID,startDate,endDate,queryType); + }else { //按天,默认 + return energyDataMapper.getEnergyDataDayCount(projectID,startDate,queryType); + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/EnergyServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/EnergyServiceImpl.java new file mode 100644 index 0000000..1e2d826 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/EnergyServiceImpl.java @@ -0,0 +1,120 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.EnergyEntity; +import com.mh.user.mapper.EnergyMapper; +import com.mh.user.model.EnergyParam; +import com.mh.user.service.EnergyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + +@Service +public class EnergyServiceImpl implements EnergyService { + + @Autowired + EnergyMapper energyMapper; + + @Override + public void saveEnergy(EnergyEntity energyEntity,int type) { + + if(type==1){ // 保存天 + energyMapper.saveEnergyDay(energyEntity); + }else if(type==2){ // 保存月 + energyMapper.saveEnergyMonth(energyEntity); + }else if(type==3){ // 保存年 + energyMapper.saveEnergyYear(energyEntity); + } + } + + @Override + public void updateEnergy(EnergyEntity energyEntity,int type) { + + if(type==1){ + energyMapper.updateEnergyDay(energyEntity); + } else if (type==2){ + energyMapper.updateEnergyMonth(energyEntity); + } else if (type==3){ + energyMapper.updateEnergyYear(energyEntity); + } + } + + @Override + public void deleteEnergy(String curDate, String buildingId,int type) { + + if(type==1){ + energyMapper.deleteEnergyDay(curDate,buildingId); + } else if (type==2){ + energyMapper.deleteEnergyMonth(curDate,buildingId); + } else if (type==3){ + energyMapper.deleteEnergyYear(curDate,buildingId); + } + } + + @Override + public List queryEnergy(EnergyParam energyParam) { + String projectID=energyParam.getProjectID(); + String buildingId=energyParam.getBuildingId();//所有 + String startDate=energyParam.getStartDate(); + String endDate=energyParam.getEndDate(); + int queryType=energyParam.getQueryType(); + int page=energyParam.getPage(); + int limit=energyParam.getLimit(); + int type=energyParam.getType(); + + List list=new ArrayList(); + if(type==1) { +// list=energyMapper.queryEnergyHour(projectID,buildingId,startDate,queryType,page,limit); + }else if (type==2){ + list=energyMapper.queryEnergyDay(projectID,buildingId,startDate,endDate,queryType,page,limit); + }else if (type==3){ + list=energyMapper.queryEnergyMonth(projectID,buildingId,startDate,endDate,queryType,page,limit); + }else if (type==4){ + list=energyMapper.queryEnergyYear(projectID,buildingId,startDate,endDate,queryType,page,limit); + } + return list; + } + + @Override + public int getEnergyCount(EnergyParam energyParam) { + String projectID=energyParam.getProjectID(); + String buildingId=energyParam.getBuildingId(); + String startDate=energyParam.getStartDate(); + String endDate=energyParam.getEndDate(); + int queryType=energyParam.getQueryType(); + int type=energyParam.getType(); + + int r=0; // 记录数 + if(type==1) { + r=energyMapper.getEnergyDayCount(projectID,buildingId,startDate,endDate,queryType); + }else if (type==2){ + r=energyMapper.getEnergyDayCount(projectID,buildingId,startDate,endDate,queryType); + }else if (type==3){ + r=energyMapper.getEnergyMonthCount(projectID,buildingId,startDate,endDate,queryType); + }else if (type==4){ + r=energyMapper.getEnergyYearCount(projectID,buildingId,startDate,endDate,queryType); + } + return r; + } + + @Override + public List queryEnergyGroup(String curDate, int type) { + if(type==2) { + return energyMapper.queryEnergyMonthGroup(curDate); + }else if (type==3){ + return energyMapper.queryEnergyYearGroup(curDate); + }else { + return energyMapper.queryEnergyDayGroup(curDate); + } + } + + @Override + public List queryDayEnergy(String buildingId, String startDate, String endDate, int page, int limit) { + return energyMapper.queryDayEnergy(buildingId,startDate,endDate,page,limit); + } + + @Override + public int getDayEnergyCount(String buildingId, String startDate, String endDate, int page, int limit) { + return energyMapper.getDayEnergyCount(buildingId,startDate,endDate,page,limit); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/MeterInfoServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/MeterInfoServiceImpl.java new file mode 100644 index 0000000..bc26d99 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/MeterInfoServiceImpl.java @@ -0,0 +1,21 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.MeterInfoEntity; +import com.mh.user.mapper.MeterInfoMapper; +import com.mh.user.service.MeterInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class MeterInfoServiceImpl implements MeterInfoService { + + @Autowired + MeterInfoMapper meterInfoMapper; + + @Override + public List queryMeterInfo(String systemID, String projectID) { + return meterInfoMapper.queryMeterInfo(systemID,projectID); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/ProjectInfoServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/ProjectInfoServiceImpl.java new file mode 100644 index 0000000..b5fbd74 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/ProjectInfoServiceImpl.java @@ -0,0 +1,28 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.ProjectInfoEntity; +import com.mh.user.mapper.ProjectInfoMapper; +import com.mh.user.service.ProjectInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ProjectInfoServiceImpl implements ProjectInfoService { + + @Autowired + ProjectInfoMapper projectInfoMapper; + + + @Override + public List queryProjectInfo(String systemID) { + + return projectInfoMapper.queryProjectInfo(systemID); + } + + @Override + public String selectName(String id) { + return projectInfoMapper.selectName(id); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/RegisterAddrServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/RegisterAddrServiceImpl.java new file mode 100644 index 0000000..9b51839 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/RegisterAddrServiceImpl.java @@ -0,0 +1,21 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.RegisterAddrEntity; +import com.mh.user.mapper.RegisterAddrMapper; +import com.mh.user.service.RegisterAddrService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class RegisterAddrServiceImpl implements RegisterAddrService { + + @Autowired + RegisterAddrMapper registerAddrMapper; + + @Override + public List selectRegisterAddr() { + return registerAddrMapper.selectRegisterAddr(); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/StrategyInfoServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/StrategyInfoServiceImpl.java new file mode 100644 index 0000000..814e987 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/StrategyInfoServiceImpl.java @@ -0,0 +1,21 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.StrategyInfoEntity; +import com.mh.user.mapper.StrategyInfoMapper; +import com.mh.user.service.StrategyInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class StrategyInfoServiceImpl implements StrategyInfoService { + + @Autowired + StrategyInfoMapper strategyInfoMapper; + + @Override + public List queryStrategyInfo(String systemID, String projectID) { + return strategyInfoMapper.queryStrategyInfo(systemID,projectID); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SysDeptServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..2134253 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,81 @@ +package com.mh.user.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import com.mh.common.page.MybatisPageHelper; +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.mapper.SysDeptMapper; +import com.mh.user.model.SysDept; +import com.mh.user.service.SysDeptService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class SysDeptServiceImpl implements SysDeptService { + + @Autowired + private SysDeptMapper sysDeptMapper; + + @Override + public int save(SysDept record) { + if(record.getId() == null || record.getId() == 0) { + return sysDeptMapper.insertSelective(record); + } + return sysDeptMapper.updateByPrimaryKeySelective(record); + } + + @Override + public int delete(SysDept record) { + return sysDeptMapper.deleteByPrimaryKey(record.getId()); + } + + @Override + public int delete(List records) { + for(SysDept record:records) { + delete(record); + } + return 1; + } + + @Override + public SysDept findById(Long id) { + return sysDeptMapper.selectByPrimaryKey(id); + } + + @Override + public PageResult findPage(PageRequest pageRequest) { + return MybatisPageHelper.findPage(pageRequest, sysDeptMapper); + } + + @Override + public List findTree() { + List sysDepts = new ArrayList<>(); + List depts = sysDeptMapper.findAll(); + for (SysDept dept : depts) { + if (dept.getParentId() == null || dept.getParentId() == 0) { + dept.setLevel(0); + sysDepts.add(dept); + } + } + findChildren(sysDepts, depts); + return sysDepts; + } + + private void findChildren(List sysDepts, List depts) { + for (SysDept sysDept : sysDepts) { + List children = new ArrayList<>(); + for (SysDept dept : depts) { + if (sysDept.getId() != null && sysDept.getId().equals(dept.getParentId())) { + dept.setParentName(dept.getName()); + dept.setLevel(sysDept.getLevel() + 1); + children.add(dept); + } + } + sysDept.setChildren(children); + findChildren(children, depts); + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SysLogServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SysLogServiceImpl.java new file mode 100644 index 0000000..89acc01 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SysLogServiceImpl.java @@ -0,0 +1,70 @@ +package com.mh.user.service.impl; + +import com.mh.common.page.ColumnFilter; +import com.mh.common.page.MybatisPageHelper; +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.mapper.SysLogMapper; +import com.mh.user.model.SysLog; +import com.mh.user.service.SysLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class SysLogServiceImpl implements SysLogService { + + @Autowired + private SysLogMapper sysLogMapper; + + @Override + public int save(SysLog record) { + if(record.getId() == null || record.getId() == 0) { + return sysLogMapper.insertSelective(record); + } + return sysLogMapper.updateByPrimaryKeySelective(record); + } + + @Override + public int delete(SysLog record) { + return sysLogMapper.deleteByPrimaryKey(record.getId()); + } + + @Override + public int delete(List records) { + for(SysLog record:records) { + delete(record); + } + return 1; + } + + @Override + public SysLog findById(Long id) { + return sysLogMapper.selectByPrimaryKey(id); + } + + @Override + public PageResult findPage(PageRequest pageRequest) { + ColumnFilter columnFilter = pageRequest.getColumnFilter("userName"); + if(columnFilter != null) { + return MybatisPageHelper.findPage(pageRequest, sysLogMapper, "findPageByUserName", columnFilter.getValue()); + } + return MybatisPageHelper.findPage(pageRequest, sysLogMapper); + } + + @Override + public List findLogs(String userName, int page, int limit) { + return sysLogMapper.findLogs(userName,page,limit); + } + + @Override + public int findCount(String userName, int page, int limit) { + return sysLogMapper.findCount(userName,page,limit); + } + + @Override + public SysLog logInfo(int id) { + return sysLogMapper.logInfo(id); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SysMenuServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..5064014 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,113 @@ +package com.mh.user.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import com.mh.common.page.MybatisPageHelper; +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.constants.SysConstants; +import com.mh.user.mapper.SysMenuMapper; +import com.mh.user.model.SysMenu; +import com.mh.user.service.SysMenuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class SysMenuServiceImpl implements SysMenuService { + + @Autowired + private SysMenuMapper sysMenuMapper; + + @Override + public int save(SysMenu record) { + if(record.getId() == null || record.getId() == 0) { + return sysMenuMapper.insertSelective(record); + } + if(record.getParentId() == null) { + record.setParentId(0L); + } + return sysMenuMapper.updateByPrimaryKeySelective(record); + } + + @Override + public int delete(SysMenu record) { + return sysMenuMapper.deleteByPrimaryKey(record.getId()); + } + + @Override + public int delete(List records) { + for(SysMenu record:records) { + delete(record); + } + return 1; + } + + @Override + public SysMenu findById(Long id) { + return sysMenuMapper.selectByPrimaryKey(id); + } + + @Override + public PageResult findPage(PageRequest pageRequest) { + return MybatisPageHelper.findPage(pageRequest, sysMenuMapper); + } + + @Override + public List findTree(String systemID,String userName, int menuType) { + List sysMenus = new ArrayList<>(); + List menus = findByUser(systemID,userName); + for (SysMenu menu : menus) { + if (menu.getParentId() == null || menu.getParentId() == 0) { + menu.setLevel(0); + if(!exists(sysMenus, menu)) { + sysMenus.add(menu); + } + } + } + sysMenus.sort((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum())); + findChildren(sysMenus, menus, menuType); + return sysMenus; + } + + @Override + public List findByUser(String systemID,String userName) { + if(userName == null || "".equals(userName) || SysConstants.ADMIN.equalsIgnoreCase(userName)) { + return sysMenuMapper.findAll(systemID); + } + return sysMenuMapper.findByUserName(systemID,userName); + } + + private void findChildren(List SysMenus, List menus, int menuType) { + for (SysMenu SysMenu : SysMenus) { + List children = new ArrayList<>(); + for (SysMenu menu : menus) { + if(menuType == 1 && menu.getMenuType() == 2) { + // 如果是获取类型不需要按钮,且菜单类型是按钮的,直接过滤掉 + continue ; + } + if (SysMenu.getId() != null && SysMenu.getId().equals(menu.getParentId())) { + menu.setParentTitle(SysMenu.getTitle()); + menu.setLevel(SysMenu.getLevel() + 1); + if(!exists(children, menu)) { + children.add(menu); + } + } + } + SysMenu.setChildren(children); + children.sort((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum())); + findChildren(children, menus, menuType); + } + } + + private boolean exists(List sysMenus, SysMenu sysMenu) { + boolean exist = false; + for(SysMenu menu:sysMenus) { + if(menu.getId().equals(sysMenu.getId())) { + exist = true; + } + } + return exist; + } + +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SysRoleServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..358137c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,129 @@ +package com.mh.user.service.impl; + +import com.mh.common.page.ColumnFilter; +import com.mh.common.page.MybatisPageHelper; +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.constants.SysConstants; +import com.mh.user.mapper.SysMenuMapper; +import com.mh.user.mapper.SysRoleMapper; +import com.mh.user.mapper.SysRoleMenuMapper; +import com.mh.user.model.SysMenu; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysRoleMenu; +import com.mh.user.service.SysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + + +@Service +public class SysRoleServiceImpl implements SysRoleService { + + @Autowired + private SysRoleMapper sysRoleMapper; + @Autowired + private SysRoleMenuMapper sysRoleMenuMapper; + @Autowired + private SysMenuMapper sysMenuMapper; + + @Override + public int save(SysRole record) { + if(record.getId() == null || record.getId() == 0) { + return sysRoleMapper.insertSelective(record); + } + return sysRoleMapper.updateByPrimaryKeySelective(record); + } + + @Override + public int delete(SysRole record) { + return sysRoleMapper.deleteByPrimaryKey(record.getId()); + } + + @Override + public int delete(List records) { + for(SysRole record:records) { + delete(record); + } + return 1; + } + + @Override + public SysRole findById(Long id) { + return sysRoleMapper.selectByPrimaryKey(id); + } + + @Override + public PageResult findPage(PageRequest pageRequest) { + ColumnFilter columnFilter = pageRequest.getColumnFilter("name"); + if(columnFilter != null && columnFilter.getValue() != null) { + return MybatisPageHelper.findPage(pageRequest, sysRoleMapper, "findPageByName", columnFilter.getValue()); + } + return MybatisPageHelper.findPage(pageRequest, sysRoleMapper); + } + + @Override + public List findAll() { + return sysRoleMapper.findAll(); + } + + public SysRoleMapper getSysRoleMapper() { + return sysRoleMapper; + } + + public void setSysRoleMapper(SysRoleMapper sysRoleMapper) { + this.sysRoleMapper = sysRoleMapper; + } + + @Override + public List findRoleMenus(Long roleId) { + SysRole sysRole = sysRoleMapper.selectByPrimaryKey(roleId); + if(SysConstants.ADMIN.equalsIgnoreCase(sysRole.getName())) { + // 如果是超级管理员,返回全部 + return sysMenuMapper.findAll(""); + } + return sysMenuMapper.findRoleMenus(roleId); + } + + @Transactional + @Override + public int saveRoleMenus(List records) { + if(records == null || records.isEmpty()) { + return 1; + } + Long roleId = records.get(0).getRoleId(); + sysRoleMenuMapper.deleteByRoleId(roleId); + for(SysRoleMenu record:records) { + sysRoleMenuMapper.insertSelective(record); + } + return 1; + } + + @Override + public List findByName(String name) { + return sysRoleMapper.findByName(name); + } + + @Override + public SysRole findId(String name) { + return sysRoleMapper.findId(name); + } + + + @Override + public List queryRoles(String roleName, int page, int limit) { + return sysRoleMapper.queryRoles(roleName,page,limit); + } + + @Override + public int getCount(String roleName,int page, int limit) { + return sysRoleMapper.getCount(roleName,page,limit); + } + + @Override + public String findRoleID(String name) { + return sysRoleMapper.findRoleID(name); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SysUserServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..b5ed7cf --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SysUserServiceImpl.java @@ -0,0 +1,202 @@ +package com.mh.user.service.impl; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import com.mh.common.page.ColumnFilter; +import com.mh.common.page.MybatisPageHelper; +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.entity.DBEntity; +import com.mh.user.mapper.SysRoleMapper; +import com.mh.user.mapper.SysUserMapper; +import com.mh.user.mapper.SysUserRoleMapper; +import com.mh.user.model.SysMenu; +import com.mh.user.model.SysRole; +import com.mh.user.model.SysUser; +import com.mh.user.model.SysUserRole; +import com.mh.user.service.SysMenuService; +import com.mh.user.service.SysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service +public class SysUserServiceImpl implements SysUserService { + + /** + * 获取用户对应的数据库信息 + * @param username + * @return + */ + @Override + public DBEntity queryDBInfo(String username) { + return sysUserMapper.queryDBInfo(username); + } + + @Autowired(required = false) + private SysUserMapper sysUserMapper; + + @Autowired + private SysMenuService sysMenuService; + + @Autowired(required = false) + private SysUserRoleMapper sysUserRoleMapper; + + @Autowired(required = false) + private SysRoleMapper sysRoleMapper; + + @Transactional + @Override + public int save(SysUser record) { + Long id = null; + if(record.getId() == null || record.getId() == 0) { + // 新增用户 + sysUserMapper.insertSelective(record); + SysUser sysUser=sysUserMapper.findByName(record.getUserName()); + id = sysUser.getId(); + } else { + // 更新用户信息 + sysUserMapper.updateByPrimaryKeySelective(record); + } + + // 更新用户角色 + if(id != null && id == 0) { + return 1; + } + if(id != null) { +// for(SysUserRole sysUserRole:record.getUserRoles()) { +// sysUserRole.setUserId(id); +// } + + } else { + sysUserRoleMapper.deleteByUserId(record.getId()); + id=record.getId(); + } +// for(SysUserRole sysUserRole:record.getUserRoles()) { +// sysUserRoleMapper.insertSelective(sysUserRole); +// } + SysRole sysRole=sysRoleMapper.findId(record.getRoleNames()); //获取角色编号 + SysUserRole sysUserRole=new SysUserRole(); + sysUserRole.setUserId(id); + sysUserRole.setRoleId(sysRole.getId()); + + sysUserRoleMapper.insertSelective(sysUserRole); + return 1; + } + + @Override + public int delete(SysUser record) { + return sysUserMapper.deleteByPrimaryKey(record.getId()); + } + + @Override + public int delete(List records) { + for(SysUser record:records) { + delete(record); + } + return 1; + } + + @Override + public SysUser findById(Long id) { + return sysUserMapper.selectByPrimaryKey(id); + } + + @Override + public SysUser findByName(String name) { + return sysUserMapper.findByName(name); + } + + @Override + public PageResult findPage(PageRequest pageRequest) { + PageResult pageResult = null; + String name = getColumnFilterValue(pageRequest, "name"); + String email = getColumnFilterValue(pageRequest, "email"); + if(name != null) { + if(email != null) { + pageResult = MybatisPageHelper.findPage(pageRequest, sysUserMapper, "findPageByNameAndEmail", name, email); + } else { + pageResult = MybatisPageHelper.findPage(pageRequest, sysUserMapper, "findPageByName", name); + } + } else { + pageResult = MybatisPageHelper.findPage(pageRequest, sysUserMapper); + } + // 加载用户角色信息 + findUserRoles(pageResult); + return pageResult; + } + + /** + * 获取过滤字段的值 + * @param filterName + * @return + */ + public String getColumnFilterValue(PageRequest pageRequest, String filterName) { + String value = null; + ColumnFilter columnFilter = pageRequest.getColumnFilter(filterName); + if(columnFilter != null) { + value = columnFilter.getValue(); + } + return value; + } + + /** + * 加载用户角色 + * @param pageResult + */ + private void findUserRoles(PageResult pageResult) { + List content = pageResult.getContent(); + for(Object object:content) { + SysUser sysUser = (SysUser) object; + List userRoles = findUserRoles(sysUser.getId()); + sysUser.setUserRoles(userRoles); + sysUser.setRoleNames(getRoleNames(userRoles)); + } + } + + private String getRoleNames(List userRoles) { + StringBuilder sb = new StringBuilder(); + for(Iterator iter = userRoles.iterator(); iter.hasNext();) { + SysUserRole userRole = iter.next(); + SysRole sysRole = sysRoleMapper.selectByPrimaryKey(userRole.getRoleId()); + if(sysRole == null) { + continue ; + } + sb.append(sysRole.getRemark()); + if(iter.hasNext()) { + sb.append(", "); + } + } + return sb.toString(); + } + + @Override + public Set findPermissions(String systemID,String userName) { + Set perms = new HashSet<>(); + List sysMenus = sysMenuService.findByUser("",userName); + for(SysMenu sysMenu:sysMenus) { + if(sysMenu.getPath() != null && !"".equals(sysMenu.getPath())) { + perms.add(sysMenu.getPath()); + } + } + return perms; + } + + @Override + public List findUserRoles(Long userId) { + return sysUserRoleMapper.findUserRoles(userId); + } + + @Override + public List queryUsers(String userName, int page, int limit) { + return sysUserMapper.queryUsers(userName,page,limit); + } + + @Override + public int getCount(String userName, int page, int limit) { + return sysUserMapper.getCount(userName,page,limit); + } +} diff --git a/user-service/src/main/java/com/mh/user/service/impl/SystemInfoServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SystemInfoServiceImpl.java new file mode 100644 index 0000000..1967368 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/service/impl/SystemInfoServiceImpl.java @@ -0,0 +1,20 @@ +package com.mh.user.service.impl; + +import com.mh.user.entity.SystemInfoEntity; +import com.mh.user.mapper.SystemInfoMapper; +import com.mh.user.service.SystemInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class SystemInfoServiceImpl implements SystemInfoService { + + @Autowired + SystemInfoMapper systemInfoMapper; + @Override + public List querySystem(String roleID) { + return systemInfoMapper.querySystem(roleID); + } +} diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysDeptMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysDeptMapper.xml new file mode 100644 index 0000000..e9ca351 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysDeptMapper.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + id, parent_id, dept_name, order_num, create_by, create_time, last_update_by, last_update_time, + del_flag + + + + delete from sys_dept + where id = #{id,jdbcType=BIGINT} or parent_id = #{id,jdbcType=BIGINT} + + + insert into sys_dept (id, parent_id, dept_name, + order_num, create_by, create_time, + last_update_by, last_update_time, del_flag + ) + values (#{id,jdbcType=BIGINT}, #{parentId,jdbcType=BIGINT}, #{deptName,jdbcType=VARCHAR}, + #{orderNum,jdbcType=INTEGER}, #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, + #{lastUpdateBy,jdbcType=BIGINT}, #{lastUpdateTime,jdbcType=TIMESTAMP}, #{delFlag,jdbcType=TINYINT} + ) + + + insert into sys_dept + + + id, + + + parent_id, + + + dept_name, + + + order_num, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + del_flag, + + + + + #{id,jdbcType=BIGINT}, + + + #{parentId,jdbcType=BIGINT}, + + + #{deptName,jdbcType=VARCHAR}, + + + #{orderNum,jdbcType=INTEGER}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + #{delFlag,jdbcType=TINYINT}, + + + + + update sys_dept + + + parent_id = #{parentId,jdbcType=BIGINT}, + + + dept_name = #{deptName,jdbcType=VARCHAR}, + + + order_num = #{orderNum,jdbcType=INTEGER}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + del_flag = #{delFlag,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_dept + set parent_id = #{parentId,jdbcType=BIGINT}, + dept_name = #{deptName,jdbcType=VARCHAR}, + order_num = #{orderNum,jdbcType=INTEGER}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + del_flag = #{delFlag,jdbcType=TINYINT} + where id = #{id,jdbcType=BIGINT} + + + + diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysDictMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysDictMapper.xml new file mode 100644 index 0000000..c29d58c --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysDictMapper.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + id, value, label, type, description, sort, create_by, create_time, last_update_by, + last_update_time, remarks, del_flag + + + + delete from sys_dict + where id = #{id,jdbcType=BIGINT} + + + insert into sys_dict (id, value, label, + type, description, sort, + create_by, create_time, last_update_by, + last_update_time, remarks, del_flag + ) + values (#{id,jdbcType=BIGINT}, #{value,jdbcType=VARCHAR}, #{label,jdbcType=VARCHAR}, + #{type,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{sort,jdbcType=DECIMAL}, + #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{lastUpdateBy,jdbcType=BIGINT}, + #{lastUpdateTime,jdbcType=TIMESTAMP}, #{remarks,jdbcType=VARCHAR}, #{delFlag,jdbcType=TINYINT} + ) + + + insert into sys_dict + + + id, + + + value, + + + label, + + + type, + + + description, + + + sort, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + remarks, + + + del_flag, + + + + + #{id,jdbcType=BIGINT}, + + + #{value,jdbcType=VARCHAR}, + + + #{label,jdbcType=VARCHAR}, + + + #{type,jdbcType=VARCHAR}, + + + #{description,jdbcType=VARCHAR}, + + + #{sort,jdbcType=DECIMAL}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + #{remarks,jdbcType=VARCHAR}, + + + #{delFlag,jdbcType=TINYINT}, + + + + + update sys_dict + + + value = #{value,jdbcType=VARCHAR}, + + + label = #{label,jdbcType=VARCHAR}, + + + type = #{type,jdbcType=VARCHAR}, + + + description = #{description,jdbcType=VARCHAR}, + + + sort = #{sort,jdbcType=DECIMAL}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + remarks = #{remarks,jdbcType=VARCHAR}, + + + del_flag = #{delFlag,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_dict + set value = #{value,jdbcType=VARCHAR}, + label = #{label,jdbcType=VARCHAR}, + type = #{type,jdbcType=VARCHAR}, + description = #{description,jdbcType=VARCHAR}, + sort = #{sort,jdbcType=DECIMAL}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + remarks = #{remarks,jdbcType=VARCHAR}, + del_flag = #{delFlag,jdbcType=TINYINT} + where id = #{id,jdbcType=BIGINT} + + + + + \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysLogMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysLogMapper.xml new file mode 100644 index 0000000..ce4a821 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysLogMapper.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + id, user_name, operation, method, params, time, ip, create_by, create_time, last_update_by, + last_update_time,login_time,login_state,opt_desc + + + + delete from sys_log + where id = #{id,jdbcType=BIGINT} + + + insert into sys_log (id, user_name, operation, + method, params, time, + ip, create_by, create_time, + last_update_by, last_update_time,login_time,login_state,opt_desc) + values (#{id,jdbcType=BIGINT}, #{userName,jdbcType=VARCHAR}, #{operation,jdbcType=VARCHAR}, + #{method,jdbcType=VARCHAR}, #{params,jdbcType=VARCHAR}, #{time,jdbcType=BIGINT}, + #{ip,jdbcType=VARCHAR}, #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, + #{lastUpdateBy,jdbcType=BIGINT}, #{lastUpdateTime,jdbcType=TIMESTAMP}, + #{loginTime,jdbcType=TIMESTAMP},#{loginState,jdbcType=VARCHAR},#{optDesc,jdbcType=VARCHAR}) + + + insert into sys_log + + + id, + + + user_name, + + + operation, + + + method, + + + params, + + + time, + + + ip, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + login_time, + + + login_state, + + + opt_desc, + + + + + #{id,jdbcType=BIGINT}, + + + #{userName,jdbcType=VARCHAR}, + + + #{operation,jdbcType=VARCHAR}, + + + #{method,jdbcType=VARCHAR}, + + + #{params,jdbcType=VARCHAR}, + + + #{time,jdbcType=BIGINT}, + + + #{ip,jdbcType=VARCHAR}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + #{loginTime,jdbcType=TIMESTAMP}, + + + #{loginState,jdbcType=VARCHAR}, + + + #{optDesc,jdbcType=VARCHAR}, + + + + + update sys_log + + + user_name = #{userName,jdbcType=VARCHAR}, + + + operation = #{operation,jdbcType=VARCHAR}, + + + method = #{method,jdbcType=VARCHAR}, + + + params = #{params,jdbcType=VARCHAR}, + + + time = #{time,jdbcType=BIGINT}, + + + ip = #{ip,jdbcType=VARCHAR}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + login_time = #{loginTime,jdbcType=TIMESTAMP}, + + + login_state = #{loginState,jdbcType=VARCHAR}, + + + opt_desc = #{optDesc,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_log + set user_name = #{userName,jdbcType=VARCHAR}, + operation = #{operation,jdbcType=VARCHAR}, + method = #{method,jdbcType=VARCHAR}, + params = #{params,jdbcType=VARCHAR}, + time = #{time,jdbcType=BIGINT}, + ip = #{ip,jdbcType=VARCHAR}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + login_time = #{loginTime,jdbcType=TIMESTAMP}, + login_state = #{loginState,jdbcType=VARCHAR}, + opt_desc = #{optDesc,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + + + + diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysMenuMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysMenuMapper.xml new file mode 100644 index 0000000..eef01c4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysMenuMapper.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + id, parent_id, title,menu_name, component, path, menu_type, icon, order_num, create_by, create_time, + last_update_by, last_update_time,system_id + + + + delete from sys_menu + where id = #{id,jdbcType=BIGINT} + + + insert into sys_menu (id, parent_id, title,menu_name, + component, path, menu_type, icon, + order_num, create_by, create_time, + last_update_by, last_update_time + ) + values (#{id,jdbcType=BIGINT}, #{parentId,jdbcType=BIGINT}, #{title,jdbcType=VARCHAR},#{menuName,jdbcType=VARCHAR}, + #{component,jdbcType=VARCHAR}, #{path,jdbcType=VARCHAR}, #{menuType,jdbcType=INTEGER}, #{icon,jdbcType=VARCHAR}, + #{orderNum,jdbcType=INTEGER}, #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, + #{lastUpdateBy,jdbcType=BIGINT}, #{lastUpdateTime,jdbcType=TIMESTAMP}} + ) + + + insert into sys_menu + + + id, + + + parent_id, + + + title, + + + menu_name, + + + component, + + + path, + + + menu_type, + + + icon, + + + order_num, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + + + #{id,jdbcType=BIGINT}, + + + #{parentId,jdbcType=BIGINT}, + + + #{title,jdbcType=VARCHAR}, + + + #{menuName,jdbcType=VARCHAR}, + + + #{component,jdbcType=VARCHAR}, + + + #{path,jdbcType=VARCHAR}, + + + #{menuType,jdbcType=INTEGER}, + + + #{icon,jdbcType=VARCHAR}, + + + #{orderNum,jdbcType=INTEGER}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + + + update sys_menu + + + parent_id = #{parentId,jdbcType=BIGINT}, + + + title = #{title,jdbcType=VARCHAR}, + + + menu_name = #{menuName,jdbcType=VARCHAR}, + + + component = #{component,jdbcType=VARCHAR}, + + + path = #{path,jdbcType=VARCHAR}, + + + menu_type = #{menuType,jdbcType=INTEGER}, + + + icon = #{icon,jdbcType=VARCHAR}, + + + order_num = #{orderNum,jdbcType=INTEGER}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_menu + set parent_id = #{parentId,jdbcType=BIGINT}, + title = #{title,jdbcType=VARCHAR}, + menu_name = #{menuName,jdbcType=VARCHAR}, + component = #{component,jdbcType=VARCHAR}, + path = #{path,jdbcType=VARCHAR}, + menu_type = #{menuType,jdbcType=INTEGER}, + icon = #{icon,jdbcType=VARCHAR}, + order_num = #{orderNum,jdbcType=INTEGER}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + + + + + + diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleDeptMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleDeptMapper.xml new file mode 100644 index 0000000..4238270 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleDeptMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + id, role_id, dept_id, create_by, create_time, last_update_by, last_update_time + + + + delete from sys_role_dept + where id = #{id,jdbcType=BIGINT} + + + insert into sys_role_dept (id, role_id, dept_id, + create_by, create_time, last_update_by, + last_update_time) + values (#{id,jdbcType=BIGINT}, #{roleId,jdbcType=BIGINT}, #{deptId,jdbcType=BIGINT}, + #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{lastUpdateBy,jdbcType=BIGINT}, + #{lastUpdateTime,jdbcType=TIMESTAMP}) + + + insert into sys_role_dept + + + id, + + + role_id, + + + dept_id, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + + + #{id,jdbcType=BIGINT}, + + + #{roleId,jdbcType=BIGINT}, + + + #{deptId,jdbcType=BIGINT}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + + + update sys_role_dept + + + role_id = #{roleId,jdbcType=BIGINT}, + + + dept_id = #{deptId,jdbcType=BIGINT}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_role_dept + set role_id = #{roleId,jdbcType=BIGINT}, + dept_id = #{deptId,jdbcType=BIGINT}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMapper.xml new file mode 100644 index 0000000..7021a51 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMapper.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + id, role_name, remark, create_by, create_time, last_update_by, last_update_time, + del_flag + + + + delete from sys_role + where del_flag=0 and id = #{id,jdbcType=BIGINT} + + + insert into sys_role (id, role_name, remark, + create_by, create_time, last_update_by, + last_update_time, del_flag) + values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, + #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{lastUpdateBy,jdbcType=BIGINT}, + #{lastUpdateTime,jdbcType=TIMESTAMP}, #{delFlag,jdbcType=TINYINT}) + + + insert into sys_role + + + id, + + + role_name, + + + remark, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + del_flag, + + + + + #{id,jdbcType=BIGINT}, + + + #{name,jdbcType=VARCHAR}, + + + #{remark,jdbcType=VARCHAR}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + #{delFlag,jdbcType=TINYINT}, + + + + + update sys_role + + + role_name = #{name,jdbcType=VARCHAR}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + del_flag = #{delFlag,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_role + set role_name = #{name,jdbcType=VARCHAR}, + remark = #{remark,jdbcType=VARCHAR}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + del_flag = #{delFlag,jdbcType=TINYINT} + where id = #{id,jdbcType=BIGINT} + + + + + + + diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMenuMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMenuMapper.xml new file mode 100644 index 0000000..0eb3230 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysRoleMenuMapper.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + id, role_id, menu_id, create_by, create_time, last_update_by, last_update_time + + + + delete from sys_role_menu + where id = #{id,jdbcType=BIGINT} + + + insert into sys_role_menu (id, role_id, menu_id, + create_by, create_time, last_update_by, + last_update_time) + values (#{id,jdbcType=BIGINT}, #{roleId,jdbcType=BIGINT}, #{menuId,jdbcType=BIGINT}, + #{createBy,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{lastUpdateBy,jdbcType=BIGINT}, + #{lastUpdateTime,jdbcType=TIMESTAMP}) + + + insert into sys_role_menu + + + id, + + + role_id, + + + menu_id, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + + + #{id,jdbcType=BIGINT}, + + + #{roleId,jdbcType=BIGINT}, + + + #{menuId,jdbcType=BIGINT}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + + + update sys_role_menu + + + role_id = #{roleId,jdbcType=BIGINT}, + + + menu_id = #{menuId,jdbcType=BIGINT}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_role_menu + set role_id = #{roleId,jdbcType=BIGINT}, + menu_id = #{menuId,jdbcType=BIGINT}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=BIGINT} + + + + + delete from sys_role_menu + where role_id = #{roleId,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysUserMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysUserMapper.xml new file mode 100644 index 0000000..07f0356 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysUserMapper.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + id, user_name, password, salt, email, mobile, status, dept_id, create_by, create_time, + last_update_by, last_update_time, del_flag + + + + + delete from sys_user + where id = #{id,jdbcType=BIGINT} + + + + insert into sys_user (id, user_name, password, + salt, email, mobile, + status, dept_id, create_by, + create_time, last_update_by, last_update_time, + del_flag) + values (#{id,jdbcType=BIGINT}, #{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, + #{salt,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{mobile,jdbcType=VARCHAR}, + #{status,jdbcType=TINYINT}, #{deptId,jdbcType=BIGINT}, #{createBy,jdbcType=BIGINT}, + #{createTime,jdbcType=TIMESTAMP}, #{lastUpdateBy,jdbcType=BIGINT}, #{lastUpdateTime,jdbcType=TIMESTAMP}, + #{delFlag,jdbcType=TINYINT}) + + + + insert into sys_user + + + id, + + + user_name, + + + password, + + + salt, + + + email, + + + mobile, + + + status, + + + dept_id, + + + create_by, + + + create_time, + + + last_update_by, + + + last_update_time, + + + del_flag, + + + + + #{id,jdbcType=BIGINT}, + + + #{userName,jdbcType=VARCHAR}, + + + #{password,jdbcType=VARCHAR}, + + + #{salt,jdbcType=VARCHAR}, + + + #{email,jdbcType=VARCHAR}, + + + #{mobile,jdbcType=VARCHAR}, + + + #{status,jdbcType=TINYINT}, + + + #{deptId,jdbcType=BIGINT}, + + + #{createBy,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{lastUpdateBy,jdbcType=BIGINT}, + + + #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + #{delFlag,jdbcType=TINYINT}, + + + + + + update sys_user + + + user_name = #{userName,jdbcType=VARCHAR}, + + + password = #{password,jdbcType=VARCHAR}, + + + salt = #{salt,jdbcType=VARCHAR}, + + + email = #{email,jdbcType=VARCHAR}, + + + mobile = #{mobile,jdbcType=VARCHAR}, + + + status = #{status,jdbcType=TINYINT}, + + + dept_id = #{deptId,jdbcType=BIGINT}, + + + create_by = #{createBy,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + + + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + + + del_flag = #{delFlag,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + + update sys_user + set user_name = #{userName,jdbcType=VARCHAR}, + password = #{password,jdbcType=VARCHAR}, + salt = #{salt,jdbcType=VARCHAR}, + email = #{email,jdbcType=VARCHAR}, + mobile = #{mobile,jdbcType=VARCHAR}, + status = #{status,jdbcType=TINYINT}, + dept_id = #{deptId,jdbcType=BIGINT}, + create_by = #{createBy,jdbcType=BIGINT}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + last_update_by = #{lastUpdateBy,jdbcType=BIGINT}, + last_update_time = #{lastUpdateTime,jdbcType=TIMESTAMP}, + del_flag = #{delFlag,jdbcType=TINYINT} + where id = #{id,jdbcType=BIGINT} + + + + + + + + + + + diff --git a/user-service/src/main/java/com/mh/user/sqlmapper/SysUserRoleMapper.xml b/user-service/src/main/java/com/mh/user/sqlmapper/SysUserRoleMapper.xml new file mode 100644 index 0000000..7a9a5ab --- /dev/null +++ b/user-service/src/main/java/com/mh/user/sqlmapper/SysUserRoleMapper.xml @@ -0,0 +1,81 @@ + + + + + + + + + + id, user_id, role_id + + + + delete from sys_user_role + where id = #{id,jdbcType=BIGINT} + + + insert into sys_user_role (user_id, role_id + ) + values (#{userId,jdbcType=BIGINT}, #{roleId,jdbcType=BIGINT} + ) + + + insert into sys_user_role + + + id, + + + user_id, + + + role_id, + + + + + #{id,jdbcType=BIGINT}, + + + #{userId,jdbcType=BIGINT}, + + + #{roleId,jdbcType=BIGINT}, + + + + + update sys_user_role + + + user_id = #{userId,jdbcType=BIGINT}, + + + role_id = #{roleId,jdbcType=BIGINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update sys_user_role + set user_id = #{userId,jdbcType=BIGINT}, + role_id = #{roleId,jdbcType=BIGINT} + where id = #{id,jdbcType=BIGINT} + + + + delete from sys_user_role + where user_id = #{userId,jdbcType=BIGINT} + + diff --git a/user-service/src/main/java/com/mh/user/utils/AESUtil.java b/user-service/src/main/java/com/mh/user/utils/AESUtil.java new file mode 100644 index 0000000..2705a2a --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/AESUtil.java @@ -0,0 +1,60 @@ +package com.mh.user.utils; + +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +/** + * @author chison + * @date 2020-09-17 12:39 + * @Description AES加密解密帮助类 + */ +public class AESUtil { + + //--------------AES--------------- + private static final String KEY = "f4k9f5w7f8g4er26"; // 密匙,必须16位 + private static final String OFFSET = "5e8y6w45ju8w9jq8"; // 偏移量 + private static final String ENCODING = "UTF-8"; // 编码 + private static final String ALGORITHM = "AES"; //算法 + private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; // 默认的加密算法,CBC模式 + + public static void main(String[] args) throws Exception { + String s = AESencrypt("test"); + System.out.println(s); + } + + /** + * AES加密 + * @param data + * @return String + * @author anson + * @date 2019-8-24 18:43:07 + */ + public static String AESencrypt(String data) throws Exception { + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes("ASCII"), ALGORITHM); + IvParameterSpec iv = new IvParameterSpec(OFFSET.getBytes());//CBC模式偏移量IV + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); + byte[] encrypted = cipher.doFinal(data.getBytes(ENCODING)); + return new Base64().encodeToString(encrypted);//加密后再使用BASE64做转码 + } + + /** + * AES解密 + * @param data + * @return String + * @author anson + * @date 2019-8-24 18:46:07 + */ + public static String AESdecrypt(String data) throws Exception { + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes("ASCII"), ALGORITHM); + IvParameterSpec iv = new IvParameterSpec(OFFSET.getBytes()); //CBC模式偏移量IV + cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); + byte[] buffer = new Base64().decode(data);//先用base64解码 + byte[] encrypted = cipher.doFinal(buffer); + return new String(encrypted, ENCODING); + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java b/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java new file mode 100644 index 0000000..1edf57e --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java @@ -0,0 +1,764 @@ +package com.mh.user.utils; + +import com.alibaba.fastjson.JSON; +import com.mh.user.UserServiceApplication; +import com.mh.user.config.RabbitmqConfig; +import com.mh.user.constants.Constant; +import com.mh.user.entity.*; +import com.mh.user.model.QueueParam; +import com.mh.user.service.DataResultService; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.ProjectInfoService; +import com.mh.user.service.chillers.ChillersService; +import com.mh.user.service.chillers.DataHistoryService; +import com.mh.user.service.chillers.OrderMessageService; +import com.mh.user.service.impl.DataResultServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.log4j.Logger; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.boot.SpringApplication; +import org.springframework.context.ApplicationContext; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * @author ljf + * @title : + * @description : 解析485接收的数据 + * @updateTime 2020-04-23 + * @throws : + */ +//@Slf4j +public class AnalysisReceiveOrder485 { + + private static final Logger log = Logger.getLogger(AnalysisReceiveOrder485.class); + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + ChillersService chillersService = context.getBean(ChillersService.class); + OrderMessageService orderMessageService = context.getBean(OrderMessageService.class); + ThreadPoolExecutor threadPoolService = ThreadPoolService.getInstance(); + DataResultService dataResultService=context.getBean(DataResultService.class); + DeviceCodeParamService deviceCodeParamService=context.getBean(DeviceCodeParamService.class); + RabbitTemplate rabbitTemplate=context.getBean(RabbitTemplate.class); + ProjectInfoService projectInfoService=context.getBean(ProjectInfoService.class); + + //解析冷量表 + public void analysisCloudOrder485(final String dataStr1,final DeviceCodeParamEntity deviceCodeParam) { + threadPoolService.execute(() -> { + // 去掉空格 + String dataStr = dataStr1.replace(" ", "").toUpperCase(); + // 检验报文 + String checkStr = dataStr.substring(0, dataStr.length() - 4); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + + if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { +// log.info("cloud message check success ===>" + dataStr); + //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 + Date date = new Date(); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateStr=""; + //保留两位小数处理 + DecimalFormat decimalFormat = new DecimalFormat("0.00"); + // 表号 + String cloudId = ExchangeStringUtil.hexToDec(dataStr.substring(0, 2)); + // 读数 + String data=""; + data = dataStr.substring(dataStr.length() - 8, dataStr.length() - 6) + + dataStr.substring(dataStr.length() - 6, dataStr.length() - 4) + + dataStr.substring(dataStr.length() - 12, dataStr.length() - 10) + + dataStr.substring(dataStr.length() - 10, dataStr.length() - 8); + + DataResultChEntity dataResultCh=new DataResultChEntity(); + DataResultClEntity dataResultCl=new DataResultClEntity(); + String registerAddr=deviceCodeParam.getRegisterAddr(); + try { + if(registerAddr.equals("32") || registerAddr.equals("33") || registerAddr.equals("35")){ + dataResultCh.setDeviceAddr(cloudId); + dataResultCh.setDeviceType(deviceCodeParam.getDeviceType()); + if (ExchangeStringUtil.isInDate(date,"00:00:00","00:00:30")==true) { + dateStr= sdf1.format(date); + dateStr=dateStr.substring(0,17)+"00"; + + dataResultCh.setCurDate(sdf1.parse(dateStr)); +// dataResultCh.setCurDate(dateStr); + System.out.println("插入时间00"+dateStr); +// }else if (ExchangeStringUtil.isInDate(date,"00:00:20","00:00:40")==true) { +// dateStr= sdf1.format(date); +// dateStr=dateStr.substring(0,17)+"20"; +// dataResultCh.setCurDate(sdf1.parse(dateStr)); +//// dataResultCh.setCurDate(dateStr); +// System.out.println("插入时间20"+dateStr); + }else if (ExchangeStringUtil.isInDate(date,"00:00:30","00:00:59")==true) { + dateStr= sdf1.format(date); + dateStr=dateStr.substring(0,17)+"30"; + dataResultCh.setCurDate(sdf1.parse(dateStr)); +// dataResultCh.setCurDate(dateStr); + System.out.println("插入时间30"+dateStr); + } + + data = decimalFormat.format(ExchangeStringUtil.hexToSingle(data));//十六进制字符串转IEEE754浮点型 + dataResultCh.setCurValue(data); + dataResultCh.setRegisterAddr(deviceCodeParam.getRegisterAddr()); + dataResultCh.setRegisterName(deviceCodeParam.getRegisterName()); + dataResultCh.setGrade(deviceCodeParam.getGrade()); + dataResultCh.setProjectID(deviceCodeParam.getProjectID()); + String projectName=projectInfoService.selectName(deviceCodeParam.getProjectID()); + log.info("冷量计==>"+cloudId+",读数==>"+dataResultCh.getCurValue()+",项目名称==>"+projectName); + dataResultService.saveDataResultCh(dataResultCh); + log.info("冷量计保存数据库成功!项目名称:"+projectName); + }else if (registerAddr.equals("31") || registerAddr.equals("34")){ + dataResultCl.setDeviceAddr(cloudId); + dataResultCl.setDeviceType(deviceCodeParam.getDeviceType()); + dateStr= sdf1.format(date); + dataResultCh.setCurDate(sdf1.parse(dateStr)); +// dataResultCh.setCurDate(dateStr); + Long lData=Long.valueOf(ExchangeStringUtil.hexToDec(data)); + dataResultCl.setCurValue(lData);//字符串转整型 + dataResultCl.setRegisterAddr(deviceCodeParam.getRegisterAddr()); + dataResultCl.setRegisterName(deviceCodeParam.getRegisterName()); + dataResultCl.setGrade(deviceCodeParam.getGrade()); + dataResultCl.setProjectID(deviceCodeParam.getProjectID()); + String projectName=projectInfoService.selectName(deviceCodeParam.getProjectID()); + log.info("冷量计==>" + cloudId+",读数==>" + lData+",项目名称==>"+projectName); + if (lData<99999999){ + if (lData!=2231365){ + dataResultService.saveDataResultCl(dataResultCl); + } + } + log.info("冷量计保存数据成功!项目名称:"+projectName); + dataResultService.saveDataResultCl_bak(dataResultCl); + } + } catch (Exception e) { + e.printStackTrace(); + log.error(e); + } + }else{ + log.info("冷量计校验失败===>" + dataStr); + } + }); + } + + public String analysisCloudQueue(QueueParam queueParam) { + String rec="fail"; + String dataStr1=queueParam.getRecData(); //采集返回数据 + // 去掉空格 + String dataStr = dataStr1.replace(" ", "").toUpperCase(); + // 检验报文 + String checkStr = dataStr.substring(0, dataStr.length() - 4); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + + if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { + log.info("cloud message check success ===>" + dataStr); + Date date = new Date(); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateStr=""; + //保留两位小数处理 + DecimalFormat decimalFormat = new DecimalFormat("0.00"); + // 表号 + String cloudId = ExchangeStringUtil.hexToDec(dataStr.substring(0, 2)); + String projectID=queueParam.getProjectID(); + String registerAddr=queueParam.getRegisterAddr(); + String deviceType=queueParam.getDeviceType(); + DeviceCodeParamEntity deviceCodeParam=deviceCodeParamService.queryDeviceCodeParam(projectID,deviceType,cloudId,registerAddr); + // 读数 + String data=""; + data = dataStr.substring(dataStr.length() - 8, dataStr.length() - 6) + + dataStr.substring(dataStr.length() - 6, dataStr.length() - 4) + + dataStr.substring(dataStr.length() - 12, dataStr.length() - 10) + + dataStr.substring(dataStr.length() - 10, dataStr.length() - 8); + + DataResultChEntity dataResultCh=new DataResultChEntity(); + DataResultClEntity dataResultCl=new DataResultClEntity(); + try { + if(registerAddr.equals("32") || registerAddr.equals("33") || registerAddr.equals("35")){ + dataResultCh.setDeviceAddr(cloudId); + dataResultCh.setDeviceType(deviceCodeParam.getDeviceType()); + if (ExchangeStringUtil.isInDate(date,"00:00:00","00:00:30")==true) { + dateStr= sdf1.format(date); + dateStr=dateStr.substring(0,17)+"00"; + dataResultCh.setCurDate(sdf1.parse(dateStr)); +// dataResultCh.setCurDate(dateStr); + System.out.println("插入时间00"+dateStr); +// }else if (ExchangeStringUtil.isInDate(date,"00:00:20","00:00:40")==true) { +// dateStr= sdf1.format(date); +// dateStr=dateStr.substring(0,17)+"20"; +// dataResultCh.setCurDate(sdf1.parse(dateStr)); +//// dataResultCh.setCurDate(dateStr); +// System.out.println("插入时间20"+dateStr); + }else if (ExchangeStringUtil.isInDate(date,"00:00:30","00:00:59")==true) { + dateStr= sdf1.format(date); + dateStr=dateStr.substring(0,17)+"30"; + dataResultCh.setCurDate(sdf1.parse(dateStr)); +// dataResultCh.setCurDate(dateStr); + System.out.println("插入时间30"+dateStr); + } + + data = decimalFormat.format(ExchangeStringUtil.hexToSingle(data));//十六进制字符串转IEEE754浮点型 + dataResultCh.setCurValue(data); + dataResultCh.setRegisterAddr(deviceCodeParam.getRegisterAddr()); + dataResultCh.setRegisterName(deviceCodeParam.getRegisterName()); + dataResultCh.setGrade(deviceCodeParam.getGrade()); + dataResultCh.setProjectID(deviceCodeParam.getProjectID()); + String projectName=projectInfoService.selectName(deviceCodeParam.getProjectID()); + log.info("cloudID==>" + cloudId+",curValue==>"+dataResultCh.getCurValue()+",projectName==>"+projectName); + dataResultService.saveDataResultCh(dataResultCh); + log.info("cloud save data success!projectName:"+projectName); + }else if (registerAddr.equals("31") || registerAddr.equals("34")){ + dataResultCl.setDeviceAddr(cloudId); + dataResultCl.setDeviceType(deviceCodeParam.getDeviceType()); + dateStr= sdf1.format(date); + dataResultCl.setCurDate(sdf1.parse(dateStr)); + Long lData=Long.valueOf(ExchangeStringUtil.hexToDec(data)); + dataResultCl.setCurValue(lData);//字符串转整型 + dataResultCl.setRegisterAddr(deviceCodeParam.getRegisterAddr()); + dataResultCl.setRegisterName(deviceCodeParam.getRegisterName()); + dataResultCl.setGrade(deviceCodeParam.getGrade()); + dataResultCl.setProjectID(deviceCodeParam.getProjectID()); + String projectName=projectInfoService.selectName(deviceCodeParam.getProjectID()); + log.info("cloudID==>" + cloudId+",curValue34==>"+lData+",projectName==>"+projectName); + if (lData<99999999){ + if (lData!=2231365){ + dataResultService.saveDataResultCl(dataResultCl); + } + } + log.info("cloud save data success!projectName:"+projectName); + dataResultService.saveDataResultCl_bak(dataResultCl); + } + rec="success"; + } catch (Exception e) { + e.printStackTrace(); + log.error(e); + } + } + return rec; + } + /** + * 解析电表返回的数据 + * @param dataStr + */ + public void analysisMeterOrder485(final String dataStr,final DeviceCodeParamEntity deviceCodeParam) { + threadPoolService.execute(() -> { + //时间,创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + + if (dataStr.length() == 36 || dataStr.length() == 40 || dataStr.length() == 44 || dataStr.length() == 50) { + //检验报文 + String checkStr = dataStr.substring(0, dataStr.length() - 4); //减去校验码 + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 + //返回的校验码与重新生成的校验码进行校验 + if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { + //表号,12位 + String meterId = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); + meterId = String.format("%012d", Long.parseLong(meterId)); + //读数 + String data = ""; + StringBuilder stringBuilder = new StringBuilder(); + if (dataStr.length() == 36){ + for (int i = 0; i < 4; i++) { + String data1 = checkStr.substring(32 - 2 * (i + 1), 32 - 2 * i); + stringBuilder.append(data1); + } + }else { + for (int i = 0; i < 4; i++) { + String data1 = checkStr.substring(36 - 2 * (i + 1), 36 - 2 * i); + stringBuilder.append(data1); + } + } + data = stringBuilder.toString(); + data = ExchangeStringUtil.cutThree(data); + // 0 代表前面补充0,4 代表长度为4,d 代表参数为正数型 + if (data.length()==6){ + data = String.format("%06d", Long.parseLong(data)); + data = data.substring(0, 2) + "." + data.substring(2, 6); + }else if (data.length()==8){ + data = String.format("%08d", Long.parseLong(data)); + data = data.substring(0, 6) + "." + data.substring(6, 8); + } + + try { + DataResultEntity dataResultEntity = new DataResultEntity(); + dataResultEntity.setDeviceAddr(meterId);//通讯编号 + dataResultEntity.setDeviceType("电表");//类型 + dataResultEntity.setProjectID(deviceCodeParam.getProjectID());//所属项目 + dataResultEntity.setCurValue(Double.parseDouble(data)); //当前读数 + dataResultEntity.setCurDate(sdf1.parse(dateStr)); //当前日期 + dataResultEntity.setGrade(deviceCodeParam.getGrade()); + dataResultService.saveDataResult(dataResultEntity); + String projectName=projectInfoService.selectName(deviceCodeParam.getProjectID()); + log.info("电表==>" + meterId+",读数==>" + data+",项目名称==>"+projectName); + log.info("电表保存数据成功!项目名称:"+projectName); + } catch (Exception e) { + e.printStackTrace(); + log.error(e); + } + }else { + log.info("电表校验失败===>"+ dataStr); + } + } + }); + } + + public String analysisMeterQueue(QueueParam queueParam) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// Date date = new Date(); +// String dateStr = sdf1.format(date); + String dateStr=queueParam.getCopyTime(); +// log.info("dateTime:" + dateStr); + String rec="fail"; + String dataStr=queueParam.getRecData(); + if (dataStr.length() == 32 || dataStr.length() == 36 || dataStr.length() == 40 || dataStr.length() == 44 || dataStr.length() == 50) { + //检验报文 + String checkStr = dataStr.substring(0, dataStr.length() - 4); //减去校验码 + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 + //返回的校验码与重新生成的校验码进行校验 + if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { + log.info("meter message check success ===>" + dataStr); + //表号,12位 + String meterId = checkStr.substring(12, 14) + checkStr.substring(10, 12) + checkStr.substring(8, 10) + + checkStr.substring(6, 8) + checkStr.substring(4, 6) + checkStr.substring(2, 4); + meterId = String.format("%012d", Long.parseLong(meterId)); + String projectID=queueParam.getProjectID(); + String registerAddr=queueParam.getRegisterAddr(); + String deviceType=queueParam.getDeviceType(); + DeviceCodeParamEntity deviceCodeParam=deviceCodeParamService.queryDeviceCodeParam(projectID,deviceType,meterId,registerAddr); + //读数 + String data = ""; + StringBuilder stringBuilder = new StringBuilder(); + if (dataStr.length() == 36){ + for (int i = 0; i < 4; i++) { + String data1 = checkStr.substring(32 - 2 * (i + 1), 32 - 2 * i); + stringBuilder.append(data1); + } + }else if (dataStr.length() == 34){ + for (int i = 0; i < 3; i++) { + String data1 = checkStr.substring(30 - 2 * (i + 1), 30 - 2 * i); + stringBuilder.append(data1); + } + }else { + for (int i = 0; i < 4; i++) { + String data1 = checkStr.substring(36 - 2 * (i + 1), 36 - 2 * i); + stringBuilder.append(data1); + } + } + data = stringBuilder.toString(); + data = ExchangeStringUtil.cutThree(data); + // 0 代表前面补充0,4 代表长度为4,d 代表参数为正数型 + if (data.length()==6){ + data = String.format("%06d", Long.parseLong(data)); + data = data.substring(0, 2) + "." + data.substring(2, 6); + }else if (data.length()==8){ + data = String.format("%08d", Long.parseLong(data)); + data = data.substring(0, 6) + "." + data.substring(6, 8); + } + + try { + DataResultEntity dataResultEntity = new DataResultEntity(); + dataResultEntity.setDeviceAddr(meterId);//通讯编号 + dataResultEntity.setDeviceType("电表");//类型 + dataResultEntity.setProjectID(deviceCodeParam.getProjectID());//所属项目 + dataResultEntity.setCurValue(Double.parseDouble(data)); //当前读数 + dataResultEntity.setCurDate(sdf1.parse(dateStr)); //当前日期 + dataResultEntity.setGrade(deviceCodeParam.getGrade()); + dataResultService.saveDataResult(dataResultEntity); + String projectName=projectInfoService.selectName(deviceCodeParam.getProjectID()); + log.info("meterID==>" + meterId+",meter curValue==>" + data+",projectName==>"+projectName); + log.info("meter save data success!projectName:"+projectName); + } catch (Exception e) { + e.printStackTrace(); + log.error(e); + } + rec="success"; + }else { + log.info("meter message check fail ===>"+ dataStr); + } + } + return rec; + } + + // 水表 + public void analysisWtMeterOrder485(final String dataStr,final String registerAddr,final String brand,String projectID) { + threadPoolService.execute(() -> { + //时间,创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + log.info("time==>" + dateStr); + + // 读数 + String data = ""; + String meterId=""; + if (dataStr.length() == 44 || dataStr.length() == 70) { + // 检验报文 + String checkStr = dataStr.substring(0, dataStr.length() - 4);//减去校验码 + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); //生成校验码 + if (checkNum.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4, dataStr.length() - 2))) { + log.info("wtMeter message check success ===>" + dataStr); + // 表号 + meterId =checkStr.substring(16, 18)+checkStr.substring(14, 16)+ checkStr.substring(12, 14) + checkStr.substring(10, 12) + + checkStr.substring(8, 10)+ checkStr.substring(6, 8) + checkStr.substring(4, 6); + meterId = String.format("%014d", Long.parseLong(meterId)); + log.info("meterID==>" + meterId); + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < 4; i++) { + //String data1 = checkStr.substring(checkStr.length() - 2 * (i + 1), checkStr.length() - 2 * i); + String data1 = checkStr.substring(36 - 2 * (i + 1), 36 - 2 * i); + stringBuilder.append(data1); + } + data = stringBuilder.toString(); + // 0 代表前面补充0,4 代表长度为4,d 代表参数为正数型 + data = String.format("%08d", Long.parseLong(data)); + data = data.substring(0, 6) + "." + data.substring(6, 8); + }else{ + log.info("wtMeter message check fail ===>" + dataStr); + } + } else if(dataStr.length() == 18){ //脉冲水表 + //检验报文 + String checkStr = dataStr.substring(0, dataStr.length() - 4); + + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + String sValue=null; + if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { + log.info("wtMeter message check success ===>" + dataStr); + meterId = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2)); + log.info("meterID==>" + meterId); + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) { + data=String.valueOf(Integer.parseInt(ExchangeStringUtil.hexToDec(checkStr.substring(6, 14)))/10); //读数 + } + }else { + log.info("wtMeter message check fail ===>" + dataStr); + } + } + + log.info("wtMeter curValue==>" + data); + try { + DataResultEntity dataResultEntity = new DataResultEntity(); +// if (meterId.length()>8){ +// dataResultEntity.setDeviceAddr(meterId.substring(meterId.length()-8,meterId.length()));//通讯编号 +// }else{ + dataResultEntity.setDeviceAddr(meterId);//通讯编号 +// } + dataResultEntity.setDeviceType("水表"); + dataResultEntity.setCurValue(Double.parseDouble(data)); //当前读数 + dataResultEntity.setCurDate(sdf1.parse(dateStr)); //当前日期 + dataResultEntity.setProjectID(projectID); + dataResultService.saveDataResult(dataResultEntity); + log.info("wtMeter save data success!projectID:"+projectID); + } catch (Exception e) { + e.printStackTrace(); + log.error(e); + } + }); + } + /** + * 解析冷水机组返回的数据 + */ + public void analysisChillerOrder485(final String dataStr,final DeviceCodeParamEntity deviceCodeParam) { + if (!Constant.CONTROL_WEB_FLAG) { + threadPoolService.execute(() -> { + String checkStr = dataStr.substring(0, dataStr.length() - 4); // 检验报文 + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + + if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + // 冷水机组的地址 + String chillerAddr = ExchangeStringUtil.hexToDec(dataStr.substring(0, 2)); + DataResultChEntity dataResultCh=new DataResultChEntity(); + String data = ""; + if (dataStr.substring(2, 4).equalsIgnoreCase("01")) { // 读取状态 + if (dataStr.length() == 12) { + // 状态 + data = ExchangeStringUtil.hexToDec(dataStr.substring(6, 8)); + try{ + // 赋值给dataResultCh + dataResultCh.setDeviceAddr(chillerAddr); + dataResultCh.setDeviceType(deviceCodeParam.getDeviceType()); + dataResultCh.setCurDate(sdf1.parse(dateStr)); +// dataResultCh.setCurDate(dateStr); + dataResultCh.setCurValue(data); + dataResultCh.setDeviceAddr(deviceCodeParam.getRegisterAddr()); + dataResultCh.setRegisterName(deviceCodeParam.getRegisterName()); + dataResultCh.setGrade(deviceCodeParam.getGrade()); + dataResultCh.setProjectID(deviceCodeParam.getProjectID()); + String projectName=projectInfoService.selectName(deviceCodeParam.getProjectID()); + log.info("冷水机:" + chillerAddr + ",状态:" + data+",项目名称:"+projectName); + dataResultService.saveDataResultChiller(dataResultCh); + dataResultService.deleteDataResultNow(deviceCodeParam.getDeviceAddr(),deviceCodeParam.getDeviceType(),deviceCodeParam.getRegisterAddr(),deviceCodeParam.getProjectID()); + log.info("冷水机保存成功!项目名称:"+projectName); + }catch (Exception e){ + e.printStackTrace(); + } + } + } else if (dataStr.substring(2, 4).equalsIgnoreCase("03") || dataStr.substring(2, 4).equalsIgnoreCase("04")) { + if (dataStr.length() == 14) { + if (deviceCodeParam.getDigit() == 1) { + // 数据 + data = Double.toString(Integer.parseInt(ExchangeStringUtil.hexToDec(dataStr.substring(6, 10))) * 0.1); + } else if (deviceCodeParam.getDigit() == 2) { + // 数据 + data = Double.toString(Integer.parseInt(ExchangeStringUtil.hexToDec(dataStr.substring(6, 10))) * 0.01); + } else { + // 数据 + data = ExchangeStringUtil.hexToDec(dataStr.substring(6, 10)); + } + try{ + // 赋值给dataResultCh + dataResultCh.setDeviceAddr(chillerAddr); + dataResultCh.setDeviceType(deviceCodeParam.getDeviceType()); + dataResultCh.setCurDate(sdf1.parse(dateStr)); +// dataResultCh.setCurDate(dateStr); + dataResultCh.setCurValue(data); + dataResultCh.setRegisterAddr(deviceCodeParam.getRegisterAddr()); + dataResultCh.setRegisterName(deviceCodeParam.getRegisterName()); + dataResultCh.setGrade(deviceCodeParam.getGrade()); + dataResultCh.setProjectID(deviceCodeParam.getProjectID()); + String projectName=projectInfoService.selectName(deviceCodeParam.getProjectID()); + log.info("冷水机:" + chillerAddr + ",读数:" + data+",项目名称:"+projectName); + dataResultService.saveDataResultChiller(dataResultCh); + dataResultService.deleteDataResultNow(deviceCodeParam.getDeviceAddr(),deviceCodeParam.getDeviceType(),deviceCodeParam.getRegisterAddr(),deviceCodeParam.getProjectID()); + log.info("冷水机保存成功!项目名称:"+projectName); + }catch (Exception e){ + e.printStackTrace(); + log.error(e); + } + } + } + }else{ + log.info("冷水机校验失败===>" + dataStr); + } + }); + } + } + + public void analysisChillersDDC(final String receiveData1) throws InterruptedException { + // 去掉空格 +// c0a8020a1f90ff04fb0000000100010200000300000400000500000600000700140800000901cb0a00000b00000c00000d00000e00000f0000100000110025120000130910cabc + String receiveData = receiveData1.replace(" ", ""); + receiveData = receiveData.toUpperCase(); + // 检验报文 + String checkStr = receiveData.substring(0, receiveData.length() - 4); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = ExchangeStringUtil.addZeroForNum(checkWord, 4); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); + + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + List chillersEntityList = new ArrayList<>(); + // IP地址 + String ip = receiveData.substring(0, 8); + // 16进制转IP地址 + ip = ExchangeStringUtil.hexToDec(ip.substring(0, 2)) + "." + + ExchangeStringUtil.hexToDec(ip.substring(2, 4)) + "." + + ExchangeStringUtil.hexToDec(ip.substring(4, 6)) + "." + + ExchangeStringUtil.hexToDec(ip.substring(6, 8)); + // 端口号 + String port = receiveData.substring(8, 12); + // 结束符 + String endStr = receiveData.substring(12, 14); + // DDC设备地址 + String ddcAddr = receiveData.substring(14, 16); + ddcAddr = ExchangeStringUtil.hexToDec(ddcAddr); +// log.info("DDC地址: " + ddcAddr); + // 通过DDC地址查询对应的采集参数设备 + List stringList = chillersService.queryDDCAddr(ddcAddr); + + // DDC地址反码 + String reversDDCAddr = receiveData.substring(16, 18); + // 开始解析各个寄存器地址读数 + String registerAddr = ""; + String readData = ""; + for (int i = 0; i < (receiveData.length() - 22) / 6; i++) { + // 寄存器地址+数据域(00 + 0000) + String readStr = receiveData.substring(18 + 6 * i, 18 + 6 * (i + 1)); + // 寄存器地址 + registerAddr = registerAddr + readStr.substring(0, 2); + // 数据 + readData = readData + readStr.substring(2, 6); + // 判断是否存在寄存器 + boolean flag = queryRegisterAddr(stringList, registerAddr); + //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + if (flag) { +// long register = Long.parseLong(registerAddr, 16); + long data = Long.parseLong(readData, 16); +// log.info("寄存器地址: " + registerAddr + ",数据: " + data); + // 新new一个实体类 + ChillersEntity chillersEntity = new ChillersEntity(); + chillersEntity.setDdcAddr(ddcAddr); + chillersEntity.setIP(ip); + chillersEntity.setLastValue(String.valueOf(data)); + chillersEntity.setLastTime(dateStr); + chillersEntity.setRegisterAddress(registerAddr); + chillersEntity.setGrade(0); + chillersEntityList.add(chillersEntity); + registerAddr = ""; + readData = ""; + } + } + + Thread.sleep(1000); + if (Constant.CONTROL_WEB_FLAG) { + // 1、读取历史流水表数据,判断最新存储的时间是否是超过5分钟 update by ljf on 2020-08-10 + String lastTime = chillersService.queryLastChillersHistory(chillersEntityList.get(chillersEntityList.size() - 1)); + try { + if ( lastTime == null || lastTime.equalsIgnoreCase("") ) { + // 2、超过5分钟则进行插入操作 批量插入历史流水表 + chillersService.batchInsertChillersHistory(chillersEntityList); + } else { + int subtract = TimeDifferenceUtil.dValue(lastTime); +// int subtract = dValue(lastTime); + if (subtract >= 30) { + // 2、超过5分钟则进行插入操作 批量插入历史流水表 + chillersService.batchInsertChillersHistory(chillersEntityList); + } + } + // 3、否则仅仅更新对应的实时记录表 + // 避免出现RPC 请求中提供了过多的参数。最多应为 2100报错,循环分批次插入update by ljf on 2019-08-23 + int resultInt = 0; + int batchCount = 5;// 每批commit的个数 + int batchLastIndex = batchCount;// 每批最后一个的下标 + try { + for (int index = 0; index < chillersEntityList.size(); ) { + Thread.sleep(500); + if (batchLastIndex >= chillersEntityList.size()) { + batchLastIndex = chillersEntityList.size(); + resultInt = resultInt * chillersService.batchUpdateRegisterAddr(chillersEntityList.subList(index, batchLastIndex)); + System.out.println("index:" + index + " batchLastIndex:" + batchLastIndex); + break;// 数据插入完毕,退出循环 + } else { + resultInt = resultInt * chillersService.batchUpdateRegisterAddr(chillersEntityList.subList(index, batchLastIndex)); + System.out.println("index:" + index + " batchLastIndex:" + batchLastIndex); + index = batchLastIndex;// 设置下一批下标 + batchLastIndex = index + (batchCount - 1); + } + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } catch (ParseException e) { + e.printStackTrace(); + } + } else { + threadPoolService.execute(() -> { + // 1、读取历史流水表数据,判断最新存储的时间是否是超过5分钟 update by ljf on 2020-08-10 + String lastTime = chillersService.queryLastChillersHistory(chillersEntityList.get(chillersEntityList.size() - 1)); + try { + if ( lastTime == null || lastTime.equalsIgnoreCase("") ) { + // 2、超过5分钟则进行插入操作 批量插入历史流水表 + chillersService.batchInsertChillersHistory(chillersEntityList); + } else { + int subtract = TimeDifferenceUtil.dValue(lastTime); +// int subtract = dValue(lastTime); + if (subtract >= 30) { + // 2、超过5分钟则进行插入操作 批量插入历史流水表 + chillersService.batchInsertChillersHistory(chillersEntityList); + } + } + // 3、否则仅仅更新对应的实时记录表 + // 避免出现RPC 请求中提供了过多的参数。最多应为 2100报错,循环分批次插入update by ljf on 2019-08-23 + int resultInt = 0; + int batchCount = 5;// 每批commit的个数 + int batchLastIndex = batchCount;// 每批最后一个的下标 + try { + for (int index = 0; index < chillersEntityList.size(); ) { + Thread.sleep(800); + if (batchLastIndex >= chillersEntityList.size()) { + batchLastIndex = chillersEntityList.size(); + resultInt = resultInt * chillersService.batchUpdateRegisterAddr(chillersEntityList.subList(index, batchLastIndex)); + System.out.println("index:" + index + " batchLastIndex:" + batchLastIndex); + break;// 数据插入完毕,退出循环 + } else { + resultInt = resultInt * chillersService.batchUpdateRegisterAddr(chillersEntityList.subList(index, batchLastIndex)); + System.out.println("index:" + index + " batchLastIndex:" + batchLastIndex); + index = batchLastIndex;// 设置下一批下标 + batchLastIndex = index + (batchCount - 1); + } + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } catch (ParseException e) { + e.printStackTrace(); + } + }); + } + } + } + + public static int dValue(String lastDate) throws ParseException { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date lastTime = format.parse(lastDate); + long min = lastTime.getTime(); + Calendar calendar = Calendar.getInstance(); + long min1 = calendar.getTimeInMillis(); + long subtract = min1 - min; +// System.out.println("相减值: " + subtract/(1000*60)); + return (int) subtract / (1000 * 60); + } + + public void analysisSendOrder(String receiveData, OrderMessageEntity orderMessageEntity) { + // 解析返回来的报文 + if (receiveData.startsWith("000000000006010600")) { + // 获取寄存器地址 + String registerAddr = receiveData.substring(18, 20); + // 更新对应的状态值 + String dataStr = receiveData.substring(20, 24); + dataStr = ExchangeStringUtil.hexToDec(dataStr); + try { + // 更新数据库对应的发送状态值 + orderMessageService.updateOrderMessage(orderMessageEntity); + // 以及设备管理表对应的值 + orderMessageService.updateChillersRegisterAddress(dataStr, orderMessageEntity.getRegisterAddr()); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 判断是否存在寄存器地址 + public Boolean queryRegisterAddr(List stringList, String registerAddr) { + boolean flag = false; + for (int i = 0; i < stringList.size(); i++) { + if (stringList.get(i).equalsIgnoreCase(registerAddr)) { + flag = true; + break; + } + } + return flag; + } + + public void sendQueue(QueueParam queueParam){ + + Map map=new HashMap(); + map.put("recData",queueParam.getRecData()); + map.put("deviceType",queueParam.getDeviceType()); + map.put("registerAddr",queueParam.getRegisterAddr()); + map.put("projectID",queueParam.getProjectID()); + map.put("copyTime",queueParam.getCopyTime()); + String jsonString = JSON.toJSONString(map); //map转json字符串 + rabbitTemplate.convertAndSend(RabbitmqConfig.EXCHANGE_NAME,RabbitmqConfig.ROUTINGKEY_NAME,jsonString); + log.info("发送"+queueParam.getDeviceType()+"数据到交换机"+RabbitmqConfig.EXCHANGE_NAME); + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/CRC16.java b/user-service/src/main/java/com/mh/user/utils/CRC16.java new file mode 100644 index 0000000..9949035 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/CRC16.java @@ -0,0 +1,253 @@ +package com.mh.user.utils; + +/** + * CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0x0000异或 + * CRC16_CCITT_FALSE:多项式x16+x12+x5+1(0x1021),初始值0xFFFF,低位在后,高位在前,结果与0x0000异或 + * CRC16_XMODEM:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在后,高位在前,结果与0x0000异或 + * CRC16_X25:多项式x16+x12+x5+1(0x1021),初始值0xffff,低位在前,高位在后,结果与0xFFFF异或 + * CRC16_MODBUS:多项式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,高位在后,结果与0x0000异或 + * CRC16_IBM:多项式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,结果与0x0000异或 + * CRC16_MAXIM:多项式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,结果与0xFFFF异或 + * CRC16_USB:多项式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,高位在后,结果与0xFFFF异或 + * CRC16_DNP:多项式x16+x13+x12+x11+x10+x8+x6+x5+x2+1(0x3D65),初始值0x0000,低位在前,高位在后,结果与0xFFFF异或 + *

+ * (1)、预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器; + * (2)、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器,高八位数据不变; + * (3)、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位; + * (4)、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或; + * (5)、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理; + * (6)、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理; + * (7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换; + * (8)、最后得到的CRC寄存器内容即为:CRC码。 + *

+ * 以上计算步骤中的多项式0xA001是0x8005按位颠倒后的结果。 + * 0x8408是0x1021按位颠倒后的结果。 + * 在线校验工具 + * http://www.ip33.com/crc.html + * https://blog.csdn.net/htmlxx/article/details/17369105 + *

+ * Author:Water + * Time:2018/11/19 0019 15:03 + */ +public class CRC16 { + + /** + * CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0x0000异或 + * 0x8408是0x1021按位颠倒后的结果。 + * + * @param buffer + * @return + */ + public static int CRC16_CCITT(byte[] buffer) { + int wCRCin = 0x0000; + int wCPoly = 0x8408; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= wCPoly; + } else { + wCRCin >>= 1; + } + } + } +// wCRCin=(wCRCin<<8)|(wCRCin>>8); +// wCRCin &= 0xffff; + return wCRCin ^= 0x0000; + + } + + /** + * CRC-CCITT (0xFFFF) + * CRC16_CCITT_FALSE:多项式x16+x12+x5+1(0x1021),初始值0xFFFF,低位在后,高位在前,结果与0x0000异或 + * + * @param buffer + * @return + */ + public static int CRC16_CCITT_FALSE(byte[] buffer) { + int wCRCin = 0xffff; + int wCPoly = 0x1021; + for (byte b : buffer) { + for (int i = 0; i < 8; i++) { + boolean bit = ((b >> (7 - i) & 1) == 1); + boolean c15 = ((wCRCin >> 15 & 1) == 1); + wCRCin <<= 1; + if (c15 ^ bit) + wCRCin ^= wCPoly; + } + } + wCRCin &= 0xffff; + return wCRCin ^= 0x0000; + } + + /** + * CRC-CCITT (XModem) + * CRC16_XMODEM:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在后,高位在前,结果与0x0000异或 + * + * @param buffer + * @return + */ + public static int CRC16_XMODEM(byte[] buffer) { + int wCRCin = 0x0000; // initial value 65535 + int wCPoly = 0x1021; // 0001 0000 0010 0001 (0, 5, 12) + for (byte b : buffer) { + for (int i = 0; i < 8; i++) { + boolean bit = ((b >> (7 - i) & 1) == 1); + boolean c15 = ((wCRCin >> 15 & 1) == 1); + wCRCin <<= 1; + if (c15 ^ bit) + wCRCin ^= wCPoly; + } + } + wCRCin &= 0xffff; + return wCRCin ^= 0x0000; + } + + + /** + * CRC16_X25:多项式x16+x12+x5+1(0x1021),初始值0xffff,低位在前,高位在后,结果与0xFFFF异或 + * 0x8408是0x1021按位颠倒后的结果。 + * + * @param buffer + * @return + */ + public static int CRC16_X25(byte[] buffer) { + int wCRCin = 0xffff; + int wCPoly = 0x8408; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= wCPoly; + } else { + wCRCin >>= 1; + } + } + } + return wCRCin ^= 0xffff; + } + + /** + * CRC-16 (Modbus) + * CRC16_MODBUS:多项式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,高位在后,结果与0x0000异或 + * 0xA001是0x8005按位颠倒后的结果 + * + * @param buffer + * @return + */ + public static int CRC16_MODBUS(byte[] buffer) { + int wCRCin = 0xffff; + int POLYNOMIAL = 0xa001; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= POLYNOMIAL; + } else { + wCRCin >>= 1; + } + } + } + return wCRCin ^= 0x0000; + } + + /** + * CRC-16 + * CRC16_IBM:多项式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,结果与0x0000异或 + * 0xA001是0x8005按位颠倒后的结果 + * + * @param buffer + * @return + */ + public static int CRC16_IBM(byte[] buffer) { + int wCRCin = 0x0000; + int wCPoly = 0xa001; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= wCPoly; + } else { + wCRCin >>= 1; + } + } + } + return wCRCin ^= 0x0000; + } + + /** + * CRC16_MAXIM:多项式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,结果与0xFFFF异或 + * 0xA001是0x8005按位颠倒后的结果 + * + * @param buffer + * @return + */ + public static int CRC16_MAXIM(byte[] buffer) { + int wCRCin = 0x0000; + int wCPoly = 0xa001; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= wCPoly; + } else { + wCRCin >>= 1; + } + } + } + return wCRCin ^= 0xffff; + } + + /** + * CRC16_USB:多项式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,高位在后,结果与0xFFFF异或 + * 0xA001是0x8005按位颠倒后的结果 + * + * @param buffer + * @return + */ + public static int CRC16_USB(byte[] buffer) { + int wCRCin = 0xFFFF; + int wCPoly = 0xa001; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= wCPoly; + } else { + wCRCin >>= 1; + } + } + } + return wCRCin ^= 0xffff; + } + + /** + * CRC16_DNP:多项式x16+x13+x12+x11+x10+x8+x6+x5+x2+1(0x3D65),初始值0x0000,低位在前,高位在后,结果与0xFFFF异或 + * 0xA6BC是0x3D65按位颠倒后的结果 + * + * @param buffer + * @return + */ + public static int CRC16_DNP(byte[] buffer) { + int wCRCin = 0x0000; + int wCPoly = 0xA6BC; + for (byte b : buffer) { + wCRCin ^= ((int) b & 0x00ff); + for (int j = 0; j < 8; j++) { + if ((wCRCin & 0x0001) != 0) { + wCRCin >>= 1; + wCRCin ^= wCPoly; + } else { + wCRCin >>= 1; + } + } + } + return wCRCin ^= 0xffff; + } +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/utils/DateUtil.java b/user-service/src/main/java/com/mh/user/utils/DateUtil.java new file mode 100644 index 0000000..41ef900 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/DateUtil.java @@ -0,0 +1,311 @@ +package com.mh.user.utils; + +import java.text.ParseException; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-12-16 + * @throws : + */ +public class DateUtil { + /** + * 通过时间秒毫秒数判断两个时间的间隔 + * + * @param form 开始时间 + * @param to 结束时间 + * @return 相差天数 + */ + public static int differentDays(Date form, Date to) { + return (int) ((to.getTime() - form.getTime()) / (1000 * 3600 * 24)); + } + + /** + * 通过时间秒毫秒数判断两个时间的间隔 + * + * @param startDate 开始时间 + * @param endDate 结束时间 + * @return 相差小时数 + */ + public static int differentHours(String startDate, String endDate) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + ParsePosition pos = new ParsePosition(0); + Date to = sdf1.parse(startDate,pos); + Date form = sdf1.parse(endDate,pos); + return (int) ((to.getTime() - form.getTime()) / (1000 * 3600)); + } + + /** + * 通过时间秒毫秒数判断两个时间的间隔 + * + * @param startDate 开始时间 + * @param endDate 结束时间 + * @return 相差分钟数 + */ + public static int differentMinute(String startDate, String endDate) { + startDate = startDate.substring(0,15) + "0:00"; + endDate = endDate.substring(0,15) + "0:00"; + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + ParsePosition pos = new ParsePosition(0); + Date start = sdf1.parse(startDate,pos); + ParsePosition pos1 = new ParsePosition(0); + Date end = sdf1.parse(endDate,pos1); + + int dValue = (int) ((end.getTime() - start.getTime()) / (1000 * 60)); + System.out.println("时间相差------" + dValue + " 分钟"); + return dValue; + } + + // 格式化时间为"yyyy-MM-dd HH:00:00" + public static String formatDateStr(String dateStr) { + // 判断是15的倍数 + String substring = dateStr.substring(14, 16); + int i = (Integer.parseInt(substring) / 15); + dateStr = dateStr.substring(0,14) + ExchangeStringUtil.addZeroForNum(String.valueOf(i*15),2) + ":00"; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = null; + try { + date = simpleDateFormat.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + } + return simpleDateFormat.format(date); + } + + // 格式化时间为"yyyy-MM-dd HH:m0:00" + public static String changeDateStr(String dateStr) { + dateStr = dateStr.substring(0,15) + "0:00"; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = null; + try { + date = simpleDateFormat.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + } + return simpleDateFormat.format(date); + } + + /** + * 判断两个时间相差多少个月 + * + * @param form 开始时间 + * @param to 结束时间 + * @return 相差月数 + */ + public static int differentMonth(Date form, Date to) { + Calendar bef = Calendar.getInstance(); + Calendar aft = Calendar.getInstance(); + bef.setTime(form); + aft.setTime(to); + int result = aft.get(Calendar.MONTH) - bef.get(Calendar.MONTH); + int month = (aft.get(Calendar.YEAR) - bef.get(Calendar.YEAR)) * 12; + return Math.abs(month + result); + } + + /** + * 把日期格式化为字符串 + * + * @param date 日期 + * @param format 格式 + * @return 返回格式化之后的字符串 + */ + public static String dateToString(Date date, String format) { + SimpleDateFormat dateFormat = new SimpleDateFormat(format); + return dateFormat.format(date); + } + + /** + * 把日期格式化为字符串 + * + * @param date 日期 + * @param format 格式 + * @return 返回格式化之后的字符串 + */ + public static Date stringToDate(String date, String format) { + SimpleDateFormat dateFormat = new SimpleDateFormat(format); + try { + return dateFormat.parse(date); + } catch (ParseException e) { + return null; + } + } + + /** + * 通过传入的日期加指定的天数 + * + * @param date 日期 + * @param day 天数 + * @return 相加后的天数 + */ + public static Date getNextDay(Date date, int day) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DAY_OF_YEAR, day); + return calendar.getTime(); + } + + /** + * 通过传入的日期加指定的分钟数 + * + * @param date 日期 + * @param minute 天数 + * @return 相加后的天数 + */ + public static Date getNextMinute(Date date, int minute) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.MINUTE, minute); + return calendar.getTime(); + } + + /** + * 通过传入的日期加指定的天数 + * + * @param date 日期 + * @param day 天数 + * @return 相加后的天数 + */ + public static String getNextDay(String date, int day, String format) { + return dateToString(getNextDay(stringToDate(date, format), day), format); + } + + /** + * 通过传入的日期加指定的年数 + * + * @param date 日期 + * @param year 年数 + * @return 计算后的日期 + */ + public static Date getNextYear(Date date, int year) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.YEAR, year); + return calendar.getTime(); + } + + /** + * 通过传入的日期加指定的月数 + * + * @param date 日期 + * @param month 月数 + * @return 计算后的日期 + */ + public static Date getNextMonth(Date date, int month) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.MONTH, month); + return calendar.getTime(); + } + + + /** + * 获取当前的时间 + * + * @return 返回当前的时间 + */ + public static Date getNowDate() { + return new Date(); + } + + /** + * 获得某天23:59:59点时间 + * + * @return + */ + public static Date getTimesnight(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + /** + * 获得某天0点时间 + * + * @return + */ + public static Date getTimesmorning(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + /** + * @param inputJudgeDate 要判断是否在当天24h内的时间 + * @return boolean + * @Description 是否为当天24h内 + * @author guo + */ + public static boolean isToday(Date inputJudgeDate) { + boolean flag = false; + //获取当前系统时间 + long longDate = System.currentTimeMillis(); + Date nowDate = new Date(longDate); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String format = dateFormat.format(nowDate); + String subDate = format.substring(0, 10); + //定义每天的24h时间范围 + String beginTime = subDate + " 00:00:00"; + String endTime = subDate + " 23:59:59"; + Date paseBeginTime = null; + Date paseEndTime = null; + try { + paseBeginTime = dateFormat.parse(beginTime); + paseEndTime = dateFormat.parse(endTime); + + } catch (ParseException e) { + e.printStackTrace(); + } + if (inputJudgeDate.after(paseBeginTime) && inputJudgeDate.before(paseEndTime)) { + flag = true; + } + return flag; + } + + /** + * 把日期格式化为字符串 + * + * @param date 日期 + * @return 返回格式化之后的字符串 + */ + public static Date stringToDateFormat(String date) { + String format = "yyyy-MM-dd HH:mm:ss"; + SimpleDateFormat dateFormat = new SimpleDateFormat(format); + try { + return dateFormat.parse(date); + } catch (ParseException e) { + return null; + } + } + + /** + * 时间戳转date + * + * @return + */ + public static Date timeToDate(Long time) { + //时间戳转化为Sting或Date + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String d = format.format(time); + Date date = null; + try { + date = format.parse(d); + return date; + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/ExchangeStringUtil.java b/user-service/src/main/java/com/mh/user/utils/ExchangeStringUtil.java new file mode 100644 index 0000000..b1ea2a6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/ExchangeStringUtil.java @@ -0,0 +1,1323 @@ +package com.mh.user.utils; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import net.sf.json.JSONObject; +import org.apache.commons.codec.binary.Hex; +import sun.misc.BASE64Encoder; + +import java.io.*; +import java.math.BigInteger; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @Auther: LJF + * @Date: 2020-02-26 15:11 + * @Description: + */ +public class ExchangeStringUtil { + + public static void main(String args[]){ + +// int ieee754Int = Integer.parseInt(str, 16); +// float realValue = Float.intBitsToFloat(ieee754Int); +// System.out.println(realValue); +// +// SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// Date date=new Date(); +// String curDate=sdf1.format(date); +// System.out.println(curDate); +// String m=curDate.substring(0,15)+"0"; +// System.out.println(m); +// try{ +// getTodayWeather1("广州"); +// }catch (Exception e){ +// +// } + +// String str=ExchangeStringUtil.dateRoll(1,""); +// System.out.println("当前时间前1小时"+str); +// str=ExchangeStringUtil.dateRoll(2,""); +// System.out.println("当前时间前2小时"+str); +// str=ExchangeStringUtil.dateTime(5); +// System.out.println("当前时间前5分钟"+str); +// str=ExchangeStringUtil.dateTime(15); +// System.out.println("当前时间前15分钟"+str); +// str=ExchangeStringUtil.dateTime(30); +// System.out.println("当前时间前30分钟"+str); + System.out.println("--------------------------------------------------"); + } + + /** + * 获取到对应的buffer + * @param ctx + * @param sendStr + * @return + */ + public static ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { + // byte类型的数据 +// byte[] bytes = "这里是将要写往服务端的数据".getBytes(Charset.forName("utf-8")); +// String sendStr = "5803004900021914"; // 冷量计 + // 申请一个数据结构存储信息 + ByteBuf buffer = ctx.alloc().buffer(); + // 将信息放入数据结构中 + buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 + return buffer; + } + + /** + * double转换为String :当为整数时,只显示整数,当小数时直接显示小数 + * @param num + * @return + */ + public static String doubleTrans1(double num){ + if(num % 1.0 == 0){ + return String.valueOf((long)num); + } + return String.valueOf(num); + } + + /** + * 获取String中的数值 + * @param result + * @return + */ + public static String getNumFromString(String result) { + String regEx="[^0-9]"; + Pattern p = Pattern.compile(regEx); + Matcher m = p.matcher(result); + return m.replaceAll("").trim(); + } + + /** + * 获取检验位值,update by ljf on 2020-06-02 + * @param result + * @return + */ + //返回指令+校验码 + public static String getCRCStr(String result) { + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(result); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + result = result + checkWord; + return result; + } + + //只返回校验码 + public static String getStrCRC16(String result) { + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(result); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + return checkWord; + } + + public static String getMidString(String str, String beginStr, String endStr) { + String regex = beginStr + "(.*)" + endStr; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(str); + String result = ""; + while (matcher.find()) { + result = matcher.group(1); + } + return result; + } + + /** + * 字符串不足补“0” + * @param str + * @param strLength + * @return + */ + public static String addZeroForNum(String str, int strLength) { + int strLen = str.length(); + if (strLen < strLength) { + while (strLen < strLength) { + StringBuffer sb = new StringBuffer(); + sb.append("0").append(str);// 左补0 + // sb.append(str).append("0");//右补0 + str = sb.toString(); + strLen = str.length(); + } + } + return str; + } + + /** + * ip地址转换成16进制long + * @param ipString + * @return + */ + public static String ipToHex(String ipString) { + String[] strings = ipString.split("\\."); + String result = ""; + for (int i = 0; i < strings.length; i++) { + result = result + ExchangeStringUtil.decToHex(strings[i]); + } + return result; + } + + /** + * ip地址转换成16进制long + * @param ipString + * @return + */ + public static Long ipToLong(String ipString) { + Long[] ip = new Long[4]; + int pos1= ipString.indexOf("."); + int pos2= ipString.indexOf(".",pos1+1); + int pos3= ipString.indexOf(".",pos2+1); + ip[0] = Long.parseLong(ipString.substring(0 , pos1)); + ip[1] = Long.parseLong(ipString.substring(pos1+1 , pos2)); + ip[2] = Long.parseLong(ipString.substring(pos2+1 , pos3)); + ip[3] = Long.parseLong(ipString.substring(pos3+1)); + return (ip[0]<<24)+(ip[1]<<16)+(ip[2]<<8)+ip[3]; + } + + public static String splitData(String str, String strStart, String strEnd) { + String tempStr; + tempStr = str.substring(str.indexOf(strStart) + 1, str.lastIndexOf(strEnd)); + return tempStr; + } + + public static String endData(String str, String strStart) { + String tempStr; + String str1=str.substring(0, str.indexOf(strStart)); + tempStr=str.substring(str1.length()+1); + return tempStr; + } + + // 转换位置 + public static String changePosition(String changeStr) { + StringBuffer s1 = new StringBuffer(); + for (int i = changeStr.length(); i >= 2; i = i - 2) { + s1 = s1.append(changeStr.substring(i - 2, i)); + } + return s1.toString(); + } + + // 加33 + public static String addThree(String data){ + String result = ""; + for (int i = 0; i < data.length() / 2; i++) { + BigInteger a = new BigInteger(data.substring(2*i,2*(i+1)),16); + BigInteger b = new BigInteger("33",16); + BigInteger c = a.add(b); + result = result + ExchangeStringUtil.decToHex(c.toString(10)); + } + + return result; + } + + // 减33 + public static String cutThree(String data){ + String result = ""; + for (int i = 0; i < data.length() / 2; i++) { + BigInteger a = new BigInteger(data.substring(2*i,2*(i+1)),16); + BigInteger b = new BigInteger("33",16); + BigInteger c = a.subtract(b); + result = result + ExchangeStringUtil.decToHex(c.toString(10)); + } + + return result; + } + + public static String makeChecksum(String data) { + if (data == null || data.equals("")) { + return ""; + } + int total = 0; + int len = data.length(); + int num = 0; + while (num < len) { + String s = data.substring(num, num + 2); + total += Integer.parseInt(s, 16); + num = num + 2; + } + /** + * 用256求余最大是255,即16进制的FF + */ + int mod = total % 256; + String hex = Integer.toHexString(mod); + len = hex.length(); + // 如果不够校验位的长度,补0,这里用的是两位校验 + if (len < 2) { + hex = "0" + hex; + } + return hex; + } + + /** + * 十进制数据转换为十六进制字符串数 + * + * @param dec + * @return + */ + public static String decToHex(String dec) { + BigInteger data = new BigInteger(dec,10); + String result = data.toString(16); + if (result.length() < 2) { + result = "0" + result; + } + if ((result.length() % 2)!=0) { + result = "0" + result; + } + return result.toUpperCase(); + } + /** + * 十六进制数据转换为十进制字符串数 + * + * @param hex + * @return + */ + public static String hexToDec(String hex) { + BigInteger data = new BigInteger(hex,16); + return data.toString(10); + } + + public static String IntToHex(int n){ + char[] ch = new char[20]; + int nIndex = 0; + while ( true ){ + int m = n/16; + int k = n%16; + if ( k == 15 ) + ch[nIndex] = 'F'; + else if ( k == 14 ) + ch[nIndex] = 'E'; + else if ( k == 13 ) + ch[nIndex] = 'D'; + else if ( k == 12 ) + ch[nIndex] = 'C'; + else if ( k == 11 ) + ch[nIndex] = 'B'; + else if ( k == 10 ) + ch[nIndex] = 'A'; + else + ch[nIndex] = (char)('0' + k); + nIndex++; + if ( m == 0 ) + break; + n = m; + } + StringBuffer sb = new StringBuffer(); + sb.append(ch, 0, nIndex); + sb.reverse(); + String strHex = new String(""); + strHex += sb.toString(); + return strHex; + } + + // 字节数组转字符串 + public static String printHexString(byte[] b) { + + StringBuffer sbf = new StringBuffer(); + for (int i = 0; i < b.length; i++) { + String hex = Integer.toHexString(b[i] & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sbf.append(hex.toUpperCase() + " "); + } + return sbf.toString().trim(); + } + + public static String bytesToHexString(byte[] src){ + StringBuilder stringBuilder = new StringBuilder(""); + if (src == null || src.length <= 0) { + return null; + } + for (int i = 0; i < src.length; i++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + if (hv.length() < 2) { + stringBuilder.append(0); + } + stringBuilder.append(hv); + } + return stringBuilder.toString(); + } + + /** + * 字符串转化成为16进制字符串 + * @param s + * @return + */ + public static String strTo16(String s) { + String str = ""; + for (int i = 0; i < s.length(); i++) { + int ch = (int) s.charAt(i); + String s4 = Integer.toHexString(ch); + str = str + s4; + } + return str; + } + + /** + * 字符串转换成为16进制(无需Unicode编码) + * @param str + * @return + */ + public static String str2HexStr(String str) { + char[] chars = "0123456789ABCDEF".toCharArray(); + StringBuilder sb = new StringBuilder(""); + byte[] bs = str.getBytes(); + int bit; + for (int i = 0; i < bs.length; i++) { + bit = (bs[i] & 0x0f0) >> 4; + sb.append(chars[bit]); + bit = bs[i] & 0x0f; + sb.append(chars[bit]); + // sb.append(' '); + } + return sb.toString().trim(); + } + + /** + * 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, "UTF-8"); + new String(); + } catch (Exception e1) { + e1.printStackTrace(); + } + return s; + } + + + + /** + * 字节转十六进制 + * @param b 需要进行转换的byte字节 + * @return 转换后的Hex字符串 + */ + public static String byteToHex(byte b){ + String hex = Integer.toHexString(b & 0xFF); + if(hex.length() < 2){ + hex = "0" + hex; + } + return hex; + } + + /** + * hex字符串转byte数组 + * @param inHex 待转换的Hex字符串 + * @return 转换后的byte数组结果 + */ + public static byte[] hexToByteArray(String inHex){ + int hexlen = inHex.length(); + byte[] result; + if (hexlen % 2 == 1){ + //奇数 + hexlen++; + result = new byte[(hexlen/2)]; + inHex="0"+inHex; + }else { + //偶数 + result = new byte[(hexlen/2)]; + } + int j=0; + for (int i = 0; i < hexlen; i+=2){ + result[j]=(byte)Integer.parseInt(inHex.substring(i,i+2),16); + j++; + } + return result; + } + + /** + * 将十六进制的字符串转换成字节数组 + * + * @param hexString + * @return + */ + public static byte[] hexStrToBinaryStr(String hexString) { + + hexString = hexString.replaceAll(" ", ""); + + int len = hexString.length(); + int index = 0; + + + byte[] bytes = new byte[len / 2]; + + while (index < len) { + + String sub = hexString.substring(index, index + 2); + + bytes[index/2] = (byte) Integer.parseInt(sub,16); + + index += 2; + } + + + return bytes; + } + + /** + * 获取当前日期 : "yyyy-MM-dd HH:mm:ss" + * + * @return "yyyy-MM-dd HH:mm:ss"字符串 + */ + public static String formatDateStr_ss() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + } + + /** + * 字符串是否为空 + * + * 如果这个字符串为null或者trim后为空字符串则返回true,否则返回false。 + * + * @param str + * @return + */ + public static boolean isEmpty(String str) { + if (str == null || "".equals(str.trim())) + return true; + return false; + } + + /** + * 用来把mac字符串转换为long + * + * @param strMac + * @return + */ + public static long macToLong(String strMac) { + byte[] mb = new BigInteger(strMac, 16).toByteArray(); + ByteBuffer mD = ByteBuffer.allocate(mb.length); + mD.put(mb); + long mac = 0; + // 如果长度等于8代表没有补0; + if (mD.array().length == 8) { + mac = mD.getLong(0); + } else if (mD.array().length == 9) { + mac = mD.getLong(1); + } + return mac; + } + + public static byte[] getBytes(Object obj) throws IOException { + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bout); + out.writeObject(obj); + out.flush(); + byte[] bytes = bout.toByteArray(); + bout.close(); + out.close(); + + return bytes; + } + + public static Object getObject(byte[] bytes) throws IOException, ClassNotFoundException { + ByteArrayInputStream bi = new ByteArrayInputStream(bytes); + ObjectInputStream oi = new ObjectInputStream(bi); + Object obj = oi.readObject(); + bi.close(); + oi.close(); + return obj; + } + + public static ByteBuffer getByteBuffer(Object obj) throws IOException { + byte[] bytes = ExchangeStringUtil.getBytes(obj); + ByteBuffer buff = ByteBuffer.wrap(bytes); + + return buff; + } + + /** + * byte[] 转short 2字节 + * + * @param bytes + * @return + */ + public static short bytesToshort(byte[] bytes) { + return (short) ((bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00)); + + } + + /** + * byte 转Int + * + * @param b + * @return + */ + public static int byteToInt(byte b) { + return (b) & 0xff; + } + + public static int bytesToInt(byte[] bytes) { + int addr = bytes[0] & 0xFF; + addr |= ((bytes[1] << 8) & 0xFF00); + addr |= ((bytes[2] << 16) & 0xFF0000); + addr |= ((bytes[3] << 24) & 0xFF000000); + return addr; + } + + public static byte[] intToByte(int i) { + + byte[] abyte0 = new byte[4]; + abyte0[0] = (byte) (0xff & i); + abyte0[1] = (byte) ((0xff00 & i) >> 8); + abyte0[2] = (byte) ((0xff0000 & i) >> 16); + abyte0[3] = (byte) ((0xff000000 & i) >> 24); + return abyte0; + + } + + public static byte[] LongToByte(Long i) { + + byte[] abyte0 = new byte[8]; + abyte0[0] = (byte) (0xff & i); + abyte0[1] = (byte) ((0xff00 & i) >> 8); + abyte0[2] = (byte) ((0xff0000 & i) >> 16); + abyte0[3] = (byte) ((0xff000000 & i) >> 24); + abyte0[4] = (byte) ((0xff00000000l & i) >> 32); + abyte0[5] = (byte) ((0xff0000000000l & i) >> 40); + abyte0[6] = (byte) ((0xff000000000000l & i) >> 48); + abyte0[7] = (byte) ((0xff00000000000000l & i) >> 56); + return abyte0; + + } + + /** + * 函数名称:shortChange
+ * 功能描述:short 大端转小端 + * + * @param mshort + */ + public static short shortChange(Short mshort) { + + mshort = (short) ((mshort >> 8 & 0xFF) | (mshort << 8 & 0xFF00)); + + return mshort; + } + + /** + * 函数名称:intChange
+ * 功能描述:int 大端转小端 + * + * @param mint + */ + public static int intChange(int mint) { + + mint = (int) (((mint) >> 24 & 0xFF) | ((mint) >> 8 & 0xFF00) | ((mint) << 8 & 0xFF0000) + | ((mint) << 24 & 0xFF000000)); + + return mint; + } + + /** + * 函数名称:intChange
+ * 功能描述:LONG 大端转小端 + * + * @param mlong + */ + public static long longChange(long mlong) { + + mlong = (long) (((mlong) >> 56 & 0xFF) | ((mlong) >> 48 & 0xFF00) | ((mlong) >> 24 & 0xFF0000) + | ((mlong) >> 8 & 0xFF000000) | ((mlong) << 8 & 0xFF00000000l) | ((mlong) << 24 & 0xFF0000000000l) + | ((mlong) << 40 & 0xFF000000000000l) | ((mlong) << 56 & 0xFF00000000000000l)); + + return mlong; + } + + /** + * 将byte转换为无符号的short类型 + * + * @param b 需要转换的字节数 + * @return 转换完成的short + */ + public static short byteToUshort(byte b) { + return (short) (b & 0x00ff); + } + + /** + * 将byte转换为无符号的int类型 + * + * @param b 需要转换的字节数 + * @return 转换完成的int + */ + public static int byteToUint(byte b) { + return b & 0x00ff; + } + + /** + * 将byte转换为无符号的long类型 + * + * @param b 需要转换的字节数 + * @return 转换完成的long + */ + public static long byteToUlong(byte b) { + return b & 0x00ff; + } + + /** + * 将short转换为无符号的int类型 + * + * @param s 需要转换的short + * @return 转换完成的int + */ + public static int shortToUint(short s) { + return s & 0x00ffff; + } + + /** + * 将short转换为无符号的long类型 + * + * @param s 需要转换的字节数 + * @return 转换完成的long + */ + public static long shortToUlong(short s) { + return s & 0x00ffff; + } + + /** + * 将int转换为无符号的long类型 + * + * @param i 需要转换的字节数 + * @return 转换完成的long + */ + public static long intToUlong(int i) { + return i & 0x00ffffffff; + } + + /** + * 将short转换成小端序的byte数组 + * + * @param s 需要转换的short + * @return 转换完成的byte数组 + */ + public static byte[] shortToLittleEndianByteArray(short s) { + return ByteBuffer.allocate(2).order(ByteOrder.LITTLE_ENDIAN).putShort(s).array(); + } + + /** + * 将int转换成小端序的byte数组 + * + * @param i 需要转换的int + * @return 转换完成的byte数组 + */ + public static byte[] intToLittleEndianByteArray(int i) { + return ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(i).array(); + } + + /** + * 将long转换成小端序的byte数组 + * + * @param l 需要转换的long + * @return 转换完成的byte数组 + */ + public static byte[] longToLittleEndianByteArray(long l) { + return ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putLong(l).array(); + } + + /** + * 将short转换成大端序的byte数组 + * + * @param s 需要转换的short + * @return 转换完成的byte数组 + */ + public static byte[] shortToBigEndianByteArray(short s) { + return ByteBuffer.allocate(2).order(ByteOrder.BIG_ENDIAN).putShort(s).array(); + } + + /** + * 将int转换成大端序的byte数组 + * + * @param i 需要转换的int + * @return 转换完成的byte数组 + */ + public static byte[] intToBigEndianByteArray(int i) { + return ByteBuffer.allocate(2).order(ByteOrder.BIG_ENDIAN).putInt(i).array(); + } + + /** + * 将long转换成大端序的byte数组 + * + * @param l 需要转换的long + * @return 转换完成的byte数组 + */ + public static byte[] longToBigEndianByteArray(long l) { + return ByteBuffer.allocate(2).order(ByteOrder.BIG_ENDIAN).putLong(l).array(); + } + + /** + * 将short转换为16进制字符串 + * + * @param s 需要转换的short + * @param isLittleEndian 是否是小端序(true为小端序false为大端序) + * @return 转换后的字符串 + */ + public static String shortToHexString(short s, boolean isLittleEndian) { + byte byteArray[] = null; + if (isLittleEndian) { + byteArray = shortToLittleEndianByteArray(s); + } else { + byteArray = shortToBigEndianByteArray(s); + } + return byteArrayToHexString(byteArray); + } + + /** + * 将int转换为16进制字符串 + * + * @param i 需要转换的int + * @param isLittleEndian 是否是小端序(true为小端序false为大端序) + * @return 转换后的字符串 + */ + public static String intToHexString(int i, boolean isLittleEndian) { + byte byteArray[] = null; + if (isLittleEndian) { + byteArray = intToLittleEndianByteArray(i); + } else { + byteArray = intToBigEndianByteArray(i); + } + return byteArrayToHexString(byteArray); + } + + /** + * 将long转换为16进制字符串 + * + * @param l 需要转换的long + * @param isLittleEndian 是否是小端序(true为小端序false为大端序) + * @return 转换后的字符串 + */ + public static String longToHexString(long l, boolean isLittleEndian) { + byte byteArray[] = null; + if (isLittleEndian) { + byteArray = longToLittleEndianByteArray(l); + } else { + byteArray = longToBigEndianByteArray(l); + } + return byteArrayToHexString(byteArray); + } + + /** + * 将字节数组转换成16进制字符串 + * + * @param array 需要转换的字符串 + * @param toPrint 是否为了打印输出,如果为true则会每4自己添加一个空格 + * @return 转换完成的字符串 + */ +// public static String byteArrayToHexString(byte[] array, boolean toPrint) { +// if (array == null) { +// return "null"; +// } +// StringBuffer sb = new StringBuffer(); +// +// for (int i = 0; i < array.length; i++) { +// sb.append(byteToHex(array[i])); +// if (toPrint && (i + 1) % 4 == 0) { +// sb.append(" "); +// } +// } +// return sb.toString(); +// } + + /** + * 字节数组转换成String,指定长度转换长度 + * + * @param arrBytes + * @param count 转换长度 + * @param blank 要不要空格(每个byte字节,最是否用一个“ ”隔开) + * @return "" | arrBytes换成的字符串(不存在null) + */ + public static String byteArray2HexString(byte[] arrBytes, int count, boolean blank) { + String ret = ""; + if (arrBytes == null || arrBytes.length < 1) + return ret; + if (count > arrBytes.length) + count = arrBytes.length; + StringBuilder builder = new StringBuilder(); + + for (int i = 0; i < count; i++) { + ret = Integer.toHexString(arrBytes[i] & 0xFF).toUpperCase(); + if (ret.length() == 1) + builder.append("0").append(ret); + else + builder.append(ret); + if (blank) + builder.append(" "); + } + + return builder.toString(); + + } + + public static String hexStr2Str(String hexStr) { + String string = "0123456789ABCDEF"; + char[] hexs = hexStr.toCharArray(); + byte[] bytes = new byte[hexStr.length() / 2]; + int n; + for (int i = 0; i < bytes.length; i++) { + n = string.indexOf(hexs[2 * i]) * 16; + n += string.indexOf(hexs[2 * i + 1]); + bytes[i] = (byte) (n & 0xff); + } + return new String(bytes); + } + + /** + * 将指定字符串src,以每两个字符分割转换为16进制形式 如:"2B44EFD9" --> byte[]{0x2B, 0x44, 0xEF, 0xD9} + * + * @param src String + * @return null | byte[] + */ + public static byte[] HexString2Bytes(String src) { + // String strTemp = ""; + if (src == null || "".equals(src)) + return null; + StringBuilder builder = new StringBuilder(); + for (char c : src.trim().toCharArray()) { + /* 去除中间的空格 */ + if (c != ' ') { + builder.append(c); + } + } + src = builder.toString(); + byte[] ret = new byte[src.length() / 2]; + byte[] tmp = src.getBytes(); + for (int i = 0; i < src.length() / 2; i++) { + ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]); + } + return ret; + } + + /** + * 将两个ASCII字符合成一个字节; 如:"EF"--> 0xEF + * + * @param src0 byte + * @param src1 byte + * @return byte + */ + public static byte uniteBytes(byte src0, byte src1) { + byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 })).byteValue(); + _b0 = (byte) (_b0 << 4); + byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })).byteValue(); + byte ret = (byte) (_b0 ^ _b1); + return ret; + } + + /** + * 将字节数组转换成16进制字符串 + * + * @param array 需要转换的字符串(字节间没有分隔符) + * @return 转换完成的字符串 + */ + public static String byteArrayToHexString(byte[] array) { + return byteArray2HexString(array, Integer.MAX_VALUE, false); + } + + /** + * 将字节数组转换成long类型 + * + * @param bytes 字节数据 + * @return long类型 + */ + public static long byteArrayToLong(byte[] bytes) { + return ((((long) bytes[0] & 0xff) << 24) | (((long) bytes[1] & 0xff) << 16) | (((long) bytes[2] & 0xff) << 8) + | (((long) bytes[3] & 0xff) << 0)); + } + + /** + * 合并数组 + * + * @param firstArray 第一个数组 + * @param secondArray 第二个数组 + * @return 合并后的数组 + */ + public static byte[] concat(byte[] firstArray, byte[] secondArray) { + if (firstArray == null || secondArray == null) { + if (firstArray != null) + return firstArray; + if (secondArray != null) + return secondArray; + return null; + } + byte[] bytes = new byte[firstArray.length + secondArray.length]; + System.arraycopy(firstArray, 0, bytes, 0, firstArray.length); + System.arraycopy(secondArray, 0, bytes, firstArray.length, secondArray.length); + return bytes; + } + + //字符转二进制 + public static String toBinary(String str){ + char[] strChar=str.toCharArray(); + String result=""; + for(int i=0;i + * 方 法 名: getTodayWeather
+ * + * @param Cityid + * 城市编码 + */ + public static Map getTodayWeather1(String Cityid) + throws IOException, NullPointerException { + // 连接中央气象台的API + String url1= "https://free-api.heweather.net/s6/weather/now?location="+Cityid+"&key=3c3fa198cacc4152b94b20def11b2455"; + + URL url = new URL(url1); + URLConnection connectionData = url.openConnection(); + connectionData.setConnectTimeout(1000); + Map map = new HashMap(); + try { + BufferedReader br = new BufferedReader(new InputStreamReader( + connectionData.getInputStream(), "UTF-8")); + StringBuilder sb = new StringBuilder(); + String line = null; + while ((line = br.readLine()) != null) + sb.append(line); + String datas = sb.toString(); + //截取[]转化为json格式 + datas = datas.replace(datas.substring(datas.indexOf(":")+1,datas.indexOf(":")+2),""); + datas = datas.replace(datas.substring(datas.length()-2,datas.length()-1),""); + JSONObject jsonData = JSONObject.fromObject(datas); + JSONObject info = jsonData.getJSONObject("HeWeather6"); + JSONObject jsonData1 = JSONObject.fromObject(info.getString("basic").toString()); + JSONObject jsonData2 = JSONObject.fromObject(info.getString("update").toString()); + JSONObject jsonData3 = JSONObject.fromObject(info.getString("now").toString()); + map.put("location",jsonData1.getString("location").toString()); + map.put("parent_city",jsonData1.getString("parent_city").toString()); + map.put("admin_area",jsonData1.getString("admin_area").toString()); + map.put("cnty",jsonData1.getString("cnty").toString()); + + String time = jsonData2.getString("loc").toString(); + + String week = strToDate(time); + + map.put("week",week); + map.put("time",jsonData2.getString("loc").toString()); + + map.put("tmp",jsonData3.getString("tmp").toString()); + map.put("wind_dir",jsonData3.getString("wind_dir").toString()); + map.put("cond_txt",jsonData3.getString("cond_txt").toString()); + map.put("cond_code",jsonData3.getString("cond_code").toString()); + System.out.println(map); + } catch (SocketTimeoutException e) { + System.out.println("连接超时"); + } catch (FileNotFoundException e) { + System.out.println("加载文件出错"); + } catch (ParseException e) { + e.printStackTrace(); + }finally { + //关闭流 +// try { +// if(br!=null){ +// br.close(); +// } +// +// } catch ( Exception e) { +// e.printStackTrace(); +// } + } + return map; + } + + /** + * 时间获得星期 + * @param strDate + * @return + * @throws ParseException + */ + public static String strToDate(String strDate) throws ParseException { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Calendar c = Calendar.getInstance(); + c.setTime(formatter.parse(strDate)); + SimpleDateFormat sdf = new SimpleDateFormat("EEEE"); + String week = sdf.format(c.getTime()); + return week; + } + /** + * 字符集转码 + * @param url + * @return + * @throws UnsupportedEncodingException + */ + public static String urlEncode(String url) throws UnsupportedEncodingException { + if(url == null) { + return null; + } + + final String reserved_char = ";/?:@=&"; + String ret = ""; + for(int i=0; i < url.length(); i++) { + String cs = String.valueOf( url.charAt(i) ); + if(reserved_char.contains(cs)){ + ret += cs; + }else{ + ret += URLEncoder.encode(cs, "utf-8"); + } + } + return ret.replace("+", "%20"); + } + + + /** + * 判断时间是否在时间段内 + * + * @param date + * 当前时间 yyyy-MM-dd HH:mm:ss + * @param strDateBegin + * 开始时间 00:00:00 + * @param strDateEnd + * 结束时间 00:05:00 + * @return + */ + public static boolean isInDate(Date date, String strDateBegin, + String strDateEnd) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String strDate = sdf.format(date); + // 截取当前时间时分秒 + int strDateH = Integer.parseInt(strDate.substring(11, 13)); + int strDateM = Integer.parseInt(strDate.substring(14, 16)); + int strDateS = Integer.parseInt(strDate.substring(17, 19));// + // 截取开始时间时分秒 + int strDateBeginH = Integer.parseInt(strDateBegin.substring(0, 2)); + int strDateBeginM = Integer.parseInt(strDateBegin.substring(3, 5)); + int strDateBeginS = Integer.parseInt(strDateBegin.substring(6, 8));// + // 截取结束时间时分秒 + int strDateEndH = Integer.parseInt(strDateEnd.substring(0, 2)); + int strDateEndM = Integer.parseInt(strDateEnd.substring(3, 5)); + int strDateEndS = Integer.parseInt(strDateEnd.substring(6, 8));// + +// if ((strDateH >= strDateBeginH && strDateH <= strDateEndH)) { +// // 当前时间小时数在开始时间和结束时间小时数之间 +// if (strDateH > strDateBeginH && strDateH < strDateEndH) { +// return true; +// // 当前时间小时数等于开始时间小时数,分钟数在开始和结束之间 +// } else if (strDateH == strDateBeginH && strDateM >= strDateBeginM +// && strDateM <= strDateEndM) { +// return true; +// // 当前时间小时数等于开始时间小时数,分钟数等于开始时间分钟数,秒数在开始和结束之间 +// } else if (strDateH == strDateBeginH && strDateM == strDateBeginM +// && strDateS >= strDateBeginS && strDateS <= strDateEndS) { +// return true; +// } +// // 当前时间小时数大等于开始时间小时数,等于结束时间小时数,分钟数小等于结束时间分钟数 +// else if (strDateH >= strDateBeginH && strDateH == strDateEndH +// && strDateM <= strDateEndM) { +// return true; +// // 当前时间小时数大等于开始时间小时数,等于结束时间小时数,分钟数等于结束时间分钟数,秒数小等于结束时间秒数 +// } else if (strDateH >= strDateBeginH && strDateH == strDateEndH +// && strDateM == strDateEndM && strDateS <= strDateEndS) { +// return true; +// } else { +// return false; +// } +// } else { +// return false; +// } + if (strDateS >= strDateBeginS && strDateS < strDateEndS) { + return true; + }else { + return false; + } + + } + + /** + * 当前时间向推几小时 + * @param ihour 小时 + * @return String + */ + public static String dateRoll(int ihour,String curDate) { + try{ + DateTimeFormatter df1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + //获取当前时间 + LocalDateTime date = LocalDateTime.now(); + if (curDate.length()>0){ + date=dateConvertToLocalDateTime(df2.parse(curDate)); + } + //获取当前时间的前几小时时间 + LocalDateTime localDateTime = date.minusHours(ihour); + return df1.format(localDateTime); + }catch (Exception e){ + return ""; + } + } + + //获取当前时间前几分钟 + public static String dateTime(int a,String curDate) { + try{ + // 设置传入的时间格式 + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String currentTime="";//当前时间 + Calendar cal=Calendar.getInstance(); + if (curDate.length()>0){ + Date date = df.parse(curDate); + cal.setTime(date); + } + cal.add(Calendar.MINUTE,-a);// a分钟之前的时间 + //格式化指定形式的时间 + currentTime = df.format(cal.getTime());//获取到完整的时间 + return currentTime; + }catch (Exception e){ + return ""; + } + } + + //将java.util.Date 转换为java8 的java.time.LocalDateTime,默认时区为东8区 + public static LocalDateTime dateConvertToLocalDateTime(Date date) { + return date.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime(); + } + + + //将java8 的 java.time.LocalDateTime 转换为 java.util.Date,默认时区为东8区 + public static Date localDateTimeConvertToDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.toInstant(ZoneOffset.of("+8"))); + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/FileUtils.java b/user-service/src/main/java/com/mh/user/utils/FileUtils.java new file mode 100644 index 0000000..15c5955 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/FileUtils.java @@ -0,0 +1,66 @@ +package com.mh.user.utils; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +/** + * @author ljf + * @title : + * @description : 创建文件 + * @updateTime 2020-09-17 + * @throws : + */ +public class FileUtils { + + public static void createFileAndWrite(String writeStr, int type) { + + String timeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + String fileName = "D:/meterLog"+timeStr+".txt"; + File file = new File(fileName); + try { + if (!file.exists()) { + file.createNewFile(); + } + } catch (IOException e) { + e.printStackTrace(); + } + Path path = Paths.get(fileName); + // 使用newBufferedWriter创建文件并写文件 + // 这里使用了try-with-resources方法来关闭流,不用手动关闭 +// try (BufferedWriter writer = +// Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { +// writer.write("Hello World -创建文件!!"); +// } catch (IOException e) { +// e.printStackTrace(); +// } + + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) + .append(" ") + .append(writeStr); + if (1==type) { + stringBuilder.append(" 接收到的报文\t\n"); + } else { + stringBuilder.append(" 发送的报文\t\n"); + } + //追加写模式 + try (BufferedWriter writer = + Files.newBufferedWriter(path, + StandardCharsets.UTF_8, + StandardOpenOption.APPEND)){ + writer.write(stringBuilder.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java b/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java new file mode 100644 index 0000000..876cc4d --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java @@ -0,0 +1,413 @@ +package com.mh.user.utils; + +import com.mh.user.entity.*; +import com.mh.user.model.OrderParamModel; +import com.mh.user.serialport.SerialPortThread; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.DeviceInstallService; +import com.mh.user.service.RegisterAddrService; +import com.mh.user.service.chillers.GatewayManageService; +import com.mh.user.service.chillers.OrderMessageService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.Get; +import org.apache.log4j.Logger; +import org.springframework.context.ApplicationContext; + +import javax.imageio.spi.RegisterableService; +import java.net.UnknownHostException; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static com.mh.user.utils.ExchangeStringUtil.doubleTrans1; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-04-22 + * @throws : + */ +//@Slf4j +public class GetReadOrder485 { + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + OrderMessageService orderMessageService = context.getBean(OrderMessageService.class); + RegisterAddrService registerAddrService = context.getBean(RegisterAddrService.class); + DeviceInstallService deviceInstallService=context.getBean(DeviceInstallService.class); + DeviceCodeParamService deviceCodeParamService=context.getBean(DeviceCodeParamService.class); + + private static final Logger log = Logger.getLogger(SerialPortThread.class); + // 电表 + public static String createMeterOrder(DeviceCodeParamEntity deviceCodeParam){ + String str=null; + String deviceAddr=deviceCodeParam.getDeviceAddr(); + String registerAddr=deviceCodeParam.getRegisterAddr(); + + if (deviceAddr!=null && deviceAddr.length()>0){ + try{ + //0代表前面补充0,12代表长度为12,d代表参数为正数型,基表通讯号 + str = String.format("%012d", Long.parseLong(deviceAddr)); + //转换位置 + str = ExchangeStringUtil.changePosition(str); + //拼接功能码 + str = "68" + str + "680102"; + String strData=""; + if (registerAddr!=null && registerAddr.length()>0 && registerAddr.equalsIgnoreCase("9010")){ +// str = "68" + str + "680102"; + strData = "1090"; + }else if (registerAddr.equalsIgnoreCase("B630")){ + strData = "30B6"; +// str = "68" + str + "681104"; +// strData = "00000302"; + } + + //加33操作 + str = str + ExchangeStringUtil.addThree(strData); + //检验和 + String checkSum = ExchangeStringUtil.makeChecksum(str); + str = "FEFEFE" + str + checkSum + "16"; + + }catch (Exception e){ + e.printStackTrace(); + } + } + log.info("send meter message ===>" + str); + return str.toUpperCase(); + } + + // 水表 + public static String createWtMeterOrder(DeviceCodeParamEntity deviceCodeParam){ + String deviceAddr=deviceCodeParam.getDeviceAddr(); + String brand=deviceCodeParam.getBrand(); + String str=null; + if(deviceAddr!=null && deviceAddr.length()>0){ + try{ + if (brand==null || brand.equals("") || brand.equals("艾美柯")){ + // 0 代表前面补充0,14 代表长度为14,d 代表参数为正数型 + str = String.format("%014d", Long.parseLong(deviceAddr));//基表通讯号 + // 转换位置 + str = ExchangeStringUtil.changePosition(str); + // 拼接功能码 + str = "6810" + str + "0103901F00"; //水表读读数指令 + // 检验和 + String checkSum = ExchangeStringUtil.makeChecksum(str); + str = "FEFEFE" + str + checkSum + "16"; + + }else if(brand.equals("脉冲")){ + str = ExchangeStringUtil.decToHex(deviceAddr); + str=ExchangeStringUtil.addZeroForNum(str,2); + str=str+"0302020002";//读表累计值 + + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(str); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + str = str + checkWord; + } + }catch (Exception e){ + e.printStackTrace(); + } + } + log.info("send wtMeter message ===>" + str); + return str.toUpperCase(); + } + + // 冷量计 + public static String createCloudOrder(DeviceCodeParamEntity deviceCodeParam){ + // 0 代表前面补充0,2 代表长度为2,d 代表参数为正数型 + String cloudNum=deviceCodeParam.getDeviceAddr(); + String str = ExchangeStringUtil.decToHex(cloudNum); + str=ExchangeStringUtil.addZeroForNum(str,2); + String cloudType=deviceCodeParam.getRegisterAddr(); + if (cloudType.equalsIgnoreCase("4")){ //温控设备,地址为十六进制 + str = str + "0300000002"; + } else if (cloudType.equalsIgnoreCase("31")){ //流量计冷冻水量 + str = str + "0300080002"; + } else if (cloudType.equalsIgnoreCase("32")){ // 流量计出水温度 + str = str + "0300490002"; + } else if (cloudType.equalsIgnoreCase("33")){ // 流量计回水温度 + str = str + "03004B0002"; + } else if (cloudType.equalsIgnoreCase("34")){ // 流量计冷量累积量 + str = str + "0300500002"; + } else if (cloudType.equalsIgnoreCase("35")){ // 瞬时流量/小时 + str = str + "0300040002"; //0300000002(秒)、0300020002(分)、0300040002(时) + } + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(str); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + str = str + checkWord; + +// str = ExchangeStringUtil.getCRCStr(str); + log.info("send cloud message ===>" + str); + return str.toUpperCase(); + } + + /** + * @param DeviceCodeParam + * @return + */ + public static String createChillersOrder(DeviceCodeParamEntity DeviceCodeParam) { + String str = null; + try { + // 获取冷水机组地址 + String chillerAddr = DeviceCodeParam.getDeviceAddr(); + chillerAddr = ExchangeStringUtil.decToHex(chillerAddr); + String str1 = ExchangeStringUtil.addZeroForNum(chillerAddr, 2); + // 获取功能码 + String funCode = DeviceCodeParam.getFunCode(); + str1 = str1 + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(funCode),2); + // 寄存器地址 + String registerAddr = DeviceCodeParam.getRegisterAddr(); + str1 = str1 + ExchangeStringUtil.addZeroForNum(registerAddr,4) + "0001"; + log.info(str1); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(str1); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + str = str1 + checkWord; + } catch (Exception e) { + e.printStackTrace(); + } + log.info("send chiller message ===>" + str); + return str.toUpperCase(); + } + + // DDC 设备指令生成 + // 服务端 IP(HEX) + 端口(HEX) + 设备地址号(HEX) + CRC16 校验 + public static String createDDCOrder(ChillersEntity chillersEntity) { + String result = ""; + // 把IP地址转为16进制 + String ip = ExchangeStringUtil.ipToHex(chillersEntity.getIP()); + // 端口号转为16进制 + String port = ExchangeStringUtil.decToHex(String.valueOf(chillersEntity.getPort())); + // DDC地址 + String ddcAddr = ExchangeStringUtil.decToHex(chillersEntity.getDdcAddr()); + // 拼接成采集报文 + result = ip + port + ddcAddr; + // 得出校验位后的值 + result = ExchangeStringUtil.getCRCStr(result); + return result; + } + + // 生成对设备操作指令 + public List createOrder(List orderEntityList) throws InterruptedException, ParseException { + List orderMessageEntityList = new ArrayList<>(); + ChillersEntity chillersEntity = new ChillersEntity(); + // 格式化时间 + SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 判断是否是有修改频率操作:size=2:频率+启停;size=1:启停 + if (orderEntityList.size() == 1) { + // 启停状态 + for (OrderEntity orderEntity: + orderEntityList) { + if (orderEntity.getType() == 3 || orderEntity.getType() == 4 + || orderEntity.getType().equals("3") || orderEntity.getType().equals("4")) { + // 不用查询对应的父ID对应的值 + chillersEntity = orderMessageService.queryChillerById(orderEntity.getId()); + } else { + // 查询父ID是其ID的对应数据 + // 得到对应的寄存器地址 + chillersEntity = orderMessageService.queryChiller(orderEntity.getId()); + } + // 拼接数据库采集操作报文 + StringBuilder orderStr = new StringBuilder("000000000006010600"); + // 比如1.6Mpa传入为160的十六进制 + if (orderEntity.getType() == 5 || orderEntity.getType().equals("5")) { + orderStr.append(chillersEntity.getRegisterAddress()); + orderStr.append("00"); + orderStr.append(ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(doubleTrans1(Double.parseDouble(orderEntity.getParam()) * 100)),2)); + } else if (orderEntity.getType() == 4 || orderEntity.getType().equals("4")) { // 修改温度*10倍 + orderStr.append(chillersEntity.getRegisterAddress()); + orderStr.append(ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(doubleTrans1(Double.parseDouble(orderEntity.getParam()) * 10)),4)); + } else { + orderStr.append(chillersEntity.getRegisterAddress()); + orderStr.append(ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(orderEntity.getParam()), 4)); + } + // 存入orderMessageEntity数组中 + OrderMessageEntity orderMessageEntity = new OrderMessageEntity(); + orderMessageEntity.setRegisterAddr(chillersEntity.getRegisterAddress()); + orderMessageEntity.setRegisterName(chillersEntity.getRegisterName()); + orderMessageEntity.setOtherName(chillersEntity.getOtherName()); + orderMessageEntity.setOrderStr(orderStr.toString()); + orderMessageEntity.setSendTime(null); + orderMessageEntity.setSendNum(0); + orderMessageEntity.setStatus(0); + orderMessageEntity.setGrade(0); + orderMessageEntity.setCreateTime(sdf1.parse(sdf1.format(new Date()))); + orderMessageEntityList.add(orderMessageEntity); + } + } else if (orderEntityList.size() == 2) { + // 启停 + String status = ""; + // 频率 + String rate = ""; + // 查询父ID是其ID的对应数据 + for (OrderEntity orderEntity: + orderEntityList) { + if (orderEntity.getType() == 1 || orderEntity.getType().equals("1")) { // 修改开关状态 + // 得到对应的寄存器地址 + // 统一查询启停状态对应的就好 + chillersEntity = orderMessageService.queryChiller(orderEntity.getId()); + status = ExchangeStringUtil.decToHex(orderEntity.getParam()); + } else if (orderEntity.getType() == 0 || orderEntity.getType().equals("0")) { // 修改频率,精确到0.5,发送到DDC需要乘以2,update by ljf on 2020-06-16 + rate = doubleTrans1(Double.parseDouble(orderEntity.getParam()) * 2); + rate = ExchangeStringUtil.decToHex(rate); + } + } + log.info("寄存器地址: " + chillersEntity.getRegisterAddress()); + // 拼接数据库采集操作报文 + String orderStr = "000000000006010600" + + chillersEntity.getRegisterAddress() + + ExchangeStringUtil.addZeroForNum(rate,2) + + ExchangeStringUtil.addZeroForNum(status,2); + // 存入orderMessageEntity数组中 + OrderMessageEntity orderMessageEntity = new OrderMessageEntity(); + orderMessageEntity.setRegisterAddr(chillersEntity.getRegisterAddress()); + orderMessageEntity.setRegisterName(chillersEntity.getRegisterName()); + orderMessageEntity.setOtherName(chillersEntity.getOtherName()); + orderMessageEntity.setOrderStr(orderStr); + orderMessageEntity.setSendTime(null); + orderMessageEntity.setSendNum(0); + orderMessageEntity.setStatus(0); + orderMessageEntity.setGrade(0); + orderMessageEntity.setCreateTime(sdf1.parse(sdf1.format(new Date()))); + orderMessageEntityList.add(orderMessageEntity); + } + // 增加读取对应DDC关联设备的状态值 update by ljf on 2020-06-04 + Thread.sleep(1500); + if (chillersEntity.getDdcAddr() != null || !chillersEntity.getDdcAddr().equalsIgnoreCase("")) { + String ddcRead = createDDCOrder(chillersEntity); + // 存入orderMessageEntity数组中 + OrderMessageEntity orderMessageEntity = new OrderMessageEntity(); + orderMessageEntity.setRegisterAddr(chillersEntity.getRegisterAddress()); + orderMessageEntity.setRegisterName(chillersEntity.getRegisterName()); + orderMessageEntity.setOtherName(chillersEntity.getOtherName()); + orderMessageEntity.setOrderStr(ddcRead); + orderMessageEntity.setSendTime(null); + orderMessageEntity.setSendNum(0); + orderMessageEntity.setStatus(0); + orderMessageEntity.setGrade(0); + orderMessageEntity.setCreateTime(sdf1.parse(sdf1.format(new Date()))); + orderMessageEntityList.add(orderMessageEntity); + } + // 批量插入数据库 + orderMessageService.batchInsertOrderMessage(orderMessageEntityList); + return orderMessageEntityList; + } + + // 生成对设备操作指令参数 + public void createOrderParam(String ProjectID){ + List deviceList1; + List deviceCodeParamEntityList = new ArrayList<>(); + int r=0; + if(ProjectID!=null && !ProjectID.equals("")){ + r=deviceCodeParamService.queryCount(ProjectID);//查询记录数 + }else{ + r=deviceCodeParamService.queryCount2();//查询记录数 + } + if (r==0){ + if(ProjectID!=null && !ProjectID.equals("")){ + deviceList1=deviceInstallService.selectDeviceParams(ProjectID);//查找多个采集参数的设备,多个 + }else{ + deviceList1=deviceInstallService.selectDeviceParams2(); + } + + System.out.println("========================生成采集参数======================="); + if (deviceList1.size()>0){ + for (DeviceInstallEntity devices:deviceList1) { + if (devices.getDeviceType().equals("冷量计")){ + //流量计冷冻水 + DeviceCodeParamEntity deviceCodeParamEntity1 = new DeviceCodeParamEntity(); + deviceCodeParamEntity1.setRegisterAddr("34"); + deviceCodeParamEntity1.setFunCode("03"); + deviceCodeParamEntity1.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity1.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity1.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity1.setBaudRate(devices.getBaudRate()); + deviceCodeParamEntity1.setBrand(devices.getBrand()); + deviceCodeParamEntity1.setDataPort(devices.getDataPort()); + deviceCodeParamEntity1.setProjectID(devices.getProjectID()); + deviceCodeParamEntity1.setParity(devices.getParity()); + deviceCodeParamEntity1.setGrade(devices.getGrade()); + deviceCodeParamEntity1.setDigit(0); //保留0小数位 + deviceCodeParamEntity1.setRegisterName("累积量"); + String strData1=createCloudOrder(deviceCodeParamEntity1); + deviceCodeParamEntity1.setStrData(strData1); + deviceCodeParamEntityList.add(deviceCodeParamEntity1);//添加到列表 + //流量计冷量累积量 + DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity(); + deviceCodeParamEntity2.setRegisterAddr("35"); + deviceCodeParamEntity2.setFunCode("03"); + deviceCodeParamEntity2.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity2.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity2.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity2.setBaudRate(devices.getBaudRate()); + deviceCodeParamEntity2.setBrand(devices.getBrand()); + deviceCodeParamEntity2.setDataPort(devices.getDataPort()); + deviceCodeParamEntity2.setProjectID(devices.getProjectID()); + deviceCodeParamEntity2.setParity(devices.getParity()); + deviceCodeParamEntity2.setGrade(devices.getGrade()); + deviceCodeParamEntity2.setDigit(2); //保留小数位 + deviceCodeParamEntity2.setRegisterName("瞬时流量"); + String strData2=createCloudOrder(deviceCodeParamEntity2); + deviceCodeParamEntity2.setStrData(strData2); + deviceCodeParamEntityList.add(deviceCodeParamEntity2); + + }else if (devices.getDeviceType().equals("电表")){ + DeviceCodeParamEntity deviceCodeParamEntity1 = new DeviceCodeParamEntity(); + deviceCodeParamEntity1.setRegisterAddr("9010"); + deviceCodeParamEntity1.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity1.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity1.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity1.setBaudRate(devices.getBaudRate()); + deviceCodeParamEntity1.setBrand(devices.getBrand()); + deviceCodeParamEntity1.setDataPort(devices.getDataPort()); + deviceCodeParamEntity1.setProjectID(devices.getProjectID()); + deviceCodeParamEntity1.setParity(devices.getParity()); + deviceCodeParamEntity1.setGrade(devices.getGrade()); + deviceCodeParamEntity1.setDigit(2); //保留小数位 + deviceCodeParamEntity1.setRegisterName("总电量"); + String strData1=createMeterOrder(deviceCodeParamEntity1);//生成电表指令 + deviceCodeParamEntity1.setStrData(strData1); + deviceCodeParamEntityList.add(deviceCodeParamEntity1); + }else if(devices.getDeviceType().equals("冷水机")){ + List regList=registerAddrService.selectRegisterAddr(); + if(regList.size()>0){ + for(RegisterAddrEntity reg:regList){ + DeviceCodeParamEntity deviceCodeParamEntity1 = new DeviceCodeParamEntity(); + deviceCodeParamEntity1.setRegisterAddr(reg.getRegisterAddr()); //参数寄存器地址 + String funFlag=ExchangeStringUtil.addZeroForNum(String.valueOf(reg.getFunFlag()),2); + deviceCodeParamEntity1.setFunCode(funFlag); //功能码 + deviceCodeParamEntity1.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity1.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity1.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity1.setBaudRate(devices.getBaudRate()); + deviceCodeParamEntity1.setBrand(devices.getBrand()); + deviceCodeParamEntity1.setDataPort(devices.getDataPort()); + deviceCodeParamEntity1.setProjectID(devices.getProjectID()); + deviceCodeParamEntity1.setParity(devices.getParity()); + deviceCodeParamEntity1.setGrade(devices.getGrade()); + + deviceCodeParamEntity1.setDigit(reg.getFloatFlag()); //保留小数位 + deviceCodeParamEntity1.setRegisterName(reg.getRegName()); //寄存器名称 + String strData1=createChillersOrder(deviceCodeParamEntity1);//生成冷水机指令 + deviceCodeParamEntity1.setStrData(strData1); + deviceCodeParamEntityList.add(deviceCodeParamEntity1); + } + } + } + } + deviceCodeParamService.insertDeviceCodeParamList(deviceCodeParamEntityList); + } + } + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/HeartUtil.java b/user-service/src/main/java/com/mh/user/utils/HeartUtil.java new file mode 100644 index 0000000..2433c17 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/HeartUtil.java @@ -0,0 +1,79 @@ +package com.mh.user.utils; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author ljf + * @title : + * @description : 处理解析第一次上来报文和心跳包处理 + * 减少创建实例,采用单例模式 + * @updateTime 2020-10-23 + * @throws : + */ +@Slf4j +public class HeartUtil { + + // 创建私有构造函数 + private HeartUtil(){} + + // 创建单例 + public static HeartUtil heartUtil = null; + + // 创建过程 + public static HeartUtil getInstance() { + if (null == heartUtil) { + heartUtil = new HeartUtil(); + } + return heartUtil; + } + + public String firstMessage(String receiveData) { + receiveData = receiveData.toUpperCase(); + if (receiveData.startsWith("24")) { + int receiveDataLen = receiveData.length(); + // 截取DTUId + String DTUId = receiveData.substring(2,10); + DTUId = ExchangeStringUtil.hexToDec(DTUId); + // 截取包类型 + // 1) 0x00: 报告 IMSI + // 2) 0x01: 高优先级切换时间设置反馈 + // 3) 0x02: IP 地址/域名信息设置反馈 + // 4) 0x03: 心跳包 + // 5) 0x04: 心跳时间(单位分钟)设置反馈 + // 6) 0x05: 报告固件版本 + // 7) 0x06: 保留 + // 8) 0x08: 远程 AT 命令反馈 + String frameType = receiveData.substring(10,12); + if ("00".equalsIgnoreCase(frameType)) { + // 报告IMSI号,更新最新上线时间 + log.info("提交IMSI号"); + } else if ("03".equalsIgnoreCase(frameType)) { + // 心跳包,更新最新上线时间 + log.info("心跳包管理"); + } + // 截取数据长度 + String len = ExchangeStringUtil.hexToDec(receiveData.substring(12,16)); + int dataEndIndex = 16+(Integer.parseInt(len)*2); + // 截取数据域 + String data = receiveData.substring(16,dataEndIndex); + // 截取校验位 + String oldCRC16 = receiveData.substring(dataEndIndex,receiveDataLen/2); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(receiveData.substring(0,dataEndIndex)); + String myCRC16 = ExchangeStringUtil.decToHex(String.valueOf(CRC16.CRC16_XMODEM(strOrder))); + if (oldCRC16.equalsIgnoreCase(myCRC16)) { + // 验证成功,比较两边 + String firstStr = receiveData.substring(0,receiveDataLen/2); + String secondStr = receiveData.substring(receiveDataLen/2); + secondStr = ExchangeStringUtil.changePosition(secondStr); + if (firstStr.equalsIgnoreCase(secondStr)) { + // 验证刚刚开始报文或者心跳包 + // 更新网关管理 + log.info("网关ID: " + DTUId); + return DTUId; + } + } + + } + return null; + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/HttpUtils.java b/user-service/src/main/java/com/mh/user/utils/HttpUtils.java new file mode 100644 index 0000000..67571ea --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/HttpUtils.java @@ -0,0 +1,44 @@ +package com.mh.user.utils; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.mh.common.http.HttpResult; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import com.alibaba.fastjson.JSONObject; + +/** + * HTTP工具类 + * @author Louis + * @date Oct 29, 2018 + */ +public class HttpUtils { + + /** + * 获取HttpServletRequest对象 + * @return + */ + public static HttpServletRequest getHttpServletRequest() { + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + } + + /** + * 输出信息到浏览器 + * @param response + * @param msg + * @throws IOException + */ + public static void print(HttpServletResponse response, int code, String msg) throws IOException { + response.setContentType("application/json; charset=utf-8"); + HttpResult result = HttpResult.error(code, msg); + String json = JSONObject.toJSONString(result); + response.getWriter().print(json); + response.getWriter().flush(); + response.getWriter().close(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/IPUtils.java b/user-service/src/main/java/com/mh/user/utils/IPUtils.java new file mode 100644 index 0000000..abb7e6f --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/IPUtils.java @@ -0,0 +1,67 @@ +package com.mh.user.utils; + +import javax.servlet.http.HttpServletRequest; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * IP相关工具类 + */ +public class IPUtils { + private static Logger logger = LoggerFactory.getLogger(IPUtils.class); + + /** + * 获取IP地址 + * + * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址 + * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址 + */ + public static String getIpAddr(HttpServletRequest request) { + String ip = null; + try { + ip = request.getHeader("x-forwarded-for"); + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + } catch (Exception e) { + logger.error("IPUtils ERROR ", e); + } + +// //使用代理,则获取第一个IP地址 +// if(StringUtils.isEmpty(ip) && ip.length() > 15) { +// if(ip.indexOf(",") > 0) { +// ip = ip.substring(0, ip.indexOf(",")); +// } +// } + + return ip; + } + + public static String getRemoteIp() { + HttpServletRequest request = null; + try { + request = + ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); + } catch (Exception e) { + System.out.println("Can not get current IP."); + } + return request.getRemoteAddr(); + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/JwtTokenUtils.java b/user-service/src/main/java/com/mh/user/utils/JwtTokenUtils.java new file mode 100644 index 0000000..c45dc1b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/JwtTokenUtils.java @@ -0,0 +1,216 @@ +package com.mh.user.utils; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import com.mh.user.security.GrantedAuthorityImpl; +import com.mh.user.security.JwtAuthenticatioToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +/** + * JWT工具类 + * @author Louis + * @date Jan 14, 2019 + */ +public class JwtTokenUtils implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 用户名称 + */ + private static final String USERNAME = Claims.SUBJECT; + /** + * 创建时间 + */ + private static final String CREATED = "created"; + /** + * 权限列表 + */ + private static final String AUTHORITIES = "authorities"; + /** + * 密钥 + */ + private static final String SECRET = "abcdefgh"; + /** + * 有效期12小时 + */ + private static final long EXPIRE_TIME = 12 * 60 * 60 * 1000; + + /** + * 生成令牌 + * + * @param + * @return 令牌 + */ + public static String generateToken(Authentication authentication) { + Map claims = new HashMap<>(3); + claims.put(USERNAME, SecurityUtils.getUsername(authentication)); + claims.put(CREATED, new Date()); + claims.put(AUTHORITIES, authentication.getAuthorities()); + return generateToken(claims); + } + + /** + * 从数据声明生成令牌 + * + * @param claims 数据声明 + * @return 令牌 + */ + private static String generateToken(Map claims) { + Date expirationDate = new Date(System.currentTimeMillis() + EXPIRE_TIME); + return Jwts.builder().setClaims(claims).setExpiration(expirationDate).signWith(SignatureAlgorithm.HS256, SECRET).compact(); + } + + /** + * 从令牌中获取用户名 + * + * @param token 令牌 + * @return 用户名 + */ + public static String getUsernameFromToken(String token) { + String username; + try { + Claims claims = getClaimsFromToken(token); + username = claims.getSubject(); + } catch (Exception e) { + username = null; + } + return username; + } + + /** + * 根据请求令牌获取登录认证信息 + * @param + * @return 用户名 + */ + public static Authentication getAuthenticationeFromToken(HttpServletRequest request) { + Authentication authentication = null; + // 获取请求携带的令牌 + String token = JwtTokenUtils.getToken(request); + System.out.println("获取请求携带的令牌"+token); + if(token != null) { + // 请求令牌不能为空 + if(SecurityUtils.getAuthentication() == null) { + // 上下文中Authentication为空 + Claims claims = getClaimsFromToken(token); + if(claims == null) { + return null; + } + String username = claims.getSubject(); + if(username == null) { + return null; + } + if(isTokenExpired(token)) { + return null; + } + Object authors = claims.get(AUTHORITIES); + List authorities = new ArrayList(); + if (authors != null && authors instanceof List) { + for (Object object : (List) authors) { + authorities.add(new GrantedAuthorityImpl((String) ((Map) object).get("authority"))); + } + } + + authentication = new JwtAuthenticatioToken(username, null, authorities, token); + } else { + if(validateToken(token, SecurityUtils.getUsername())) { + // 如果上下文中Authentication非空,且请求令牌合法,直接返回当前登录认证信息 + authentication = SecurityUtils.getAuthentication(); + } + } + } + System.out.println("获取认证:"+authentication); + return authentication; + } + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + private static Claims getClaimsFromToken(String token) { + Claims claims; + try { + claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody(); + } catch (Exception e) { + claims = null; + } + return claims; + } + + /** + * 验证令牌 + * @param token + * @param username + * @return + */ + public static Boolean validateToken(String token, String username) { + String userName = getUsernameFromToken(token); + return (userName.equals(username) && !isTokenExpired(token)); + } + + /** + * 刷新令牌 + * @param token + * @return + */ + public static String refreshToken(String token) { + String refreshedToken; + try { + Claims claims = getClaimsFromToken(token); + claims.put(CREATED, new Date()); + refreshedToken = generateToken(claims); + } catch (Exception e) { + refreshedToken = null; + } + return refreshedToken; + } + + /** + * 判断令牌是否过期 + * + * @param token 令牌 + * @return 是否过期 + */ + public static Boolean isTokenExpired(String token) { + try { + Claims claims = getClaimsFromToken(token); + Date expiration = claims.getExpiration(); + return expiration.before(new Date()); + } catch (Exception e) { + return false; + } + } + + /** + * 获取请求token + * @param request + * @return + */ + public static String getToken(HttpServletRequest request) { + String token = request.getHeader("Authorization"); + String tokenHead = "Bearer "; + if(token == null) { + token = request.getHeader("token"); + } else if(token.contains(tokenHead)){ + token = token.substring(tokenHead.length()); + } + if("".equals(token)) { + token = null; + } + return token; + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/PasswordEncoder.java b/user-service/src/main/java/com/mh/user/utils/PasswordEncoder.java new file mode 100644 index 0000000..d23db50 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/PasswordEncoder.java @@ -0,0 +1,115 @@ +package com.mh.user.utils; + +import java.security.MessageDigest; + +/** + * 密码加密 + * @author Louis + * @date Jan 13, 2019 + */ +public class PasswordEncoder { + + private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", + "e", "f" }; + + private final static String MD5 = "MD5"; + private final static String SHA = "SHA"; + + private Object salt; + private String algorithm; + + public PasswordEncoder(Object salt) { + this(salt, MD5); + } + + public PasswordEncoder(Object salt, String algorithm) { + this.salt = salt; + this.algorithm = algorithm; + } + + /** + * 密码加密 + * @param rawPass + * @return + */ + public String encode(String rawPass) { + String result = null; + try { + MessageDigest md = MessageDigest.getInstance(algorithm); + // 加密后的字符串 + result = byteArrayToHexString(md.digest(mergePasswordAndSalt(rawPass).getBytes("utf-8"))); + } catch (Exception ex) { + } + return result; + } + + /** + * 密码匹配验证 + * @param encPass 密文 + * @param rawPass 明文 + * @return + */ + public boolean matches(String encPass, String rawPass) { + String pass1 = "" + encPass; + String pass2 = encode(rawPass); + + return pass1.equals(pass2); + } + + private String mergePasswordAndSalt(String password) { + if (password == null) { + password = ""; + } + + if ((salt == null) || "".equals(salt)) { + return password; + } else { + return password + "{" + salt.toString() + "}"; + } + } + + /** + * 转换字节数组为16进制字串 + * + * @param b + * 字节数组 + * @return 16进制字串 + */ + private String byteArrayToHexString(byte[] b) { + StringBuffer resultSb = new StringBuffer(); + for (int i = 0; i < b.length; i++) { + resultSb.append(byteToHexString(b[i])); + } + return resultSb.toString(); + } + + /** + * 将字节转换为16进制 + * @param b + * @return + */ + private static String byteToHexString(byte b) { + int n = b; + if (n < 0) + n = 256 + n; + int d1 = n / 16; + int d2 = n % 16; + return hexDigits[d1] + hexDigits[d2]; + } + +// public static void main(String[] args) { +// String salt = "helloworld"; +// PasswordEncoder encoderMd5 = new PasswordEncoder(salt, "MD5"); +// String encode = encoderMd5.encode("test"); +// System.out.println(encode); +// boolean passwordValid = encoderMd5.validPassword("1bd98ed329aebc7b2f89424b5a38926e", "test"); +// System.out.println(passwordValid); +// +// PasswordEncoder encoderSha = new PasswordEncoder(salt, "SHA"); +// String pass2 = encoderSha.encode("test"); +// System.out.println(pass2); +// boolean passwordValid2 = encoderSha.validPassword("1bd98ed329aebc7b2f89424b5a38926e", "test"); +// System.out.println(passwordValid2); +// } + +} \ No newline at end of file diff --git a/user-service/src/main/java/com/mh/user/utils/PasswordUtils.java b/user-service/src/main/java/com/mh/user/utils/PasswordUtils.java new file mode 100644 index 0000000..54e34e3 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/PasswordUtils.java @@ -0,0 +1,40 @@ +package com.mh.user.utils; + +import java.util.UUID; + +/** + * 密码工具类 + * @author Louis + * @date Sep 1, 2018 + */ +public class PasswordUtils { + + /** + * 匹配密码 + * @param salt 盐 + * @param rawPass 明文 + * @param encPass 密文 + * @return + */ + public static boolean matches(String salt, String rawPass, String encPass) { + return new PasswordEncoder(salt).matches(encPass, rawPass); + } + + /** + * 明文密码加密 + * @param rawPass 明文 + * @param salt + * @return + */ + public static String encode(String rawPass, String salt) { + return new PasswordEncoder(salt).encode(rawPass); + } + + /** + * 获取加密盐 + * @return + */ + public static String getSalt() { + return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 20); + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/QuerySendThread.java b/user-service/src/main/java/com/mh/user/utils/QuerySendThread.java new file mode 100644 index 0000000..79bd3e2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/QuerySendThread.java @@ -0,0 +1,38 @@ +package com.mh.user.utils; + +import com.mh.user.constants.Constant; +import lombok.extern.slf4j.Slf4j; + +/** + * @author ljf + * @title : + * @description : 查询指令发送指令 + * @updateTime 2020-05-29 + * @throws : + */ +@Slf4j +public class QuerySendThread extends Thread { + + public boolean stop = false; + private int i = 0; + + public void run(){ + while (!Constant.SEND_STATUS && !stop){ + try { + i = i + 1; + sleep(1); + if (i > 15000) + { + stop = true; + } + } catch (InterruptedException e){ + log.info(e.getMessage()); + } + } + stop = false; + } + + + + +} diff --git a/user-service/src/main/java/com/mh/user/utils/SecurityUtils.java b/user-service/src/main/java/com/mh/user/utils/SecurityUtils.java new file mode 100644 index 0000000..ffe4b74 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/SecurityUtils.java @@ -0,0 +1,107 @@ +package com.mh.user.utils; + +import javax.servlet.http.HttpServletRequest; + +import com.mh.user.security.JwtAuthenticatioToken; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; + +import java.util.Date; + +/** + * Security相关操作 + * @author Louis + * @date Jan 14, 2019 + */ +public class SecurityUtils { + + /** + * 系统登录认证 + * @param request + * @param username + * @param password + * @param authenticationManager + * @return + */ + public static JwtAuthenticatioToken login(HttpServletRequest request, String username, String password, AuthenticationManager authenticationManager) { + JwtAuthenticatioToken token = new JwtAuthenticatioToken(username, password); + token.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + // 执行登录认证过程 + Authentication authentication = authenticationManager.authenticate(token); + // 认证成功存储认证信息到上下文 + SecurityContextHolder.getContext().setAuthentication(authentication); + // 生成令牌并返回给客户端 + token.setToken(JwtTokenUtils.generateToken(authentication)); + System.out.println("返回token到前端!"); + return token; + } + + /** + * 获取令牌进行认证 + * @param request + */ + public static void checkAuthentication(HttpServletRequest request) { + // 获取令牌并根据令牌获取登录认证信息 + Authentication authentication = JwtTokenUtils.getAuthenticationeFromToken(request); + System.out.println("认证:"+authentication); + // 设置登录认证信息到上下文 + SecurityContextHolder.getContext().setAuthentication(authentication); + } + + /** + * 获取当前用户名 + * @return + */ + public static String getUsername() { + String username = null; + Authentication authentication = getAuthentication(); + if(authentication != null) { + Object principal = authentication.getPrincipal(); + if(principal != null && principal instanceof UserDetails) { + username = ((UserDetails) principal).getUsername(); + } + } + return username; + } + + /** + * 获取用户名 anonymousUser + * @return + */ + public static String getUsername(Authentication authentication) { + String username = null; + if(authentication != null) { + Object principal = authentication.getPrincipal(); + if(principal != null && principal instanceof UserDetails) { + username = ((UserDetails) principal).getUsername(); + } + } + return username; + } + + /** + * 获取当前登录时间 + * @return + */ + public static Date getLoginTime() { + Date date=new Date(); + return date; + } + + /** + * 获取当前登录信息 + * @return + */ + public static Authentication getAuthentication() { + if(SecurityContextHolder.getContext() == null) { + return null; + } + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + return authentication; + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/SendOrderUtils.java b/user-service/src/main/java/com/mh/user/utils/SendOrderUtils.java new file mode 100644 index 0000000..4bd5927 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/SendOrderUtils.java @@ -0,0 +1,191 @@ +package com.mh.user.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.mh.user.entity.ChillersEntity; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.model.OrderParamModel; +import com.mh.user.serialport.SerialPortListener; +import com.mh.user.serialport.SerialPortSendReceive; +import com.mh.user.serialport.SerialPortUtil; +import com.mh.user.serialport.SerialTool; +//import purejavacomm.SerialPort; +import gnu.io.SerialPort; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import lombok.extern.slf4j.Slf4j; +import org.apache.log4j.Logger; + +/** + * @author ljf + * @title : + * @description : 发送指令工具类 + * @updateTime 2021-01-26 + * @throws : + */ +//@Slf4j +public class SendOrderUtils { + + private static final Logger log = Logger.getLogger(SendOrderUtils.class); + /** + * 发送采集冷水机组 + * @param deviceCodeParam + * @param ctx + * @param num + * @param size + */ + public static void sendChillersOrder(DeviceCodeParamEntity deviceCodeParam, ChannelHandlerContext ctx, int num, int size) { + // 继续发送下一个采集冷水机设备指令 + GetReadOrder485 getReadOrder485 = new GetReadOrder485(); + String sendStr = getReadOrder485.createChillersOrder(deviceCodeParam); + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 发送数据 + ctx.channel().writeAndFlush(buffer); + log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size); + } + + public static void sendMeterOrCloud(DeviceCodeParamEntity deviceCodeParam, ChannelHandlerContext ctx, int num, int size) { + if (deviceCodeParam.getDeviceType().equals("电表")) { + sendMeterOrder(deviceCodeParam,ctx,num,size ); + } else if (deviceCodeParam.getDeviceType().equals("流量计")) { + sendCloudOrder(deviceCodeParam,ctx,num,size ); + } + } + /** + * 发送采集电表 + * @param deviceCodeParam + * @param num + * @param size + * @param ctx + */ + + public static void sendMeterOrder(DeviceCodeParamEntity deviceCodeParam, + ChannelHandlerContext ctx, + int num, + int size) { + String sendStr=""; + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 发送数据 + ctx.channel().writeAndFlush(buffer); + log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size); + } + /** + * 发送采集冷量计工具类 + * @param deviceCodeParam + * @param num + * @param size + * @param ctx + */ + public static void sendCloudOrder(DeviceCodeParamEntity deviceCodeParam, + ChannelHandlerContext ctx, + int num, + int size) { + // 创建将要写出的数据 + String sendStr = GetReadOrder485.createCloudOrder(deviceCodeParam); + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 发送数据 + ctx.channel().writeAndFlush(buffer); + log.info("客户端再次往服务端发送数据" + num + " 数据条数:" + size); + } + + //向串口发指令数据 + public static void sendSerialPort(DeviceCodeParamEntity deviceCodeParam,SerialPort serialPort ) { + + String deviceType=deviceCodeParam.getDeviceType(); + String sendStr=null; + if (deviceType.equals("电表")){ + sendStr = GetReadOrder485.createMeterOrder(deviceCodeParam); + }else if (deviceType.equals("水表")){ + sendStr = GetReadOrder485.createWtMeterOrder(deviceCodeParam); + } + + String str=sendStr; + try{ + byte[] HEX = SerialPortListener.hexStr2Byte(str); + SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); + serialPortUtil.sendToPort(serialPort, HEX); + +// SerialTool serialPortUtil = SerialTool.getSerialPortUtil(); +// serialPortUtil.sendToPort(HEX,serialPort); + log.info(deviceType+"向串口"+serialPort+"发送数据>>>>" + str); + }catch (Exception e){ + e.printStackTrace(); + log.error("向串口"+serialPort+"发送数据异常!"); + } + + } + + // 发送所有类型采集报文 + public static void sendAllOrder(DeviceCodeParamEntity deviceCodeParam, ChannelHandlerContext ctx, int num, int size) { +// String deviceType=deviceCodeParam.getDeviceType(); + String sendStr=deviceCodeParam.getStrData(); +// if (deviceType.equals("电表")){ +// sendStr = GetReadOrder485.createMeterOrder(deviceCodeParam); +// }else if(deviceType.equals("水表")){ +// sendStr = GetReadOrder485.createWtMeterOrder(deviceCodeParam); +// }else if(deviceType.equals("冷量计")){ +// sendStr = GetReadOrder485.createCloudOrder(deviceCodeParam); +// }else if(deviceType.equals("冷水机")){ +// sendStr = GetReadOrder485.createChillersOrder(deviceCodeParam); +// } + ByteBuf buffer = getByteBuf(ctx, sendStr); + // 发送数据 + ctx.channel().writeAndFlush(buffer); + log.info("sends :"+sendStr+",num:"+num+",records:"+size); + } + + // 发送所有类型采集报文 + public static void sendAllOrder2(DeviceCodeParamEntity deviceCodeParam, ChannelHandlerContext ctx, String snr,String ip, int num, int size) { + try{ +// String deviceType=deviceCodeParam.getDeviceType(); + String sendStr=""; +// if (deviceType.equals("电表")){ +// sendStr = GetReadOrder485.createMeterOrder(deviceCodeParam); +// }else if(deviceType.equals("水表")){ +// sendStr = GetReadOrder485.createWtMeterOrder(deviceCodeParam); +// }else if(deviceType.equals("冷量计")){ +// sendStr = GetReadOrder485.createCloudOrder(deviceCodeParam); +// }else if(deviceType.equals("冷水机")){ +// sendStr = GetReadOrder485.createChillersOrder(deviceCodeParam); +// } + sendStr=deviceCodeParam.getStrData(); + sendStr=ExchangeStringUtil.hexToBase64(sendStr); + String band=String.valueOf(deviceCodeParam.getBaudRate()); + String parity=deviceCodeParam.getParity(); + //组织 + JSONObject jsonObject= new JSONObject(); + jsonObject.put("snr",snr); + jsonObject.put("cmd","uData"); + jsonObject.put("parity",parity); + jsonObject.put("byteSize","8"); + jsonObject.put("stopbits","1"); + jsonObject.put("ip",ip); + jsonObject.put("ipAddr","192.168.1.202"); + jsonObject.put("name","0000000000"); + jsonObject.put("mode","RS485"); + jsonObject.put("data",sendStr); + jsonObject.put("baud",band); + jsonObject.put("addr","100"); + String str=jsonObject.toString(); +// log.info("send json:"+str); + str=ExchangeStringUtil.strTo16(str); + ByteBuf buffer = getByteBuf(ctx, str); + Thread.sleep(1000); + ctx.channel().writeAndFlush(buffer);// 发送数据 +// log.info("white gateway client sends data to the server==>" + num + ",records==>" +size); + log.info("发送数据到白色网关==>" + num + ",长度==>" +size); + }catch (Exception e){ + e.printStackTrace(); + } + } + + + private static ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { + // 申请一个数据结构存储信息 + ByteBuf buffer = ctx.alloc().buffer(); + // 将信息放入数据结构中 + buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 + return buffer; + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/SimpleWeather.java b/user-service/src/main/java/com/mh/user/utils/SimpleWeather.java new file mode 100644 index 0000000..1a965c6 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/SimpleWeather.java @@ -0,0 +1,146 @@ +package com.mh.user.utils; + +import net.sf.json.JSONObject; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +public class SimpleWeather { + // 天气情况查询接口地址 + public static String API_URL = "http://apis.juhe.cn/simpleWeather/query"; + // 接口请求Key + public static String API_KEY = "108f91d439908e5d2da86cc8881dd3db"; + public static void main(String[] args) { + String cityName = "广州"; + queryWeather(cityName); + } + /** + * 根据城市名查询天气情况 + * + * @param cityName + */ + public static Map queryWeather(String cityName) { + Map params = new HashMap<>();//组合参数 + params.put("city", cityName); + params.put("key", API_KEY); + String queryParams = urlencode(params); + String response = doGet(API_URL, queryParams); + Map map = new HashMap(); + try { + JSONObject jsonObject = JSONObject.fromObject(response); + int error_code = jsonObject.getInt("error_code"); + if (error_code == 0) { + System.out.println("调用接口成功"); + JSONObject result = jsonObject.getJSONObject("result"); + JSONObject realtime = result.getJSONObject("realtime"); + System.out.printf("城市:%s%n", result.getString("city")); + System.out.printf("天气:%s%n", realtime.getString("info")); + System.out.printf("温度:%s%n", realtime.getString("temperature")); + System.out.printf("湿度:%s%n", realtime.getString("humidity")); + System.out.printf("风向:%s%n", realtime.getString("direct")); + System.out.printf("风力:%s%n", realtime.getString("power")); + System.out.printf("空气质量:%s%n", realtime.getString("aqi")); + + map.put("city", result.getString("city"));// 城市 + map.put("info", realtime.getString("info"));// 天气信息 + map.put("temperature", realtime.getString("temperature"));// 温度 + map.put("humidity", realtime.getString("humidity"));//湿度 + map.put("direct", realtime.getString("direct"));// 风向 + map.put("power", realtime.getString("power"));//风力 + map.put("aqi", realtime.getString("aqi"));// 空气质量 + + } else { + System.out.println("调用接口失败:" + jsonObject.getString("reason")); + } + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } + /** + * get方式的http请求 + * + * @param httpUrl 请求地址 + * @return 返回结果 + */ + public static String doGet(String httpUrl, String queryParams) { + HttpURLConnection connection = null; + InputStream inputStream = null; + BufferedReader bufferedReader = null; + String result = null;// 返回结果字符串 + try { + // 创建远程url连接对象 + URL url = new URL(new StringBuffer(httpUrl).append("?").append(queryParams).toString()); + // 通过远程url连接对象打开一个连接,强转成httpURLConnection类 + connection = (HttpURLConnection) url.openConnection(); + // 设置连接方式:get + connection.setRequestMethod("GET"); + // 设置连接主机服务器的超时时间:15000毫秒 + connection.setConnectTimeout(5000); + // 设置读取远程返回的数据时间:60000毫秒 + connection.setReadTimeout(6000); + // 发送请求 + connection.connect(); + // 通过connection连接,获取输入流 + if (connection.getResponseCode() == 200) { + inputStream = connection.getInputStream(); + // 封装输入流,并指定字符集 + bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + // 存放数据 + StringBuilder sbf = new StringBuilder(); + String temp; + while ((temp = bufferedReader.readLine()) != null) { + sbf.append(temp); + sbf.append(System.getProperty("line.separator")); + } + result = sbf.toString(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != bufferedReader) { + try { + bufferedReader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != inputStream) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (connection != null) { + connection.disconnect();// 关闭远程连接 + } + } + return result; + } + /** + * 将map型转为请求参数型 + * + * @param data + * @return + */ + public static String urlencode(Map data) { + StringBuilder sb = new StringBuilder(); + for (Map.Entry i : data.entrySet()) { + try { + sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue() + "", "UTF-8")).append("&"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + String result = sb.toString(); + result = result.substring(0, result.lastIndexOf("&")); + return result; + } +} + diff --git a/user-service/src/main/java/com/mh/user/utils/SpringBeanUtil.java b/user-service/src/main/java/com/mh/user/utils/SpringBeanUtil.java new file mode 100644 index 0000000..51637c4 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/SpringBeanUtil.java @@ -0,0 +1,54 @@ +package com.mh.user.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * + * @ClassName: SpringUtils + * @Description:TODO(spring获取bean类型) + * @author: 铭汉科技—LJF + * @date: 2019年6月14日 下午4:05:44 + * + */ +@Component +public class SpringBeanUtil implements ApplicationContextAware{ + + private static ApplicationContext applicationContext = null; + + @Override + public void setApplicationContext(ApplicationContext arg0) throws BeansException { + // TODO Auto-generated method stub + if (SpringBeanUtil.applicationContext == null) { + SpringBeanUtil.applicationContext = arg0; + } + } + + // 获取applicationContext + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + // 通过Name获取Bean + public static Object getBean(String name) { + return getApplicationContext().getBean(name); + } + + // 通过class获取Bean + public static T getBean(Class claszz) { + return getApplicationContext().getBean(claszz); + } + + // 通过name,以及claszz返回指定的bean + public static T getBean(String name,Class clazz) { + return getApplicationContext().getBean(name,clazz); + } + + public static String getProperty(String key) { + return applicationContext.getBean(Environment.class).getProperty(key); + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/SpringContextUtils.java b/user-service/src/main/java/com/mh/user/utils/SpringContextUtils.java new file mode 100644 index 0000000..dca4d18 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/SpringContextUtils.java @@ -0,0 +1,45 @@ +package com.mh.user.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * @author ljf + * @title :工具类 + * @description :spring或者bean工具类 + * @updateTime 2020-04-01 + * @throws : + */ +@Component +public class SpringContextUtils implements ApplicationContextAware { + private static ApplicationContext applicationContext = null; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + if (SpringContextUtils.applicationContext == null) { + SpringContextUtils.applicationContext = applicationContext; + } + } + + //获取applicationContext + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + //通过name获取 Bean. + public static Object getBean(String name) { + return getApplicationContext().getBean(name); + } + + //通过class获取Bean. + public static T getBean(Class clazz) { + return getApplicationContext().getBean(clazz); + } + + //通过name,以及Clazz返回指定的Bean + public static T getBean(String name, Class clazz) { + return getApplicationContext().getBean(name, clazz); + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/Test.java b/user-service/src/main/java/com/mh/user/utils/Test.java new file mode 100644 index 0000000..e6545c1 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/Test.java @@ -0,0 +1,130 @@ +package com.mh.user.utils; + +import com.mh.user.constants.Constant; +import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.entity.DeviceManageEntity; +import lombok.extern.slf4j.Slf4j; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-15 + * @throws : + */ +@Slf4j +public class Test { + +// @Autowired +// protected DeviceManageService deviceManageService; +// private static Test test ; +// @PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作 +// public void init() { +// test = this; +// test.deviceManageService = this.deviceManageService; +// // 初使化时将已静态化的testService实例化 +// } +// +// //测试调用 +// public void test1(){ +// +// } + + public void myAnalysisCloudOrder485(String receiveData){ + + // 去掉空格 + receiveData = receiveData.replace(" ",""); + + // 检验报文 + String checkStr = receiveData.substring(0,receiveData.length()-4); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length()-4,receiveData.length()))) { + + log.info("报文检验成功: " + receiveData); + + // IP地址 + String ip = checkStr.substring(0, 8); + // 端口号 + String port = checkStr.substring(8, 12); + // COM口 + String dataCom = checkStr.substring(12, 14); + // 数据 + String dataStr1 = checkStr.substring(14); + + // 检验报文 + String checkStr1 = dataStr1.substring(0, dataStr1.length() - 4); + byte[] strOrder1 = ExchangeStringUtil.hexStrToBinaryStr(checkStr1); + int checkNum1 = CRC16.CRC16_MODBUS(strOrder1); + String checkWord1 = ExchangeStringUtil.decToHex(String.valueOf(checkNum1)); + checkWord1 = checkWord1.substring(2, 4) + checkWord1.substring(0, 2); + if (checkWord1.equalsIgnoreCase(dataStr1.substring(dataStr1.length() - 4))) { + + // 时间 + //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + log.info("时间: " + dateStr); + + // 表号 + String cloudId = ExchangeStringUtil.hexToDec(dataStr1.substring(0, 2)); + log.info("冷量计ID: " + cloudId); + + // 读数 + String data = dataStr1.substring(dataStr1.length() - 8, dataStr1.length() - 6) + + dataStr1.substring(dataStr1.length() - 6, dataStr1.length() - 4) + + dataStr1.substring(dataStr1.length() - 12, dataStr1.length() - 10) + + dataStr1.substring(dataStr1.length() - 10, dataStr1.length() - 8); + data = ExchangeStringUtil.hexToDec(data); + log.info("冷量计读数: " + data); + + try { + DeviceManageEntity deviceManageEntity = new DeviceManageEntity(); + deviceManageEntity.setDeviceNum(cloudId); + deviceManageEntity.setDeviceCode(cloudId); + deviceManageEntity.setLastValue(data); + deviceManageEntity.setLastDate(new Date()); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + } + + } + + public static void main(String[] args) throws ParseException, IOException { + + String s = DateUtil.formatDateStr("2021-01-28 10:41:12"); + System.out.println(s); + AnalysisReceiveOrder485 analysis=new AnalysisReceiveOrder485(); + GetReadOrder485 getReadOrder485=new GetReadOrder485(); + DeviceCodeParamEntity deviceCodeParamEntity=new DeviceCodeParamEntity(); + deviceCodeParamEntity.setDeviceAddr("90"); + deviceCodeParamEntity.setDeviceType("冷量计"); + deviceCodeParamEntity.setRegisterAddr("34"); + deviceCodeParamEntity.setRegisterName("累积量"); + deviceCodeParamEntity.setGrade(1); + deviceCodeParamEntity.setProjectID("3"); + analysis.analysisCloudOrder485("5A0304AEF600D911B6",deviceCodeParamEntity); + + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/ThreadPoolService.java b/user-service/src/main/java/com/mh/user/utils/ThreadPoolService.java new file mode 100644 index 0000000..f92e2dd --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/ThreadPoolService.java @@ -0,0 +1,46 @@ +package com.mh.user.utils; + +import java.util.concurrent.*; + +/** + * @author ljf + * @title : 单例的线程池 + * @description : 使用静态内部类进行创建,专门解析接收到的报文数据 + * @updateTime 2020-12-09 + * @throws : + */ +public class ThreadPoolService { + + /** 线程池保持ALIVE状态线程数 */ + public static final int CORE_POOL_SIZE = 10; + + /** 线程池最大线程数 */ + public static final int MAX_POOL_SIZE = 50; + + /** 空闲线程回收时间 */ + public static final int KEEP_ALIVE_TIME = 30000; + + /** 线程池等待队列 */ + public static final int BLOCKING_QUEUE_SIZE = 1000; + + // 私有化构造器 + private ThreadPoolService(){} + + // 对外访问的公共方法 + public static ThreadPoolExecutor getInstance() { + return ThreadPoolServiceHolder.instance; + } + + //写一个静态内部类,里面实例化外部类 + private static class ThreadPoolServiceHolder { + private static final ThreadPoolExecutor instance = new ThreadPoolExecutor( + CORE_POOL_SIZE, // 线程池保持存活的线程数 + MAX_POOL_SIZE, // 最大线程数 + KEEP_ALIVE_TIME, // 空闲线程回收时间 + TimeUnit.MICROSECONDS, // 单位 + new LinkedBlockingQueue<>(BLOCKING_QUEUE_SIZE), // 线程队列 + new ThreadPoolExecutor.AbortPolicy() // 线程池对拒绝任务的处理策略 + ); + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/TimeDifferenceUtil.java b/user-service/src/main/java/com/mh/user/utils/TimeDifferenceUtil.java new file mode 100644 index 0000000..45f1233 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/TimeDifferenceUtil.java @@ -0,0 +1,49 @@ +package com.mh.user.utils; + +import com.mh.user.service.chillers.OrderMessageService; +import org.springframework.context.ApplicationContext; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-06-09 + * @throws : + */ +public class TimeDifferenceUtil { + + ApplicationContext context = SpringContextUtils.getApplicationContext(); + OrderMessageService orderMessageService = context.getBean(OrderMessageService.class); + + public TimeDifferenceUtil() { + super(); + } + + public static int dValue(String lastDate) throws ParseException { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date lastTime = format.parse(lastDate); + long min = lastTime.getTime(); + Calendar calendar = Calendar.getInstance(); + long min1 = calendar.getTimeInMillis(); + long subtract = min1 - min; +// System.out.println("相减值: " + subtract/(1000*60)); + return (int) subtract / (1000 * 60); + } + + public Boolean timeDifference(int overTime) { + Date lastTime = orderMessageService.queryCloseChilledLastTime(); + Date nowDate = new Date(); + long a = (nowDate.getTime() - lastTime.getTime()) / (60 * 1000); + if (a >= overTime) { + return true; + } else { + return false; + } + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/WeatherUtil.java b/user-service/src/main/java/com/mh/user/utils/WeatherUtil.java new file mode 100644 index 0000000..ef79a69 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/WeatherUtil.java @@ -0,0 +1,225 @@ +package com.mh.user.utils; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.sf.json.JSONObject; + +/** + * java调用中央气象局天气预报接口 + * @author Administrator + */ +public class WeatherUtil { + + /** + * 获取一周天气
+ * 方 法 名:getWeekWeatherMap
+ * @param Cityid 城市编码 + */ + public static List> getWeekWeatherMap(String Cityid) + throws IOException, NullPointerException { + // 连接中央气象台的API + URL url = new URL("http://m.weather.com.cn/data/" + Cityid + ".html"); + URLConnection connectionData = url.openConnection(); + connectionData.setConnectTimeout(1000); + // 得到1到6天的天气情况 + List> list = new ArrayList>(); + try { + BufferedReader br = new BufferedReader(new InputStreamReader( + connectionData.getInputStream(), "UTF-8")); + StringBuilder sb = new StringBuilder(); + String line = null; + while ((line = br.readLine()) != null) + sb.append(line); + String datas = sb.toString(); + System.out.println(datas); + JSONObject jsonData = JSONObject.fromObject(datas); + JSONObject info = jsonData.getJSONObject("weatherinfo"); + for (int i = 1; i <= 6; i++) { + // 得到未来6天的日期 + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DAY_OF_YEAR, i - 1); + Date date = cal.getTime(); + SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日"); + Map map = new HashMap(); + map.put("city", info.getString("city").toString());// 城市 + map.put("date_y", sf.format(date));// 日期 + map.put("week", getWeek(cal.get(Calendar.DAY_OF_WEEK)));// 星期 + map.put("fchh", info.getString("fchh").toString());// 发布时间 + map.put("weather", info.getString("weather" + i).toString());// 天气 + map.put("temp", info.getString("temp" + i).toString());// 温度 + map.put("wind", info.getString("wind" + i).toString());// 风况 + map.put("fl", info.getString("fl" + i).toString());// 风速 + // map.put("index", info.getString("index").toString());// + // 今天的穿衣指数 + // map.put("index_uv", info.getString("index_uv").toString());// + // 紫外指数 + // map.put("index_tr", info.getString("index_tr").toString());// + // 旅游指数 + // map.put("index_co", info.getString("index_co").toString());// + // 舒适指数 + // map.put("index_cl", info.getString("index_cl").toString());// + // 晨练指数 + // map.put("index_xc", info.getString("index_xc").toString());// + // 洗车指数 + // map.put("index_d", info.getString("index_d").toString());// + // 天气详细穿衣指数 + list.add(map); + } + } catch (SocketTimeoutException e) { + System.out.println("连接超时"); + } catch (FileNotFoundException e) { + System.out.println("加载文件出错"); + } + return list; + } + + /** + * 获取实时天气1
+ * 方 法 名: getTodayWeather
+ * @param Cityid + * 城市编码 + */ + public static Map getTodayWeather1(String Cityid) + throws IOException, NullPointerException { + // 连接中央气象台的API + URL url = new URL("http://www.weather.com.cn/data/sk/" + Cityid + + ".html"); + URLConnection connectionData = url.openConnection(); + connectionData.setConnectTimeout(1000); + Map map = new HashMap(); + try { + BufferedReader br = new BufferedReader(new InputStreamReader( + connectionData.getInputStream(), "UTF-8")); + StringBuilder sb = new StringBuilder(); + String line = null; + while ((line = br.readLine()) != null) + sb.append(line); + String datas = sb.toString(); + System.out.println(datas); + JSONObject jsonData = JSONObject.fromObject(datas); + JSONObject info = jsonData.getJSONObject("weatherinfo"); + map.put("city", info.getString("city").toString());// 城市 + map.put("temp", info.getString("temp").toString());// 温度 + map.put("WD", info.getString("WD").toString());// 风向 + map.put("WS", info.getString("WS").toString());// 风速 + map.put("SD", info.getString("SD").toString());// 湿度 + map.put("time", info.getString("time").toString());// 发布时间 + + } catch (SocketTimeoutException e) { + System.out.println("连接超时"); + } catch (FileNotFoundException e) { + System.out.println("加载文件出错"); + } + return map; + } + + /** + * 获取实时天气2
+ * 方 法 名: getTodayWeather
+ * @param Cityid + * 城市编码 + */ + public static Map getTodayWeather2(String Cityid) + throws IOException, NullPointerException { + // 连接中央气象台的API + URL url = new URL("http://www.weather.com.cn/data/cityinfo/" + Cityid + + ".html"); + URLConnection connectionData = url.openConnection(); + connectionData.setConnectTimeout(1000); + Map map = new HashMap(); + try { + BufferedReader br = new BufferedReader(new InputStreamReader( + connectionData.getInputStream(), "UTF-8")); + StringBuilder sb = new StringBuilder(); + String line = null; + while ((line = br.readLine()) != null) + sb.append(line); + String datas = sb.toString(); + System.out.println(datas); + JSONObject jsonData = JSONObject.fromObject(datas); + JSONObject info = jsonData.getJSONObject("weatherinfo"); + map.put("city", info.getString("city").toString());// 城市 + map.put("temp1", info.getString("temp1").toString());// 最高温度 + map.put("temp2", info.getString("temp2").toString());// 最低温度 + map.put("weather", info.getString("weather").toString());//天气 + map.put("ptime", info.getString("ptime").toString());// 发布时间 + + } catch (SocketTimeoutException e) { + System.out.println("连接超时"); + } catch (FileNotFoundException e) { + System.out.println("加载文件出错"); + } + return map; + } + + private static String getWeek(int iw) { + String weekStr = ""; + switch (iw) { + case 1: + weekStr = "星期天"; + break; + case 2: + weekStr = "星期一"; + break; + case 3: + weekStr = "星期二"; + break; + case 4: + weekStr = "星期三"; + break; + case 5: + weekStr = "星期四"; + break; + case 6: + weekStr = "星期五"; + break; + case 7: + weekStr = "星期六"; + break; + default: + break; + } + return weekStr; + } + + public static void main(String[] args) { + try { + //测试获取实时天气1(包含风况,湿度) + Map map = getTodayWeather1("101280101"); //广州 + System.out.println(map.get("city") + "\t" + map.get("temp") + + "\t" + map.get("WD") + "\t" + map.get("WS") + + "\t" + map.get("SD") + "\t" + map.get("time")); + + //测试获取实时天气2(包含天气,温度范围) + Map map2 = getTodayWeather2("101010100"); //北京 + System.out.println(map2.get("city") + "\t" + map2.get("temp1") + + "\t" + map2.get("temp2") + "\t" + map2.get("weather") + + "\t" + map2.get("ptime")); + + //测试获取一周天气 +// List> listData = getWeekWeatherMap("101010100"); +// for (int j = 0; j < listData.size(); j++) { +// Map wMap = listData.get(j); +// System.out.println(wMap.get("city") + "\t" + wMap.get("date_y") +// + "\t" + wMap.get("week") + "\t" + wMap.get("weather") +// + "\t" + wMap.get("temp") + "\t" + wMap.get("wind") +// + "\t" + wMap.get("fl")); +// } + + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/vo/LoginBean.java b/user-service/src/main/java/com/mh/user/vo/LoginBean.java new file mode 100644 index 0000000..3d8b726 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/vo/LoginBean.java @@ -0,0 +1,19 @@ +package com.mh.user.vo; + +import lombok.Getter; +import lombok.Setter; + +/** + * 登录接口封装对象 + * @author Louis + * @date Oct 29, 2018 + */ +@Setter +@Getter +public class LoginBean { + + private String account; //账号 + private String password; //密码 + private String captcha; //验证码 + +} diff --git a/user-service/src/main/resources/bootstrap.yml b/user-service/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..a703451 --- /dev/null +++ b/user-service/src/main/resources/bootstrap.yml @@ -0,0 +1,113 @@ +server: + port: 8766 #8764新珠江,8766广合科技,8767广大科技,8768珠江国际,8769保利山庄,8770东莞迎宾馆 +spring: + datasource: + name: druidDataSource + type: com.alibaba.druid.pool.DruidDataSource + druid: + #添加allowMultiQueries=true 在批量更新时才不会出错 +# url: jdbc:sqlserver://192.168.1.108:2012;DatabaseName=FSBG;allowMultiQueries=true +# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver +# username: sa +# password: mh@803 +## url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=M_CHWS;allowMultiQueries=true + url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=mh_esi;allowMultiQueries=true + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + username: mh_sa + password: mhtech@803 + +# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true +# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver +# username: chws +# password: minghan123456@ + + filters: stat,wall,log4j,config + max-active: 100 + initial-size: 1 + max-wait: 60000 + min-idle: 1 + time-between-eviction-runs-millis: 60000 + min-evictable-idle-time-millis: 300000 + validation-query: select 'x' + test-while-idle: true + test-on-borrow: false + test-on-return: false + pool-prepared-statements: true + max-open-prepared-statements: 50 + max-pool-prepared-statement-per-connection-size: 50 + + rabbitmq: + host: 159.75.86.232 + port: 5672 + username: ningxr + password: ningxr123456 + virtual-host: /ning_host + template: + retry: + enabled: true + initial-interval: 10000ms + max-interval: 300000ms + multiplier: 2 + exchange: topic.exchange + publisher-confirms: true + +# redis: +# database: 0 +# host: 127.0.0.1 +# port: 6379 +# password: 123456 +# timeout: 3000 #链接超时时间 +# lettuce: +# pool: +# max-active: 8 #连接池最大连接数(使用负值没有限制) +# max-wait: -1 #最大等待时间,使用负值没有限制 +# max-idle: 8 #最大空闲连接,使用负值没有限制 +# min-idle: 0 #默认最小空闲连接 默认0 + +# redis配置 +# cloud: +# config: +# uri: http://localhost:8769 +# fail-fast: true +# profiles: +# active: pro +# consul: +# host: localhost +# port: 8500 +# discovery: +# service-name: ${spring.application.name} +# application: +# name: user-service +# 开放健康检查接口 +#management: +# endpoints: +# web: +# exposure: +# include: "*" +# endpoint: +# health: +# show-details: ALWAYS +#files: +# path: ${file-path:d:/files} + +log: + level: + root: info + my: debug + file: + maxsize: 30MB + +#设置将SQL语句打印到控制台 level后面是 mybatis接口目录 +logging: +# level: +# com: +# mh: +# user: +# mapper: DEBUG + file: + max-size: 30 + + +##软件最后更新日期20230116 + + diff --git a/user-service/src/main/resources/log4j.properties b/user-service/src/main/resources/log4j.properties new file mode 100644 index 0000000..b7a847c --- /dev/null +++ b/user-service/src/main/resources/log4j.properties @@ -0,0 +1,32 @@ +### set log levels DEBUG ### +log4j.rootLogger = INFO,CONSOLE,infoFile, errorFile +LocationInfo=true +log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender +#log4j.appender.CONSOLE.Encoding=UTF-8 +log4j.appender.CONSOLE.Target = System.out +log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout +log4j.appender.CONSOLE.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m %x %n + +log4j.appender.infoFile = org.apache.log4j.DailyRollingFileAppender +log4j.appender.infoFile.Threshold = INFO +log4j.appender.infoFile.File = ./logs/log.log +log4j.appender.infoFile.DatePattern ='.'yyyy-MM-dd'.log' +log4j.appender.infoFile.Append=true +log4j.appender.infoFile.layout = org.apache.log4j.PatternLayout +log4j.appender.infoFile.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m %x %n + +log4j.appender.errorFile = org.apache.log4j.DailyRollingFileAppender +log4j.appender.errorFile.Threshold = ERROR +log4j.appender.errorFile.File = ./logs/error.log +log4j.appender.errorFile.DatePattern ='.'yyyy-MM-dd'.log' +log4j.appender.errorFile.Append=true +log4j.appender.errorFile.layout = org.apache.log4j.PatternLayout +log4j.appender.errorFile.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m %x %n + +#log4j.appender.debugfile = org.apache.log4j.DailyRollingFileAppender +#log4j.appender.debugfile.Threshold = DEBUG +#log4j.appender.debugfile.File = ./logs/debug +#log4j.appender.debugfile.DatePattern = yyyy-MM-dd'.log' +#log4j.appender.debugfile.Append=true +#log4j.appender.debugfile.layout = org.apache.log4j.PatternLayout +#log4j.appender.debugfile.layout.ConversionPattern =[%d{yyyy-MM-dd HH:mm:ss,SSS}]-[%p]:%m %x %n diff --git a/user-service/src/main/resources/socket.yml b/user-service/src/main/resources/socket.yml new file mode 100644 index 0000000..2d2307c --- /dev/null +++ b/user-service/src/main/resources/socket.yml @@ -0,0 +1,12 @@ +socket: + IP: 169.254.194.199 + port: 8080 + overtime: 8 +#socket: +# IP: 192.168.1.108 +# port: 8082 +# overtime: 8 +#socket: +# IP: 169.254.224.3 +# port: 9000 +# overtime: 8 diff --git a/user-service/src/test/java/com/mh/user/DealDataTest.java b/user-service/src/test/java/com/mh/user/DealDataTest.java new file mode 100644 index 0000000..6da1458 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/DealDataTest.java @@ -0,0 +1,23 @@ +package com.mh.user; + +import com.mh.user.mapper.chillers.DealDataMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-28 + * @throws : + */ +public class DealDataTest extends UserServiceApplicationTests { + + @Autowired + private DealDataMapper dealDataMapper; + + @Test + public void dealChillersData() { +// dealDataMapper.dealChillersData(); + } +} diff --git a/user-service/src/test/java/com/mh/user/ExceptionTest.java b/user-service/src/test/java/com/mh/user/ExceptionTest.java new file mode 100644 index 0000000..4564242 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/ExceptionTest.java @@ -0,0 +1,44 @@ +package com.mh.user; + +import com.mh.user.entity.ExceptionEntity; +import com.mh.user.entity.ExceptionTableData; +import com.mh.user.service.chillers.ExceptionService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-31 + * @throws : + */ +public class ExceptionTest extends UserServiceApplicationTests { + + @Autowired + private ExceptionService exceptionService; + + @Test + public void queryException() { + ExceptionEntity exceptionEntity = new ExceptionEntity(); + exceptionEntity.setPage(1); + exceptionEntity.setLimit(10); + List exceptionTableDataList = exceptionService.queryException(exceptionEntity); + for (int i = 0; i < exceptionTableDataList.size(); i++) { + System.out.println(exceptionTableDataList.get(i).toString()); + } + } + + @Test + public void updateException() { + ExceptionTableData exceptionTableData = new ExceptionTableData(); + exceptionTableData.setDeviceId(1); + exceptionTableData.setProcess(1); + exceptionTableData.setRemark("test111"); + String result = exceptionService.updateException(exceptionTableData); + System.out.println("返回值: " + result); + } + +} diff --git a/user-service/src/test/java/com/mh/user/ReportTest1.java b/user-service/src/test/java/com/mh/user/ReportTest1.java new file mode 100644 index 0000000..2677df6 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/ReportTest1.java @@ -0,0 +1,103 @@ +package com.mh.user; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.mh.user.entity.ReportParamEntity; +import com.mh.user.entity.chart.BaseChartEntity; +import com.mh.user.entity.chart.ChartEntity; +import com.mh.user.entity.chart.Unit; +import com.mh.user.mapper.chart.ChartMapper; +import com.mh.user.service.chart.ChartService; +import com.mh.user.service.chillers.ReportService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-03 + * @throws : + */ +public class ReportTest1 extends UserServiceApplicationTests { + + @Autowired + private ReportService reportService; + + @Autowired + private ChartMapper chartMapper; + + @Autowired + private ChartService chartService; + + @Test + public void queryChartData() { + Map map = new HashMap<>(); + map.put("choose_index_ids","39,69"); + map.put("begin_time","2020-06-15 17:45:00.000"); + map.put("end_time","2020-06-15 18:45:00.000"); + map.put("type",null); + map.put("chart_id",1); + List chartEntityList = chartService.queryChartData(map); + System.out.println(JSONArray.toJSONString(chartEntityList)); +// List baseChartEntityList = chartService.callProChart(map); +// for (BaseChartEntity baseChartEntity : +// baseChartEntityList) { +// System.out.println(baseChartEntity.toString()); +// } + } + + @Test + public void queryUnit() { + Map map = new HashMap<>(); + map.put("choose_index_ids","40,41"); + List unitList = chartService.queryUnits(map); + for (Unit unit : + unitList) { + System.out.println(unit.toString()); + } + } + + @Test + public void queryAllTarget() { + List reportParamEntities = reportService.queryAllTarget("fourWeek"); + List firstLevel = reportParamEntities.stream().filter(p -> String.valueOf(p.getParentId()).equals("0")).collect(Collectors.toList()); + System.out.println(firstLevel.toString()); + firstLevel.parallelStream().forEach(p -> { + setChild(p, reportParamEntities); + }); + JSONObject menuListJson = new JSONObject(); + menuListJson.put("indexInfo",firstLevel); + System.out.println(menuListJson.toJSONString()); +// for (ReportParamEntity reportParamEntity : +// reportParamEntities) { +// System.out.println(reportParamEntity.toString()); +// } + } + + /** + * 设置子元素 + * 2018.06.09 + * + * @param p + * @param permissions + */ + private void setChild(ReportParamEntity p, List permissions) { +// System.out.println(p.getId()); + List child = permissions.parallelStream().filter(a -> String.valueOf(a.getParentId()).equals(String.valueOf(p.getId()))).collect(Collectors.toList()); + p.setChildren(child); + if (!CollectionUtils.isEmpty(child)) { + child.parallelStream().forEach(c -> { + //递归设置子元素,多级菜单支持 + setChild(c, permissions); + }); + } + } + +} diff --git a/user-service/src/test/java/com/mh/user/SysUserTest.java b/user-service/src/test/java/com/mh/user/SysUserTest.java new file mode 100644 index 0000000..5c61953 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/SysUserTest.java @@ -0,0 +1,31 @@ +package com.mh.user; + +import com.mh.common.page.PageRequest; +import com.mh.common.page.PageResult; +import com.mh.user.mapper.SysUserMapper; +import com.mh.user.model.SysUser; +import com.mh.user.service.SysUserService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-03-14 + * @throws : + */ +public class SysUserTest extends UserServiceApplicationTests { + + @Autowired + private SysUserService sysUserService; + + @Test + public void findByName(){ + SysUser sysUser = sysUserService.findByName("admin"); + System.out.println(sysUser.toString()); +// List sysUserList = sysUserMapper.findAllUser(1,10); +// System.out.println(sysUserList); + } + +} diff --git a/user-service/src/test/java/com/mh/user/TestJwtUtils.java b/user-service/src/test/java/com/mh/user/TestJwtUtils.java new file mode 100644 index 0000000..8a57372 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/TestJwtUtils.java @@ -0,0 +1,159 @@ +package com.mh.user; + +import com.mh.user.model.SysUser; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author ljf + * @title : + * @description : 测试jwt认证 + * @updateTime 2020-04-27 + * @throws : + */ +public class TestJwtUtils { + + public static final String TOKEN_HEADER = "Authorization"; + public static final String TOKEN_PREFIX = "Bearer "; + + public static final String SUBJECT = "congge"; + + public static final long EXPIRITION = 1000 * 24 * 60 * 60 * 7; + + public static final String APPSECRET_KEY = "congge_secret"; + + private static final String ROLE_CLAIMS = "rol"; + + public static String generateJsonWebToken(SysUser user) { + + if (user.getId() == null || user.getUserName() == null) { + return null; + } + + Map map = new HashMap<>(); + map.put(ROLE_CLAIMS, "rol"); + + String token = Jwts + .builder() + .setSubject(SUBJECT) + .setClaims(map) + .claim("id", user.getId()) + .claim("name", user.getUserName()) + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + EXPIRITION)) + .signWith(SignatureAlgorithm.HS256, APPSECRET_KEY).compact(); + return token; + } + + /** + * 生成token + * @param username + * @param role + * @return + */ + public static String createToken(String username,String role) { + + Map map = new HashMap<>(); + map.put(ROLE_CLAIMS, role); + + String token = Jwts + .builder() + .setSubject(username) + .setClaims(map) + .claim("username",username) + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + EXPIRITION)) + .signWith(SignatureAlgorithm.HS256, APPSECRET_KEY).compact(); + return token; + } + + public static Claims checkJWT(String token) { + try { + final Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); + return claims; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取用户名 + * @param token + * @return + */ + public static String getUsername(String token){ + Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); + return claims.get("username").toString(); + } + + /** + * 获取用户角色 + * @param token + * @return + */ + public static String getUserRole(String token){ + Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); + return claims.get("rol").toString(); + } + + /** + * 是否过期 + * @param token + * @return + */ + public static boolean isExpiration(String token){ + Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); + return claims.getExpiration().before(new Date()); + } + +// public static void main(String[] args) { +// String name = "admin"; +// String token = createToken(name,"admin"); +// System.out.println(token); +// +// Claims claims = checkJWT(token); +// System.out.println(claims.get("username")); +// +// System.out.println(getUsername(token)); +// System.out.println(getUserRole(token)); +// System.out.println(isExpiration(token)); +// +// } + + + /** + * eyJhbGciOiJIUzI1NiJ9. + * eyJzdWIiOiJjb25nZ2UiLCJpZCI6IjExMDExIiwibmFtZSI6Im51b3dlaXNpa2kiLCJpbWciOiJ3d3cudW9rby5jb20vMS5wbmciLCJpYXQiOjE1NTQ5OTI1NzksImV4cCI6MTU1NTU5NzM3OX0. + * 6DJ9En-UBcTiMRldZeevJq3e1NxJgOWryUyim4_-tEE + * + * @param args + */ + + public static void main(String[] args) { + + SysUser user = new SysUser(); + user.setId((long) 1); + user.setUserName("admin"); + String token = generateJsonWebToken(user); + + System.out.println(token); + + Claims claims = checkJWT(token); + if (claims != null) { + String id = claims.get("id").toString(); + String name = claims.get("name").toString(); + + System.out.println("id:" + id); + System.out.println("name:" + name); + + } + + } + +} diff --git a/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java b/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java new file mode 100644 index 0000000..748c66b --- /dev/null +++ b/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java @@ -0,0 +1,65 @@ +package com.mh.user; + +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.entity.GaugeEntity; +import com.mh.user.service.chillers.DeviceManageService; +import com.mh.user.service.chillers.GaugeService; +import com.mh.user.utils.AnalysisReceiveOrder485; +import com.mh.user.utils.GetReadOrder485; +import com.mh.user.utils.PasswordEncoder; +import com.mh.user.utils.PasswordUtils; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +@SpringBootTest +class UserServiceApplicationTests { + + @Test + void contextLoads() { + } + + @Test + public void encode() { + String s = PasswordUtils.encode("123456", "87e03afa1f0122531f729c9a7453f475"); + System.out.println(s); + System.out.println(new PasswordEncoder("87e03afa1f0122531f729c9a7453f475").matches(s, "123456")); + } + + @Autowired + private GaugeService gaugeService; + + @Test + public void getGaugeData() { + GaugeEntity gaugeEntity = gaugeService.getGaugeData("0", "1号冷水机"); + System.out.println(gaugeEntity.toString()); + } + + @Autowired + DeviceManageService deviceManageService; + + @Test + public void queryDevices() { + List deviceManageEntities = deviceManageService.queryDevicesByType(null); + for (DeviceManageEntity device : + deviceManageEntities) { + System.out.println(device.toString()); + } + } + + @Test + public void AnalysisTest() { + AnalysisReceiveOrder485 analysis=new AnalysisReceiveOrder485(); + GetReadOrder485 getReadOrder485=new GetReadOrder485(); +// analysis.analysisWtMeterOrder485("FEFEFE6810398710810000008116901F00006502002C006502002C0000000000000000FF3416"); + //0203020008FD82 +// analysis.analysisPumpOrder485("0203020008FD82","0641"); +// getReadOrder485.createOrderParam(); +// analysis.analysisRelayOrder485("220611000000013A220611000000023B220611000000033C220611000000043D220611000000053E220611000000063F22061100000007402206110000000841","0017","中凯"); + } + + + +} diff --git a/user-service/src/test/java/com/mh/user/chart/ChartTest.java b/user-service/src/test/java/com/mh/user/chart/ChartTest.java new file mode 100644 index 0000000..d205040 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/chart/ChartTest.java @@ -0,0 +1,69 @@ +package com.mh.user.chart; + +import com.alibaba.fastjson.JSONArray; +import com.mh.user.entity.chart.*; + +import java.math.BigDecimal; +import java.util.*; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-07-10 + * @throws : + */ +public class ChartTest { + public static void main(String[] args) { + +// Set objects = new LinkedHashSet<>(); +// objects.add("test"); +// objects.add("test1"); +// objects.add("test"); +// objects.add("test1"); +// for (Object object : +// objects) { +// System.out.println(object); +// } + +// Title title = new Title(false, "COP"); +// +// Feature feature = new Feature( +// new boolean[]{false, false, false, false}, +// new String[]{"温度", "湿度", "千瓦", "千帕"}, +// new String[]{"温度", "湿度", "千瓦", "千帕"}, +// new String[]{"温度", "湿度", "千瓦", "千帕"}, +// new String[]{"温度", "湿度", "千瓦", "千帕"}); +// +// Legend legend = new Legend( +// new String[]{"COP"}, +// 200, +// new int[]{25}); +// +// XAxis xAxis = new XAxis(new String[]{"前3周","前2周","前1周","本周"}); +// +// List yAxisList = new ArrayList<>(); +// yAxisList.add(new YAxis("value", +// "COP", +// new SplitLine(false), +// new AxisLine(false,new LineStyle("#FFF")), +// true)); +// +// List seriesList = new ArrayList<>(); +// seriesList.add(new Series("COP", +// "bar", +// 0, +// new Double[]{4.7, 5.8, 6.0, 5.3})); +// +// ChartEntity chartEntity = new ChartEntity(title,feature,legend,xAxis,yAxisList,seriesList); +// List chartEntities = new ArrayList<>(); +// chartEntities.add(chartEntity); +// String json = JSONArray.toJSONString(chartEntities); +// System.out.println(json); +// BigDecimal b1 = BigDecimal.valueOf(Math.PI / 2); +// double a = b1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); +// System.out.println(a); + String s = "a9fec2c71f90ff03fc0000000100000200000300000400000500000600000700000800000900000a00000b00000c00000d00000e00000f00001000001100001200001300001400001500001600001700001800001900001a00001b00001c00001d00011e00001f00002000002100002200002300002400002500002600002700002800002900002a00002b00002c00002d00002e00002f000030000031000040a8"; + System.out.println("大小: " + s.length()); + } +} diff --git a/user-service/src/test/java/com/mh/user/device/CRC16Test.java b/user-service/src/test/java/com/mh/user/device/CRC16Test.java new file mode 100644 index 0000000..ef2ce3d --- /dev/null +++ b/user-service/src/test/java/com/mh/user/device/CRC16Test.java @@ -0,0 +1,77 @@ +package com.mh.user.device; + +import com.mh.user.utils.ExchangeStringUtil; + +import java.io.IOException; + +/** + * @Classname CRC16Test + * @Description TODO + * @Date 2020-06-03 14:08 + * @Created by LJF + */ +public class CRC16Test { + // CRC高字节值表 + static byte[] auchCRCHi = { + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40, + (byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40, + (byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41, + (byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40, + (byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41, + (byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x01,(byte)0xC0,(byte)0x80,(byte)0x41,(byte)0x00,(byte)0xC1,(byte)0x81,(byte)0x40}; + + //CRC低位字节值表 + static byte[] auchCRCLo = { + (byte)0x00,(byte)0xC0,(byte)0xC1,(byte)0x01,(byte)0xC3,(byte)0x03,(byte)0x02,(byte)0xC2,(byte)0xC6,(byte)0x06,(byte)0x07,(byte)0xC7,(byte)0x05,(byte)0xC5,(byte)0xC4,(byte)0x04,(byte)0xCC,(byte)0x0C,(byte)0x0D,(byte)0xCD, + (byte)0x0F,(byte)0xCF,(byte)0xCE,(byte)0x0E,(byte)0x0A,(byte)0xCA,(byte)0xCB,(byte)0x0B,(byte)0xC9,(byte)0x09,(byte)0x08,(byte)0xC8,(byte)0xD8,(byte)0x18,(byte)0x19,(byte)0xD9,(byte)0x1B,(byte)0xDB,(byte)0xDA,(byte)0x1A, + (byte)0x1E,(byte)0xDE,(byte)0xDF,(byte)0x1F,(byte)0xDD,(byte)0x1D,(byte)0x1C,(byte)0xDC,(byte)0x14,(byte)0xD4,(byte)0xD5,(byte)0x15,(byte)0xD7,(byte)0x17,(byte)0x16,(byte)0xD6,(byte)0xD2,(byte)0x12,(byte)0x13,(byte)0xD3, + (byte)0x11,(byte)0xD1,(byte)0xD0,(byte)0x10,(byte)0xF0,(byte)0x30,(byte)0x31,(byte)0xF1,(byte)0x33,(byte)0xF3,(byte)0xF2,(byte)0x32,(byte)0x36,(byte)0xF6,(byte)0xF7,(byte)0x37,(byte)0xF5,(byte)0x35,(byte)0x34,(byte)0xF4, + (byte)0x3C,(byte)0xFC,(byte)0xFD,(byte)0x3D,(byte)0xFF,(byte)0x3F,(byte)0x3E,(byte)0xFE,(byte)0xFA,(byte)0x3A,(byte)0x3B,(byte)0xFB,(byte)0x39,(byte)0xF9,(byte)0xF8,(byte)0x38,(byte)0x28,(byte)0xE8,(byte)0xE9,(byte)0x29, + (byte)0xEB,(byte)0x2B,(byte)0x2A,(byte)0xEA,(byte)0xEE,(byte)0x2E,(byte)0x2F,(byte)0xEF,(byte)0x2D,(byte)0xED,(byte)0xEC,(byte)0x2C,(byte)0xE4,(byte)0x24,(byte)0x25,(byte)0xE5,(byte)0x27,(byte)0xE7,(byte)0xE6,(byte)0x26, + (byte)0x22,(byte)0xE2,(byte)0xE3,(byte)0x23,(byte)0xE1,(byte)0x21,(byte)0x20,(byte)0xE0,(byte)0xA0,(byte)0x60,(byte)0x61,(byte)0xA1,(byte)0x63,(byte)0xA3,(byte)0xA2,(byte)0x62,(byte)0x66,(byte)0xA6,(byte)0xA7,(byte)0x67, + (byte)0xA5,(byte)0x65,(byte)0x64,(byte)0xA4,(byte)0x6C,(byte)0xAC,(byte)0xAD,(byte)0x6D,(byte)0xAF,(byte)0x6F,(byte)0x6E,(byte)0xAE,(byte)0xAA,(byte)0x6A,(byte)0x6B,(byte)0xAB,(byte)0x69,(byte)0xA9,(byte)0xA8,(byte)0x68, + (byte)0x78,(byte)0xB8,(byte)0xB9,(byte)0x79,(byte)0xBB,(byte)0x7B,(byte)0x7A,(byte)0xBA,(byte)0xBE,(byte)0x7E,(byte)0x7F,(byte)0xBF,(byte)0x7D,(byte)0xBD,(byte)0xBC,(byte)0x7C,(byte)0xB4,(byte)0x74,(byte)0x75,(byte)0xB5, + (byte)0x77,(byte)0xB7,(byte)0xB6,(byte)0x76,(byte)0x72,(byte)0xB2,(byte)0xB3,(byte)0x73,(byte)0xB1,(byte)0x71,(byte)0x70,(byte)0xB0,(byte)0x50,(byte)0x90,(byte)0x91,(byte)0x51,(byte)0x93,(byte)0x53,(byte)0x52,(byte)0x92, + (byte)0x96,(byte)0x56,(byte)0x57,(byte)0x97,(byte)0x55,(byte)0x95,(byte)0x94,(byte)0x54,(byte)0x9C,(byte)0x5C,(byte)0x5D,(byte)0x9D,(byte)0x5F,(byte)0x9F,(byte)0x9E,(byte)0x5E,(byte)0x5A,(byte)0x9A,(byte)0x9B,(byte)0x5B, + (byte)0x99,(byte)0x59,(byte)0x58,(byte)0x98,(byte)0x88,(byte)0x48,(byte)0x49,(byte)0x89,(byte)0x4B,(byte)0x8B,(byte)0x8A,(byte)0x4A,(byte)0x4E,(byte)0x8E,(byte)0x8F,(byte)0x4F,(byte)0x8D,(byte)0x4D,(byte)0x4C,(byte)0x8C, + (byte)0x44,(byte)0x84,(byte)0x85,(byte)0x45,(byte)0x87,(byte)0x47,(byte)0x46,(byte)0x86,(byte)0x82,(byte)0x42,(byte)0x43,(byte)0x83,(byte)0x41,(byte)0x81,(byte)0x80,(byte)0x40 + }; + + /** + * 计算CRC16校验 + * @Description: + * @param data 需要计算的数组 + * @param len 长度 + * @return CRC16校验值 + */ + private static int calcCrc16(byte[] data, int len) { + int uchCRCHi = 0xff; + int uchCRCLo = 0xff; + int uIndex; + + for(int i=0;i displayBoxDataDTOList = deviceDisplayService.deviceDisplayBoxData("host",String.valueOf(0)); + for (DisplayBoxDataDTO displayBoxDataDTO : + displayBoxDataDTOList) { + log.info(displayBoxDataDTO.toString()); + } + } + + // 查询设备状态 + @Test + public void queryDeviceState() { + List deviceMessageList = deviceDisplayService.queryDeviceStatus("host"); + for (DeviceMessageDTO deviceMessage: + deviceMessageList){ + log.info(deviceMessage.toString()); + } + } + + + @Test + public void queryDeviceByOthers() { + List deviceManageEntityList = deviceManageService.queryDeviceByOther(1,10, "88"); + for (DeviceManageEntity deviceManage : + deviceManageEntityList) { + log.info(deviceManage.toString()); + } +// for (int i = 0; i < deviceManageEntityList.size(); i++) { +// if (deviceManageEntityList.get(i).getDeviceType().equalsIgnoreCase("1")) { // 1 代表广仪电表 +// // 生成电表指令 +// String meterOrderStr = GetReadOrder485.createMeterOrder("169.254.194.199","8080","2",deviceManageEntityList.get(i).getCollectionNum(),"1"); +// log.info("电表指令------" + meterOrderStr); +// } else if (deviceManageEntityList.get(i).getDeviceType().equalsIgnoreCase("3")) { // 3 代表冷量计 +// // 生成电表指令 +// String meterOrderStr = GetReadOrder485.createCloudOrder(deviceManageEntityList.get(i).getCollectionNum(),"34"); +// log.info("冷量计指令------" + meterOrderStr); +// } +// } + int count = deviceManageService.queryDeviceByOtherCount("88"); + log.info("总数: " + count); + } + + @Autowired + ChillersService chillersService; + + @Test + public void queryChillers() { + List chillersEntityList = chillersService.queryChillersByOther(1,"1"); + for (ChillersEntity chillersEntity : + chillersEntityList) { + log.info(chillersEntity.toString()); + } + } + + @Test + public void queryChillersByOthers() { + List chillersEntities = chillersService.queryChillersByOther(1,"1"); + for (ChillersEntity chillersEntity : + chillersEntities) { + log.info(chillersEntity.toString()); + } + } + + @Test + public void insertChillersEntity() { + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + ChillersEntity chillersEntity = new ChillersEntity(); + chillersEntity.setDigit(0); + chillersEntity.setDeviceCode("1"); + chillersEntity.setDeviceNum("1"); + chillersEntity.setFunCode("01"); + chillersEntity.setRegisterAddress("1"); +// analysisReceiveOrder485.analysisChillerOrder485("0303020016404A",chillersEntity); + } + + @Autowired + DeviceManageMapper deviceManageMapper; + + @Test + public void queryByTest() { + List deviceManageEntityList = deviceManageMapper.queryDevicesByType1("manage"); + for (DeviceManageEntity deviceManage : + deviceManageEntityList) { + log.info(deviceManage.toString()); + } + } + + @Autowired + ChillersMapper chillersMapper; + + @Test + public void queryTopData() { + List tableDataEntities = chillersMapper.queryTopData("1号冷水机", 1); +// for (TableDataEntity tableDataEntity : +// tableDataEntities) { +// log.info(tableDataEntity.toString()); +// } + + log.info(""+ HttpResult.ok(tableDataEntities)); + + List tableInfoEntityList = chillersMapper.queryLeftAndRightData("1号冷水机", 1); +// for (TableInfoEntity tableInfoEntity : +// tableInfoEntityList) { +// log.info(tableInfoEntity.toString()); +// } + log.info(""+HttpResult.ok(tableInfoEntityList)); + } + + // 解析DDC上传的报文 + @Test + public void batchInsertChillersEntity() throws InterruptedException { + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + String readStr = "C0 A8 02 0A 1F 90 FF 01 FE 00 00 01 01 00 00 02 00 00 03 00 00 04 00 00 05 00 00 06 00 00 07 00 0B " + + "08 00 00 09 D7 34 0A 00 01 0B 00 00 0C 00 00 0D 00 00 0E 00 00 0F 00 00 10 00 00 11 00 12 12 00 00 13 D7 80 3E D0"; + analysisReceiveOrder485.analysisChillersDDC(readStr); + } + + // 通过ddc查询对应的寄存器地址 + @Test + public void queryDDCAddr() { + List stringList = chillersMapper.queryDDCAddr("1"); + for (String str : + stringList) { + log.info(str); + } + } + + +} diff --git a/user-service/src/test/java/com/mh/user/param/ParamTest.java b/user-service/src/test/java/com/mh/user/param/ParamTest.java new file mode 100644 index 0000000..c519d58 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/param/ParamTest.java @@ -0,0 +1,65 @@ +package com.mh.user.param; + +import com.mh.user.constants.SocketMessage; +import com.mh.user.service.chillers.OrderMessageService; +import com.mh.user.utils.TimeDifferenceUtil; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-21 + * @throws : + */ +@SpringBootTest +public class ParamTest { + + @Autowired + private SocketMessage socketMessage; + + @Test + public void getSocketMessage() { + System.out.println(socketMessage.getIP()); + } + + // 查询最近关闭冷却塔的时间 + @Autowired + private OrderMessageService orderMessageService; + + @Test + public void getLastTime() { +// Date date = orderMessageService.queryCloseChilledLastTime(); +// Date date1 = new Date(); +// long a = (date1.getTime() - date.getTime()) / (60 * 1000); +// int b = socketMessage.getOverTime(); +// if (a >= b) { +// System.out.println("两者相差 " + a + " 分,可以开启冷却泵"); +// } else { +// System.out.println("不能开启冷却泵"); +// } + TimeDifferenceUtil timeDifferenceUtil = new TimeDifferenceUtil(); + boolean a = timeDifferenceUtil.timeDifference(socketMessage.getOverTime()); + if (a) { + System.out.println("可以打开冷却泵"); + } else { + System.out.println("不能开启冷却泵"); + } + } + + + public static void main(String[] args) { + String str = "/192.168.1.222:8080"; + String regex = ":" + "(.*)" + ""; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(str); + while (matcher.find()) { + System.out.println(matcher.group(1)); + } + } +} diff --git a/user-service/src/test/java/com/mh/user/receive/AnalysisReceiveOrder485.java b/user-service/src/test/java/com/mh/user/receive/AnalysisReceiveOrder485.java new file mode 100644 index 0000000..c4683f5 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/receive/AnalysisReceiveOrder485.java @@ -0,0 +1,301 @@ +package com.mh.user.receive; + +import com.mh.user.entity.ChillersEntity; +import com.mh.user.entity.DeviceManageEntity; +import com.mh.user.entity.OrderMessageEntity; +import com.mh.user.service.chillers.ChillersService; +import com.mh.user.service.chillers.DataHistoryService; +import com.mh.user.service.chillers.OrderMessageService; +import com.mh.user.utils.CRC16; +import com.mh.user.utils.ExchangeStringUtil; +import com.mh.user.utils.SpringBeanUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author ljf + * @title : + * @description : 解析485接收的数据 + * @updateTime 2020-04-23 + * @throws : + */ +@Slf4j +public class AnalysisReceiveOrder485 { + + // 调用service + ApplicationContext context = SpringBeanUtil.getApplicationContext(); + DataHistoryService dataHistoryService = context.getBean(DataHistoryService.class); + + public void analysisCloudOrder485(String receiveData){ + + // 去掉空格 + receiveData = receiveData.replace(" ",""); + + // 检验报文 + String checkStr = receiveData.substring(0,receiveData.length()-4); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length()-4))) { + + log.info("报文检验成功: " + receiveData); + + // IP地址 + String ip = checkStr.substring(0, 8); + // 端口号 + String port = checkStr.substring(8, 12); + // COM口 + String dataCom = checkStr.substring(12, 14); + // 数据 + String dataStr1 = checkStr.substring(14); + + // 检验报文 + String checkStr1 = dataStr1.substring(0, dataStr1.length() - 4); + byte[] strOrder1 = ExchangeStringUtil.hexStrToBinaryStr(checkStr1); + int checkNum1 = CRC16.CRC16_MODBUS(strOrder1); + String checkWord1 = ExchangeStringUtil.decToHex(String.valueOf(checkNum1)); + checkWord1 = checkWord1.substring(2, 4) + checkWord1.substring(0, 2); + if (checkWord1.equalsIgnoreCase(dataStr1.substring(dataStr1.length() - 4))) { + + // 时间 + //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + log.info("时间: " + dateStr); + + // 表号 + String cloudId = ExchangeStringUtil.hexToDec(dataStr1.substring(0, 2)); + log.info("冷量计ID: " + cloudId); + + // 读数 + String data = dataStr1.substring(dataStr1.length() - 8, dataStr1.length() - 6) + + dataStr1.substring(dataStr1.length() - 6, dataStr1.length() - 4) + + dataStr1.substring(dataStr1.length() - 12, dataStr1.length() - 10) + + dataStr1.substring(dataStr1.length() - 10, dataStr1.length() - 8); + data = ExchangeStringUtil.hexToDec(data); + log.info("冷量计读数: " + data); + + try { + DeviceManageEntity deviceManageEntity = new DeviceManageEntity(); + deviceManageEntity.setDeviceNum(cloudId); + deviceManageEntity.setDeviceCode(cloudId); + deviceManageEntity.setLastValue(data); + deviceManageEntity.setLastDate(new Date()); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + } + + } + + /** + * 解析电表返回的数据 + * @param receiveData + */ + public void analysisMeterOrder485(String receiveData){ + + // 返回值全部变成大写 + receiveData = receiveData.toUpperCase(); + // 去掉空格 + receiveData = receiveData.replace(" ",""); + + // 校验 + // 检验报文 + String checkStr1 = receiveData.substring(0, receiveData.length() - 4); + byte[] strOrder1 = ExchangeStringUtil.hexStrToBinaryStr(checkStr1); + int checkNum1 = CRC16.CRC16_MODBUS(strOrder1); + String checkWord1 = ExchangeStringUtil.decToHex(String.valueOf(checkNum1)); + checkWord1 = checkWord1.substring(2, 4) + checkWord1.substring(0, 2); + if (checkWord1.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { + + // IP地址 + String ip = receiveData.substring(0, 8); + // 端口号 + String port = receiveData.substring(8, 12); + // COM口 + String dataCom = receiveData.substring(12, 14); + // 数据 + String dataStr1 = receiveData.substring(14, receiveData.length() - 4); + + // 截取去掉FE + dataStr1 = dataStr1.replace("FE", ""); + + if (dataStr1.length() == 36 || dataStr1.length() == 40) { + + // 检验报文 + String checkStr = dataStr1.substring(0, dataStr1.length() - 4); + String checkNum = ExchangeStringUtil.makeChecksum(checkStr); + + if (checkNum.equalsIgnoreCase(dataStr1.substring(dataStr1.length() - 4, dataStr1.length() - 2))) { + + log.info("报文检验成功: " + dataStr1); + + // 时间 + //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + log.info("时间: " + dateStr); + + String dataStr = checkStr; + // 表号 + String meterId = dataStr.substring(12, 14) + dataStr.substring(10, 12) + dataStr.substring(8, 10) + + dataStr.substring(6, 8) + dataStr.substring(4, 6) + dataStr.substring(2, 4); + meterId = String.format("%012d", Long.parseLong(meterId)); + log.info("电表表号: " + meterId); + + // 读数 + String data = ""; + for (int i = 0; i < 4; i++) { + String data1 = dataStr.substring(dataStr.length() - 2 * (i + 1), dataStr.length() - 2 * i); + data = data + data1; + } + data = ExchangeStringUtil.cutThree(data); + // 0 代表前面补充0 + // 4 代表长度为4 + // d 代表参数为正数型 + data = String.format("%08d", Long.parseLong(data)); + data = data.substring(0, 6) + "." + data.substring(6, 8); + log.info("电表读数: " + data); + + try { + DeviceManageEntity deviceManageEntity = new DeviceManageEntity(); + deviceManageEntity.setDeviceNum(meterId); + deviceManageEntity.setDeviceCode(meterId); + deviceManageEntity.setLastValue(data); + deviceManageEntity.setLastDate(new Date()); + + int a = dataHistoryService.insertDataHistory(deviceManageEntity); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + } + } + + } + + /** + * 解析冷水机组返回的数据,返回值没有带寄存器地址,只有冷水机组地址 + * @param receiveData + */ + public void analysisChillerOrder485(String receiveData, ChillersEntity chillersEntity) { + + // 去掉空格 + receiveData = receiveData.replace(" ",""); + + // 检验报文 + String checkStr = receiveData.substring(0,receiveData.length()-4); + byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); + int checkNum = CRC16.CRC16_MODBUS(strOrder); + String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); + checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + + if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length()-4))){ + + log.info("报文检验成功: " + receiveData); + + // IP地址 + String ip = checkStr.substring(0,8); + // 端口号 + String port = checkStr.substring(8,12); + // COM口 + String dataCom = checkStr.substring(12,14); + // 数据 + String dataStr1 = checkStr.substring(14,receiveData.length()-4); + // 校验采集回来的数据 + // 检验报文 + String checkStr1 = dataStr1.substring(0,dataStr1.length()-4); + byte[] strOrder1 = ExchangeStringUtil.hexStrToBinaryStr(checkStr1); + int checkNum1 = CRC16.CRC16_MODBUS(strOrder1); + String checkWord1 = ExchangeStringUtil.decToHex(String.valueOf(checkNum1)); + checkWord1 = checkWord1.substring(2,4) + checkWord1.substring(0,2); + +// String checkWord1 = ExchangeStringUtil.getCRCStr(dataStr1); + if (checkWord1.equalsIgnoreCase(dataStr1.substring(dataStr1.length()-4))) { + // 时间 + //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); + Date date = new Date(); + String dateStr = sdf1.format(date); + + String dataStr = dataStr1.substring(0,dataStr1.length()-4);; + + // 冷水机组的地址 + String chillerAddr = ExchangeStringUtil.hexToDec(dataStr.substring(0, 2)); + + String data = ""; + if (dataStr.substring(2, 4).equalsIgnoreCase("01")) { // 读取状态 + if (dataStr.length() == 8) { + + // 状态 + data = ExchangeStringUtil.hexToDec(dataStr.substring(6, 8)); + + log.info("时间: " + dateStr + ",冷水机组ID: " + chillerAddr + ",状态: " + data); + } + } else if (dataStr.substring(2, 4).equalsIgnoreCase("03") || dataStr.substring(2, 4).equalsIgnoreCase("04")) { + if (dataStr.length() == 10) { + + if (chillersEntity.getDigit() == 1) { + // 数据 + data = Double.toString(Integer.parseInt(ExchangeStringUtil.hexToDec(dataStr.substring(6, 10))) * 0.1); + } else { + // 数据 + data = ExchangeStringUtil.hexToDec(dataStr.substring(6, 10)); + } + log.info("时间: " + dateStr + ",冷水机组ID: " + chillerAddr + ",数值: " + data); + } + } + + // 赋值给ChillersEntity + chillersEntity.setDeviceNum(chillerAddr); + chillersEntity.setDeviceCode(chillerAddr); + chillersEntity.setCollectionNum(chillerAddr); + chillersEntity.setLastTime(dateStr); + chillersEntity.setLastValue(data); + + } + + } + + } + + + // 判断是否存在寄存器地址 + public Boolean queryRegisterAddr(List stringList, String registerAddr){ + boolean flag = false; + for (int i = 0; i < stringList.size(); i++) { + if (stringList.get(i).equalsIgnoreCase(registerAddr)) { + flag = true; + break; + } + } + return flag; + } + + public static void main(String[] args) { +// analysisMeterOrder485("FEFEFEFE6825110040010868810643C3443B3333C116"); +// analysisCloudOrder485("58 03 04 86 9F 00 01 EB 90"); + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); +// String readStr = "c0a8020a1f90ff02fd0000000100000200000300000400000500000600000700000800010900000a007d0b00010c90e50d00000e00000f0000100000110022120000132d1e140000150000160000170001182c381900001a01a61b00001c00001d00011e00011f25d120000121b7b12200002300002400002500002600712700002834202900002a00002b00002c00002d00402e00002f03632f88"; +// analysisReceiveOrder485.analysisChillersDDC(readStr); +// String readStr = "c0a8020a1f9002fefefefe6880025007000068810643c38c3433335c161fff"; +// analysisReceiveOrder485.analysisMeterOrder485(readStr); + String chillersStr = "A9 FE C2 C7 1F 90 01 01 03 02 00 00 B8 44 0F 49"; + analysisReceiveOrder485.analysisChillerOrder485(chillersStr,new ChillersEntity()); + } + +} diff --git a/user-service/src/test/java/com/mh/user/receive/receiveTest.java b/user-service/src/test/java/com/mh/user/receive/receiveTest.java new file mode 100644 index 0000000..a3d6610 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/receive/receiveTest.java @@ -0,0 +1,40 @@ +package com.mh.user.receive; + +import com.mh.user.entity.ChillersEntity; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * @Classname receiveTest + * @Description TODO + * @Date 2020-06-11 15:08 + * @Created by LJF + */ +@Slf4j +@SpringBootTest +public class receiveTest { + + @Test + public void receiveStr() { + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); +// String readStr = "c0a8020a1f90ff02fd0000000100000200000300000400000500000600000700000800010900000a007d0b00010c90e50d00000e00000f0000100000110022120000132d1e140000150000160000170001182c381900001a01a61b00001c00001d00011e00011f25d120000121b7b12200002300002400002500002600712700002834202900002a00002b00002c00002d00402e00002f03632f88"; +// String readStr = "c0a8020a1f90ff0ef100000001000002000003000004000005002906000007000008000e0900000a040d0b00000c00000d02380e00000f000010000311000012008c1300001400001502391600001700001800091900001a03e24e01"; +// String readStr = "c0a8020a1f9002fefefefe6880025007000068810643c38c3433335c161fff"; +// String readStr = "a9fec2c71f9002fefefefe6839025007000068810643c3b4446c338616c577"; + String readStr = "A9 FE C2 C7 1F 90 01 58 03 04 4A 30 00 53 65 1C C4 06"; + analysisReceiveOrder485.analysisCloudOrder485(readStr); + } + + @Test + public void testEntity() { + ChillersEntity chillersEntity = new ChillersEntity(); + chillersEntity.setDataCom("COM1111"); + test(chillersEntity); + } + + public void test(ChillersEntity chillersEntity) { + chillersEntity.setDdcAddr("123333"); + log.info(chillersEntity.toString()); + } +} diff --git a/user-service/src/test/java/com/mh/user/socket/BIOServer.java b/user-service/src/test/java/com/mh/user/socket/BIOServer.java new file mode 100644 index 0000000..91812eb --- /dev/null +++ b/user-service/src/test/java/com/mh/user/socket/BIOServer.java @@ -0,0 +1,86 @@ +package com.mh.user.socket; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * @author ljf + * @title : + * @description : 阻塞式编程 + * @updateTime 2020-04-20 + * @throws : + */ +public class BIOServer { + + // 引用线程池 + private static ExecutorService threadPool = Executors.newCachedThreadPool(); + + public static void main(String[] args) throws Exception { + ServerSocket sc = new ServerSocket(9093); + System.out.println("服务器启动成功!"); + while (!sc.isClosed()) { + Socket request = sc.accept(); // 阻塞 + System.out.println("收到新连接:" + request.toString()); + + // 引用线程池 + threadPool.execute(() -> { + try { + InputStream is = request.getInputStream(); // net+i/o + BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8")); + String msg; + while ((msg = reader.readLine()) != null) { // 没有数据会阻塞 + if (msg.length() == 0) { + break; + } + System.out.println(msg); + } + System.out.println("收到数据,来自:" + request.toString()); + + // 响应http结果 + // 响应结果 + OutputStream outputStream = request.getOutputStream(); + outputStream.write("HTTP/1.1 200 ok\r\n".getBytes()); + outputStream.write("Content-Length: 40\r\n\r\n".getBytes()); + outputStream.write("".getBytes()); + } catch (Exception e) { + // TODO: handle exception + } finally { + try { + request.close(); + } catch (Exception e2) { + // TODO: handle exception + } + } + }); + +// try { +// InputStream is = request.getInputStream(); // net+i/o +// BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8")); +// String msg; +// while ((msg = reader.readLine()) != null) { // 没有数据会阻塞 +// if (msg.length() == 0) { +// break; +// } +// System.out.println(msg); +// } +// System.out.println("收到数据,来自:" + request.toString()); +// } catch (Exception e) { +// // TODO: handle exception +// } finally { +// try { +// request.close(); +// } catch (Exception e2) { +// // TODO: handle exception +// } +// } + + } + } + +} diff --git a/user-service/src/test/java/com/mh/user/socket/NIOServer.java b/user-service/src/test/java/com/mh/user/socket/NIOServer.java new file mode 100644 index 0000000..06dc293 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/socket/NIOServer.java @@ -0,0 +1,246 @@ +package com.mh.user.socket; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Set; + +/** + * @author ljf + * @title : NIO 非阻塞式编程 + * @description : + * @updateTime 2020-04-20 + * @throws : + */ +@Slf4j +public class NIOServer { + + /** + * 已经建立连接的集合 + */ + private static ArrayList channels = new ArrayList<>(); + + public static void main(String[] args) throws IOException { + log.info("test"); + NIOServer nioServer = new NIOServer(); + // 缓冲测试 +// nioServer.BufferTest(); + // 通道测试 +// nioServer.ChannelTest(); + // Selector单线程操作 + nioServer.SelectorSingleTest(); + } + + // 缓冲区使用 + public void BufferTest(){ +// // 构建一个堆内字节缓冲区 +// ByteBuffer byteBuffer = ByteBuffer.allocate(4); + // 构建一个堆外字节缓冲区 + ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4); + // 默认写入模式,查看三个重要的指标 + log.info(String.format("初始化:capacity容量:%s, position位置:%s, limit限制:%s", byteBuffer.capacity(), + byteBuffer.position(), byteBuffer.limit())); + // 写入字节 + byteBuffer.put((byte) 1); + byteBuffer.put((byte) 2); + byteBuffer.put((byte) 3); + // 查看占用多少 + log.info(String.format("初始化:capacity容量:%s, position位置:%s, limit限制:%s", byteBuffer.capacity(), + byteBuffer.position(), byteBuffer.limit())); + + // 转换为读取方式(如果不调用buffer.flip方式,读取的顺序不对) + byteBuffer.flip(); + // 读取 + byte a = byteBuffer.get(); + log.info(""+a); + byte b = byteBuffer.get(); + log.info(""+b); + // 查看占用多少 + log.info(String.format("读取后的结果:capacity容量:%s, position位置:%s, limit限制:%s", byteBuffer.capacity(), + byteBuffer.position(), byteBuffer.limit())); + // 继续写入3字节,此时读模式下,limit=3,position=2.继续写入只能覆盖写入一条数据 + // clear()方法清除整个缓冲区。compact()方法仅清除已阅读的数据。转为写入模式 + byteBuffer.compact(); // buffer内部还残留1个数据,还可以写3个数据 + byteBuffer.put((byte) 3); + byteBuffer.put((byte) 4); + byteBuffer.put((byte) 5); + // 查看占用多少 + log.info(String.format("最终的结果:capacity容量:%s, position位置:%s, limit限制:%s", byteBuffer.capacity(), + byteBuffer.position(), byteBuffer.limit())); + } + + // Channel通道测试, 基于非阻塞式 + public void ChannelTest() throws IOException { + // 创建网络服务端 + ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); + // 设置成非阻塞式 + serverSocketChannel.configureBlocking(false); + // 绑定端口号 + serverSocketChannel.socket().bind(new InetSocketAddress(9093)); + log.info("启动成功"); + while(true){ + // 获取新tcp连接通道 + SocketChannel socketChannel = serverSocketChannel.accept(); +// // tcp 请求、响应 +// if (socketChannel != null){ +// log.info("收到新连接:"+serverSocketChannel.getLocalAddress()); +// // 设置非阻塞式 +// serverSocketChannel.configureBlocking(false); +// try { +// ByteBuffer requestBuffer = ByteBuffer.allocate(1024); +// while (socketChannel.isOpen() && socketChannel.read(requestBuffer) != -1) { +// // 长连接情况下,需要手动判断数据有没有读取结束 (此处做一个简单的判断: 超过0字节就认为请求结束了) +// if (requestBuffer.position() > 0) +// break; +// } +// if (requestBuffer.position() == 0) +// continue; // 如果没数据了, 则不继续后面的处理 +// requestBuffer.flip(); +// byte[] content = new byte[requestBuffer.limit()]; +// requestBuffer.get(content); +// log.info(new String(content)); +// log.info("收到数据,来自:" + socketChannel.getRemoteAddress()); +// +// // 响应结果 200 +// String response = "HTTP/1.1 200 OK\r\n" + "Content-Length: 11\r\n\r\n" + "Hello World"; +// ByteBuffer buffer = ByteBuffer.wrap(response.getBytes()); +// while (buffer.hasRemaining()) { +// socketChannel.write(buffer);// 非阻塞 +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } + // tcp请求 读取/响应 + if (socketChannel != null) { + log.info("收到新连接 : " + socketChannel.getRemoteAddress()); + socketChannel.configureBlocking(false); // 默认是阻塞的,一定要设置为非阻塞 + channels.add(socketChannel); + } else { + // 没有新连接的情况下,就去处理现有连接的数据,处理完的就删除掉 + Iterator iterator = channels.iterator(); + while (iterator.hasNext()) { + SocketChannel ch = iterator.next(); + try { + ByteBuffer requestBuffer = ByteBuffer.allocate(1024); + // 如果通道里没有数据,就没必要再继续下面的循环读取了 + if (ch.read(requestBuffer) == 0) { + // 等于0,代表这个通道没有数据需要处理,那就待会再处理 + continue; + } + while (ch.isOpen() && ch.read(requestBuffer) != -1) { + // 长连接情况下,需要手动判断数据有没有读取结束 (此处做一个简单的判断: 超过0字节就认为请求结束了) + if (requestBuffer.position() > 0) + break; + } + if (requestBuffer.position() == 0) + continue; // 如果没数据了, 则不继续后面的处理 + requestBuffer.flip(); + byte[] content = new byte[requestBuffer.limit()]; + requestBuffer.get(content); + log.info(new String(content)); + log.info("收到数据,来自:" + ch.getRemoteAddress()); + + // 响应结果 200 + String response = "HTTP/1.1 200 OK\r\n" + "Content-Length: 11\r\n\r\n" + "Hello World"; + ByteBuffer buffer = ByteBuffer.wrap(response.getBytes()); + while (buffer.hasRemaining()) { + ch.write(buffer); + } + iterator.remove(); + } catch (IOException e) { + e.printStackTrace(); + iterator.remove(); + } + } + } + } + } + + /** + * Selector多路复用器(单线程方式) 结合Selector实现的非阻塞服务端(放弃对channel的轮询,借助消息通知机制) + */ + public void SelectorSingleTest() throws IOException { + // 1、创建网络服务端ServerSocketChannel + ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); + // 设置为非阻塞模式 + serverSocketChannel.configureBlocking(false); + + // 2、创建一个Selector选择器,并将channel注册上去 + Selector selector = Selector.open(); + SelectionKey selectionKey = serverSocketChannel.register(selector,0,serverSocketChannel); // 注册 + selectionKey.interestOps(SelectionKey.OP_ACCEPT); // 对serverSocketChannel上面的accept事件感兴趣(serverSocketChannel只能支持accept操作) + + // 3、绑定端口 + serverSocketChannel.socket().bind(new InetSocketAddress(9093)); + + log.info("启动Selector程序成功"); + + while(true){ + // 不使用轮询通道的方式,使用.select方式阻塞效果,知道有通知才会有返回 + selector.select(); + // 获取事件 + Set selectionKeys = selector.selectedKeys(); + // 遍历查询结果 + Iterator iterator = selectionKeys.iterator(); + while (iterator.hasNext()){ + // 被封装的查询结果 + SelectionKey key = iterator.next(); + iterator.remove(); + // 关注Read和Accept事件 + if (key.isAcceptable()){ + ServerSocketChannel serverSocketChannel1 = (ServerSocketChannel) key.attachment(); + // 将拿到的客户端连接通信,注册到selector上面 + SocketChannel clientSocketChannel = serverSocketChannel1.accept(); // mainReactor轮询accept + clientSocketChannel.configureBlocking(false); // 设置非阻塞 + clientSocketChannel.register(selector,SelectionKey.OP_READ,clientSocketChannel); + log.info("收到新连接:"+clientSocketChannel.getRemoteAddress()); + } + // 读取数据 + if (key.isReadable()){ + SocketChannel socketChannel = (SocketChannel) key.attachment(); + try{ + ByteBuffer requestBuffer = ByteBuffer.allocate(1024); + while (socketChannel.isOpen() && socketChannel.read(requestBuffer) != -1){ + // 长时间连接情况下,需要手动进行数据判断,有没有读取结束,超过0字节就是请求结束 + if (requestBuffer.position() > 0){ + break; + } + if (requestBuffer.position() == 0) + continue; + requestBuffer.flip(); + byte[] content = new byte[requestBuffer.limit()]; + requestBuffer.get(content); + log.info(new String(content)); + log.info("收到数据,来自:"+socketChannel.getRemoteAddress()); + // 进行业务操作 + + //进行相应 + String response = "HTTP/1.1 200 OK\r\n" + + "Content-Length: 11\r\n\r\n" + + "Hello World"; + ByteBuffer buffer = ByteBuffer.wrap(response.getBytes()); + while (buffer.hasRemaining()) { + socketChannel.write(buffer); + } + } + }catch (IOException e){ + key.cancel();//取消消息订阅 + } + } + } + selector.selectNow(); + } + // 问题: 此处一个selector监听所有事件,一个线程处理所有请求事件. 会成为瓶颈! 要有多线程的运用 + } + +} + diff --git a/user-service/src/test/java/com/mh/user/socket/NIOServer2.java b/user-service/src/test/java/com/mh/user/socket/NIOServer2.java new file mode 100644 index 0000000..35af2e1 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/socket/NIOServer2.java @@ -0,0 +1,96 @@ +package com.mh.user.socket; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-04-20 + * @throws : + */ + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.Iterator; +import java.util.Set; + +/** + * 结合Selector实现的非阻塞服务端(放弃对channel的轮询,借助消息通知机制) + */ +public class NIOServer2 { + + public static void main(String[] args) throws Exception { + // 1. 创建网络服务端ServerSocketChannel + ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); + serverSocketChannel.configureBlocking(false); // 设置为非阻塞模式 + + // 2. 构建一个Selector选择器,并且将channel注册上去 + Selector selector = Selector.open(); + SelectionKey selectionKey = serverSocketChannel.register(selector, 0, serverSocketChannel);// 将serverSocketChannel注册到selector + selectionKey.interestOps(SelectionKey.OP_ACCEPT); // 对serverSocketChannel上面的accept事件感兴趣(serverSocketChannel只能支持accept操作) + + // 3. 绑定端口 + serverSocketChannel.socket().bind(new InetSocketAddress(8080)); + + System.out.println("启动成功"); + + while (true) { + // 不再轮询通道,改用下面轮询事件的方式.select方法有阻塞效果,直到有事件通知才会有返回 + selector.select(); + // 获取事件 + Set selectionKeys = selector.selectedKeys(); + // 遍历查询结果e + Iterator iter = selectionKeys.iterator(); + while (iter.hasNext()) { + // 被封装的查询结果 + SelectionKey key = iter.next(); + iter.remove(); + // 关注 Read 和 Accept两个事件 + if (key.isAcceptable()) { + ServerSocketChannel server = (ServerSocketChannel) key.attachment(); + // 将拿到的客户端连接通道,注册到selector上面 + SocketChannel clientSocketChannel = server.accept(); // mainReactor 轮询accept + clientSocketChannel.configureBlocking(false); + clientSocketChannel.register(selector, SelectionKey.OP_READ, clientSocketChannel); + System.out.println("收到新连接 : " + clientSocketChannel.getRemoteAddress()); + } + + if (key.isReadable()) { + SocketChannel socketChannel = (SocketChannel) key.attachment(); + try { + ByteBuffer requestBuffer = ByteBuffer.allocate(1024); + while (socketChannel.isOpen() && socketChannel.read(requestBuffer) != -1) { + // 长连接情况下,需要手动判断数据有没有读取结束 (此处做一个简单的判断: 超过0字节就认为请求结束了) + if (requestBuffer.position() > 0) break; + } + if(requestBuffer.position() == 0) continue; // 如果没数据了, 则不继续后面的处理 + requestBuffer.flip(); + byte[] content = new byte[requestBuffer.limit()]; + requestBuffer.get(content); + System.out.println(new String(content)); + System.out.println("收到数据,来自:" + socketChannel.getRemoteAddress()); + // TODO 业务操作 数据库 接口调用等等 + + // 响应结果 200 + String response = "HTTP/1.1 200 OK\r\n" + + "Content-Length: 11\r\n\r\n" + + "Hello World"; + ByteBuffer buffer = ByteBuffer.wrap(response.getBytes()); + while (buffer.hasRemaining()) { + socketChannel.write(buffer); + } + } catch (IOException e) { + // e.printStackTrace(); + key.cancel(); // 取消事件订阅 + } + } + } + selector.selectNow(); + } + // 问题: 此处一个selector监听所有事件,一个线程处理所有请求事件. 会成为瓶颈! 要有多线程的运用 + } +} diff --git a/user-service/src/test/java/com/mh/user/socket/NIOServerV3.java b/user-service/src/test/java/com/mh/user/socket/NIOServerV3.java new file mode 100644 index 0000000..74c103a --- /dev/null +++ b/user-service/src/test/java/com/mh/user/socket/NIOServerV3.java @@ -0,0 +1,204 @@ +package com.mh.user.socket; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.*; +import java.util.Iterator; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.FutureTask; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * NIO selector 多路复用reactor线程模型 + */ +public class NIOServerV3 { + /** 处理业务操作的线程 */ + private static ExecutorService workPool = Executors.newCachedThreadPool(); + + /** + * 封装了selector.select()等事件轮询的代码 + */ + abstract class ReactorThread extends Thread { + + Selector selector; + LinkedBlockingQueue taskQueue = new LinkedBlockingQueue<>(); + + /** + * Selector监听到有事件后,调用这个方法 + */ + public abstract void handler(SelectableChannel channel) throws Exception; + + private ReactorThread() throws IOException { + selector = Selector.open(); + } + + volatile boolean running = false; + + @Override + public void run() { + // 轮询Selector事件 + while (running) { + try { + // 执行队列中的任务 + Runnable task; + while ((task = taskQueue.poll()) != null) { + task.run(); + } + selector.select(1000); + + // 获取查询结果 + Set selected = selector.selectedKeys(); + // 遍历查询结果 + Iterator iter = selected.iterator(); + while (iter.hasNext()) { + // 被封装的查询结果 + SelectionKey key = iter.next(); + iter.remove(); + int readyOps = key.readyOps(); + // 关注 Read 和 Accept两个事件 + if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || readyOps == 0) { + try { + SelectableChannel channel = (SelectableChannel) key.attachment(); + channel.configureBlocking(false); + handler(channel); + if (!channel.isOpen()) { + key.cancel(); // 如果关闭了,就取消这个KEY的订阅 + } + } catch (Exception ex) { + key.cancel(); // 如果有异常,就取消这个KEY的订阅 + } + } + } + selector.selectNow(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private SelectionKey register(SelectableChannel channel) throws Exception { + // 为什么register要以任务提交的形式,让reactor线程去处理? + // 因为线程在执行channel注册到selector的过程中,会和调用selector.select()方法的线程争用同一把锁 + // 而select()方法实在eventLoop中通过while循环调用的,争抢的可能性很高,为了让register能更快的执行,就放到同一个线程来处理 + FutureTask futureTask = new FutureTask<>(() -> channel.register(selector, 0, channel)); + taskQueue.add(futureTask); + return futureTask.get(); + } + + private void doStart() { + if (!running) { + running = true; + start(); + } + } + } + + private ServerSocketChannel serverSocketChannel; + // 1、创建多个线程 - accept处理reactor线程 (accept线程) + private ReactorThread[] mainReactorThreads = new ReactorThread[1]; + // 2、创建多个线程 - io处理reactor线程 (I/O线程) + private ReactorThread[] subReactorThreads = new ReactorThread[8]; + + /** + * 初始化线程组 + */ + private void newGroup() throws IOException { + // 创建IO线程,负责处理客户端连接以后socketChannel的IO读写 + for (int i = 0; i < subReactorThreads.length; i++) { + subReactorThreads[i] = new ReactorThread() { + @Override + public void handler(SelectableChannel channel) throws IOException { + // work线程只负责处理IO处理,不处理accept事件 + SocketChannel ch = (SocketChannel) channel; + ByteBuffer requestBuffer = ByteBuffer.allocate(1024); + while (ch.isOpen() && ch.read(requestBuffer) != -1) { + // 长连接情况下,需要手动判断数据有没有读取结束 (此处做一个简单的判断: 超过0字节就认为请求结束了) + if (requestBuffer.position() > 0) break; + } + if (requestBuffer.position() == 0) return; // 如果没数据了, 则不继续后面的处理 + requestBuffer.flip(); + byte[] content = new byte[requestBuffer.limit()]; + requestBuffer.get(content); + System.out.println(new String(content)); + System.out.println(Thread.currentThread().getName() + "收到数据,来自:" + ch.getRemoteAddress()); + + // TODO 业务操作 数据库、接口... + workPool.submit(() -> { + }); + + // 响应结果 200 + String response = "HTTP/1.1 200 OK\r\n" + + "Content-Length: 11\r\n\r\n" + + "Hello World"; + ByteBuffer buffer = ByteBuffer.wrap(response.getBytes()); + while (buffer.hasRemaining()) { + ch.write(buffer); + } + } + }; + } + + // 创建mainReactor线程, 只负责处理serverSocketChannel + for (int i = 0; i < mainReactorThreads.length; i++) { + mainReactorThreads[i] = new ReactorThread() { + AtomicInteger incr = new AtomicInteger(0); + + @Override + public void handler(SelectableChannel channel) throws Exception { + // 只做请求分发,不做具体的数据读取 + ServerSocketChannel ch = (ServerSocketChannel) channel; + SocketChannel socketChannel = ch.accept(); + socketChannel.configureBlocking(false); + // 收到连接建立的通知之后,分发给I/O线程继续去读取数据 + int index = incr.getAndIncrement() % subReactorThreads.length; + ReactorThread workEventLoop = subReactorThreads[index]; + workEventLoop.doStart(); + SelectionKey selectionKey = workEventLoop.register(socketChannel); + selectionKey.interestOps(SelectionKey.OP_READ); + System.out.println(Thread.currentThread().getName() + "收到新连接 : " + socketChannel.getRemoteAddress()); + } + }; + } + + + } + + /** + * 初始化channel,并且绑定一个eventLoop线程 + * + * @throws IOException IO异常 + */ + private void initAndRegister() throws Exception { + // 1、 创建ServerSocketChannel + serverSocketChannel = ServerSocketChannel.open(); + serverSocketChannel.configureBlocking(false); + // 2、 将serverSocketChannel注册到selector + int index = new Random().nextInt(mainReactorThreads.length); + mainReactorThreads[index].doStart(); + SelectionKey selectionKey = mainReactorThreads[index].register(serverSocketChannel); + selectionKey.interestOps(SelectionKey.OP_ACCEPT); + } + + /** + * 绑定端口 + * + * @throws IOException IO异常 + */ + private void bind() throws IOException { + // 1、 正式绑定端口,对外服务 + serverSocketChannel.bind(new InetSocketAddress(9093)); + System.out.println("启动完成,端口9093"); + } + + public static void main(String[] args) throws Exception { + NIOServerV3 nioServerV3 = new NIOServerV3(); + nioServerV3.newGroup(); // 1、 创建main和sub两组线程 + nioServerV3.initAndRegister(); // 2、 创建serverSocketChannel,注册到mainReactor线程上的selector上 + nioServerV3.bind(); // 3、 为serverSocketChannel绑定端口 + } +} \ No newline at end of file diff --git a/user-service/src/test/java/com/mh/user/socket/NettyClientTest.java b/user-service/src/test/java/com/mh/user/socket/NettyClientTest.java new file mode 100644 index 0000000..1834b40 --- /dev/null +++ b/user-service/src/test/java/com/mh/user/socket/NettyClientTest.java @@ -0,0 +1,58 @@ +package com.mh.user.socket; + +import com.mh.user.netty.NettyChillerClient; +import com.mh.user.netty.NettyChillerDDCClient; +import com.mh.user.netty.NettyClient; +import com.mh.user.netty.NettyMeterClient; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * @author ljf + * @title : + * @description : + * @updateTime 2020-05-13 + * @throws : + */ +@Slf4j +@SpringBootTest +public class NettyClientTest { + + @Test + void Test() throws InterruptedException { + NettyClient nettyClient = new NettyClient(); + nettyClient.connect(1008,"192.168.1.222"); +// Thread.sleep(5000); +// nettyClient.connect(10100,"192.168.1.222"); + } + + @Test + void Test1() throws InterruptedException { + NettyClient nettyClient = new NettyClient(); + nettyClient.connect(8080,"192.168.2.10"); +// Thread.sleep(5000); +// nettyClient.connect(10100,"192.168.1.222"); + } + + @Test + void testChillers() throws InterruptedException { + NettyChillerClient nettyChillerClient = new NettyChillerClient(); + nettyChillerClient.connect(8080,"169.254.194.199"); + } + + @Test + void testDDCChillers() throws InterruptedException { + NettyChillerDDCClient.connect(8080,"169.254.194.199"); +// NettyChillerDDCClient.connect(8080,"169.254.194.199"); + + } + + @Test + void testMeterChillers() throws InterruptedException { + NettyMeterClient nettyMeterClient = new NettyMeterClient(); + nettyMeterClient.connect(8080,"192.168.2.10"); +// nettyMeterClient.connect(9000,"192.168.2.54"); + } + +} diff --git a/user-service/src/test/java/com/mh/user/socket/NettyEchoServer.java b/user-service/src/test/java/com/mh/user/socket/NettyEchoServer.java new file mode 100644 index 0000000..d7b285b --- /dev/null +++ b/user-service/src/test/java/com/mh/user/socket/NettyEchoServer.java @@ -0,0 +1,182 @@ +package com.mh.user.socket; + +import com.mh.user.utils.ExchangeStringUtil; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; + +import java.io.IOException; +import java.net.InetSocketAddress; + + +/** + * @author ljf + * @title :Netty + * @description :netty 使用 + * @updateTime 2020-04-21 + * @throws : + */ +@Slf4j +public class NettyEchoServer { + + public void bind(int port) throws Exception { + // accept线程组,用来接收连接 + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + // IO 线程组,用来处理业务逻辑 + EventLoopGroup workerGroup = new NioEventLoopGroup(1); + + try { + // 服务端启动引导 + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap.group(bossGroup,workerGroup) // 绑定两个线程 + .channel(NioServerSocketChannel.class) // 指定通道类型 + .option(ChannelOption.SO_BACKLOG, 1024) // 设置TCP连接的缓冲区 + .handler(new LoggingHandler(LogLevel.INFO)) // 设置日志级别 + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + ChannelPipeline pipeline = socketChannel.pipeline(); // 获取处理器链 + pipeline.addLast(new EchoServerHandler()); // 添加新的事件处理器 + } + }); + // 通过bind启动服务 + ChannelFuture f = serverBootstrap.bind(port).sync(); + // 阻塞主线程,知道网络服务被关闭 + f.channel().closeFuture().sync(); + } catch (Exception e){ + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } + + static class EchoServerHandler extends ChannelHandlerAdapter { + + // 每当从客户端收到新的数据时,这个方法会在收到消息时被调用 + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + try { + ByteBuf buf = (ByteBuf)msg; + byte [] bytes = new byte[buf.readableBytes()]; + buf.readBytes(bytes);//复制内容到字节数组bytes + String receiveStr = ExchangeStringUtil.bytesToHexString(bytes);//将接收到的数据转为字符串,此字符串就是客户端发送的字符串 + log.info("接收到的数据: "+ receiveStr); + //返回16进制到客户端 + writeToClient(receiveStr,ctx,"测试"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } +// ctx.write(Unpooled.wrappedBuffer("Server message".getBytes())); +// ctx.fireChannelRead(msg); + } + + // 数据读取完后被调用 + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + ctx.flush(); + } + + // 当Netty由于IO错误或者处理器在处理事件时抛出的异常时被调用 + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } + + /** + * 客户端与服务端第一次建立连接时 执行 + * + * @param ctx + * @throws Exception + */ + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception, IOException + { + super.channelActive(ctx); + ctx.channel().read(); + InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ifsock.getAddress().getHostAddress(); + //此处不能使用ctx.close(),否则客户端始终无法与服务端建立连接 + log.info("channelActive: "+clientIp + ctx.name()); + } + + /** + * 客户端与服务端 断连时 执行 + * + * @param ctx + * @throws Exception + */ + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception, IOException + { + super.channelInactive(ctx); + InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ifsock.getAddress().getHostAddress(); + ctx.close(); //断开连接时,必须关闭,否则造成资源浪费,并发量很大情况下可能造成宕机 + System.out.println("channelInactive:"+clientIp); + } + + /** + * 服务端当read超时, 会调用这个方法 + * + * @param ctx + * @param evt + * @throws Exception + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception, IOException + { + super.userEventTriggered(ctx, evt); + InetSocketAddress ifsock = (InetSocketAddress) ctx.channel().remoteAddress(); + String clientIp = ifsock.getAddress().getHostAddress(); + ctx.close();//超时时断开连接 + System.out.println("userEventTriggered:"+clientIp); + } + + + /** + * 公用回写数据到客户端的方法 + * @param channel + * @param mark 用于打印/log的输出 + *
//channel.writeAndFlush(msg);//不行 + *
//channel.writeAndFlush(receiveStr.getBytes());//不行 + *
在netty里,进出的都是ByteBuf,楼主应确定服务端是否有对应的编码器,将字符串转化为ByteBuf + */ + private void writeToClient(final String receiveStr, ChannelHandlerContext channel, final String mark) { + try { + ByteBuf buff = Unpooled.buffer();//netty需要用ByteBuf传输 + buff.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(receiveStr));//对接需要16进制 + channel.writeAndFlush(buff).addListener(new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture future) throws Exception { + StringBuilder sb = new StringBuilder(""); + if(!StringUtils.isEmpty(mark)){ + sb.append("【").append(mark).append("】"); + } + if (future.isSuccess()) { + System.out.println(sb.toString()+"回写成功"+receiveStr); + log.info(sb.toString()+"回写成功"+receiveStr); + } else { + System.out.println(sb.toString()+"回写失败"+receiveStr); + log.error(sb.toString()+"回写失败"+receiveStr); + } + } + }); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("调用通用writeToClient()异常"+e.getMessage()); + log.error("调用通用writeToClient()异常:",e); + } + } + } +}