From 93430938a25ab3d4e218a2198ae1b24a516f6382 Mon Sep 17 00:00:00 2001
From: zhouxiantao <1026371446@qq.com>
Date: Tue, 17 Jun 2025 17:31:15 +0800
Subject: [PATCH] freat:粤政易相关代码

---
 dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/utils/StatisticsTimeUtils.java |  274 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 274 insertions(+), 0 deletions(-)

diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/utils/StatisticsTimeUtils.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/utils/StatisticsTimeUtils.java
new file mode 100644
index 0000000..5ab941f
--- /dev/null
+++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/utils/StatisticsTimeUtils.java
@@ -0,0 +1,274 @@
+package cn.huge.module.cases.utils;
+
+import cn.huge.base.common.utils.DateUtils;
+import cn.huge.base.common.utils.ObjectUtils;
+import cn.huge.module.cases.domain.dto.CaseWorkStatisticsTimeDTO;
+import com.alibaba.fastjson.JSON;
+
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
+
+/**
+ * 工作统计-时间计算类
+ * @author zhouxiantao
+ * @create 2025-04-23 11:48
+ */
+public class StatisticsTimeUtils {
+    /**
+     * 判断两个时间 1-按日统计,2-按月统计,3-按年统计
+     * */
+    public static String spanTime(Date startDate, Date endDate){
+        Integer differDay = DateUtils.getDifferDay(startDate, endDate);
+        if(differDay <= 31){
+            return "1";
+        }else if(differDay > 31 && differDay <= 365){
+            return "2";
+        }else if(differDay > 365){
+            return "3";
+        }
+        return null;
+    }
+
+
+    /**
+     * 填补缺少的时间
+     * */
+    public static List<CaseWorkStatisticsTimeDTO> dellStatisticsTime(List<CaseWorkStatisticsTimeDTO> caseWorkStatisticsTimeDTOS, Date startDate, Date endDate,String type) {
+        List<CaseWorkStatisticsTimeDTO> resultList = new ArrayList<>();
+        if("1".equals(type)){
+            Integer differDay = DateUtils.getDifferDay(startDate, endDate);
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            LocalDate endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            // 生成所有在 startDate 和 endDate 范围内的日期
+            Set<LocalDate> allDatesInRange = new HashSet<>();
+            LocalDate currentDate = startLocalDate;
+            while (!currentDate.isAfter(endLocalDate)) {
+                allDatesInRange.add(currentDate);
+                currentDate = currentDate.plusDays(1);
+            }
+            // 将 caseWorkStatisticsTimeDTOs 中的日期转换为 LocalDate 并存储在 map 中
+            Map<LocalDate, CaseWorkStatisticsTimeDTO> existingDatesMap = new HashMap<>();
+            for (CaseWorkStatisticsTimeDTO dto : caseWorkStatisticsTimeDTOS) {
+                LocalDate date = LocalDate.parse(dto.getDayStr(), formatter);
+                existingDatesMap.put(date, dto);
+            }
+            // 确保每个日期都在范围内
+            for (LocalDate date : allDatesInRange) {
+                if (existingDatesMap.containsKey(date)) {
+                    CaseWorkStatisticsTimeDTO caseWorkStatisticsTimeDTO = existingDatesMap.get(date);
+                    String[] split = caseWorkStatisticsTimeDTO.getDayStr().split("-");
+                    caseWorkStatisticsTimeDTO.setTimeStr(split[2]+"日");
+                    caseWorkStatisticsTimeDTO.setTimeAllStr(split[0]+"年"+split[1]+"月"+split[2]+"日");
+                    int i = Integer.valueOf(split[1]) * 100 + Integer.valueOf(split[2]);
+                    caseWorkStatisticsTimeDTO.setSort(i);
+                    resultList.add(caseWorkStatisticsTimeDTO);
+                } else {
+                    String format = date.format(formatter);
+                    String[] split = format.split("-");
+                    CaseWorkStatisticsTimeDTO caseWorkStatisticsTimeDTO = new CaseWorkStatisticsTimeDTO();
+                    caseWorkStatisticsTimeDTO.setTimeStr(split[2]+"日");
+                    caseWorkStatisticsTimeDTO.setTimeAllStr(split[0]+"年"+split[1]+"月"+split[2]+"日");
+                    int i = Integer.valueOf(split[1]) * 100 + Integer.valueOf(split[2]);
+                    caseWorkStatisticsTimeDTO.setSort(i);
+                    resultList.add(caseWorkStatisticsTimeDTO);
+                }
+            }
+            if(differDay <=7){
+                Collections.sort(resultList, (o1, o2) -> Integer.compare(o1.getSort(), o2.getSort()));
+               return resultList;
+            }else{
+                List<CaseWorkStatisticsTimeDTO> result1List = new ArrayList<>();
+                Map<String, List<CaseWorkStatisticsTimeDTO>> stringListMap = groupByWeek(caseWorkStatisticsTimeDTOS);
+                for (String week : stringListMap.keySet()) {
+                    String[] split = week.split("=");
+                    String[] startTime = split[0].split("-");
+                    String[] endTime = split[1].split("-");
+                    CaseWorkStatisticsTimeDTO caseWorkStatisticsTimeDTO = new CaseWorkStatisticsTimeDTO();
+                    List<CaseWorkStatisticsTimeDTO> caseWorkStatisticsTimeDTOS1 = stringListMap.get(week);
+                    for (CaseWorkStatisticsTimeDTO workStatisticsTimeDTO : caseWorkStatisticsTimeDTOS1) {
+                        caseWorkStatisticsTimeDTO.setTotalNum(caseWorkStatisticsTimeDTO.getTotalNum()+workStatisticsTimeDTO.getTotalNum());
+                        caseWorkStatisticsTimeDTO.setProcessNum(caseWorkStatisticsTimeDTO.getProcessNum()+workStatisticsTimeDTO.getProcessNum());
+                        caseWorkStatisticsTimeDTO.setFinishNum(caseWorkStatisticsTimeDTO.getFinishNum()+workStatisticsTimeDTO.getFinishNum());
+                        caseWorkStatisticsTimeDTO.setRejectNum(caseWorkStatisticsTimeDTO.getRejectNum()+workStatisticsTimeDTO.getRejectNum());
+                        caseWorkStatisticsTimeDTO.setResolveNum(caseWorkStatisticsTimeDTO.getResolveNum()+workStatisticsTimeDTO.getResolveNum());
+                        caseWorkStatisticsTimeDTO.setUnResolveNum(caseWorkStatisticsTimeDTO.getUnResolveNum()+workStatisticsTimeDTO.getUnResolveNum());
+                        caseWorkStatisticsTimeDTO.setResolveingNum(caseWorkStatisticsTimeDTO.getResolveingNum()+workStatisticsTimeDTO.getResolveingNum());
+                    }
+                    caseWorkStatisticsTimeDTO.setTimeStr(startTime[2]+"-"+endTime[2]+"日");
+                    caseWorkStatisticsTimeDTO.setTimeAllStr(startTime[0]+"年"+startTime[1]+"月"+startTime[2]+"-"+endTime[2]+"日");
+                    int i = Integer.valueOf(startTime[1]) * 100 + Integer.valueOf(startTime[2]);
+                    caseWorkStatisticsTimeDTO.setSort(i);
+                    result1List.add(caseWorkStatisticsTimeDTO);
+                }
+                Collections.sort(result1List, (o1, o2) -> Integer.compare(o1.getSort(), o2.getSort()));
+                return result1List;
+            }
+        }else if("2".equals(type)){
+            int startYear = DateUtils.getYear(startDate);
+            int endYear = DateUtils.getYear(endDate);
+            int startMonth = DateUtils.getMonth(startDate);
+            int endMonth = DateUtils.getMonth(endDate);
+            Integer minMonth = startYear * 100 + startMonth;
+            Integer maxMonth = endYear * 100 + endMonth;
+            List<String> monthList = new ArrayList<>();
+            Map<String, CaseWorkStatisticsTimeDTO> existingDatesMap = new HashMap<>();
+            for (CaseWorkStatisticsTimeDTO caseWorkStatisticsTimeDTO : caseWorkStatisticsTimeDTOS) {
+                existingDatesMap.put(caseWorkStatisticsTimeDTO.getMonthStr(), caseWorkStatisticsTimeDTO);
+                monthList.add(caseWorkStatisticsTimeDTO.getMonthStr());
+            }
+            for (int i = minMonth; i <= maxMonth; i++){
+                Integer year = i / 100;
+                Integer month = i % 100;
+                if(month == 0 || month > 12){
+                    continue;
+                }
+                String timeStr = year+"-"+month;
+                if(!monthList.contains(timeStr)){
+                    CaseWorkStatisticsTimeDTO caseWorkStatisticsTimeDTO = new CaseWorkStatisticsTimeDTO();
+                    caseWorkStatisticsTimeDTO.setTimeStr(month+"月");
+                    caseWorkStatisticsTimeDTO.setTimeAllStr(year+"年"+month+"月");
+                    caseWorkStatisticsTimeDTO.setSort(i);
+                    resultList.add(caseWorkStatisticsTimeDTO);
+                }else{
+                    CaseWorkStatisticsTimeDTO caseWorkStatisticsTimeDTO = existingDatesMap.get(timeStr);
+                    caseWorkStatisticsTimeDTO.setTimeStr(month+"月");
+                    caseWorkStatisticsTimeDTO.setTimeAllStr(year+"年"+month+"月");
+                    caseWorkStatisticsTimeDTO.setSort(i);
+                    resultList.add(caseWorkStatisticsTimeDTO);
+                }
+            }
+        }else {
+            int minYear = DateUtils.getYear(startDate);
+            int maxYear = DateUtils.getYear(endDate);
+            List<String> yearList = new ArrayList<>();
+            Map<String, CaseWorkStatisticsTimeDTO> existingDatesMap = new HashMap<>();
+            for (CaseWorkStatisticsTimeDTO caseWorkStatisticsTimeDTO : caseWorkStatisticsTimeDTOS) {
+                caseWorkStatisticsTimeDTO.setTimeStr(caseWorkStatisticsTimeDTO.getYearStr());
+                existingDatesMap.put(caseWorkStatisticsTimeDTO.getYearStr(), caseWorkStatisticsTimeDTO);
+                yearList.add(caseWorkStatisticsTimeDTO.getYearStr());
+            }
+            for (int i = minYear; i <= maxYear; i++){
+                String timeStr = String.valueOf(i);
+                if(!yearList.contains(timeStr)){
+                    CaseWorkStatisticsTimeDTO caseWorkStatisticsTimeDTO = new CaseWorkStatisticsTimeDTO();
+                    caseWorkStatisticsTimeDTO.setTimeStr(timeStr+"年");
+                    caseWorkStatisticsTimeDTO.setTimeAllStr(timeStr+"年");
+                    caseWorkStatisticsTimeDTO.setSort(i);
+                    resultList.add(caseWorkStatisticsTimeDTO);
+                }else{
+                    CaseWorkStatisticsTimeDTO caseWorkStatisticsTimeDTO = existingDatesMap.get(timeStr);
+                    caseWorkStatisticsTimeDTO.setTimeStr(timeStr+"年");
+                    caseWorkStatisticsTimeDTO.setTimeAllStr(timeStr+"年");
+                    caseWorkStatisticsTimeDTO.setSort(i);
+                    resultList.add(caseWorkStatisticsTimeDTO);
+                }
+            }
+        }
+        Collections.sort(resultList, (o1, o2) -> Integer.compare(o1.getSort(), o2.getSort()));
+        return resultList;
+    }
+
+    /**
+     * 按周进行分组
+     * */
+    public static Map<String, List<CaseWorkStatisticsTimeDTO>> groupByWeek(List<CaseWorkStatisticsTimeDTO> caseWorkStatisticsTimeDTOs) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        Map<String, List<CaseWorkStatisticsTimeDTO>> weeklyGroups = new HashMap<>();
+        for (CaseWorkStatisticsTimeDTO dto : caseWorkStatisticsTimeDTOs) {
+            LocalDate date = LocalDate.parse(dto.getDayStr(), formatter);
+            LocalDate startOfWeek = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
+            LocalDate endOfWeek = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
+            String weekKey = startOfWeek.format(formatter) + "=" + endOfWeek.format(formatter);
+            weeklyGroups.computeIfAbsent(weekKey, k -> new ArrayList<>()).add(dto);
+        }
+        // 对每个周组内的记录按时间从小到大排序
+        for (List<CaseWorkStatisticsTimeDTO> group : weeklyGroups.values()) {
+            group.sort(Comparator.comparing(CaseWorkStatisticsTimeDTO::getDayStr));
+        }
+        System.out.println(JSON.toJSONString(weeklyGroups));
+        return weeklyGroups;
+    }
+
+    public static boolean isStartAndEndOfYear(Date startDate, Date endDate) {
+        LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDate endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        // 判断 startDate 是否是某一年的第一天
+        boolean isStartDateFirstDay = startLocalDate.equals(startLocalDate.with(TemporalAdjusters.firstDayOfYear()));
+        // 判断 endDate 是否是某一年的最后一天
+        boolean isEndDateLastDay = endLocalDate.equals(endLocalDate.with(TemporalAdjusters.lastDayOfYear()));
+        return isStartDateFirstDay && isEndDateLastDay && startLocalDate.getYear() == endLocalDate.getYear();
+    }
+
+    public static boolean isStartAndEndOfMonth(Date startDate, Date endDate) {
+        LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDate endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        // 判断 startDate 是否是某个月的第一天
+        boolean isStartDateFirstDay = startLocalDate.equals(startLocalDate.with(TemporalAdjusters.firstDayOfMonth()));
+        // 判断 endDate 是否是某个月的最后一天
+        boolean isEndDateLastDay = endLocalDate.equals(endLocalDate.with(TemporalAdjusters.lastDayOfMonth()));
+        return isStartDateFirstDay && isEndDateLastDay && startLocalDate.getMonthValue() == endLocalDate.getMonthValue() && startLocalDate.getYear() == endLocalDate.getYear();
+    }
+
+    /**
+     * 获取时间的上个月开始时间
+     * */
+    public static String getMomStartDate(Date startDate) {
+        LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        YearMonth lastMonth = YearMonth.from(startLocalDate).minusMonths(1);
+        LocalDate firstDayOfLastMonth = lastMonth.atDay(1);
+        Date from = Date.from(firstDayOfLastMonth.atStartOfDay(ZoneId.systemDefault()).toInstant());
+        String time = DateUtils.DateToString(from, DateUtils.YYYY_MM_DD);
+        return time;
+    }
+
+    /**
+     * 获取时间的上个月结束时间
+     * */
+    public static String getMomEndDate(Date startDate) {
+        LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        YearMonth lastMonth = YearMonth.from(startLocalDate).minusMonths(1);
+        LocalDate lastDayOfLastMonth = lastMonth.atEndOfMonth();
+        Date from = Date.from(lastDayOfLastMonth.atTime(23, 59, 59).atZone(ZoneId.systemDefault()).toInstant());
+        String time = DateUtils.DateToString(from, DateUtils.YYYY_MM_DD);
+        return time;
+    }
+
+    /**
+     * 获取时间的去年的时间
+     * */
+    public static String getYoyDate(Date startDate) {
+        LocalDateTime startDateTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        LocalDateTime lastYearSameDateTime = startDateTime.minusYears(1);
+        Date from = Date.from(lastYearSameDateTime.atZone(ZoneId.systemDefault()).toInstant());
+        String time = DateUtils.DateToString(from, DateUtils.YYYY_MM_DD);
+        return time;
+    }
+
+    public static String calculateMomGrowthRate(int currentMonthValue, int previousMonthValue) {
+        if (previousMonthValue == 0) {
+            return "0";
+        }
+        double rate = ((double) (currentMonthValue - previousMonthValue) / previousMonthValue) * 100;
+        return String.format("%.1f", rate);
+    }
+
+    public static String calculateMomGrowthRate(String currentStr, String previousStr) {
+        if(ObjectUtils.isEmpty(currentStr)){
+            return "0";
+        }
+        double previousMonthValue = 0;
+        if(ObjectUtils.isNotEmpty(previousStr) && !"null".equals(previousStr)){
+            previousMonthValue = Double.valueOf(previousStr);
+        }
+        double currentMonthValue = Double.valueOf(currentStr);
+        if(currentMonthValue == 0){
+            return "0";
+        }
+        double rate = ((double) (currentMonthValue - previousMonthValue) / previousMonthValue) * 100;
+        return String.format("%.1f", rate);
+    }
+
+}

--
Gitblit v1.8.0