fix():车辆报文上报基于模板

master
DongZeLiang 2024-12-12 17:13:19 +08:00
parent b2fc76883d
commit 53370096aa
11 changed files with 1768 additions and 19 deletions

View File

@ -75,7 +75,7 @@ public class VehicleConfigRunner implements ApplicationRunner {
model.getKey(), model.getMessageName(), model.getMessageTemplateValueList().size(), model.getKey(), model.getMessageName(), model.getMessageTemplateValueList().size(),
model.getMessageTemplateValueList().isEmpty() ? "不合格,已过滤" : "合格" model.getMessageTemplateValueList().isEmpty() ? "不合格,已过滤" : "合格"
); );
return model.getMessageTemplateValueList().isEmpty(); return !model.getMessageTemplateValueList().isEmpty();
}) })
.forEach(model -> messageTemplateCache.put(model.getKey(), model)); .forEach(model -> messageTemplateCache.put(model.getKey(), model));
log.info("结束初始化加载报文模板耗时:[{}MS]---------------", System.currentTimeMillis() - startTime); log.info("结束初始化加载报文模板耗时:[{}MS]---------------", System.currentTimeMillis() - startTime);

View File

@ -1,5 +1,7 @@
package com.muyu.system.enums; package com.muyu.system.enums;
import java.util.Arrays;
/** /**
* @Author: DongZeLiang * @Author: DongZeLiang
* @date: 2024/9/20 * @date: 2024/9/20
@ -33,4 +35,10 @@ public enum MessageTemplateValueType {
public String label () { public String label () {
return label; return label;
} }
public static MessageTemplateValueType get(String code){
return Arrays.stream(MessageTemplateValueType.values())
.filter(valueType -> valueType.code.equals(code))
.findFirst().orElse(null);
}
} }

View File

@ -0,0 +1,134 @@
package com.muyu.utils;
/**
*
*
* @author muyu
*/
public class Constants {
/**
* UTF-8
*/
public static final String UTF8 = "UTF-8";
/**
* GBK
*/
public static final String GBK = "GBK";
/**
* www
*/
public static final String WWW = "www.";
/**
* RMI
*/
public static final String LOOKUP_RMI = "rmi:";
/**
* LDAP
*/
public static final String LOOKUP_LDAP = "ldap:";
/**
* LDAPS
*/
public static final String LOOKUP_LDAPS = "ldaps:";
/**
* http
*/
public static final String HTTP = "http://";
/**
* https
*/
public static final String HTTPS = "https://";
/**
*
*/
public static final Integer SUCCESS = 200;
/**
*
*/
public static final Integer FAIL = 500;
/**
*
*/
public static final String LOGIN_SUCCESS_STATUS = "0";
/**
*
*/
public static final String LOGIN_FAIL_STATUS = "1";
/**
*
*/
public static final String LOGIN_SUCCESS = "Success";
/**
*
*/
public static final String LOGOUT = "Logout";
/**
*
*/
public static final String REGISTER = "Register";
/**
*
*/
public static final String LOGIN_FAIL = "Error";
/**
*
*/
public static final String PAGE_NUM = "pageNum";
/**
*
*/
public static final String PAGE_SIZE = "pageSize";
/**
*
*/
public static final String ORDER_BY_COLUMN = "orderByColumn";
/**
* "desc" "asc".
*/
public static final String IS_ASC = "isAsc";
/**
*
*/
public static final long CAPTCHA_EXPIRATION = 2;
/**
*
*/
public static final String RESOURCE_PREFIX = "/profile";
/**
* json
*/
public static final String[] JSON_WHITELIST_STR = {"org.springframework", "com.muyu"};
/**
* 访
*/
public static final String[] JOB_WHITELIST_STR = {"com.muyu"};
/**
*
*/
public static final String[] JOB_ERROR_STR = {"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
"org.springframework", "org.apache", "com.muyu.common.core.utils.file"};
}

View File

@ -0,0 +1,503 @@
package com.muyu.utils;
import com.muyu.utils.text.StrFormatter;
import org.springframework.util.AntPathMatcher;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
*
*
* @author muyu
*/
public class StringUtils extends org.apache.commons.lang3.StringUtils {
/**
*
*/
private static final String NULLSTR = "";
/**
* 线
*/
private static final char SEPARATOR = '_';
/**
*
*
* @param value defaultValue value
*
* @return value
*/
public static <T> T nvl (T value, T defaultValue) {
return value != null ? value : defaultValue;
}
/**
* * Collection ListSetQueue
*
* @param coll Collection
*
* @return true false
*/
public static boolean isEmpty (Collection<?> coll) {
return isNull(coll) || coll.isEmpty();
}
/**
* * CollectionListSetQueue
*
* @param coll Collection
*
* @return true false
*/
public static boolean isNotEmpty (Collection<?> coll) {
return !isEmpty(coll);
}
/**
* *
*
* @param objects
* * @return true false
*/
public static boolean isEmpty (Object[] objects) {
return isNull(objects) || (objects.length == 0);
}
/**
* *
*
* @param objects
*
* @return true false
*/
public static boolean isNotEmpty (Object[] objects) {
return !isEmpty(objects);
}
/**
* * Map
*
* @param map Map
*
* @return true false
*/
public static boolean isEmpty (Map<?, ?> map) {
return isNull(map) || map.isEmpty();
}
/**
* * Map
*
* @param map Map
*
* @return true false
*/
public static boolean isNotEmpty (Map<?, ?> map) {
return !isEmpty(map);
}
/**
* *
*
* @param str String
*
* @return true false
*/
public static boolean isEmpty (String str) {
return isNull(str) || NULLSTR.equals(str.trim());
}
/**
* *
*
* @param str String
*
* @return true false
*/
public static boolean isNotEmpty (String str) {
return !isEmpty(str);
}
/**
* *
*
* @param object Object
*
* @return true false
*/
public static boolean isNull (Object object) {
return object == null;
}
/**
* *
*
* @param object Object
*
* @return true false
*/
public static boolean isNotNull (Object object) {
return !isNull(object);
}
/**
* * Java
*
* @param object
*
* @return true false
*/
public static boolean isArray (Object object) {
return isNotNull(object) && object.getClass().isArray();
}
/**
*
*/
public static String trim (String str) {
return (str == null ? "" : str.trim());
}
/**
*
*
* @param str
* @param start
*
* @return
*/
public static String substring (final String str, int start) {
if (str == null) {
return NULLSTR;
}
if (start < 0) {
start = str.length() + start;
}
if (start < 0) {
start = 0;
}
if (start > str.length()) {
return NULLSTR;
}
return str.substring(start);
}
/**
*
*
* @param str
* @param start
* @param end
*
* @return
*/
public static String substring (final String str, int start, int end) {
if (str == null) {
return NULLSTR;
}
if (end < 0) {
end = str.length() + end;
}
if (start < 0) {
start = str.length() + start;
}
if (end > str.length()) {
end = str.length();
}
if (start > end) {
return NULLSTR;
}
if (start < 0) {
start = 0;
}
if (end < 0) {
end = 0;
}
return str.substring(start, end);
}
/**
*
*
* @param str value
*
* @return
*/
public static boolean hasText (String str) {
return (str != null && !str.isEmpty() && containsText(str));
}
private static boolean containsText (CharSequence str) {
int strLen = str.length();
for (int i = 0 ; i < strLen ; i++) {
if (!Character.isWhitespace(str.charAt(i))) {
return true;
}
}
return false;
}
/**
* , {} <br>
* {} <br>
* {} 使 \\ { {} \ 使 \\\\ <br>
* <br>
* 使format("this is {} for {}", "a", "b") -> this is a for b<br>
* {} format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
* \ format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
*
* @param template {}
* @param params
*
* @return
*/
public static String format (String template, Object... params) {
if (isEmpty(params) || isEmpty(template)) {
return template;
}
return StrFormatter.format(template, params);
}
/**
* http(s)://开头
*
* @param link
*
* @return
*/
public static boolean ishttp (String link) {
return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS);
}
/**
* collectionarray arrayvalue
*
* @param collection
* @param array
*
* @return boolean
*/
public static boolean containsAny (Collection<String> collection, String... array) {
if (isEmpty(collection) || isEmpty(array)) {
return false;
} else {
for (String str : array) {
if (collection.contains(str)) {
return true;
}
}
return false;
}
}
/**
* 线
*/
public static String toUnderScoreCase (String str) {
if (str == null) {
return null;
}
StringBuilder sb = new StringBuilder();
// 前置字符是否大写
boolean preCharIsUpperCase = true;
// 当前字符是否大写
boolean curreCharIsUpperCase = true;
// 下一字符是否大写
boolean nexteCharIsUpperCase = true;
for (int i = 0 ; i < str.length() ; i++) {
char c = str.charAt(i);
if (i > 0) {
preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
} else {
preCharIsUpperCase = false;
}
curreCharIsUpperCase = Character.isUpperCase(c);
if (i < (str.length() - 1)) {
nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
}
if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) {
sb.append(SEPARATOR);
} else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) {
sb.append(SEPARATOR);
}
sb.append(Character.toLowerCase(c));
}
return sb.toString();
}
/**
*
*
* @param str
* @param strs
*
* @return true
*/
public static boolean inStringIgnoreCase (String str, String... strs) {
if (str != null && strs != null) {
for (String s : strs) {
if (str.equalsIgnoreCase(trim(s))) {
return true;
}
}
}
return false;
}
/**
* 线线 HELLO_WORLD->HelloWorld
*
* @param name 线
*
* @return
*/
public static String convertToCamelCase (String name) {
StringBuilder result = new StringBuilder();
// 快速检查
if (name == null || name.isEmpty()) {
// 没必要转换
return "";
} else if (!name.contains("_")) {
// 不含下划线,仅将首字母大写
return name.substring(0, 1).toUpperCase() + name.substring(1);
}
// 用下划线将原始字符串分割
String[] camels = name.split("_");
for (String camel : camels) {
// 跳过原始字符串中开头、结尾的下换线或双重下划线
if (camel.isEmpty()) {
continue;
}
// 首字母大写
result.append(camel.substring(0, 1).toUpperCase());
result.append(camel.substring(1).toLowerCase());
}
return result.toString();
}
/**
*
* user_name->userName
*/
public static String toCamelCase (String s) {
if (s == null) {
return null;
}
if (s.indexOf(SEPARATOR) == -1) {
return s;
}
s = s.toLowerCase();
StringBuilder sb = new StringBuilder(s.length());
boolean upperCase = false;
for (int i = 0 ; i < s.length() ; i++) {
char c = s.charAt(i);
if (c == SEPARATOR) {
upperCase = true;
} else if (upperCase) {
sb.append(Character.toUpperCase(c));
upperCase = false;
} else {
sb.append(c);
}
}
return sb.toString();
}
/**
*
*
* @param str
* @param strs
*
* @return
*/
public static boolean matches (String str, List<String> strs) {
if (isEmpty(str) || isEmpty(strs)) {
return false;
}
for (String pattern : strs) {
if (isMatch(pattern, str)) {
return true;
}
}
return false;
}
/**
* url:
* ? ;
* * ;
* ** ;
*
* @param pattern
* @param url url
*
* @return
*/
public static boolean isMatch (String pattern, String url) {
AntPathMatcher matcher = new AntPathMatcher();
return matcher.match(pattern, url);
}
@SuppressWarnings("unchecked")
public static <T> T cast (Object obj) {
return (T) obj;
}
/**
* 0使size size
*
* @param num
* @param size
*
* @return
*/
public static final String padl (final Number num, final int size) {
return padl(num.toString(), size, '0');
}
/**
* ssizesize
*
* @param s
* @param size
* @param c
*
* @return
*/
public static final String padl (final String s, final int size, final char c) {
final StringBuilder sb = new StringBuilder(size);
if (s != null) {
final int len = s.length();
if (s.length() <= size) {
for (int i = size - len ; i > 0 ; i--) {
sb.append(c);
}
sb.append(s);
} else {
return s.substring(len - size, len);
}
} else {
for (int i = size ; i > 0 ; i--) {
sb.append(c);
}
}
return sb.toString();
}
}

View File

@ -0,0 +1,95 @@
package com.muyu.utils.text;
import com.muyu.utils.StringUtils;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
/**
*
*
* @author muyu
*/
public class CharsetKit {
/**
* ISO-8859-1
*/
public static final String ISO_8859_1 = "ISO-8859-1";
/**
* UTF-8
*/
public static final String UTF_8 = "UTF-8";
/**
* GBK
*/
public static final String GBK = "GBK";
/**
* ISO-8859-1
*/
public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1);
/**
* UTF-8
*/
public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8);
/**
* GBK
*/
public static final Charset CHARSET_GBK = Charset.forName(GBK);
/**
* Charset
*
* @param charset
*
* @return Charset
*/
public static Charset charset (String charset) {
return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
}
/**
*
*
* @param source
* @param srcCharset ISO-8859-1
* @param destCharset UTF-8
*
* @return
*/
public static String convert (String source, String srcCharset, String destCharset) {
return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
}
/**
*
*
* @param source
* @param srcCharset ISO-8859-1
* @param destCharset UTF-8
*
* @return
*/
public static String convert (String source, Charset srcCharset, Charset destCharset) {
if (null == srcCharset) {
srcCharset = StandardCharsets.ISO_8859_1;
}
if (null == destCharset) {
destCharset = StandardCharsets.UTF_8;
}
if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) {
return source;
}
return new String(source.getBytes(srcCharset), destCharset);
}
/**
* @return
*/
public static String systemCharset () {
return Charset.defaultCharset().name();
}
}

View File

@ -0,0 +1,904 @@
package com.muyu.utils.text;
import com.muyu.utils.StringUtils;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.text.NumberFormat;
import java.util.Set;
/**
*
*
* @author muyu
*/
public class Convert {
/**
* <br>
* null<br>
*
*
* @param value
* @param defaultValue
*
* @return
*/
public static String toStr (Object value, String defaultValue) {
if (null == value) {
return defaultValue;
}
if (value instanceof String) {
return (String) value;
}
return value.toString();
}
/**
* <br>
* <code>null</code><code>null</code><br>
*
*
* @param value
*
* @return
*/
public static String toStr (Object value) {
return toStr(value, null);
}
/**
* <br>
* null<br>
*
*
* @param value
* @param defaultValue
*
* @return
*/
public static Character toChar (Object value, Character defaultValue) {
if (null == value) {
return defaultValue;
}
if (value instanceof Character) {
return (Character) value;
}
final String valueStr = toStr(value, null);
return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
}
/**
* <br>
* <code>null</code><code>null</code><br>
*
*
* @param value
*
* @return
*/
public static Character toChar (Object value) {
return toChar(value, null);
}
/**
* byte<br>
* <code>null</code><br>
*
*
* @param value
* @param defaultValue
*
* @return
*/
public static Byte toByte (Object value, Byte defaultValue) {
if (value == null) {
return defaultValue;
}
if (value instanceof Byte) {
return (Byte) value;
}
if (value instanceof Number) {
return ((Number) value).byteValue();
}
final String valueStr = toStr(value, null);
if (StringUtils.isEmpty(valueStr)) {
return defaultValue;
}
try {
return Byte.parseByte(valueStr);
} catch (Exception e) {
return defaultValue;
}
}
/**
* byte<br>
* <code>null</code><code>null</code><br>
*
*
* @param value
*
* @return
*/
public static Byte toByte (Object value) {
return toByte(value, null);
}
/**
* Short<br>
* <code>null</code><br>
*
*
* @param value
* @param defaultValue
*
* @return
*/
public static Short toShort (Object value, Short defaultValue) {
if (value == null) {
return defaultValue;
}
if (value instanceof Short) {
return (Short) value;
}
if (value instanceof Number) {
return ((Number) value).shortValue();
}
final String valueStr = toStr(value, null);
if (StringUtils.isEmpty(valueStr)) {
return defaultValue;
}
try {
return Short.parseShort(valueStr.trim());
} catch (Exception e) {
return defaultValue;
}
}
/**
* Short<br>
* <code>null</code><code>null</code><br>
*
*
* @param value
*
* @return
*/
public static Short toShort (Object value) {
return toShort(value, null);
}
/**
* Number<br>
* <br>
*
*
* @param value
* @param defaultValue
*
* @return
*/
public static Number toNumber (Object value, Number defaultValue) {
if (value == null) {
return defaultValue;
}
if (value instanceof Number) {
return (Number) value;
}
final String valueStr = toStr(value, null);
if (StringUtils.isEmpty(valueStr)) {
return defaultValue;
}
try {
return NumberFormat.getInstance().parse(valueStr);
} catch (Exception e) {
return defaultValue;
}
}
/**
* Number<br>
* <code>null</code><br>
*
*
* @param value
*
* @return
*/
public static Number toNumber (Object value) {
return toNumber(value, null);
}
/**
* int<br>
* <br>
*
*
* @param value
* @param defaultValue
*
* @return
*/
public static Integer toInt (Object value, Integer defaultValue) {
if (value == null) {
return defaultValue;
}
if (value instanceof Integer) {
return (Integer) value;
}
if (value instanceof Number) {
return ((Number) value).intValue();
}
final String valueStr = toStr(value, null);
if (StringUtils.isEmpty(valueStr)) {
return defaultValue;
}
try {
return Integer.parseInt(valueStr.trim());
} catch (Exception e) {
return defaultValue;
}
}
/**
* int<br>
* <code>null</code><code>null</code><br>
*
*
* @param value
*
* @return
*/
public static Integer toInt (Object value) {
return toInt(value, null);
}
/**
* Integer<br>
*
* @param str
*
* @return
*/
public static Integer[] toIntArray (String str) {
return toIntArray(",", str);
}
/**
* Long<br>
*
* @param str
*
* @return
*/
public static Long[] toLongArray (String str) {
return toLongArray(",", str);
}
/**
* Integer<br>
*
* @param split
* @param str
*
* @return
*/
public static Integer[] toIntArray (String split, String str) {
if (StringUtils.isEmpty(str)) {
return new Integer[]{};
}
String[] arr = str.split(split);
final Integer[] ints = new Integer[arr.length];
for (int i = 0 ; i < arr.length ; i++) {
final Integer v = toInt(arr[i], 0);
ints[i] = v;
}
return ints;
}
/**
* Long<br>
*
* @param split
* @param str
*
* @return
*/
public static Long[] toLongArray (String split, String str) {
if (StringUtils.isEmpty(str)) {
return new Long[]{};
}
String[] arr = str.split(split);
final Long[] longs = new Long[arr.length];
for (int i = 0 ; i < arr.length ; i++) {
final Long v = toLong(arr[i], null);
longs[i] = v;
}
return longs;
}
/**
* String<br>
*
* @param str
*
* @return
*/
public static String[] toStrArray (String str) {
return toStrArray(",", str);
}
/**
* String<br>
*
* @param split
* @param str
*
* @return
*/
public static String[] toStrArray (String split, String str) {
return str.split(split);
}
/**
* long<br>
* <br>
*
*
* @param value
* @param defaultValue
*
* @return
*/
public static Long toLong (Object value, Long defaultValue) {
if (value == null) {
return defaultValue;
}
if (value instanceof Long) {
return (Long) value;
}
if (value instanceof Number) {
return ((Number) value).longValue();
}
final String valueStr = toStr(value, null);
if (StringUtils.isEmpty(valueStr)) {
return defaultValue;
}
try {
// 支持科学计数法
return new BigDecimal(valueStr.trim()).longValue();
} catch (Exception e) {
return defaultValue;
}
}
/**
* long<br>
* <code>null</code><code>null</code><br>
*
*
* @param value
*
* @return
*/
public static Long toLong (Object value) {
return toLong(value, null);
}
/**
* double<br>
* <br>
*
*
* @param value
* @param defaultValue
*
* @return
*/
public static Double toDouble (Object value, Double defaultValue) {
if (value == null) {
return defaultValue;
}
if (value instanceof Double) {
return (Double) value;
}
if (value instanceof Number) {
return ((Number) value).doubleValue();
}
final String valueStr = toStr(value, null);
if (StringUtils.isEmpty(valueStr)) {
return defaultValue;
}
try {
// 支持科学计数法
return new BigDecimal(valueStr.trim()).doubleValue();
} catch (Exception e) {
return defaultValue;
}
}
/**
* double<br>
* <code>null</code><br>
*
*
* @param value
*
* @return
*/
public static Double toDouble (Object value) {
return toDouble(value, null);
}
/**
* Float<br>
* <br>
*
*
* @param value
* @param defaultValue
*
* @return
*/
public static Float toFloat (Object value, Float defaultValue) {
if (value == null) {
return defaultValue;
}
if (value instanceof Float) {
return (Float) value;
}
if (value instanceof Number) {
return ((Number) value).floatValue();
}
final String valueStr = toStr(value, null);
if (StringUtils.isEmpty(valueStr)) {
return defaultValue;
}
try {
return Float.parseFloat(valueStr.trim());
} catch (Exception e) {
return defaultValue;
}
}
/**
* Float<br>
* <code>null</code><br>
*
*
* @param value
*
* @return
*/
public static Float toFloat (Object value) {
return toFloat(value, null);
}
/**
* boolean<br>
* Stringtruefalseyesokno1,0 <br>
*
*
* @param value
* @param defaultValue
*
* @return
*/
public static Boolean toBool (Object value, Boolean defaultValue) {
if (value == null) {
return defaultValue;
}
if (value instanceof Boolean) {
return (Boolean) value;
}
String valueStr = toStr(value, null);
if (StringUtils.isEmpty(valueStr)) {
return defaultValue;
}
valueStr = valueStr.trim().toLowerCase();
switch (valueStr) {
case "true":
case "yes":
case "ok":
case "1":
return true;
case "false":
case "no":
case "0":
return false;
default:
return defaultValue;
}
}
/**
* boolean<br>
* <code>null</code><br>
*
*
* @param value
*
* @return
*/
public static Boolean toBool (Object value) {
return toBool(value, null);
}
/**
* Enum<br>
* <br>
*
* @param clazz EnumClass
* @param value
* @param defaultValue
*
* @return Enum
*/
public static <E extends Enum<E>> E toEnum (Class<E> clazz, Object value, E defaultValue) {
if (value == null) {
return defaultValue;
}
if (clazz.isAssignableFrom(value.getClass())) {
@SuppressWarnings("unchecked")
E myE = (E) value;
return myE;
}
final String valueStr = toStr(value, null);
if (StringUtils.isEmpty(valueStr)) {
return defaultValue;
}
try {
return Enum.valueOf(clazz, valueStr);
} catch (Exception e) {
return defaultValue;
}
}
/**
* Enum<br>
* <code>null</code><br>
*
* @param clazz EnumClass
* @param value
*
* @return Enum
*/
public static <E extends Enum<E>> E toEnum (Class<E> clazz, Object value) {
return toEnum(clazz, value, null);
}
/**
* BigInteger<br>
* <br>
*
*
* @param value
* @param defaultValue
*
* @return
*/
public static BigInteger toBigInteger (Object value, BigInteger defaultValue) {
if (value == null) {
return defaultValue;
}
if (value instanceof BigInteger) {
return (BigInteger) value;
}
if (value instanceof Long) {
return BigInteger.valueOf((Long) value);
}
final String valueStr = toStr(value, null);
if (StringUtils.isEmpty(valueStr)) {
return defaultValue;
}
try {
return new BigInteger(valueStr);
} catch (Exception e) {
return defaultValue;
}
}
/**
* BigInteger<br>
* <code>null</code><br>
*
*
* @param value
*
* @return
*/
public static BigInteger toBigInteger (Object value) {
return toBigInteger(value, null);
}
/**
* BigDecimal<br>
* <br>
*
*
* @param value
* @param defaultValue
*
* @return
*/
public static BigDecimal toBigDecimal (Object value, BigDecimal defaultValue) {
if (value == null) {
return defaultValue;
}
if (value instanceof BigDecimal) {
return (BigDecimal) value;
}
if (value instanceof Long) {
return new BigDecimal((Long) value);
}
if (value instanceof Double) {
return BigDecimal.valueOf((Double) value);
}
if (value instanceof Integer) {
return new BigDecimal((Integer) value);
}
final String valueStr = toStr(value, null);
if (StringUtils.isEmpty(valueStr)) {
return defaultValue;
}
try {
return new BigDecimal(valueStr);
} catch (Exception e) {
return defaultValue;
}
}
/**
* BigDecimal<br>
* <br>
*
*
* @param value
*
* @return
*/
public static BigDecimal toBigDecimal (Object value) {
return toBigDecimal(value, null);
}
/**
* <br>
* 1ByteByteBuffer 2Arrays.toString
*
* @param obj
*
* @return
*/
public static String utf8Str (Object obj) {
return str(obj, CharsetKit.CHARSET_UTF_8);
}
/**
* <br>
* 1ByteByteBuffer 2Arrays.toString
*
* @param obj
* @param charsetName
*
* @return
*/
public static String str (Object obj, String charsetName) {
return str(obj, Charset.forName(charsetName));
}
/**
* <br>
* 1ByteByteBuffer 2Arrays.toString
*
* @param obj
* @param charset
*
* @return
*/
public static String str (Object obj, Charset charset) {
if (null == obj) {
return null;
}
if (obj instanceof String) {
return (String) obj;
} else if (obj instanceof byte[] || obj instanceof Byte[]) {
if (obj instanceof byte[]) {
return str((byte[]) obj, charset);
} else {
Byte[] bytes = (Byte[]) obj;
int length = bytes.length;
byte[] dest = new byte[length];
for (int i = 0 ; i < length ; i++) {
dest[i] = bytes[i];
}
return str(dest, charset);
}
} else if (obj instanceof ByteBuffer) {
return str((ByteBuffer) obj, charset);
}
return obj.toString();
}
/**
* byte
*
* @param bytes byte
* @param charset
*
* @return
*/
public static String str (byte[] bytes, String charset) {
return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
}
/**
*
*
* @param data
* @param charset
*
* @return
*/
public static String str (byte[] data, Charset charset) {
if (data == null) {
return null;
}
if (null == charset) {
return new String(data);
}
return new String(data, charset);
}
/**
* byteBuffer
*
* @param data
* @param charset 使
*
* @return
*/
public static String str (ByteBuffer data, String charset) {
if (data == null) {
return null;
}
return str(data, Charset.forName(charset));
}
/**
* byteBuffer
*
* @param data
* @param charset 使
*
* @return
*/
public static String str (ByteBuffer data, Charset charset) {
if (null == charset) {
charset = Charset.defaultCharset();
}
return charset.decode(data).toString();
}
// ----------------------------------------------------------------------- 全角半角转换
/**
*
*
* @param input String.
*
* @return .
*/
public static String toSBC (String input) {
return toSBC(input, null);
}
/**
*
*
* @param input String
* @param notConvertSet
*
* @return .
*/
public static String toSBC (String input, Set<Character> notConvertSet) {
char[] c = input.toCharArray();
for (int i = 0 ; i < c.length ; i++) {
if (null != notConvertSet && notConvertSet.contains(c[i])) {
// 跳过不替换的字符
continue;
}
if (c[i] == ' ') {
c[i] = '\u3000';
} else if (c[i] < '\177') {
c[i] = (char) (c[i] + 65248);
}
}
return new String(c);
}
/**
*
*
* @param input String.
*
* @return
*/
public static String toDBC (String input) {
return toDBC(input, null);
}
/**
*
*
* @param text
* @param notConvertSet
*
* @return
*/
public static String toDBC (String text, Set<Character> notConvertSet) {
char[] c = text.toCharArray();
for (int i = 0 ; i < c.length ; i++) {
if (null != notConvertSet && notConvertSet.contains(c[i])) {
// 跳过不替换的字符
continue;
}
if (c[i] == '\u3000') {
c[i] = ' ';
} else if (c[i] > '\uFF00' && c[i] < '\uFF5F') {
c[i] = (char) (c[i] - 65248);
}
}
return new String(c);
}
/**
*
*
* @param n
*
* @return
*/
public static String digitUppercase (double n) {
String[] fraction = {"角", "分"};
String[] digit = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
String[][] unit = {{"元", "万", "亿"}, {"", "拾", "佰", "仟"}};
String head = n < 0 ? "负" : "";
n = Math.abs(n);
String s = "";
for (int i = 0 ; i < fraction.length ; i++) {
// 优化double计算精度丢失问题
BigDecimal nNum = new BigDecimal(n);
BigDecimal decimal = new BigDecimal(10);
BigDecimal scale = nNum.multiply(decimal).setScale(2, RoundingMode.HALF_EVEN);
double d = scale.doubleValue();
s += (digit[(int) (Math.floor(d * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", "");
}
if (s.length() < 1) {
s = "整";
}
int integerPart = (int) Math.floor(n);
for (int i = 0 ; i < unit[0].length && integerPart > 0 ; i++) {
String p = "";
for (int j = 0 ; j < unit[1].length && n > 0 ; j++) {
p = digit[integerPart % 10] + unit[1][j] + p;
integerPart = integerPart / 10;
}
s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s;
}
return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
}
}

View File

@ -0,0 +1,78 @@
package com.muyu.utils.text;
import com.muyu.utils.StringUtils;
/**
*
*
* @author muyu
*/
public class StrFormatter {
public static final String EMPTY_JSON = "{}";
public static final char C_BACKSLASH = '\\';
public static final char C_DELIM_START = '{';
public static final char C_DELIM_END = '}';
/**
* <br>
* {} <br>
* {} 使 \\ { {} \ 使 \\\\ <br>
* <br>
* 使format("this is {} for {}", "a", "b") -> this is a for b<br>
* {} format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
* \ format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
*
* @param strPattern
* @param argArray
*
* @return
*/
public static String format (final String strPattern, final Object... argArray) {
if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) {
return strPattern;
}
final int strPatternLength = strPattern.length();
// 初始化定义好的长度以获得更好的性能
StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
int handledPosition = 0;
int delimIndex;// 占位符所在位置
for (int argIndex = 0 ; argIndex < argArray.length ; argIndex++) {
delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
if (delimIndex == -1) {
if (handledPosition == 0) {
return strPattern;
} else { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
sbuf.append(strPattern, handledPosition, strPatternLength);
return sbuf.toString();
}
} else {
if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) {
if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) {
// 转义符之前还有一个转义符,占位符依旧有效
sbuf.append(strPattern, handledPosition, delimIndex - 1);
sbuf.append(Convert.utf8Str(argArray[argIndex]));
handledPosition = delimIndex + 2;
} else {
// 占位符被转义
argIndex--;
sbuf.append(strPattern, handledPosition, delimIndex - 1);
sbuf.append(C_DELIM_START);
handledPosition = delimIndex + 1;
}
} else {
// 正常占位符
sbuf.append(strPattern, handledPosition, delimIndex);
sbuf.append(Convert.utf8Str(argArray[argIndex]));
handledPosition = delimIndex + 2;
}
}
}
// 加入最后一个占位符后所有的字符
sbuf.append(strPattern, handledPosition, strPattern.length());
return sbuf.toString();
}
}

View File

@ -3,6 +3,7 @@ package com.muyu.vehicle;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.muyu.cache.model.MessageTemplateCacheModel; import com.muyu.cache.model.MessageTemplateCacheModel;
import com.muyu.system.enums.MessageTemplateValueType; import com.muyu.system.enums.MessageTemplateValueType;
import com.muyu.utils.StringUtils;
import com.muyu.vehicle.model.VehicleData; import com.muyu.vehicle.model.VehicleData;
import com.muyu.vehicle.model.properties.MqttProperties; import com.muyu.vehicle.model.properties.MqttProperties;
import com.muyu.vehicle.thread.VehicleThread; import com.muyu.vehicle.thread.VehicleThread;
@ -205,6 +206,9 @@ public class VehicleInstance {
log.error("车辆:[{}] 客户端关闭异常:[{}]",getVin(), e.getMessage(), e); log.error("车辆:[{}] 客户端关闭异常:[{}]",getVin(), e.getMessage(), e);
} }
} }
if (this.vehicleThread != null){
this.vehicleThread.stop();
}
} }
/** /**
@ -250,6 +254,9 @@ public class VehicleInstance {
.latitude(this.vehicleInfo.getLastLatitude()) .latitude(this.vehicleInfo.getLastLatitude())
.longitude(this.vehicleInfo.getLastLongitude()) .longitude(this.vehicleInfo.getLastLongitude())
.build(); .build();
}else {
this.vehicleInfo.setLastLatitude(currentPositionModel.getLatitude());
this.vehicleInfo.setLastLongitude(currentPositionModel.getLongitude());
} }
if (lastPositionModel == null){ if (lastPositionModel == null){
lastPositionModel = currentPositionModel; lastPositionModel = currentPositionModel;
@ -303,7 +310,7 @@ public class VehicleInstance {
for (MessageTemplateValue messageTemplateValue : messageTemplateValueList) { for (MessageTemplateValue messageTemplateValue : messageTemplateValueList) {
String valueType = messageTemplateValue.getValueType(); String valueType = messageTemplateValue.getValueType();
MessageTemplateValueType messageTemplateValueType MessageTemplateValueType messageTemplateValueType
= MessageTemplateValueType.valueOf(valueType); = MessageTemplateValueType.get(valueType);
switch (messageTemplateValueType){ switch (messageTemplateValueType){
// 固定值 // 固定值
case FIXED -> { case FIXED -> {
@ -347,23 +354,28 @@ public class VehicleInstance {
.sorted(Comparator.comparing(MessageTemplateValue::getStartLocation)) .sorted(Comparator.comparing(MessageTemplateValue::getStartLocation))
.forEach(value -> { .forEach(value -> {
String elValue = value.getElValue(); String elValue = value.getElValue();
// TODO 获取EL报文 switch (elValue){
case "this.vin" -> elBuilder.append(this.vehicleData.getVin());
case "this.latitude" -> elBuilder.append(this.vehicleData.getLatitude());
case "this.longitude" -> elBuilder.append(this.vehicleData.getLongitude());
case "this.timeMillis" -> elBuilder.append(System.currentTimeMillis());
}
}); });
StringBuilder fixedBuilder = new StringBuilder(); StringBuilder fixedBuilder = new StringBuilder();
messageTemplateValueList.stream() messageTemplateValueList.stream()
.filter(MessageTemplateValue::isFixed) .filter(MessageTemplateValue::isFixed)
.sorted(Comparator.comparing(MessageTemplateValue::getStartLocation)) .sorted(Comparator.comparing(MessageTemplateValue::getStartLocation))
.forEach(value -> { .forEach(value -> fixedBuilder.append(this.vehicleData.getData(value.getCode())));
// TODO 获取固定报文
});
StringBuilder intervalBuilder = new StringBuilder(); StringBuilder intervalBuilder = new StringBuilder();
messageTemplateValueList.stream() messageTemplateValueList.stream()
.filter(MessageTemplateValue::isInterval) .filter(MessageTemplateValue::isInterval)
.sorted(Comparator.comparing(MessageTemplateValue::getStartLocation)) .sorted(Comparator.comparing(MessageTemplateValue::getStartLocation))
.forEach(value -> { .forEach(value -> intervalBuilder.append(this.vehicleData.getData(value.getCode())));
// TODO 获取随机报文 return StringUtils.format(
}); "{}#{}#{}~{}{}{}",
return null; elBuilder.length(), fixedBuilder.length(), intervalBuilder.length(),
elBuilder.toString(), fixedBuilder.toString(), intervalBuilder.toString()
);
} }
} }

View File

@ -69,6 +69,7 @@ public class VehicleData {
*/ */
private String fuelConsumptionRate; private String fuelConsumptionRate;
@Builder.Default
private Map<String, String> dataMap = new HashMap<String, String>(); private Map<String, String> dataMap = new HashMap<String, String>();
/** /**

View File

@ -22,8 +22,9 @@ public class VehicleThread implements Runnable {
public void run() { public void run() {
try { try {
if (!isStop){ if (!isStop){
log.info("{} - 上报数据", this.vehicleInstance.getVin()); String msg = this.vehicleInstance.imitateDataAndMsg();
this.vehicleInstance.sendMsg( this.vehicleInstance.imitateDataAndMsg()); log.info("{} - 上报数据: [{}]", this.vehicleInstance.getVin(), msg);
this.vehicleInstance.sendMsg( msg );
}else { }else {
log.info("终止模拟和上报:[{}]", this.vehicleInstance.getVin()); log.info("终止模拟和上报:[{}]", this.vehicleInstance.getVin());
vehicleInstance.cancelExecution(); vehicleInstance.cancelExecution();

View File

@ -28,70 +28,83 @@ public class VehicleInstanceController {
/** /**
* *
*
* @param vehicleInstanceListReq * @param vehicleInstanceListReq
* @return * @return
*/ */
@PostMapping("/list") @PostMapping("/list")
public Result<PageList<VehicleInstanceResp>> list(@RequestBody VehicleInstanceListReq vehicleInstanceListReq){ public Result<PageList<VehicleInstanceResp>> list(@RequestBody VehicleInstanceListReq vehicleInstanceListReq) {
PageList<VehicleInstanceResp> pageList = vehicleInstanceService.queryList(vehicleInstanceListReq); PageList<VehicleInstanceResp> pageList = vehicleInstanceService.queryList(vehicleInstanceListReq);
return Result.success(pageList); return Result.success(pageList);
} }
/** /**
* VIN * VIN
*
* @param vin VIN * @param vin VIN
* @return * @return
*/ */
@GetMapping("/data/{vin}") @GetMapping("/data/{vin}")
public Result<VehicleData> getVehicleData(@PathVariable("vin") String vin){ public Result<VehicleData> getVehicleData(@PathVariable("vin") String vin) {
return Result.success(LocalContainer.getVehicleInstance(vin).getVehicleData()); return Result.success(LocalContainer.getVehicleInstance(vin).getVehicleData());
} }
/** /**
* *
*
* @param vin vin * @param vin vin
* @return * @return
*/ */
@PostMapping("/client/start/{vin}") @PostMapping("/client/start/{vin}")
public Result<String> vehicleClientInit(@PathVariable("vin") String vin){ public Result<String> vehicleClientInit(@PathVariable("vin") String vin) {
this.vehicleInstanceService.vehicleClientStart(vin); this.vehicleInstanceService.vehicleClientStart(vin);
this.vehicleInstanceService.checkPosition(
CheckPositionReq.builder()
.vin(vin)
.positionCode("路径1")
.build()
);
return Result.success(); return Result.success();
} }
/** /**
* *
*
* @param vin vin * @param vin vin
* @return * @return
*/ */
@PostMapping("/client/close/{vin}") @PostMapping("/client/close/{vin}")
public Result<String> vehicleClientClose(@PathVariable("vin") String vin){ public Result<String> vehicleClientClose(@PathVariable("vin") String vin) {
this.vehicleInstanceService.vehicleClientClose(vin); this.vehicleInstanceService.vehicleClientClose(vin);
return Result.success(); return Result.success();
} }
/** /**
* *
*
* @param checkPositionReq * @param checkPositionReq
* @return * @return
*/ */
@PostMapping("/position/check") @PostMapping("/position/check")
public Result<String> checkPosition(@RequestBody CheckPositionReq checkPositionReq){ public Result<String> checkPosition(@RequestBody CheckPositionReq checkPositionReq) {
this.vehicleInstanceService.checkPosition(checkPositionReq); this.vehicleInstanceService.checkPosition(checkPositionReq);
return Result.success(); return Result.success();
} }
/** /**
* *
*
* @return * @return
*/ */
@PostMapping("/gear") @PostMapping("/gear")
public Result<String> gear(@RequestBody GearReq gearReq){ public Result<String> gear(@RequestBody GearReq gearReq) {
this.vehicleInstanceService.gear(gearReq); this.vehicleInstanceService.gear(gearReq);
return Result.success(); return Result.success();
} }
/** /**
* *
*
* @param statusKey * @param statusKey
* @param vin * @param vin
* @param statusValue * @param statusValue
@ -100,7 +113,7 @@ public class VehicleInstanceController {
@PutMapping("/status/{vin}/{statusKey}/{statusValue}") @PutMapping("/status/{vin}/{statusKey}/{statusValue}")
public Result<String> editStatus(@PathVariable("statusKey") String statusKey, public Result<String> editStatus(@PathVariable("statusKey") String statusKey,
@PathVariable("vin") String vin, @PathVariable("vin") String vin,
@PathVariable("statusValue") Integer statusValue){ @PathVariable("statusValue") Integer statusValue) {
this.vehicleInstanceService.editStatus(vin, statusKey, statusValue); this.vehicleInstanceService.editStatus(vin, statusKey, statusValue);
return Result.success(); return Result.success();
} }