添加充电桩程序版本工具类

This commit is contained in:
jsowell
2026-06-10 16:41:02 +08:00
parent 12685f528b
commit c32622659a
2 changed files with 178 additions and 0 deletions

View File

@@ -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;
}
}

View File

@@ -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<ManufacturerRule> 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<String> features;
private ManufacturerRule(PileMainboardManufacturerEnum manufacturer, MatchType matchType, List<String> 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;
}
}
}