diff --git a/hzims-service/pom.xml b/hzims-service/pom.xml index 7e7bf6b..a756829 100644 --- a/hzims-service/pom.xml +++ b/hzims-service/pom.xml @@ -34,6 +34,7 @@ water-quality water-rain message-alarm-service + simulate diff --git a/hzims-service/simulate/pom.xml b/hzims-service/simulate/pom.xml new file mode 100644 index 0000000..8d14799 --- /dev/null +++ b/hzims-service/simulate/pom.xml @@ -0,0 +1,110 @@ + + + 4.0.0 + + hzims-service + com.hnac.hzims + 4.0.0-SNAPSHOT + + + hzims-simulate + + + 8 + 8 + UTF-8 + + + + + + com.xuxueli + xxl-job-core + + + org.springblade + blade-common + + + org.springblade + blade-core-boot + + + org.springblade + blade-core-cloud + + + + + org.springblade + blade-starter-http + + + org.springblade + blade-core-cloud + compile + + + + org.springblade + blade-starter-datascope + compile + + + org.projectlombok + lombok + + + + com.hzinfo.framework + hnac-framework-mqtt-starters + ${bladex.project.version} + + + com.hnac.hzinfo.data + hzinfo-data-sdk + ${hzinfo.data.sdk.version} + + + + dom4j + dom4j + 1.6.1 + compile + + + + + + + + + src/main/java + + **/*.xml + + false + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.6.6 + + + + repackage + + + + + + + + + + + \ No newline at end of file diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/HzimsSimulateApplication.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/HzimsSimulateApplication.java new file mode 100644 index 0000000..c113910 --- /dev/null +++ b/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); + } +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/constants/WriteRealDataConstant.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/constants/WriteRealDataConstant.java new file mode 100644 index 0000000..70609a5 --- /dev/null +++ b/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"; +} \ No newline at end of file diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/controller/GageController.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/controller/GageController.java new file mode 100644 index 0000000..bea4c87 --- /dev/null +++ b/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 weather(@RequestParam("deviceCode") String deviceCode, + @RequestParam("isOpen") Long isOpen){ + return R.data(writeRealDataService.isOpen(deviceCode,isOpen)); + } +} \ No newline at end of file diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/controller/SimulationDataController.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/controller/SimulationDataController.java new file mode 100644 index 0000000..84587c9 --- /dev/null +++ b/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 cacheMap = Maps.newHashMap(); + + @ApiOperation(value = "解析v3.0场信息文件", notes = "解析场信息文件") + @GetMapping("/readFac") + public R readFac() { + InputStream inputStream = null; + try { + inputStream = new FileInputStream(new File(facPath + File.separator + "factory.fac")); + List 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> pageGap(String stationId, Query query) { + List list = simulationService.getDeviceListByStationId(stationId); + List ids = list.stream().map(Device::getId).collect(Collectors.toList()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper(); + lambdaQueryWrapper.in(DeviceFieldGap::getFacDeviceId, ids); + IPage 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 list = deviceFieldService.list(); + List 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 list = deviceFieldService.queryNewInsert(); + if (list != null && !list.isEmpty()) { + List 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 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 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 stopStart() { + simulationService.stopStart(); + return R.status(true); + + } + +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DataItem.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DataItem.java new file mode 100644 index 0000000..6e7dae9 --- /dev/null +++ b/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; +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DataModel.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DataModel.java new file mode 100644 index 0000000..242b7e6 --- /dev/null +++ b/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 children; +} + diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/Device.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/Device.java new file mode 100644 index 0000000..5ad0180 --- /dev/null +++ b/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; + +} \ No newline at end of file diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceData.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceData.java new file mode 100644 index 0000000..7feb19c --- /dev/null +++ b/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 children = Lists.newArrayList(); +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceDataV4.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceDataV4.java new file mode 100644 index 0000000..5290b08 --- /dev/null +++ b/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 children = Lists.newArrayList(); +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceFacConfig.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceFacConfig.java new file mode 100644 index 0000000..e4cc475 --- /dev/null +++ b/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; +} \ No newline at end of file diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceField.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceField.java new file mode 100644 index 0000000..1acea7c --- /dev/null +++ b/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; + + +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceFieldGap.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceFieldGap.java new file mode 100644 index 0000000..162cd4d --- /dev/null +++ b/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; +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceRainGap.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/DeviceRainGap.java new file mode 100644 index 0000000..d94d424 --- /dev/null +++ b/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; +} \ No newline at end of file diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/Kvtq.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/Kvtq.java new file mode 100644 index 0000000..9349643 --- /dev/null +++ b/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; +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/KvtqV4.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/entity/KvtqV4.java new file mode 100644 index 0000000..2099079 --- /dev/null +++ b/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; +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/enums/ExceptionEnum.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/enums/ExceptionEnum.java new file mode 100644 index 0000000..dfa84d0 --- /dev/null +++ b/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; +} \ No newline at end of file diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFacConfigMapper.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFacConfigMapper.java new file mode 100644 index 0000000..8bbea7b --- /dev/null +++ b/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 { + + List queryConfigDevice(@Param("method") String method); + + DeviceFacConfig configByDeviceCode(@Param("deviceCode") String deviceCode); +} \ No newline at end of file diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFacConfigMapper.xml b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFacConfigMapper.xml new file mode 100644 index 0000000..4e5a488 --- /dev/null +++ b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFacConfigMapper.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldGapMapper.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldGapMapper.java new file mode 100644 index 0000000..68d1ae3 --- /dev/null +++ b/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 { + List queryDeviceLimits(@Param("signages") List signages); + + void updateLimitById(@Param("maxValue") BigDecimal maxValue, @Param("minValue") BigDecimal minValue,@Param("id") String id); +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldGapMapper.xml b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldGapMapper.xml new file mode 100644 index 0000000..df40658 --- /dev/null +++ b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldGapMapper.xml @@ -0,0 +1,18 @@ + + + + + + + UPDATE hzinfo_fac_device_attr_gap + SET max_val = #{maxValue}, + min_val = #{minValue} + WHERE id = #{id} + + diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldMapper.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldMapper.java new file mode 100644 index 0000000..533bbdc --- /dev/null +++ b/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 { + int existGapTable(); + int createGapTable(); + List queryNewInsert(); + + List queryDeviceFields(@Param("devices") List devices); + + List querySignages(@Param("facDeviceId") String facDeviceId); +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldMapper.xml b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldMapper.xml new file mode 100644 index 0000000..cf27ff8 --- /dev/null +++ b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceFieldMapper.xml @@ -0,0 +1,34 @@ + + + + + + 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='设备字段' + + + + + + + diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceMapper.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceMapper.java new file mode 100644 index 0000000..5b29dac --- /dev/null +++ b/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 { + String getSid(@Param("stationId") String stationId); + + List selectStcd(); + + int insertData(@Param("param") Map param); +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceMapper.xml b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceMapper.xml new file mode 100644 index 0000000..ccb74c5 --- /dev/null +++ b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + insert into blade_ris.reservoir_data(STCD,DT,INFLOW) values (#{param.stcd},#{param.dt},#{param.inflow}) + + diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceRainGapMapper.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceRainGapMapper.java new file mode 100644 index 0000000..08d5ade --- /dev/null +++ b/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 { + + List RainGapByFacDeviceId(@Param("facDeviceId") String facDeviceId); +} \ No newline at end of file diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceRainGapMapper.xml b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceRainGapMapper.xml new file mode 100644 index 0000000..4d096bc --- /dev/null +++ b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/mapper/DeviceRainGapMapper.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/scheduled/SimulateJob.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/scheduled/SimulateJob.java new file mode 100644 index 0000000..53e178c --- /dev/null +++ b/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 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 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 simulationMultipleInFlow(String param) { + simulateService.simulationMultipleInFlow(); + return ReturnT.SUCCESS; + } + + @XxlJob("simulationStandard") + @XxlRegister(cron = "0 0/1 * * * ?", jobDesc = "模拟标准设备 传入stationId") + public ReturnT 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 syncOneGap(String param) { + //存在表 + int count = deviceFieldService.existGapTable(); + if (count <= 0) {//建表 + deviceFieldService.createGapTable(); + } + //同步 + List list = deviceFieldService.list(); + List 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 syncTwoGap(String param) { + //同步 + List list = deviceFieldService.queryNewInsert(); + if (list != null && !list.isEmpty()) { + List 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; + } +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/scheduled/WriteRealDataTask.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/scheduled/WriteRealDataTask.java new file mode 100644 index 0000000..289c35e --- /dev/null +++ b/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 writeRealGateData(String param) { + if (Func.isBlank(param)) { + param = DateUtil.format(new Date(), "yyyy-MM"); + } + writeRealDataService.writeRealGateData(param); + return new ReturnT<>("SUCCESS"); + } + +} \ No newline at end of file diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/DeviceFieldGapService.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/DeviceFieldGapService.java new file mode 100644 index 0000000..66ab48f --- /dev/null +++ b/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 { + +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/DeviceFieldService.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/DeviceFieldService.java new file mode 100644 index 0000000..a5c02bb --- /dev/null +++ b/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 { + + public int existGapTable(){ + return this.baseMapper.existGapTable(); + } + + public int createGapTable(){ + return this.baseMapper.createGapTable(); + } + + public List queryNewInsert(){ + return this.baseMapper.queryNewInsert(); + } +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/DeviceService.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/DeviceService.java new file mode 100644 index 0000000..cfed611 --- /dev/null +++ b/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 { + public String getSid(String stationId) { + return this.baseMapper.getSid(stationId); + } + + public List selectStcd() { + return this.baseMapper.selectStcd(); + } + + public int insertData(Map param) { + return this.baseMapper.insertData(param); + } +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/ISimulateService.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/ISimulateService.java new file mode 100644 index 0000000..d86d622 --- /dev/null +++ b/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); +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/SimulationService.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/SimulationService.java new file mode 100644 index 0000000..fddb24f --- /dev/null +++ b/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 getDeviceListByStationId(String projectId){ + LambdaQueryWrapper lambdaQueryWrapper=new LambdaQueryWrapper(); + lambdaQueryWrapper.eq(Device::getProjectId,projectId); + List 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 list = getDeviceListByStationId(stationId); + //查询所有属性 + List fieldList = deviceFieldService.list(); + List gapList = deviceFieldGapService.list(); + + log.info("本站{}有{}个设备实例,每{}毫秒发送{}条数据", stationId, list.size(), sleepTime, list.size()); + while (true) { + if (flag) {//启动或关闭模拟 + for (Device device : list) { + Map 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 list=deviceService.selectStcd(); +// while (true) { +// List> datas = simulationFlow(list); +// for(Map param:datas){ +// deviceService.insertData(param); +// } +// ThreadUtil.sleep(3600000); +// } +// } + + private List> simulationFlow(List list){ + List> datas =new ArrayList<>(); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dt=sdf.format(new Date()); + for(String stcd:list){ + Map 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 list = getDeviceListByStationId(stationId); + //查询所有属性 + List fieldList = deviceFieldService.list(); + List gapList = deviceFieldGapService.list(); + + log.info("本站{}有{}个设备实例,每{}毫秒发送{}条数据", stationId, list.size(), sleepTime, list.size()); + while (true) { + if (flag) {//启动或关闭模拟 + for (Device device : list) { + Map 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 simulation(String stationId, Device device,List fieldListAll,List gapListAll) { +// List fieldList = getListByDeviceId(device.getId()); +// List gapList = getListByDeviceGapId(device.getId()); + List fieldList =fieldListAll.stream().filter(e->e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList()); + List 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 ycList = Lists.newArrayList(); + List yxList = Lists.newArrayList(); + //List ddList = Lists.newArrayList(); + for (DeviceField field : fieldList) { + Optional 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 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 simulationV4(String stationId,String sid, Device device,List fieldListAll,List gapListAll) { + +// List fieldList = getListByDeviceId(device.getId()); +// List gapList = getListByDeviceGapId(device.getId()); + List fieldList =fieldListAll.stream().filter(e->e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList()); + List 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 ycList = Lists.newArrayList(); + List yxList = Lists.newArrayList(); + //List ddList = Lists.newArrayList(); + for (DeviceField field : fieldList) { + Optional 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 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 getListByDeviceId(String deviceId) { + return deviceFieldService.list(Wrappers.lambdaQuery().ne(DeviceField::getModelClassifyId, DataConstants.DeviceDataType.SOE.name()).eq(DeviceField::getFacDeviceId, deviceId)); + } + + private List getListByDeviceGapId(String deviceId){ + return deviceFieldGapService.list(Wrappers.lambdaQuery().eq(DeviceFieldGap::getFacDeviceId, deviceId)); + } + +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/WriteRealDataService.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/WriteRealDataService.java new file mode 100644 index 0000000..f9eb798 --- /dev/null +++ b/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); +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/impl/SimulateServiceImpl.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/impl/SimulateServiceImpl.java new file mode 100644 index 0000000..a861b80 --- /dev/null +++ b/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> r = deviceClient.getStandardOnlineDeviceInstance(projectId); + List vos = r.getData(); + if (vos == null || vos.isEmpty()) { + return; + } + for (DeviceInstanceVO vo : vos) { + String deviceCode = vo.getCode(); + R> listR = deviceClient.getOnlineAttr(deviceCode); + List attrVOS = listR.getData(); + Map 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 list = deviceService.selectStcd(); + while (true) { + List> datas = simulationFlow(list); + for (Map 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> simulationFlow(List list) { + List> datas = new ArrayList<>(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dt = sdf.format(new Date()); + for (String stcd : list) { + Map 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 list = getDeviceListByStationId(stationId); + //查询所有属性 + List fieldList = deviceFieldService.list(); + List gapList = deviceFieldGapService.list(); + + log.info("本站{}有{}个设备实例,发送{}条数据", stationId, list.size(), list.size()); + + for (Device device : list) { + Map 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 simulationV3(String stationId, Device device, List fieldListAll, List gapListAll) { + List fieldList = fieldListAll.stream().filter(e -> e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList()); + List gapList = gapListAll.stream().filter(e -> e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList()); + List ycList = Lists.newArrayList(); + List yxList = Lists.newArrayList(); + for (DeviceField field : fieldList) { + Optional 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 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 getDeviceListByStationId(String projectId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Device::getProjectId, projectId); + List list = deviceService.list(wrapper); + return list; + } + + @Override + @Async + public void simulationMultipleV4(String[] stationIds) { + for (String stationId : stationIds) { + String sid = getSid(stationId); + List list = getDeviceListByStationId(stationId); + //查询所有属性 + List fieldList = deviceFieldService.list(); + List gapList = deviceFieldGapService.list(); + + log.info("本站{}有{}个设备实例,发送{}条数据", stationId, list.size(), list.size()); + + for (Device device : list) { + Map 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 simulationV4(String stationId, String sid, Device device, List fieldListAll, List gapListAll) { + List fieldList = fieldListAll.stream().filter(e -> e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList()); + List gapList = gapListAll.stream().filter(e -> e.getFacDeviceId().equals(device.getId())).collect(Collectors.toList()); + List ycList = Lists.newArrayList(); + List yxList = Lists.newArrayList(); + for (DeviceField field : fieldList) { + Optional 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 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; + } + +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/impl/WriteRealDataServiceImpl.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/service/impl/WriteRealDataServiceImpl.java new file mode 100644 index 0000000..11786bf --- /dev/null +++ b/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 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 fields = fieldMapper.queryDeviceFields(groups.stream().map(DeviceFacConfig::getFacDeviceId).collect(Collectors.toList())); + if (CollectionUtil.isEmpty(fields)) { + return; + } + // 查询设备限制 + List 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 ycs = value.stream().filter(o -> DataConstants.DeviceDataType.YC.ordinal() == o.getModelClassifyId()).map(field -> { + List 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 yxs = value.stream().filter(o -> DataConstants.DeviceDataType.YX.ordinal() == o.getModelClassifyId()).map(field -> { + List 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 ycs = value.stream().filter(o -> DataConstants.DeviceDataType.YC.ordinal() == o.getModelClassifyId()).map(field -> { + List limit = limits.stream().filter(e -> e.getSignage().equals(field.getSignage())).collect(Collectors.toList()); + if (CollectionUtil.isEmpty(limit)) { + return new KvtqV4(); + } + // 查找sid + Optional 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 yxs = value.stream().filter(o -> DataConstants.DeviceDataType.YX.ordinal() == o.getModelClassifyId()).map(field -> { + List limit = limits.stream().filter(e -> e.getSignage().equals(field.getSignage())).collect(Collectors.toList()); + if (CollectionUtil.isEmpty(limit)) { + return new KvtqV4(); + } + // 查找sid + Optional 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 fields = fieldMapper.querySignages(config.getFacDeviceId()); + if (CollectionUtil.isEmpty(fields)) { + return false; + } + // 查询属性限制 + List limits = limitMapper.queryDeviceLimits(fields.stream().map(DeviceField::getSignage).collect(Collectors.toList())); + if (CollectionUtil.isEmpty(limits)) { + return false; + } + limits.forEach(limit -> { + Optional 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; + } +} \ No newline at end of file diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/DataConstants.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/DataConstants.java new file mode 100644 index 0000000..8d66c23 --- /dev/null +++ b/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() { + } + } + +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/ParseFacUtils.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/ParseFacUtils.java new file mode 100644 index 0000000..3850450 --- /dev/null +++ b/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 parsePoint(InputStream inputStream) throws SAXException, DocumentException, JsonProcessingException { + SAXReader saxReader = new SAXReader(); + Document document = saxReader.read(inputStream); + List groupElements = document.selectNodes("/Factorys/Factory/Group"); + List 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 parseDataGroup(List elements){ + List list = Lists.newArrayList(); + for (Element element : (List) 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 pastePointElement(List elements, String type, List list) throws JsonProcessingException { + for (Element element : (List) 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 childrens = dm.getChildren(); + if(childrens==null){ + childrens = Lists.newArrayList(); + } + childrens.add(dataItem); + dm.setChildren(childrens); + } + } + return list; + } +} + diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/RealIdConvertUtils.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/RealIdConvertUtils.java new file mode 100644 index 0000000..3d43fc3 --- /dev/null +++ b/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(); + } +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/TopicConstant.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/util/TopicConstant.java new file mode 100644 index 0000000..0ee0825 --- /dev/null +++ b/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"; +} diff --git a/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/vo/GenerateFactoryDeviceVo.java b/hzims-service/simulate/src/main/java/com/hnac/hzinfo/simulate/vo/GenerateFactoryDeviceVo.java new file mode 100644 index 0000000..4bc3f0a --- /dev/null +++ b/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; +} diff --git a/hzims-service/simulate/src/main/resources/application-dev.yml b/hzims-service/simulate/src/main/resources/application-dev.yml new file mode 100644 index 0000000..0abb9d3 --- /dev/null +++ b/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 diff --git a/hzims-service/simulate/src/main/resources/application-prod.yml b/hzims-service/simulate/src/main/resources/application-prod.yml new file mode 100644 index 0000000..a96da50 --- /dev/null +++ b/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} \ No newline at end of file diff --git a/hzims-service/simulate/src/main/resources/application-test.yml b/hzims-service/simulate/src/main/resources/application-test.yml new file mode 100644 index 0000000..ac352b6 --- /dev/null +++ b/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} \ No newline at end of file diff --git a/hzims-service/simulate/src/main/resources/application.yml b/hzims-service/simulate/src/main/resources/application.yml new file mode 100644 index 0000000..61e8ff7 --- /dev/null +++ b/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 \ No newline at end of file