package jnpf.flowable.job; import cn.hutool.core.util.ObjectUtil; import jnpf.base.UserInfo; import jnpf.config.ConfigValueUtil; import jnpf.database.util.TenantDataSourceUtil; import jnpf.flowable.model.task.FlowModel; import jnpf.flowable.model.templatenode.nodejson.NodeModel; import jnpf.flowable.model.templatenode.nodejson.TimeConfig; import jnpf.flowable.model.time.FlowTimeModel; import jnpf.flowable.util.OverTimeUtil; import jnpf.flowable.util.TimeUtil; import jnpf.util.JsonUtil; import jnpf.util.RedisUtil; import jnpf.util.UserProvider; import jnpf.util.context.SpringContext; import org.quartz.*; import org.springframework.scheduling.quartz.QuartzJobBean; @DisallowConcurrentExecution public class FlowTime extends QuartzJobBean { private static RedisUtil redisUtil; private static ConfigValueUtil configValueUtil; private static OverTimeUtil overTimeUtil; static { redisUtil = SpringContext.getBean(RedisUtil.class); configValueUtil = SpringContext.getBean(ConfigValueUtil.class); overTimeUtil = SpringContext.getBean(OverTimeUtil.class); } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { JobDetail jobDetail = context.getJobDetail(); String jobName = jobDetail.getKey().getName(); JobDataMap jobDataMap = jobDetail.getJobDataMap(); FlowTimeModel model = FlowJobUtil.getModel(JsonUtil.getJsonToBean(jobDataMap, FlowTimeModel.class), redisUtil); boolean isModel = model == null; FlowTimeModel timeModel = isModel ? JsonUtil.getJsonToBean(jobDataMap, FlowTimeModel.class) : model; if (timeModel != null) { FlowModel flowModel = timeModel.getFlowModel(); UserInfo userInfo = flowModel.getUserInfo(); if (configValueUtil.isMultiTenancy()) { TenantDataSourceUtil.switchTenant(userInfo.getTenantId()); UserProvider.setLoginUser(userInfo); UserProvider.setLocalLoginUser(userInfo); } try { overTimeUtil.overMsg(timeModel); Boolean isPause = timeModel.getIsPause(); timeModel.setIsPause(false); boolean overTime = timeModel.getOverTime(); FlowJobUtil.insertModel(timeModel, redisUtil); if (overTime) { if (isPause) { return; } NodeModel nodeModel = timeModel.getChildNode(); TimeConfig time = nodeModel.getOverTimeConfig(); Integer num = time.getOverAutoApproveTime(); Boolean overAutoApprove = timeModel.getChildNode().getOverTimeConfig().getOverAutoApprove(); if (overAutoApprove && ObjectUtil.equals(timeModel.getNum(), num)) { // 放在另一个redis的key(用于自动审批) FlowJobUtil.insertOperator(timeModel, redisUtil); } Boolean overAutoTransfer = timeModel.getChildNode().getOverTimeConfig().getOverAutoTransfer(); Integer transferNum = time.getOverAutoTransferTime(); if (!overAutoApprove && overAutoTransfer && ObjectUtil.equals(timeModel.getTransferNum(), transferNum)) { FlowJobUtil.insertTransfer(timeModel, redisUtil); } } else { // 下一次时间大于结束时间 删除提醒缓存 if (timeModel.getEndDate().getTime() < context.getNextFireTime().getTime()) { FlowJobUtil.removeModel(timeModel, redisUtil); TimeUtil.deleteJob(jobName); } } } catch (Exception e) { FlowJobUtil.removeModel(timeModel, redisUtil); TimeUtil.deleteJob(jobName); } } else { TimeUtil.deleteJob(jobName); FlowJobUtil.removeModel(model, redisUtil); } } }