guohongjin
2024-05-15 5b7639f0bd9e056738ec15100ed0532e965c6cd5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
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<String> 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<String> 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<Map<String, Object>> wrapperTimeLIst(List<String> timeList, List<Map<String, Object>> 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<String, Object> hashMap = MapUtil.newHashMap();
                    hashMap.put("time", time);
                    hashMap.put("data", data);
                    return hashMap;
                })
                .collect(Collectors.toList());
    }
 
    public static void main(String[] args) {
        List<String> 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<Map<String, Object>> dataList = Arrays.asList(m1, m2, m3);
 
        List<Map<String, Object>> maps = StatDataUtil.wrapperTimeLIst(timeList, dataList, null);
        for (Map<String, Object> map : maps) {
            System.out.println(map.get("time") + "----" + map.get("data"));
        }
    }
}