TimeUtil.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package jnpf.flowable.util;
  2. import cn.hutool.core.date.DateUtil;
  3. import jnpf.flowable.entity.OperatorEntity;
  4. import jnpf.flowable.entity.TaskEntity;
  5. import jnpf.flowable.enums.NodeEnum;
  6. import jnpf.flowable.job.FlowJobUtil;
  7. import jnpf.flowable.job.FlowTime;
  8. import jnpf.flowable.model.task.FlowModel;
  9. import jnpf.flowable.model.templatenode.nodejson.NodeModel;
  10. import jnpf.flowable.model.templatenode.nodejson.TimeConfig;
  11. import jnpf.flowable.model.time.FlowTimeModel;
  12. import jnpf.util.JsonUtil;
  13. import jnpf.util.RandomUtil;
  14. import jnpf.util.RedisUtil;
  15. import org.quartz.*;
  16. import org.quartz.impl.StdSchedulerFactory;
  17. import java.util.ArrayList;
  18. import java.util.Date;
  19. import java.util.List;
  20. import java.util.Map;
  21. import java.util.stream.Collectors;
  22. /**
  23. * @author :JNPF开发平台组
  24. * @version: V3.1.0
  25. * @copyright 引迈信息技术有限公司
  26. * @date :2024/5/22 下午7:22
  27. */
  28. public class TimeUtil {
  29. public static boolean test = false;
  30. private static final SchedulerFactory schedulerFactory = new StdSchedulerFactory();
  31. public static void addJob(String jobName, Integer time, Class<? extends Job> jobClass, JobDataMap jobDataMap, Date startDate, Date endDate) {
  32. if (jobDataMap == null) {
  33. jobDataMap = new JobDataMap();
  34. }
  35. JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName).setJobData(jobDataMap).build();
  36. Trigger trigger = TriggerBuilder.newTrigger()
  37. .forJob(jobDetail)
  38. .withIdentity(jobName)
  39. .withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withIntervalInMinutes(test ? time : time * 60))
  40. .startAt(startDate == null ? new Date() : startDate)
  41. .endAt(endDate != null ? endDate : null)
  42. .build();
  43. try {
  44. //获取实例化的 Scheduler。
  45. Scheduler scheduler = getScheduler();
  46. //将任务及其触发器放入调度器
  47. scheduler.scheduleJob(jobDetail, trigger);
  48. //调度器开始调度任务
  49. if (!scheduler.isShutdown()) {
  50. scheduler.start();
  51. }
  52. } catch (SchedulerException e) {
  53. }
  54. }
  55. private static Scheduler getScheduler() {
  56. try {
  57. return schedulerFactory.getScheduler();
  58. } catch (SchedulerException e) {
  59. e.getMessage();
  60. }
  61. return null;
  62. }
  63. public static void deleteJob(String jobName) {
  64. try {
  65. TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
  66. Scheduler scheduler = getScheduler();
  67. scheduler.pauseTrigger(triggerKey);
  68. scheduler.unscheduleJob(triggerKey);
  69. scheduler.deleteJob(JobKey.jobKey(jobName));
  70. } catch (SchedulerException e) {
  71. e.getMessage();
  72. }
  73. }
  74. public static void timeModel(List<OperatorEntity> operatorList, FlowModel flowModel, RedisUtil redisUtil) {
  75. FlowModel model = new FlowModel();
  76. model.setUserInfo(flowModel.getUserInfo());
  77. model.setNodeEntityList(flowModel.getNodeEntityList());
  78. model.setNodes(flowModel.getNodes());
  79. model.setDeploymentId(flowModel.getDeploymentId());
  80. model.setTaskEntity(flowModel.getTaskEntity());
  81. model.setFormData(flowModel.getFormData());
  82. List<FlowTimeModel> timeList = new ArrayList<>();
  83. TaskEntity task = flowModel.getTaskEntity();
  84. Map<String, NodeModel> nodes = flowModel.getNodes();
  85. Map<String, Object> formData = flowModel.getFormData();
  86. Map<String, List<OperatorEntity>> map = operatorList.stream().collect(Collectors.groupingBy(OperatorEntity::getNodeCode));
  87. for (String key : map.keySet()) {
  88. model.setNodeCode(key);
  89. NodeModel nodeModel = new NodeModel();
  90. NodeModel childNode = nodes.get(key);
  91. NodeModel startNode = nodes.values().stream().filter(e -> e.getType().equals(NodeEnum.start.getType())).findFirst().orElse(new NodeModel());
  92. List<OperatorEntity> operatorEntities = map.get(key);
  93. for (OperatorEntity entity : operatorEntities) {
  94. TimeConfig limit = childNode.getTimeLimitConfig();
  95. if (limit.getOn() == 2) {
  96. limit = startNode.getTimeLimitConfig();
  97. }
  98. nodeModel.setTimeLimitConfig(limit);
  99. boolean isOn = limit.getOn() != 0;
  100. if (isOn) {
  101. TimeConfig notice = childNode.getNoticeConfig();
  102. FlowTimeModel noticeModel = new FlowTimeModel();
  103. noticeModel.setOperatorId(entity.getId());
  104. noticeModel.setTaskId(entity.getTaskId());
  105. noticeModel.setFlowModel(model);
  106. if (notice.getOn() == 2) {
  107. notice = startNode.getNoticeConfig();
  108. }
  109. noticeModel.setOn(notice.getOn() != 0);
  110. nodeModel.setNoticeConfig(notice);
  111. FlowTimeModel overModel = new FlowTimeModel();
  112. overModel.setOperatorId(entity.getId());
  113. overModel.setTaskId(entity.getTaskId());
  114. overModel.setFlowModel(model);
  115. TimeConfig overTime = childNode.getOverTimeConfig();
  116. if (overTime.getOn() == 2) {
  117. overTime = startNode.getOverTimeConfig();
  118. }
  119. overModel.setOn(overTime.getOn() != 0);
  120. nodeModel.setOverTimeConfig(overTime);
  121. Date date = null;
  122. if (limit.getNodeLimit() == 0) {
  123. date = entity.getCreatorTime();
  124. } else if (limit.getNodeLimit() == 1) {
  125. date = task.getStartTime();
  126. } else if (limit.getNodeLimit() == 2) {
  127. Object data = formData.get(limit.getFormField());
  128. try {
  129. date = new Date((Long) data);
  130. } catch (Exception e) {
  131. try {
  132. date = DateUtil.parse(String.valueOf(data));
  133. } catch (Exception e1) {
  134. }
  135. }
  136. }
  137. if (date == null) {
  138. // date = new Date();
  139. continue;
  140. }
  141. noticeModel.setStartDate(DateUtil.offsetMinute(date, test ? notice.getFirstOver() : notice.getFirstOver() * 60));
  142. noticeModel.setEndDate(DateUtil.offsetSecond(DateUtil.offsetMinute(date, test ? limit.getDuringDeal() : limit.getDuringDeal() * 60), 1));
  143. noticeModel.setChildNode(nodeModel);
  144. noticeModel.setDuring(notice.getOverTimeDuring());
  145. timeList.add(noticeModel);
  146. overModel.setStartDate(DateUtil.offsetMinute(noticeModel.getEndDate(), test ? overTime.getFirstOver() : overTime.getFirstOver() * 60));
  147. overModel.setEndDate(null);
  148. overModel.setChildNode(nodeModel);
  149. overModel.setOverTime(true);
  150. overModel.setDuring(overTime.getOverTimeDuring());
  151. timeList.add(overModel);
  152. }
  153. }
  154. }
  155. for (FlowTimeModel timeModel : timeList) {
  156. Date date = new Date();
  157. if (timeModel.getEndDate() != null && timeModel.getEndDate().getTime() < date.getTime()) {
  158. continue;
  159. }
  160. if (timeModel.getOn()) {
  161. String uuid = RandomUtil.uuId();
  162. timeModel.setId(uuid);
  163. JobDataMap jobDataMap = new JobDataMap();
  164. jobDataMap.putAll(JsonUtil.entityToMap(timeModel));
  165. FlowJobUtil.insertModel(timeModel, redisUtil);
  166. TimeUtil.addJob(uuid, timeModel.getDuring(), FlowTime.class, jobDataMap, timeModel.getStartDate(), timeModel.getEndDate());
  167. }
  168. }
  169. }
  170. }