feat(api): 添加批量插入通信数据功能

- 在CsCommunicateFeignClient中增加insertionList接口方法
- 实现批量插入的fallback处理逻辑
- 在ICsCommunicateService中添加insertionList服务接口
- 完成InfluxdbCsCommunicateServiceImpl中的批量插入实现
- 优化数据处理逻辑,支持运行状态转换和CT/PT计算
- 添加数据排序功能,按项目名、设备名、测点名排序
- 在控制器中增加批量插入数据的REST接口
This commit is contained in:
xy
2026-07-02 19:06:58 +08:00
parent 9f5c273180
commit e629c8b42c
6 changed files with 82 additions and 4 deletions

View File

@@ -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);
} }

View File

@@ -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);
}
}; };
} }
} }

View File

@@ -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);
}
} }

View File

@@ -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);
} }

View File

@@ -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);

View File

@@ -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;
} }