AutoAuditJob.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package jnpf.flowable.job;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import jnpf.base.UserInfo;
  5. import jnpf.config.ConfigValueUtil;
  6. import jnpf.database.util.TenantDataSourceUtil;
  7. import jnpf.exception.WorkFlowException;
  8. import jnpf.flowable.entity.OperatorEntity;
  9. import jnpf.flowable.entity.TaskEntity;
  10. import jnpf.flowable.model.task.FlowMethod;
  11. import jnpf.flowable.model.task.FlowModel;
  12. import jnpf.flowable.model.templatenode.nodejson.NodeModel;
  13. import jnpf.flowable.model.time.FlowTimeModel;
  14. import jnpf.flowable.model.util.FlowNature;
  15. import jnpf.flowable.service.OperatorService;
  16. import jnpf.flowable.service.TaskService;
  17. import jnpf.flowable.util.*;
  18. import jnpf.permission.entity.UserEntity;
  19. import jnpf.util.RedisUtil;
  20. import jnpf.util.UserProvider;
  21. import jnpf.util.context.SpringContext;
  22. import lombok.extern.slf4j.Slf4j;
  23. import org.quartz.JobExecutionContext;
  24. import org.quartz.JobExecutionException;
  25. import org.springframework.scheduling.quartz.QuartzJobBean;
  26. import java.util.Date;
  27. import java.util.HashMap;
  28. import java.util.List;
  29. import java.util.Map;
  30. /**
  31. * 类的描述
  32. *
  33. * @author JNPF@YinMai Info. Co., Ltd
  34. * @version 5.0.x
  35. * @since 2024/5/23 17:42
  36. */
  37. @Slf4j
  38. public class AutoAuditJob extends QuartzJobBean {
  39. private static RedisUtil redisUtil;
  40. private static ConfigValueUtil configValueUtil;
  41. private static OperatorService operatorService;
  42. private static ConditionService conditionService;
  43. private static TaskUtil taskUtil;
  44. private static TaskService taskService;
  45. private static ServiceUtil serviceUtil;
  46. private static OperatorUtil operatorUtil;
  47. static {
  48. redisUtil = SpringContext.getBean(RedisUtil.class);
  49. configValueUtil = SpringContext.getBean(ConfigValueUtil.class);
  50. operatorService = SpringContext.getBean(OperatorService.class);
  51. conditionService = SpringContext.getBean(ConditionService.class);
  52. taskUtil = SpringContext.getBean(TaskUtil.class);
  53. taskService = SpringContext.getBean(TaskService.class);
  54. serviceUtil = SpringContext.getBean(ServiceUtil.class);
  55. operatorUtil = SpringContext.getBean(OperatorUtil.class);
  56. }
  57. @Override
  58. protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
  59. List<FlowTimeModel> list = FlowJobUtil.getOperator(redisUtil);
  60. if (CollectionUtil.isNotEmpty(list)) {
  61. for (FlowTimeModel timeModel : list) {
  62. FlowModel flowModel = timeModel.getFlowModel();
  63. Map<String, Object> formData = flowModel.getFormData();
  64. String deploymentId = flowModel.getDeploymentId();
  65. Map<String, NodeModel> nodes = flowModel.getNodes();
  66. UserInfo userInfo = flowModel.getUserInfo();
  67. if (configValueUtil.isMultiTenancy()) {
  68. TenantDataSourceUtil.switchTenant(userInfo.getTenantId());
  69. UserProvider.setLoginUser(userInfo);
  70. UserProvider.setLocalLoginUser(userInfo);
  71. }
  72. TaskEntity taskEntity = taskService.getById(timeModel.getTaskId());
  73. if (null == taskEntity) {
  74. taskEntity = flowModel.getTaskEntity();
  75. }
  76. String operatorId = timeModel.getOperatorId();
  77. try {
  78. OperatorEntity operator = operatorService.getInfo(operatorId);
  79. if (null != operator) {
  80. if (ObjectUtil.equals(operator.getCompletion(), FlowNature.Action)) {
  81. continue;
  82. }
  83. flowModel.setTaskEntity(taskEntity);
  84. if (operator.getSignTime() == null) {
  85. operator.setSignTime(new Date());
  86. }
  87. if (operator.getStartHandleTime() == null) {
  88. operator.setStartHandleTime(new Date());
  89. }
  90. FlowMethod flowMethod = new FlowMethod();
  91. flowMethod.setTaskEntity(taskEntity);
  92. flowMethod.setFormData(formData == null ? new HashMap<>() : formData);
  93. flowMethod.setDeploymentId(deploymentId);
  94. flowMethod.setNodeCode(operator.getNodeCode());
  95. flowMethod.setNodes(nodes);
  96. // 判断节点的线的条件
  97. Map<String, Boolean> resMap = conditionService.handleCondition(flowMethod);
  98. try {
  99. conditionService.checkCondition(resMap, nodes);
  100. } catch (WorkFlowException e) {
  101. continue;
  102. }
  103. List<NodeModel> nextApprover;
  104. boolean mark = true;
  105. try {
  106. nextApprover = taskUtil.getNextApprover(flowMethod);
  107. } catch (WorkFlowException e) {
  108. nextApprover = null;
  109. mark = false;
  110. }
  111. if (!mark) {
  112. continue;
  113. }
  114. NodeModel nodeModel = nodes.get(operator.getNodeCode());
  115. if (!taskUtil.checkBranch(nodeModel) && taskUtil.checkNextCandidates(nextApprover) && taskUtil.checkNextError(flowModel, nextApprover, false, false) == 0) {
  116. String handleId = operator.getHandleId();
  117. String username = "";
  118. UserEntity user = serviceUtil.getUserInfo(handleId);
  119. if (user != null) {
  120. username = user.getAccount() + "(" + user.getRealName() + ")";
  121. }
  122. String str = ObjectUtil.equals(operator.getIsProcessing(), FlowNature.NotProcessing) ? "自动审批通过" : "自动办理通过";
  123. flowModel.setHandleOpinion(username + str);
  124. UserEntity userEntity = serviceUtil.getUserInfo(operator.getHandleId());
  125. if (null != userEntity) {
  126. userInfo.setUserId(userEntity.getId());
  127. userInfo.setUserName(userEntity.getRealName());
  128. userInfo.setUserAccount(userEntity.getAccount());
  129. }
  130. //自动审批,处理签收、办理时间
  131. operatorService.updateById(operator);
  132. operatorService.auditWithCheck(operator.getId(), flowModel);
  133. operatorUtil.handleEvent();
  134. operatorUtil.handleTaskStatus();
  135. operatorUtil.handleOperator();
  136. }
  137. }
  138. } catch (Exception e) {
  139. log.error("超时自动审批异常", e);
  140. try {
  141. operatorUtil.compensate(taskEntity);
  142. } catch (Exception ex) {
  143. log.error("超时自动审批补偿异常", ex);
  144. }
  145. } finally {
  146. //TimeUtil.deleteJob(timeModel.getId());
  147. FlowJobUtil.remove(timeModel, redisUtil);
  148. }
  149. }
  150. }
  151. }
  152. }