首先,quartz与spring结合使用:
pom.xml:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
spring的配置文件:我这叫spring-context.xml
<!-- 注册自定义作业类 -->
<bean id="myJob" class="com.thinkgem.jeesite.modules.bespeakweb.job.ValidTimeJob"></bean>
<!-- 配置JobDetail -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 注入目标对象 -->
<property name="targetObject" ref="myJob"/>
<!-- 注入目标方法 -->
<property name="targetMethod" value="execute"/>
</bean>
<!-- 调用触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail"/>
<property name="cronExpression" value="0 0 0 ? * FRI"/>
</bean>
<!-- 调度工厂 -->
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
java代码:
手动找齐2019年节假日以及补班,官方还没有发布,找的网上的一些小道消息,暂时不准确
import java.util.List;
public class WorkDayUtils {
public static List<String> getHolidays(){
List<String> holidays = new ArrayList<String>();
holidays.add("2018-12-30");//元旦
holidays.add("2019-12-31");
holidays.add("2019-01-01");
holidays.add("2019-02-04");//春节
holidays.add("2019-02-05");
holidays.add("2019-02-06");
holidays.add("2019-02-07");
holidays.add("2019-02-08");
holidays.add("2019-02-09");
holidays.add("2019-02-10");
//清明节
holidays.add("2019-04-05");
holidays.add("2019-04-06");
holidays.add("2019-04-07");
holidays.add("2019-04-29");//劳动节
holidays.add("2019-04-30");
holidays.add("2019-05-01");
holidays.add("2019-06-07");//端午节
holidays.add("2019-06-08");
holidays.add("2019-06-09");
holidays.add("2019-09-13");//中秋节
holidays.add("2019-09-14");
holidays.add("2019-09-15");
holidays.add("2019-10-01");//国庆节
holidays.add("2019-10-02");
holidays.add("2019-10-03");
holidays.add("2019-10-04");
holidays.add("2019-10-05");
holidays.add("2019-10-06");
holidays.add("2019-10-07");
return holidays;
}
public static List<String> getWorkDays(){
List<String> workDays = new ArrayList<String>();
workDays.add("2018-12-29");//补班
workDays.add("2019-02-02");
workDays.add("2019-02-03");
workDays.add("2019-04-27");
workDays.add("2019-04-28");
workDays.add("2019-09-28");
workDays.add("2019-09-29");
return workDays;
}
}
/**
* 提供一个作业类
*/
public class ValidTimeJob {
@Autowired
private BespeakValidtimeWebService bespeakValidtimeService;
//轮训设置每周五0点执行
//设置本周每天工作日的预约时间,那么下周每天的预约时间和上周一样,排除掉节假日
//获取设置的一周的工作日+7 开始时间和结束时间不变 每设置一次,添加下周的数据
public void execute() {
//查询设置的可预约信息(当前时间所在的一周) 界面设置时已经判定不能选周六和周日
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // 日期格式
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
if(dayWeek==1){
dayWeek = 8;
}
//周一
cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - dayWeek);// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
String viStartDate = dateFormat.format(cal.getTime());
//周五
cal.add(Calendar.DATE, 2 +cal.getFirstDayOfWeek());
String viEndDate = dateFormat.format(cal.getTime());
List<Validtime> validtime = bespeakValidtimeService.getWeekValidTime(viStartDate,viEndDate);
List<String> holidays = WorkDayUtils.getHolidays();
List<String> workdays = WorkDayUtils.getWorkDays();
if(validtime.size()!=0) {
Validtime bespeakValidtime = new Validtime();
for (int i = 0; i < validtime.size(); i++) {
try {
//获取日期+7,其他时间段不变
Date date = dateFormat.parse(validtime.get(i).getViDate());
Date newDate = addDate(date, 7); // 指定日期加上7天
//判断该新日期是不是法定节假日,不是的话set
if(!holidays.contains(dateFormat.format(newDate))){
bespeakValidtime = setValidTime(validtime.get(i).getDepId(),dateFormat.format(newDate),validtime.get(i).getVtStarttime(),
validtime.get(i).getVtEndtime(),validtime.get(i).getVtBatch());
bespeakValidtimeService.save(bespeakValidtime);
}
//当是一周的最后一天,判断之后的周六和周日是否是补班
if(i==validtime.size()-1){
Date newDate1 = addDate(newDate, 1);
Date newDate2 = addDate(newDate, 2);
//补班 周六或者周日 是补班的话set
if(workdays.contains(dateFormat.format(newDate1))){
bespeakValidtime = setValidTime(validtime.get(i).getDepId(),dateFormat.format(newDate1),validtime.get(i).getVtStarttime(),
validtime.get(i).getVtEndtime(),validtime.get(i).getVtBatch());
bespeakValidtimeService.save(bespeakValidtime);
}else if(workdays.contains(dateFormat.format(newDate2))){
bespeakValidtime = setValidTime(validtime.get(i).getDepId(),dateFormat.format(newDate2),validtime.get(i).getVtStarttime(),
validtime.get(i).getVtEndtime(),validtime.get(i).getVtBatch());
bespeakValidtimeService.save(bespeakValidtime);
}
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
public Validtime setValidTime(String depId,String date,String start,String end,Integer batch){
Validtime bespeakValidtime = new Validtime();
bespeakValidtime.setDepId(depId);
bespeakValidtime.setViDate(date);
bespeakValidtime.setVtStarttime(start);
bespeakValidtime.setVtEndtime(end);
bespeakValidtime.setVtBatch(batch);
return bespeakValidtime;
}
public static Date addDate(Date date, long day) throws ParseException {
long time = date.getTime(); // 得到指定日期的毫秒数
day = day*24*60*60*1000; // 要加上的天数转换成毫秒数
time+=day; // 相加得到新的毫秒数
return new Date(time); // 将毫秒数转换成日期
}
}
个人觉得,这段代码还是写的low,如果有好的建议,欢迎留言指导!