package com.malk.tonglibo.utils; import com.malk.tonglibo.entity.MachineData; import org.springframework.stereotype.Component; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * 功能: * 作者:hanxue * 日期:2025/10/20 9:34 */ @Component public class ChangeDetector { // 存储每个设备最新的数据指纹 private final Map lastFingerprintMap = new ConcurrentHashMap<>(); /** * 判断当前数据是否为新状态(MD5 指纹不同) */ public boolean isChanged(MachineData data) { String machineNo = data.getMachineNo(); String fingerprint = generateFingerprint(data); String lastFingerprint = lastFingerprintMap.get(machineNo); if (lastFingerprint == null) { return true; // 第一次上报,算变化 } return !lastFingerprint.equals(fingerprint); } /** * 记录当前指纹为最新状态 */ public void recordAsCurrent(String machineNo, String fingerprint) { lastFingerprintMap.put(machineNo, fingerprint); } String concatFields(MachineData data) { return new StringBuilder() .append(defaultString(data.getJqyxsh())) .append(defaultString(data.getZcn())) .append(defaultString(data.getZqsj())) .append(defaultString(data.getSgdyl())) .append(defaultString(data.getXgdyl())) .append(defaultString(data.getYskqyl1())) .append(defaultString(data.getYskqyl2())) .append(defaultString(data.getZymwd1())) .append(defaultString(data.getZymwd2())) .append(defaultString(data.getZymwd3())) .append(defaultString(data.getZymwd4())) .append(defaultString(data.getSmwd1())) .append(defaultString(data.getSmwd2())) .append(defaultString(data.getSmwd3())) .append(defaultString(data.getSmwd4())) .append(defaultString(data.getXmwd1())) .append(defaultString(data.getXmwd2())) .append(defaultString(data.getXmwd3())) .append(defaultString(data.getXmwd4())) .append(defaultString(data.getXjsj())) .append(defaultString(data.getTssj())) .append(defaultString(data.getZysj())) .append(defaultString(data.getDn())) .toString(); } private String generateFingerprint(MachineData data) { String content = concatFields(data); return MD5Util.md5(content); } private String defaultString(String str) { return str == null ? "" : str; } }