AutoTransferJob.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package jnpf.flowable.job;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import jnpf.base.ActionResult;
  7. import jnpf.base.UserInfo;
  8. import jnpf.config.ConfigValueUtil;
  9. import jnpf.database.util.TenantDataSourceUtil;
  10. import jnpf.flowable.entity.OperatorEntity;
  11. import jnpf.flowable.entity.RecordEntity;
  12. import jnpf.flowable.entity.TaskEntity;
  13. import jnpf.flowable.enums.OperatorEnum;
  14. import jnpf.flowable.enums.OperatorStateEnum;
  15. import jnpf.flowable.model.task.FlowModel;
  16. import jnpf.flowable.model.templatenode.nodejson.NodeModel;
  17. import jnpf.flowable.model.templatenode.nodejson.TemplateJsonModel;
  18. import jnpf.flowable.model.templatenode.nodejson.TimeConfig;
  19. import jnpf.flowable.model.time.FlowTimeModel;
  20. import jnpf.flowable.service.OperatorService;
  21. import jnpf.flowable.service.TaskService;
  22. import jnpf.flowable.util.*;
  23. import jnpf.permission.entity.UserEntity;
  24. import jnpf.util.*;
  25. import jnpf.util.context.SpringContext;
  26. import lombok.extern.slf4j.Slf4j;
  27. import org.quartz.JobExecutionContext;
  28. import org.quartz.JobExecutionException;
  29. import org.springframework.scheduling.quartz.QuartzJobBean;
  30. import java.util.*;
  31. import java.util.concurrent.TimeUnit;
  32. import java.util.stream.Collectors;
  33. /**
  34. * 类的描述
  35. *
  36. * @author JNPF@YinMai Info. Co., Ltd
  37. * @version 5.0.x
  38. * @since 2024/12/10 9:17
  39. */
  40. @Slf4j
  41. public class AutoTransferJob extends QuartzJobBean {
  42. private static RedisUtil redisUtil;
  43. private static ConfigValueUtil configValueUtil;
  44. private static OperatorService operatorService;
  45. private static TaskUtil taskUtil;
  46. private static TaskService taskService;
  47. private static ServiceUtil serviceUtil;
  48. private static MsgUtil msgUtil;
  49. private static RedisLock redisLock;
  50. private static OperatorUtil operatorUtil;
  51. static {
  52. redisUtil = SpringContext.getBean(RedisUtil.class);
  53. configValueUtil = SpringContext.getBean(ConfigValueUtil.class);
  54. operatorService = SpringContext.getBean(OperatorService.class);
  55. taskUtil = SpringContext.getBean(TaskUtil.class);
  56. taskService = SpringContext.getBean(TaskService.class);
  57. serviceUtil = SpringContext.getBean(ServiceUtil.class);
  58. msgUtil = SpringContext.getBean(MsgUtil.class);
  59. redisLock = SpringContext.getBean(RedisLock.class);
  60. operatorUtil = SpringContext.getBean(OperatorUtil.class);
  61. }
  62. @Override
  63. protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
  64. List<FlowTimeModel> list = FlowJobUtil.getTransfer(redisUtil);
  65. if (CollectionUtil.isNotEmpty(list)) {
  66. Set<String> nodeCodes = new TreeSet<>();
  67. for (FlowTimeModel timeModel : list) {
  68. FlowModel flowModel = timeModel.getFlowModel();
  69. UserInfo userInfo = flowModel.getUserInfo();
  70. if (configValueUtil.isMultiTenancy()) {
  71. TenantDataSourceUtil.switchTenant(userInfo.getTenantId());
  72. }
  73. String operatorId = timeModel.getOperatorId();
  74. boolean lock = redisLock.lock("transfer-" + operatorId, operatorId, 2, TimeUnit.SECONDS);
  75. if (!lock) continue;
  76. String nodeCode = flowModel.getNodeCode();
  77. Map<String, Object> formData = flowModel.getFormData();
  78. Map<String, NodeModel> nodes = flowModel.getNodes();
  79. NodeModel nodeModel = nodes.get(nodeCode);
  80. TimeConfig config = nodeModel.getOverTimeConfig();
  81. if (ObjectUtil.equals(config.getOverTimeType(), OperatorEnum.Nominator.getCode()) || ObjectUtil.equals(config.getOverTimeType(), OperatorEnum.Serve.getCode())) {
  82. if (nodeCodes.contains(flowModel.getNodeCode())) {
  83. log.info("自动转审失败,该经办已处理(id:" + operatorId + ",code:" + nodeCode + ")");
  84. FlowJobUtil.removeTransfer(timeModel, redisUtil);
  85. continue;
  86. }
  87. nodeCodes.add(nodeCode);
  88. }
  89. OperatorEntity operator = operatorService.getById(operatorId);
  90. if (null == operator || operator.getHandleStatus() != null) {
  91. TimeUtil.deleteJob(timeModel.getId());
  92. FlowJobUtil.remove(timeModel, redisUtil);
  93. continue;
  94. }
  95. if (ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.Transfer.getCode())) {
  96. log.info("转审状态的经办,不执行: " + operator.getId());
  97. FlowJobUtil.removeTransfer(timeModel, redisUtil);
  98. continue;
  99. }
  100. // 指派类型的转审,判断整个节点 是否存在转审类型的经办
  101. if (ObjectUtil.equals(config.getOverTimeType(), OperatorEnum.Nominator.getCode()) || ObjectUtil.equals(config.getOverTimeType(), OperatorEnum.Serve.getCode())) {
  102. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  103. queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()).eq(OperatorEntity::getNodeId, operator.getNodeId())
  104. .eq(OperatorEntity::getStatus, OperatorStateEnum.Transfer.getCode());
  105. long count = operatorService.count(queryWrapper);
  106. if (count > 0) {
  107. log.info("节点存在转审状态的经办,不执行: " + operator.getId() + " " + operator.getNodeId());
  108. FlowJobUtil.removeTransfer(timeModel, redisUtil);
  109. continue;
  110. }
  111. }
  112. String userId = operator.getHandleId();
  113. if (!ObjectUtil.equals(userInfo.getUserId(), userId)) {
  114. String token = AuthUtil.loginTempUser(userId, userInfo.getTenantId());
  115. userInfo = UserProvider.getUser(token);
  116. UserProvider.setLoginUser(userInfo);
  117. flowModel.setUserInfo(userInfo);
  118. }
  119. UserProvider.setLocalLoginUser(userInfo);
  120. try {
  121. TaskEntity taskEntity = taskService.getById(operator.getTaskId());
  122. if (null == taskEntity) {
  123. taskEntity = flowModel.getTaskEntity();
  124. }
  125. String handleIds = null;
  126. if (ObjectUtil.equals(config.getOverTimeType(), OperatorEnum.Nominator.getCode())) {
  127. // 指定人员
  128. // 349057407209541--user
  129. if (CollectionUtil.isNotEmpty(config.getReApprovers())) {
  130. String handleId = config.getReApprovers().get(0).split("--")[0];
  131. UserEntity userEntity = serviceUtil.getUserInfo(handleId);
  132. if (!ObjectUtil.equals(userId, handleId) && null != userEntity && ObjectUtil.equals(userEntity.getEnabledMark(), 1)) {
  133. handleIds = handleId;
  134. }
  135. }
  136. if (StringUtil.isNotEmpty(handleIds)) {
  137. flowModel.setHandleIds(handleIds);
  138. flowModel.setAutoTransferFlag(true);
  139. taskService.assign(operator.getTaskId(), flowModel);
  140. this.delete(timeModel);
  141. operatorUtil.handleOperator();
  142. }
  143. } else if (ObjectUtil.equals(config.getOverTimeType(), OperatorEnum.Serve.getCode())) {
  144. // 接口
  145. String interfaceId = config.getInterfaceId();
  146. List<TemplateJsonModel> templateJson = config.getTemplateJson();
  147. if (StringUtil.isNotEmpty(interfaceId)) {
  148. RecordEntity record = new RecordEntity();
  149. record.setTaskId(taskEntity.getId());
  150. record.setNodeCode(operator.getNodeCode());
  151. record.setHandleId(operator.getHandleId());
  152. // UserEntity createUser = serviceUtil.getUserInfo(taskEntity.getCreatorUserId());
  153. // UserEntity delegate = StringUtil.isNotEmpty(taskEntity.getDelegateUserId()) ? serviceUtil.getUserInfo(taskEntity.getDelegateUserId()) : null;
  154. FlowModel parameterModel = new FlowModel();
  155. parameterModel.setFormData(formData);
  156. parameterModel.setRecordEntity(record);
  157. parameterModel.setTaskEntity(taskEntity);
  158. Map<String, String> parameterMap = msgUtil.parameterMap(parameterModel, templateJson);
  159. ActionResult result = serviceUtil.infoToId(interfaceId, parameterMap);
  160. if (Objects.equals(200, result.getCode())) {
  161. Object data = result.getData();
  162. if (data instanceof Map) {
  163. JSONObject map = new JSONObject((Map) data);
  164. List<String> handleId = StringUtil.isNotEmpty(map.getString("handleId")) ? Arrays.asList(map.getString("handleId").split(",")) : new ArrayList<>();
  165. handleId = serviceUtil.getUserName(handleId, true)
  166. .stream().map(UserEntity::getId).filter(e -> !ObjectUtil.equals(userId, e)).sorted().collect(Collectors.toList());
  167. handleIds = CollectionUtil.isNotEmpty(handleId) ? handleId.get(0) : null;
  168. }
  169. }
  170. if (StringUtil.isNotEmpty(handleIds)) {
  171. flowModel.setHandleIds(handleIds);
  172. flowModel.setAutoTransferFlag(true);
  173. taskService.assign(operator.getTaskId(), flowModel);
  174. this.delete(timeModel);
  175. operatorUtil.handleOperator();
  176. }
  177. }
  178. } else {
  179. // 超时审批人,2.同一部门 7.同一角色 3.同一岗位 8.同一分组
  180. UserEntity userEntity = serviceUtil.getUserInfo(userId);
  181. if (null != userEntity) {
  182. Integer overTimeExtraRule = config.getOverTimeExtraRule();
  183. List<String> userIds = new ArrayList<>();
  184. taskUtil.getByRule(userIds, userEntity, overTimeExtraRule);
  185. userIds = serviceUtil.getUserName(userIds, true)
  186. .stream().map(UserEntity::getId).filter(e -> !ObjectUtil.equals(userId, e)).sorted().collect(Collectors.toList());
  187. if (CollectionUtil.isNotEmpty(userIds)) {
  188. handleIds = userIds.get(0);
  189. }
  190. }
  191. if (StringUtil.isNotEmpty(handleIds)) {
  192. flowModel.setHandleIds(handleIds);
  193. if (operator.getSignTime() == null) {
  194. operator.setSignTime(new Date());
  195. }
  196. if (operator.getStartHandleTime() == null) {
  197. operator.setStartHandleTime(new Date());
  198. }
  199. operatorService.updateById(operator);
  200. flowModel.setAutoTransferFlag(true);
  201. operatorService.transfer(operatorId, flowModel);
  202. this.delete(timeModel);
  203. operatorUtil.handleOperator();
  204. }
  205. }
  206. } catch (Exception e) {
  207. log.error("超时自动转审异常", e);
  208. this.delete(timeModel);
  209. } finally {
  210. FlowJobUtil.removeTransfer(timeModel, redisUtil);
  211. }
  212. }
  213. }
  214. }
  215. private void delete(FlowTimeModel timeModel) {
  216. TimeUtil.deleteJob(timeModel.getId());
  217. FlowJobUtil.remove(timeModel, redisUtil);
  218. }
  219. }