From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master
---
jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/util/OutsideUtil.java | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 222 insertions(+), 0 deletions(-)
diff --git a/jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/util/OutsideUtil.java b/jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/util/OutsideUtil.java
new file mode 100644
index 0000000..afb3cdf
--- /dev/null
+++ b/jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/util/OutsideUtil.java
@@ -0,0 +1,222 @@
+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.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 lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+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
+@RequiredArgsConstructor
+public class OutsideUtil {
+
+
+ private final MsgUtil msgUtil;
+
+ private final OperatorUtil operatorUtil;
+
+ private final ServiceUtil serviceUtil;
+
+ private final ConditionUtil conditionUtil;
+
+ private final FlowUtil flowUtil;
+
+ private final FlowAbleUrl flowAbleUrl;
+
+ private final RecordMapper recordMapper;
+
+ private final TaskLineMapper taskLineMapper;
+
+ private final EventLogMapper eventLogMapper;
+
+ private final CandidatesMapper candidatesMapper;
+
+ private final 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<Object> 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 WorkFlowException {
+ 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 -> StringUtils.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();
+ flowUtil.isSuspend(taskEntity);
+ flowUtil.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.AUDIT_COMPLETION;
+ 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.AUDIT_COMPLETION) ? 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.setUserInfo(flowModel.getUserInfo());
+ flowMsgModel.setTaskEntity(taskEntity);
+ flowMsgModel.setNodeCode(nodeEntity.getNodeCode());
+ flowMsgModel.setOperatorList(entityList);
+ if (Boolean.TRUE.equals(flowModel.getCopyMsgFlag())) {
+ flowMsgModel.setCopy(true);
+ }
+
+ flowMsgModel.setApprove(true);
+
+ flowMsgModel.setFormData(FlowContextHolder.getAllData());
+ msgUtil.message(flowMsgModel);
+
+ // 绯荤粺瀹℃壒
+ operatorUtil.systemAudit();
+
+ FlowContextHolder.deleteFormOperator();
+ serviceUtil.handleFormData(taskEntity.getFlowId(), true);
+
+ return flowModel;
+ }
+
+}
--
Gitblit v1.8.0