package cn.stylefeng.guns.utils; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; import lombok.experimental.UtilityClass; import java.util.*; import java.util.stream.Collectors; @UtilityClass public class StatDataUtil { /** * 获取日期格式化SQL * * @param type * @return */ public String getDateFormatSql(Integer type) { String dateFormatSql = "%Y-%m-%d"; if (type != null) { switch (type) { case 2: return "%Y-%u"; case 3: return "%Y-%m"; case 4: return "%Y"; } } return dateFormatSql; } /** * 获取开始时间和结束时间(空使用默认) * * @param type 类型:1日,2周,3月,4年 * @param beginTime 开始时间 * @param endTime 结束时间 * @return */ public List getStartAndEndTime(Integer type, String beginTime, String endTime) { Date nowDate = new Date(); if (type == null || type == 1) { if (StrUtil.isEmpty(beginTime)) { beginTime = DateUtil.beginOfDay(DateUtil.offsetDay(nowDate, -30)).toString(); }else{ beginTime = beginTime + " 00:00:00"; } if (StrUtil.isEmpty(endTime)) { endTime = DateUtil.endOfDay(nowDate).toString(); }else{ endTime = endTime + " 23:59:59"; } } else if (type == 2) { if (StrUtil.isEmpty(beginTime)) { DateTime weekDate = DateUtil.offsetWeek(nowDate, -11); // int week = DateUtil.weekOfYear(weekDate); // beginTime = DateUtil.format(weekDate, "yyyy") + "-" + StrUtil.padPre(String.valueOf(week), 2, "0"); beginTime = DateUtil.beginOfDay(weekDate).toString(); }else{ beginTime = beginTime + " 00:00:00"; } if (StrUtil.isEmpty(endTime)) { // int week = DateUtil.weekOfYear(nowDate); endTime = DateUtil.endOfDay(nowDate).toString(); // endTime = DateUtil.format(nowDate, "yyyy") + "-" + StrUtil.padPre(String.valueOf(week), 2, "0"); }else{ endTime = endTime + " 23:59:59"; } } else if (type == 3) { if (StrUtil.isEmpty(beginTime)) { beginTime = DateUtil.beginOfDay(DateUtil.offsetMonth(nowDate, -5)).toString(); }else{ beginTime = beginTime + " 00:00:00"; } if (StrUtil.isEmpty(endTime)) { endTime = DateUtil.endOfDay(nowDate).toString(); }else{ endTime = endTime + " 23:59:59"; } } else if (type == 4) { if (StrUtil.isEmpty(beginTime)) { beginTime = DateUtil.beginOfDay(DateUtil.offset(nowDate, DateField.YEAR, -2)).toString(); }else{ beginTime = beginTime + " 00:00:00"; } if (StrUtil.isEmpty(endTime)) { endTime = DateUtil.endOfDay(nowDate).toString(); }else{ endTime = endTime + " 23:59:59"; } } return Arrays.asList(beginTime, endTime); } /** * 获取时间范围 * * @param type 类型:1日,2周,3月,4年 * @param beginTime 开始时间 * @param endTime 结束时间 * @return */ public List getBeginEndTimeRangeList(Integer type, String beginTime, String endTime) { if (type == null || type == 1) { return DateUtil.rangeToList(DateUtil.parse(beginTime), DateUtil.parse(endTime), DateField.DAY_OF_MONTH) .stream() .map(date -> DateUtil.format(date, "yyyy-MM-dd")) .collect(Collectors.toList()); } else if (type == 2) { //return DateUtil.rangeToList(DateUtil.parse(beginTime, "yyyy-ww"), DateUtil.parse(endTime, "yyyy-ww"), DateField.WEEK_OF_YEAR) return DateUtil.rangeToList(DateUtil.parse(beginTime), DateUtil.parse(endTime), DateField.WEEK_OF_YEAR) .stream() .map(date -> DateUtil.format(date, "yyyy-ww")) .collect(Collectors.toList()); } else if (type == 3) { return DateUtil.rangeToList(DateUtil.parse(beginTime, "yyyy-MM"), DateUtil.parse(endTime, "yyyy-MM"), DateField.MONTH) .stream() .map(date -> DateUtil.format(date, "yyyy-MM")) .collect(Collectors.toList()); } else if (type == 4) { return DateUtil.rangeToList(DateUtil.parse(beginTime, "yyyy"), DateUtil.parse(endTime, "yyyy"), DateField.YEAR) .stream() .map(date -> DateUtil.format(date, "yyyy")) .collect(Collectors.toList()); } return null; } /** * 封装时间数据 * * @param timeList 时间范围 * @param dataList 数据列表 * @param dataFieldName 数据字段名,默认:data * @return */ public List> wrapperTimeLIst(List timeList, List> dataList, String dataFieldName) { dataFieldName = StrUtil.isNotEmpty(dataFieldName) ? dataFieldName : "data"; String finalDataFieldName = dataFieldName; return timeList.stream() .map(time -> { Object data = dataList.stream() .filter(map -> map.get("time").equals(time)) .findFirst() .map(map -> map.get(finalDataFieldName)) .orElse(0); Map hashMap = MapUtil.newHashMap(); hashMap.put("time", time); hashMap.put("data", data); return hashMap; }) .collect(Collectors.toList()); } public static void main(String[] args) { List timeList = StatDataUtil.getStartAndEndTime(2, "", ""); System.out.println(timeList.get(0)); System.out.println(timeList.get(1)); System.out.println("-------------------------------------"); // Integer type = 1; // String beginTime = "2023-01-01", endTime = "2023-02-02"; Integer type = 2; String beginTime = "2023-46", endTime = "2024-05"; // Integer type = 3; // String beginTime = "2023-01", endTime = "2024-02"; // Integer type = 4; // String beginTime = "2020", endTime = "2024"; timeList = StatDataUtil.getBeginEndTimeRangeList(type, beginTime, endTime); timeList.forEach(System.out::println); System.out.println("-------------------------------------"); HashMap m1 = new HashMap(); m1.put("time", "2023-48"); m1.put("data", "233"); HashMap m2 = new HashMap(); m2.put("time", "2024-02"); m2.put("data", "123"); HashMap m3 = new HashMap(); m3.put("time", "2023-50"); m3.put("data", "444"); List> dataList = Arrays.asList(m1, m2, m3); List> maps = StatDataUtil.wrapperTimeLIst(timeList, dataList, null); for (Map map : maps) { System.out.println(map.get("time") + "----" + map.get("data")); } } }