Forráskód Böngészése

Merge branch 'develop' into dev/ruleClass20210805

gaodm 3 éve
szülő
commit
ab53ca1de5
1 módosított fájl, 299 hozzáadás és 0 törlés
  1. 299 0
      common/src/main/java/com/diagbot/util/EntityUtil.java

+ 299 - 0
common/src/main/java/com/diagbot/util/EntityUtil.java

@@ -1,14 +1,18 @@
 package com.diagbot.util;
 
+import com.diagbot.biz.push.entity.Lis;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.utils.Lists;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.Validate;
 import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.commons.lang3.time.DateUtils;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.math.BigDecimal;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -20,6 +24,7 @@ import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 实体对象工具类
@@ -30,6 +35,68 @@ import java.util.Map;
 public class EntityUtil {
 
     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返回。注意:会去重!
@@ -447,4 +514,236 @@ public class EntityUtil {
         }
         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);
+
+    }
 }