ProcessNotProcessingAlertTaskTest.java 5.1 KB

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