package jnpf.flowable.util; import cn.hutool.core.util.ObjectUtil; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import jnpf.base.ActionResult; import jnpf.constant.MsgCode; import jnpf.exception.WorkFlowException; import jnpf.flowable.entity.*; import jnpf.flowable.enums.EventEnum; import jnpf.flowable.enums.NodeStateEnum; import jnpf.flowable.enums.RecordEnum; import jnpf.flowable.model.flowable.CompleteFo; import jnpf.flowable.model.flowable.FlowAbleUrl; import jnpf.flowable.model.message.FlowMsgModel; import jnpf.flowable.model.record.NodeRecordModel; import jnpf.flowable.model.task.FlowMethod; import jnpf.flowable.model.task.FlowModel; import jnpf.flowable.model.templatenode.nodejson.NodeModel; import jnpf.flowable.model.templatenode.nodejson.TemplateJsonModel; import jnpf.flowable.model.util.FlowContextHolder; import jnpf.flowable.model.util.FlowNature; import jnpf.flowable.service.*; import jnpf.model.visualJson.FieLdsModel; import jnpf.util.JsonUtil; import jnpf.util.StringUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.*; /** * 类的描述 * * @author JNPF@YinMai Info. Co., Ltd * @version 5.0.x * @since 2025/1/9 14:19 */ @Component public class OutsideUtil { @Autowired private TaskUtil taskUtil; @Autowired private ServiceUtil serviceUtil; @Autowired private OperatorUtil operatorUtil; @Autowired private FlowAbleUrl flowAbleUrl; @Autowired private RecordUtil recordUtil; @Autowired private MsgUtil msgUtil; @Autowired private TaskLineService taskLineService; @Autowired private OperatorService operatorService; @Autowired private ConditionService conditionService; @Autowired private EventLogService eventLogService; @Autowired private CandidatesService candidatesService; @Autowired private NodeRecordService nodeRecordService; /** * 外部节点重试 */ public boolean retry(String id) throws WorkFlowException { EventLogEntity entity = eventLogService.getById(id); if (entity == null) { throw new WorkFlowException(MsgCode.FA001.get()); } String eventId = entity.getId(); String taskId = entity.getTaskId(); FlowModel flowModel = new FlowModel(); taskUtil.setFlowModel(taskId, flowModel); String upNodeCode = entity.getUpNode(); String nodeCode = entity.getNodeCode(); String interfaceId = entity.getInterfaceId(); Map nodes = flowModel.getNodes(); NodeModel nodeModel = nodes.get(nodeCode); if (nodeModel == null) { throw new WorkFlowException(MsgCode.WF076.get()); } Map formData = StringUtil.isNotEmpty(entity.getData()) ? JsonUtil.stringToMap(entity.getData()) : new HashMap<>(); flowModel.setFormData(formData); flowModel.setNodeCode(entity.getNodeCode()); Map> outsideOptions = nodeModel.getOutsideOptions(); List templateJsonModelList = outsideOptions.get(upNodeCode) != null ? outsideOptions.get(upNodeCode) : new ArrayList<>(); Map parameterData = operatorUtil.outsideData(flowModel, templateJsonModelList, new HashMap<>(), entity.getUpNode(), eventId); ActionResult result = serviceUtil.infoToId(interfaceId, parameterData); boolean retryResult = Objects.equals(200, result.getCode()); entity.setStatus(retryResult ? FlowNature.Success : FlowNature.Lose); entity.setResult(JsonUtil.getObjectToString(result)); eventLogService.updateById(entity); return retryResult; } /** * 外部节点审批 */ @DSTransactional public FlowModel outsideAudit(FlowModel flowModel, EventLogEntity eventLog) throws Exception { if (eventLog == null) { throw new WorkFlowException(MsgCode.FA001.get()); } String taskId = eventLog.getTaskId(); //赋值审批对象 taskUtil.setFlowModel(taskId, flowModel); List nodeEntityList = flowModel.getNodeEntityList(); TemplateNodeEntity nodeEntity = nodeEntityList.stream() .filter(e -> StringUtil.equals(e.getNodeCode(), eventLog.getNodeCode())).findFirst().orElse(null); if (nodeEntity == null) { throw new WorkFlowException(MsgCode.WF076.get()); } String nodeId = eventLog.getNodeId(); flowModel.setNodeEntity(nodeEntity); TaskEntity taskEntity = flowModel.getTaskEntity(); taskUtil.isSuspend(taskEntity); taskUtil.isCancel(taskEntity); String deploymentId = flowModel.getDeploymentId(); flowModel.setFlowableTaskId(nodeId); Map nodes = flowModel.getNodes(); String nodeCode = nodeEntity.getNodeCode(); FlowMethod flowMethod = new FlowMethod(); flowMethod.setType(RecordEnum.audit.getCode()); flowModel.setEventStatus(EventEnum.Approve.getStatus()); flowMethod.setTaskEntity(taskEntity); flowMethod.setNodeEntity(nodeEntity); NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class); //接口表单数据 Map formData = new HashMap<>(); List formFieldList = nodeModel.getFormFieldList(); Map dataMap = flowModel.getFormData(); for (FieLdsModel fieLdsModel : formFieldList) { String id = fieLdsModel.getId(); formData.put(id, dataMap.get(id)); } flowModel.setFormData(formData); flowMethod.setNodeModel(nodeModel); flowMethod.setFlowableTaskId(nodeId); flowMethod.setFormData(formData); flowMethod.setSignFor(false); flowMethod.setFlowModel(flowModel); OperatorEntity operator = JsonUtil.getJsonToBean(eventLog, OperatorEntity.class); operator.setHandleId(eventLog.getCreatorUserId()); Integer handleStatus = FlowNature.AuditCompletion; flowMethod.setTaskEntity(taskEntity); flowMethod.setNodeEntity(nodeEntity); flowMethod.setNodeEntityList(nodeEntityList); flowMethod.setDeploymentId(deploymentId); flowMethod.setNodes(nodes); flowMethod.setNodeCode(nodeCode); flowMethod.setHandleStatus(handleStatus); flowModel.setEventStatus(EventEnum.Approve.getStatus()); Map resMap = conditionService.handleCondition(flowMethod); conditionService.checkCondition(resMap, nodes); taskLineService.create(taskEntity.getId(), resMap); // 完成 CompleteFo fo = new CompleteFo(); fo.setTaskId(operator.getNodeId()); fo.setVariables(new HashMap<>(resMap)); flowAbleUrl.complete(fo); // 记录 FlowMethod method = new FlowMethod(); method.setFlowModel(flowModel); method.setType(RecordEnum.audit.getCode()); method.setOperatorEntity(operator); recordUtil.createRecord(method); // 节点记录 NodeRecordModel nodeRecordModel = new NodeRecordModel(); nodeRecordModel.setTaskId(operator.getTaskId()); nodeRecordModel.setNodeId(operator.getNodeId()); nodeRecordModel.setNodeCode(operator.getNodeCode()); nodeRecordModel.setNodeName(operator.getNodeName()); nodeRecordModel.setNodeStatus(ObjectUtil.equals(handleStatus, FlowNature.AuditCompletion) ? NodeStateEnum.pass.getCode() : NodeStateEnum.reject.getCode()); nodeRecordService.create(nodeRecordModel); // 生成下一节点 List entityList = operatorService.handleOperator(flowModel); // 删除选择分支 candidatesService.deleteBranch(operator.getTaskId(), operator.getNodeCode()); // 判断任务是否结束 taskUtil.isFinished(flowModel); // 消息 FlowMsgModel flowMsgModel = new FlowMsgModel(); flowMsgModel.setNodeList(nodeEntityList); flowMsgModel.setCirculateList(new ArrayList<>()); flowMsgModel.setFlowModel(flowModel); flowMsgModel.setTaskEntity(taskEntity); flowMsgModel.setNodeCode(nodeEntity.getNodeCode()); flowMsgModel.setOperatorList(entityList); if (flowModel.getCopyMsgFlag()) { flowMsgModel.setCopy(true); } if (handleStatus.equals(FlowNature.AuditCompletion)) { flowMsgModel.setApprove(true); } else { flowMsgModel.setReject(true); } flowMsgModel.setFormData(FlowContextHolder.getAllData()); msgUtil.message(flowMsgModel); // 系统审批 operatorUtil.systemAudit(); FlowContextHolder.deleteFormOperator(); serviceUtil.handleFormData(taskEntity.getFlowId(), true); return flowModel; } }