Parcourir la source

判断是否为节假日

main
1341924763@qq.com il y a 1 jour
Parent
révision
f537082199

+ 58
- 7
zs-manager/src/main/java/com/ruoyi/zhushi/job/DkJob.java Voir le fichier

@@ -5,11 +5,13 @@ import com.ruoyi.zhushi.entity.DkAttendanceGroup;
import com.ruoyi.zhushi.entity.DkCheckInRecord;
import com.ruoyi.zhushi.mapper.DkRecordMapper;
import com.ruoyi.zhushi.util.Constans;
import com.ruoyi.zhushi.util.TimeUtils;
import com.ruoyi.zhushi.util.HolidayUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.ParseException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@@ -19,17 +21,65 @@ public class DkJob {
@Autowired
private DkRecordMapper dkRecordMapper;

// @Scheduled(cron = "0/1 0 0 ? * MON-FRI")
// public void executeTask() {
// // 任务逻辑
// System.out.println("执行工作日18点定时任务:" + System.currentTimeMillis());
// }
// 每天18执行
@Scheduled(cron = "0 0 18 * * ?")
// @Scheduled(cron = "0/10 * * * * ?")
public void executeTask() throws ParseException {
// 任务逻辑
System.out.println("执行工作日18点定时任务:" + System.currentTimeMillis());
try {
// 判断当天时间是否为节假日,为0的时候是工作日
String yearHoliday = HolidayUtil.isWorkingDay(LocalDate.now().toString());
if(yearHoliday.equals("0")){
// 获取所有员工
List<JSONObject> jsonObjects = dkRecordMapper.queryAllUsers();
for (JSONObject jsonObject : jsonObjects) {
// 获取员工id
Long userId = jsonObject.getLong("userId");
// 如果没有员工id,则跳过
if (userId == null){
continue;
}
// 获取员工姓名
String userName = jsonObject.getString("userName");

// 根据userId 查询考勤组信息
DkAttendanceGroup appDTO = dkRecordMapper.queryConfigByUserId(userId);
// 如果没有考勤组信息,则跳过
if(appDTO == null){
continue;
}
// 获取员工打卡记录根据员工id
List<DkCheckInRecord> records = dkRecordMapper.getRecordHistory(userId);
if(records == null || records.size() == 0){
DkCheckInRecord dkCheckInRecord = new DkCheckInRecord();
dkCheckInRecord.setSysUserId(userId);
dkCheckInRecord.setSysUserName(userName);
dkCheckInRecord.setCheckInTime(LocalDateTime.now());
dkCheckInRecord.setCheckInStatus(Constans.CHECK_IN_STATUS_0);
dkCheckInRecord.setClockInStatus(Constans.CHECK_IN_STATUS_0);
dkCheckInRecord.setClockOutStatus(Constans.CHECK_IN_STATUS_0);
dkCheckInRecord.setAttendanceGroupId(appDTO.getId());
dkCheckInRecord.setAttendanceGroupName(appDTO.getName());
dkRecordMapper.insertOrUpdate(dkCheckInRecord);
}

}
}

System.out.println("执行工作日18点定时任务:" + System.currentTimeMillis());
// 具体任务逻辑
} catch (Exception e) {
System.out.println("执行工作日18点定时任务失败:" + e.getMessage());
}
}

// 每周一到周五18点执行
@Scheduled(cron = "0 0 18 ? * MON-FRI")
// @Scheduled(cron = "0 0 18 ? * MON-FRI")
public void executeWeekdayTask() {
System.out.println("执行工作日18点定时任务:" + System.currentTimeMillis());
try {

// 获取所有员工
List<JSONObject> jsonObjects = dkRecordMapper.queryAllUsers();
for (JSONObject jsonObject : jsonObjects) {
@@ -73,6 +123,7 @@ public class DkJob {
}



// @Scheduled(cron = "0/10 * * * * MON-FRI") // 每分钟执行
// public void testTask() {
// System.out.println("执行工作日18点定时任务:" + System.currentTimeMillis());

+ 192
- 0
zs-manager/src/main/java/com/ruoyi/zhushi/util/HolidayUtil.java Voir le fichier

@@ -0,0 +1,192 @@
package com.ruoyi.zhushi.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
*
* 判断是否是节假日,工具类
*
* 返回值 : 0 上班 1周末 2节假日
*
* @Author wzk
* @Date 2024/2/23 16:05
*/
@Slf4j
public class HolidayUtil {

static Map<String,List<String>> holiday =new HashMap<>(); //假期
static Map<String,List<String>> extraWorkDay =new HashMap<>(); //调休日

//判断是否为节假日

/**
*
* @param time 日期参数 格式‘yyyy-MM-dd’,不传参则默认当前日期
* @return
*/
public static String isWorkingDay(String time) throws ParseException {
Date parse = null;
//为空则返回当前时间
if (StringUtils.isNotBlank(time)){
SimpleDateFormat getYearFormat = new SimpleDateFormat("yyyy-MM-dd");
parse = getYearFormat.parse(time);
}else {
parse = new Date();
}
String newDate = new SimpleDateFormat("yyyy").format(parse);

//判断key是否有参数年份
if(!holiday.containsKey(newDate)){
String holiday = getYearHoliday(newDate);
if ("No!".equals(holiday)){
return "该年份未分配日期安排!";
}
}
//得到日期是星期几
Date date = formatStringToDate(time, false);
// Calendar.getInstance()获取一个Calendar实例
Calendar calendar = Calendar.getInstance();
// 设置日期
calendar.setTime(date);
// 获取星期
int weekday = getDayOfWeek(calendar);


// 是否是节假日
if(holiday.get(newDate).contains(time)){
return "3";
}else if(extraWorkDay.get(newDate).contains(time)){ //是否为调休
return "2";
}else if(weekday == Calendar.SATURDAY || weekday == Calendar.FRIDAY){ //是否为周末
return "1";
}else{
return "0";
}
}

/**
*
* @param date 日期参数 格式‘yyyy’,不传参则默认当前日期
* @return
*/
public static String getYearHoliday(String date) throws ParseException {

//获取免费api地址
String httpUrl="https://timor.tech/api/holiday/year/"+date;
BufferedReader reader = null;
String result = null;
// 用于存储返回的年份节假日数据
StringBuffer sbf = new StringBuffer();

try {
// 创建url对象
URL url = new URL(httpUrl);
// 使用openConnection方法创建了一个URLConnection对象
URLConnection connection = url.openConnection();
// 设置请求头
connection.setRequestProperty("User-Agent", "Mozilla/4.76");
connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
/**
* 使用getInputStream方法获取输入流,这个输入流可以用来读取从URL地址返回的数据,
* 可能是HTML内容、JSON数据或其他类型的信息。
* 具体取决于URL地址所指向的资源类型。
*/
InputStream is = connection.getInputStream();
// BufferedReader创建字节流对象,InputStreamReader将字节流转换为字符流,编码为utf8
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));

String strRead = null;
while ((strRead = reader.readLine()) != null) {
sbf.append(strRead); // 将每行内容追加到sbf字符串变量中
sbf.append("\r\n"); // 手动添加换行符
}
reader.close(); // 关闭流

//字符串转json
JSONObject json = JSON.parseObject(sbf.toString());
//根据holiday字段获取jsonObject内容
JSONObject holiday = json.getJSONObject("holiday");
if (holiday.size() == 0){
return "No!";
}
List hoList = new ArrayList<>();
List extraList = new ArrayList<>();
for (Map.Entry<String, Object> entry : holiday.entrySet()) {
// 读取字符的值,并转换成字符串
String value = entry.getValue().toString();
// 将字符串改为json格式
JSONObject jsonObject = JSONObject.parseObject(value);
// 获取是否为假日(是为true,不是为false)
String hoBool = jsonObject.getString("holiday");
// 获取时间
String extra = jsonObject.getString("date");
//判断不是假期后调休的班
if(hoBool.equals("true")){
hoList.add(extra);
// 添加假期
HolidayUtil.holiday.put(date,hoList);
}else {
extraList.add(extra);
// 添加调休日
HolidayUtil.extraWorkDay.put(date,extraList);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}


/**
* 功能:获取String日期对应的时间
* isTotal = false ;yyyy-MM-dd格式限定
* isTotal = true ;yyyy-MM-dd hh-mm-ss格式限定
*/
public static Date formatStringToDate(String base, Boolean isTotal) {
// 是否包含时间部分
String format = isTotal ? "yyyy-MM-dd HH-mm-ss" : "yyyy-MM-dd";
// 格式化字符串
DateFormat df = new SimpleDateFormat(format);
Date baseTime;
try {
// 设定日期
baseTime = df.parse(base);
} catch (Exception e) {
return null;
}
return baseTime;
}


/**
* 获得本日星期数,星期一:1,星期日:7 如果传入null则默认为本日
*
* @return
*/
public static int getDayOfWeek(Calendar calendar) {
int today;
if (calendar != null) {
today = calendar.get(Calendar.DAY_OF_WEEK);
} else {
today = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
}
if (today == 1)
return 7;
else
return today - 1;
}
}

Chargement…
Annuler
Enregistrer