feat(device): 新增设备注册台账功能并优化数据查询

- 添加设备注册台账实体类CsDeviceRegistry及相关数据库映射
- 实现设备注册台账的增删改查控制器及服务接口
- 集成Feign客户端用于跨服务调用设备注册功能
- 修复设备交付服务中的空指针异常问题
- 优化相位数据显示,将"T"相位转换为"总"
- 在数据集查询中添加存储标志过滤条件
- 实现设备MAC地址变更时的注册信息同步更新
- 添加设备注册状态字段到设备交付视图对象
- 完善事件处理中的逻辑子设备ID设置逻辑
- 重构线路台账服务中的线路类型判断逻辑
- 实现云前置线路创建时的唯一标识符生成机制
This commit is contained in:
xy
2026-06-22 13:49:18 +08:00
parent 870ace35cb
commit de60b53dd1
21 changed files with 624 additions and 103 deletions

View File

@@ -141,6 +141,9 @@ public class CsAlarmServiceImpl extends ServiceImpl<CsAlarmMapper, CsAlarm> impl
List<CsAlarmData.IntegrityAlarm.MonitorPointIntegrity> list2 = new ArrayList<>();
//根据resultList 来查询在线率和完整是否有true的如果有就设置alarmVO的属性
resultList.forEach(item->{
if (item == null) {
return;
}
list1.add(item.getOnlineRate());
list2.addAll(item.getIntegrity().getMonitorPoints());
// 判断 onlineRate 是否有异常

View File

@@ -448,7 +448,7 @@ public class CsEventPOServiceImpl extends ServiceImpl<CsEventPOMapper, CsEventPO
eventPo.setStartTime(time);
eventPo.setTag(getTag(param.getEventType()));
eventPo.setType(0);
eventPo.setClDid(Integer.parseInt(param.getMonitorId().substring(param.getMonitorId().length() - 1)));
eventPo.setClDid(po.getClDid());
eventPo.setLevel(2);
eventPo.setProcess(4);
eventPo.setPersistTime(param.getDuration());

View File

@@ -121,6 +121,7 @@ public class DataServiceImpl implements IDataService {
@Resource
private ApfDataMapper apfDataMapper;
private final DataSetFeignClient dataSetFeignClient;
private final static Double NULL_DATA = 3.14159;
@Override
public List<AppLineDetailVo> getRealTimeData(DataParam param) {
@@ -926,9 +927,9 @@ public class DataServiceImpl implements IDataService {
children2.sort(Comparator.comparingInt(AppLineDetailVo.targetDetail::getSort));
children2.forEach(item2->{
if (Objects.isNull(item2.getData())) {
item2.setData(3.15159);
item2.setData(NULL_DATA);
}
if (!Objects.equals(item2.getData(),3.14159)) {
if (!Objects.equals(item2.getData(),NULL_DATA)) {
item2.setData(BigDecimal.valueOf(item2.getData()).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
});
@@ -1106,18 +1107,18 @@ public class DataServiceImpl implements IDataService {
EachModuleVO.DataVo vo1 = new EachModuleVO.DataVo();
vo1.setTime(LocalDateTime.ofInstant(item.getTime().minus(8, ChronoUnit.HOURS), ZoneId.systemDefault()));
vo1.setPhasicType(item.getPhaseType());
vo1.setData(Objects.isNull(item.getValue()) ? 3.14159 : Double.parseDouble(df.format(item.getValue())));
vo1.setData(Objects.isNull(item.getValue()) ? NULL_DATA : Double.parseDouble(df.format(item.getValue())));
EachModuleVO.DataVo vo2 = new EachModuleVO.DataVo();
vo2.setTime(LocalDateTime.ofInstant(item.getTime().minus(8, ChronoUnit.HOURS), ZoneId.systemDefault()));
vo2.setPhasicType(item.getPhaseType());
vo2.setData(Objects.isNull(item.getAvgValue()) ? 3.14159 : Double.parseDouble(df.format(item.getAvgValue())));
vo2.setData(Objects.isNull(item.getAvgValue()) ? NULL_DATA : Double.parseDouble(df.format(item.getAvgValue())));
if (Objects.equals(item.getPhaseType(),"T")) {
EachModuleVO.DataVo vo3 = new EachModuleVO.DataVo();
vo3.setTime(LocalDateTime.ofInstant(item.getTime().minus(8, ChronoUnit.HOURS), ZoneId.systemDefault()));
vo3.setPhasicType(item.getPhaseType());
vo3.setData(Objects.isNull(item.getMinValue()) ? 3.14159 : Double.parseDouble(df.format(item.getMinValue())));
vo3.setData(Objects.isNull(item.getMinValue()) ? NULL_DATA : Double.parseDouble(df.format(item.getMinValue())));
list4.add(vo3);
}
list2.add(vo1);
@@ -1819,36 +1820,36 @@ public class DataServiceImpl implements IDataService {
if (Objects.equals("Primary",dataLevel1)) {
if (Objects.equals("Primary",dataLevel2)) {
if (HarmonicConstant.POWER_LIST.contains(item.getName())) {
re = Objects.isNull(item.getData()) ? 3.14159 : Double.parseDouble(df.format(item.getData() / 1000));
re = Objects.isNull(item.getData()) ? NULL_DATA : Double.parseDouble(df.format(item.getData() / 1000));
item.setData(re);
unit = "k" + item.getUnit();
} else {
item.setData(Objects.isNull(item.getData()) ? 3.14159 : Double.parseDouble(df.format(item.getData())));
item.setData(Objects.isNull(item.getData()) ? NULL_DATA : Double.parseDouble(df.format(item.getData())));
unit = item.getUnit();
}
} else {
if(Objects.nonNull(item.getPrimaryFormula())){
switch (item.getPrimaryFormula()) {
case "*PT":
re = Objects.isNull(item.getData()) ? 3.14159 : item.getData() * pt / 1000;
re = Objects.isNull(item.getData()) ? NULL_DATA : item.getData() * pt / 1000;
unit = "k" + item.getUnit();
break;
case "*CT":
re = Objects.isNull(item.getData()) ? 3.14159 : item.getData() * ct;
re = Objects.isNull(item.getData()) ? NULL_DATA : item.getData() * ct;
unit = item.getUnit();
break;
case "*PT*CT":
re = Objects.isNull(item.getData()) ? 3.14159 : item.getData() * pt * ct / 1000;
re = Objects.isNull(item.getData()) ? NULL_DATA : item.getData() * pt * ct / 1000;
unit = "k" + item.getUnit();
break;
default:
re = Objects.isNull(item.getData()) ? 3.14159 : item.getData();
re = Objects.isNull(item.getData()) ? NULL_DATA : item.getData();
unit = item.getUnit();
break;
}
item.setData(Objects.equals(re,3.14159) ? 3.14159 : Double.parseDouble(df.format(re)));
item.setData(Objects.equals(re,NULL_DATA) ? NULL_DATA : Double.parseDouble(df.format(re)));
}else {
item.setData(Objects.isNull(item.getData()) ? 3.14159 : Double.parseDouble(df.format(item.getData())));
item.setData(Objects.isNull(item.getData()) ? NULL_DATA : Double.parseDouble(df.format(item.getData())));
}
}
} else {
@@ -1856,19 +1857,19 @@ public class DataServiceImpl implements IDataService {
if(Objects.nonNull(item.getPrimaryFormula())) {
switch (item.getPrimaryFormula()) {
case "*PT":
re = Objects.isNull(item.getData()) ? 3.14159 : item.getData() / pt;
re = Objects.isNull(item.getData()) ? NULL_DATA : item.getData() / pt;
break;
case "*CT":
re = Objects.isNull(item.getData()) ? 3.14159 : item.getData() / ct;
re = Objects.isNull(item.getData()) ? NULL_DATA : item.getData() / ct;
break;
case "*PT*CT":
re = Objects.isNull(item.getData()) ? 3.14159 : item.getData() / pt / ct * 1000;
re = Objects.isNull(item.getData()) ? NULL_DATA : item.getData() / pt / ct * 1000;
break;
default:
re = Objects.isNull(item.getData()) ? 3.14159 : item.getData();
re = Objects.isNull(item.getData()) ? NULL_DATA : item.getData();
break;
}
item.setData(Objects.equals(re,3.14159) ? 3.14159 : Double.parseDouble(df.format(re)));
item.setData(Objects.equals(re,NULL_DATA) ? NULL_DATA : Double.parseDouble(df.format(re)));
}else {
if (Objects.nonNull(item.getData())) {
re = item.getData();
@@ -1876,7 +1877,7 @@ public class DataServiceImpl implements IDataService {
}
}
} else {
item.setData(Objects.isNull(item.getData()) ? 3.14159 : Double.parseDouble(df.format(item.getData())));
item.setData(Objects.isNull(item.getData()) ? NULL_DATA : Double.parseDouble(df.format(item.getData())));
}
}
item.setUnit(unit);
@@ -2040,7 +2041,7 @@ public class DataServiceImpl implements IDataService {
if (Objects.isNull(item2.getData())) {
item2.setData(3.15159);
}
if (!Objects.equals(item2.getData(),3.14159)) {
if (!Objects.equals(item2.getData(),NULL_DATA)) {
item2.setData(BigDecimal.valueOf(item2.getData()).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
});

View File

@@ -15,9 +15,11 @@ import com.njcn.access.utils.ChannelObjectUtil;
import com.njcn.access.utils.MqttUtil;
import com.njcn.common.config.GeneralInfo;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.csdevice.api.CsLineFeignClient;
import com.njcn.csdevice.api.DeviceFtpFeignClient;
import com.njcn.csdevice.api.EquipmentFeignClient;
import com.njcn.csdevice.api.PortableOffLogFeignClient;
import com.njcn.csdevice.pojo.po.CsEquipmentDeliveryPO;
import com.njcn.csdevice.pojo.vo.CsEquipmentDeliveryVO;
import com.njcn.csharmonic.enums.CsHarmonicResponseEnum;
import com.njcn.csharmonic.offline.constant.OfflineConstant;
@@ -82,7 +84,7 @@ public class OfflineDataUploadServiceImpl implements OfflineDataUploadService {
private final GeneralInfo generalInfo;
private final PortableOffLogFeignClient portableOffLogFeignClient;
private final EquipmentFeignClient equipmentFeignClient;
private final CsLineFeignClient csLineFeignClient;
@Override
public byte[] uploadAnalysis(List<MultipartFile> files,String type) throws Exception{
@@ -492,7 +494,8 @@ public class OfflineDataUploadServiceImpl implements OfflineDataUploadService {
*/
public void askProjectInfo(String lineId, String nDid, Integer type, String path, String topic) {
if (StringUtils.isNotBlank(lineId)) {
nDid = lineId.substring(0, lineId.length() - 1);
CsEquipmentDeliveryPO po = equipmentFeignClient.getDevByLineId(lineId).getData();
nDid = po.getNdid();
}
String version = csTopicFeignClient.find(nDid).getData();
ReqAndResDto.Req reqAndResParam = createRequestParameters(lineId, type, path);

View File

@@ -40,11 +40,10 @@ public class RealDataServiceImpl implements RealDataService {
private final MqttUtil mqttUtil;
private final DictTreeFeignClient dictTreeFeignClient;
// @Override
@Override
public boolean getBaseRealData(String lineId) {
boolean result = true;
boolean result = false;
try {
String nDid = lineId.substring(0, lineId.length() - 1);
//判断设备类型 治理无线设备需要判断mqtt、云前置设备直接判断设备运行状态
CsEquipmentDeliveryPO dev = equipmentFeignClient.getDevByLineId(lineId).getData();
String devModelCode = dictTreeFeignClient.queryById(dev.getDevType()).getData().getCode();
@@ -53,13 +52,12 @@ public class RealDataServiceImpl implements RealDataService {
throw new BusinessException("装置离线");
}
} else {
String clientName = "NJCN-" + nDid.substring(nDid.length() - 6);
String clientName = "NJCN-" + dev.getNdid().substring(dev.getNdid().length() - 6);
boolean mqttClient = mqttUtil.judgeClientOnline(clientName);
if (!mqttClient) {
throw new BusinessException("装置离线");
}
}
Integer clDid = Integer.parseInt(lineId.substring(lineId.length() - 1));
//获取装置所用模板
CsLinePO po = csLineFeignClient.getById(lineId).getData();
String modelId = po.getDataModelId();
@@ -69,8 +67,8 @@ public class RealDataServiceImpl implements RealDataService {
updateRedisUserSet("rtDataUserId:" + lineId, RequestUtil.getUserIndex(), 600L);
updateRedisUserSet("cldRtDataOverTime:" + lineId, RequestUtil.getUserIndex(), 5L);
} else {
CsDataSet csDataSet = dataSetFeignClient.getBaseDataSet(modelId,clDid).getData();
askDeviceDataFeignClient.askRealData(nDid,csDataSet.getIdx(),clDid);
CsDataSet csDataSet = dataSetFeignClient.getBaseDataSet(modelId,po.getClDid()).getData();
askDeviceDataFeignClient.askRealData(dev.getNdid(),csDataSet.getIdx(),po.getClDid());
redisUtil.saveByKeyWithExpire("rtDataUserId:"+lineId, RequestUtil.getUserIndex(),600L);
}
//等待装置响应,获取询问结果
@@ -80,15 +78,13 @@ public class RealDataServiceImpl implements RealDataService {
if (Objects.equals(DicDataEnum.DEV_CLD.getCode(),devModelCode) && Objects.equals(dev.getDevAccessMethod(),"CLD")) {
object = redisUtil.getObjectByKey("devResponse:" + lineId);
} else {
object = redisUtil.getObjectByKey("devResponse");
object = redisUtil.getObjectByKey("devResponse:" + dev.getNdid());
}
if (Objects.isNull(object)) {
result = false;
//throw new BusinessException("数据获取失败,设备无响应");
} else {
int code = (Integer) object;
if (code != 200) {
result = false;
//throw new BusinessException("数据获取失败,设备无响应");
} else {
result = true;
@@ -106,7 +102,6 @@ public class RealDataServiceImpl implements RealDataService {
public boolean getHarmRealData(String lineId, Integer target) {
boolean result = true;
try {
String nDid = lineId.substring(0, lineId.length() - 1);
//判断设备类型 治理无线设备需要判断mqtt、云前置设备直接判断设备运行状态
CsEquipmentDeliveryPO dev = equipmentFeignClient.getDevByLineId(lineId).getData();
String devModelCode = dictTreeFeignClient.queryById(dev.getDevType()).getData().getCode();
@@ -115,13 +110,12 @@ public class RealDataServiceImpl implements RealDataService {
throw new BusinessException("装置离线");
}
} else {
String clientName = "NJCN-" + nDid.substring(nDid.length() - 6);
String clientName = "NJCN-" + dev.getNdid().substring(dev.getNdid().length() - 6);
boolean mqttClient = mqttUtil.judgeClientOnline(clientName);
if (!mqttClient) {
throw new BusinessException("装置离线");
}
}
Integer clDid = Integer.parseInt(lineId.substring(lineId.length() - 1));
//获取装置所用模板
CsLinePO po = csLineFeignClient.getById(lineId).getData();
String modelId = po.getDataModelId();
@@ -130,8 +124,8 @@ public class RealDataServiceImpl implements RealDataService {
CsDataSet csDataSet = dataSetFeignClient.getHarmonicDataSet(modelId,1,target).getData();
askDeviceDataFeignClient.askCldRealData(dev.getId(),lineId,dev.getNodeId(),csDataSet.getIdx());
} else {
CsDataSet csDataSet = dataSetFeignClient.getHarmonicDataSet(modelId,clDid,target).getData();
askDeviceDataFeignClient.askRealData(nDid,csDataSet.getIdx(),clDid);
CsDataSet csDataSet = dataSetFeignClient.getHarmonicDataSet(modelId,po.getClDid(),target).getData();
askDeviceDataFeignClient.askRealData(dev.getNdid(),csDataSet.getIdx(),po.getClDid());
}
//等待装置响应,获取询问结果
Thread.sleep(2000);
@@ -139,7 +133,7 @@ public class RealDataServiceImpl implements RealDataService {
if (Objects.equals(DicDataEnum.DEV_CLD.getCode(),devModelCode) && Objects.equals(dev.getDevAccessMethod(),"CLD")) {
object = redisUtil.getObjectByKey("devResponse:" + lineId);
} else {
object = redisUtil.getObjectByKey("devResponse");
object = redisUtil.getObjectByKey("devResponse:" + dev.getNdid());
}
if (Objects.isNull(object)) {
result = false;