refactor(access): 优化设备接入流程和日志记录

- 移除不必要的日志模板依赖和相关变量
- 简化设备接入方法中的成功失败ID收集逻辑
- 优化模板信息获取的等待机制,替换固定延时为条件循环
- 更新设备状态查询条件,排除未注册状态的设备
- 重构消息处理器中的日志记录方式,统一操作描述格式
- 修复事务注解在特定方法上的配置问题
- 调整设备接入流程步骤顺序,优化异常处理机制
- 更新MQTT消息处理中的操作日志描述,增加系统端标识
- 优化设备数据询问功能的日志记录完整性
This commit is contained in:
xy
2026-06-12 14:43:39 +08:00
parent cfd22f3ea8
commit 9e9fbb360b
6 changed files with 130 additions and 122 deletions

View File

@@ -57,7 +57,7 @@ public enum AccessResponseEnum {
WAVE_INFO_MISSING("A0307","波形参数缺失!"), WAVE_INFO_MISSING("A0307","波形参数缺失!"),
MODEL_MISS("A0308","询问模板信息超时,设备未响应!"), MODEL_MISS("A0308","询问模板信息超时,设备未响应!"),
MODEL_VERSION_ERROR("A0308","询问装置模板信息错误"), MODEL_VERSION_ERROR("A0308","装置模板DevModInfo数据为空"),
UPLOAD_ERROR("A0308","平台上送文件异常"), UPLOAD_ERROR("A0308","平台上送文件异常"),
RELOAD_UPLOAD_ERROR("A0308","平台重新上送文件异常"), RELOAD_UPLOAD_ERROR("A0308","平台重新上送文件异常"),

View File

@@ -105,15 +105,16 @@ public class MqttMessageHandler {
@MqttSubscribe(value = "/Dev/DevTopic/{edgeId}",qos = 1) @MqttSubscribe(value = "/Dev/DevTopic/{edgeId}",qos = 1)
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void devTopic(String topic, MqttMessage message, @NamedValue("edgeId") String nDid, @Payload String payload){ public void devTopic(String topic, MqttMessage message, @NamedValue("edgeId") String nDid, @Payload String payload){
//业务流程开始
Gson gson = new Gson();
ReqAndResParam.Res res = gson.fromJson(new String(message.getPayload(), StandardCharsets.UTF_8), ReqAndResParam.Res.class);
//日志记录 //日志记录
LogMessage logDto = new LogMessage(); LogMessage logDto = new LogMessage();
logDto.setUserIndex("系统"); logDto.setUserIndex("系统");
logDto.setLoginName("系统"); logDto.setLoginName("系统");
logDto.setOperate(nDid + "设备主题录入"); logDto.setOperate("系统端收到装置端"+nDid+"发送的主题信息code = " + res.getCode());
logDto.setResult(1); logDto.setResult(1);
//业务流程开始 logMessageTemplate.sendMember(logDto);
Gson gson = new Gson();
ReqAndResParam.Res res = gson.fromJson(new String(message.getPayload(), StandardCharsets.UTF_8), ReqAndResParam.Res.class);
//检验传递的参数是否准确 //检验传递的参数是否准确
Set<ConstraintViolation<ReqAndResParam.Res>> validate = validator.validate(res); Set<ConstraintViolation<ReqAndResParam.Res>> validate = validator.validate(res);
// validate.forEach(constraintViolation -> { // validate.forEach(constraintViolation -> {
@@ -162,15 +163,16 @@ public class MqttMessageHandler {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void devOperation(String topic, MqttMessage message, @NamedValue("edgeId") String nDid, @Payload String payload){ public void devOperation(String topic, MqttMessage message, @NamedValue("edgeId") String nDid, @Payload String payload){
log.info("收到注册应答响应--->{}", nDid); log.info("收到注册应答响应--->{}", nDid);
//业务处理
Gson gson = new Gson();
ReqAndResDto.Res res = gson.fromJson(new String(message.getPayload(), StandardCharsets.UTF_8), ReqAndResDto.Res.class);
//日志记录 //日志记录
LogMessage logDto = new LogMessage(); LogMessage logDto = new LogMessage();
logDto.setUserIndex("系统"); logDto.setUserIndex("系统");
logDto.setLoginName("系统"); logDto.setLoginName("系统");
logDto.setOperate("收到设备"+nDid+"注册应答响应"); logDto.setOperate("系统端收到装置端"+nDid+"注册应答响应code = " + res.getCode());
logDto.setResult(1); logDto.setResult(1);
//业务处理 logMessageTemplate.sendMember(logDto);
Gson gson = new Gson();
ReqAndResDto.Res res = gson.fromJson(new String(message.getPayload(), StandardCharsets.UTF_8), ReqAndResDto.Res.class);
if (Objects.equals(res.getCode(),AccessEnum.SUCCESS.getCode())){ if (Objects.equals(res.getCode(),AccessEnum.SUCCESS.getCode())){
if (Objects.equals(res.getType(),Integer.parseInt(TypeEnum.TYPE_17.getCode()))){ if (Objects.equals(res.getType(),Integer.parseInt(TypeEnum.TYPE_17.getCode()))){
//询问模板数据 //询问模板数据
@@ -182,6 +184,11 @@ public class MqttMessageHandler {
reqAndResParam.setExpire(-1); reqAndResParam.setExpire(-1);
String version = csTopicService.getVersion(nDid); String version = csTopicService.getVersion(nDid);
publisher.send("/Pfm/DevCmd/"+version+"/"+nDid,new Gson().toJson(reqAndResParam),1,false); publisher.send("/Pfm/DevCmd/"+version+"/"+nDid,new Gson().toJson(reqAndResParam),1,false);
//记录日志
logDto.setUserIndex("系统");
logDto.setLoginName("系统");
logDto.setOperate("注册阶段:系统端向装置端"+nDid+"发送询问模板请求");
logDto.setResult(1);
logMessageTemplate.sendMember(logDto); logMessageTemplate.sendMember(logDto);
} else { } else {
logDto.setResult(0); logDto.setResult(0);
@@ -207,7 +214,7 @@ public class MqttMessageHandler {
*/ */
@MqttSubscribe(value = "/Pfm/DevRsp/{version}/{edgeId}",qos = 1) @MqttSubscribe(value = "/Pfm/DevRsp/{version}/{edgeId}",qos = 1)
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void devAccessOperation(String topic, MqttMessage message, @NamedValue("version") String version, @NamedValue("edgeId") String nDid, @Payload String payload){ public void devAccessOperation(String topic, MqttMessage message, @NamedValue("version") String version, @NamedValue("edgeId") String nDid, @Payload String payload) throws InterruptedException {
//日志实体 //日志实体
LogMessage logDto = new LogMessage(); LogMessage logDto = new LogMessage();
logDto.setUserIndex("系统"); logDto.setUserIndex("系统");
@@ -226,7 +233,8 @@ public class MqttMessageHandler {
* 3.平台端需读取装置的DevMod来判断网关支持的设备模板包含设备型号和模板版本根据app提交的接入子设备DID匹配数据模板型号及版本生成DevCfg下发给网关网关根据下发信息生成就地设备点表。 * 3.平台端需读取装置的DevMod来判断网关支持的设备模板包含设备型号和模板版本根据app提交的接入子设备DID匹配数据模板型号及版本生成DevCfg下发给网关网关根据下发信息生成就地设备点表。
*/ */
case 4611: case 4611:
logDto.setOperate("装置模板应答"); logDto.setOperate("系统端收到装置端"+nDid+"模板应答code = " + res.getCode());
logMessageTemplate.sendMember(logDto);
//log.info("{},装置模板应答,应答code {}",nDid,res.getCode()); //log.info("{},装置模板应答,应答code {}",nDid,res.getCode());
ModelDto modelDto = gson.fromJson(new String(message.getPayload(), StandardCharsets.UTF_8), ModelDto.class); ModelDto modelDto = gson.fromJson(new String(message.getPayload(), StandardCharsets.UTF_8), ModelDto.class);
List<DevModInfoDto> list = modelDto.getMsg().getDevMod(); List<DevModInfoDto> list = modelDto.getMsg().getDevMod();
@@ -292,7 +300,9 @@ public class MqttMessageHandler {
logMessageTemplate.sendMember(logDto); logMessageTemplate.sendMember(logDto);
break; break;
case 4613: case 4613:
logDto.setOperate(nDid + "设备接入"); logDto.setOperate("系统端收到装置端"+nDid+"接入应答code = " + res.getCode());
logDto.setResult(1);
logMessageTemplate.sendMember(logDto);
//log.info("{},收到接入应答响应,应答code {}",nDid,res.getCode()); //log.info("{},收到接入应答响应,应答code {}",nDid,res.getCode());
if (Objects.equals(res.getCode(),AccessEnum.SUCCESS.getCode())){ if (Objects.equals(res.getCode(),AccessEnum.SUCCESS.getCode())){
int mid = 1; int mid = 1;
@@ -334,7 +344,8 @@ public class MqttMessageHandler {
if (!Objects.isNull(rspDataDto.getDataType())) { if (!Objects.isNull(rspDataDto.getDataType())) {
switch (rspDataDto.getDataType()){ switch (rspDataDto.getDataType()){
case 1: case 1:
logDto.setOperate(nDid + "更新设备软件信息"); logDto.setOperate("系统端收到装置端"+nDid+"更新设备软件信息报文code = " + res.getCode());
logDto.setResult(1);
RspDataDto.SoftInfo softInfo = JSON.parseObject(JSON.toJSONString(rspDataDto.getDataArray()), RspDataDto.SoftInfo.class); RspDataDto.SoftInfo softInfo = JSON.parseObject(JSON.toJSONString(rspDataDto.getDataArray()), RspDataDto.SoftInfo.class);
//记录设备软件信息 //记录设备软件信息
CsSoftInfoPO csSoftInfoPo = new CsSoftInfoPO(); CsSoftInfoPO csSoftInfoPo = new CsSoftInfoPO();
@@ -365,7 +376,8 @@ public class MqttMessageHandler {
List<RspDataDto.LdevInfo> devInfo = JSON.parseArray(JSON.toJSONString(rspDataDto.getDataArray()), RspDataDto.LdevInfo.class); List<RspDataDto.LdevInfo> devInfo = JSON.parseArray(JSON.toJSONString(rspDataDto.getDataArray()), RspDataDto.LdevInfo.class);
if (CollectionUtil.isNotEmpty(devInfo)){ if (CollectionUtil.isNotEmpty(devInfo)){
if (Objects.equals(res.getDid(),1)){ if (Objects.equals(res.getDid(),1)){
logDto.setOperate(nDid + "更新APF容量"); logDto.setOperate("系统端收到装置端"+nDid+"更新APF容量报文code = " + res.getCode());
logDto.setResult(1);
List<CsDevCapacityPO> list3 = new ArrayList<>(); List<CsDevCapacityPO> list3 = new ArrayList<>();
boolean hasZeroClDid = devInfo.stream().anyMatch(item -> item.getClDid() == 0); boolean hasZeroClDid = devInfo.stream().anyMatch(item -> item.getClDid() == 0);
//治理设备 //治理设备
@@ -394,7 +406,8 @@ public class MqttMessageHandler {
equipmentFeignClient.updateModuleNumber(nDid,(devInfo.size()-1)); equipmentFeignClient.updateModuleNumber(nDid,(devInfo.size()-1));
} }
} else if (Objects.equals(res.getDid(),2)) { } else if (Objects.equals(res.getDid(),2)) {
logDto.setOperate(nDid + "更新电网侧、负载侧监测点信息"); logDto.setOperate("系统端收到装置端"+nDid+"更新电网侧、负载侧监测点信息报文code = " + res.getCode());
logDto.setResult(1);
//1.更新电网侧、负载侧监测点相关信息 //1.更新电网侧、负载侧监测点相关信息
devInfo.forEach(item->{ devInfo.forEach(item->{
updateLineInfo(nDid,item); updateLineInfo(nDid,item);
@@ -404,7 +417,8 @@ public class MqttMessageHandler {
logMessageTemplate.sendMember(logDto); logMessageTemplate.sendMember(logDto);
break; break;
case 15: case 15:
logDto.setOperate(nDid + "更新设备软件信息"); logDto.setOperate("系统端收到装置端"+nDid+"更新设备软件信息报文code = " + res.getCode());
logDto.setResult(1);
JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(res)); JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(res));
AppAutoDataMessage appAutoDataMessage = JSONObject.toJavaObject(jsonObject, AppAutoDataMessage.class); AppAutoDataMessage appAutoDataMessage = JSONObject.toJavaObject(jsonObject, AppAutoDataMessage.class);
appAutoDataMessage.setId(nDid); appAutoDataMessage.setId(nDid);
@@ -412,8 +426,8 @@ public class MqttMessageHandler {
logMessageTemplate.sendMember(logDto); logMessageTemplate.sendMember(logDto);
break; break;
case 48: case 48:
logDto.setUserIndex("系统"); logDto.setOperate("系统端收到装置端"+nDid+"询问项目列表报文code = " + res.getCode());
logDto.setOperate("监测点:" + (nDid + rspDataDto.getClDid()) + "询问项目列表"); logDto.setResult(1);
List<RspDataDto.ProjectInfo> projectInfoList = JSON.parseArray(JSON.toJSONString(rspDataDto.getDataArray()), RspDataDto.ProjectInfo.class); List<RspDataDto.ProjectInfo> projectInfoList = JSON.parseArray(JSON.toJSONString(rspDataDto.getDataArray()), RspDataDto.ProjectInfo.class);
String key3 = AppRedisKey.PROJECT_INFO + nDid + rspDataDto.getClDid(); String key3 = AppRedisKey.PROJECT_INFO + nDid + rspDataDto.getClDid();
redisUtil.saveByKeyWithExpire(key3,projectInfoList,60L); redisUtil.saveByKeyWithExpire(key3,projectInfoList,60L);
@@ -433,6 +447,11 @@ public class MqttMessageHandler {
default: default:
break; break;
} }
} else if (Objects.equals(res.getCode(),AccessEnum.START_CHANNEL.getCode())) {
logDto.setOperate(AccessEnum.START_CHANNEL.getMessage() + "系统等待5s");
logDto.setResult(1);
logMessageTemplate.sendMember(logDto);
Thread.sleep(5000);
} else { } else {
String result = getEnum(res.getCode()); String result = getEnum(res.getCode());
//log.info(result); //log.info(result);
@@ -690,6 +709,10 @@ public class MqttMessageHandler {
* 3监测点pt/ct信息 * 3监测点pt/ct信息
*/ */
public void askDevData(String nDid,String version,Integer type,Integer mid){ public void askDevData(String nDid,String version,Integer type,Integer mid){
LogMessage logDto = new LogMessage();
logDto.setUserIndex("系统");
logDto.setLoginName("系统");
logDto.setResult(1);
ReqAndResDto.Req reqAndResParam = new ReqAndResDto.Req(); ReqAndResDto.Req reqAndResParam = new ReqAndResDto.Req();
reqAndResParam.setMid(mid); reqAndResParam.setMid(mid);
reqAndResParam.setPri(AccessEnum.FIRST_CHANNEL.getCode()); reqAndResParam.setPri(AccessEnum.FIRST_CHANNEL.getCode());
@@ -705,28 +728,33 @@ public class MqttMessageHandler {
reqAndResParam.setDid(0); reqAndResParam.setDid(0);
askDataDto.setCldid(0); askDataDto.setCldid(0);
askDataDto.setDataType(1); askDataDto.setDataType(1);
logDto.setOperate("系统端向装置端"+nDid+"询问软件信息");
break; break;
case 2: case 2:
reqAndResParam.setDid(1); reqAndResParam.setDid(1);
askDataDto.setCldid(-1); askDataDto.setCldid(-1);
askDataDto.setDataType(2); askDataDto.setDataType(2);
logDto.setOperate("系统端向装置端"+nDid+"询问逻辑设备1信息");
break; break;
case 3: case 3:
reqAndResParam.setDid(2); reqAndResParam.setDid(2);
askDataDto.setCldid(-1); askDataDto.setCldid(-1);
askDataDto.setDataType(2); askDataDto.setDataType(2);
logDto.setOperate("系统端向装置端"+nDid+"询问逻辑设备2信息");
break; break;
//询问工程信息 //询问工程信息
case 48: case 48:
reqAndResParam.setDid(1); reqAndResParam.setDid(1);
askDataDto.setCldid(1); askDataDto.setCldid(1);
askDataDto.setDataType(48); askDataDto.setDataType(48);
logDto.setOperate("系统端向装置端"+nDid+"询问工程信息");
break; break;
default: default:
break; break;
} }
reqAndResParam.setMsg(askDataDto); reqAndResParam.setMsg(askDataDto);
publisher.send("/Pfm/DevCmd/"+version+"/"+nDid, new Gson().toJson(reqAndResParam),1,false); publisher.send("/Pfm/DevCmd/"+version+"/"+nDid, new Gson().toJson(reqAndResParam),1,false);
logMessageTemplate.sendMember(logDto);
} }
public String getEnum(Integer code) { public String getEnum(Integer code) {

View File

@@ -41,7 +41,6 @@ public class AccessApplicationRunner implements ApplicationRunner {
private final ICsEquipmentDeliveryService csEquipmentDeliveryService; private final ICsEquipmentDeliveryService csEquipmentDeliveryService;
private final ICsTopicService csTopicService; private final ICsTopicService csTopicService;
private final CsDeviceServiceImpl csDeviceService; private final CsDeviceServiceImpl csDeviceService;
private final LogMessageTemplate logMessageTemplate;
private final ChannelObjectUtil channelObjectUtil; private final ChannelObjectUtil channelObjectUtil;
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
@@ -101,8 +100,6 @@ public class AccessApplicationRunner implements ApplicationRunner {
public void accessDev(List<CsEquipmentDeliveryPO> list, Map<String, SysDicTreePO> dictTreeMap, Map<String,String> topicVersions) { public void accessDev(List<CsEquipmentDeliveryPO> list, Map<String, SysDicTreePO> dictTreeMap, Map<String,String> topicVersions) {
if (CollUtil.isNotEmpty(list)) { if (CollUtil.isNotEmpty(list)) {
List<String> successIds = new ArrayList<>();
List<String> failIds = new ArrayList<>();
try { try {
list.forEach(item->{ list.forEach(item->{
//System.out.println(Thread.currentThread().getName() + ": reboot : nDid : " + item.getNdid()); //System.out.println(Thread.currentThread().getName() + ": reboot : nDid : " + item.getNdid());
@@ -118,29 +115,9 @@ public class AccessApplicationRunner implements ApplicationRunner {
boolean result = csDeviceService.autoAccess(item.getNdid(),version,1); boolean result = csDeviceService.autoAccess(item.getNdid(),version,1);
if (result) { if (result) {
redisUtil.saveByKey(AppRedisKey.DEVICE_MID + item.getNdid(), 1); redisUtil.saveByKey(AppRedisKey.DEVICE_MID + item.getNdid(), 1);
successIds.add(item.getNdid());
} else {
failIds.add(item.getNdid());
} }
} }
}); });
if (CollUtil.isNotEmpty(successIds)) {
LogMessage logDto = new LogMessage();
logDto.setUserIndex("系统首次启动");
logDto.setLoginName("系统首次启动");
logDto.setResult(1);
logDto.setOperate(String.join(",", successIds) + "装置接入");
logMessageTemplate.sendMember(logDto);
}
if (CollUtil.isNotEmpty(failIds)) {
LogMessage logDto = new LogMessage();
logDto.setUserIndex("系统首次启动");
logDto.setLoginName("系统首次启动");
logDto.setResult(0);
logDto.setOperate(String.join(",", failIds) + "装置接入");
logDto.setFailReason("装置不在线或者系统询问装置模板信息,装置未响应");
logMessageTemplate.sendMember(logDto);
}
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage()); log.error(e.getMessage());
} }

View File

@@ -6,7 +6,6 @@ import com.njcn.access.service.ICsTopicService;
import com.njcn.access.service.impl.CsDeviceServiceImpl; import com.njcn.access.service.impl.CsDeviceServiceImpl;
import com.njcn.access.utils.ChannelObjectUtil; import com.njcn.access.utils.ChannelObjectUtil;
import com.njcn.csdevice.pojo.po.CsEquipmentDeliveryPO; import com.njcn.csdevice.pojo.po.CsEquipmentDeliveryPO;
import com.njcn.mq.message.LogMessage;
import com.njcn.mq.template.LogMessageTemplate; import com.njcn.mq.template.LogMessageTemplate;
import com.njcn.redis.pojo.enums.AppRedisKey; import com.njcn.redis.pojo.enums.AppRedisKey;
import com.njcn.redis.utils.RedisUtil; import com.njcn.redis.utils.RedisUtil;
@@ -40,7 +39,6 @@ public class AutoAccessTimer implements ApplicationRunner {
private final ICsTopicService csTopicService; private final ICsTopicService csTopicService;
private final CsDeviceServiceImpl csDeviceService; private final CsDeviceServiceImpl csDeviceService;
private final ChannelObjectUtil channelObjectUtil; private final ChannelObjectUtil channelObjectUtil;
private final LogMessageTemplate logMessageTemplate;
@Override @Override
public void run(ApplicationArguments args) { public void run(ApplicationArguments args) {
@@ -140,8 +138,6 @@ public class AutoAccessTimer implements ApplicationRunner {
//安全的accessDev版本 //安全的accessDev版本
private void accessDevSafely(List<CsEquipmentDeliveryPO> list, Map<String, SysDicTreePO> dictTreeMap, Map<String,String> topicVersions) { private void accessDevSafely(List<CsEquipmentDeliveryPO> list, Map<String, SysDicTreePO> dictTreeMap, Map<String,String> topicVersions) {
if (CollUtil.isNotEmpty(list)) { if (CollUtil.isNotEmpty(list)) {
List<String> successIds = new ArrayList<>();
List<String> failIds = new ArrayList<>();
for (CsEquipmentDeliveryPO item : list) { for (CsEquipmentDeliveryPO item : list) {
try { try {
if (Objects.equals(dictTreeMap.get(item.getDevType()).getCode(), DicDataEnum.PORTABLE.getCode()) && Objects.equals(item.getStatus(), 1)) { if (Objects.equals(dictTreeMap.get(item.getDevType()).getCode(), DicDataEnum.PORTABLE.getCode()) && Objects.equals(item.getStatus(), 1)) {
@@ -156,10 +152,6 @@ public class AutoAccessTimer implements ApplicationRunner {
boolean success = csDeviceService.autoAccess2(item.getNdid(), version, 1); boolean success = csDeviceService.autoAccess2(item.getNdid(), version, 1);
if (success) { if (success) {
redisUtil.saveByKey(AppRedisKey.DEVICE_MID + item.getNdid(), 1); redisUtil.saveByKey(AppRedisKey.DEVICE_MID + item.getNdid(), 1);
successIds.add(item.getNdid());
} else {
log.warn("设备 {} 接入失败", item.getNdid());
failIds.add(item.getNdid());
} }
} catch (Exception e) { } catch (Exception e) {
log.error("设备 {} 接入异常: {}", item.getNdid(), e.getMessage()); log.error("设备 {} 接入异常: {}", item.getNdid(), e.getMessage());
@@ -169,23 +161,6 @@ public class AutoAccessTimer implements ApplicationRunner {
log.error("处理设备 {} 失败: {}", item.getNdid(), e.getMessage()); log.error("处理设备 {} 失败: {}", item.getNdid(), e.getMessage());
} }
} }
if (CollUtil.isNotEmpty(successIds)) {
LogMessage logDto = new LogMessage();
logDto.setUserIndex("系统首次启动");
logDto.setLoginName("系统首次启动");
logDto.setResult(1);
logDto.setOperate(String.join(",", successIds) + "装置接入");
logMessageTemplate.sendMember(logDto);
}
if (CollUtil.isNotEmpty(failIds)) {
LogMessage logDto = new LogMessage();
logDto.setUserIndex("系统首次启动");
logDto.setLoginName("系统首次启动");
logDto.setResult(0);
logDto.setOperate(String.join(",", failIds) + "装置接入");
logDto.setFailReason("装置不在线或者系统询问装置模板信息,装置未响应");
logMessageTemplate.sendMember(logDto);
}
} }
} }

View File

@@ -17,7 +17,6 @@ import com.njcn.access.pojo.param.DeviceStatusParam;
import com.njcn.access.service.*; import com.njcn.access.service.*;
import com.njcn.access.utils.ChannelObjectUtil; import com.njcn.access.utils.ChannelObjectUtil;
import com.njcn.access.utils.MqttUtil; import com.njcn.access.utils.MqttUtil;
import com.njcn.common.pojo.dto.DeviceLogDTO;
import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.exception.BusinessException; import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.csdevice.api.*; import com.njcn.csdevice.api.*;
@@ -39,7 +38,7 @@ import com.njcn.user.api.UserFeignClient;
import com.njcn.user.enums.AppRoleEnum; import com.njcn.user.enums.AppRoleEnum;
import com.njcn.user.pojo.vo.UserVO; import com.njcn.user.pojo.vo.UserVO;
import com.njcn.web.utils.RequestUtil; import com.njcn.web.utils.RequestUtil;
import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -58,12 +57,11 @@ import java.util.stream.Collectors;
* @createTime 2023/7/4 13:43 * @createTime 2023/7/4 13:43
*/ */
@Service @Service
@AllArgsConstructor @RequiredArgsConstructor
@Slf4j @Slf4j
public class CsDeviceServiceImpl implements ICsDeviceService { public class CsDeviceServiceImpl implements ICsDeviceService {
private static final Logger logger = LoggerFactory.getLogger(CsDeviceServiceImpl.class); private static final Logger logger = LoggerFactory.getLogger(CsDeviceServiceImpl.class);
private final EquipmentFeignClient equipmentFeignClient; private final EquipmentFeignClient equipmentFeignClient;
private final ICsEquipmentDeliveryService csEquipmentDeliveryService; private final ICsEquipmentDeliveryService csEquipmentDeliveryService;
private final DictTreeFeignClient dictTreeFeignClient; private final DictTreeFeignClient dictTreeFeignClient;
@@ -92,6 +90,7 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
private final CsHarmonicPlanLineFeignClient csHarmonicPlanLineFeignClient; private final CsHarmonicPlanLineFeignClient csHarmonicPlanLineFeignClient;
private final LogMessageTemplate logMessageTemplate; private final LogMessageTemplate logMessageTemplate;
@Override @Override
@Transactional(rollbackFor = {Exception.class}) @Transactional(rollbackFor = {Exception.class})
public void devRegister(String nDid,Integer type) { public void devRegister(String nDid,Integer type) {
@@ -99,7 +98,6 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
LogMessage message = new LogMessage(); LogMessage message = new LogMessage();
message.setUserIndex(RequestUtil.getUserNickname()); message.setUserIndex(RequestUtil.getUserNickname());
message.setLoginName(RequestUtil.getUsername()); message.setLoginName(RequestUtil.getUsername());
message.setResult(1);
//1.判断客户端是否在线 //1.判断客户端是否在线
String clientName = "NJCN-" + nDid.substring(nDid.length() - 6); String clientName = "NJCN-" + nDid.substring(nDid.length() - 6);
boolean mqttClient = mqttUtil.judgeClientOnline(clientName); boolean mqttClient = mqttUtil.judgeClientOnline(clientName);
@@ -170,8 +168,6 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
} }
String devModel = dictData.getCode(); String devModel = dictData.getCode();
zhiLianRegister(nDid,devModel); zhiLianRegister(nDid,devModel);
message.setOperate("直连装置"+nDid+"下发注册报文");
logMessageTemplate.sendMember(message);
} }
@Override @Override
@@ -180,13 +176,18 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
LogMessage logDto = new LogMessage(); LogMessage logDto = new LogMessage();
logDto.setUserIndex(RequestUtil.getUserNickname()); logDto.setUserIndex(RequestUtil.getUserNickname());
logDto.setLoginName(RequestUtil.getUsername()); logDto.setLoginName(RequestUtil.getUsername());
logDto.setOperate("获取"+nDid+"装置模板信息"); logDto.setOperate("注册阶段:获取"+nDid+"装置模板信息");
logDto.setResult(1); logDto.setResult(1);
Object model = null; Object model = null;
try { try {
Thread.sleep(3000);
String key = AppRedisKey.LINE + nDid; String key = AppRedisKey.LINE + nDid;
model = redisUtil.getObjectByKey(key); model = redisUtil.getObjectByKey(key);
for (int i = 0; i < 3 ; i++) {
Thread.sleep(1000);
if (!Objects.isNull(model)){
break;
}
}
if (Objects.isNull(model)){ if (Objects.isNull(model)){
logDto.setResult(0); logDto.setResult(0);
logDto.setFailReason(AccessResponseEnum.MODEL_MISS.getMessage()); logDto.setFailReason(AccessResponseEnum.MODEL_MISS.getMessage());
@@ -201,14 +202,14 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
} }
@Override @Override
@Transactional(rollbackFor = {Exception.class}) // @Transactional(rollbackFor = {Exception.class})
//fixme 这边事务不起作用,中途出错会导致数据部分录入,再次接入会报主键冲突,所以暂时加了个重置按钮,清空台账数据的 //fixme 这边事务不起作用,中途出错会导致数据部分录入,再次接入会报主键冲突,所以暂时加了个重置按钮,清空台账数据的
public void devAccess(DevAccessParam devAccessParam) { public void devAccess(DevAccessParam devAccessParam) {
//日志实体 //日志实体
LogMessage logDto = new LogMessage(); LogMessage logDto = new LogMessage();
logDto.setUserIndex(RequestUtil.getUserNickname()); logDto.setUserIndex(RequestUtil.getUserNickname());
logDto.setLoginName(RequestUtil.getUsername()); logDto.setLoginName(RequestUtil.getUsername());
logDto.setOperate("装置"+devAccessParam.getNDid()+"接入"); logDto.setOperate("系统端向装置"+devAccessParam.getNDid()+"发送接入请求");
logDto.setResult(1); logDto.setResult(1);
try { try {
//获取版本 //获取版本
@@ -318,14 +319,10 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
po.setSubUserId(RequestUtil.getUserIndex()); po.setSubUserId(RequestUtil.getUserIndex());
po.setDeviceId(vo.getId()); po.setDeviceId(vo.getId());
csDeviceUserService.saveBatch(Collections.singletonList(po)); csDeviceUserService.saveBatch(Collections.singletonList(po));
//6.修改装置状态;修改装置接入的工程、项目 //6.删除redis监测点模板信息
csEquipmentDeliveryService.updateStatusBynDid(devAccessParam.getNDid(), AccessEnum.REGISTERED.getCode(),devAccessParam.getEngineeringId(), devAccessParam.getProjectId());
//7.发起自动接入请求
devAccessAskTemplate(devAccessParam.getNDid(),version,1);
//8.删除redis监测点模板信息
redisUtil.delete(AppRedisKey.MODEL + devAccessParam.getNDid()); redisUtil.delete(AppRedisKey.MODEL + devAccessParam.getNDid());
redisUtil.delete(AppRedisKey.LINE + devAccessParam.getNDid()); redisUtil.delete(AppRedisKey.LINE + devAccessParam.getNDid());
//9.存储装置调试日志表 //7.存储装置调试日志表
CsEquipmentProcessPO csEquipmentProcess = new CsEquipmentProcessPO(); CsEquipmentProcessPO csEquipmentProcess = new CsEquipmentProcessPO();
csEquipmentProcess.setDevId(devAccessParam.getNDid()); csEquipmentProcess.setDevId(devAccessParam.getNDid());
csEquipmentProcess.setOperator(RequestUtil.getUserIndex()); csEquipmentProcess.setOperator(RequestUtil.getUserIndex());
@@ -336,7 +333,7 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
csEquipmentProcess.setStatus(1); csEquipmentProcess.setStatus(1);
} }
processFeignClient.add(csEquipmentProcess); processFeignClient.add(csEquipmentProcess);
//11.这里会出现工程用户接入装置时,如果当前工程用户并没有关注,接入之后应该将用户和工程关联起来 //8.这里会出现工程用户接入装置时,如果当前工程用户并没有关注,接入之后应该将用户和工程关联起来
List<UserVO> users = userFeignClient.getUserVOByIdList(Collections.singletonList(RequestUtil.getUserIndex())).getData(); List<UserVO> users = userFeignClient.getUserVOByIdList(Collections.singletonList(RequestUtil.getUserIndex())).getData();
if (CollectionUtil.isNotEmpty(users)) { if (CollectionUtil.isNotEmpty(users)) {
UserVO userVO = users.get(0); UserVO userVO = users.get(0);
@@ -344,12 +341,23 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
csMarketDataFeignClient.insertData(userVO.getId(), devAccessParam.getEngineeringId()); csMarketDataFeignClient.insertData(userVO.getId(), devAccessParam.getEngineeringId());
} }
} }
//9.修改装置状态;修改装置接入的工程、项目
csEquipmentDeliveryService.updateStatusBynDid(devAccessParam.getNDid(), AccessEnum.REGISTERED.getCode(),devAccessParam.getEngineeringId(), devAccessParam.getProjectId());
//10.存储日志 //10.存储日志
logMessageTemplate.sendMember(logDto); logMessageTemplate.sendMember(logDto);
//11.发起自动接入请求
devAccessAskTemplate(devAccessParam.getNDid(),version,1);
} catch (Exception e) { } catch (Exception e) {
logDto.setResult(0); logDto.setResult(0);
logDto.setFailReason(e.getMessage()); logDto.setFailReason(e.getMessage());
logMessageTemplate.sendMember(logDto); logMessageTemplate.sendMember(logDto);
//这边如果发生异常,已经发送接入指令,设备端会响应,这里需要重置
try {
Thread.sleep(1000);
resetFactory(devAccessParam.getNDid());
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
throw new BusinessException(CommonResponseEnum.FAIL); throw new BusinessException(CommonResponseEnum.FAIL);
} }
} }
@@ -359,24 +367,13 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
public void resetFactory(String nDid) { public void resetFactory(String nDid) {
CsEquipmentDeliveryVO csEquipmentDeliveryVO = csEquipmentDeliveryService.queryEquipmentBynDid(nDid); CsEquipmentDeliveryVO csEquipmentDeliveryVO = csEquipmentDeliveryService.queryEquipmentBynDid(nDid);
String devId = csEquipmentDeliveryVO.getId(); String devId = csEquipmentDeliveryVO.getId();
//修改装置状态
DeviceStatusParam param = new DeviceStatusParam(); DeviceStatusParam param = new DeviceStatusParam();
param.setNDid(nDid); param.setNDid(nDid);
param.setStatus(1); param.setStatus(1);
param.setRunStatus(1); param.setRunStatus(1);
// boolean isConnectDev = DicDataEnum.CONNECT_DEV.getCode().equals(dictTreeFeignClient.queryById(csEquipmentDeliveryVO.getDevType()).getData().getCode());
// if (isConnectDev) {
// param.setProcess(2);
// } else {
// param.setProcess(4);
// }
param.setProcess(4); param.setProcess(4);
csEquipmentDeliveryService.devResetFactory(param); csEquipmentDeliveryService.devResetFactory(param);
//清除关系表
QueryWrapper<CsLedger> csLedgerQueryWrapper = new QueryWrapper<>(); QueryWrapper<CsLedger> csLedgerQueryWrapper = new QueryWrapper<>();
/**
* 删除装置
*/
csLedgerQueryWrapper.clear(); csLedgerQueryWrapper.clear();
csLedgerQueryWrapper.eq("id",devId); csLedgerQueryWrapper.eq("id",devId);
csLedgerService.remove(csLedgerQueryWrapper); csLedgerService.remove(csLedgerQueryWrapper);
@@ -403,12 +400,10 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
appLineTopologyDiagramPOQueryWrapper.in("line_id",collect); appLineTopologyDiagramPOQueryWrapper.in("line_id",collect);
appLineTopologyDiagramService.remove(appLineTopologyDiagramPOQueryWrapper); appLineTopologyDiagramService.remove(appLineTopologyDiagramPOQueryWrapper);
} }
//删除topic表
csTopicService.deleteByNDid(nDid);
//清空缓存
redisUtil.deleteKeysByString(AppRedisKey.LINE_POSITION+nDid); redisUtil.deleteKeysByString(AppRedisKey.LINE_POSITION+nDid);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean manualAccess(String nDid) { public boolean manualAccess(String nDid) {
@@ -424,7 +419,7 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
LogMessage logDto = new LogMessage(); LogMessage logDto = new LogMessage();
logDto.setUserIndex(RequestUtil.getUserNickname()); logDto.setUserIndex(RequestUtil.getUserNickname());
logDto.setLoginName(RequestUtil.getUsername()); logDto.setLoginName(RequestUtil.getUsername());
logDto.setOperate("便携式装置"+nDid+"注册、接入"); logDto.setOperate("系统端向便携式装置"+nDid+"发送注册、接入请求");
logDto.setResult(1); logDto.setResult(1);
try { try {
// 装置状态判断 // 装置状态判断
@@ -493,22 +488,23 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
csDevModelRelationAddParm.setModelId(modelList.get(0).getModelId()); csDevModelRelationAddParm.setModelId(modelList.get(0).getModelId());
csDevModelRelationAddParm.setDid(modelList.get(0).getDid()); csDevModelRelationAddParm.setDid(modelList.get(0).getDid());
csDevModelRelationService.addDevModelRelation(csDevModelRelationAddParm); csDevModelRelationService.addDevModelRelation(csDevModelRelationAddParm);
//5.发起自动接入请求
Thread.sleep(2000);
//先获取版本
//String version = csTopicService.getVersion(nDid);
String version = "V1";
devAccessAskTemplate(nDid,version,1);
//6.修改流程,便携式装置接入成功即为实际环境 //6.修改流程,便携式装置接入成功即为实际环境
csEquipmentDeliveryService.updateProcessBynDid(nDid,4); csEquipmentDeliveryService.updateProcessBynDid(nDid,4);
//7.删除redis监测点模板信息 //7.删除redis监测点模板信息
redisUtil.delete(AppRedisKey.MODEL + nDid); redisUtil.delete(AppRedisKey.MODEL + nDid);
redisUtil.delete(AppRedisKey.LINE + nDid); redisUtil.delete(AppRedisKey.LINE + nDid);
//5.发起自动接入请求
Thread.sleep(2000);
String version = "V1";
devAccessAskTemplate(nDid,version,1);
//判断接入状态 //判断接入状态
Thread.sleep(5000);
Object object = redisUtil.getObjectByKey("online" + nDid); Object object = redisUtil.getObjectByKey("online" + nDid);
for (int i = 0; i < 5; i++) {
Thread.sleep(1000);
if (Objects.nonNull(object)) { if (Objects.nonNull(object)) {
result = "success"; result = "success";
break;
}
} }
//8.存储日志 //8.存储日志
logMessageTemplate.sendMember(logDto); logMessageTemplate.sendMember(logDto);
@@ -516,7 +512,13 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
logDto.setResult(0); logDto.setResult(0);
logDto.setFailReason(e.getMessage()); logDto.setFailReason(e.getMessage());
logMessageTemplate.sendMember(logDto); logMessageTemplate.sendMember(logDto);
//这边如果发生异常,已经发送接入指令,设备端会响应,这里需要重置
try {
Thread.sleep(1000);
resetFactory(nDid); resetFactory(nDid);
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
throw new BusinessException(AccessResponseEnum.ACCESS_ERROR); throw new BusinessException(AccessResponseEnum.ACCESS_ERROR);
} }
return result; return result;
@@ -572,6 +574,7 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
logDto.setUserIndex(RequestUtil.getUserNickname()); logDto.setUserIndex(RequestUtil.getUserNickname());
logDto.setLoginName(RequestUtil.getUsername()); logDto.setLoginName(RequestUtil.getUsername());
logDto.setOperate("监测装置"+nDid+"注册、接入"); logDto.setOperate("监测装置"+nDid+"注册、接入");
logDto.setOperate("系统端向监测装置端"+nDid+"发送注册、接入请求");
logDto.setResult(1); logDto.setResult(1);
try { try {
// 装置状态判断 // 装置状态判断
@@ -646,22 +649,24 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
po.setSubUserId(RequestUtil.getUserIndex()); po.setSubUserId(RequestUtil.getUserIndex());
po.setDeviceId(vo.getId()); po.setDeviceId(vo.getId());
csDeviceUserService.saveBatch(Collections.singletonList(po)); csDeviceUserService.saveBatch(Collections.singletonList(po));
//发起自动接入请求
Thread.sleep(2000);
//先获取版本
String version = "V1";
devAccessAskTemplate(nDid,version,1);
//6.修改流程,接入成功即为实际环境 //6.修改流程,接入成功即为实际环境
csEquipmentDeliveryService.updateProcessBynDid(nDid,4); csEquipmentDeliveryService.updateProcessBynDid(nDid,4);
//7.删除redis监测点模板信息 //7.删除redis监测点模板信息
redisUtil.delete(AppRedisKey.MODEL + nDid); redisUtil.delete(AppRedisKey.MODEL + nDid);
redisUtil.delete(AppRedisKey.LINE + nDid); redisUtil.delete(AppRedisKey.LINE + nDid);
//发起自动接入请求
Thread.sleep(2000);
//先获取版本
String version = "V1";
devAccessAskTemplate(nDid,version,1);
//判断接入状态 //判断接入状态
Thread.sleep(5000);
Object object = redisUtil.getObjectByKey("online" + nDid); Object object = redisUtil.getObjectByKey("online" + nDid);
for (int i = 0; i < 5; i++) {
Thread.sleep(1000);
if (Objects.nonNull(object)) { if (Objects.nonNull(object)) {
result = "success"; result = "success";
break;
}
} }
//8.存储日志 //8.存储日志
logMessageTemplate.sendMember(logDto); logMessageTemplate.sendMember(logDto);
@@ -669,7 +674,13 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
logDto.setResult(0); logDto.setResult(0);
logDto.setFailReason(e.getMessage()); logDto.setFailReason(e.getMessage());
logMessageTemplate.sendMember(logDto); logMessageTemplate.sendMember(logDto);
//这边如果发生异常,已经发送接入指令,设备端会响应,这里需要重置
try {
Thread.sleep(1000);
resetFactory(nDid); resetFactory(nDid);
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
throw new BusinessException(e.getMessage()); throw new BusinessException(e.getMessage());
} }
return result; return result;
@@ -784,6 +795,9 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
} }
//发起接入 //发起接入
publisher.send("/Pfm/DevCmd/"+version+"/"+nDid, new Gson().toJson(getJson(mid,TypeEnum.TYPE_5.getCode())),1,false); publisher.send("/Pfm/DevCmd/"+version+"/"+nDid, new Gson().toJson(getJson(mid,TypeEnum.TYPE_5.getCode())),1,false);
logDto.setOperate("系统端向装置端"+nDid+"发送接入请求");
logDto.setResult(1);
logMessageTemplate.sendMember(logDto);
//录波任务倒计时 //录波任务倒计时
redisUtil.saveByKeyWithExpire("startFile:" + nDid,null,60L); redisUtil.saveByKeyWithExpire("startFile:" + nDid,null,60L);
result = true; result = true;
@@ -963,6 +977,13 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
reqAndResParam.setExpire(-1); reqAndResParam.setExpire(-1);
logger.info("询问主题报文为:{}", new Gson().toJson(reqAndResParam)); logger.info("询问主题报文为:{}", new Gson().toJson(reqAndResParam));
publisher.send("/Pfm/DevTopic/"+nDid, new Gson().toJson(reqAndResParam),1,false); publisher.send("/Pfm/DevTopic/"+nDid, new Gson().toJson(reqAndResParam),1,false);
//记录日志
LogMessage logDto = new LogMessage();
logDto.setUserIndex("系统");
logDto.setLoginName("系统");
logDto.setOperate("系统端向装置端"+nDid+"发送主题询问报文");
logDto.setResult(1);
logMessageTemplate.sendMember(logDto);
} }
/** /**
@@ -983,5 +1004,12 @@ public class CsDeviceServiceImpl implements ICsDeviceService {
reqAndResParam.setMsg(accessDto); reqAndResParam.setMsg(accessDto);
logger.info("注册报文为:{}", new Gson().toJson(reqAndResParam)); logger.info("注册报文为:{}", new Gson().toJson(reqAndResParam));
publisher.send("/Pfm/DevReg/"+nDid, new Gson().toJson(reqAndResParam),1,false); publisher.send("/Pfm/DevReg/"+nDid, new Gson().toJson(reqAndResParam),1,false);
//记录日志
LogMessage logDto = new LogMessage();
logDto.setUserIndex("系统");
logDto.setLoginName("系统");
logDto.setOperate("系统端向装置端"+nDid+"发送注册请求");
logDto.setResult(1);
logMessageTemplate.sendMember(logDto);
} }
} }

View File

@@ -16,7 +16,6 @@ import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -101,6 +100,7 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl<CsEquipmentDeliv
List<CsEquipmentDeliveryPO> result = new ArrayList<>(); List<CsEquipmentDeliveryPO> result = new ArrayList<>();
List<CsEquipmentDeliveryPO> list = this.lambdaQuery() List<CsEquipmentDeliveryPO> list = this.lambdaQuery()
.ne(CsEquipmentDeliveryPO::getRunStatus,AccessEnum.DEL.getCode()) .ne(CsEquipmentDeliveryPO::getRunStatus,AccessEnum.DEL.getCode())
.ne(CsEquipmentDeliveryPO::getStatus,AccessEnum.UNREGISTERED.getCode())
.eq(CsEquipmentDeliveryPO::getUsageStatus,1) .eq(CsEquipmentDeliveryPO::getUsageStatus,1)
.list(); .list();
if (CollUtil.isNotEmpty(list)) { if (CollUtil.isNotEmpty(list)) {
@@ -130,7 +130,7 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl<CsEquipmentDeliv
List<CsEquipmentDeliveryPO> list = this.lambdaQuery() List<CsEquipmentDeliveryPO> list = this.lambdaQuery()
.eq(CsEquipmentDeliveryPO::getRunStatus,AccessEnum.OFFLINE.getCode()) .eq(CsEquipmentDeliveryPO::getRunStatus,AccessEnum.OFFLINE.getCode())
.eq(CsEquipmentDeliveryPO::getUsageStatus,1) .eq(CsEquipmentDeliveryPO::getUsageStatus,1)
.in(CsEquipmentDeliveryPO::getStatus, Arrays.asList(2,3)) .ne(CsEquipmentDeliveryPO::getStatus,AccessEnum.UNREGISTERED.getCode())
.isNull(CsEquipmentDeliveryPO::getNodeId) .isNull(CsEquipmentDeliveryPO::getNodeId)
.list(); .list();
if (CollUtil.isNotEmpty(list)) { if (CollUtil.isNotEmpty(list)) {