定时任务更新特殊节假日与特殊工作日
来源:8-4 实现考勤成功页面(业务层)

慕斯902xzxc_das
2022-05-27
在这个网站提供了获取指定时间日历数据的接口:https://www.mxnzp.com/doc/detail?id=1 , 网站里详细说明了接口的请求路径、参数、响应的 json
格式。使用前需要先申请 app_id
和 app_secret
,网站里有详细的说明。
申请 app_id
和 app_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
非常感谢!
功德无量!
00 -
瓦片
2024-04-17
强啊!谢谢分享00 -
慕哥3130069
2023-03-06
你好,可以上传代码参考一下吗
00 -
慕函数4405078
2023-02-26
兄弟sql批量插入代码可以看下嘛
00 -
慕函数4405078
2023-02-17
牛的,直接变成简历上的东西
00 -
tgywatalive
2023-01-25
太牛了
00 -
weixin_慕丝8258692
2022-07-18
new Bi();
00
相似问题