OutsideUtil.java 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package jnpf.flowable.util;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.baomidou.dynamic.datasource.annotation.DSTransactional;
  4. import jnpf.base.ActionResult;
  5. import jnpf.constant.MsgCode;
  6. import jnpf.exception.WorkFlowException;
  7. import jnpf.flowable.entity.*;
  8. import jnpf.flowable.enums.EventEnum;
  9. import jnpf.flowable.enums.NodeStateEnum;
  10. import jnpf.flowable.enums.RecordEnum;
  11. import jnpf.flowable.model.flowable.CompleteFo;
  12. import jnpf.flowable.model.flowable.FlowAbleUrl;
  13. import jnpf.flowable.model.message.FlowMsgModel;
  14. import jnpf.flowable.model.record.NodeRecordModel;
  15. import jnpf.flowable.model.task.FlowMethod;
  16. import jnpf.flowable.model.task.FlowModel;
  17. import jnpf.flowable.model.templatenode.nodejson.NodeModel;
  18. import jnpf.flowable.model.templatenode.nodejson.TemplateJsonModel;
  19. import jnpf.flowable.model.util.FlowContextHolder;
  20. import jnpf.flowable.model.util.FlowNature;
  21. import jnpf.flowable.service.*;
  22. import jnpf.model.visualJson.FieLdsModel;
  23. import jnpf.util.JsonUtil;
  24. import jnpf.util.StringUtil;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.stereotype.Component;
  27. import java.util.*;
  28. /**
  29. * 类的描述
  30. *
  31. * @author JNPF@YinMai Info. Co., Ltd
  32. * @version 5.0.x
  33. * @since 2025/1/9 14:19
  34. */
  35. @Component
  36. public class OutsideUtil {
  37. @Autowired
  38. private TaskUtil taskUtil;
  39. @Autowired
  40. private ServiceUtil serviceUtil;
  41. @Autowired
  42. private OperatorUtil operatorUtil;
  43. @Autowired
  44. private FlowAbleUrl flowAbleUrl;
  45. @Autowired
  46. private RecordUtil recordUtil;
  47. @Autowired
  48. private MsgUtil msgUtil;
  49. @Autowired
  50. private TaskLineService taskLineService;
  51. @Autowired
  52. private OperatorService operatorService;
  53. @Autowired
  54. private ConditionService conditionService;
  55. @Autowired
  56. private EventLogService eventLogService;
  57. @Autowired
  58. private CandidatesService candidatesService;
  59. @Autowired
  60. private NodeRecordService nodeRecordService;
  61. /**
  62. * 外部节点重试
  63. */
  64. public boolean retry(String id) throws WorkFlowException {
  65. EventLogEntity entity = eventLogService.getById(id);
  66. if (entity == null) {
  67. throw new WorkFlowException(MsgCode.FA001.get());
  68. }
  69. String eventId = entity.getId();
  70. String taskId = entity.getTaskId();
  71. FlowModel flowModel = new FlowModel();
  72. taskUtil.setFlowModel(taskId, flowModel);
  73. String upNodeCode = entity.getUpNode();
  74. String nodeCode = entity.getNodeCode();
  75. String interfaceId = entity.getInterfaceId();
  76. Map<String, NodeModel> nodes = flowModel.getNodes();
  77. NodeModel nodeModel = nodes.get(nodeCode);
  78. if (nodeModel == null) {
  79. throw new WorkFlowException(MsgCode.WF076.get());
  80. }
  81. Map<String, Object> formData = StringUtil.isNotEmpty(entity.getData()) ? JsonUtil.stringToMap(entity.getData()) : new HashMap<>();
  82. flowModel.setFormData(formData);
  83. flowModel.setNodeCode(entity.getNodeCode());
  84. Map<String, List<TemplateJsonModel>> outsideOptions = nodeModel.getOutsideOptions();
  85. List<TemplateJsonModel> templateJsonModelList = outsideOptions.get(upNodeCode) != null ? outsideOptions.get(upNodeCode) : new ArrayList<>();
  86. Map<String, String> parameterData = operatorUtil.outsideData(flowModel, templateJsonModelList, new HashMap<>(), entity.getUpNode(), eventId);
  87. ActionResult result = serviceUtil.infoToId(interfaceId, parameterData);
  88. boolean retryResult = Objects.equals(200, result.getCode());
  89. entity.setStatus(retryResult ? FlowNature.Success : FlowNature.Lose);
  90. entity.setResult(JsonUtil.getObjectToString(result));
  91. eventLogService.updateById(entity);
  92. return retryResult;
  93. }
  94. /**
  95. * 外部节点审批
  96. */
  97. @DSTransactional
  98. public FlowModel outsideAudit(FlowModel flowModel, EventLogEntity eventLog) throws Exception {
  99. if (eventLog == null) {
  100. throw new WorkFlowException(MsgCode.FA001.get());
  101. }
  102. String taskId = eventLog.getTaskId();
  103. //赋值审批对象
  104. taskUtil.setFlowModel(taskId, flowModel);
  105. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  106. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  107. .filter(e -> StringUtil.equals(e.getNodeCode(), eventLog.getNodeCode())).findFirst().orElse(null);
  108. if (nodeEntity == null) {
  109. throw new WorkFlowException(MsgCode.WF076.get());
  110. }
  111. String nodeId = eventLog.getNodeId();
  112. flowModel.setNodeEntity(nodeEntity);
  113. TaskEntity taskEntity = flowModel.getTaskEntity();
  114. taskUtil.isSuspend(taskEntity);
  115. taskUtil.isCancel(taskEntity);
  116. String deploymentId = flowModel.getDeploymentId();
  117. flowModel.setFlowableTaskId(nodeId);
  118. Map<String, NodeModel> nodes = flowModel.getNodes();
  119. String nodeCode = nodeEntity.getNodeCode();
  120. FlowMethod flowMethod = new FlowMethod();
  121. flowMethod.setType(RecordEnum.audit.getCode());
  122. flowModel.setEventStatus(EventEnum.Approve.getStatus());
  123. flowMethod.setTaskEntity(taskEntity);
  124. flowMethod.setNodeEntity(nodeEntity);
  125. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  126. //接口表单数据
  127. Map<String, Object> formData = new HashMap<>();
  128. List<FieLdsModel> formFieldList = nodeModel.getFormFieldList();
  129. Map<String, Object> dataMap = flowModel.getFormData();
  130. for (FieLdsModel fieLdsModel : formFieldList) {
  131. String id = fieLdsModel.getId();
  132. formData.put(id, dataMap.get(id));
  133. }
  134. flowModel.setFormData(formData);
  135. flowMethod.setNodeModel(nodeModel);
  136. flowMethod.setFlowableTaskId(nodeId);
  137. flowMethod.setFormData(formData);
  138. flowMethod.setSignFor(false);
  139. flowMethod.setFlowModel(flowModel);
  140. OperatorEntity operator = JsonUtil.getJsonToBean(eventLog, OperatorEntity.class);
  141. operator.setHandleId(eventLog.getCreatorUserId());
  142. Integer handleStatus = FlowNature.AuditCompletion;
  143. flowMethod.setTaskEntity(taskEntity);
  144. flowMethod.setNodeEntity(nodeEntity);
  145. flowMethod.setNodeEntityList(nodeEntityList);
  146. flowMethod.setDeploymentId(deploymentId);
  147. flowMethod.setNodes(nodes);
  148. flowMethod.setNodeCode(nodeCode);
  149. flowMethod.setHandleStatus(handleStatus);
  150. flowModel.setEventStatus(EventEnum.Approve.getStatus());
  151. Map<String, Boolean> resMap = conditionService.handleCondition(flowMethod);
  152. conditionService.checkCondition(resMap, nodes);
  153. taskLineService.create(taskEntity.getId(), resMap);
  154. // 完成
  155. CompleteFo fo = new CompleteFo();
  156. fo.setTaskId(operator.getNodeId());
  157. fo.setVariables(new HashMap<>(resMap));
  158. flowAbleUrl.complete(fo);
  159. // 记录
  160. FlowMethod method = new FlowMethod();
  161. method.setFlowModel(flowModel);
  162. method.setType(RecordEnum.audit.getCode());
  163. method.setOperatorEntity(operator);
  164. recordUtil.createRecord(method);
  165. // 节点记录
  166. NodeRecordModel nodeRecordModel = new NodeRecordModel();
  167. nodeRecordModel.setTaskId(operator.getTaskId());
  168. nodeRecordModel.setNodeId(operator.getNodeId());
  169. nodeRecordModel.setNodeCode(operator.getNodeCode());
  170. nodeRecordModel.setNodeName(operator.getNodeName());
  171. nodeRecordModel.setNodeStatus(ObjectUtil.equals(handleStatus, FlowNature.AuditCompletion) ? NodeStateEnum.pass.getCode() : NodeStateEnum.reject.getCode());
  172. nodeRecordService.create(nodeRecordModel);
  173. // 生成下一节点
  174. List<OperatorEntity> entityList = operatorService.handleOperator(flowModel);
  175. // 删除选择分支
  176. candidatesService.deleteBranch(operator.getTaskId(), operator.getNodeCode());
  177. // 判断任务是否结束
  178. taskUtil.isFinished(flowModel);
  179. // 消息
  180. FlowMsgModel flowMsgModel = new FlowMsgModel();
  181. flowMsgModel.setNodeList(nodeEntityList);
  182. flowMsgModel.setCirculateList(new ArrayList<>());
  183. flowMsgModel.setFlowModel(flowModel);
  184. flowMsgModel.setTaskEntity(taskEntity);
  185. flowMsgModel.setNodeCode(nodeEntity.getNodeCode());
  186. flowMsgModel.setOperatorList(entityList);
  187. if (flowModel.getCopyMsgFlag()) {
  188. flowMsgModel.setCopy(true);
  189. }
  190. if (handleStatus.equals(FlowNature.AuditCompletion)) {
  191. flowMsgModel.setApprove(true);
  192. } else {
  193. flowMsgModel.setReject(true);
  194. }
  195. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  196. msgUtil.message(flowMsgModel);
  197. // 系统审批
  198. operatorUtil.systemAudit();
  199. FlowContextHolder.deleteFormOperator();
  200. serviceUtil.handleFormData(taskEntity.getFlowId(), true);
  201. return flowModel;
  202. }
  203. }