package com.cabletech.business.sysmanager.job; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleTrigger; import org.quartz.Trigger; import org.quartz.impl.StdSchedulerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.scheduling.quartz.QuartzJobBean; import com.cabletech.business.sysmanager.model.WorkorderControlInfo; import com.cabletech.business.sysmanager.service.RemindTimeConfigureService; import com.cabletech.business.sysmanager.service.WorkorderControlInfoService; /** * 提醒任务类 * * @author zg * */ public class WarnJob extends QuartzJobBean implements Job { /** * 日志类对象 */ public Logger logger = Logger.getLogger(this.getClass()); private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private WorkorderControlInfoService workorderControlInfoService = null; private RemindTimeConfigureService remindTimeConfigureService = null; // 公用类 private Common common = new Common(); private WorkorderControlInfo object = null; private String id = ""; private String workorderId = ""; private String workorderType = ""; private String handleLimit = ""; private String workordertitle = ""; private String handlepersonid = ""; private String smsflag = ""; private String professionFlag = ""; private String smstype = ""; private String limitNum = ""; private List<Map<String, Object>> alllist = new ArrayList<Map<String, Object>>(); private List<Map<String, Object>> remindTimeConfigureList = new ArrayList<Map<String, Object>>(); /** * 初始化参数 */ public void init() { ApplicationContext springContext = new ClassPathXmlApplicationContext( new String[] { "classpath:applicationContext.xml" }); workorderControlInfoService = (WorkorderControlInfoService) springContext .getBean("workorderControlInfoService"); remindTimeConfigureService = (RemindTimeConfigureService) springContext .getBean("remindTimeConfigureService"); object = (WorkorderControlInfo) springContext .getBean("workorderControlInfo"); common = (Common) springContext.getBean("common"); logger.info("--------------初始化完毕----------------"); } /** * 组装bean 为下面的类使用 * * @param map * Map<String,Object> * @return */ public WorkorderControlInfo getObject(Map<String, Object> map) { if (map.get("ID") != null) { id = map.get("ID").toString(); } if (map.get("WORKORDER_ID") != null) { workorderId = map.get("WORKORDER_ID").toString(); } if (map.get("WORKORDER_TYPE") != null) { workorderType = map.get("WORKORDER_TYPE").toString(); } if (map.get("HANDLE_LIMIT") != null) { handleLimit = map.get("HANDLE_LIMIT").toString(); } if (map.get("WORKORDER_TITLE") != null) { workordertitle = map.get("WORKORDER_TITLE").toString(); } if (map.get("HANDLE_PERSONID") != null) { handlepersonid = map.get("HANDLE_PERSONID").toString(); } if (map.get("SMS_SEND_FLG") != null) { smsflag = map.get("SMS_SEND_FLG").toString(); } if (map.get("PROFESSION_TYPE") != null) { professionFlag = map.get("PROFESSION_TYPE").toString(); } object.setWorkorderId(workorderId); object.setHandlePersonId(handlepersonid); object.setId(id); object.setWorkorderType(workorderType); object.setSmsSendFlg(smsflag); object.setProfessionType(professionFlag); try { object.setHandleLimit(sdf.parse(handleLimit)); } catch (ParseException e) { logger.error("", e); } object.setWorkorderTitle(workordertitle); logger.info("-----------组装完毕---------------"); return object; } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { try { logger.info("开始-------------job----------------"); init(); // 获取当前所有的没有执行的控制信息列表 alllist = workorderControlInfoService.getAllList(); for (Map<String, Object> map : alllist) { object = getObject(map); if (StringUtils.isNotBlank(object.getWorkorderType()) && StringUtils.isNotBlank(object.getProfessionType())) { remindTimeConfigureList = remindTimeConfigureService .getObjectListByType(object.getWorkorderType(), object.getProfessionType()); for (Map<String, Object> map2 : remindTimeConfigureList) { if (map2.get("SMS_TYPE") != null) { smstype = String.valueOf(map2.get("SMS_TYPE")); } if (map2.get("TIMEOUT_NUM") != null) { limitNum = String.valueOf(map2.get("TIMEOUT_NUM")); } // 开始判断 时限 和 超时时间设置的关系 Date now = new Date(); Integer limitTime = Integer.parseInt(limitNum);// 分钟 // 超时时间 long ins_later = getMillisOfDate(now) - getMillisOfDate(object.getHandleLimit());// 当前时间减去时限获得毫秒数 long ins_front = getMillisOfDate(object .getHandleLimit()) - getMillisOfDate(now);// 时限减去当前时间获得毫秒数 long limit_pre = ins_front % (60 * 1000);// 获取分钟数 long limit_later = ins_later % (60 * 1000);// 获取分钟数 common.setContext(context); common.setLimit_later(limit_later); common.setLimit_pre(limit_pre); common.setLimitTime(limitTime); updateJob(object, smstype, common); logger.info("---------------------------结束job-----------------------------------------------------"); } } } } catch (Exception e) { logger.error("", e); } } /** * 开始job的时间 推迟 30秒。。。 * * @return * @throws ParseException */ public Date getDateAdd() throws ParseException { long d = 0; java.util.Calendar c = java.util.Calendar.getInstance(); c.setTime(new Date()); d = c.getTimeInMillis() + 30 * 1000; Date da = new Date(d); return da; } /** * 创建job * * @param object * WorkorderControlInfo * @param common * Common * @param smstype * String * @throws ParseException */ public void updateJob(WorkorderControlInfo object, String smstype, Common common) throws ParseException { Scheduler sched = null; JobDetail job = null; Trigger trigger = null; try { SchedulerFactory sf = new StdSchedulerFactory(); sched = sf.getScheduler(); JobDataMap triggerDataMap = common.getContext().getTrigger() .getJobDataMap(); if (smstype.equals("001")) {// 超时前 job = new JobDetail(object.getWorkorderId(), "WarnJob_Pre_Group", PreOvertime.class); trigger = new SimpleTrigger(object.getWorkorderTitle(), "WarnTrigger_Pre_Group", getDateAdd()); } if (smstype.equals("002")) {// 超时 job = new JobDetail(object.getWorkorderId(), "WarnJob_Next_Group", OnceOvertime.class); trigger = new SimpleTrigger(object.getWorkorderTitle(), "WarnTrigger_Next_Group", getDateAdd()); } if (smstype.equals("003")) {// 超时后 job = new JobDetail(object.getWorkorderId(), "WarnJob_After_Group", AfterOvertime.class); trigger = new SimpleTrigger(object.getWorkorderTitle(), "WarnTrigger_After_Group", getDateAdd()); } triggerDataMap.put("object", object); triggerDataMap.put("common", common); job.setJobDataMap(triggerDataMap); sched.scheduleJob(job, trigger); sched.start();// 开始job // 修改工单job类型 workorderControlInfoService.updateSchedulerState(object .getWorkorderId()); } catch (SchedulerException e) { logger.error("", e); } } /** * 获取时间毫分秒 * * @param date * Date * @return */ public static long getMillisOfDate(java.util.Date date) { java.util.Calendar c = java.util.Calendar.getInstance(); c.setTime(date); return c.getTimeInMillis(); } public Logger getLogger() { return logger; } public void setLogger(Logger logger) { this.logger = logger; } public SimpleDateFormat getSdf() { return sdf; } public void setSdf(SimpleDateFormat sdf) { this.sdf = sdf; } public WorkorderControlInfoService getWorkorderControlInfoService() { return workorderControlInfoService; } public void setWorkorderControlInfoService( WorkorderControlInfoService workorderControlInfoService) { this.workorderControlInfoService = workorderControlInfoService; } public RemindTimeConfigureService getRemindTimeConfigureService() { return remindTimeConfigureService; } public void setRemindTimeConfigureService( RemindTimeConfigureService remindTimeConfigureService) { this.remindTimeConfigureService = remindTimeConfigureService; } public WorkorderControlInfo getObject() { return object; } public void setObject(WorkorderControlInfo object) { this.object = object; } }