ProcessNotProcessingAlertTask.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package com.xjrsoft.module.job;
  2. import cn.hutool.db.Db;
  3. import cn.hutool.db.Entity;
  4. import com.xjrsoft.common.constant.GlobalConstant;
  5. import com.xjrsoft.common.utils.DatasourceUtil;
  6. import com.xjrsoft.common.utils.DateUtils;
  7. import com.xjrsoft.module.oa.utils.SendMessageUtil;
  8. import com.xjrsoft.module.workflow.entity.WorkflowExtra;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springframework.scheduling.annotation.Async;
  11. import org.springframework.scheduling.annotation.Scheduled;
  12. import org.springframework.stereotype.Component;
  13. import javax.sql.DataSource;
  14. import java.time.Duration;
  15. import java.time.LocalDateTime;
  16. import java.util.*;
  17. import java.util.concurrent.CompletableFuture;
  18. import java.util.stream.Collectors;
  19. /**
  20. * 流程未处理提醒
  21. */
  22. @Component
  23. @Slf4j
  24. public class ProcessNotProcessingAlertTask {
  25. /**
  26. * 流程未处理提醒
  27. */
  28. @Async
  29. @Scheduled(cron = "0 0 14 * * ?")
  30. public void alertProcessNotProcessing() {
  31. System.out.printf("定时提醒流程未处理:%s", DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN));
  32. DataSource datasource = DatasourceUtil.getDataSource(GlobalConstant.DEFAULT_DATASOURCE_KEY);
  33. try {
  34. Db use = Db.use(datasource);
  35. //获取未结束流程的流程id
  36. String listUncloseProcessIdSql = "SELECT DISTINCT process_id " +
  37. "FROM xjr_workflow_record w1 " +
  38. "WHERE NOT EXISTS ( " +
  39. " SELECT 1 " +
  40. " FROM xjr_workflow_record w2 " +
  41. " WHERE w2.node_id = 'Event_140v10k' " +
  42. " AND w1.process_id = w2.process_id " +
  43. " );";
  44. List<Entity> listUncloseProcessId = use.query(listUncloseProcessIdSql);
  45. if (!listUncloseProcessId.isEmpty()) {
  46. //获取所有未完成流程的所有节点
  47. String uncloseProcessIdStr = listUncloseProcessId.stream()
  48. .map(entity -> "'" + entity.getStr("process_id") + "'")
  49. .collect(Collectors.joining(","));
  50. String listWorkflowExtraSql = "select * " +
  51. "from xjr_workflow_extra "
  52. + "where process_id in (" + uncloseProcessIdStr + ");";
  53. List<WorkflowExtra> workflowExtraList = use.query(listWorkflowExtraSql, WorkflowExtra.class);
  54. List<String> uncloseProcessIdList = listUncloseProcessId.stream()
  55. .map(entity -> entity.getStr("process_id"))
  56. .collect(Collectors.toList());
  57. //筛选出每个流程的最后一个节点的记录,需要的是有任务节点id的记录
  58. List<WorkflowExtra> workflowExtraLastNodeList = new ArrayList<>();
  59. LocalDateTime now = LocalDateTime.now();
  60. for (String processId : uncloseProcessIdList) {
  61. workflowExtraList.stream()
  62. .filter(e -> e.getProcessId().equals(processId))
  63. .max(Comparator.comparing(WorkflowExtra::getStartTime))
  64. .ifPresent(e -> {
  65. if ((e.getEndTime() == null || e.getEndTime().toString().equals("")) && e.getApproveUserIds() != null && !e.getApproveUserIds().equals("")) {
  66. // 计算两个时间之间的差值
  67. Duration duration = Duration.between(e.getStartTime(), now);
  68. if (duration.toHours() > 24) {
  69. //System.out.println("时间差大于24小时");
  70. workflowExtraLastNodeList.add(e);
  71. }
  72. }
  73. });
  74. }
  75. //对未结束的流程节点进行处理,通知下一个节点需要处理的人
  76. Map<String, StringBuilder> message = new HashMap<>();
  77. for (WorkflowExtra w : workflowExtraLastNodeList) {
  78. String approveUserIds = w.getApproveUserIds();
  79. String[] aapproveUserIdArray = approveUserIds.trim().split(",");
  80. for (String str : aapproveUserIdArray) {
  81. if (message.containsKey(str)) {
  82. message.get(str).append(",").append(w.getProcessName());
  83. } else {
  84. message.put(str, new StringBuilder(w.getProcessName()));
  85. }
  86. }
  87. }
  88. // SendMessageUtil.sendWorkflowUnapprovedWx(message);
  89. CompletableFuture.runAsync(() -> {
  90. SendMessageUtil.sendWorkflowUnapprovedWx(message);
  91. });
  92. // System.err.println(workflowExtraLastNodeList.size());
  93. // System.err.println(workflowExtraLastNodeList.get(0));
  94. }
  95. } catch (Exception e) {
  96. log.error(e.getMessage(), "定时提醒流程未处理");
  97. }
  98. }
  99. }