feat(api): 添加批量插入通信数据功能
- 在CsCommunicateFeignClient中增加insertionList接口方法 - 实现批量插入的fallback处理逻辑 - 在ICsCommunicateService中添加insertionList服务接口 - 完成InfluxdbCsCommunicateServiceImpl中的批量插入实现 - 优化数据处理逻辑,支持运行状态转换和CT/PT计算 - 添加数据排序功能,按项目名、设备名、测点名排序 - 在控制器中增加批量插入数据的REST接口
This commit is contained in:
@@ -8,6 +8,8 @@ import org.springframework.cloud.openfeign.FeignClient;
|
|||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author xy
|
* @author xy
|
||||||
*/
|
*/
|
||||||
@@ -17,4 +19,7 @@ public interface CsCommunicateFeignClient {
|
|||||||
|
|
||||||
@PostMapping("/insertion")
|
@PostMapping("/insertion")
|
||||||
HttpResult<String> insertion(@RequestBody PqsCommunicateDto pqsCommunicateDto);
|
HttpResult<String> insertion(@RequestBody PqsCommunicateDto pqsCommunicateDto);
|
||||||
|
|
||||||
|
@PostMapping("/insertionList")
|
||||||
|
HttpResult<String> insertionList(@RequestBody List<PqsCommunicateDto> list);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import feign.hystrix.FallbackFactory;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 类的介绍:
|
* 类的介绍:
|
||||||
*
|
*
|
||||||
@@ -35,6 +37,12 @@ public class CsCommunicateFeignClientFallbackFactory implements FallbackFactory<
|
|||||||
log.error("{}异常,降级处理,异常为:{}","新增记录",cause.toString());
|
log.error("{}异常,降级处理,异常为:{}","新增记录",cause.toString());
|
||||||
throw new BusinessException(finalExceptionEnum);
|
throw new BusinessException(finalExceptionEnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HttpResult<String> insertionList(List<PqsCommunicateDto> list) {
|
||||||
|
log.error("{}异常,降级处理,异常为:{}","批量插入数据",cause.toString());
|
||||||
|
throw new BusinessException(finalExceptionEnum);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,4 +75,13 @@ public class PqsCommunicateController extends BaseController {
|
|||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OperateInfo(info = LogEnum.BUSINESS_COMMON,operateType = OperateType.ADD)
|
||||||
|
@PostMapping("/insertionList")
|
||||||
|
@ApiOperation("批量插入数据")
|
||||||
|
public HttpResult<String> insertionList(@RequestBody List<PqsCommunicateDto> list) {
|
||||||
|
String methodDescribe = getMethodDescribe("insertionList");
|
||||||
|
pqsCommunicateCvtQuery.insertionList(list);
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,4 +45,6 @@ public interface ICsCommunicateService {
|
|||||||
List<PqsCommunicateDto> getRawDataEnd(LineCountEvaluateParam lineParam);
|
List<PqsCommunicateDto> getRawDataEnd(LineCountEvaluateParam lineParam);
|
||||||
|
|
||||||
void insertion(PqsCommunicateDto pqsCommunicateDto);
|
void insertion(PqsCommunicateDto pqsCommunicateDto);
|
||||||
|
|
||||||
|
void insertionList(List<PqsCommunicateDto> list);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import java.time.ZoneId;
|
|||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -321,6 +322,52 @@ public class InfluxdbCsCommunicateServiceImpl implements ICsCommunicateService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void insertionList(List<PqsCommunicateDto> list) {
|
||||||
|
if (CollectionUtils.isEmpty(list)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Map<String, List<PqsCommunicateDto>> groupByDevId = list.stream().collect(Collectors.groupingBy(PqsCommunicateDto::getDevId));
|
||||||
|
List<String> lineProtocols = new ArrayList<>();
|
||||||
|
groupByDevId.forEach((ndid, dtoList) -> {
|
||||||
|
LambdaQueryWrapper<CsEquipmentDeliveryPO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
lambdaQueryWrapper.eq(CsEquipmentDeliveryPO::getNdid, ndid).ne(CsEquipmentDeliveryPO::getRunStatus, 0);
|
||||||
|
CsEquipmentDeliveryPO po = csEquipmentDeliveryMapper.selectOne(lambdaQueryWrapper);
|
||||||
|
if (po == null) {
|
||||||
|
log.warn("未找到ndid={}对应的装置信息,跳过", ndid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(PqsCommunicate.class);
|
||||||
|
influxQueryWrapper.eq(PqsCommunicate::getDevId, po.getId()).timeDesc().limit(1);
|
||||||
|
List<PqsCommunicate> pqsCommunicates = pqsCommunicateMapper.selectByQueryWrapper(influxQueryWrapper);
|
||||||
|
|
||||||
|
Integer lastType = CollectionUtils.isEmpty(pqsCommunicates) ? null : pqsCommunicates.get(0).getType();
|
||||||
|
|
||||||
|
for (PqsCommunicateDto dto : dtoList) {
|
||||||
|
if (lastType != null && Objects.equals(lastType, dto.getType())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Map<String, String> tags = new HashMap<>();
|
||||||
|
tags.put("dev_id", po.getId());
|
||||||
|
Map<String, Object> fields = new HashMap<>();
|
||||||
|
fields.put("type", dto.getType());
|
||||||
|
fields.put("description", dto.getDescription());
|
||||||
|
long time = LocalDateTime.parse(dto.getTime(), DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))
|
||||||
|
.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
|
||||||
|
Point point = influxDbUtils.pointBuilder("pqs_communicate", time, TimeUnit.MILLISECONDS, tags, fields);
|
||||||
|
BatchPoints batchPoints = BatchPoints.database(influxDbUtils.getDbName()).retentionPolicy("")
|
||||||
|
.consistency(InfluxDB.ConsistencyLevel.ALL).build();
|
||||||
|
batchPoints.point(point);
|
||||||
|
lineProtocols.add(batchPoints.lineProtocol());
|
||||||
|
lastType = dto.getType();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!lineProtocols.isEmpty()) {
|
||||||
|
influxDbUtils.batchInsert(influxDbUtils.getDbName(), "", InfluxDB.ConsistencyLevel.ALL, TimeUnit.MILLISECONDS, lineProtocols);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<PqsCommunicate> getPqsCommunicateData(LineCountEvaluateParam lineParam) {
|
public List<PqsCommunicate> getPqsCommunicateData(LineCountEvaluateParam lineParam) {
|
||||||
InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(PqsCommunicate.class);
|
InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(PqsCommunicate.class);
|
||||||
|
|||||||
@@ -1302,7 +1302,6 @@ public class DataServiceImpl implements IDataService {
|
|||||||
List<CsLinePO> line2 = linePo.stream().filter(item->item.getClDid()!=0).collect(Collectors.toList());
|
List<CsLinePO> line2 = linePo.stream().filter(item->item.getClDid()!=0).collect(Collectors.toList());
|
||||||
List<String> lineList2 = line2.stream().map(CsLinePO::getLineId).collect(Collectors.toList());
|
List<String> lineList2 = line2.stream().map(CsLinePO::getLineId).collect(Collectors.toList());
|
||||||
List<List<String>> partitions = Lists.partition(lineList2, 95);
|
List<List<String>> partitions = Lists.partition(lineList2, 95);
|
||||||
|
|
||||||
//表集合
|
//表集合
|
||||||
List<DictData> dataList = dicDataFeignClient.getDicDataByTypeCode("Data").getData();
|
List<DictData> dataList = dicDataFeignClient.getDicDataByTypeCode("Data").getData();
|
||||||
Map<String, DictData> map = dataList.stream().collect(Collectors.toMap(DictData::getId, v -> v));
|
Map<String, DictData> map = dataList.stream().collect(Collectors.toMap(DictData::getId, v -> v));
|
||||||
@@ -1488,7 +1487,8 @@ public class DataServiceImpl implements IDataService {
|
|||||||
if (item2.getLineList() != null && item2.getLineList().contains(item.getLineId())) {
|
if (item2.getLineList() != null && item2.getLineList().contains(item.getLineId())) {
|
||||||
vo.setProjectName(item2.getProjectName());
|
vo.setProjectName(item2.getProjectName());
|
||||||
vo.setDeviceName(item2.getEquipmentName());
|
vo.setDeviceName(item2.getEquipmentName());
|
||||||
vo.setRunStatus(item.getRunStatus());
|
int runStatus = Objects.equals(item2.getRunStatus(),2) ? 0 : 1;
|
||||||
|
vo.setRunStatus(runStatus);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1953,6 +1953,8 @@ public class DataServiceImpl implements IDataService {
|
|||||||
if (item2.getLineList() != null && item2.getLineList().contains(item.getLineId())) {
|
if (item2.getLineList() != null && item2.getLineList().contains(item.getLineId())) {
|
||||||
vo.setProjectName(item2.getProjectName());
|
vo.setProjectName(item2.getProjectName());
|
||||||
vo.setDeviceName(item2.getEquipmentName());
|
vo.setDeviceName(item2.getEquipmentName());
|
||||||
|
int runStatus = Objects.equals(item2.getRunStatus(),2) ? 0 : 1;
|
||||||
|
vo.setRunStatus(runStatus);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1960,8 +1962,8 @@ public class DataServiceImpl implements IDataService {
|
|||||||
vo.setLineType(0);
|
vo.setLineType(0);
|
||||||
vo.setPointId(item.getLineId());
|
vo.setPointId(item.getLineId());
|
||||||
vo.setPointName(lineMap.get(item.getLineId()).getName());
|
vo.setPointName(lineMap.get(item.getLineId()).getName());
|
||||||
Double ct = lineMap.get(item.getLineId()).getCtRatio() / (Objects.isNull(lineMap.get(item.getLineId()).getCt2Ratio())?1.0:lineMap.get(item.getLineId()).getCtRatio());
|
Double ct = Objects.isNull(lineMap.get(item.getLineId()).getCtRatio())?1.0:lineMap.get(item.getLineId()).getCtRatio() / (Objects.isNull(lineMap.get(item.getLineId()).getCt2Ratio())?1.0:lineMap.get(item.getLineId()).getCtRatio());
|
||||||
Double pt = lineMap.get(item.getLineId()).getPtRatio() / (Objects.isNull(lineMap.get(item.getLineId()).getPt2Ratio())?1.0:lineMap.get(item.getLineId()).getPtRatio());
|
Double pt = Objects.isNull(lineMap.get(item.getLineId()).getPtRatio())?1.0:lineMap.get(item.getLineId()).getPtRatio() / (Objects.isNull(lineMap.get(item.getLineId()).getPt2Ratio())?1.0:lineMap.get(item.getLineId()).getPtRatio());
|
||||||
List<AppLineDetailVo.targetDetail> children2 = new ArrayList<>();
|
List<AppLineDetailVo.targetDetail> children2 = new ArrayList<>();
|
||||||
//指标第二层
|
//指标第二层
|
||||||
List<AppLineDetailVo.targetDetail> finalChildren = children2;
|
List<AppLineDetailVo.targetDetail> finalChildren = children2;
|
||||||
@@ -2050,6 +2052,11 @@ public class DataServiceImpl implements IDataService {
|
|||||||
vo.setChildren(children2);
|
vo.setChildren(children2);
|
||||||
result.add(vo);
|
result.add(vo);
|
||||||
});
|
});
|
||||||
|
if (CollUtil.isNotEmpty(result)) {
|
||||||
|
result.sort(Comparator.comparing(AppLineDetailVo::getProjectName, Comparator.nullsLast(Comparator.naturalOrder()))
|
||||||
|
.thenComparing(AppLineDetailVo::getDeviceName, Comparator.nullsLast(Comparator.naturalOrder()))
|
||||||
|
.thenComparing(AppLineDetailVo::getPointName, Comparator.nullsLast(Comparator.naturalOrder())));
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user