获取便携式设备基础数据功能

This commit is contained in:
xy
2024-09-25 19:24:21 +08:00
parent dfd035b908
commit 45d31a05ee
12 changed files with 215 additions and 111 deletions

View File

@@ -82,6 +82,79 @@ public class EventDto {
@SerializedName("Parm")
private List<Param> param;
@SerializedName("PrjName")
@ApiModelProperty("工程名称")
private String prjName;
@SerializedName("PrjTimeStart")
@ApiModelProperty("装置启动时间")
private Long prjTimeStart;
@SerializedName("PrjTimeEnd")
@ApiModelProperty("装置结束时间")
private Long prjTimeEnd;
@SerializedName("PrjDataPath")
@ApiModelProperty("装置数据路径")
private String prjDataPath;
@SerializedName("DevType")
@ApiModelProperty("装置型号")
private String devType;
@SerializedName("DevMac")
@ApiModelProperty("装置mac地址")
private String devMac;
@SerializedName("AppVersion")
@ApiModelProperty("装置程序版本")
private String appVersion;
@SerializedName("Cldid")
@ApiModelProperty("逻辑子设备id")
private Integer clDid;
@SerializedName("StatCycle")
@ApiModelProperty("统计间隔")
private Integer statCycle;
@SerializedName("VolGrade")
@ApiModelProperty("电压等级")
private Float volGrade;
@SerializedName("VolConType")
@ApiModelProperty("电压接线方式0-星型, 1-角型, 2-V型")
private Integer volConType;
@SerializedName("CurConSel")
@ApiModelProperty("电流接线方式0-正常, 1-合成IB, 2-合成IC")
private Integer curConSel;
@SerializedName("PtRatio")
@ApiModelProperty("PT变比")
private Integer ptRatio;
@SerializedName("CtRatio")
@ApiModelProperty("ct变比")
private Integer ctRatio;
@SerializedName("CapacitySscb")
@ApiModelProperty("基准短路容量")
private Float capacitySscb;
@SerializedName("CapacitySscmin")
@ApiModelProperty("最小短路容量")
private Float capacitySscmin;
@SerializedName("CapacitySt")
@ApiModelProperty("供电设备容量")
private Float capacitySt;
@SerializedName("CapacitySi")
@ApiModelProperty("用户协议容量")
private Float capacitySi;
}
@Data

View File

@@ -105,6 +105,16 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
executeMainTask(scheduler,nDid,version);
}
//自动接入
else if (expiredKey.startsWith("autoAccess")) {
List<CsEquipmentDeliveryPO> list = csEquipmentDeliveryService.getAll();
list.forEach(item->{
String version = csTopicService.getVersion(item.getNdid());
if (!Objects.isNull(version)){
csDeviceService.devAccessAskTemplate(item.getNdid(),version,1);
}
});
}
}
//主任务

View File

@@ -1,17 +1,12 @@
package com.njcn.access.runner;
import com.njcn.access.service.ICsEquipmentDeliveryService;
import com.njcn.access.service.ICsTopicService;
import com.njcn.access.service.impl.CsDeviceServiceImpl;
import com.njcn.csdevice.pojo.po.CsEquipmentDeliveryPO;
import com.njcn.redis.utils.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
/**
* 类的介绍:用来重新发起设备的接入,存在程序意外停止了,缓存失效导致无法更新装置的状态,所以需要在程序启动时发起设备的接入
@@ -25,21 +20,11 @@ import java.util.Objects;
public class AccessApplicationRunner implements ApplicationRunner {
@Resource
private CsDeviceServiceImpl csDeviceService;
@Resource
private ICsTopicService csTopicService;
@Resource
private ICsEquipmentDeliveryService csEquipmentDeliveryService;
private RedisUtil redisUtil;
@Override
public void run(ApplicationArguments args) {
List<CsEquipmentDeliveryPO> list = csEquipmentDeliveryService.getAll();
list.forEach(item->{
String version = csTopicService.getVersion(item.getNdid());
if (!Objects.isNull(version)){
csDeviceService.devAccessAskTemplate(item.getNdid(),version,1);
}
});
redisUtil.saveByKeyWithExpire("autoAccess",null,60L);
}
}

View File

@@ -42,6 +42,7 @@ import com.njcn.system.pojo.vo.DictTreeVO;
import com.njcn.web.utils.RequestUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@@ -64,49 +65,26 @@ import java.util.stream.Collectors;
public class CsDevModelServiceImpl implements ICsDevModelService {
private final FileStorageUtil fileStorageUtil;
private final DevModelFeignClient devModelFeignClient;
private final EpdFeignClient epdFeignClient;
private final DicDataFeignClient dicDataFeignClient;
private final EleEvtFeignClient eleEvtFeignClient;
private final ICsDataSetService csDataSetService;
private final ICsDataArrayService csDataArrayService;
private final CsDevModelMapper csDevModelMapper;
private final ICsLineModelService csLineModelService;
private final ICsGroupService csGroupService;
private final ICsGroArrService csGroArrService;
private final CsLogsFeignClient csLogsFeignClient;
private final EleWaveFeignClient waveFeignClient;
private final DictTreeFeignClient dictTreeFeignClient;
private final MqttPublisher publisher;
private final ICsTopicService csTopicService;
private final ICsEquipmentDeliveryService csEquipmentDeliveryService;
private final RedisUtil redisUtil;
private final MqttMessageHandler mqttMessageHandler;
@Override
public void refreshDevModelCache() {
}
@Override

View File

@@ -1,21 +0,0 @@
//package com.njcn.stat.api;
//
//import com.njcn.common.pojo.constant.ServerInfo;
//import com.njcn.common.pojo.response.HttpResult;
//import com.njcn.mq.message.AppAutoDataMessage;
//import com.njcn.stat.api.fallback.WlRecordClientFallbackFactory;
//import org.springframework.cloud.openfeign.FeignClient;
//import org.springframework.validation.annotation.Validated;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestBody;
//
///**
// * @author xy
// */
//@FeignClient(value = ServerInfo.CS_STAT_BOOT, path = "/record", fallbackFactory = WlRecordClientFallbackFactory.class,contextId = "record")
//public interface WlRecordFeignClient {
//
// @PostMapping("/addOrUpdateBaseData")
// HttpResult<String> addOrUpdateBaseData(@RequestBody @Validated AppAutoDataMessage appAutoDataMessage);
//
//}

View File

@@ -1,35 +0,0 @@
//package com.njcn.stat.api.fallback;
//
//import com.njcn.common.pojo.enums.response.CommonResponseEnum;
//import com.njcn.common.pojo.exception.BusinessException;
//import com.njcn.common.pojo.response.HttpResult;
//import com.njcn.mq.message.AppAutoDataMessage;
//import com.njcn.stat.api.WlRecordFeignClient;
//import feign.hystrix.FallbackFactory;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//
///**
// * @author xy
// */
//@Slf4j
//@Component
//public class WlRecordClientFallbackFactory implements FallbackFactory<WlRecordFeignClient> {
// @Override
// public WlRecordFeignClient create(Throwable cause) {
// //判断抛出异常是否为解码器抛出的业务异常
// Enum<?> exceptionEnum = CommonResponseEnum.SERVICE_FALLBACK;
// if (cause.getCause() instanceof BusinessException) {
// BusinessException businessException = (BusinessException) cause.getCause();
// }
// Enum<?> finalExceptionEnum = exceptionEnum;
// return new WlRecordFeignClient() {
//
// @Override
// public HttpResult<String> addOrUpdateBaseData(AppAutoDataMessage appAutoDataMessage) {
// log.error("{}异常,降级处理,异常为:{}","新增或更新装置基础数据",cause.toString());
// throw new BusinessException(finalExceptionEnum);
// }
// };
// }
//}

View File

@@ -6,6 +6,7 @@ import com.njcn.mq.message.AppEventMessage;
import com.njcn.zlevent.api.fallback.EventClientFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* @author xy
@@ -16,7 +17,7 @@ public interface EventFeignClient {
@PostMapping("/analysis")
HttpResult<String> analysis(AppEventMessage appEventMessage);
@PostMapping("/errorEvent")
HttpResult<String> insertErrorEvent(AppEventMessage appEventMessage);
@PostMapping("/portableData")
HttpResult<String> getPortableData(@RequestBody AppEventMessage appEventMessage);
}

View File

@@ -32,10 +32,11 @@ public class EventClientFallbackFactory implements FallbackFactory<EventFeignCli
}
@Override
public HttpResult<String> insertErrorEvent(AppEventMessage appEventMessage) {
log.error("{}异常,降级处理,异常为:{}","异常事件统计",cause.toString());
public HttpResult<String> getPortableData(AppEventMessage appEventMessage) {
log.error("{}异常,降级处理,异常为:{}","便携式设备数据记录动作",cause.toString());
throw new BusinessException(finalExceptionEnum);
}
};
}
}

View File

@@ -28,7 +28,7 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/event")
@Api(tags = "暂态事件处理")
@Api(tags = "事件处理")
@AllArgsConstructor
public class EventController extends BaseController {
@@ -44,4 +44,14 @@ public class EventController extends BaseController {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/portableData")
@ApiOperation("便携式数据事件")
@ApiImplicitParam(name = "appEventMessage", value = "数据实体", required = true)
public HttpResult<String> getPortableData(@RequestBody AppEventMessage appEventMessage){
String methodDescribe = getMethodDescribe("getPortableData");
eventService.getPortableData(appEventMessage);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
}

View File

@@ -17,4 +17,12 @@ public interface IEventService {
*/
void analysis(AppEventMessage appEventMessage);
/**
* 便携式设备基础数据
* 1.装置发起数据记录开始动作,库中新增数据;
* 2.装置发起数据记录结束动作,库中更新数据;
* @param appEventMessage
*/
void getPortableData(AppEventMessage appEventMessage);
}

View File

@@ -6,8 +6,12 @@ import com.alibaba.nacos.shaded.com.google.gson.Gson;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.csdevice.api.CsLineFeignClient;
import com.njcn.csdevice.api.EquipmentFeignClient;
import com.njcn.csdevice.api.WlRecordFeignClient;
import com.njcn.csdevice.pojo.param.WlRecordParam;
import com.njcn.csdevice.pojo.po.CsEquipmentDeliveryPO;
import com.njcn.csdevice.pojo.po.CsLinePO;
import com.njcn.csdevice.pojo.po.WlRecord;
import com.njcn.csdevice.pojo.vo.CsEquipmentDeliveryVO;
import com.njcn.csharmonic.pojo.po.CsEventPO;
import com.njcn.influx.pojo.constant.InfluxDBTableConstant;
import com.njcn.influx.utils.InfluxDbUtils;
@@ -31,11 +35,15 @@ import lombok.extern.slf4j.Slf4j;
import org.influxdb.InfluxDB;
import org.influxdb.dto.BatchPoints;
import org.influxdb.dto.Point;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
@@ -53,22 +61,15 @@ import java.util.concurrent.TimeUnit;
public class EventServiceImpl implements IEventService {
private final CsLineFeignClient csLineFeignClient;
private final DicDataFeignClient dicDataFeignClient;
private final EpdFeignClient epdFeignClient;
private final RedisUtil redisUtil;
private final ICsEventService csEventService;
private final EquipmentFeignClient equipmentFeignClient;
private final InfluxDbUtils influxDbUtils;
private final ICsEventLogsService csEventLogsService;
private final SendEventUtils sendEventUtils;
private final WlRecordFeignClient wlRecordFeignClient;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -188,6 +189,93 @@ public class EventServiceImpl implements IEventService {
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void getPortableData(AppEventMessage appEventMessage) {
CsEquipmentDeliveryVO vo = equipmentFeignClient.queryEquipmentByndid(appEventMessage.getId()).getData();
//根据报文判断是新增还是更新
List<AppEventMessage.DataArray> dataArrays = appEventMessage.getMsg().getDataArray();
dataArrays.forEach(item->{
WlRecordParam.Record param = new WlRecordParam.Record();
param.setDevId(vo.getId());
param.setLineId(appEventMessage.getId() + item.getClDid().toString());
param.setProName(item.getPrjName());
param.setProStartTime(timestampToDatetime((item.getPrjTimeStart() - 8*3600)));
WlRecord record = wlRecordFeignClient.findDevBaseData(param).getData();
if (!Objects.isNull(record)) {
if (!Objects.equals(item.getPrjTimeEnd(),-1L)) {
WlRecordParam.UpdateRecord wlRecord = new WlRecordParam.UpdateRecord();
wlRecord.setId(record.getId());
wlRecord.setProEndTime(timestampToDatetime((item.getPrjTimeEnd() - 8*3600)));
wlRecordFeignClient.updateTestRecord(wlRecord);
}
} else {
//新项目入库
WlRecord wlRecord = new WlRecord();
wlRecord.setId(IdUtil.simpleUUID());
wlRecord.setItemName("基础数据");
wlRecord.setGcName(item.getPrjName());
wlRecord.setDevId(vo.getId());
wlRecord.setLineId(appEventMessage.getId() + item.getClDid().toString());
wlRecord.setStatisticalInterval(item.getStatCycle());
wlRecord.setPt(item.getPtRatio());
wlRecord.setCt(item.getCtRatio());
//电压等级
DictData dictData = dicDataFeignClient.getDicDataByCodeAndType(channelVol(item.getVolGrade()) + "kV","Dev_Voltage_Stand").getData();
wlRecord.setVoltageLevel(Objects.isNull(dictData)?null:dictData.getId());
wlRecord.setCapacitySscb(item.getCapacitySscb());
wlRecord.setCapacitySscmin(item.getCapacitySscmin());
wlRecord.setCapacitySt(item.getCapacitySt());
wlRecord.setCapacitySi(item.getCapacitySi());
//电压接线方式
wlRecord.setVolConType(getVolConType(item.getVolConType()));
//fixme 电流接线方式 这边系统没有字典,录入字典通用性不强,采用装置上送值存储
wlRecord.setCurConSel(item.getCurConSel().toString());
wlRecord.setStartTime(timestampToDatetime((item.getPrjTimeStart() - 8*3600)));
wlRecord.setType(1);
wlRecord.setState(1);
wlRecord.setGcDataPath(item.getPrjDataPath());
wlRecordFeignClient.addBaseData(wlRecord);
}
});
}
/**
* 处理电压
* @param vol
* @return
*/
public String channelVol(Float vol) {
BigDecimal value = new BigDecimal(vol);
BigDecimal noZeros = value.stripTrailingZeros();
return noZeros.toPlainString();
}
// 0-星型, 1-角型, 2-V型
// star-星型、Star_Triangle-星三角、Open_Delta-开口三角
public String getVolConType(Integer volConType) {
String result = null;
String dictDataCode = null;
switch (volConType) {
case 0:
dictDataCode = "star";
break;
case 1:
dictDataCode = "Star_Triangle";
break;
case 2:
dictDataCode = "Open_Delta";
break;
default:
break;
}
if (!Objects.isNull(dictDataCode)) {
DictData dictData = dicDataFeignClient.getDicDataByCodeAndType(dictDataCode,"Dev_Connect").getData();
result = dictData.getId();
}
return Objects.isNull(result)?null:result;
}
/**
* 缓存监测点相关信息
*/
@@ -248,4 +336,9 @@ public class EventServiceImpl implements IEventService {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
return LocalDateTime.parse(time, fmt);
}
public LocalDateTime timestampToDatetime(long timestamp){
Instant instant = Instant.ofEpochSecond(timestamp);
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
}
}

View File

@@ -70,6 +70,7 @@ public class AppEventConsumer extends EnhanceConsumerMessageHandler<AppEventMess
break;
case 32:
log.info("分发至便携式基础数据处理");
eventFeignClient.getPortableData(appEventMessage);
break;
case 241:
log.info("分发装置异常事件统计");