ChangeDetector.java 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package com.malk.tonglibo.utils;
  2. import com.malk.tonglibo.entity.MachineData;
  3. import org.springframework.stereotype.Component;
  4. import java.util.Map;
  5. import java.util.concurrent.ConcurrentHashMap;
  6. /**
  7. * 功能:
  8. * 作者:hanxue
  9. * 日期:2025/10/20 9:34
  10. */
  11. @Component
  12. public class ChangeDetector {
  13. // 存储每个设备最新的数据指纹
  14. private final Map<String, String> lastFingerprintMap = new ConcurrentHashMap<>();
  15. /**
  16. * 判断当前数据是否为新状态(MD5 指纹不同)
  17. */
  18. public boolean isChanged(MachineData data) {
  19. String machineNo = data.getMachineNo();
  20. String fingerprint = generateFingerprint(data);
  21. String lastFingerprint = lastFingerprintMap.get(machineNo);
  22. if (lastFingerprint == null) {
  23. return true; // 第一次上报,算变化
  24. }
  25. return !lastFingerprint.equals(fingerprint);
  26. }
  27. /**
  28. * 记录当前指纹为最新状态
  29. */
  30. public void recordAsCurrent(String machineNo, String fingerprint) {
  31. lastFingerprintMap.put(machineNo, fingerprint);
  32. }
  33. String concatFields(MachineData data) {
  34. return new StringBuilder()
  35. .append(defaultString(data.getJqyxsh()))
  36. .append(defaultString(data.getZcn()))
  37. .append(defaultString(data.getZqsj()))
  38. .append(defaultString(data.getSgdyl()))
  39. .append(defaultString(data.getXgdyl()))
  40. .append(defaultString(data.getYskqyl1()))
  41. .append(defaultString(data.getYskqyl2()))
  42. .append(defaultString(data.getZymwd1()))
  43. .append(defaultString(data.getZymwd2()))
  44. .append(defaultString(data.getZymwd3()))
  45. .append(defaultString(data.getZymwd4()))
  46. .append(defaultString(data.getSmwd1()))
  47. .append(defaultString(data.getSmwd2()))
  48. .append(defaultString(data.getSmwd3()))
  49. .append(defaultString(data.getSmwd4()))
  50. .append(defaultString(data.getXmwd1()))
  51. .append(defaultString(data.getXmwd2()))
  52. .append(defaultString(data.getXmwd3()))
  53. .append(defaultString(data.getXmwd4()))
  54. .append(defaultString(data.getXjsj()))
  55. .append(defaultString(data.getTssj()))
  56. .append(defaultString(data.getZysj()))
  57. .append(defaultString(data.getDn()))
  58. .toString();
  59. }
  60. private String generateFingerprint(MachineData data) {
  61. String content = concatFields(data);
  62. return MD5Util.md5(content);
  63. }
  64. private String defaultString(String str) {
  65. return str == null ? "" : str;
  66. }
  67. }