定时任务更新特殊节假日与特殊工作日

来源:8-4 实现考勤成功页面(业务层)

慕斯902xzxc_das

2022-05-27

在这个网站提供了获取指定时间日历数据的接口:https://www.mxnzp.com/doc/detail?id=1 , 网站里详细说明了接口的请求路径、参数、响应的 json格式。使用前需要先申请 app_idapp_secret ,网站里有详细的说明。

申请 app_idapp_secret 后,编写一个定时任务在指定的时间向日历接口发起请求,获得指定年份的日历数据,并使用 hutool 工具类解析,将符合 特殊节假日特殊工作日 条件的日期保存,最终写入数据库即可。

配置文件:

emos:
  ...
  # 万年历接口参数
  calendar:
    url: https://www.mxnzp.com/api/holiday/list/year/
    app_id: 自己的appId
    app_secret: 自己的appSecret

开启定时任务:

...
@EnableScheduling
@SpringBootApplication
public class EmosWxApiApplication {
	...
}

定时任务:

@Log4j2
@Component
public class CalendarScheduledTask {

    @Value("${emos.calendar.url}")
    private String url;

    @Value("${emos.calendar.app_id}")
    private String addId;

    @Value("${emos.calendar.app_secret}")
    private String appSecret;

    @Autowired
    private HolidaysService holidaysService;

    @Autowired
    private WorkdayService workdayService;


    // 每年12月28日 01:00:00 同步下一年特殊节假日和特殊工作日
    @Scheduled(cron = "0 0 1 28 12 ?")
    private void getCalendarInfo() {
        int year = DateUtil.date().year() + 1; // 下一年
        log.info("{} 开始更新 {} 年的特殊节假日与特殊工作日", DateUtil.now(), year);
        try {
            String reqUrl = url + year;
            Map<String, Object> paramMap = new HashMap<>();
            paramMap.put("ignoreHoliday", false);
            paramMap.put("app_id", addId);
            paramMap.put("app_secret", appSecret);
            String res = HttpUtil.get(reqUrl, paramMap);
            JSONObject json = JSONUtil.parseObj(res);
            JSONArray jsonArray = json.get("data", JSONArray.class);
            List<HolidaysEntity> holidays = new ArrayList<>();
            List<WorkdayEntity> workdays = new ArrayList<>();
            List<JSONObject> months = JSONUtil.toList(jsonArray, JSONObject.class);
            for (JSONObject month : months) {
                JSONArray jsonArrayDays = month.get("days", JSONArray.class);
                List<JSONObject> days = JSONUtil.toList(jsonArrayDays, JSONObject.class);

                for (JSONObject day : days) {
                    String date = day.get("date", String.class);
                    int weekDay = day.get("weekDay", Integer.class);
                    // type:  0 工作日 1 假日 2 节假日 如果ignoreHoliday参数为true,这个字段不返回
                    int type = day.get("type", Integer.class);
                    // 如果在周一至周五区间,并且是休息日,则算做特殊休息日
                    if (1 <= weekDay && weekDay <= 5 && (type == 1 || type == 2)) {
                        HolidaysEntity holiday = new HolidaysEntity();
                        holiday.setDate(LocalDate.parse(date, DateTimeFormatter.ISO_LOCAL_DATE));
                        holidays.add(holiday);
                        continue;
                    }
                    // 如果是周六或周日,并且是工作日,则算做特殊工作日
                    if ((6 == weekDay || 7 == weekDay) && type == 0) {
                        WorkdayEntity workday = new WorkdayEntity();
                        workday.setDate(LocalDate.parse(date, DateTimeFormatter.ISO_LOCAL_DATE));
                        workdays.add(workday);
                    }
                }
            }
            // TODO 是否删除前一年的信息? 如果需要可以加上 DELETE FROM table WHERE YEAR(date) < #{thisYear}
            // 保存至数据库
            holidaysService.saveBatch(holidays);
            workdayService.saveBatch(workdays);

            log.info("{} 更新完成", DateUtil.now());
        } catch (RuntimeException e) {
            log.error("更新日历信息时出现异常: {}", e.getMessage());
            e.printStackTrace();
        }
    }
}

大概对了一下表里插入的记录,应该没啥问题。
图片描述

写回答

7回答

慕工程7058922

2024-07-22

非常感谢!

功德无量!

0
0

瓦片

2024-04-17

强啊!谢谢分享
0
0

慕哥3130069

2023-03-06

你好,可以上传代码参考一下吗

0
0

慕函数4405078

2023-02-26

兄弟sql批量插入代码可以看下嘛

0
0

慕函数4405078

2023-02-17

牛的,直接变成简历上的东西

0
0

tgywatalive

2023-01-25

太牛了

0
0

weixin_慕丝8258692

2022-07-18

new Bi();

0
0

SpringBoot 在线协同办公小程序开发 全栈式项目实战

未来趋势型业务 + 前后端综合技术栈 + 惊艳的细节打磨

1802 学习 · 1919 问题

查看课程