Compare commits

...

11 Commits
master ... show

  1. 31
      .gitignore
  2. 3
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/main/vo/AppHydropowerStationVo.java
  3. 22
      hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/log/AppLogEntity.java
  4. 19
      hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/log/MailLogEntity.java
  5. 57
      hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/log/MessageLogEntity.java
  6. 24
      hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/log/SmsLogEntity.java
  7. 13
      hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/log/WsLogEntity.java
  8. 3
      hzims-service-api/weather-api/src/main/java/com/hnac/hzims/hzimsweather/HeWeatherInitialize.java
  9. 31
      hzims-service/hikvision/pom.xml
  10. 28
      hzims-service/hikvision/src/main/java/com/hnac/hzims/hikvision/HikvisionApplication.java
  11. 33
      hzims-service/hikvision/src/main/java/com/hnac/hzims/hikvision/config/HikvisionConfig.java
  12. 26
      hzims-service/hikvision/src/main/java/com/hnac/hzims/hikvision/controller/HikvisionController.java
  13. 14
      hzims-service/hikvision/src/main/java/com/hnac/hzims/hikvision/service/IHikvisionService.java
  14. 55
      hzims-service/hikvision/src/main/java/com/hnac/hzims/hikvision/service/impl/HikvisionServiceImpl.java
  15. 10
      hzims-service/hikvision/src/main/resources/application-dev.yml
  16. 6
      hzims-service/hikvision/src/main/resources/application-prod.yml
  17. 6
      hzims-service/hikvision/src/main/resources/application-test.yml
  18. 15
      hzims-service/hikvision/src/main/resources/application.yml
  19. 40
      hzims-service/hzims-scheduled/src/main/java/com/hnac/hzims/scheduled/service/operation/monitor/impl/MonitorServiceImpl.java
  20. 1
      hzims-service/inspect/pom.xml
  21. 216
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/aspect/LogAspect.java
  22. 19
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/aspect/SaveLog.java
  23. 21
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/mapper/AppLogMapper.java
  24. 24
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/mapper/AppLogMapper.xml
  25. 20
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/mapper/MailLogMapper.java
  26. 24
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/mapper/MailLogMapper.xml
  27. 21
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/mapper/SmsLogMapper.java
  28. 23
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/mapper/SmsLogMapper.xml
  29. 56
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/IAppLogService.java
  30. 38
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/IMailLogService.java
  31. 18
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/IMessageLogService.java
  32. 37
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/ISmsLogService.java
  33. 15
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/impl/AppLogServiceImpl.java
  34. 20
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/impl/MailLogServiceImpl.java
  35. 15
      hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/impl/SmsLogServiceImpl.java
  36. 7
      hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/controller/StFocusPropertiesController.java
  37. 2
      hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/StFocusPropertiesService.java
  38. 9
      hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/impl/StFocusPropertiesServiceImpl.java
  39. 14
      hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/service/impl/HydropowerServiceImpl.java
  40. 26
      hzims-service/operational/src/main/java/com/hnac/hzims/operational/station/service/impl/RealMonitorServiceImpl.java
  41. 34
      hzims-service/operational/src/main/java/com/hnac/hzims/operational/station/service/impl/StationVideoTypeServiceImpl.java
  42. 2
      hzims-service/pom.xml
  43. 110
      hzims-service/simulate/pom.xml
  44. 29
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/HzimsSimulateApplication.java
  45. 43
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/constants/WriteRealDataConstant.java
  46. 31
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/controller/GageController.java
  47. 181
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/controller/SimulationDataController.java
  48. 20
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DataItem.java
  49. 46
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DataModel.java
  50. 63
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/Device.java
  51. 22
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceData.java
  52. 19
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceDataV4.java
  53. 38
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceFacConfig.java
  54. 42
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceField.java
  55. 30
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceFieldGap.java
  56. 33
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceRainGap.java
  57. 18
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/Kvtq.java
  58. 18
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/KvtqV4.java
  59. 102
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/enums/ExceptionEnum.java
  60. 19
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFacConfigMapper.java
  61. 13
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFacConfigMapper.xml
  62. 16
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldGapMapper.java
  63. 18
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldGapMapper.xml
  64. 19
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldMapper.java
  65. 34
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldMapper.xml
  66. 18
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceMapper.java
  67. 15
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceMapper.xml
  68. 17
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceRainGapMapper.java
  69. 9
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceRainGapMapper.xml
  70. 113
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/scheduled/SimulateJob.java
  71. 41
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/scheduled/WriteRealDataTask.java
  72. 11
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/DeviceFieldGapService.java
  73. 24
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/DeviceFieldService.java
  74. 24
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/DeviceService.java
  75. 18
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/ISimulateService.java
  76. 279
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/SimulationService.java
  77. 12
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/WriteRealDataService.java
  78. 276
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/impl/SimulateServiceImpl.java
  79. 232
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/impl/WriteRealDataServiceImpl.java
  80. 357
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/DataConstants.java
  81. 105
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/ParseFacUtils.java
  82. 52
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/RealIdConvertUtils.java
  83. 18
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/TopicConstant.java
  84. 16
      hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/vo/GenerateFactoryDeviceVo.java
  85. 13
      hzims-service/simulate/src/main/resources/application-dev.yml
  86. 6
      hzims-service/simulate/src/main/resources/application-prod.yml
  87. 6
      hzims-service/simulate/src/main/resources/application-test.yml
  88. 15
      hzims-service/simulate/src/main/resources/application.yml
  89. 1
      hzims-service/ticket/pom.xml
  90. 1
      hzims-service/video-image/pom.xml
  91. 2
      hzims-service/weather/src/main/java/com/hnac/hzims/weather/aspect/WeatherCacheAspect.java
  92. 4
      hzims-service/weather/src/main/java/com/hnac/hzims/weather/config/StartupRunner.java
  93. 51
      hzims-service/weather/src/main/java/com/hnac/hzims/weather/schedule/StationWeatherSchedule.java
  94. 2
      pom.xml

31
.gitignore vendored

@ -1,8 +1,23 @@
*.idea *.class
/hzims-biz-common/target *.project
/hzims-service/*/target # Mobile Tools for Java (J2ME)
/hzims-service-api/*/target .mtj.tmp/
log .springBeans
# Package Files #
*.jar
*.war
*.ear
.DS_Store
hs_err_pid*
.factorypath
.project
.gradle/
.idea/
.settings/
*.iml
.classpath
build/
target/
*.logs
*.log
logs/

3
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/main/vo/AppHydropowerStationVo.java

@ -61,4 +61,7 @@ public class AppHydropowerStationVo {
@ApiModelProperty("站点告警列表") @ApiModelProperty("站点告警列表")
private List<AppHydropowerDeviceVo> devices; private List<AppHydropowerDeviceVo> devices;
@ApiModelProperty(value = "前池水位")
private Double frontWaterLevel;
} }

22
hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/log/AppLogEntity.java

@ -0,0 +1,22 @@
package com.hnac.hzims.message.entity.log;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author hx
*/
@ApiModel(value = "app推送日志对象",description = "app推送日志对象")
@TableName("hzims_app_log")
@Data
public class AppLogEntity extends MessageLogEntity {
@ApiModelProperty("是否推送全平台")
private Boolean isAll;
@ApiModelProperty("推送类型")
private String platformType;
}

19
hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/log/MailLogEntity.java

@ -0,0 +1,19 @@
package com.hnac.hzims.message.entity.log;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author hx
*/
@Data
@ApiModel(value = "邮箱推送日志",description = "邮箱推送日志")
@TableName("hzims_mail_log")
public class MailLogEntity extends MessageLogEntity {
@ApiModelProperty("推送邮箱")
private String email;
}

57
hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/log/MessageLogEntity.java

@ -0,0 +1,57 @@
package com.hnac.hzims.message.entity.log;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springblade.core.mp.support.QueryField;
import org.springblade.core.mp.support.SqlCondition;
import org.springblade.core.tenant.mp.TenantEntity;
import javax.validation.constraints.NotNull;
/**
* @author hx
*/
@Data
@ApiModel(value = "消息日志")
@TableName("hzims_mail_log")
public class MessageLogEntity extends TenantEntity {
@ApiModelProperty(value = "业务关键字",required = true)
@NotNull(message = "业务关键字不能为空")
@QueryField(condition = SqlCondition.LIKE)
private String businessKey;
@ApiModelProperty(value = "业务分类。系统通知:system,事务消息:business,日常提醒:dailyRemind,巡检消息:inspect",required = true)
@NotNull(message = "业务分类不能为空")
@QueryField(condition = SqlCondition.EQUAL)
private String businessClassify;
@ApiModelProperty(value = "主题",required = true)
@NotNull(message = "主题不能为空")
@QueryField(condition = SqlCondition.LIKE)
private String subject;
@ApiModelProperty(value = "内容",required = true)
@NotNull(message = "内容不能为空")
private String content;
@ApiModelProperty(value = "推送人")
@QueryField(condition = SqlCondition.EQUAL)
private String pusher;
@ApiModelProperty(value = "消息推送请求参数")
@QueryField(condition = SqlCondition.EQUAL)
private String params;
@ApiModelProperty(value = "错误日志")
private String errorLog;
@ApiModelProperty(value = "推送结果")
private String result;
@ApiModelProperty(value = "是否推送成功")
@QueryField(condition = SqlCondition.EQUAL)
private Boolean isSuccess;
}

24
hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/log/SmsLogEntity.java

@ -0,0 +1,24 @@
package com.hnac.hzims.message.entity.log;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author hx
*/
@Data
@ApiModel(value = "短信日志对象",description = "短信日志对象")
@TableName("hzims_sms_log")
public class SmsLogEntity extends MessageLogEntity implements Serializable {
@ApiModelProperty(value = "接受短信的手机号",required = true)
private String phones;
@ApiModelProperty("短信模板参数")
private String paramsJson;
}

13
hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/log/WsLogEntity.java

@ -0,0 +1,13 @@
package com.hnac.hzims.message.entity.log;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
* @author hx
*/
@ApiModel(value = "web推送日志对象",description = "web推送日志对象")
@Data
public class WsLogEntity extends MessageLogEntity {
}

3
hzims-service-api/weather-api/src/main/java/com/hnac/hzims/hzimsweather/HeWeatherInitialize.java

@ -16,7 +16,8 @@ public class HeWeatherInitialize {
HeWeatherInitialize.publicId = publicId; HeWeatherInitialize.publicId = publicId;
HeWeatherInitialize.privateKey = privateKey; HeWeatherInitialize.privateKey = privateKey;
//HeWeatherInitialize.domain = "https://api.heweather.net"; //HeWeatherInitialize.domain = "https://api.heweather.net";
HeWeatherInitialize.domain = "https://devapi.qweather.com"; //HeWeatherInitialize.domain = "https://devapi.qweather.com";
HeWeatherInitialize.domain = "https://mk5khnn58j.re.qweatherapi.com";
HeWeatherInitialize.geoDomain = "https://geoapi.heweather.net"; HeWeatherInitialize.geoDomain = "https://geoapi.heweather.net";
} }

31
hzims-service/hikvision/pom.xml

@ -0,0 +1,31 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.hnac.hzims</groupId>
<artifactId>hzims-service</artifactId>
<version>4.0.0-SNAPSHOT</version>
</parent>
<artifactId>hikvision</artifactId>
<packaging>jar</packaging>
<name>hikvision</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.hzinfo.framework</groupId>
<artifactId>hnac-framework-mqtt-starters</artifactId>
<version>${bladex.project.version}</version>
</dependency>
<dependency>
<groupId>com.hikvision.ga</groupId>
<artifactId>artemis-http-client</artifactId>
</dependency>
</dependencies>
</project>

28
hzims-service/hikvision/src/main/java/com/hnac/hzims/hikvision/HikvisionApplication.java

@ -0,0 +1,28 @@
package com.hnac.hzims.hikvision;
import org.mybatis.spring.annotation.MapperScan;
import org.springblade.core.cloud.feign.EnableBladeFeign;
import org.springblade.core.launch.BladeApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.SpringCloudApplication;
/**
* 海康威视微服务
*
* @author ypj
* @date 2025-06-12
*/
@EnableBladeFeign
@SpringCloudApplication
@MapperScan(basePackages = {"com.hnac.hzinfo.**.mapper"})
public class HikvisionApplication {
static String APPLICATION_NAME = "hzims-hikvision";
public static void main(String[] args) {
BladeApplication.run(APPLICATION_NAME, HikvisionApplication.class, args);
}
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return BladeApplication.createSpringApplicationBuilder(builder, APPLICATION_NAME, HikvisionApplication.class);
}
}

33
hzims-service/hikvision/src/main/java/com/hnac/hzims/hikvision/config/HikvisionConfig.java

@ -0,0 +1,33 @@
package com.hnac.hzims.hikvision.config;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
/**
* 海康威视配置
*
* @author ypj
* @date 2025-06-13
*/
@Configuration
@ConfigurationProperties(prefix = "hikvision.server")
@Data
@RefreshScope
public class HikvisionConfig {
private String host;
private String appKey;
private String appSecret;
public ArtemisConfig toArtemisConfig() {
ArtemisConfig artemisConfig = new ArtemisConfig();
artemisConfig.setHost(host);
artemisConfig.setAppKey(appKey);
artemisConfig.setAppSecret(appSecret);
return artemisConfig;
}
}

26
hzims-service/hikvision/src/main/java/com/hnac/hzims/hikvision/controller/HikvisionController.java

@ -0,0 +1,26 @@
package com.hnac.hzims.hikvision.controller;
import com.hnac.hzims.hikvision.service.IHikvisionService;
import lombok.RequiredArgsConstructor;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 海康威视智能告警
*
* @author ypj
* @date 2025-06-13
*/
@RestController
@RequestMapping("/hikvision")
@RequiredArgsConstructor
public class HikvisionController {
private final IHikvisionService hikvisionService;
@GetMapping("/getSubscriptionResult")
public R<String> getSubscriptionResult() {
return R.data(hikvisionService.getSubscriptionResult());
}
}

14
hzims-service/hikvision/src/main/java/com/hnac/hzims/hikvision/service/IHikvisionService.java

@ -0,0 +1,14 @@
package com.hnac.hzims.hikvision.service;
/**
* 海康威视视频服务
*
* @author ypj
* @date 2025-06-12
*/
public interface IHikvisionService {
String getSubscriptionResult();
Boolean subscribe();
}

55
hzims-service/hikvision/src/main/java/com/hnac/hzims/hikvision/service/impl/HikvisionServiceImpl.java

@ -0,0 +1,55 @@
package com.hnac.hzims.hikvision.service.impl;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.hnac.hzims.hikvision.config.HikvisionConfig;
import com.hnac.hzims.hikvision.service.IHikvisionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.java.Log;
import lombok.extern.slf4j.Slf4j;
import org.springblade.mqtt.config.MqttConfig;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
* 海康威视服务
*
* @author ypj
* @date 2025-06-12
*/
@Service
@Slf4j
@RequiredArgsConstructor
public class HikvisionServiceImpl implements IHikvisionService {
private final MqttConfig mqttConfig;
private final HikvisionConfig hikvisionConfig;
@Override
public String getSubscriptionResult() {
ArtemisConfig.host = this.hikvisionConfig.getHost();
ArtemisConfig.appKey = this.hikvisionConfig.getAppKey();
ArtemisConfig.appSecret = this.hikvisionConfig.getAppSecret();
final Map<String, String> subscriptionPath = new HashMap<String, String>(2) {
{
this.put("https://", "/artemis/api/eventService/v1/eventSubscriptionView");
}
};
return ArtemisHttpUtil.doPostStringArtemis(subscriptionPath,
"{\"subWay\":2}",
(Map<String, String>) null,
(String) null,
"application/json",
(Map<String, String>) null);
}
@Override
public Boolean subscribe() {
String result = this.getSubscriptionResult();
log.info("海康威视订阅结果:{}", result);
return Boolean.TRUE;
}
}

10
hzims-service/hikvision/src/main/resources/application-dev.yml

@ -0,0 +1,10 @@
#服务器端口
server:
port: 8271
#数据源配置
spring:
datasource:
url: ${blade.datasource.dev.url}
username: ${blade.datasource.dev.username}
password: ${blade.datasource.dev.password}

6
hzims-service/hikvision/src/main/resources/application-prod.yml

@ -0,0 +1,6 @@
#数据源配置
spring:
datasource:
url: ${blade.datasource.prod.url}
username: ${blade.datasource.prod.username}
password: ${blade.datasource.prod.password}

6
hzims-service/hikvision/src/main/resources/application-test.yml

@ -0,0 +1,6 @@
#数据源配置
spring:
datasource:
url: ${blade.datasource.test.url}
username: ${blade.datasource.test.username}
password: ${blade.datasource.test.password}

15
hzims-service/hikvision/src/main/resources/application.yml

@ -0,0 +1,15 @@
spring:
application:
name: hzims-hikvision
#mybatis-plus配置
mybatis-plus:
mapper-locations: classpath:org/springbalde/**/mapper/*Mapper.xml,classpath:com/hnac/hzinfo/**/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: org.springbalde.**.entity,com.hnac.hzinfo.**.entity
#swagger扫描路径配置
swagger:
base-packages:
- org.springbalde
- com.hnac.hzinfo

40
hzims-service/hzims-scheduled/src/main/java/com/hnac/hzims/scheduled/service/operation/monitor/impl/MonitorServiceImpl.java

@ -48,6 +48,7 @@ import java.util.stream.Stream;
/** /**
* 集中监控数据获取实现类 * 集中监控数据获取实现类
*
* @author ysj * @author ysj
*/ */
@Service @Service
@ -108,7 +109,8 @@ public class MonitorServiceImpl implements MonitorService {
} }
// 设备监测点list // 设备监测点list
Object json = redisTemplate.opsForValue().get(device_cache_final); Object json = redisTemplate.opsForValue().get(device_cache_final);
List<EminfoAndEmParamVo> eminfoAndEmParams = JSONObject.parseObject(json.toString(), new TypeReference<List<EminfoAndEmParamVo>>() {}); List<EminfoAndEmParamVo> eminfoAndEmParams = JSONObject.parseObject(json.toString(), new TypeReference<List<EminfoAndEmParamVo>>() {
});
// 厂房监测点list // 厂房监测点list
List<AnalyzeCodeBySignagesVO> wsMonitorList = this.getRealIdByWsCodeAndSign(); List<AnalyzeCodeBySignagesVO> wsMonitorList = this.getRealIdByWsCodeAndSign();
// 实时监控监测点list // 实时监控监测点list
@ -149,7 +151,9 @@ public class MonitorServiceImpl implements MonitorService {
@Override @Override
public void loadRealData(String param) { public void loadRealData(String param) {
// 获取设备 // 获取设备
List<EminfoAndEmParamVo> devices = JSONObject.parseObject(redisTemplate.opsForValue().get(device_cache_final).toString(),new TypeReference<List<EminfoAndEmParamVo>>() {});; List<EminfoAndEmParamVo> devices = JSONObject.parseObject(redisTemplate.opsForValue().get(device_cache_final).toString(), new TypeReference<List<EminfoAndEmParamVo>>() {
});
;
// 设备开关机集合监测点 // 设备开关机集合监测点
List<String> switchOnOff = devices.stream().map(o -> { List<String> switchOnOff = devices.stream().map(o -> {
Map<String, String> points = o.getPoint(); Map<String, String> points = o.getPoint();
@ -187,11 +191,11 @@ public class MonitorServiceImpl implements MonitorService {
if (CollectionUtil.isEmpty(realIds)) { if (CollectionUtil.isEmpty(realIds)) {
return; return;
} }
log.error("real_time_data: {},{}",stationReal.getStation(),realIds);
List<String> objects = redisClient.getBatchRealDataByRealId(stationReal.getStation(), realIds); List<String> objects = redisClient.getBatchRealDataByRealId(stationReal.getStation(), realIds);
List<String> emptyIds = new ArrayList<>();
for (int i = 0; i < realIds.size(); i++) { for (int i = 0; i < realIds.size(); i++) {
if (ObjectUtil.isEmpty(objects.get(i))) { if (ObjectUtil.isEmpty(objects.get(i))) {
log.error(realIds.get(i) + "is null"); emptyIds.add(realIds.get(i));
} else { } else {
Map<String, String> attribute = (Map<String, String>) JSONObject.parse(objects.get(i)); Map<String, String> attribute = (Map<String, String>) JSONObject.parse(objects.get(i));
attribute.put("realId", attribute.get("k")); attribute.put("realId", attribute.get("k"));
@ -205,6 +209,25 @@ public class MonitorServiceImpl implements MonitorService {
keyMap.put(realIdArr[i], attribute); keyMap.put(realIdArr[i], attribute);
} }
} }
if (CollectionUtil.isNotEmpty(emptyIds)) {
List<String> restList = redisClient.getBatchRealDataByRealId("901200000034", emptyIds);
for (int i = 0; i < emptyIds.size(); i++) {
if (ObjectUtil.isEmpty(restList.get(i))) {
log.error("获取数据失败:{}", emptyIds.get(i));
} else {
Map<String, String> attribute = (Map<String, String>) JSONObject.parse(restList.get(i));
attribute.put("realId", attribute.get("k"));
attribute.put("value", attribute.get("v"));
attribute.put("time", attribute.get("t"));
attribute.remove("v");
attribute.remove("k");
attribute.remove("t");
this.getCheckMap(attribute, switchOnOff);
valueMap.put(emptyIds.get(i), attribute.get("value"));
keyMap.put(emptyIds.get(i), attribute);
}
}
}
}); });
countDownLatch.countDown(); countDownLatch.countDown();
})); }));
@ -230,6 +253,7 @@ public class MonitorServiceImpl implements MonitorService {
/** /**
* 监测点过期数据检查 * 监测点过期数据检查
*
* @param value * @param value
* @return * @return
*/ */
@ -251,6 +275,7 @@ public class MonitorServiceImpl implements MonitorService {
/** /**
* 集中监控数据处理 * 集中监控数据处理
*
* @param param * @param param
*/ */
@Override @Override
@ -284,7 +309,8 @@ public class MonitorServiceImpl implements MonitorService {
// 所有设备分类 // 所有设备分类
Map<String, List<String>> deviceClassifyMap = (Map<String, List<String>>) redisTemplate.opsForValue().get(device_classify_cache_final); Map<String, List<String>> deviceClassifyMap = (Map<String, List<String>>) redisTemplate.opsForValue().get(device_classify_cache_final);
// 所有设备 // 所有设备
List<EminfoAndEmParamVo> devices = JSONObject.parseObject(redisTemplate.opsForValue().get(device_cache_final).toString(),new TypeReference<List<EminfoAndEmParamVo>>() {}); List<EminfoAndEmParamVo> devices = JSONObject.parseObject(redisTemplate.opsForValue().get(device_cache_final).toString(), new TypeReference<List<EminfoAndEmParamVo>>() {
});
// 根据站点分组 // 根据站点分组
Map<String, List<StationAttributeEntity>> stationAttbtMap = list.stream().collect(Collectors.groupingBy(StationAttributeEntity::getStationId)); Map<String, List<StationAttributeEntity>> stationAttbtMap = list.stream().collect(Collectors.groupingBy(StationAttributeEntity::getStationId));
// 获取站点列表 // 获取站点列表
@ -385,6 +411,7 @@ public class MonitorServiceImpl implements MonitorService {
/** /**
* 获取站点属性 * 获取站点属性
*
* @param stationEntityList * @param stationEntityList
* @param item * @param item
*/ */
@ -646,6 +673,7 @@ public class MonitorServiceImpl implements MonitorService {
/** /**
* 设置站点状态 * 设置站点状态
*
* @param alarmList * @param alarmList
* @param station * @param station
* @param key * @param key
@ -705,6 +733,7 @@ public class MonitorServiceImpl implements MonitorService {
/** /**
* 获取厂房监测点 * 获取厂房监测点
*
* @return * @return
*/ */
private List<AnalyzeCodeBySignagesVO> getRealIdByWsCodeAndSign() { private List<AnalyzeCodeBySignagesVO> getRealIdByWsCodeAndSign() {
@ -725,6 +754,7 @@ public class MonitorServiceImpl implements MonitorService {
/** /**
* 获取站点realId * 获取站点realId
*
* @param refDept * @param refDept
* @param eminfoAndEmParams * @param eminfoAndEmParams
* @return * @return

1
hzims-service/inspect/pom.xml

@ -102,7 +102,6 @@
<dependency> <dependency>
<groupId>com.hikvision.ga</groupId> <groupId>com.hikvision.ga</groupId>
<artifactId>artemis-http-client</artifactId> <artifactId>artemis-http-client</artifactId>
<version>1.1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.sf.ehcache</groupId> <groupId>net.sf.ehcache</groupId>

216
hzims-service/message/src/main/java/com/hnac/hzims/message/log/aspect/LogAspect.java

@ -0,0 +1,216 @@
package com.hnac.hzims.message.log.aspect;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hnac.hzims.message.MessageConstants;
import com.hnac.hzims.message.dto.AppPushDto;
import com.hnac.hzims.message.dto.MailPushDto;
import com.hnac.hzims.message.dto.SmsPushDto;
import com.hnac.hzims.message.dto.WsPushDto;
import com.hnac.hzims.message.entity.MsgWsRecordEntity;
import com.hnac.hzims.message.entity.log.AppLogEntity;
import com.hnac.hzims.message.entity.log.MailLogEntity;
import com.hnac.hzims.message.entity.log.SmsLogEntity;
import com.hnac.hzims.message.log.service.IAppLogService;
import com.hnac.hzims.message.log.service.IMailLogService;
import com.hnac.hzims.message.log.service.ISmsLogService;
import com.hnac.hzims.message.service.IMsgWsRecordService;
import lombok.extern.slf4j.Slf4j;
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.springblade.core.log.logger.BladeLogger;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.ObjectUtil;
import org.springblade.core.tool.utils.SpringUtil;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.concurrent.ExecutorService;
/**
* @author hx
*/
@Aspect
@Component
@Slf4j
public class LogAspect {
@Autowired
private IMailLogService mailLogService;
@Autowired
private IAppLogService appLogService;
@Autowired
private ISmsLogService smsLogService;
@Autowired
private ExecutorService logExecutorService;
@Autowired
private BladeLogger bladeLogger;
@Pointcut("@annotation(com.hnac.hzims.message.log.aspect.SaveLog)")
public void logPointCut() {
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) {
Object result = this.saveMessageLog(point);
return result;
}
/***
* 保存消息推送日志
* @param joinPoint 连接点
*/
private Object saveMessageLog(ProceedingJoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SaveLog saveLog = method.getAnnotation(SaveLog.class);
Object[] args = joinPoint.getArgs();
String errorLog = "";
Object result = null;
try {
//执行方法
result = joinPoint.proceed();
} catch (Throwable throwable) {
bladeLogger.error("message-log",throwable.getMessage());
throwable.printStackTrace();
errorLog = throwable.getMessage();
}
switch(saveLog.type()) {
case MessageConstants.APP_PUSH:
//app推送
this.savePushMessage(args[0],result,errorLog);
break;
case MessageConstants.SMS_PUSH:
//短信推送
this.saveSmsMessage(args[0],result,errorLog);
break;
case MessageConstants.WS_PUSH:
//websocket推送
this.saveWebsocketMessage(args[0],result,errorLog);
break;
case MessageConstants.MAIL_PUSH:
//邮件推送
this.saveMailMessage(args[0],result,errorLog);
break;
default:
break;
}
return result;
}
/***
* 保存websocket推送日志
* @param arg 参数
* @param result 结果
* @param errorLog 错误日志
*/
private void saveWebsocketMessage(Object arg, Object result, String errorLog) {
IMsgWsRecordService recordService = SpringUtil.getBean(IMsgWsRecordService.class);
WsPushDto wsPushDto = JSONObject.parseObject(JSON.toJSONString(arg),WsPushDto.class);
MsgWsRecordEntity recordEntity = MsgWsRecordEntity.builder()
.businessKey(wsPushDto.getBusinessKey())
.businessClassify(wsPushDto.getBusinessClassify())
.subject(wsPushDto.getSubject())
.content(wsPushDto.getContent())
.userIds(String.join(",",wsPushDto.getUserIdList()))
.isAll(wsPushDto.isAll())
.parameters(JSON.toJSONString(arg))
.response(ObjectUtil.isNotEmpty(result) ? JSON.toJSONString(result) : null)
.errorLog(errorLog)
.success(StringUtil.isBlank(errorLog))
.build();
//处理未登陆情况
if(ObjectUtil.isEmpty(AuthUtil.getUser())){
recordEntity.setTenantId(wsPushDto.getTenantId());
recordEntity.setCreateUser(wsPushDto.getCreateUser());
recordEntity.setCreateTime(DateUtil.now());
}
recordService.save(recordEntity);
}
/**
* 保存app推送日志
* @param arg 参数
* @param result 结果
* @param errorLog 错误信息
*/
private void savePushMessage(Object arg, Object result, String errorLog) {
logExecutorService.execute(()->{
AppPushDto appPushDto = JSONObject.parseObject(JSON.toJSONString(arg),AppPushDto.class);
AppLogEntity appLogEntity = appLogService.pushConvertLog(appPushDto);
//补充日志中推送推送结果以及错误日志
appLogEntity.setErrorLog(errorLog);
R r = JSONObject.parseObject(JSON.toJSONString(result),R.class);
appLogEntity.setParams(JSON.toJSONString(arg));
appLogEntity.setResult(JSON.toJSONString(r));
appLogEntity.setIsSuccess(r.isSuccess());
//处理未登陆情况
if(ObjectUtil.isEmpty(AuthUtil.getUser())){
appLogEntity.setTenantId(appPushDto.getTenantId());
appLogEntity.setCreateUser(appPushDto.getCreateUser());
appLogEntity.setCreateTime(DateUtil.now());
}
appLogService.save(appLogEntity);
});
}
/***
* 保存短信推送日志
* @param arg 参数
* @param result 结果
* @param errorLog 错误信息
*/
private void saveSmsMessage(Object arg, Object result,String errorLog) {
SmsPushDto smsPushDto = JSONObject.parseObject(JSON.toJSONString(arg),SmsPushDto.class);
SmsLogEntity smsLogEntity = smsLogService.pushConvertLog(smsPushDto);
R r = JSONObject.parseObject(JSON.toJSONString(result),R.class);
smsLogEntity.setErrorLog(errorLog);
smsLogEntity.setResult(JSON.toJSONString(r));
smsLogEntity.setParams(JSON.toJSONString(arg));
smsLogEntity.setIsSuccess(r.isSuccess());
//处理未登陆情况
if(ObjectUtil.isEmpty(AuthUtil.getUser())){
smsLogEntity.setTenantId(smsPushDto.getTenantId());
smsLogEntity.setCreateUser(smsPushDto.getCreateUser());
smsLogEntity.setCreateTime(DateUtil.now());
}
smsLogService.save(smsLogEntity);
}
/***
* 保存邮件发送日志
* @param arg 参数
* @param result 结果
* @param errorLog 错误信息
*/
private void saveMailMessage(Object arg, Object result,String errorLog) {
logExecutorService.execute(()->{
MailPushDto mailPushDto = JSONObject.parseObject(JSON.toJSONString(arg),MailPushDto.class);
MailLogEntity mailLogEntity = mailLogService.pushConvertLog(mailPushDto);
//补充日志中推送推送结果以及错误日志
mailLogEntity.setErrorLog(errorLog);
R r = JSONObject.parseObject(JSON.toJSONString(result),R.class);
mailLogEntity.setResult(JSON.toJSONString(r));
mailLogEntity.setParams(JSON.toJSONString(arg));
mailLogEntity.setIsSuccess(r.isSuccess());
//处理未登陆情况
if(ObjectUtil.isEmpty(AuthUtil.getUser())){
mailLogEntity.setTenantId(mailPushDto.getTenantId());
mailLogEntity.setCreateUser(mailPushDto.getCreateUser());
mailLogEntity.setCreateTime(DateUtil.now());
}
mailLogService.save(mailLogEntity);
});
}
}

19
hzims-service/message/src/main/java/com/hnac/hzims/message/log/aspect/SaveLog.java

@ -0,0 +1,19 @@
package com.hnac.hzims.message.log.aspect;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author hx
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD})
public @interface SaveLog {
/**
* 日志保存类型
* @return
*/
String type() default "";
}

21
hzims-service/message/src/main/java/com/hnac/hzims/message/log/mapper/AppLogMapper.java

@ -0,0 +1,21 @@
package com.hnac.hzims.message.log.mapper;
import com.hnac.hzims.message.dto.statistic.MsgPushStatisticDto;
import com.hnac.hzims.message.entity.log.AppLogEntity;
import com.hnac.hzims.message.vo.statistic.MsgPushStatisticVO;
import org.apache.ibatis.annotations.Param;
import org.springblade.core.datascope.mapper.UserDataScopeBaseMapper;
/**
* @author hx
*/
public interface AppLogMapper extends UserDataScopeBaseMapper<AppLogEntity> {
/**
* 获取app推送统计
* @param statisticDto
* @return
*/
MsgPushStatisticVO getAppPushStatistic(@Param("statisticDto") MsgPushStatisticDto statisticDto);
}

24
hzims-service/message/src/main/java/com/hnac/hzims/message/log/mapper/AppLogMapper.xml

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hnac.hzims.message.log.mapper.AppLogMapper">
<select id="getAppPushStatistic" resultType="com.hnac.hzims.message.vo.statistic.MsgPushStatisticVO">
select sum(LENGTH(PUSHER)-LENGTH(REPLACE(PUSHER,',',''))+1) `count`
from hzims_app_log
<where>
is_deleted = 0
<if test="statisticDto.startDate != null and statisticDto.startDate != ''">
and create_time &gt;= #{statisticDto.startDate}
</if>
<if test="statisticDto.endDate != null and statisticDto.endDate != ''">
and create_time &lt;= #{statisticDto.endDate}
</if>
<if test="statisticDto.deptId != null and statisticDto.deptId != ''">
and find_in_set(create_dept,#{statisticDto.deptId})
</if>
<if test="statisticDto.businessClassify != null and statisticDto.businessClassify != ''">
and find_in_set(business_classify,#{statisticDto.businessClassify})
</if>
</where>
</select>
</mapper>

20
hzims-service/message/src/main/java/com/hnac/hzims/message/log/mapper/MailLogMapper.java

@ -0,0 +1,20 @@
package com.hnac.hzims.message.log.mapper;
import com.hnac.hzims.message.dto.statistic.MsgPushStatisticDto;
import com.hnac.hzims.message.entity.log.MailLogEntity;
import com.hnac.hzims.message.vo.statistic.MsgPushStatisticVO;
import org.apache.ibatis.annotations.Param;
import org.springblade.core.datascope.mapper.UserDataScopeBaseMapper;
/**
* @author hx
*/
public interface MailLogMapper extends UserDataScopeBaseMapper<MailLogEntity> {
/**
* 获取邮箱推送统计
* @param statisticDto
* @return
*/
MsgPushStatisticVO getMailPushStatistic(@Param("statisticDto") MsgPushStatisticDto statisticDto);
}

24
hzims-service/message/src/main/java/com/hnac/hzims/message/log/mapper/MailLogMapper.xml

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hnac.hzims.message.log.mapper.MailLogMapper">
<select id="getMailPushStatistic" resultType="com.hnac.hzims.message.vo.statistic.MsgPushStatisticVO">
select sum(LENGTH(PUSHER)-LENGTH(REPLACE(PUSHER,',',''))+1) `count`
from hzims_mail_log
<where>
is_deleted = 0
<if test="statisticDto.startDate != null and statisticDto.startDate != ''">
and create_time &gt;= #{statisticDto.startDate}
</if>
<if test="statisticDto.endDate != null and statisticDto.endDate != ''">
and create_time &lt;= #{statisticDto.endDate}
</if>
<if test="statisticDto.deptId != null and statisticDto.deptId != ''">
and find_in_set(create_dept,#{statisticDto.deptId})
</if>
<if test="statisticDto.businessClassify != null and statisticDto.businessClassify != ''">
and find_in_set(business_classify,#{statisticDto.businessClassify})
</if>
</where>
</select>
</mapper>

21
hzims-service/message/src/main/java/com/hnac/hzims/message/log/mapper/SmsLogMapper.java

@ -0,0 +1,21 @@
package com.hnac.hzims.message.log.mapper;
import com.hnac.hzims.message.dto.statistic.MsgPushStatisticDto;
import com.hnac.hzims.message.entity.log.SmsLogEntity;
import com.hnac.hzims.message.vo.statistic.MsgPushStatisticVO;
import org.apache.ibatis.annotations.Param;
import org.springblade.core.datascope.mapper.UserDataScopeBaseMapper;
/**
* @author hx
*/
public interface SmsLogMapper extends UserDataScopeBaseMapper<SmsLogEntity> {
/**
* 获取短信推送统计
* @param statisticDto
* @return
*/
MsgPushStatisticVO getSmsPushStatistic(@Param("statisticDto") MsgPushStatisticDto statisticDto);
}

23
hzims-service/message/src/main/java/com/hnac/hzims/message/log/mapper/SmsLogMapper.xml

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hnac.hzims.message.log.mapper.SmsLogMapper">
<select id="getSmsPushStatistic" resultType="com.hnac.hzims.message.vo.statistic.MsgPushStatisticVO">
select sum(LENGTH(PUSHER)-LENGTH(REPLACE(PUSHER,',',''))+1) `count`
from hzims_sms_log
<where>
is_deleted = 0
<if test="statisticDto.startDate != null and statisticDto.startDate != ''">
and create_time &gt;= #{statisticDto.startDate}
</if>
<if test="statisticDto.endDate != null and statisticDto.endDate != ''">
and create_time &lt;= #{statisticDto.endDate}
</if>
<if test="statisticDto.deptId != null and statisticDto.deptId != ''">
and find_in_set(create_dept,#{statisticDto.deptId})
</if>
<if test="statisticDto.businessClassify != null and statisticDto.businessClassify != ''">
and find_in_set(business_classify,#{statisticDto.businessClassify})
</if>
</where>
</select>
</mapper>

56
hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/IAppLogService.java

@ -0,0 +1,56 @@
package com.hnac.hzims.message.log.service;
import com.hnac.hzims.message.dto.AppPushDto;
import com.hnac.hzims.message.entity.log.AppLogEntity;
import com.hnac.hzinfo.core.push.enums.PlatformType;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.log.logger.BladeLogger;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.CollectionUtil;
import org.springblade.core.tool.utils.ObjectUtil;
import org.springframework.util.Assert;
import java.util.Arrays;
import java.util.stream.Collectors;
/**
* @author hx
*/
public interface IAppLogService extends IMessageLogService<AppLogEntity,AppPushDto> {
BladeLogger bladeLogger = new BladeLogger();
/**
* 将app推送对象 转换为日志对象
* @param pushDto app推送对象
* @return
*/
@Override
default AppLogEntity pushConvertLog(AppPushDto pushDto) {
Assert.isTrue(ObjectUtil.isNotEmpty(pushDto),()->{
throw new ServiceException("app推送对象 转换为日志对象时,app推送对象不能为空");
});
AppLogEntity appLogEntity = BeanUtil.copy(pushDto,AppLogEntity.class);
//排除对数据权限的影响
appLogEntity.setCreateDept(null);
appLogEntity.setCreateTime(null);
appLogEntity.setCreateUser(null);
appLogEntity.setUpdateUser(null);
appLogEntity.setUpdateTime(null);
Assert.isTrue(CollectionUtil.isNotEmpty(pushDto.getTags()),()-> {
bladeLogger.error("message-pushConvertLog","app推送 推送人不能为空");
throw new ServiceException("app推送 推送人不能为空");
});
appLogEntity.setPusher(pushDto.getTags().stream().collect(Collectors.joining(",")));
String platformTypes = "";
if(pushDto.getIsAll()){
platformTypes = Arrays.stream(PlatformType.values()).map(PlatformType::getValue).collect(Collectors.joining(","));
}
else {
platformTypes = Arrays.stream(pushDto.getPlatformTypes()).map(PlatformType::getValue).collect(Collectors.joining(","));
}
appLogEntity.setPlatformType(platformTypes);
return appLogEntity;
}
}

38
hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/IMailLogService.java

@ -0,0 +1,38 @@
package com.hnac.hzims.message.log.service;
import com.hnac.hzims.message.dto.MailPushDto;
import com.hnac.hzims.message.entity.log.MailLogEntity;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.ObjectUtil;
import org.springframework.util.Assert;
import java.util.Arrays;
import java.util.stream.Collectors;
/**
* @author hx
*/
public interface IMailLogService extends IMessageLogService<MailLogEntity,MailPushDto> {
/**
* 邮件推送对象转换为邮箱日志对象
* @param mailPushDto 邮件推送对象
* @return 邮箱日志对象
*/
@Override
default MailLogEntity pushConvertLog(MailPushDto mailPushDto){
Assert.isTrue(ObjectUtil.isNotEmpty(mailPushDto),()->{
throw new ServiceException("邮件推送对象转换为邮箱日志对象时,邮件推送对象不能为空");
});
MailLogEntity mailLogEntity = BeanUtil.copy(mailPushDto,MailLogEntity.class);
mailLogEntity.setEmail(Arrays.stream(mailPushDto.getToAccount()).collect(Collectors.joining(",")));
mailLogEntity.setCreateDept(null);
mailLogEntity.setCreateTime(null);
mailLogEntity.setCreateUser(null);
mailLogEntity.setUpdateUser(null);
mailLogEntity.setUpdateTime(null);
return mailLogEntity;
}
}

18
hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/IMessageLogService.java

@ -0,0 +1,18 @@
package com.hnac.hzims.message.log.service;
import com.hnac.hzims.message.dto.PushDto;
import com.hnac.hzims.message.entity.log.MessageLogEntity;
import org.springblade.core.mp.base.BaseService;
/**
* @author hx
*/
public interface IMessageLogService<T extends MessageLogEntity,E extends PushDto> extends BaseService<T> {
/**
* 推送对象转换为日志
* @param pushDto
* @return
*/
T pushConvertLog(E pushDto);
}

37
hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/ISmsLogService.java

@ -0,0 +1,37 @@
package com.hnac.hzims.message.log.service;
import com.alibaba.fastjson.JSON;
import com.hnac.hzims.message.dto.SmsPushDto;
import com.hnac.hzims.message.entity.log.SmsLogEntity;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.CollectionUtil;
import java.util.stream.Collectors;
/**
* @author hx
*/
public interface ISmsLogService extends IMessageLogService<SmsLogEntity, SmsPushDto> {
/**
* 短信推送对象转换为日志对象
* @param pushDto 短信推送对象
* @return
*/
@Override
default SmsLogEntity pushConvertLog(SmsPushDto pushDto) {
SmsLogEntity smsLogEntity = BeanUtil.copy(pushDto,SmsLogEntity.class);
smsLogEntity.setCreateDept(null);
smsLogEntity.setCreateTime(null);
smsLogEntity.setCreateUser(null);
smsLogEntity.setUpdateUser(null);
smsLogEntity.setUpdateTime(null);
smsLogEntity.setPusher(pushDto.getPhones().stream().collect(Collectors.joining(",")));
smsLogEntity.setPhones(pushDto.getPhones().stream().collect(Collectors.joining(",")));
if(CollectionUtil.isNotEmpty(pushDto.getParams())){
smsLogEntity.setParamsJson(JSON.toJSONString(pushDto.getParams()));
}
return smsLogEntity;
}
}

15
hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/impl/AppLogServiceImpl.java

@ -0,0 +1,15 @@
package com.hnac.hzims.message.log.service.impl;
import com.hnac.hzims.message.entity.log.AppLogEntity;
import com.hnac.hzims.message.log.mapper.AppLogMapper;
import com.hnac.hzims.message.log.service.IAppLogService;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springframework.stereotype.Service;
/**
* @author hx
*/
@Service("appLogService")
public class AppLogServiceImpl extends BaseServiceImpl<AppLogMapper, AppLogEntity> implements IAppLogService {
}

20
hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/impl/MailLogServiceImpl.java

@ -0,0 +1,20 @@
package com.hnac.hzims.message.log.service.impl;
import com.hnac.hzims.message.entity.log.MailLogEntity;
import com.hnac.hzims.message.log.mapper.MailLogMapper;
import com.hnac.hzims.message.log.service.IMailLogService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springframework.stereotype.Service;
/**
* @author hx
*/
@Service("mailLogService")
@Slf4j
@AllArgsConstructor
public class MailLogServiceImpl extends BaseServiceImpl<MailLogMapper, MailLogEntity>
implements IMailLogService {
}

15
hzims-service/message/src/main/java/com/hnac/hzims/message/log/service/impl/SmsLogServiceImpl.java

@ -0,0 +1,15 @@
package com.hnac.hzims.message.log.service.impl;
import com.hnac.hzims.message.entity.log.SmsLogEntity;
import com.hnac.hzims.message.log.mapper.SmsLogMapper;
import com.hnac.hzims.message.log.service.ISmsLogService;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springframework.stereotype.Service;
/**
* @author hx
*/
@Service("smsLogService")
public class SmsLogServiceImpl extends BaseServiceImpl<SmsLogMapper, SmsLogEntity> implements ISmsLogService {
}

7
hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/controller/StFocusPropertiesController.java

@ -7,6 +7,7 @@ import com.hnac.hzims.common.logs.enums.BusinessType;
import com.hnac.hzims.common.logs.enums.OperatorType; import com.hnac.hzims.common.logs.enums.OperatorType;
import com.hnac.hzims.operational.config.entity.StFocusPropertiesEntity; import com.hnac.hzims.operational.config.entity.StFocusPropertiesEntity;
import com.hnac.hzims.operational.config.service.StFocusPropertiesService; import com.hnac.hzims.operational.config.service.StFocusPropertiesService;
import com.hnac.hzims.operational.config.vo.StationRealVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springblade.core.log.annotation.ApiLog; import org.springblade.core.log.annotation.ApiLog;
@ -81,4 +82,10 @@ public class StFocusPropertiesController {
public R remove(@RequestParam("ids") String ids){ public R remove(@RequestParam("ids") String ids){
return R.data(stFocusPropertiesService.removeByIds(Func.toLongList(ids))); return R.data(stFocusPropertiesService.removeByIds(Func.toLongList(ids)));
} }
@ApiOperation(value = "获取站点实时ID")
@GetMapping(value = "/getStationRealIds")
public R<List<StationRealVo>> getStationRealIds(@RequestParam(value = "params", required = false) String params){ ;
return R.data(stFocusPropertiesService.getStationRealIds(params));
}
} }

2
hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/StFocusPropertiesService.java

@ -11,7 +11,7 @@ public interface StFocusPropertiesService extends BaseService<StFocusPropertiesE
String getRealIds(); String getRealIds();
void getStationRealIds(String param); List<StationRealVo> getStationRealIds(String param);
List<AnalyzeCodeBySignagesVO> getRealIdByEmCodeAndSign(); List<AnalyzeCodeBySignagesVO> getRealIdByEmCodeAndSign();

9
hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/impl/StFocusPropertiesServiceImpl.java

@ -22,6 +22,7 @@ import com.hnac.hzinfo.datasearch.analyse.IAnalyseDataSearchClient;
import com.hnac.hzinfo.datasearch.analyse.vo.AnalyzeCodeBySignagesVO; import com.hnac.hzinfo.datasearch.analyse.vo.AnalyzeCodeBySignagesVO;
import com.hnac.hzinfo.sdk.analyse.po.MultiAnalyzeCodePO; import com.hnac.hzinfo.sdk.analyse.po.MultiAnalyzeCodePO;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.MapUtils;
import org.springblade.core.log.logger.BladeLogger; import org.springblade.core.log.logger.BladeLogger;
import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.mp.base.BaseServiceImpl;
@ -41,6 +42,7 @@ import java.util.stream.Collectors;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j
public class StFocusPropertiesServiceImpl extends BaseServiceImpl<StFocusPropertiesMapper, StFocusPropertiesEntity> implements StFocusPropertiesService { public class StFocusPropertiesServiceImpl extends BaseServiceImpl<StFocusPropertiesMapper, StFocusPropertiesEntity> implements StFocusPropertiesService {
private final IStationService stationService; private final IStationService stationService;
@ -73,11 +75,12 @@ public class StFocusPropertiesServiceImpl extends BaseServiceImpl<StFocusPropert
} }
@Override @Override
public void getStationRealIds(String param) { public List<StationRealVo> getStationRealIds(String param) {
// 所有站点 // 所有站点
List<StationEntity> stationList = stationService.getAll(); List<StationEntity> stationList = stationService.getAll();
log.error("所有站点:{}", JSONObject.toJSONString(stationList));
if(CollectionUtil.isEmpty(stationList)){ if(CollectionUtil.isEmpty(stationList)){
return; return Lists.newArrayList();
} }
// 设备监测点list // 设备监测点list
Object json = redisTemplate.opsForValue().get(em_info_list_path); Object json = redisTemplate.opsForValue().get(em_info_list_path);
@ -116,7 +119,9 @@ public class StFocusPropertiesServiceImpl extends BaseServiceImpl<StFocusPropert
stationRealVo.setRealId(realArr); stationRealVo.setRealId(realArr);
list.add(stationRealVo); list.add(stationRealVo);
}); });
log.error("实时监控站点实时设备:{}", JSONObject.toJSONString(list));
redisTemplate.opsForValue().set(moniter_realId_key,list); redisTemplate.opsForValue().set(moniter_realId_key,list);
return list;
} }
/** /**

14
hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/service/impl/HydropowerServiceImpl.java

@ -1539,11 +1539,18 @@ public class HydropowerServiceImpl implements HydropowerService {
Map<String, HeWeatherWeatherDailyResponse> weekWeather = this.weatherService.getWeekWeather(stations.stream().map(StationEntity::getCode).collect(Collectors.toList())); Map<String, HeWeatherWeatherDailyResponse> weekWeather = this.weatherService.getWeekWeather(stations.stream().map(StationEntity::getCode).collect(Collectors.toList()));
// 实时监测点数据 // 实时监测点数据
List<HydropowerUnitRealVo> reals = (List<HydropowerUnitRealVo>) redisTemplate.opsForValue().get(load_hydropower_unit_real_key); List<HydropowerUnitRealVo> reals = (List<HydropowerUnitRealVo>) redisTemplate.opsForValue().get(load_hydropower_unit_real_key);
log.error("实时数据:{}",JSONObject.toJSONString(reals));
/**
* 水位
*/
List<WaterLevelVo> levelList = (List<WaterLevelVo>) redisTemplate.opsForValue().get(loadwater_level_key);
return stations.stream().map(station -> { return stations.stream().map(station -> {
AppHydropowerStationVo hydropower = new AppHydropowerStationVo(); AppHydropowerStationVo hydropower = new AppHydropowerStationVo();
hydropower.setDeptId(station.getRefDept()); hydropower.setDeptId(station.getRefDept());
hydropower.setSort(station.getSort()); hydropower.setSort(station.getSort());
hydropower.setDeptName(station.getName()); hydropower.setDeptName(station.getName());
hydropower.setStationCode(station.getCode());
// 天气区间 // 天气区间
hydropower.setMaxTemp(this.intervalTemp(weekWeather,station.getCode(),true)); hydropower.setMaxTemp(this.intervalTemp(weekWeather,station.getCode(),true));
hydropower.setMinTemp(this.intervalTemp(weekWeather,station.getCode(),false)); hydropower.setMinTemp(this.intervalTemp(weekWeather,station.getCode(),false));
@ -1582,6 +1589,13 @@ public class HydropowerServiceImpl implements HydropowerService {
}).sorted(Comparator.comparing(AppHydropowerDeviceVo::getOrd)).collect(Collectors.toList())); }).sorted(Comparator.comparing(AppHydropowerDeviceVo::getOrd)).collect(Collectors.toList()));
hydropower.setLoadUnit(hydropower.getDevices().get(0).getLoadUnit()); hydropower.setLoadUnit(hydropower.getDevices().get(0).getLoadUnit());
} }
if(!CollectionUtil.isEmpty(levelList)){
List<WaterLevelVo> validList = levelList.stream().filter(o-> station.getCode().equals(o.getStationCode())).collect(Collectors.toList());
if(!CollectionUtil.isEmpty(validList)){
WaterLevelVo level = validList.get(0);
hydropower.setFrontWaterLevel(level.getFrontWaterLevel());
}
}
return hydropower; return hydropower;
}).sorted(Comparator.comparing(AppHydropowerStationVo::getSort)).collect(Collectors.toList()); }).sorted(Comparator.comparing(AppHydropowerStationVo::getSort)).collect(Collectors.toList());
} }

26
hzims-service/operational/src/main/java/com/hnac/hzims/operational/station/service/impl/RealMonitorServiceImpl.java

@ -170,11 +170,11 @@ public class RealMonitorServiceImpl implements IRealMonitorService {
if(CollectionUtil.isEmpty(realIds)){ if(CollectionUtil.isEmpty(realIds)){
return; return;
} }
log.error("real_time_data: {},{}",stationReal.getStation(),realIds);
List<String> objects = redisClient.getBatchRealDataByRealId(stationReal.getStation(),realIds); List<String> objects = redisClient.getBatchRealDataByRealId(stationReal.getStation(),realIds);
List<String> emptyIds = new ArrayList<>();
for(int i = 0; i < realIds.size() ;i++){ for(int i = 0; i < realIds.size() ;i++){
if(ObjectUtil.isEmpty(objects.get(i))){ if(ObjectUtil.isEmpty(objects.get(i))){
log.error(realIds.get(i) + "is null"); emptyIds.add(realIds.get(i));
}else{ }else{
Map<String,String> attribute = (Map<String, String>) JSONObject.parse(objects.get(i)); Map<String,String> attribute = (Map<String, String>) JSONObject.parse(objects.get(i));
attribute.put("realId",attribute.get("k")); attribute.put("realId",attribute.get("k"));
@ -188,6 +188,25 @@ public class RealMonitorServiceImpl implements IRealMonitorService {
keyMap.put(realIdArr[i],attribute); keyMap.put(realIdArr[i],attribute);
} }
} }
if (CollectionUtil.isNotEmpty(emptyIds)) {
List<String> restList = redisClient.getBatchRealDataByRealId("901200000034", emptyIds);
for (int i = 0; i < emptyIds.size(); i++) {
if (ObjectUtil.isEmpty(restList.get(i))) {
log.error("获取数据失败:{}", emptyIds.get(i));
} else {
Map<String, String> attribute = (Map<String, String>) JSONObject.parse(restList.get(i));
attribute.put("realId", attribute.get("k"));
attribute.put("value", attribute.get("v"));
attribute.put("time", attribute.get("t"));
attribute.remove("v");
attribute.remove("k");
attribute.remove("t");
this.getCheckMap(attribute, switchOnOff);
valueMap.put(emptyIds.get(i), attribute.get("value"));
keyMap.put(emptyIds.get(i), attribute);
}
}
}
}); });
countDownLatch.countDown(); countDownLatch.countDown();
})); }));
@ -195,7 +214,7 @@ public class RealMonitorServiceImpl implements IRealMonitorService {
try { try {
countDownLatch.await(); countDownLatch.await();
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); log.error("线程等待异常",e);
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
pool.shutdown(); pool.shutdown();
@ -204,7 +223,6 @@ public class RealMonitorServiceImpl implements IRealMonitorService {
redisTemplate.opsForValue().set(real_id_key_gather_path,JSONObject.toJSONString(keyMap)); redisTemplate.opsForValue().set(real_id_key_gather_path,JSONObject.toJSONString(keyMap));
Long endTime = System.currentTimeMillis(); Long endTime = System.currentTimeMillis();
Long time = endTime - beginTime; Long time = endTime - beginTime;
log.error("处理redis实时数据 耗时 : {}",time);
} }
/** /**

34
hzims-service/operational/src/main/java/com/hnac/hzims/operational/station/service/impl/StationVideoTypeServiceImpl.java

@ -10,7 +10,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.hnac.hzims.operational.config.HikPathConfiguration; import com.hnac.hzims.operational.config.HikPathConfiguration;
import com.hnac.hzims.operational.station.StationConstants; import com.hnac.hzims.operational.station.StationConstants;
@ -57,8 +56,14 @@ public class StationVideoTypeServiceImpl extends BaseServiceImpl<StationVideoTyp
private String videoLoginUrl; private String videoLoginUrl;
@Value("${hzims.video.random-code}") @Value("${hzims.video.random-code}")
private String definitionCode; private String definitionCode;
@Value("${url.video.left}")
private List<String> videoLeft;
@Value("${url.video.right}")
private List<String> videoRight;
/** /**
* 获取海康视频接口 * 获取海康视频接口
*
* @return * @return
*/ */
@Override @Override
@ -73,8 +78,7 @@ public class StationVideoTypeServiceImpl extends BaseServiceImpl<StationVideoTyp
, stationVideoTypeEntity.getPointCode(), DictCache.getValue(StationConstants.STATION_VIDEO_TYPE_CODE, , stationVideoTypeEntity.getPointCode(), DictCache.getValue(StationConstants.STATION_VIDEO_TYPE_CODE,
stationVideoTypeEntity.getType()), 0)); stationVideoTypeEntity.getType()), 0));
ids.add(stationVideoTypeEntity.getId()); ids.add(stationVideoTypeEntity.getId());
} } catch (Exception e) {
catch (Exception e){
stationVideoTypeEntity.setLiveSourceAddress(null); stationVideoTypeEntity.setLiveSourceAddress(null);
} }
} }
@ -137,8 +141,7 @@ public class StationVideoTypeServiceImpl extends BaseServiceImpl<StationVideoTyp
for (StationVideoTypeEntity video : result.getRecords()) { for (StationVideoTypeEntity video : result.getRecords()) {
try { try {
video.setLiveSourceAddress(ArtemisPostUtils.getCameraPreviewFlvURL(video.getVideoHost(), video.getAppKey(), video.getAppSecret(), video.getPointCode(), 1)); video.setLiveSourceAddress(ArtemisPostUtils.getCameraPreviewFlvURL(video.getVideoHost(), video.getAppKey(), video.getAppSecret(), video.getPointCode(), 1));
} } catch (Exception e) {
catch(Exception e) {
log.error("视频点位【" + video.getName() + "】获取地址失败"); log.error("视频点位【" + video.getName() + "】获取地址失败");
} }
} }
@ -146,6 +149,7 @@ public class StationVideoTypeServiceImpl extends BaseServiceImpl<StationVideoTyp
return result; return result;
} }
@Override @Override
public List<StationVideoTypeEntity> getVideoByIdsAndType(String ids, String type) { public List<StationVideoTypeEntity> getVideoByIdsAndType(String ids, String type) {
List<Long> idList = Func.toLongList(",", ids); List<Long> idList = Func.toLongList(",", ids);
@ -210,8 +214,7 @@ public class StationVideoTypeServiceImpl extends BaseServiceImpl<StationVideoTyp
HttpResponse response; HttpResponse response;
try { try {
response = HttpUtil.createGet(pathConfiguration.getStationsPath()).execute(); response = HttpUtil.createGet(pathConfiguration.getStationsPath()).execute();
} } catch (Exception e) {
catch(Exception e) {
logger.error("getHikVisionStations", e.getMessage()); logger.error("getHikVisionStations", e.getMessage());
return Lists.newArrayList(); return Lists.newArrayList();
// throw new ServiceException(e.getMessage()); // throw new ServiceException(e.getMessage());
@ -230,8 +233,7 @@ public class StationVideoTypeServiceImpl extends BaseServiceImpl<StationVideoTyp
HttpResponse response; HttpResponse response;
try { try {
response = HttpUtil.createGet(pathConfiguration.getMonitorsPath() + "/" + stationId).execute(); response = HttpUtil.createGet(pathConfiguration.getMonitorsPath() + "/" + stationId).execute();
} } catch (RuntimeException e) {
catch (RuntimeException e) {
throw new ServiceException(e.getMessage()); throw new ServiceException(e.getMessage());
} }
Assert.isTrue(HttpServletResponse.SC_OK == response.getStatus(), () -> { Assert.isTrue(HttpServletResponse.SC_OK == response.getStatus(), () -> {
@ -276,8 +278,7 @@ public class StationVideoTypeServiceImpl extends BaseServiceImpl<StationVideoTyp
, DictCache.getValue(StationConstants.STATION_VIDEO_TYPE_CODE, stationVideoTypeEntity.getType()) , DictCache.getValue(StationConstants.STATION_VIDEO_TYPE_CODE, stationVideoTypeEntity.getType())
, streamType , streamType
)); ));
} } catch (Exception e) {
catch (Exception e){
stationVideoTypeEntity.setLiveSourceAddress(null); stationVideoTypeEntity.setLiveSourceAddress(null);
} }
} }
@ -322,32 +323,31 @@ public class StationVideoTypeServiceImpl extends BaseServiceImpl<StationVideoTyp
/** /**
* 水利监控视频 * 水利监控视频
*
* @return * @return
*/ */
@Override @Override
public WaterMonitorVideoVo waterMonitorVideo() { public WaterMonitorVideoVo waterMonitorVideo() {
WaterMonitorVideoVo video = new WaterMonitorVideoVo(); WaterMonitorVideoVo video = new WaterMonitorVideoVo();
List<StationVideoTypeEntity> left = this.list(Wrappers.<StationVideoTypeEntity>lambdaQuery(). List<StationVideoTypeEntity> left = this.list(Wrappers.<StationVideoTypeEntity>lambdaQuery().
in(StationVideoTypeEntity::getId,Arrays.asList(28483776900235440L,28483776900235463L, 28483776900235466L))); in(StationVideoTypeEntity::getId, videoLeft));
if (CollectionUtil.isNotEmpty(left)) { if (CollectionUtil.isNotEmpty(left)) {
video.setLeft(left.stream().peek(item -> { video.setLeft(left.stream().peek(item -> {
try { try {
item.setLiveSourceAddress(ArtemisPostUtils.getCameraPreviewFlvURL(item.getVideoHost(), item.getAppKey(), item.getAppSecret(), item.getPointCode(), 1)); item.setLiveSourceAddress(ArtemisPostUtils.getCameraPreviewFlvURL(item.getVideoHost(), item.getAppKey(), item.getAppSecret(), item.getPointCode(), 1));
} } catch (Exception e) {
catch(Exception e) {
log.error("视频点位【" + item.getPointCode() + "】获取地址失败"); log.error("视频点位【" + item.getPointCode() + "】获取地址失败");
} }
}).collect(Collectors.toList())); }).collect(Collectors.toList()));
} }
List<StationVideoTypeEntity> right = this.list(Wrappers.<StationVideoTypeEntity>lambdaQuery(). List<StationVideoTypeEntity> right = this.list(Wrappers.<StationVideoTypeEntity>lambdaQuery().
in(StationVideoTypeEntity::getId,Arrays.asList(28483776900235468L,28483776900235467L,28483776900235472L))); in(StationVideoTypeEntity::getId, videoRight));
if (CollectionUtil.isNotEmpty(right)) { if (CollectionUtil.isNotEmpty(right)) {
video.setRight(right.stream().peek(item -> { video.setRight(right.stream().peek(item -> {
try { try {
item.setLiveSourceAddress(ArtemisPostUtils.getCameraPreviewFlvURL(item.getVideoHost(), item.getAppKey(), item.getAppSecret(), item.getPointCode(), 1)); item.setLiveSourceAddress(ArtemisPostUtils.getCameraPreviewFlvURL(item.getVideoHost(), item.getAppKey(), item.getAppSecret(), item.getPointCode(), 1));
} } catch (Exception e) {
catch(Exception e) {
log.error("视频点位【" + item.getPointCode() + "】获取地址失败"); log.error("视频点位【" + item.getPointCode() + "】获取地址失败");
} }
}).collect(Collectors.toList())); }).collect(Collectors.toList()));

2
hzims-service/pom.xml

@ -34,6 +34,8 @@
<module>water-quality</module> <module>water-quality</module>
<module>water-rain</module> <module>water-rain</module>
<module>message-alarm-service</module> <module>message-alarm-service</module>
<module>simulate</module>
<module>hikvision</module>
</modules> </modules>
<dependencies> <dependencies>

110
hzims-service/simulate/pom.xml

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>hzims-service</artifactId>
<groupId>com.hnac.hzims</groupId>
<version>4.0.0-SNAPSHOT</version>
</parent>
<artifactId>hzims-simulate</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-common</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-core-boot</artifactId>
<exclusions>
<exclusion>
<groupId>org.springblade</groupId>
<artifactId>blade-core-cloud</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-starter-http</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-core-cloud</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-starter-datascope</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.hzinfo.framework</groupId>
<artifactId>hnac-framework-mqtt-starters</artifactId>
<version>${bladex.project.version}</version>
</dependency>
<dependency>
<groupId>com.hnac.hzinfo.data</groupId>
<artifactId>hzinfo-data-sdk</artifactId>
<version>${hzinfo.data.sdk.version}</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.6</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<!-- <configuration>-->
<!-- <classifier>exec</classifier>-->
<!-- </configuration>-->
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

29
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/HzimsSimulateApplication.java

@ -0,0 +1,29 @@
package com.hnac.hzinfo.simulate;
import org.mybatis.spring.annotation.MapperScan;
import org.springblade.core.cloud.feign.EnableBladeFeign;
import org.springblade.core.launch.BladeApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cloud.client.SpringCloudApplication;
/**
* @author admin
*/
@EnableBladeFeign
@SpringCloudApplication
@MapperScan(basePackages = {"com.hnac.hzinfo.**.mapper"})
//@ComponentScan(basePackages = {"com.hnac.hzinfo.simulate"})
public class HzimsSimulateApplication extends SpringBootServletInitializer {
static String APPLICATION_NAME = "hzims-simulate";
public static void main(String[] args) {
BladeApplication.run(APPLICATION_NAME, HzimsSimulateApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return BladeApplication.createSpringApplicationBuilder(builder, APPLICATION_NAME, HzimsSimulateApplication.class);
}
}

43
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/constants/WriteRealDataConstant.java

@ -0,0 +1,43 @@
package com.hnac.hzinfo.simulate.constants;
/**
* @author ysj
* @describe 实时数据写入常量
*/
public interface WriteRealDataConstant {
String REAL_DATA_V3 = "3";
String REAL_DATA_V4 = "4";
String GATE_FLOW = "过闸流量(m³/s)";
String OPENING_DEGREE = "开度(m)";
String GATE_STATUS = "闸门状态";
String WRITE_REAL_GATE_DATA = "writeRealGateData";
String WRITE_REAL_RAIN_DATA = "writeRealRainData";
Long OPEN = 0L;
Long CLOSE = 1L;
String WRITE_GATE = "1";
String WRITE_RAIN = "2";
// 降雨站属性标识
String ATTR_RAIN = "attr_rain";
String ATTR_WIND360 = "wind360";
String ATTR_WIND_SCALE = "wind_scale";
String ATTR_WIND_SPEED = "wind_speed ";
String ATTR_HUMIDITY = "humidity";
String ATTR_PRESSURE = "pressure";
String ATTR_VIS = "vis";
String ATTR_CLOUD = "cloud";
String ATTR_DEW = "dew";
String ATTR_FEELS_LIKE = "feels_like";
String ATTR_TEMP = "temp";
}

31
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/controller/GageController.java

@ -0,0 +1,31 @@
package com.hnac.hzinfo.simulate.controller;
import com.hnac.hzinfo.simulate.service.WriteRealDataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author ysj
*/
@RestController
@AllArgsConstructor
@RequestMapping("/gate")
@Api(value = "闸门开关机模拟服务", tags = "闸门开关机模拟服务")
public class GageController {
private final WriteRealDataService writeRealDataService;
@GetMapping("/isOpen")
@ApiOperation(value = "枢纽天气情况")
public R<Boolean> weather(@RequestParam("deviceCode") String deviceCode,
@RequestParam("isOpen") Long isOpen){
return R.data(writeRealDataService.isOpen(deviceCode,isOpen));
}
}

181
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/controller/SimulationDataController.java

@ -0,0 +1,181 @@
package com.hnac.hzinfo.simulate.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.google.common.collect.Maps;
import com.hnac.hzinfo.simulate.entity.DataModel;
import com.hnac.hzinfo.simulate.entity.Device;
import com.hnac.hzinfo.simulate.entity.DeviceField;
import com.hnac.hzinfo.simulate.entity.DeviceFieldGap;
import com.hnac.hzinfo.simulate.enums.ExceptionEnum;
import com.hnac.hzinfo.simulate.service.DeviceFieldGapService;
import com.hnac.hzinfo.simulate.service.DeviceFieldService;
import com.hnac.hzinfo.simulate.service.SimulationService;
import com.hnac.hzinfo.simulate.util.ParseFacUtils;
import com.hnac.hzinfo.simulate.util.TopicConstant;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.jackson.JsonUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.mqtt.producer.IMqttSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/simulationData")
@Api(value = "数据模拟服务", tags = "数据模拟服务")
@Slf4j
public class SimulationDataController {
@Autowired
private SimulationService simulationService;
@Autowired
private DeviceFieldService deviceFieldService;
@Autowired
private DeviceFieldGapService deviceFieldGapService;
@Autowired
private IMqttSender mqttSender;
@Value("fac.path")
private String facPath;
public static Map<String, String> cacheMap = Maps.newHashMap();
@ApiOperation(value = "解析v3.0场信息文件", notes = "解析场信息文件")
@GetMapping("/readFac")
public R<Void> readFac() {
InputStream inputStream = null;
try {
inputStream = new FileInputStream(new File(facPath + File.separator + "factory.fac"));
List<DataModel> list = ParseFacUtils.parsePoint(inputStream);
list.forEach(entity -> {
mqttSender.sendToMqtt(TopicConstant.TOPIC_DEVICE_MODEL, JsonUtil.toJson(entity));
});
return R.success("解析场信息文件成功");
} catch (Exception e) {
log.error(e.getMessage(), e);
return R.fail("解析场信息文件失败");
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@ApiOperation(value = "分页范围配置", notes = "分页范围配置")
@GetMapping("/pageGap")
public R<IPage<DeviceFieldGap>> pageGap(String stationId, Query query) {
List<Device> list = simulationService.getDeviceListByStationId(stationId);
List<String> ids = list.stream().map(Device::getId).collect(Collectors.toList());
LambdaQueryWrapper<DeviceFieldGap> lambdaQueryWrapper = new LambdaQueryWrapper();
lambdaQueryWrapper.in(DeviceFieldGap::getFacDeviceId, ids);
IPage<DeviceFieldGap> pageList = deviceFieldGapService.page(Condition.getPage(query), lambdaQueryWrapper);
return R.data(pageList);
}
@ApiOperation(value = "更新设备属性范围配置", notes = "更新设备属性范围配置")
@PostMapping("/updateGap")
public R updateGap(@RequestBody DeviceFieldGap deviceFieldGap) {
deviceFieldGapService.updateById(deviceFieldGap);
return R.status(true);
}
@ApiOperation(value = "第一次同步设备属性", notes = "第一次同步设备属性")
@GetMapping("/syncOneGap")
public R syncGap() {
//存在表
int count = deviceFieldService.existGapTable();
if (count <= 0) {//建表
deviceFieldService.createGapTable();
}
//同步
List<DeviceField> list = deviceFieldService.list();
List<DeviceFieldGap> gaps = list.stream().map(result -> new DeviceFieldGap(result.getId(), result.getFacDeviceId(),
result.getSignage(), result.getName(), BigDecimal.ZERO, BigDecimal.ZERO))
.collect(Collectors.toList());
deviceFieldGapService.saveOrUpdateBatch(gaps);
return R.status(true);
}
@ApiOperation(value = "第二次同步设备属性", notes = "第二次同步设备属性")
@GetMapping("/syncTwoGap")
public R syncTwoGap() {
//同步
List<DeviceField> list = deviceFieldService.queryNewInsert();
if (list != null && !list.isEmpty()) {
List<DeviceFieldGap> gaps = list.stream().map(result -> new DeviceFieldGap(result.getId(), result.getFacDeviceId(),
result.getSignage(), result.getName(), BigDecimal.ZERO, BigDecimal.ZERO))
.collect(Collectors.toList());
deviceFieldGapService.saveBatch(gaps);
}
return R.status(true);
}
@ApiOperation(value = "模拟单站的数据(循环,每隔sleepTime时长发送一次整站数据)", notes = "模拟单站的数据")
@GetMapping("/simulationMultiple")
public R<Void> simulationMultipleV3(String stationId, Long sleepTime) {
String key = "simulation:" + stationId;
String hasExc = cacheMap.get(key);
if (Func.isNotBlank(hasExc)) {
return R.fail("该站已经在模拟数据了");
}
try {
simulationService.simulationMultiple(stationId, sleepTime);
} catch (Exception e) {
throw new ServiceException(ExceptionEnum.SIMULATE_ERROR);
}
cacheMap.put(key, "true");
return R.status(true);
}
@ApiOperation(value = "模拟单站的数据(循环,每隔sleepTime时长发送一次整站数据)", notes = "模拟单站的数据")
@GetMapping("/simulationMultipleV4")
public R<Void> simulationMultipleV4(String stationId, Long sleepTime) {
String key = "simulation:" + stationId;
String hasExc = cacheMap.get(key);
if (Func.isNotBlank(hasExc)) {
return R.fail("该站已经在模拟数据了");
}
try {
simulationService.simulationMultipleV4(stationId, sleepTime);
} catch (Exception e) {
throw new ServiceException(ExceptionEnum.SIMULATE_ERROR);
}
cacheMap.put(key, "true");
return R.status(true);
}
@ApiOperation(value = "停止模拟", notes = "停止模拟")
@GetMapping("/stopStart")
public R<Void> stopStart() {
simulationService.stopStart();
return R.status(true);
}
}

20
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DataItem.java

@ -0,0 +1,20 @@
package com.hnac.hzinfo.simulate.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class DataItem {
private String id;
private String signage;//hz3000定义的id
private String name;
private String type;
private String soeType;
private String eventType;
}

46
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DataModel.java

@ -0,0 +1,46 @@
package com.hnac.hzinfo.simulate.entity;
import lombok.Data;
import java.util.List;
/**
* {
* "station": "4543",
* "structType": "dataGroup",
* "id": "5016387599_0",
* "pid": "5016387585",
* "name": "温度传感器",
* "children": [{
* "id": "5016387607",
* "name": "温度",
* "type": "YC"
* },{
* "id": "5016387617",
* "name": "高度",
* "type": "YC"
* },{
* "id": "5016387608",
* "name": "工作状态",
* "type": "YX"
* },{
* "id": "5016387609",
* "name": "工作状态",
* "type": "SOE",
* "eventType": ""
* }]
* }
* 数据组
* @author ninglong
*/
@Data
public class DataModel {
private String station;
private String structType;
private String id;
private String signage;//hz3000定义的id
private String pid;
private String name;
private List<DataItem> children;
}

63
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/Device.java

@ -0,0 +1,63 @@
package com.hnac.hzinfo.simulate.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 数据组
*
* @author ninglong
*/
@TableName(value = "hzinfo_fac_device")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Device implements Serializable {
@ApiModelProperty(value = "id")
@TableId(type = IdType.INPUT)
private String id;
@ApiModelProperty(value = "名称")
private String name;
@ApiModelProperty(value = "0-云端cms,1-站端直传")
private Integer source;
@ApiModelProperty("hz3000定义的id,如果定义的是大id则值与id字段值相同")
private String sid;
@ApiModelProperty("version=v3,version=v4")
private String modelKind;
@DateTimeFormat(
pattern = "yyyy-MM-dd HH:mm:ss"
)
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss"
)
@ApiModelProperty("创建时间")
private Date createTime;
@JsonSerialize(
using = ToStringSerializer.class
)
@ApiModelProperty("项目id")
private String projectId;
}

22
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceData.java

@ -0,0 +1,22 @@
package com.hnac.hzinfo.simulate.entity;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 设备数据
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class DeviceData {
private String station;
private String time;
private List<Kvtq> children = Lists.newArrayList();
}

19
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceDataV4.java

@ -0,0 +1,19 @@
package com.hnac.hzinfo.simulate.entity;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class DeviceDataV4 {
private String stationId;
private String time;
private List<KvtqV4> children = Lists.newArrayList();
}

38
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceFacConfig.java

@ -0,0 +1,38 @@
package com.hnac.hzinfo.simulate.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author ysj
*/
@TableName("hzinfo_fac_device_config")
@Data
public class DeviceFacConfig implements Serializable {
@ApiModelProperty("id")
@TableId(type = IdType.INPUT)
private String id;
@ApiModelProperty("设备id")
private String deviceCode;
@ApiModelProperty("字段标识")
private String facDeviceId;
@ApiModelProperty("站点Id")
private String stationId;
@ApiModelProperty("站点类型")
private String modelKind;
@ApiModelProperty("sid")
private String sid;
@ApiModelProperty("数据写入方式: 1-闸门,2-天气")
private String writeMethod;
}

42
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceField.java

@ -0,0 +1,42 @@
package com.hnac.hzinfo.simulate.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
@TableName("hzinfo_fac_device_attr")
@Data
public class DeviceField implements Serializable {
@ApiModelProperty("id")
@TableId(type = IdType.INPUT)
private String id;
@ApiModelProperty("设备id")
private String facDeviceId;
@ApiModelProperty("字段标识")
private String signage;
@ApiModelProperty("字段名称")
private String name;
@ApiModelProperty("最大值")
private String projectId;
@DateTimeFormat(
pattern = "yyyy-MM-dd HH:mm:ss"
)
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss"
)
@ApiModelProperty("创建时间")
private Date createTime;
private Long modelClassifyId;
private String alarmType;
}

30
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceFieldGap.java

@ -0,0 +1,30 @@
package com.hnac.hzinfo.simulate.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@TableName("hzinfo_fac_device_attr_gap")
@Data
@AllArgsConstructor
public class DeviceFieldGap implements Serializable {
@ApiModelProperty("id")
@TableId(type = IdType.INPUT)
private String id;
@ApiModelProperty("设备id")
private String facDeviceId;
@ApiModelProperty("字段标识")
private String signage;
@ApiModelProperty("字段名称")
private String name;
@ApiModelProperty("最大值")
private BigDecimal maxVal;
@ApiModelProperty("最小值")
private BigDecimal minVal;
}

33
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceRainGap.java

@ -0,0 +1,33 @@
package com.hnac.hzinfo.simulate.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author ysj
*/
@TableName("hzinfo_fac_device_rain_gap")
@Data
public class DeviceRainGap implements Serializable {
@ApiModelProperty("id")
@TableId(type = IdType.INPUT)
private String id;
@ApiModelProperty("设备id")
private String facDeviceId;
@ApiModelProperty("属性标识名称")
private String name;
@ApiModelProperty("属性标识")
private String attribute;
@ApiModelProperty("字段标识")
private String signage;
}

18
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/Kvtq.java

@ -0,0 +1,18 @@
package com.hnac.hzinfo.simulate.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Kvtq {
private String k;
private String v;
private String t;
private Integer q;
}

18
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/KvtqV4.java

@ -0,0 +1,18 @@
package com.hnac.hzinfo.simulate.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class KvtqV4 {
private String sid;
private String k;
private String v;
private String t;
private Integer q;
}

102
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/enums/ExceptionEnum.java

@ -0,0 +1,102 @@
package com.hnac.hzinfo.simulate.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springblade.core.tool.api.IResultCode;
import javax.servlet.http.HttpServletResponse;
/**
* 异常码枚举类
*/
@Getter
@AllArgsConstructor
public enum ExceptionEnum implements IResultCode {
/**
* 操作成功
*/
SUCCESS(HttpServletResponse.SC_OK, "操作成功"),
/**
* 业务异常
*/
FAILURE(HttpServletResponse.SC_BAD_REQUEST, "业务异常"),
/**
* 请求未授权
*/
UN_AUTHORIZED(HttpServletResponse.SC_UNAUTHORIZED, "请求未授权"),
/**
* 客户端请求未授权
*/
CLIENT_UN_AUTHORIZED(HttpServletResponse.SC_UNAUTHORIZED, "客户端请求未授权"),
/**
* 404 没找到请求
*/
NOT_FOUND(HttpServletResponse.SC_NOT_FOUND, "404 没找到请求"),
/**
* 消息不能读取
*/
MSG_NOT_READABLE(HttpServletResponse.SC_BAD_REQUEST, "消息不能读取"),
/**
* 不支持当前请求方法
*/
METHOD_NOT_SUPPORTED(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "不支持当前请求方法"),
/**
* 不支持当前媒体类型
*/
MEDIA_TYPE_NOT_SUPPORTED(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "不支持当前媒体类型"),
/**
* 请求被拒绝
*/
REQ_REJECT(HttpServletResponse.SC_FORBIDDEN, "请求被拒绝"),
/**
* 服务器异常
*/
INTERNAL_SERVER_ERROR(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "服务器异常"),
/**
* 缺少必要的请求参数
*/
PARAM_MISS(HttpServletResponse.SC_BAD_REQUEST, "缺少必要的请求参数"),
/**
* 请求参数类型错误
*/
PARAM_TYPE_ERROR(HttpServletResponse.SC_BAD_REQUEST, "请求参数类型错误"),
/**
* 请求参数绑定错误
*/
PARAM_BIND_ERROR(HttpServletResponse.SC_BAD_REQUEST, "请求参数绑定错误"),
/**
* 参数校验失败
*/
PARAM_VALID_ERROR(HttpServletResponse.SC_BAD_REQUEST, "参数校验失败"),
/**
* 模拟数据失败
*/
SIMULATE_ERROR(400, "模拟数据失败"),
;
/**
* code编码
*/
final int code;
/**
* 中文信息描述
*/
final String message;
}

19
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFacConfigMapper.java

@ -0,0 +1,19 @@
package com.hnac.hzinfo.simulate.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hnac.hzinfo.simulate.entity.DeviceFacConfig;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author ysj
*/
@Mapper
public interface DeviceFacConfigMapper extends BaseMapper<DeviceFacConfig> {
List<DeviceFacConfig> queryConfigDevice(@Param("method") String method);
DeviceFacConfig configByDeviceCode(@Param("deviceCode") String deviceCode);
}

13
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFacConfigMapper.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hnac.hzinfo.simulate.mapper.DeviceFacConfigMapper">
<select id="queryConfigDevice" resultType="com.hnac.hzinfo.simulate.entity.DeviceFacConfig">
SELECT * FROM hzinfo_device_fac_config
WHERE WRITE_METHOD = #{method}
</select>
<select id="configByDeviceCode" resultType="com.hnac.hzinfo.simulate.entity.DeviceFacConfig">
SELECT * FROM hzinfo_device_fac_config
WHERE DEVICE_CODE = #{deviceCode}
</select>
</mapper>

16
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldGapMapper.java

@ -0,0 +1,16 @@
package com.hnac.hzinfo.simulate.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hnac.hzinfo.simulate.entity.DeviceFieldGap;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
@Mapper
public interface DeviceFieldGapMapper extends BaseMapper<DeviceFieldGap> {
List<DeviceFieldGap> queryDeviceLimits(@Param("signages") List<String> signages);
void updateLimitById(@Param("maxValue") BigDecimal maxValue, @Param("minValue") BigDecimal minValue,@Param("id") String id);
}

18
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldGapMapper.xml

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hnac.hzinfo.simulate.mapper.DeviceFieldGapMapper">
<select id="queryDeviceLimits" resultType="com.hnac.hzinfo.simulate.entity.DeviceFieldGap">
select * from hzinfo_fac_device_attr_gap
where signage in
<foreach collection="signages" item="item" open="(" close=")" separator="," >
#{item}
</foreach>
</select>
<update id="updateLimitById">
UPDATE hzinfo_fac_device_attr_gap
SET max_val = #{maxValue},
min_val = #{minValue}
WHERE id = #{id}
</update>
</mapper>

19
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldMapper.java

@ -0,0 +1,19 @@
package com.hnac.hzinfo.simulate.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hnac.hzinfo.simulate.entity.DeviceField;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface DeviceFieldMapper extends BaseMapper<DeviceField> {
int existGapTable();
int createGapTable();
List<DeviceField> queryNewInsert();
List<DeviceField> queryDeviceFields(@Param("devices") List<String> devices);
List<DeviceField> querySignages(@Param("facDeviceId") String facDeviceId);
}

34
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldMapper.xml

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hnac.hzinfo.simulate.mapper.DeviceFieldMapper">
<select id="existGapTable" resultType="int">
select count(*) from information_schema.TABLES where table_name = 'hzinfo_device_field_gap'
</select>
<update id="createGapTable">
CREATE TABLE hzinfo_device_field_gap (
id varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '字段类型',
fac_device_id varchar(50) COLLATE utf8mb4_bin NOT NULL COMMENT '设备实例id',
signage varchar(25) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '字段标识',
name varchar(100) COLLATE utf8mb4_bin NOT NULL COMMENT '字段名称',
max_val decimal(9,3) DEFAULT NULL,
min_val decimal(9,3) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='设备字段'
</update>
<select id="queryNewInsert" resultType="com.hnac.hzinfo.simulate.entity.DeviceField">
select * from hzinfo_fac_device_attr field where NOT EXISTS (select id from hzinfo_fac_device_attr_gap gap where field.id=gap.id)
</select>
<select id="queryDeviceFields" resultType="com.hnac.hzinfo.simulate.entity.DeviceField">
select * from hzinfo_fac_device_attr
where fac_device_id in
<foreach collection="devices" item="item" open="(" close=")" separator="," >
#{item}
</foreach>
</select>
<select id="querySignages" resultType="com.hnac.hzinfo.simulate.entity.DeviceField">
SELECT * FROM hzinfo_fac_device_attr
WHERE FAC_DEVICE_ID = #{facDeviceId}
</select>
</mapper>

18
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceMapper.java

@ -0,0 +1,18 @@
package com.hnac.hzinfo.simulate.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hnac.hzinfo.simulate.entity.Device;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
@Mapper
public interface DeviceMapper extends BaseMapper<Device> {
String getSid(@Param("stationId") String stationId);
List<String> selectStcd();
int insertData(@Param("param") Map<String, Object> param);
}

15
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceMapper.xml

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hnac.hzinfo.simulate.mapper.DeviceMapper">
<select id="getSid" resultType="java.lang.String">
select DISTINCT sid from hzinfo_fac_device where project_id=#{stationId} and sid is not null limit 1
</select>
<select id="selectStcd" resultType="java.lang.String">
select rscd from blade_ris.st_rsr_bsin where is_deleted=0
</select>
<insert id="insertData" keyProperty="id" useGeneratedKeys="true">
insert into blade_ris.reservoir_data(STCD,DT,INFLOW) values (#{param.stcd},#{param.dt},#{param.inflow})
</insert>
</mapper>

17
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceRainGapMapper.java

@ -0,0 +1,17 @@
package com.hnac.hzinfo.simulate.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hnac.hzinfo.simulate.entity.DeviceRainGap;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author ysj
*/
@Mapper
public interface DeviceRainGapMapper extends BaseMapper<DeviceRainGap> {
List<DeviceRainGap> RainGapByFacDeviceId(@Param("facDeviceId") String facDeviceId);
}

9
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceRainGapMapper.xml

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hnac.hzinfo.simulate.mapper.DeviceRainGapMapper">
<select id="RainGapByFacDeviceId" resultType="com.hnac.hzinfo.simulate.entity.DeviceRainGap">
SELECT * FROM hzinfo_fac_device_rain_gap
WHERE FAC_DEVICE_ID = #{facDeviceId}
</select>
</mapper>

113
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/scheduled/SimulateJob.java

@ -0,0 +1,113 @@
package com.hnac.hzinfo.simulate.scheduled;
import com.hnac.hzinfo.simulate.entity.DeviceField;
import com.hnac.hzinfo.simulate.entity.DeviceFieldGap;
import com.hnac.hzinfo.simulate.service.DeviceFieldGapService;
import com.hnac.hzinfo.simulate.service.DeviceFieldService;
import com.hnac.hzinfo.simulate.service.ISimulateService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springblade.xxljob.annotation.XxlRegister;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Component
public class SimulateJob {
@Value("${simulate.stationIds}")
String stationId;
@Autowired
ISimulateService simulateService;
@XxlJob("v3Simulate")
@XxlRegister(cron = "0 0/1 * * * ?", jobDesc = "模拟V3数据 传入stationId,多个用逗号隔开")
public ReturnT<String> v3Simulate(String param) {
if (StringUtils.isNotBlank(param)) {
String[] stationIds = param.split(",");
simulateService.simulationMultipleV3(stationIds);
} else {
String[] stationIds = stationId.split(",");
simulateService.simulationMultipleV3(stationIds);
}
return ReturnT.SUCCESS;
}
@XxlJob("v4Simulate")
@XxlRegister(cron = "0 0/1 * * * ?", jobDesc = "模拟V4数据 传入stationId,多个用逗号隔开", triggerStatus = 1)
public ReturnT<String> v4Simulate(String param) {
if (StringUtils.isNotBlank(param)) {
String[] stationIds = param.split(",");
simulateService.simulationMultipleV4(stationIds);
} else {
String[] stationIds = stationId.split(",");
simulateService.simulationMultipleV4(stationIds);
}
return ReturnT.SUCCESS;
}
@XxlJob("simulationMultipleInFlow")
@XxlRegister(cron = "0 0/1 * * * ?", jobDesc = "模拟入库流量")
public ReturnT<String> simulationMultipleInFlow(String param) {
simulateService.simulationMultipleInFlow();
return ReturnT.SUCCESS;
}
@XxlJob("simulationStandard")
@XxlRegister(cron = "0 0/1 * * * ?", jobDesc = "模拟标准设备 传入stationId")
public ReturnT<String> simulationStandard(String param) {
String[] ids = StringUtils.isNotBlank(param) ? param.split(",") : stationId.split(",");
for (String id : ids) {
simulateService.simulationStandard(id);
}
return ReturnT.SUCCESS;
}
@Autowired
DeviceFieldService deviceFieldService;
@Autowired
DeviceFieldGapService deviceFieldGapService;
//第一次同步设备属性 执行一次就行
@XxlJob("syncOneGap")
public ReturnT<String> syncOneGap(String param) {
//存在表
int count = deviceFieldService.existGapTable();
if (count <= 0) {//建表
deviceFieldService.createGapTable();
}
//同步
List<DeviceField> list = deviceFieldService.list();
List<DeviceFieldGap> gaps = list.stream().map(result -> new DeviceFieldGap(result.getId(), result.getFacDeviceId(),
result.getSignage(), result.getName(), BigDecimal.ZERO, BigDecimal.ZERO))
.collect(Collectors.toList());
deviceFieldGapService.saveOrUpdateBatch(gaps);
return ReturnT.SUCCESS;
}
//第二次同步设备属性 执行一次就行
@XxlJob("syncTwoGap")
public ReturnT<String> syncTwoGap(String param) {
//同步
List<DeviceField> list = deviceFieldService.queryNewInsert();
if (list != null && !list.isEmpty()) {
List<DeviceFieldGap> gaps = list.stream().map(result -> new DeviceFieldGap(result.getId(), result.getFacDeviceId(),
result.getSignage(), result.getName(), BigDecimal.ZERO, BigDecimal.ZERO))
.collect(Collectors.toList());
deviceFieldGapService.saveBatch(gaps);
}
return ReturnT.SUCCESS;
}
}

41
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/scheduled/WriteRealDataTask.java

@ -0,0 +1,41 @@
package com.hnac.hzinfo.simulate.scheduled;
import com.hnac.hzinfo.simulate.service.WriteRealDataService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import static com.hnac.hzinfo.simulate.constants.WriteRealDataConstant.WRITE_REAL_GATE_DATA;
/**
* @author ysj
* @describe 实时数据写入定时任务
*/
@Slf4j
@Component
public class WriteRealDataTask {
@Autowired
private WriteRealDataService writeRealDataService;
/**
* 设备模型信息
*/
@XxlJob(WRITE_REAL_GATE_DATA)
//@Scheduled(cron = "0/40 * * * * ? ")
public ReturnT<String> writeRealGateData(String param) {
if (Func.isBlank(param)) {
param = DateUtil.format(new Date(), "yyyy-MM");
}
writeRealDataService.writeRealGateData(param);
return new ReturnT<>("SUCCESS");
}
}

11
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/DeviceFieldGapService.java

@ -0,0 +1,11 @@
package com.hnac.hzinfo.simulate.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hnac.hzinfo.simulate.entity.DeviceFieldGap;
import com.hnac.hzinfo.simulate.mapper.DeviceFieldGapMapper;
import org.springframework.stereotype.Service;
@Service
public class DeviceFieldGapService extends ServiceImpl<DeviceFieldGapMapper, DeviceFieldGap> {
}

24
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/DeviceFieldService.java

@ -0,0 +1,24 @@
package com.hnac.hzinfo.simulate.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hnac.hzinfo.simulate.entity.DeviceField;
import com.hnac.hzinfo.simulate.mapper.DeviceFieldMapper;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class DeviceFieldService extends ServiceImpl<DeviceFieldMapper, DeviceField> {
public int existGapTable(){
return this.baseMapper.existGapTable();
}
public int createGapTable(){
return this.baseMapper.createGapTable();
}
public List<DeviceField> queryNewInsert(){
return this.baseMapper.queryNewInsert();
}
}

24
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/DeviceService.java

@ -0,0 +1,24 @@
package com.hnac.hzinfo.simulate.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hnac.hzinfo.simulate.entity.Device;
import com.hnac.hzinfo.simulate.mapper.DeviceMapper;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class DeviceService extends ServiceImpl<DeviceMapper, Device> {
public String getSid(String stationId) {
return this.baseMapper.getSid(stationId);
}
public List<String> selectStcd() {
return this.baseMapper.selectStcd();
}
public int insertData(Map<String, Object> param) {
return this.baseMapper.insertData(param);
}
}

18
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/ISimulateService.java

@ -0,0 +1,18 @@
package com.hnac.hzinfo.simulate.service;
import com.hnac.hzinfo.simulate.vo.GenerateFactoryDeviceVo;
public interface ISimulateService {
void simulationMultipleV3(String[] stationIds);
void simulationMultipleV4(String[] stationIds);
void simulationStandard(String projectId);
void stopStart();
void simulationMultipleInFlow();
Boolean generateFactoryData(GenerateFactoryDeviceVo deviceInfo);
}

279
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/SimulationService.java

@ -0,0 +1,279 @@
package com.hnac.hzinfo.simulate.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.hnac.hzinfo.simulate.util.DataConstants;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tool.jackson.JsonUtil;
import org.springblade.core.tool.utils.DateTimeUtil;
import org.springblade.core.tool.utils.ThreadUtil;
import org.springblade.mqtt.producer.IMqttSender;
import com.hnac.hzinfo.simulate.entity.*;
import com.hnac.hzinfo.simulate.util.TopicConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@Service
@Slf4j
public class SimulationService {
@Autowired
IMqttSender mqttSender;
@Autowired
DeviceService deviceService;
@Autowired
DeviceFieldService deviceFieldService;
@Autowired
DeviceFieldGapService deviceFieldGapService;
public List<Device> getDeviceListByStationId(String projectId){
LambdaQueryWrapper<Device> lambdaQueryWrapper=new LambdaQueryWrapper();
lambdaQueryWrapper.eq(Device::getProjectId,projectId);
List<Device> list = deviceService.list(lambdaQueryWrapper);
return list;
}
String getSid(String stationId){
return deviceService.getSid(stationId);
}
//模拟启停标识
private volatile boolean flag=true;
public void stopStart(){
flag = !flag;
}
@Async
public void simulationMultiple(String stationId, Long sleepTime) {
List<Device> list = getDeviceListByStationId(stationId);
//查询所有属性
List<DeviceField> fieldList = deviceFieldService.list();
List<DeviceFieldGap> gapList = deviceFieldGapService.list();
log.info("本站{}有{}个设备实例,每{}毫秒发送{}条数据", stationId, list.size(), sleepTime, list.size());
while (true) {
if (flag) {//启动或关闭模拟
for (Device device : list) {
Map<String, DeviceData> map = simulation(stationId, device,fieldList,gapList);
// log.info("map data: "+ JsonUtil.toJson(map));
if (map.get("yc") != null && map.get("yc").getChildren().size() > 0) {
log.info("模拟推送遥测,主题:topic_hzinfo_props:{}", JsonUtil.toJson(map.get("yc")));
mqttSender.sendToMqtt(TopicConstant.TOPIC_HZINFO_PROPS, JsonUtil.toJson(map.get("yc")));
}
// if (map.get("dd") != null && map.get("dd").getChildren().size() > 0) {
// mqttSender.sendToMqtt(TopicConstant.TOPIC_HZINFO_DD, JsonUtil.toJson(map.get("dd")));
// }
if (map.get("yx") != null && map.get("yx").getChildren().size() > 0) {
mqttSender.sendToMqtt(TopicConstant.TOPIC_HZINFO_YX, JsonUtil.toJson(map.get("yx")));
}
}
//最小10毫秒
if (sleepTime == null || sleepTime == 0) {
sleepTime = 10L;
}
ThreadUtil.sleep(sleepTime);
}
}
}
// @Async
// public void simulationMultipleInFlow(){
// List<String> list=deviceService.selectStcd();
// while (true) {
// List<Map<String,Object>> datas = simulationFlow(list);
// for(Map<String,Object> param:datas){
// deviceService.insertData(param);
// }
// ThreadUtil.sleep(3600000);
// }
// }
private List<Map<String,Object>> simulationFlow(List<String> list){
List<Map<String,Object>> datas =new ArrayList<>();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dt=sdf.format(new Date());
for(String stcd:list){
Map<String,Object> data=new HashMap<>();
String value = getRandomRedPacketBetweenMinAndMax(new BigDecimal("0"), new BigDecimal("20")).toString();
data.put("stcd",stcd);
data.put("dt",dt);
data.put("inflow",value);
datas.add(data);
}
return datas;
}
@Async
public void simulationMultipleV4(String stationId, Long sleepTime){
String sid=getSid(stationId);
List<Device> list = getDeviceListByStationId(stationId);
//查询所有属性
List<DeviceField> fieldList = deviceFieldService.list();
List<DeviceFieldGap> gapList = deviceFieldGapService.list();
log.info("本站{}有{}个设备实例,每{}毫秒发送{}条数据", stationId, list.size(), sleepTime, list.size());
while (true) {
if (flag) {//启动或关闭模拟
for (Device device : list) {
Map<String, DeviceDataV4> map = simulationV4(stationId,sid, device,fieldList,gapList);
//log.info("map data: "+ JsonUtil.toJson(map));
if (map.get("yc") != null && map.get("yc").getChildren().size() > 0) {
mqttSender.sendToMqtt("hzinfo_v4_yc", JsonUtil.toJson(map.get("yc")));
}
// if (map.get("dd") != null && map.get("dd").getChildren().size() > 0) {
// mqttSender.sendToMqtt(TopicConstant.TOPIC_HZINFO_DD, JsonUtil.toJson(map.get("dd")));
// }
if (map.get("yx") != null && map.get("yx").getChildren().size() > 0) {
mqttSender.sendToMqtt("hzinfo_v4_yx", JsonUtil.toJson(map.get("yx")));
}
}
//最小10毫秒
if (sleepTime == null || sleepTime == 0) {
sleepTime = 10L;
}
ThreadUtil.sleep(sleepTime);
}
}
}
public static BigDecimal getRandomRedPacketBetweenMinAndMax(BigDecimal min, BigDecimal max){
float minF = min.floatValue();
float maxF = max.floatValue();
//生成随机数
BigDecimal db = new BigDecimal(Math.random() * (maxF - minF) + minF);
//返回保留两位小数的随机数。不进行四舍五入
return db.setScale(3,BigDecimal.ROUND_DOWN);
}
public static int getIntBetweenMinAndMax(int min, int max){
//生成随机数
int randomNum = min + (int)(Math.random() * ((max - min) + 1));
//返回保留两位小数的随机数。不进行四舍五入
return randomNum;
}
/**
* 模拟一条数据
*/
private Map<String, DeviceData> simulation(String stationId, Device device,List<DeviceField> fieldListAll,List<DeviceFieldGap> gapListAll) {
// List<DeviceField> fieldList = getListByDeviceId(device.getId());
// List<DeviceFieldGap> gapList = getListByDeviceGapId(device.getId());
List<DeviceField> fieldList =fieldListAll.stream().filter(e->e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList());
List<DeviceFieldGap> gapList =gapListAll.stream().filter(e->e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList());
// log.info("fieldList data: "+ JsonUtil.toJson(fieldList));
// log.info("gapList data: "+ JsonUtil.toJson(gapList));
List<Kvtq> ycList = Lists.newArrayList();
List<Kvtq> yxList = Lists.newArrayList();
//List<Kvtq> ddList = Lists.newArrayList();
for (DeviceField field : fieldList) {
Optional<DeviceFieldGap> gapOpt=gapList.stream().filter(e->e.getSignage().equals(field.getSignage())).findFirst();
if (DataConstants.DeviceDataType.YC.ordinal()== field.getModelClassifyId().intValue()) {
if(gapOpt!=null) {
DeviceFieldGap gap=gapOpt.get();
String value = getRandomRedPacketBetweenMinAndMax(gap.getMinVal(), gap.getMaxVal()).toString();
Kvtq kvtq = Kvtq.builder().k(field.getSignage()).v(value).t(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).q(0).build();
ycList.add(kvtq);
}
}
// if (DataConstants.DeviceDataType.DD.name().equals(field.getType())) {
// String value = Func.random(1, RandomType.INT) + "." + Func.random(1, RandomType.INT);
// Kvtq kvtq = Kvtq.builder().k(field.getId()).v(value).t(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).q(0).build();
// ddList.add(kvtq);
// }
if (DataConstants.DeviceDataType.YX.ordinal()== field.getModelClassifyId().intValue()) {
if(gapOpt!=null) {
DeviceFieldGap gap=gapOpt.get();
int value = getIntBetweenMinAndMax(gap.getMinVal().intValue(), gap.getMaxVal().intValue());
Kvtq kvtq = Kvtq.builder().k(field.getSignage()).v(String.valueOf(value)).t(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).q(0).build();
yxList.add(kvtq);
}
}
}
Map<String, DeviceData> map = Maps.newHashMap();
if (ycList.size() > 0) {
map.put("yc", DeviceData.builder().station(stationId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(ycList).build());
}
// if (ddList.size() > 0) {
// map.put("dd", DeviceData.builder().station(stationId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(ddList).build());
// }
if (yxList.size() > 0) {
map.put("yx", DeviceData.builder().station(stationId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(yxList).build());
}
return map;
}
private Map<String, DeviceDataV4> simulationV4(String stationId,String sid, Device device,List<DeviceField> fieldListAll,List<DeviceFieldGap> gapListAll) {
// List<DeviceField> fieldList = getListByDeviceId(device.getId());
// List<DeviceFieldGap> gapList = getListByDeviceGapId(device.getId());
List<DeviceField> fieldList =fieldListAll.stream().filter(e->e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList());
List<DeviceFieldGap> gapList =gapListAll.stream().filter(e->e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList());
// log.info("fieldList data: "+ JsonUtil.toJson(fieldList));
// log.info("gapList data: "+ JsonUtil.toJson(gapList));
List<KvtqV4> ycList = Lists.newArrayList();
List<KvtqV4> yxList = Lists.newArrayList();
//List<Kvtq> ddList = Lists.newArrayList();
for (DeviceField field : fieldList) {
Optional<DeviceFieldGap> gapOpt=gapList.stream().filter(e->e.getSignage().equals(field.getSignage())).findFirst();
if (DataConstants.DeviceDataType.YC.ordinal()== field.getModelClassifyId().intValue()) {
if(gapOpt!=null) {
DeviceFieldGap gap=gapOpt.get();
String value = getRandomRedPacketBetweenMinAndMax(gap.getMinVal(), gap.getMaxVal()).toString();
KvtqV4 kvtq = KvtqV4.builder().sid(sid).k(field.getSignage()).v(value).t(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).q(0).build();
ycList.add(kvtq);
}
}
// if (DataConstants.DeviceDataType.DD.name().equals(field.getType())) {
// String value = Func.random(1, RandomType.INT) + "." + Func.random(1, RandomType.INT);
// Kvtq kvtq = Kvtq.builder().k(field.getId()).v(value).t(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).q(0).build();
// ddList.add(kvtq);
// }
if (DataConstants.DeviceDataType.YX.ordinal()== field.getModelClassifyId().intValue()) {
if(gapOpt!=null) {
DeviceFieldGap gap=gapOpt.get();
int value = getIntBetweenMinAndMax(gap.getMinVal().intValue(), gap.getMaxVal().intValue());
KvtqV4 kvtq = KvtqV4.builder().sid(sid).k(field.getSignage()).v(String.valueOf(value)).t(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).q(0).build();
yxList.add(kvtq);
}
}
}
Map<String, DeviceDataV4> map = Maps.newHashMap();
if (ycList.size() > 0) {
map.put("yc", DeviceDataV4.builder().stationId(stationId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(ycList).build());
}
// if (ddList.size() > 0) {
// map.put("dd", DeviceData.builder().station(stationId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(ddList).build());
// }
if (yxList.size() > 0) {
map.put("yx", DeviceDataV4.builder().stationId(stationId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(yxList).build());
}
return map;
}
private List<DeviceField> getListByDeviceId(String deviceId) {
return deviceFieldService.list(Wrappers.<DeviceField>lambdaQuery().ne(DeviceField::getModelClassifyId, DataConstants.DeviceDataType.SOE.name()).eq(DeviceField::getFacDeviceId, deviceId));
}
private List<DeviceFieldGap> getListByDeviceGapId(String deviceId){
return deviceFieldGapService.list(Wrappers.<DeviceFieldGap>lambdaQuery().eq(DeviceFieldGap::getFacDeviceId, deviceId));
}
}

12
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/WriteRealDataService.java

@ -0,0 +1,12 @@
package com.hnac.hzinfo.simulate.service;
/**
* @author ysj
*/
public interface WriteRealDataService {
void writeRealGateData(String param);
Boolean isOpen(String deviceCode, Long isOpen);
}

276
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/impl/SimulateServiceImpl.java

@ -0,0 +1,276 @@
package com.hnac.hzinfo.simulate.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.hnac.hzinfo.sdk.v5.device.client.DeviceClient;
import com.hnac.hzinfo.sdk.v5.device.vo.DeviceInstanceAttrVO;
import com.hnac.hzinfo.sdk.v5.device.vo.DeviceInstanceVO;
import com.hnac.hzinfo.simulate.entity.*;
import com.hnac.hzinfo.simulate.service.DeviceFieldGapService;
import com.hnac.hzinfo.simulate.service.DeviceFieldService;
import com.hnac.hzinfo.simulate.service.DeviceService;
import com.hnac.hzinfo.simulate.service.ISimulateService;
import com.hnac.hzinfo.simulate.util.DataConstants;
import com.hnac.hzinfo.simulate.util.TopicConstant;
import com.hnac.hzinfo.simulate.vo.GenerateFactoryDeviceVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.jackson.JsonUtil;
import org.springblade.core.tool.utils.DateTimeUtil;
import org.springblade.core.tool.utils.ThreadUtil;
import org.springblade.mqtt.producer.IMqttSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
@Service
@Slf4j
public class SimulateServiceImpl implements ISimulateService {
//模拟启停标识
private volatile boolean flag = true;
@Autowired
IMqttSender mqttSender;
@Autowired
DeviceService deviceService;
@Autowired
DeviceFieldService deviceFieldService;
@Autowired
DeviceFieldGapService deviceFieldGapService;
@Autowired
DeviceClient deviceClient;
@Override
@Async
public void simulationStandard(String projectId) {
R<List<DeviceInstanceVO>> r = deviceClient.getStandardOnlineDeviceInstance(projectId);
List<DeviceInstanceVO> vos = r.getData();
if (vos == null || vos.isEmpty()) {
return;
}
for (DeviceInstanceVO vo : vos) {
String deviceCode = vo.getCode();
R<List<DeviceInstanceAttrVO>> listR = deviceClient.getOnlineAttr(deviceCode);
List<DeviceInstanceAttrVO> attrVOS = listR.getData();
Map<String, String> map = new HashMap<>();
for (DeviceInstanceAttrVO attrVO : attrVOS) {
if (StringUtils.isBlank(attrVO.getSignage())) {
continue;
}
String value = getRandomRedPacketBetweenMinAndMax(new BigDecimal("0"), new BigDecimal("20")).toString();
map.put(attrVO.getSignage(), value);
}
LocalDateTime now = LocalDateTime.now();
map.put("ts", "" + now.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
mqttSender.sendToMqtt(TopicConstant.TOPIC_HZINFO_DATA + "/" + deviceCode, JsonUtil.toJson(map));
}
}
@Override
public void stopStart() {
flag = !flag;
}
@Override
@Async
public void simulationMultipleInFlow() {
List<String> list = deviceService.selectStcd();
while (true) {
List<Map<String, Object>> datas = simulationFlow(list);
for (Map<String, Object> param : datas) {
deviceService.insertData(param);
}
ThreadUtil.sleep(3600000);
}
}
@Override
public Boolean generateFactoryData(GenerateFactoryDeviceVo deviceInfo) {
Device device = deviceService.getOne(Wrappers.lambdaQuery(Device.class).eq(Device::getId, deviceInfo.getDeviceId()));
return Boolean.TRUE;
}
private List<Map<String, Object>> simulationFlow(List<String> list) {
List<Map<String, Object>> datas = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dt = sdf.format(new Date());
for (String stcd : list) {
Map<String, Object> data = new HashMap<>();
String value = getRandomRedPacketBetweenMinAndMax(new BigDecimal("0"), new BigDecimal("20")).toString();
data.put("stcd", stcd);
data.put("dt", dt);
data.put("inflow", value);
datas.add(data);
}
return datas;
}
@Override
@Async
public void simulationMultipleV3(String[] stationIds) {
for (String stationId : stationIds) {
List<Device> list = getDeviceListByStationId(stationId);
//查询所有属性
List<DeviceField> fieldList = deviceFieldService.list();
List<DeviceFieldGap> gapList = deviceFieldGapService.list();
log.info("本站{}有{}个设备实例,发送{}条数据", stationId, list.size(), list.size());
for (Device device : list) {
Map<String, DeviceData> map = simulationV3(stationId, device, fieldList, gapList);
if (map.get("yc") != null && !map.get("yc").getChildren().isEmpty()) {
mqttSender.sendToMqtt(TopicConstant.TOPIC_HZINFO_PROPS, JsonUtil.toJson(map.get("yc")));
}
if (map.get("yx") != null && !map.get("yx").getChildren().isEmpty()) {
mqttSender.sendToMqtt(TopicConstant.TOPIC_HZINFO_YX, JsonUtil.toJson(map.get("yx")));
}
}
}
}
/**
* 模拟一条数据
*/
private Map<String, DeviceData> simulationV3(String stationId, Device device, List<DeviceField> fieldListAll, List<DeviceFieldGap> gapListAll) {
List<DeviceField> fieldList = fieldListAll.stream().filter(e -> e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList());
List<DeviceFieldGap> gapList = gapListAll.stream().filter(e -> e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList());
List<Kvtq> ycList = Lists.newArrayList();
List<Kvtq> yxList = Lists.newArrayList();
for (DeviceField field : fieldList) {
Optional<DeviceFieldGap> gapOpt = gapList.stream().filter(e -> e.getSignage().equals(field.getSignage())).findFirst();
BigDecimal max = BigDecimal.ONE, min = BigDecimal.ZERO;
if (gapOpt.isPresent()) {
DeviceFieldGap gap = gapOpt.get();
max = gap.getMaxVal();
min = gap.getMinVal();
}
if (DataConstants.DeviceDataType.YC.ordinal() == field.getModelClassifyId().intValue()) {
String value = getRandomRedPacketBetweenMinAndMax(min, max).toString();
Kvtq kvtq = Kvtq.builder().k(field.getSignage()).v(value).t(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).q(0).build();
ycList.add(kvtq);
}
if (DataConstants.DeviceDataType.YX.ordinal() == field.getModelClassifyId().intValue()) {
int value = getIntBetweenMinAndMax(min.intValue(), max.intValue());
Kvtq kvtq = Kvtq.builder().k(field.getSignage()).v(String.valueOf(value)).t(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).q(0).build();
yxList.add(kvtq);
}
}
Map<String, DeviceData> map = Maps.newHashMap();
if (!ycList.isEmpty()) {
map.put("yc", DeviceData.builder().station(stationId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(ycList).build());
}
if (!yxList.isEmpty()) {
map.put("yx", DeviceData.builder().station(stationId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(yxList).build());
}
return map;
}
String getSid(String stationId) {
return deviceService.getSid(stationId);
}
public List<Device> getDeviceListByStationId(String projectId) {
LambdaQueryWrapper<Device> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Device::getProjectId, projectId);
List<Device> list = deviceService.list(wrapper);
return list;
}
@Override
@Async
public void simulationMultipleV4(String[] stationIds) {
for (String stationId : stationIds) {
String sid = getSid(stationId);
List<Device> list = getDeviceListByStationId(stationId);
//查询所有属性
List<DeviceField> fieldList = deviceFieldService.list();
List<DeviceFieldGap> gapList = deviceFieldGapService.list();
log.info("本站{}有{}个设备实例,发送{}条数据", stationId, list.size(), list.size());
for (Device device : list) {
Map<String, DeviceDataV4> map = simulationV4(stationId, sid, device, fieldList, gapList);
log.info("模拟数据{}", map);
if (map.get("yc") != null && !map.get("yc").getChildren().isEmpty()) {
mqttSender.sendToMqtt("hzinfo_v4_yc", JsonUtil.toJson(map.get("yc")));
}
if (map.get("yx") != null && !map.get("yx").getChildren().isEmpty()) {
mqttSender.sendToMqtt("hzinfo_v4_yx", JsonUtil.toJson(map.get("yx")));
}
}
}
}
private Map<String, DeviceDataV4> simulationV4(String stationId, String sid, Device device, List<DeviceField> fieldListAll, List<DeviceFieldGap> gapListAll) {
List<DeviceField> fieldList = fieldListAll.stream().filter(e -> e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList());
List<DeviceFieldGap> gapList = gapListAll.stream().filter(e -> e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList());
List<KvtqV4> ycList = Lists.newArrayList();
List<KvtqV4> yxList = Lists.newArrayList();
for (DeviceField field : fieldList) {
Optional<DeviceFieldGap> gapOpt = gapList.stream().filter(e -> e.getSignage().equals(field.getSignage())).findFirst();
BigDecimal max = BigDecimal.ONE;
BigDecimal min = BigDecimal.ZERO;
if (gapOpt.isPresent()) {
DeviceFieldGap gap = gapOpt.get();
max = gap.getMaxVal();
min = gap.getMinVal();
}
if (DataConstants.DeviceDataType.YC.ordinal() == field.getModelClassifyId().intValue()) {
String value = getRandomRedPacketBetweenMinAndMax(min, max).toString();
KvtqV4 kvtq = KvtqV4.builder().sid(sid).k(field.getSignage()).v(value).t(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).q(0).build();
ycList.add(kvtq);
}
if (DataConstants.DeviceDataType.YX.ordinal() == field.getModelClassifyId().intValue()) {
int value = getIntBetweenMinAndMax(min.intValue(), max.intValue());
KvtqV4 kvtq = KvtqV4.builder().sid(sid).k(field.getSignage()).v(String.valueOf(value)).t(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).q(0).build();
yxList.add(kvtq);
}
}
Map<String, DeviceDataV4> map = Maps.newHashMap();
if (!ycList.isEmpty()) {
map.put("yc", DeviceDataV4.builder().stationId(stationId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(ycList).build());
}
if (!yxList.isEmpty()) {
map.put("yx", DeviceDataV4.builder().stationId(stationId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(yxList).build());
}
return map;
}
public static BigDecimal getRandomRedPacketBetweenMinAndMax(BigDecimal min, BigDecimal max) {
float minF = min.floatValue();
float maxF = max.floatValue();
//生成随机数
BigDecimal db = new BigDecimal(Math.random() * (maxF - minF) + minF);
//返回保留两位小数的随机数。不进行四舍五入
return db.setScale(3, BigDecimal.ROUND_DOWN);
}
public static int getIntBetweenMinAndMax(int min, int max) {
//生成随机数
int randomNum = min + (int) (Math.random() * ((max - min) + 1));
//返回保留两位小数的随机数。不进行四舍五入
return randomNum;
}
}

232
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/impl/WriteRealDataServiceImpl.java

@ -0,0 +1,232 @@
package com.hnac.hzinfo.simulate.service.impl;
import com.hnac.hzinfo.simulate.constants.WriteRealDataConstant;
import com.hnac.hzinfo.simulate.entity.*;
import com.hnac.hzinfo.simulate.mapper.DeviceFacConfigMapper;
import com.hnac.hzinfo.simulate.mapper.DeviceFieldGapMapper;
import com.hnac.hzinfo.simulate.mapper.DeviceFieldMapper;
import com.hnac.hzinfo.simulate.mapper.DeviceRainGapMapper;
import com.hnac.hzinfo.simulate.service.WriteRealDataService;
import com.hnac.hzinfo.simulate.util.DataConstants;
import com.hnac.hzinfo.simulate.util.TopicConstant;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tool.jackson.JsonUtil;
import org.springblade.core.tool.utils.CollectionUtil;
import org.springblade.core.tool.utils.DateTimeUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.ObjectUtil;
import org.springblade.mqtt.producer.IMqttSender;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import static com.hnac.hzinfo.simulate.constants.WriteRealDataConstant.REAL_DATA_V3;
import static com.hnac.hzinfo.simulate.constants.WriteRealDataConstant.REAL_DATA_V4;
/**
* @author ysj
*/
@Service
@Slf4j
@RequiredArgsConstructor
public class WriteRealDataServiceImpl implements WriteRealDataService {
private final IMqttSender mqttSender;
private final DeviceFieldMapper fieldMapper;
private final DeviceFieldGapMapper limitMapper;
private final DeviceFacConfigMapper configMapper;
private final DeviceRainGapMapper deviceRainGapMapper;
/**
* 实时数据写入
*
* @param param
*/
@Override
public void writeRealGateData(String param) {
// 查询设备配置
List<DeviceFacConfig> configs = configMapper.queryConfigDevice(WriteRealDataConstant.WRITE_GATE);
if (CollectionUtil.isEmpty(configs)) {
return;
}
//#.000 表示三位小数
DecimalFormat df = new DecimalFormat("#0.000");
// 遍历发送mqtt实时数据
configs.stream().collect(Collectors.groupingBy(DeviceFacConfig::getModelKind)).forEach((modeKind, groups) -> {
// 查询设备属性
List<DeviceField> fields = fieldMapper.queryDeviceFields(groups.stream().map(DeviceFacConfig::getFacDeviceId).collect(Collectors.toList()));
if (CollectionUtil.isEmpty(fields)) {
return;
}
// 查询设备限制
List<DeviceFieldGap> limits = limitMapper.queryDeviceLimits(fields.stream().map(DeviceField::getSignage).collect(Collectors.toList()));
if (CollectionUtil.isEmpty(limits)) {
return;
}
// v3
if (REAL_DATA_V3.equals(modeKind)) {
fields.stream().collect(Collectors.groupingBy(DeviceField::getModelClassifyId)).forEach((key, models) -> {
models.stream().collect(Collectors.groupingBy(DeviceField::getProjectId)).forEach((projectId, value) -> {
// 遥测实时数据对象
List<Kvtq> ycs = value.stream().filter(o -> DataConstants.DeviceDataType.YC.ordinal() == o.getModelClassifyId()).map(field -> {
List<DeviceFieldGap> limit = limits.stream().filter(e -> e.getSignage().equals(field.getSignage())).collect(Collectors.toList());
if (CollectionUtil.isEmpty(limit)) {
return new Kvtq();
}
Kvtq real = new Kvtq();
double random = Math.random() * limit.get(0).getMaxVal().subtract(limit.get(0).getMinVal()).doubleValue() + limit.get(0).getMinVal().doubleValue();
real.setK(field.getSignage());
real.setV(df.format(random));
real.setT(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
real.setQ(0);
return real;
}).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(ycs)) {
log.info("yc_real_data_v3 : {}", JsonUtil.toJson(DeviceData.builder().station(projectId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(ycs).build()));
mqttSender.sendToMqtt(TopicConstant.TOPIC_HZINFO_PROPS, JsonUtil.toJson(DeviceData.builder().station(projectId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(ycs).build()));
}
// 遥信实时数据对象
List<Kvtq> yxs = value.stream().filter(o -> DataConstants.DeviceDataType.YX.ordinal() == o.getModelClassifyId()).map(field -> {
List<DeviceFieldGap> limit = limits.stream().filter(e -> e.getSignage().equals(field.getSignage())).collect(Collectors.toList());
if (CollectionUtil.isEmpty(limit)) {
return new Kvtq();
}
Kvtq real = new Kvtq();
double random = limit.get(0).getMaxVal().subtract(limit.get(0).getMinVal()).doubleValue() + limit.get(0).getMinVal().doubleValue();
real.setK(field.getSignage());
real.setV(df.format(random));
real.setT(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
real.setQ(0);
return real;
}).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(yxs)) {
log.info("yx_real_data_v3 : {}", JsonUtil.toJson(DeviceData.builder().station(projectId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(yxs).build()));
mqttSender.sendToMqtt(TopicConstant.TOPIC_HZINFO_YX, JsonUtil.toJson(DeviceData.builder().station(projectId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(yxs).build()));
}
});
});
}
// v4
if (REAL_DATA_V4.equals(modeKind)) {
fields.stream().collect(Collectors.groupingBy(DeviceField::getModelClassifyId)).forEach((key, models) -> {
models.stream().collect(Collectors.groupingBy(DeviceField::getProjectId)).forEach((projectId, value) -> {
// 遥测实时数据对象
List<KvtqV4> ycs = value.stream().filter(o -> DataConstants.DeviceDataType.YC.ordinal() == o.getModelClassifyId()).map(field -> {
List<DeviceFieldGap> limit = limits.stream().filter(e -> e.getSignage().equals(field.getSignage())).collect(Collectors.toList());
if (CollectionUtil.isEmpty(limit)) {
return new KvtqV4();
}
// 查找sid
Optional<DeviceFacConfig> sid = groups.stream().filter(group -> field.getFacDeviceId().equals(group.getFacDeviceId())).findFirst();
if (!sid.isPresent()) {
return new KvtqV4();
}
KvtqV4 real = new KvtqV4();
double random = Math.random() * limit.get(0).getMaxVal().subtract(limit.get(0).getMinVal()).doubleValue() + limit.get(0).getMinVal().doubleValue();
real.setSid(sid.get().getSid());
real.setK(field.getSignage());
real.setV(df.format(random));
real.setT(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
real.setQ(0);
return real;
}).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(ycs)) {
log.info("yc_real_data_v4 : {}", JsonUtil.toJson(DeviceDataV4.builder().stationId(projectId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(ycs).build()));
mqttSender.sendToMqtt(TopicConstant.TOPIC_HZINFO_V4_YC, JsonUtil.toJson(DeviceDataV4.builder().stationId(projectId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(ycs).build()));
}
// 遥信实时数据对象
List<KvtqV4> yxs = value.stream().filter(o -> DataConstants.DeviceDataType.YX.ordinal() == o.getModelClassifyId()).map(field -> {
List<DeviceFieldGap> limit = limits.stream().filter(e -> e.getSignage().equals(field.getSignage())).collect(Collectors.toList());
if (CollectionUtil.isEmpty(limit)) {
return new KvtqV4();
}
// 查找sid
Optional<DeviceFacConfig> sid = groups.stream().filter(group -> field.getFacDeviceId().equals(group.getFacDeviceId())).findFirst();
if (!sid.isPresent()) {
return new KvtqV4();
}
KvtqV4 real = new KvtqV4();
double random = limit.get(0).getMaxVal().subtract(limit.get(0).getMinVal()).doubleValue() + limit.get(0).getMinVal().doubleValue();
real.setSid(sid.get().getSid());
real.setK(field.getSignage());
real.setV(df.format(random));
real.setT(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
real.setQ(0);
return real;
}).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(yxs)) {
log.info("yx_real_data_v4 : {}", JsonUtil.toJson(DeviceDataV4.builder().stationId(projectId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(yxs).build()));
mqttSender.sendToMqtt(TopicConstant.TOPIC_HZINFO_V4_YX, JsonUtil.toJson(DeviceDataV4.builder().stationId(projectId).time(DateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss.SSS")).children(yxs).build()));
}
});
});
}
});
}
/**
* 开启/关闭闸门数据
*
* @param deviceCode
* @param isOpen
* @return
*/
@Override
public Boolean isOpen(String deviceCode, Long isOpen) {
// 查询写入设备配置
DeviceFacConfig config = configMapper.configByDeviceCode(deviceCode);
if (ObjectUtil.isEmpty(config)) {
return false;
}
// 查询设备属性
List<DeviceField> fields = fieldMapper.querySignages(config.getFacDeviceId());
if (CollectionUtil.isEmpty(fields)) {
return false;
}
// 查询属性限制
List<DeviceFieldGap> limits = limitMapper.queryDeviceLimits(fields.stream().map(DeviceField::getSignage).collect(Collectors.toList()));
if (CollectionUtil.isEmpty(limits)) {
return false;
}
limits.forEach(limit -> {
Optional<DeviceField> optional = fields.stream().filter(o -> o.getSignage().equals(limit.getSignage())).findFirst();
if (!optional.isPresent()) {
return;
}
String signage = optional.get().getName();
if (WriteRealDataConstant.GATE_STATUS.equals(signage)) {
if (WriteRealDataConstant.OPEN.equals(isOpen)) {
limitMapper.updateLimitById(BigDecimal.ONE, BigDecimal.ZERO, limit.getId());
} else {
limitMapper.updateLimitById(BigDecimal.ZERO, BigDecimal.ZERO, limit.getId());
}
} else if (WriteRealDataConstant.GATE_FLOW.equals(signage)) {
if (WriteRealDataConstant.OPEN.equals(isOpen)) {
limitMapper.updateLimitById(BigDecimal.valueOf(3560.000), BigDecimal.valueOf(0.000), limit.getId());
} else {
limitMapper.updateLimitById(BigDecimal.ZERO, BigDecimal.ZERO, limit.getId());
}
} else if (WriteRealDataConstant.OPENING_DEGREE.equals(signage)) {
if (WriteRealDataConstant.OPEN.equals(isOpen)) {
limitMapper.updateLimitById(BigDecimal.valueOf(10), BigDecimal.valueOf(0.000), limit.getId());
} else {
limitMapper.updateLimitById(BigDecimal.ZERO, BigDecimal.ZERO, limit.getId());
}
}
});
return true;
}
}

357
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/DataConstants.java

@ -0,0 +1,357 @@
package com.hnac.hzinfo.simulate.util;
public interface DataConstants {
String REDIS_MESSAGE_TOPIC = "hzinfo_config_message_topic";
String TIME_COLUMN = "ts";
String VALUE_COLUMN = "val";
String Q_COLUMN = "q";
String REAL_ID_COLUMN = "realid";
String TBNAME = "tbname";
String YC_TABLE_PREFIX = "yc_";
String YX_TABLE_PREFIX = "yx_";
String SOE_TABLE_PREFIX = "soe_";
String SOE_ALARM_TABLE_PREFIX = "soe_alarm_";
String YC = "YC";
String YX = "YX";
String SOE = "SOE";
String YK_RETURN_PREFIX = "ykfj:";
String REALID_CALCULATE = "16777215";
String DEVICE_SUPER_TABLE_PREFIX = "hz_";
String DEVICE_TABLE_PREFIX = "d_";
public static enum DataStructTypeEnum {
struct,
dataGroup;
private DataStructTypeEnum() {
}
}
public static enum EYkRetStatus {
yrsSuccess,
yrsServerErr,
yrsChannelErr,
yrsModuleErr,
yrsDeviceTimeOut,
yrsDeviceFail,
yrsExpired;
private EYkRetStatus() {
}
}
public static enum SoeType {
skNone(0, "0", "默认"),
skSys(1, "1", "系统"),
skAlarm(2, "2", "报警"),
skAct(3, "3", "事故"),
skOperate(4, "4", "用户操作"),
skYcOut(5, "5,11,12", "遥测越限"),
skYxChange(6, "6,10", "遥信变位"),
skReg(7, "7", "注册信息"),
skHint(8, "8", "信息提示"),
skInspect(9, "9", "设备巡检"),
skMonitorOperate(10, "13,14", "遥控操作"),
skRDSYcOutOfLimitResume(11, "15", "遥测越限恢复"),
skUndefine(12, "16,17,18", "未定义"),
skNetworkAnomaly(13, "-1", "通讯异常"),
skCommunicateAnomaly(14, "-2", "数据异常");
private Integer index;
private String soeKind;
private String name;
private SoeType(Integer index, String soeKind, String name) {
this.index = index;
this.soeKind = soeKind;
this.name = name;
}
public static String getName(Integer id) {
SoeType[] values = values();
for (int i = 0; i < values.length; ++i) {
if (values[i].index.equals(id)) {
return values[i].getName();
}
}
return null;
}
public static Integer getIndexBySoeKind(String soeType) {
SoeType[] values = values();
SoeType[] var2 = values;
int var3 = values.length;
for (int var4 = 0; var4 < var3; ++var4) {
SoeType type = var2[var4];
if (type.getSoeKind().contains(soeType)) {
return type.getIndex();
}
}
return skUndefine.getIndex();
}
public static String getSoeKindByIndex(Integer index) {
SoeType[] values = values();
SoeType[] var2 = values;
int var3 = values.length;
for (int var4 = 0; var4 < var3; ++var4) {
SoeType type = var2[var4];
if (type.getIndex().equals(index)) {
return type.getSoeKind();
}
}
return "";
}
public Integer getIndex() {
return this.index;
}
public String getSoeKind() {
return this.soeKind;
}
public String getName() {
return this.name;
}
}
public static enum SoeKind {
skNone(0, "默认"),
skSys(1, "系统"),
skAlarm(2, "报警"),
skAct(3, "事故"),
skOperate(4, "操作"),
skYcOut(5, "遥测越限(告警)"),
skYxChange(6, "遥信变位(告警)"),
skReg(7, "注册信息"),
skHint(8, "信息提示"),
skInspect(9, "设备巡检"),
skRDSYxChange(10, "遥信变位(数据)"),
skRDSYcOutOfLimit(11, "遥测越上/下限(数据)"),
skRDSYcOutOfLimit2(12, "遥测越上上/下下限(数据)"),
skMonitorOperate(13, "操作记录(遥控)"),
skMonitorOperateII(14, "操作记录(写定值)"),
skRDSYcOutOfLimitResume(15, "越限恢复"),
bak_7(16, "备用7"),
bak_8(17, "备用8"),
skUndefine(18, "未定义");
private Integer index;
private String name;
private SoeKind(Integer index, String name) {
this.index = index;
this.name = name;
}
public static String getName(Integer id) {
SoeKind[] values = values();
for (int i = 0; i < values.length; ++i) {
if (values[i].index.equals(id)) {
return values[i].getName();
}
}
return null;
}
public Integer getIndex() {
return this.index;
}
public String getName() {
return this.name;
}
}
public static enum DeviceDataType {
YC("遥测"),
YX("遥信"),
DD("电渡"),
YK("遥控"),
YT("遥调"),
SOE("事件"),
STR("字符串"),
OTHER("其它");
private String displayName;
private DeviceDataType(String displayName) {
this.displayName = displayName;
}
public static String getDisplayName(String name) {
DeviceDataType type = valueOf(name);
return type.getDisplayName();
}
public String getDisplayName() {
return this.displayName;
}
}
public static enum YkDelayType {
none_store,
store,
delay_store;
private YkDelayType() {
}
}
public static enum RedisGroupMessageTypeEnum {
NOTICE_CLEAN_LOCAL_CACHE_DEVICE("clean.local.cache.device"),
NOTICE_CLEAN_LOCAL_CACHE_DEVICE_GROUP("clean.local.cache.group"),
NOTICE_CLEAN_LOCAL_CACHE_ALARM("clean.local.cache.alarm"),
NOTICE_CLEAN_LOCAL_CACHE_YK("clean.local.cache.yk");
private String value;
private RedisGroupMessageTypeEnum(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
}
public static enum DataStatusEnum {
offline,
online;
private DataStatusEnum() {
}
}
public static enum StatisticsType {
avg("AVG"),
max("MAX"),
min("MIN");
private String computeStrategy;
private StatisticsType(String fun) {
this.computeStrategy = fun;
}
public static StatisticsType getStatisticsType(int index) {
StatisticsType[] values = values();
StatisticsType[] var2 = values;
int var3 = values.length;
for (int var4 = 0; var4 < var3; ++var4) {
StatisticsType value = var2[var4];
if (index == value.ordinal()) {
return value;
}
}
return null;
}
public String getComputeStrategy() {
return this.computeStrategy;
}
public void setComputeStrategy(final String computeStrategy) {
this.computeStrategy = computeStrategy;
}
}
public static enum AnalyzeInstanceAlarmConfType {
changeAlarm("变化告警"),
supassAlarm("越限告警");
private String name;
private AnalyzeInstanceAlarmConfType(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
public static enum StatisticsAnalyEnum {
Hour("h"),
Day("d"),
Month("n"),
Year("h");
private String type;
private StatisticsAnalyEnum(String fun) {
this.type = fun;
}
public static StatisticsAnalyEnum getStatisticsAnalyEnum(int index) {
StatisticsAnalyEnum[] values = values();
StatisticsAnalyEnum[] var2 = values;
int var3 = values.length;
for (int var4 = 0; var4 < var3; ++var4) {
StatisticsAnalyEnum value = var2[var4];
if (value.ordinal() == index) {
return value;
}
}
return null;
}
public String getType() {
return this.type;
}
}
public static enum StationFromSouceEnum {
cloud,
station;
private StationFromSouceEnum() {
}
}
public static enum AnalyzeInstanceDataResoureEnum {
deviceUp("设备上报"),
hz3000Up("华自网关上报");
private String name;
private AnalyzeInstanceDataResoureEnum(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
public static enum ThresholdLevelEnum {
one,
two,
three;
private ThresholdLevelEnum() {
}
}
public static enum Hz3000VersionEnum {
v3,
v4;
private Hz3000VersionEnum() {
}
}
}

105
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/ParseFacUtils.java

@ -0,0 +1,105 @@
package com.hnac.hzinfo.simulate.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.common.collect.Lists;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.hnac.hzinfo.simulate.entity.DataItem;
import com.hnac.hzinfo.simulate.entity.DataModel;
import org.xml.sax.SAXException;
import java.io.InputStream;
import java.math.BigInteger;
import java.util.List;
/**
* 解析厂信息工具类
* @author ninglong
*/
public class ParseFacUtils {
public static List<DataModel> parsePoint(InputStream inputStream) throws SAXException, DocumentException, JsonProcessingException {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputStream);
List groupElements = document.selectNodes("/Factorys/Factory/Group");
List<DataModel> list = parseDataGroup(groupElements);
List ycElements = document.selectNodes("/Factorys/Factory/Group/AIS/AI");
list = pastePointElement(ycElements, DataConstants.DeviceDataType.YC.name(),list);
List yxElements = document.selectNodes("/Factorys/Factory/Group/DIS/DI");
list = pastePointElement(yxElements, DataConstants.DeviceDataType.YX.name(),list);
List ddElements = document.selectNodes("/Factorys/Factory/Group/DDS/DD");
list = pastePointElement(ddElements, DataConstants.DeviceDataType.DD.name(),list);
List soeElements = document.selectNodes("/Factorys/Factory/Group/SOES/SOE");
list = pastePointElement(soeElements, DataConstants.DeviceDataType.SOE.name(),list);
List ykElements = document.selectNodes("/Factorys/Factory/Group/DOS/DO");
list = pastePointElement(ykElements, DataConstants.DeviceDataType.YK.name(),list);
return list;
}
/**
* 解析数据组
*/
private static List<DataModel> parseDataGroup(List elements){
List<DataModel> list = Lists.newArrayList();
for (Element element : (List<Element>) elements) {
DataModel model = new DataModel();
model.setStructType(DataConstants.DataStructTypeEnum.dataGroup.name());
model.setId(element.attribute("ID").getValue());
model.setSignage(bigId2SmallId(element.attribute("ID").getValue()));
model.setName(element.attribute("Name").getValue());
String stationNumStr = element.getParent().attribute("StationNum").getValue();
model.setStation(stationNumStr);
list.add(model);
}
return list;
}
/**
* 将大id转换成小id
*/
public static String bigId2SmallId(String realId){
BigInteger bigRealId = new BigInteger(realId);
return bigRealId.and(new BigInteger(DataConstants.REALID_CALCULATE)).toString();
}
/**
* 解析数据点
*/
private static List<DataModel> pastePointElement(List elements, String type, List<DataModel> list) throws JsonProcessingException {
for (Element element : (List<Element>) elements) {
String groupId = element.getParent().getParent().attribute("ID").getValue();
for(DataModel dm:list){
if(!groupId.equals(dm.getId())){
continue;
}
DataItem dataItem = DataItem.builder()
.id(element.attribute("ID").getValue())
.signage(bigId2SmallId(element.attribute("ID").getValue()))
.name(element.attribute("Name").getValue())
.type(type)
.build();
if(DataConstants.DeviceDataType.SOE.name().equals(type)){
dataItem.setEventType(element.attribute("SOEAlarmType").getValue());
dataItem.setSoeType(element.attribute("SOEType").getValue());
}
if(DataConstants.DeviceDataType.YX.name().equals(type)){
dataItem.setEventType(element.attribute("YXAlarmType").getValue());
dataItem.setSoeType(element.attribute("SOEType").getValue());
}
List<DataItem> childrens = dm.getChildren();
if(childrens==null){
childrens = Lists.newArrayList();
}
childrens.add(dataItem);
dm.setChildren(childrens);
}
}
return list;
}
}

52
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/RealIdConvertUtils.java

@ -0,0 +1,52 @@
package com.hnac.hzinfo.simulate.util;
import java.math.BigInteger;
public class RealIdConvertUtils {
private void demo() {
BigInteger ss = new BigInteger("16777215");
BigInteger s = new BigInteger("15122982502953650999");
BigInteger stationId = s.shiftRight(24);
System.out.println(stationId.toString());
BigInteger realId = s.and(ss);
System.out.println(realId.toString());
BigInteger xxx = stationId.shiftLeft(24);
BigInteger yyy = xxx.or(realId);
System.out.println(s.toString());
System.out.println(yyy.toString());
}
/**
* 将大id转换成小id
*/
public static String bigId2SmallId(String realId) {
BigInteger bigRealId = new BigInteger(realId);
return bigRealId.and(new BigInteger(DataConstants.REALID_CALCULATE)).toString();
}
/**
* 将小id转换成大id
*/
public static String smallId2BigId(String station, String realId) {
BigInteger stationId = new BigInteger(station);
BigInteger BigRealId = stationId.shiftLeft(24).or(new BigInteger(realId));
return BigRealId.toString();
}
// public static void main(String[] args) {
// System.out.println(RealIdConvertUtils.getStationId("262952509021093892"));
// System.out.println(RealIdConvertUtils.bigId2SmallId("262952509021093892"));
// System.out.println(smallId2BigId("15673190893", "32"));
// }
/**
* 获取站点id
*/
public static String getStationId(String realId) {
BigInteger bigRealId = new BigInteger(realId);
return bigRealId.shiftRight(24).toString();
}
}

18
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/TopicConstant.java

@ -0,0 +1,18 @@
package com.hnac.hzinfo.simulate.util;
public interface TopicConstant {
String TOPIC_DEVICE_MODEL = "topic_device_model";
String TOPIC_HZINFO_PROPS = "topic_hzinfo_props";
String TOPIC_HZINFO_V4_YC = "hzinfo_v4_yc";
String TOPIC_HZINFO_V4_YX = "hzinfo_v4_yx";
String TOPIC_HZINFO_YX = "topic_hzinfo_yx";
String TOPIC_HZINFO_DD = "topic_hzinfo_dd";
String TOPIC_HZINFO_EVENTS = "topic_hzinfo_events";
String TOPIC_HZINFO_EVENTS_ALARM = "topic_hzinfo_events_alarm";
String TOPIC_HZINFO_CONTROL_RETURN = "topic_hzinfo_control_return";
String TOPIC_HZINFO_HEART_BEAT = "topic_hzinfo_heart_beat";
String TOPIC_HZINFO_BROADCAST = "topic_hzinfo_broadcast";
String TOPIC_HZINFO_DATA = "topic_hzinfo_data";
}

16
hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/vo/GenerateFactoryDeviceVo.java

@ -0,0 +1,16 @@
package com.hnac.hzinfo.simulate.vo;
import lombok.Data;
/**
* 生成hz3000场数据
*
* @author ypj
* @date 2025-04-17
*/
@Data
public class GenerateFactoryDeviceVo {
private String deviceId;
private String facDeviceId;
}

13
hzims-service/simulate/src/main/resources/application-dev.yml

@ -0,0 +1,13 @@
#服务器端口
server:
port: 8211
#数据源配置
spring:
datasource:
url: ${blade.datasource.dev.url}
username: ${blade.datasource.dev.username}
password: ${blade.datasource.dev.password}
cloud:
inetutils:
preferred-networks: 192.168.65

6
hzims-service/simulate/src/main/resources/application-prod.yml

@ -0,0 +1,6 @@
#数据源配置
spring:
datasource:
url: ${blade.datasource.prod.url}
username: ${blade.datasource.prod.username}
password: ${blade.datasource.prod.password}

6
hzims-service/simulate/src/main/resources/application-test.yml

@ -0,0 +1,6 @@
#数据源配置
spring:
datasource:
url: ${blade.datasource.test.url}
username: ${blade.datasource.test.username}
password: ${blade.datasource.test.password}

15
hzims-service/simulate/src/main/resources/application.yml

@ -0,0 +1,15 @@
spring:
application:
name: lewa-simulate
#mybatis-plus配置
mybatis-plus:
mapper-locations: classpath:org/springbalde/**/mapper/*Mapper.xml,classpath:com/hnac/hzinfo/**/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: org.springbalde.**.entity,com.hnac.hzinfo.**.entity
#swagger扫描路径配置
swagger:
base-packages:
- org.springbalde
- com.hnac.hzinfo

1
hzims-service/ticket/pom.xml

@ -188,7 +188,6 @@
<dependency> <dependency>
<groupId>com.hikvision.ga</groupId> <groupId>com.hikvision.ga</groupId>
<artifactId>artemis-http-client</artifactId> <artifactId>artemis-http-client</artifactId>
<version>1.1.2</version>
</dependency> </dependency>
<!-- ApacheHttp请求工具 Start --> <!-- ApacheHttp请求工具 Start -->

1
hzims-service/video-image/pom.xml

@ -54,7 +54,6 @@
<dependency> <dependency>
<groupId>com.hikvision.ga</groupId> <groupId>com.hikvision.ga</groupId>
<artifactId>artemis-http-client</artifactId> <artifactId>artemis-http-client</artifactId>
<version>1.1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.hnac.hzinfo.data</groupId> <groupId>com.hnac.hzinfo.data</groupId>

2
hzims-service/weather/src/main/java/com/hnac/hzims/weather/aspect/WeatherCacheAspect.java

@ -64,7 +64,7 @@ public class WeatherCacheAspect {
*/ */
private void saveCacheForHash(String key, String location, Object result,long timeout,TimeUnit unit) { private void saveCacheForHash(String key, String location, Object result,long timeout,TimeUnit unit) {
HeWeatherResponse response = (HeWeatherResponse) result; HeWeatherResponse response = (HeWeatherResponse) result;
if(response.getCode().isOk()) { if(null != response && null != response.getCode() && response.getCode().isOk()) {
redisTemplate.opsForHash().put(key,location,result); redisTemplate.opsForHash().put(key,location,result);
redisTemplate.expire(key,timeout,unit); redisTemplate.expire(key,timeout,unit);
} }

4
hzims-service/weather/src/main/java/com/hnac/hzims/weather/config/StartupRunner.java

@ -17,11 +17,13 @@ public class StartupRunner implements CommandLineRunner {
private String publicId; private String publicId;
@Value("${hzims.weather.private-key}") @Value("${hzims.weather.private-key}")
private String privateKey; private String privateKey;
@Value("${hzims.weather.domain}")
private String domain;
@Override @Override
public void run(String... args) throws Exception { public void run(String... args) throws Exception {
log.info(">>>>>>>>>>>>>>>服务启动执行,执行初始化天气操作<<<<<<<<<<<<<"); log.info(">>>>>>>>>>>>>>>服务启动执行,执行初始化天气操作<<<<<<<<<<<<<");
log.info("publicId:{},privateKey:{}",publicId,privateKey); log.info("publicId:{},privateKey:{}",publicId,privateKey);
HeWeatherInitialize.init(publicId, privateKey); HeWeatherInitialize.init(publicId, privateKey, domain);
} }
} }

51
hzims-service/weather/src/main/java/com/hnac/hzims/weather/schedule/StationWeatherSchedule.java

@ -1,16 +1,13 @@
package com.hnac.hzims.weather.schedule; package com.hnac.hzims.weather.schedule;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.hnac.hzims.hzimsweather.constants.WeatherConstant;
import com.hnac.hzims.hzimsweather.entity.DailyHeWeatherEntity; import com.hnac.hzims.hzimsweather.entity.DailyHeWeatherEntity;
import com.hnac.hzims.hzimsweather.entity.VStationEntity; import com.hnac.hzims.hzimsweather.entity.VStationEntity;
import com.hnac.hzims.hzimsweather.response.weather.Daily; import com.hnac.hzims.hzimsweather.response.weather.Daily;
import com.hnac.hzims.hzimsweather.response.weather.HeWeatherWeatherDailyResponse; import com.hnac.hzims.hzimsweather.response.weather.HeWeatherWeatherDailyResponse;
import com.hnac.hzims.weather.service.HeWeatherHistoricalService;
import com.hnac.hzims.weather.service.HeWeatherWeatherService; import com.hnac.hzims.weather.service.HeWeatherWeatherService;
import com.hnac.hzims.weather.service.IDailyHeWeatherService; import com.hnac.hzims.weather.service.IDailyHeWeatherService;
import com.hnac.hzims.weather.service.IStationService; import com.hnac.hzims.weather.service.IStationService;
@ -19,23 +16,13 @@ import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger; import com.xxl.job.core.log.XxlJobLogger;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.log.logger.BladeLogger;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.CollectionUtil;
import org.springblade.core.tool.utils.ObjectUtil; import org.springblade.core.tool.utils.ObjectUtil;
import org.springblade.core.tool.utils.SpringUtil;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.concurrent.*; import java.util.concurrent.*;
import static com.hnac.hzims.hzimsweather.constants.XxlJobConstant.STATION_DAILY_WEATHER; import static com.hnac.hzims.hzimsweather.constants.XxlJobConstant.*;
import static com.hnac.hzims.hzimsweather.constants.XxlJobConstant.STATION_3D_WEATHER;
import static com.hnac.hzims.hzimsweather.constants.XxlJobConstant.STATION_NOW_WEATHER;
import static com.hnac.hzims.hzimsweather.constants.XxlJobConstant.STATION_7D_WEATHER;
/** /**
* @author hx * @author hx
@ -51,9 +38,10 @@ public class StationWeatherSchedule {
/** /**
* 获取各站点下七日内天气 存入缓存 * 获取各站点下七日内天气 存入缓存
* @Scheduled(cron = "0 10 0/12 * * ?") *
* @return * @return
* @throws InterruptedException * @throws InterruptedException
* @Scheduled(cron = "0 10 0/12 * * ?")
*/ */
@XxlJob(STATION_7D_WEATHER) @XxlJob(STATION_7D_WEATHER)
public ReturnT<String> save7dWeather(String param) throws InterruptedException { public ReturnT<String> save7dWeather(String param) throws InterruptedException {
@ -78,8 +66,7 @@ public class StationWeatherSchedule {
); );
if (ObjectUtil.isNotEmpty(dailyHeWeatherEntity)) { if (ObjectUtil.isNotEmpty(dailyHeWeatherEntity)) {
entity.setId(dailyHeWeatherEntity.getId()); entity.setId(dailyHeWeatherEntity.getId());
} } else {
else {
entity.setStationCode(vStationEntity.getCode()); entity.setStationCode(vStationEntity.getCode());
entity.setDeptId(vStationEntity.getRefDept()); entity.setDeptId(vStationEntity.getRefDept());
entity.setTenantId(vStationEntity.getTenantId()); entity.setTenantId(vStationEntity.getTenantId());
@ -90,12 +77,11 @@ public class StationWeatherSchedule {
} }
dailyHeWeatherService.saveOrUpdateBatch(weatherEntityList); dailyHeWeatherService.saveOrUpdateBatch(weatherEntityList);
} }
} } catch (Exception e) {
catch (Exception e) { log.error("{}获取七日天气失败,位置信息为:{},{}", vStationEntity.getName(), vStationEntity.getLgtd(), vStationEntity.getLttd());
e.printStackTrace(); log.error("获取七日天气失败", e);
XxlJobLogger.log(vStationEntity.getName() + "获取七日天气失败,位置信息为:" + vStationEntity.getLgtd() + "," + vStationEntity.getLttd()); XxlJobLogger.log(vStationEntity.getName() + "获取七日天气失败,位置信息为:" + vStationEntity.getLgtd() + "," + vStationEntity.getLttd());
} } finally {
finally {
downLatch.countDown(); downLatch.countDown();
} }
})); }));
@ -106,6 +92,7 @@ public class StationWeatherSchedule {
/** /**
* 获取各站点下三日内天气 存入缓存 @Scheduled(cron = "0 5 0/1 * * ?") * 获取各站点下三日内天气 存入缓存 @Scheduled(cron = "0 5 0/1 * * ?")
*
* @return * @return
* @throws InterruptedException * @throws InterruptedException
*/ */
@ -119,12 +106,11 @@ public class StationWeatherSchedule {
XxlJobLogger.log(vStationEntity.getName() + "获取三日天气开始,位置信息为:" + vStationEntity.getLgtd() + "," + vStationEntity.getLttd()); XxlJobLogger.log(vStationEntity.getName() + "获取三日天气开始,位置信息为:" + vStationEntity.getLgtd() + "," + vStationEntity.getLttd());
String location = vStationEntity.getLgtd() + "," + vStationEntity.getLttd(); String location = vStationEntity.getLgtd() + "," + vStationEntity.getLttd();
weatherService.getWeather3d(location); weatherService.getWeather3d(location);
} } catch (Exception e) {
catch (Exception e) { log.error("{}获取三日天气失败,位置信息为:{},{}", vStationEntity.getName(), vStationEntity.getLgtd(), vStationEntity.getLttd());
e.printStackTrace(); log.error("获取三日天气失败", e);
XxlJobLogger.log(vStationEntity.getName() + "获取三日天气失败,位置信息为:" + vStationEntity.getLgtd() + "," + vStationEntity.getLttd()); XxlJobLogger.log(vStationEntity.getName() + "获取三日天气失败,位置信息为:" + vStationEntity.getLgtd() + "," + vStationEntity.getLttd());
} } finally {
finally {
downLatch.countDown(); downLatch.countDown();
} }
})); }));
@ -135,6 +121,7 @@ public class StationWeatherSchedule {
/** /**
* 获取各站点下实况天气 存入缓存 @Scheduled(cron = "0 0 0/1 * * ?") * 获取各站点下实况天气 存入缓存 @Scheduled(cron = "0 0 0/1 * * ?")
*
* @return * @return
* @throws InterruptedException * @throws InterruptedException
*/ */
@ -148,12 +135,10 @@ public class StationWeatherSchedule {
XxlJobLogger.log(vStationEntity.getName() + "获取实时天气开始,位置信息为:" + vStationEntity.getLgtd() + "," + vStationEntity.getLttd()); XxlJobLogger.log(vStationEntity.getName() + "获取实时天气开始,位置信息为:" + vStationEntity.getLgtd() + "," + vStationEntity.getLttd());
String location = vStationEntity.getLgtd() + "," + vStationEntity.getLttd(); String location = vStationEntity.getLgtd() + "," + vStationEntity.getLttd();
weatherService.getWeatherNow(location); weatherService.getWeatherNow(location);
} } catch (Exception e) {
catch(Exception e) { log.error("获取实时天气失败", e);
e.printStackTrace();
XxlJobLogger.log(vStationEntity.getName() + "获取实时天气失败,位置信息为:" + vStationEntity.getLgtd() + "," + vStationEntity.getLttd()); XxlJobLogger.log(vStationEntity.getName() + "获取实时天气失败,位置信息为:" + vStationEntity.getLgtd() + "," + vStationEntity.getLttd());
} } finally {
finally {
downLatch.countDown(); downLatch.countDown();
} }
})); }));

2
pom.xml

@ -161,7 +161,7 @@
<dependency> <dependency>
<groupId>com.hikvision.ga</groupId> <groupId>com.hikvision.ga</groupId>
<artifactId>artemis-http-client</artifactId> <artifactId>artemis-http-client</artifactId>
<version>1.1.2</version> <version>1.1.3</version>
</dependency> </dependency>
<dependency> <dependency>

Loading…
Cancel
Save