content: package me.flyray.rbac.service.impl;
  
  import java.util.Date;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  import javax.annotation.PostConstruct;
  
  import org.quartz.CronTrigger;
  import org.quartz.Scheduler;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.stereotype.Service;
  import org.springframework.transaction.annotation.Transactional;
  
  import me.flyray.rbac.dao.ScheduleJobDao;
  import me.flyray.rbac.entity.ScheduleJobEntity;
  import me.flyray.rbac.service.ScheduleJobService;
  import me.flyray.rbac.utils.Constant.ScheduleStatus;
  import me.flyray.rbac.utils.ScheduleUtils;
  
  @Service("scheduleJobService")
  public class ScheduleJobServiceImpl implements ScheduleJobService {
  	@Autowired
      private Scheduler scheduler;
  	@Autowired
  	private ScheduleJobDao schedulerJobDao;
  	
  	/**
  	 * 项目启动时，初始化定时器
  	 */
  	@PostConstruct
  	public void init(){
  		List<ScheduleJobEntity> scheduleJobList = schedulerJobDao.queryList(new HashMap<String, Object>());
  		for(ScheduleJobEntity scheduleJob : scheduleJobList){
  			CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());
              //如果不存在，则创建
              if(cronTrigger == null) {
                  ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
              }else {
                  ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
              }
  		}
  	}
  	
  	@Override
  	public ScheduleJobEntity queryObject(Long jobId) {
  		return schedulerJobDao.queryObject(jobId);
  	}
  
  	@Override
  	public List<ScheduleJobEntity> queryList(Map<String, Object> map) {
  		return null;/*schedulerJobDao.queryList(map);*/
  	}
  
  	@Override
  	public int queryTotal(Map<String, Object> map) {
  		return schedulerJobDao.queryTotal(map);
  	}
  
  	@Override
  	@Transactional
  	public void save(ScheduleJobEntity scheduleJob) {
  		scheduleJob.setCreateTime(new Date());
  		scheduleJob.setStatus(ScheduleStatus.NORMAL.getValue());
          schedulerJobDao.save(scheduleJob);
          
          ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
      }
  	
  	@Override
  	@Transactional
  	public void update(ScheduleJobEntity scheduleJob) {
          ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
                  
          schedulerJobDao.update(scheduleJob);
      }
  
  	@Override
  	@Transactional
      public void deleteBatch(Long[] jobIds) {
      	for(Long jobId : jobIds){
      		ScheduleUtils.deleteScheduleJob(scheduler, jobId);
      	}
      	
      	//删除数据
      	schedulerJobDao.deleteBatch(jobIds);
  	}
  
  	@Override
      public int updateBatch(Long[] jobIds, int status){
      	Map<String, Object> map = new HashMap<>();
      	map.put("list", jobIds);
      	map.put("status", status);
      	return schedulerJobDao.updateBatch(map);
      }
      
  	@Override
  	@Transactional
      public void run(Long[] jobIds) {
      	for(Long jobId : jobIds){
      		ScheduleUtils.run(scheduler, queryObject(jobId));
      	}
      }
  
  	@Override
  	@Transactional
      public void pause(Long[] jobIds) {
          for(Long jobId : jobIds){
      		ScheduleUtils.pauseJob(scheduler, jobId);
      	}
          
      	updateBatch(jobIds, ScheduleStatus.PAUSE.getValue());
      }
  
  	@Override
  	@Transactional
      public void resume(Long[] jobIds) {
      	for(Long jobId : jobIds){
      		ScheduleUtils.resumeJob(scheduler, jobId);
      	}
  
      	updateBatch(jobIds, ScheduleStatus.NORMAL.getValue());
      }
      
  }
  