diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/helper/WflowHelper.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/helper/WflowHelper.java
new file mode 100644
index 0000000..c5ef5fb
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/helper/WflowHelper.java
@@ -0,0 +1,100 @@
+package com.hz.pm.api.common.helper;
+
+import lombok.RequiredArgsConstructor;
+import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.bpmn.model.Process;
+import org.flowable.bpmn.model.UserTask;
+import org.flowable.engine.HistoryService;
+import org.flowable.engine.RepositoryService;
+import org.flowable.engine.history.HistoricActivityInstance;
+import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.variable.api.history.HistoricVariableInstance;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * WflowHelper
+ *
+ *
+ * @author WendyYang
+ * @since 16:00 2024/3/11
+ */
+@Component
+@RequiredArgsConstructor
+public class WflowHelper {
+
+ private final HistoryService historyService;
+ private final RepositoryService repositoryService;
+
+ /**
+ * 所有流程是否完成(审核通过)
+ *
+ * @param instCodes \
+ * @return \
+ */
+ public boolean allInstancesFinished(Set instCodes) {
+ List finishedInstances = historyService.createHistoricProcessInstanceQuery()
+ .processInstanceIds(instCodes)
+ .finished()
+ .list();
+ if (finishedInstances.size() != instCodes.size()) {
+ return Boolean.FALSE;
+ }
+ for (HistoricProcessInstance instance : finishedInstances) {
+ String processDefinitionId = instance.getProcessDefinitionId();
+ UserTask userTaskDefineNode = getLastUserTaskDefineNode(processDefinitionId);
+ List finishedTasks = historyService.createHistoricActivityInstanceQuery()
+ .activityType("userTask")
+ .activityId(userTaskDefineNode.getId())
+ .processInstanceId(instance.getId())
+ .orderByHistoricActivityInstanceEndTime()
+ .desc()
+ .list();
+ if (finishedTasks.isEmpty()) {
+ return Boolean.FALSE;
+ }
+ List variableInstances = finishedTasks.stream()
+ .map(w -> {
+ String variableName = "approve_" + w.getTaskId();
+ return historyService.createHistoricVariableInstanceQuery()
+ .processInstanceId(instance.getId())
+ .variableName(variableName)
+ .singleResult();
+ }).filter(w -> w != null && "PASS".equals(w.getValue().toString()))
+ .collect(Collectors.toList());
+ if (userTaskDefineNode.getLoopCharacteristics().isSequential()) {
+ if (variableInstances.isEmpty()) {
+ return Boolean.FALSE;
+ }
+ } else {
+ if (variableInstances.size() != finishedTasks.size()) {
+ return Boolean.FALSE;
+ }
+ }
+ }
+ return Boolean.TRUE;
+ }
+
+ /**
+ * 获取流程定义的最后一个用户任务节点
+ *
+ * @param processDefinitionId processDefinitionId
+ * @return \
+ */
+ public UserTask getLastUserTaskDefineNode(String processDefinitionId) {
+ BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
+ List processes = bpmnModel.getProcesses();
+ if (!processes.isEmpty()) {
+ List userTasks = processes.get(0).findFlowElementsOfType(UserTask.class);
+ if (!userTasks.isEmpty()) {
+ return userTasks.get(userTasks.size() - 1);
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/todocenter/manage/HandlerManage.java b/hz-pm-api/src/main/java/com/hz/pm/api/todocenter/manage/HandlerManage.java
index 297e5d3..cc4f76a 100644
--- a/hz-pm-api/src/main/java/com/hz/pm/api/todocenter/manage/HandlerManage.java
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/todocenter/manage/HandlerManage.java
@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Sets;
import com.hz.pm.api.common.enumeration.ProjectProcessStageEnum;
+import com.hz.pm.api.common.helper.WflowHelper;
import com.hz.pm.api.common.model.constant.BizConst;
import com.hz.pm.api.common.model.constant.TypeReferenceConst;
import com.hz.pm.api.common.statemachine.util.StateMachineUtil;
@@ -56,11 +57,15 @@ import com.wflow.workflow.service.ProcessInstanceService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
+import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.HistoryService;
+import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.task.Comment;
import org.flowable.variable.api.history.HistoricVariableInstance;
import org.springframework.beans.BeanUtils;
@@ -102,6 +107,7 @@ public class HandlerManage {
private final IPurchaseService purchaseService;
private final IPurchaseInstService purchaseInstService;
private final TenderStateMachineUtil tenderStateMachineUtil;
+ private final WflowHelper wflowHelper;
@Value("${spring.profiles.active}")
private String active;
@@ -253,41 +259,12 @@ public class HandlerManage {
if (instCodes.size() != purchases.size()) {
return;
}
- if (allInstancesFinished(instCodes)) {
+ if (wflowHelper.allInstancesFinished(instCodes)) {
stateMachineUtil.pass(project);
projectService.updateById(project);
}
}
- public boolean allInstancesFinished(Set instCodes) {
- long finishedCount = historyService.createHistoricProcessInstanceQuery()
- .processInstanceIds(instCodes)
- .finished()
- .count();
- if (finishedCount != instCodes.size()) {
- return Boolean.FALSE;
- }
- for (String instCode : instCodes) {
- HistoricActivityInstance task = historyService.createHistoricActivityInstanceQuery()
- .activityType("userTask")
- .processInstanceId(instCode)
- .orderByHistoricActivityInstanceEndTime()
- .desc()
- .singleResult();
- if (task == null) {
- return Boolean.FALSE;
- }
- HistoricVariableInstance variableInstance = historyService.createHistoricVariableInstanceQuery()
- .processInstanceId(instCode)
- .variableName("approve_" + task.getTaskId())
- .singleResult();
- if (variableInstance == null || !"PASS".equals(variableInstance.getValue())) {
- return Boolean.FALSE;
- }
- }
- return Boolean.TRUE;
- }
-
private void purchaseRejectedCallback(Project project, String instanceId) {
PurchaseInst purchaseInst = purchaseInstService.getByProjectIdAndInstCode(project.getId(), instanceId);
Assert.notNull(purchaseInst, "该标段对应的流程不存在");
diff --git a/hz-pm-api/src/test/java/com/hz/pm/api/todocenter/FlowableTest.java b/hz-pm-api/src/test/java/com/hz/pm/api/todocenter/FlowableTest.java
index dc3a677..ed0dc8c 100644
--- a/hz-pm-api/src/test/java/com/hz/pm/api/todocenter/FlowableTest.java
+++ b/hz-pm-api/src/test/java/com/hz/pm/api/todocenter/FlowableTest.java
@@ -1,27 +1,16 @@
package com.hz.pm.api.todocenter;
-import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
-import cn.hutool.poi.excel.ExcelUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hz.pm.api.AppTests;
-import com.hz.pm.api.common.model.constant.BizConst;
-import com.hz.pm.api.user.helper.MhUnitCache;
-import com.hz.pm.api.user.model.entity.MhUnit;
-import com.hz.pm.api.user.service.IMhUnitService;
+import com.hz.pm.api.common.helper.WflowHelper;
import com.ningdatech.basic.exception.BizException;
-import com.ningdatech.basic.util.CollUtils;
import com.wflow.bean.entity.WflowCcTasks;
-import com.wflow.bean.entity.WflowModelHistorys;
-import com.wflow.bean.entity.WflowModels;
import com.wflow.mapper.WflowCcTasksMapper;
import com.wflow.utils.CodeUtil;
import com.wflow.workflow.bean.dto.ReqProcessHandlerDTO;
import com.wflow.workflow.enums.ProcessHandlerEnum;
import com.wflow.workflow.mapper.CustomHisActInstMapper;
-import com.wflow.workflow.service.ProcessModelHistorysService;
-import com.wflow.workflow.service.ProcessModelService;
import com.wflow.workflow.utils.ProcessTaskUtils;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.util.Lists;
@@ -37,6 +26,7 @@ import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.variable.api.history.HistoricVariableInstance;
import org.junit.Test;
+import org.mockito.internal.util.collections.Sets;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;
@@ -321,31 +311,11 @@ public class FlowableTest extends AppTests {
}
@Autowired
- private IMhUnitService mhUnitService;
- @Autowired
- private MhUnitCache mhUnitCache;
- @Autowired
- private ProcessModelService processModelService;
- @Autowired
- private ProcessModelHistorysService processModelHistorysService;
+ private WflowHelper wflowHelper;
@Test
public void test() {
- List wflowModels = processModelService.list(Wrappers.lambdaQuery(WflowModels.class)
- .ne(WflowModels::getRegionCode, "1"));
- for (WflowModels model : wflowModels) {
- WflowModelHistorys history = BeanUtil.copyProperties(model, WflowModelHistorys.class);
- processModelHistorysService.save(history);
- }
- }
-
- public static void main(String[] args) {
- String path = "/Users/wendy/Desktop/项目下达资金-评审金额 - 副本.xls";
- List