|
@@ -1,14 +1,18 @@
|
|
package com.diagbot.util;
|
|
package com.diagbot.util;
|
|
|
|
|
|
|
|
+import com.diagbot.biz.push.entity.Lis;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.apache.commons.compress.utils.Lists;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.Validate;
|
|
import org.apache.commons.lang3.Validate;
|
|
import org.apache.commons.lang3.reflect.FieldUtils;
|
|
import org.apache.commons.lang3.reflect.FieldUtils;
|
|
|
|
+import org.apache.commons.lang3.time.DateUtils;
|
|
|
|
|
|
import java.lang.reflect.Field;
|
|
import java.lang.reflect.Field;
|
|
import java.lang.reflect.Method;
|
|
import java.lang.reflect.Method;
|
|
import java.lang.reflect.Modifier;
|
|
import java.lang.reflect.Modifier;
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
|
+import java.text.ParseException;
|
|
import java.text.SimpleDateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.Collection;
|
|
@@ -20,6 +24,7 @@ import java.util.LinkedHashSet;
|
|
import java.util.LinkedList;
|
|
import java.util.LinkedList;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
/**
|
|
* @Description: 实体对象工具类
|
|
* @Description: 实体对象工具类
|
|
@@ -30,6 +35,68 @@ import java.util.Map;
|
|
public class EntityUtil {
|
|
public class EntityUtil {
|
|
|
|
|
|
private static final String DATE_CLASS_NAME = Date.class.getName();
|
|
private static final String DATE_CLASS_NAME = Date.class.getName();
|
|
|
|
+ public static String[] dateFormats = {
|
|
|
|
+ "yyyy年MM月dd日HH时mm分",
|
|
|
|
+ "yyyy年MM月dd日HH:mm",
|
|
|
|
+ "yyyy年MM月dd日H时mm分",
|
|
|
|
+ "yyyy年MM月dd日HH时m分",
|
|
|
|
+ "yyyy年MM月dd日H时m分",
|
|
|
|
+ "yyyy年M月dd日HH时mm分",
|
|
|
|
+ "yyyy年M月dd日H时mm分",
|
|
|
|
+ "yyyy年M月dd日HH时m分",
|
|
|
|
+ "yyyy年M月dd日H时m分",
|
|
|
|
+ "yyyy年MM月d日HH时mm分",
|
|
|
|
+ "yyyy年MM月d日H时mm分",
|
|
|
|
+ "yyyy年MM月d日HH时m分",
|
|
|
|
+ "yyyy年MM月d日H时m分",
|
|
|
|
+ "yyyy年M月d日HH时mm分",
|
|
|
|
+ "yyyy年M月d日H时mm分",
|
|
|
|
+ "yyyy年M月d日HH时m分",
|
|
|
|
+ "yyyy年M月d日H时m分",
|
|
|
|
+ "yyyy-MM-ddHH:mm:ss",
|
|
|
|
+ "yyyy-MM-ddHH:mm",
|
|
|
|
+ "yyyy-MM-ddHH:m",
|
|
|
|
+ "yyyy-MM-ddH:mm",
|
|
|
|
+ "yyyy-MM-ddH:m",
|
|
|
|
+ "yyyy-M-ddHH:mm",
|
|
|
|
+ "yyyy-M-ddHH:m",
|
|
|
|
+ "yyyy-M-ddH:mm",
|
|
|
|
+ "yyyy-M-ddH:m",
|
|
|
|
+ "yyyy-MM-dHH:mm",
|
|
|
|
+ "yyyy-MM-dHH:m",
|
|
|
|
+ "yyyy-MM-dH:mm",
|
|
|
|
+ "yyyy-MM-dH:m",
|
|
|
|
+ "yyyy-M-dHH:mm",
|
|
|
|
+ "yyyy-M-dHH:m",
|
|
|
|
+ "yyyy-M-dH:mm",
|
|
|
|
+ "yyyy-M-dH:m",
|
|
|
|
+ "yyyy-MM-dd",
|
|
|
|
+ "yyyy年MM月dd日H时",
|
|
|
|
+ "yyyy/MM/ddHH:mm:ss",
|
|
|
|
+ "yyyy/MM/ddHH:mm",
|
|
|
|
+ "yyyy/MM/ddHH:m",
|
|
|
|
+ "yyyy/MM/ddH:mm",
|
|
|
|
+ "yyyy/MM/ddH:m",
|
|
|
|
+ "yyyy/MM/ddHH:mm:",
|
|
|
|
+ "yyyy/M/ddHH:mm",
|
|
|
|
+ "yyyy/M/ddHH:m",
|
|
|
|
+ "yyyy/M/ddH:mm",
|
|
|
|
+ "yyyy/M/ddH:m",
|
|
|
|
+ "yyyy/MM/dHH:mm",
|
|
|
|
+ "yyyy/MM/dHH:m",
|
|
|
|
+ "yyyy/MM/dH:mm",
|
|
|
|
+ "yyyy/MM/dH:m",
|
|
|
|
+ "yyyy/M/dHH:mm",
|
|
|
|
+ "yyyy/M/dHH:m",
|
|
|
|
+ "yyyy/M/dH:mm",
|
|
|
|
+ "yyyy/M/dH:m",
|
|
|
|
+ "yyyy/MM/dd",
|
|
|
|
+ "yyyy.MM.dd",
|
|
|
|
+ "yyyy-MM-ddHH:mm:ss.000",
|
|
|
|
+ "yyyyMMddHH:mm",
|
|
|
|
+ "yyyy-MM-dd'T'HH:mm:ss",
|
|
|
|
+ "MM/dd/yyyyHH:mm:ss"
|
|
|
|
+ };
|
|
|
|
|
|
/**
|
|
/**
|
|
* 将list中元素的某一成员组装成list返回。注意:会去重!
|
|
* 将list中元素的某一成员组装成list返回。注意:会去重!
|
|
@@ -447,4 +514,236 @@ public class EntityUtil {
|
|
}
|
|
}
|
|
return map;
|
|
return map;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 以Map<key, V> 形式返回,如果key相同,会覆盖前面的内容
|
|
|
|
+ *
|
|
|
|
+ * @param list 列表
|
|
|
|
+ * @param splitSmybool key分隔符
|
|
|
|
+ * @param multiProperty 多个属性
|
|
|
|
+ * @param <V>
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static <V> List<V> getNoRepeatList(List<V> list, String splitSmybool, String dateProperty, String... multiProperty) {
|
|
|
|
+ List<V> res = new ArrayList<>();
|
|
|
|
+ Map<String, V> multiKeyObject = getMultiKeyObject(list, splitSmybool, dateProperty, multiProperty);
|
|
|
|
+ if (multiKeyObject != null && !multiKeyObject.isEmpty()) {
|
|
|
|
+ for (String key : multiKeyObject.keySet()) {
|
|
|
|
+ res.add(multiKeyObject.get(key));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return res;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 以Map<key, V> 形式返回,如果key相同,根据时间排序,后面时间覆盖前面时间
|
|
|
|
+ *
|
|
|
|
+ * @param list 列表
|
|
|
|
+ * @param splitSmybool key分隔符
|
|
|
|
+ * @param dateProperty 时间属性
|
|
|
|
+ * @param multiProperty 多个属性
|
|
|
|
+ * @param <V>
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static <V> Map<String, V> getMultiKeyObject(List<V> list, String splitSmybool, String dateProperty, String... multiProperty) {
|
|
|
|
+ if (ListUtil.isEmpty(list)) {
|
|
|
|
+ return new LinkedHashMap<>();
|
|
|
|
+ }
|
|
|
|
+ return list.stream().collect(Collectors.toMap(k -> {
|
|
|
|
+ List<String> keyList = new ArrayList<>();
|
|
|
|
+ for (String property : multiProperty) {
|
|
|
|
+ keyList.add(getProperty(k, property));
|
|
|
|
+ }
|
|
|
|
+ return StringUtils.join(keyList, splitSmybool);
|
|
|
|
+ }, v -> v, (v1, v2) -> {
|
|
|
|
+ String date1 = getProperty(v1, dateProperty);
|
|
|
|
+ if (StringUtil.isBlank(date1)) {
|
|
|
|
+ return v2;
|
|
|
|
+ }
|
|
|
|
+ String date2 = getProperty(v2, dateProperty);
|
|
|
|
+ if (StringUtil.isBlank(date2)) {
|
|
|
|
+ return v1;
|
|
|
|
+ }
|
|
|
|
+ int flag = compareTime(date1, date2);
|
|
|
|
+ if (flag == 0) {
|
|
|
|
+ return v1;
|
|
|
|
+ } else {
|
|
|
|
+ return v2;
|
|
|
|
+ }
|
|
|
|
+ }, LinkedHashMap::new));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取对象的属性值,直接使用getDeclaredFields()方法只能获取当前类声明的字段,需要递归向上获取
|
|
|
|
+ *
|
|
|
|
+ * @param object : 子类对象
|
|
|
|
+ * @param fieldName : 父类中的属性名
|
|
|
|
+ * @return : 父类中的属性值
|
|
|
|
+ */
|
|
|
|
+ public static <T> T getProperty(Object object, String fieldName) {
|
|
|
|
+ try {
|
|
|
|
+ //根据 对象和属性名通过反射获取Field对象
|
|
|
|
+ Field field = getDeclaredField(object, fieldName);
|
|
|
|
+ // 容错处理
|
|
|
|
+ if (field == null) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ //抑制Java对其的检查
|
|
|
|
+ field.setAccessible(true);
|
|
|
|
+ //获取 object 中 field 所代表的属性值
|
|
|
|
+ return (T) field.get(object);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 对象赋值
|
|
|
|
+ *
|
|
|
|
+ * @param object
|
|
|
|
+ * @param property
|
|
|
|
+ * @param value
|
|
|
|
+ */
|
|
|
|
+ public static void setProperty(Object object, String property, Object value) {
|
|
|
|
+ //根据 对象和属性名通过反射 调用上面的方法获取 Field对象
|
|
|
|
+ Field field = getDeclaredField(object, property);
|
|
|
|
+ //抑制Java对其的检查
|
|
|
|
+ field.setAccessible(true);
|
|
|
|
+ try {
|
|
|
|
+ field.set(object, value);
|
|
|
|
+ } catch (IllegalArgumentException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 循环向上转型, 获取对象的 DeclaredField
|
|
|
|
+ *
|
|
|
|
+ * @param object : 子类对象
|
|
|
|
+ * @param fieldName : 父类中的属性名
|
|
|
|
+ * @return 父类中的属性对象
|
|
|
|
+ */
|
|
|
|
+ public static Field getDeclaredField(Object object, String fieldName) {
|
|
|
|
+ Field field = null;
|
|
|
|
+ Class<?> clazz = object.getClass();
|
|
|
|
+ for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
|
|
|
|
+ try {
|
|
|
|
+ field = clazz.getDeclaredField(fieldName);
|
|
|
|
+ return field;
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
|
|
|
|
+ //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 比较时间,endDateStr >= startDateStr
|
|
|
|
+ * @param startDateStr
|
|
|
|
+ * @param endDateStr
|
|
|
|
+ * @return -1:无法比较或出错,0:endDateStr < startDateStr,1:endDateStr >= startDateStr
|
|
|
|
+ */
|
|
|
|
+ public static int compareTime(String startDateStr, String endDateStr) {
|
|
|
|
+ int flag = -1;
|
|
|
|
+ if (StringUtil.isBlank(startDateStr) || StringUtil.isBlank(endDateStr)) {
|
|
|
|
+ return flag;
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ Date startDate = parseStringDate(startDateStr);
|
|
|
|
+ Date endDate = parseStringDate(endDateStr);
|
|
|
|
+ Long timeStart = startDate.getTime();
|
|
|
|
+ Long timeEnd = endDate.getTime();
|
|
|
|
+ if (timeEnd >= timeStart) {
|
|
|
|
+ flag = 1;
|
|
|
|
+ } else {
|
|
|
|
+ flag = 0;
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ return flag;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 解析时间
|
|
|
|
+ *
|
|
|
|
+ * @param datetime
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static Date parseStringDate(String datetime) {
|
|
|
|
+ if (StringUtil.isBlank(datetime)) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ Date date = null;
|
|
|
|
+ try {
|
|
|
|
+ datetime = remove_ctl(datetime);
|
|
|
|
+
|
|
|
|
+ if (datetime.contains("至")) {
|
|
|
|
+ datetime = datetime.split("至")[1].replaceAll("[\\u4e00-\\u9fa5]", "");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (datetime.length() > 0) {
|
|
|
|
+ date = DateUtils.parseDate(datetime, dateFormats);
|
|
|
|
+ }
|
|
|
|
+ } catch (ParseException ex) {
|
|
|
|
+ ex.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ return date;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 删除字符串中的换行和控制字符
|
|
|
|
+ *
|
|
|
|
+ * @param str
|
|
|
|
+ */
|
|
|
|
+ public static String remove_ctl(String str) {
|
|
|
|
+ String trim = "";
|
|
|
|
+ if (StringUtils.isNotEmpty(str)) {
|
|
|
|
+ trim = str.replaceAll("\r|\n|\r\n", "").trim();
|
|
|
|
+ }
|
|
|
|
+ return trim;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
+ List<Lis> lisList = Lists.newArrayList();
|
|
|
|
+ Lis lis = new Lis();
|
|
|
|
+ lis.setName("血常规");
|
|
|
|
+ lis.setDetailName("白细胞计数");
|
|
|
|
+ lis.setUniqueName("");
|
|
|
|
+ lis.setValue(10.0D);
|
|
|
|
+ lis.setUnits("");
|
|
|
|
+ lis.setMinValue(0.0D);
|
|
|
|
+ lis.setMaxValue(0.0D);
|
|
|
|
+ lis.setOtherValue("");
|
|
|
|
+ lis.setDateValue("2021-08-18 10:04:56");
|
|
|
|
+ lis.setFinishDateValue("");
|
|
|
|
+ lis.setSource(0);
|
|
|
|
+ lis.setResult("");
|
|
|
|
+ lis.setFrequency("");
|
|
|
|
+
|
|
|
|
+ Lis lis2 = new Lis();
|
|
|
|
+ lis2.setName("血常规");
|
|
|
|
+ lis2.setDetailName("白细胞计数");
|
|
|
|
+ lis2.setUniqueName("");
|
|
|
|
+ lis2.setValue(20.0D);
|
|
|
|
+ lis2.setUnits("");
|
|
|
|
+ lis2.setMinValue(0.0D);
|
|
|
|
+ lis2.setMaxValue(0.0D);
|
|
|
|
+ lis2.setOtherValue("");
|
|
|
|
+ lis2.setDateValue("2021-08-18 11:04:56");
|
|
|
|
+ lis2.setFinishDateValue("");
|
|
|
|
+ lis2.setSource(0);
|
|
|
|
+ lis2.setResult("");
|
|
|
|
+ lis2.setFrequency("");
|
|
|
|
+
|
|
|
|
+ lisList.add(lis);
|
|
|
|
+ lisList.add(lis2);
|
|
|
|
+ Map<String, Lis> multiKeyObject = getMultiKeyObject(lisList, "_", "dateValue", "name", "detailName");
|
|
|
|
+ System.out.println(multiKeyObject);
|
|
|
|
+
|
|
|
|
+ }
|
|
}
|
|
}
|