package jnpf.flowable.util; import cn.hutool.core.date.DateUtil; import jnpf.flowable.entity.OperatorEntity; import jnpf.flowable.entity.TaskEntity; import jnpf.flowable.enums.NodeEnum; import jnpf.flowable.job.FlowJobUtil; import jnpf.flowable.job.FlowTime; 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.util.JsonUtil; import jnpf.util.RandomUtil; import jnpf.util.RedisUtil; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author :JNPF开发平台组 * @version: V3.1.0 * @copyright 引迈信息技术有限公司 * @date :2024/5/22 下午7:22 */ public class TimeUtil { public static boolean test = false; private static final SchedulerFactory schedulerFactory = new StdSchedulerFactory(); public static void addJob(String jobName, Integer time, Class jobClass, JobDataMap jobDataMap, Date startDate, Date endDate) { if (jobDataMap == null) { jobDataMap = new JobDataMap(); } JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName).setJobData(jobDataMap).build(); Trigger trigger = TriggerBuilder.newTrigger() .forJob(jobDetail) .withIdentity(jobName) .withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withIntervalInMinutes(test ? time : time * 60)) .startAt(startDate == null ? new Date() : startDate) .endAt(endDate != null ? endDate : null) .build(); try { //获取实例化的 Scheduler。 Scheduler scheduler = getScheduler(); //将任务及其触发器放入调度器 scheduler.scheduleJob(jobDetail, trigger); //调度器开始调度任务 if (!scheduler.isShutdown()) { scheduler.start(); } } catch (SchedulerException e) { } } private static Scheduler getScheduler() { try { return schedulerFactory.getScheduler(); } catch (SchedulerException e) { e.getMessage(); } return null; } public static void deleteJob(String jobName) { try { TriggerKey triggerKey = TriggerKey.triggerKey(jobName); Scheduler scheduler = getScheduler(); scheduler.pauseTrigger(triggerKey); scheduler.unscheduleJob(triggerKey); scheduler.deleteJob(JobKey.jobKey(jobName)); } catch (SchedulerException e) { e.getMessage(); } } public static void timeModel(List operatorList, FlowModel flowModel, RedisUtil redisUtil) { FlowModel model = new FlowModel(); model.setUserInfo(flowModel.getUserInfo()); model.setNodeEntityList(flowModel.getNodeEntityList()); model.setNodes(flowModel.getNodes()); model.setDeploymentId(flowModel.getDeploymentId()); model.setTaskEntity(flowModel.getTaskEntity()); model.setFormData(flowModel.getFormData()); List timeList = new ArrayList<>(); TaskEntity task = flowModel.getTaskEntity(); Map nodes = flowModel.getNodes(); Map formData = flowModel.getFormData(); Map> map = operatorList.stream().collect(Collectors.groupingBy(OperatorEntity::getNodeCode)); for (String key : map.keySet()) { model.setNodeCode(key); NodeModel nodeModel = new NodeModel(); NodeModel childNode = nodes.get(key); NodeModel startNode = nodes.values().stream().filter(e -> e.getType().equals(NodeEnum.start.getType())).findFirst().orElse(new NodeModel()); List operatorEntities = map.get(key); for (OperatorEntity entity : operatorEntities) { TimeConfig limit = childNode.getTimeLimitConfig(); if (limit.getOn() == 2) { limit = startNode.getTimeLimitConfig(); } nodeModel.setTimeLimitConfig(limit); boolean isOn = limit.getOn() != 0; if (isOn) { TimeConfig notice = childNode.getNoticeConfig(); FlowTimeModel noticeModel = new FlowTimeModel(); noticeModel.setOperatorId(entity.getId()); noticeModel.setTaskId(entity.getTaskId()); noticeModel.setFlowModel(model); if (notice.getOn() == 2) { notice = startNode.getNoticeConfig(); } noticeModel.setOn(notice.getOn() != 0); nodeModel.setNoticeConfig(notice); FlowTimeModel overModel = new FlowTimeModel(); overModel.setOperatorId(entity.getId()); overModel.setTaskId(entity.getTaskId()); overModel.setFlowModel(model); TimeConfig overTime = childNode.getOverTimeConfig(); if (overTime.getOn() == 2) { overTime = startNode.getOverTimeConfig(); } overModel.setOn(overTime.getOn() != 0); nodeModel.setOverTimeConfig(overTime); Date date = null; if (limit.getNodeLimit() == 0) { date = entity.getCreatorTime(); } else if (limit.getNodeLimit() == 1) { date = task.getStartTime(); } else if (limit.getNodeLimit() == 2) { Object data = formData.get(limit.getFormField()); try { date = new Date((Long) data); } catch (Exception e) { try { date = DateUtil.parse(String.valueOf(data)); } catch (Exception e1) { } } } if (date == null) { // date = new Date(); continue; } noticeModel.setStartDate(DateUtil.offsetMinute(date, test ? notice.getFirstOver() : notice.getFirstOver() * 60)); noticeModel.setEndDate(DateUtil.offsetSecond(DateUtil.offsetMinute(date, test ? limit.getDuringDeal() : limit.getDuringDeal() * 60), 1)); noticeModel.setChildNode(nodeModel); noticeModel.setDuring(notice.getOverTimeDuring()); timeList.add(noticeModel); overModel.setStartDate(DateUtil.offsetMinute(noticeModel.getEndDate(), test ? overTime.getFirstOver() : overTime.getFirstOver() * 60)); overModel.setEndDate(null); overModel.setChildNode(nodeModel); overModel.setOverTime(true); overModel.setDuring(overTime.getOverTimeDuring()); timeList.add(overModel); } } } for (FlowTimeModel timeModel : timeList) { Date date = new Date(); if (timeModel.getEndDate() != null && timeModel.getEndDate().getTime() < date.getTime()) { continue; } if (timeModel.getOn()) { String uuid = RandomUtil.uuId(); timeModel.setId(uuid); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.putAll(JsonUtil.entityToMap(timeModel)); FlowJobUtil.insertModel(timeModel, redisUtil); TimeUtil.addJob(uuid, timeModel.getDuring(), FlowTime.class, jobDataMap, timeModel.getStartDate(), timeModel.getEndDate()); } } } }