From c32622659a8c15270277616ba6971ce58e57f76f Mon Sep 17 00:00:00 2001 From: jsowell <123@jsowell.com> Date: Wed, 10 Jun 2026 16:41:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=85=E7=94=B5=E6=A1=A9?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=89=88=E6=9C=AC=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ykc/PileMainboardManufacturerEnum.java | 33 ++++ .../common/util/PileProgramVersionUtils.java | 145 ++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 jsowell-common/src/main/java/com/jsowell/common/enums/ykc/PileMainboardManufacturerEnum.java create mode 100644 jsowell-common/src/main/java/com/jsowell/common/util/PileProgramVersionUtils.java diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/PileMainboardManufacturerEnum.java b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/PileMainboardManufacturerEnum.java new file mode 100644 index 000000000..f36651276 --- /dev/null +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/PileMainboardManufacturerEnum.java @@ -0,0 +1,33 @@ +package com.jsowell.common.enums.ykc; + +/** + * 充电桩主板厂家 + */ +public enum PileMainboardManufacturerEnum { + UNKNOWN("unknown", "未知厂家"), + ; + + private String value; + private String label; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + PileMainboardManufacturerEnum(String value, String label) { + this.value = value; + this.label = label; + } +} diff --git a/jsowell-common/src/main/java/com/jsowell/common/util/PileProgramVersionUtils.java b/jsowell-common/src/main/java/com/jsowell/common/util/PileProgramVersionUtils.java new file mode 100644 index 000000000..5e825c225 --- /dev/null +++ b/jsowell-common/src/main/java/com/jsowell/common/util/PileProgramVersionUtils.java @@ -0,0 +1,145 @@ +package com.jsowell.common.util; + +import com.google.common.collect.Lists; +import com.jsowell.common.enums.ykc.PileMainboardManufacturerEnum; + +import java.util.List; +import java.util.Locale; +import java.util.regex.Pattern; + +/** + * 充电桩程序版本工具类 + */ +public final class PileProgramVersionUtils { + private static final List MANUFACTURER_RULES = Lists.newArrayList(); + + static { + // 后续厂家版本号特征明确后,在这里补充规则。 + // 示例:MANUFACTURER_RULES.add(ManufacturerRule.prefix(PileMainboardManufacturerEnum.UNKNOWN, "c6-30")); + } + + private PileProgramVersionUtils() { + } + + /** + * 标准化0x01登录帧中的程序版本,去掉ASCII补零。 + * + * @param programVersion 程序版本 + * @return 标准化后的程序版本 + */ + public static String normalize(String programVersion) { + if (StringUtils.isBlank(programVersion)) { + return null; + } + String normalized = programVersion.replace("\u0000", "").trim(); + return StringUtils.isBlank(normalized) ? null : normalized; + } + + /** + * 根据程序版本识别主板厂家。 + * + * @param programVersion 程序版本 + * @return 主板厂家 + */ + public static PileMainboardManufacturerEnum getMainboardManufacturer(String programVersion) { + String normalizedProgramVersion = normalize(programVersion); + if (StringUtils.isBlank(normalizedProgramVersion)) { + return PileMainboardManufacturerEnum.UNKNOWN; + } + + for (ManufacturerRule rule : MANUFACTURER_RULES) { + if (rule.matches(normalizedProgramVersion)) { + return rule.getManufacturer(); + } + } + return PileMainboardManufacturerEnum.UNKNOWN; + } + + public static String getMainboardManufacturerValue(String programVersion) { + return getMainboardManufacturer(programVersion).getValue(); + } + + public static String getMainboardManufacturerLabel(String programVersion) { + return getMainboardManufacturer(programVersion).getLabel(); + } + + public static boolean isManufacturer(String programVersion, PileMainboardManufacturerEnum manufacturer) { + if (manufacturer == null) { + return false; + } + return getMainboardManufacturer(programVersion) == manufacturer; + } + + private enum MatchType { + EQUALS, + PREFIX, + CONTAINS, + REGEX + } + + private static class ManufacturerRule { + private final PileMainboardManufacturerEnum manufacturer; + private final MatchType matchType; + private final List features; + + private ManufacturerRule(PileMainboardManufacturerEnum manufacturer, MatchType matchType, List features) { + this.manufacturer = manufacturer; + this.matchType = matchType; + this.features = features; + } + + private static ManufacturerRule equals(PileMainboardManufacturerEnum manufacturer, String... features) { + return new ManufacturerRule(manufacturer, MatchType.EQUALS, Lists.newArrayList(features)); + } + + private static ManufacturerRule prefix(PileMainboardManufacturerEnum manufacturer, String... features) { + return new ManufacturerRule(manufacturer, MatchType.PREFIX, Lists.newArrayList(features)); + } + + private static ManufacturerRule contains(PileMainboardManufacturerEnum manufacturer, String... features) { + return new ManufacturerRule(manufacturer, MatchType.CONTAINS, Lists.newArrayList(features)); + } + + private static ManufacturerRule regex(PileMainboardManufacturerEnum manufacturer, String... features) { + return new ManufacturerRule(manufacturer, MatchType.REGEX, Lists.newArrayList(features)); + } + + private PileMainboardManufacturerEnum getManufacturer() { + return manufacturer; + } + + private boolean matches(String programVersion) { + if (manufacturer == null || matchType == null || StringUtils.isBlank(programVersion) || StringUtils.isEmpty(features)) { + return false; + } + for (String feature : features) { + if (matchesFeature(programVersion, feature)) { + return true; + } + } + return false; + } + + private boolean matchesFeature(String programVersion, String feature) { + if (StringUtils.isBlank(feature)) { + return false; + } + if (matchType == MatchType.REGEX) { + return Pattern.compile(feature, Pattern.CASE_INSENSITIVE).matcher(programVersion).find(); + } + + String lowerProgramVersion = programVersion.toLowerCase(Locale.ROOT); + String lowerFeature = feature.toLowerCase(Locale.ROOT); + if (matchType == MatchType.EQUALS) { + return StringUtils.equals(lowerProgramVersion, lowerFeature); + } + if (matchType == MatchType.PREFIX) { + return lowerProgramVersion.startsWith(lowerFeature); + } + if (matchType == MatchType.CONTAINS) { + return lowerProgramVersion.contains(lowerFeature); + } + return false; + } + } +}