【状态信息对比逻辑】

This commit is contained in:
weizhihong 2023-06-15 09:17:49 +08:00
parent 718e0c7770
commit fe25394e96
2 changed files with 58 additions and 71 deletions

View File

@ -1,12 +1,16 @@
package club.joylink.xiannccda.ats.message.collect;
import club.joylink.xiannccda.dto.protos.DeviceStatusProto;
import com.google.protobuf.Descriptors;
import com.google.protobuf.GeneratedMessageV3;
import com.google.protobuf.Message;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
/**
@ -27,7 +31,7 @@ public class StatusDataRepository {
/**
* 当前所有设备状态信息
*/
private Map<String, StatusDataVO> statusDataVOMap = new ConcurrentHashMap<>();
private Map<String, GeneratedMessageV3.Builder> statusDataVOMap = new ConcurrentHashMap<>();
/**
* 初始化时放入设备状态
@ -44,7 +48,7 @@ public class StatusDataRepository {
* @return 包装的设备状态
*/
public void addDeviceStatus(GeneratedMessageV3.Builder builder) {
deviceStatusBuilder.put(StatusDataVO.getIdVal(ID_NAME, builder), builder);
deviceStatusBuilder.put(getIdVal(ID_NAME, builder), builder);
}
@ -58,9 +62,9 @@ public class StatusDataRepository {
deviceStatusBuilder.forEach((k,v) -> {
Message message = null;
if (statusDataVOMap.containsKey(k)) {
message = statusDataVOMap.get(k).compareAndChange(v);
message = compareAndChange(statusDataVOMap.get(k), v);
} else {
statusDataVOMap.put(k, new StatusDataVO(ID_NAME, v));
statusDataVOMap.put(k, v);
message = v.build();
}
if (message != null) {
@ -69,4 +73,54 @@ public class StatusDataRepository {
});
return resultMessage;
}
/**
* 对比设备状态目前的
*
* @param newStatus 新状态
* @return 变化的字段
*/
public static Message compareAndChange(GeneratedMessageV3.Builder oldStatus, GeneratedMessageV3.Builder newStatus) {
Descriptors.Descriptor descriptor = oldStatus.getDescriptorForType();
String curStatusIdVal = getIdVal(ID_NAME, oldStatus);
String newStatusIdVal = getIdVal(ID_NAME, newStatus);
if (StringUtils.isNotEmpty(curStatusIdVal)
&& StringUtils.isNotEmpty(newStatusIdVal) && !Objects.equals(newStatusIdVal, curStatusIdVal)) {
return null;
}
// 添加主键标识
GeneratedMessageV3.Builder resultBuilder = oldStatus.clone().clear();
resultBuilder.setField(descriptor.findFieldByName(ID_NAME), curStatusIdVal);
// 循环判断字段信息是否一直
boolean change = false;
List<Descriptors.FieldDescriptor> fieldDescriptorList = descriptor.getFields().stream()
.filter(f -> !f.getName().equals(ID_NAME)).toList();
for (Descriptors.FieldDescriptor field : fieldDescriptorList) {
if (!Objects.equals(oldStatus.getField(field), newStatus.getField(field))) {
change = true;
oldStatus.setField(field, newStatus.getField(field));
resultBuilder.setField(field, newStatus.getField(field));
}
}
return change ? resultBuilder.build() : null;
}
/**
* 获取主键值
* @param idName 主键字段标识
* @param statusProto 数据信息
* @return 主键
*/
public static String getIdVal(String idName, GeneratedMessageV3.Builder statusProto) {
return String.valueOf(statusProto.getField(statusProto.getDescriptorForType().findFieldByName(idName)));
}
public static void main(String[] args) {
DeviceStatusProto.Signal.Builder signal1 = DeviceStatusProto.Signal.newBuilder();
signal1.setApproachLock(false);
DeviceStatusProto.Signal.Builder signal2 = DeviceStatusProto.Signal.newBuilder();
signal2.setApproachLock(true);
System.out.println(compareAndChange(signal1, signal2));
}
}

View File

@ -1,67 +0,0 @@
package club.joylink.xiannccda.ats.message.collect;
import com.google.protobuf.Descriptors;
import com.google.protobuf.GeneratedMessageV3;
import com.google.protobuf.Message;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Objects;
/**
* 状态数据
*/
@Getter
public record StatusDataVO(String idName, GeneratedMessageV3.Builder statusProto) {
/**
* 状态数据
*
* @param idName 主键标识
* @param statusProto 状态信息
*/
public StatusDataVO {
}
/**
* 对比设备状态目前的
*
* @param newStatus 新状态
* @return 变化的字段
*/
public Message compareAndChange(GeneratedMessageV3.Builder newStatus) {
Descriptors.Descriptor descriptor = statusProto.getDescriptorForType();
String curStatusIdVal = getIdVal(idName, statusProto);
String newStatusIdVal = getIdVal(idName, newStatus);
if (StringUtils.isNotEmpty(curStatusIdVal)
&& StringUtils.isNotEmpty(newStatusIdVal) && !Objects.equals(newStatusIdVal, curStatusIdVal)) {
return null;
}
// 添加主键标识
GeneratedMessageV3.Builder resultBuilder = statusProto.clone().clear();
resultBuilder.setField(descriptor.findFieldByName(idName), curStatusIdVal);
// 循环判断字段信息是否一直
boolean change = false;
List<Descriptors.FieldDescriptor> fieldDescriptorList = descriptor.getFields().stream()
.filter(f -> !f.getName().equals(idName)).toList();
for (Descriptors.FieldDescriptor field : fieldDescriptorList) {
if (!Objects.equals(statusProto.getField(field), newStatus.getField(field))) {
change = true;
statusProto.setField(field, newStatus.getField(field));
resultBuilder.setField(field, newStatus.getField(field));
}
}
return change ? resultBuilder.build() : null;
}
/**
* 获取主键值
* @param idName 主键字段标识
* @param statusProto 数据信息
* @return 主键
*/
public static String getIdVal(String idName, GeneratedMessageV3.Builder statusProto) {
return String.valueOf(statusProto.getField(statusProto.getDescriptorForType().findFieldByName(idName)));
}
}