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