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.EventLogEntity;
|
import jnpf.flowable.entity.OperatorEntity;
|
import jnpf.flowable.entity.TaskEntity;
|
import jnpf.flowable.entity.TemplateNodeEntity;
|
import jnpf.flowable.enums.EventEnum;
|
import jnpf.flowable.enums.NodeStateEnum;
|
import jnpf.flowable.enums.RecordEnum;
|
import jnpf.flowable.mapper.*;
|
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.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 MsgUtil msgUtil;
|
@Autowired
|
private OperatorUtil operatorUtil;
|
@Autowired
|
private ServiceUtil serviceUtil;
|
@Autowired
|
private ConditionUtil conditionUtil;
|
@Autowired
|
private FlowUtil flowUtil;
|
@Autowired
|
private FlowAbleUrl flowAbleUrl;
|
@Autowired
|
private RecordMapper recordMapper;
|
@Autowired
|
private TaskLineMapper taskLineMapper;
|
@Autowired
|
private EventLogMapper eventLogMapper;
|
@Autowired
|
private CandidatesMapper candidatesMapper;
|
@Autowired
|
private NodeRecordMapper nodeRecordMapper;
|
|
/**
|
* 外部节点重试
|
*/
|
public boolean retry(String id) throws WorkFlowException {
|
EventLogEntity entity = eventLogMapper.selectById(id);
|
if (entity == null) {
|
throw new WorkFlowException(MsgCode.FA001.get());
|
}
|
String eventId = entity.getId();
|
String taskId = entity.getTaskId();
|
FlowModel flowModel = new FlowModel();
|
flowUtil.setFlowModel(taskId, flowModel);
|
String upNodeCode = entity.getUpNode();
|
String nodeCode = entity.getNodeCode();
|
String interfaceId = entity.getInterfaceId();
|
Map<String, NodeModel> nodes = flowModel.getNodes();
|
NodeModel nodeModel = nodes.get(nodeCode);
|
if (nodeModel == null) {
|
throw new WorkFlowException(MsgCode.WF076.get());
|
}
|
Map<String, Object> formData = StringUtil.isNotEmpty(entity.getData()) ? JsonUtil.stringToMap(entity.getData()) : new HashMap<>();
|
flowModel.setFormData(formData);
|
flowModel.setNodeCode(entity.getNodeCode());
|
Map<String, List<TemplateJsonModel>> outsideOptions = nodeModel.getOutsideOptions();
|
List<TemplateJsonModel> templateJsonModelList = outsideOptions.get(upNodeCode) != null ? outsideOptions.get(upNodeCode) : new ArrayList<>();
|
Map<String, String> 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));
|
eventLogMapper.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();
|
//赋值审批对象
|
flowUtil.setFlowModel(taskId, flowModel);
|
|
List<TemplateNodeEntity> 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();
|
operatorUtil.isSuspend(taskEntity);
|
operatorUtil.isCancel(taskEntity);
|
String deploymentId = flowModel.getDeploymentId();
|
flowModel.setFlowableTaskId(nodeId);
|
Map<String, NodeModel> 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<String, Object> formData = new HashMap<>();
|
List<FieLdsModel> formFieldList = nodeModel.getFormFieldList();
|
Map<String, Object> 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<String, Boolean> resMap = conditionUtil.handleCondition(flowMethod);
|
conditionUtil.checkCondition(resMap, nodes);
|
taskLineMapper.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);
|
recordMapper.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());
|
nodeRecordMapper.create(nodeRecordModel);
|
|
// 生成下一节点
|
List<OperatorEntity> entityList = operatorUtil.handleOperator(flowModel);
|
// 删除选择分支
|
candidatesMapper.deleteBranch(operator.getTaskId(), operator.getNodeCode());
|
|
// 判断任务是否结束
|
operatorUtil.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;
|
}
|
|
}
|