使用Hutool DateUtil生成工作日历日期,统计当年未填日报天数

使用Hutool DateUtil生成工作日历日期,统计当年未填日报天数

从去年七月份至今,恶魔般的业务疯狂提需求,逮着我一个人使劲薅,生怕我有一丁点空闲时间。这周又提了一个看板需求。其中有一个数就是需要统计当月、当年未填报的天数。而且根据岗位统计方式也不一样,比如,A岗位,是每天都需要提交日报,B岗位是法定工作日才提交。那么我程序怎么知道每年具有中国特色的法定工作日是哪天呢?,我给业务说:“要给你们做个功能,你们自己去手动录入”,业务说:“疯了吧,那每年要去维护两百多天,我肯定不干”。不干就算,那就程序干嘛。这就需要我们去做初始化每年的工作日历数据。

那么这个日历怎么处理呢?这里,先基于Hutool提交DateUtil工具类,判断是否是周末(周六和周日),然后再基于国务院每年发布的节假日安排来判断哪天是放假?哪天是补班

我们先建一张存储日期的表和对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Getter
@Setter
@TableName("TD_WORK_CALENDAR")
public class TdWorkCalendar {
@TableField("WORK_DATE")
private Date workDate;
@TableField("IS_WEEKEND")
private Integer isWeekend=0;
@TableField("IS_VACATION")
private Integer isVacation=0;
@TableField("IS_WORK")
private Integer isWork=0;
@TableField("CREATE_TIME")
private Date createTime;
}

这里,我们先维护一个假日Map对象,方便后面判断

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
private static Map<String, Integer> VACATION_DAYS = new HashMap<>();


static {
//元旦
VACATION_DAYS.put("2024-01-01", 1);
VACATION_DAYS.put("2024-01-02", 1);

//春节
VACATION_DAYS.put("2024-02-10", 1);
VACATION_DAYS.put("2024-02-11", 1);
VACATION_DAYS.put("2024-02-12", 1);
VACATION_DAYS.put("2024-02-13", 1);
VACATION_DAYS.put("2024-02-14", 1);
VACATION_DAYS.put("2024-02-15", 1);
VACATION_DAYS.put("2024-02-16", 1);
VACATION_DAYS.put("2024-02-17", 1);

//清明节
VACATION_DAYS.put("2024-04-04", 1);
VACATION_DAYS.put("2024-04-05", 1);
VACATION_DAYS.put("2024-04-06", 1);

//五一节
VACATION_DAYS.put("2024-05-01", 1);
VACATION_DAYS.put("2024-05-02", 1);
VACATION_DAYS.put("2024-05-03", 1);
VACATION_DAYS.put("2024-05-04", 1);
VACATION_DAYS.put("2024-05-05", 1);

//端午节
VACATION_DAYS.put("2024-06-08", 1);
VACATION_DAYS.put("2024-06-09", 1);
VACATION_DAYS.put("2024-06-10", 1);

//中秋节
VACATION_DAYS.put("2024-09-15", 1);
VACATION_DAYS.put("2024-09-16", 1);
VACATION_DAYS.put("2024-09-17", 1);


//国庆节
VACATION_DAYS.put("2024-10-01", 1);
VACATION_DAYS.put("2024-10-02", 1);
VACATION_DAYS.put("2024-10-03", 1);
VACATION_DAYS.put("2024-10-04", 1);
VACATION_DAYS.put("2024-10-05", 1);
VACATION_DAYS.put("2024-10-06", 1);
VACATION_DAYS.put("2024-10-07", 1);
}

private static Map<String, Integer> WORK_DAYS = new HashMap<>();

static {
//春节补班
WORK_DAYS.put("2024-02-04", 1);
WORK_DAYS.put("2024-02-18", 1);

//清明补班
WORK_DAYS.put("2024-04-07", 1);

//五一补班
WORK_DAYS.put("2024-04-28", 1);
WORK_DAYS.put("2024-05-11", 1);

//中秋节补班
WORK_DAYS.put("2024-09-14", 1);

//国庆节补班
WORK_DAYS.put("2024-09-29", 1);
WORK_DAYS.put("2024-10-12", 1);
}

基础信息准备好了,接下来就判断是否是工作日、是否是法定假日,是否是补班

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void saveWorkCalendar() {
Date start = DateUtil.parse("2024-01-01", "yyyy-MM-dd");
Date end = DateUtil.parse("2024-12-31", "yyyy-MM-dd");
List<TdWorkCalendar> list=new ArrayList<>(366);
while (start.compareTo(end)<=0){
TdWorkCalendar workCalendar=new TdWorkCalendar();
workCalendar.setWorkDate(start);
if(DateUtil.isWeekend(start)){
workCalendar.setIsWeekend(1);
}
if(VACATION_DAYS.containsKey(DateUtil.format(start,"yyyy-MM-dd"))){
workCalendar.setIsVacation(1);
}
if(WORK_DAYS.containsKey(DateUtil.format(start,"yyyy-MM-dd"))){
workCalendar.setIsWork(1);
}
list.add(workCalendar);
start=DateUtil.offsetDay(start,1);

}
this.saveBatch(list);
}

数据已经初始化好了,现在就只需要去把工作日取出来,

1
select WORK_DATE,IS_WEEKEND,IS_VACATION,IS_WORK,CREATE_TIME from TD_WORK_CALENDAR where (IS_WEEKEND=0 and IS_VACATION=0) OR (IS_WORK=1)

最后,将日报表关联一下工作日日历,就可以统计出当年、当月未填的天数。

使用Hutool DateUtil生成工作日历日期,统计当年未填日报天数

https://blogs.52fx.biz/posts/3276615064.html

作者

eyiadmin

发布于

2024-04-16

更新于

2024-05-31

许可协议

评论