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/job/AutoAuditJob.java |  160 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 160 insertions(+), 0 deletions(-)

diff --git a/jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/job/AutoAuditJob.java b/jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/job/AutoAuditJob.java
new file mode 100644
index 0000000..dce532f
--- /dev/null
+++ b/jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/job/AutoAuditJob.java
@@ -0,0 +1,160 @@
+package jnpf.flowable.job;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import jnpf.base.UserInfo;
+import jnpf.config.ConfigValueUtil;
+import jnpf.database.util.TenantDataSourceUtil;
+import jnpf.exception.WorkFlowException;
+import jnpf.flowable.entity.OperatorEntity;
+import jnpf.flowable.entity.TaskEntity;
+import jnpf.flowable.enums.OperatorStateEnum;
+import jnpf.flowable.model.task.FlowMethod;
+import jnpf.flowable.model.task.FlowModel;
+import jnpf.flowable.model.templatenode.nodejson.NodeModel;
+import jnpf.flowable.model.time.FlowTimeModel;
+import jnpf.flowable.model.util.FlowNature;
+import jnpf.flowable.service.OperatorService;
+import jnpf.flowable.service.TaskService;
+import jnpf.flowable.util.*;
+import jnpf.permission.entity.UserEntity;
+import jnpf.util.AuthUtil;
+import jnpf.util.RedisUtil;
+import jnpf.util.UserProvider;
+import jnpf.util.context.SpringContext;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 绫荤殑鎻忚堪
+ *
+ * @author JNPF@YinMai Info. Co., Ltd
+ * @version 5.0.x
+ * @since 2024/5/23 17:42
+ */
+@Slf4j
+public class AutoAuditJob extends QuartzJobBean {
+
+    private static RedisUtil redisUtil;
+    private static ConditionUtil conditionUtil;
+    private static OperatorUtil operatorUtil;
+    private static FlowUtil flowUtil;
+    private static ServiceUtil serviceUtil;
+    private static ConfigValueUtil configValueUtil;
+    private static OperatorService operatorService;
+    private static TaskService taskService;
+    private static RedisLock redisLock;
+
+    static {
+        redisUtil = SpringContext.getBean(RedisUtil.class);
+        configValueUtil = SpringContext.getBean(ConfigValueUtil.class);
+        operatorService = SpringContext.getBean(OperatorService.class);
+        conditionUtil = SpringContext.getBean(ConditionUtil.class);
+        operatorUtil = SpringContext.getBean(OperatorUtil.class);
+        flowUtil = SpringContext.getBean(FlowUtil.class);
+        taskService = SpringContext.getBean(TaskService.class);
+        serviceUtil = SpringContext.getBean(ServiceUtil.class);
+        redisLock = SpringContext.getBean(RedisLock.class);
+    }
+
+    @Override
+    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
+        List<FlowTimeModel> list = FlowJobUtil.getOperator(redisUtil);
+        if (CollUtil.isNotEmpty(list)) {
+            for (FlowTimeModel timeModel : list) {
+                FlowModel flowModel = timeModel.getFlowModel();
+                Map<String, Object> formData = flowModel.getFormData();
+                String deploymentId = flowModel.getDeploymentId();
+                Map<String, NodeModel> nodes = flowModel.getNodes();
+
+                UserInfo userInfo = flowModel.getUserInfo();
+                if (configValueUtil.isMultiTenancy()) {
+                    TenantDataSourceUtil.switchTenant(userInfo.getTenantId());
+                }
+
+                String operatorId = timeModel.getOperatorId();
+
+                boolean lock = redisLock.lock("autoAudit-" + operatorId, operatorId, 5, TimeUnit.SECONDS);
+                if (lock) {
+                    TaskEntity taskEntity = taskService.getById(timeModel.getTaskId());
+                    if (null == taskEntity) {
+                        taskEntity = flowModel.getTaskEntity();
+                    }
+
+                    try {
+                        OperatorEntity operator = operatorService.getInfo(operatorId);
+                        if (null != operator) {
+                            if (ObjectUtil.equals(operator.getCompletion(), FlowNature.ACTION) || ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.WAITING.getCode())) {
+                                continue;
+                            }
+                            flowModel.setTaskEntity(taskEntity);
+                            if (operator.getSignTime() == null) {
+                                operator.setSignTime(new Date());
+                            }
+                            if (operator.getStartHandleTime() == null) {
+                                operator.setStartHandleTime(new Date());
+                            }
+                            FlowMethod flowMethod = new FlowMethod();
+                            flowMethod.setTaskEntity(taskEntity);
+                            flowMethod.setFormData(formData == null ? new HashMap<>() : formData);
+                            flowMethod.setDeploymentId(deploymentId);
+                            flowMethod.setNodeCode(operator.getNodeCode());
+                            flowMethod.setNodes(nodes);
+                            // 鍒ゆ柇鑺傜偣鐨勭嚎鐨勬潯浠�
+                            Map<String, Boolean> resMap = conditionUtil.handleCondition(flowMethod);
+                            List<NodeModel> nextApprover = new ArrayList<>();
+                            boolean next = true;
+                            try {
+                                nextApprover.addAll(flowUtil.getNextApprover(flowMethod));
+                                conditionUtil.checkCondition(resMap, nodes);
+                            } catch (WorkFlowException e) {
+                                next = false;
+                            }
+                            if (next) {
+                                NodeModel nodeModel = nodes.get(operator.getNodeCode());
+                                if (!flowUtil.checkBranch(nodeModel) && flowUtil.checkNextCandidates(nextApprover) && flowUtil.checkNextError(flowModel, nextApprover, false, false) == 0) {
+                                    String handleId = operator.getHandleId();
+                                    String username = "";
+                                    UserEntity user = serviceUtil.getUserInfo(handleId);
+                                    if (user != null) {
+                                        username = user.getAccount() + "(" + user.getRealName() + ")";
+                                        userInfo.setUserId(user.getId());
+                                        userInfo.setUserName(user.getRealName());
+                                        userInfo.setUserAccount(user.getAccount());
+                                        String token = AuthUtil.loginTempUser(handleId, userInfo.getTenantId());
+                                        userInfo.setToken(token);
+                                        UserProvider.setLoginUser(userInfo);
+                                        UserProvider.setLocalLoginUser(userInfo);
+                                    }
+                                    String str = ObjectUtil.equals(operator.getIsProcessing(), FlowNature.NOT_PROCESSING) ? "鑷姩瀹℃壒閫氳繃" : "鑷姩鍔炵悊閫氳繃";
+                                    flowModel.setHandleOpinion(username + str);
+                                    flowModel.setFreeFlowConfig(null);
+                                    //鑷姩瀹℃壒锛屽鐞嗙鏀躲�佸姙鐞嗘椂闂�
+                                    operatorService.updateById(operator);
+                                    operatorService.auditWithCheck(operator.getId(), flowModel);
+                                    operatorUtil.handleTaskStatusThenEvent();
+                                    operatorUtil.handleOperator();
+                                }
+                            }
+                        }
+                    } catch (Exception e) {
+                        log.error("瓒呮椂鑷姩瀹℃壒寮傚父", e);
+                        try {
+                            operatorUtil.compensate(taskEntity);
+                        } catch (Exception ex) {
+                            log.error("瓒呮椂鑷姩瀹℃壒琛ュ伩寮傚父", ex);
+                        }
+                    } finally {
+                        FlowJobUtil.remove(timeModel, redisUtil);
+                    }
+                }
+            }
+        }
+
+    }
+}

--
Gitblit v1.8.0