quartz实现定时任务:设置一周的数据,之后每周数据除日期不同其他一样,排除法定节假日,以及加入调班日期

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LuuvyJune/article/details/84837570

首先,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,如果有好的建议,欢迎留言指导!

猜你喜欢

转载自blog.csdn.net/LuuvyJune/article/details/84837570
今日推荐