From 1f23297a128468dbcfc474d354767ba73eb9f2d9 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Fri, 30 May 2025 10:40:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=88=97=E8=A1=A8=EF=BC=8C=E6=8A=8A=E5=AD=97=E6=AE=B5=E4=B9=9F?= =?UTF-8?q?=E6=9F=A5=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/bean/vo/ProcessInstanceVo.java | 5 + .../wflow/workflow/bean/vo/ProcessTaskVo.java | 5 + .../impl/ProcessInstanceServiceImpl.java | 37 ++++-- .../service/impl/ProcessTaskServiceImpl.java | 118 ++++++++++-------- 4 files changed, 103 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/wflow/workflow/bean/vo/ProcessInstanceVo.java b/src/main/java/com/wflow/workflow/bean/vo/ProcessInstanceVo.java index 7253882..7f2a546 100644 --- a/src/main/java/com/wflow/workflow/bean/vo/ProcessInstanceVo.java +++ b/src/main/java/com/wflow/workflow/bean/vo/ProcessInstanceVo.java @@ -1,5 +1,6 @@ package com.wflow.workflow.bean.vo; +import com.wflow.bean.entity.WflowFormData; import com.wflow.workflow.bean.process.OrgUser; import com.wflow.workflow.bean.process.enums.ProcessResultEnum; import lombok.AllArgsConstructor; @@ -55,4 +56,8 @@ public class ProcessInstanceVo { //流程实例创建时间 private Date startTime; private Date finishTime; + /** + * 流程表单数据表 + */ + private List wflowFormDataList; } diff --git a/src/main/java/com/wflow/workflow/bean/vo/ProcessTaskVo.java b/src/main/java/com/wflow/workflow/bean/vo/ProcessTaskVo.java index 6a914f7..50889f5 100644 --- a/src/main/java/com/wflow/workflow/bean/vo/ProcessTaskVo.java +++ b/src/main/java/com/wflow/workflow/bean/vo/ProcessTaskVo.java @@ -1,5 +1,6 @@ package com.wflow.workflow.bean.vo; +import com.wflow.bean.entity.WflowFormData; import com.wflow.workflow.bean.process.OrgUser; import lombok.AllArgsConstructor; import lombok.Builder; @@ -63,5 +64,9 @@ public class ProcessTaskVo { private Date taskCreateTime; //task完成时间 private Date taskEndTime; + /** + * 流程表单数据表 + */ + private List wflowFormDataList; } diff --git a/src/main/java/com/wflow/workflow/service/impl/ProcessInstanceServiceImpl.java b/src/main/java/com/wflow/workflow/service/impl/ProcessInstanceServiceImpl.java index b81387e..5c5b9e1 100644 --- a/src/main/java/com/wflow/workflow/service/impl/ProcessInstanceServiceImpl.java +++ b/src/main/java/com/wflow/workflow/service/impl/ProcessInstanceServiceImpl.java @@ -1,8 +1,8 @@ package com.wflow.workflow.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONArray; @@ -10,12 +10,8 @@ import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wflow.bean.do_.DeptDo; -import com.wflow.bean.do_.UserDeptDo; import com.wflow.bean.do_.UserDo; -import com.wflow.bean.entity.WflowCcTasks; -import com.wflow.bean.entity.WflowModelHistorys; -import com.wflow.bean.entity.WflowModels; -import com.wflow.bean.entity.WflowSubProcess; +import com.wflow.bean.entity.*; import com.wflow.bean.vo.UserVo; import com.wflow.exception.BusinessException; import com.wflow.mapper.*; @@ -36,9 +32,7 @@ import com.wflow.workflow.config.WflowGlobalVarDef; import com.wflow.workflow.service.*; import com.wflow.workflow.utils.Executor; import com.zhgd.xmgl.tenant.TenantContextHolder; -import liquibase.pro.packaged.S; import lombok.extern.slf4j.Slf4j; - import org.apache.commons.lang3.StringUtils; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.HistoryService; @@ -106,7 +100,8 @@ public class ProcessInstanceServiceImpl implements ProcessInstanceService { @Autowired private BusinessDataStorageService businessDataService; - + @Autowired + private WflowFormDataMapper formDataMapper; @Override @Transactional @@ -442,10 +437,10 @@ public class ProcessInstanceServiceImpl implements ProcessInstanceService { .ifTrueNext(Boolean.TRUE.equals(finished), instanceQuery::finished) .ifTrueNext(Boolean.FALSE.equals(finished), instanceQuery::unfinished) .ifNotBlankNext(fieldId, id -> { - if (StrUtil.isBlank(code)){ + if (StrUtil.isBlank(code)) { throw new BusinessException("搜索表单值必须先指定表单流程类型"); } - if (StrUtil.isNotBlank(fieldVal)){ + if (StrUtil.isNotBlank(fieldVal)) { instanceQuery.variableValueLike(fieldId, "%" + fieldVal + "%"); } }); @@ -479,9 +474,26 @@ public class ProcessInstanceServiceImpl implements ProcessInstanceService { page.setTotal(instanceQuery.count()); page.setRecords(instances); } + setWflowFormDataList(instances); return page; } + /** + * 设置流程表单数据表 + * + * @param instances + */ + private void setWflowFormDataList(List instances) { + if (CollUtil.isNotEmpty(instances)) { + List instanceIds = instances.stream().map(ProcessInstanceVo::getInstanceId).collect(Collectors.toList()); + Map> instanceIdMap = formDataMapper.selectList(new LambdaQueryWrapper() + .in(WflowFormData::getInstanceId, instanceIds)).stream().collect(Collectors.groupingBy(WflowFormData::getInstanceId)); + instances.forEach(vo -> { + vo.setWflowFormDataList(instanceIdMap.get(vo.getInstanceId())); + }); + } + } + @Override public Page getCcMeInstance(Integer pageSize, Integer pageNo, String code, String[] startTimes , String startUser, Boolean finished, String key) { @@ -491,7 +503,7 @@ public class ProcessInstanceServiceImpl implements ProcessInstanceService { queryWrapper.eq(WflowCcTasks::getCode, code); } List tasks = ccTasksMapper.selectList( - queryWrapper.orderByDesc(WflowCcTasks::getCreateTime)); + queryWrapper.orderByDesc(WflowCcTasks::getCreateTime)); HistoricProcessInstanceQuery instanceQuery = historyService.createHistoricProcessInstanceQuery(); //TODO 多租户 instanceQuery.processInstanceTenantId(TenantContextHolder.getTenantId()); @@ -545,6 +557,7 @@ public class ProcessInstanceServiceImpl implements ProcessInstanceService { page.setTotal(instanceQuery.count()); page.setRecords(instances); } + setWflowFormDataList(instances); } else { page.setTotal(0); page.setRecords(Collections.emptyList()); diff --git a/src/main/java/com/wflow/workflow/service/impl/ProcessTaskServiceImpl.java b/src/main/java/com/wflow/workflow/service/impl/ProcessTaskServiceImpl.java index 5a6917c..22f7cf1 100644 --- a/src/main/java/com/wflow/workflow/service/impl/ProcessTaskServiceImpl.java +++ b/src/main/java/com/wflow/workflow/service/impl/ProcessTaskServiceImpl.java @@ -2,6 +2,7 @@ package com.wflow.workflow.service.impl; import cn.hutool.cache.CacheUtil; import cn.hutool.cache.impl.TimedCache; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ConcurrentHashSet; import cn.hutool.core.date.DateUtil; @@ -11,9 +12,11 @@ import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wflow.bean.do_.UserDeptDo; +import com.wflow.bean.entity.WflowFormData; import com.wflow.bean.entity.WflowModelHistorys; import com.wflow.bean.entity.WflowModels; import com.wflow.exception.BusinessException; +import com.wflow.mapper.WflowFormDataMapper; import com.wflow.mapper.WflowModelHistorysMapper; import com.wflow.mapper.WflowModelsMapper; import com.wflow.service.OrgRepositoryService; @@ -26,7 +29,10 @@ import com.wflow.workflow.bean.process.props.CcProps; import com.wflow.workflow.bean.vo.*; import com.wflow.workflow.config.WflowGlobalVarDef; import com.wflow.workflow.extension.cmd.RecallToHisApprovalNodeCmd; -import com.wflow.workflow.service.*; +import com.wflow.workflow.service.BusinessDataStorageService; +import com.wflow.workflow.service.NotifyService; +import com.wflow.workflow.service.ProcessTaskService; +import com.wflow.workflow.service.UserDeptOrLeaderService; import com.wflow.workflow.utils.FlowableUtils; import com.zhgd.xmgl.tenant.TenantContextHolder; import lombok.extern.slf4j.Slf4j; @@ -49,6 +55,7 @@ import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.service.history.NativeHistoricTaskInstanceQuery; import org.flowable.variable.api.history.HistoricVariableInstance; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -63,42 +70,8 @@ import java.util.stream.Collectors; @Service("processTaskService") public class ProcessTaskServiceImpl implements ProcessTaskService { - @Autowired - private TaskService taskService; - - @Autowired - private RuntimeService runtimeService; - - @Autowired - private NotifyService notifyService; - - @Autowired - private BusinessDataStorageService businessDataService; - - @Autowired - private UserDeptOrLeaderService userDeptOrLeaderService; - - @Autowired - private OrgRepositoryService orgRepositoryService; - - @Autowired - private HistoryService historyService; - - @Autowired - private RepositoryService repositoryService; - - @Autowired - private ManagementService managementService; - - @Autowired - private WflowModelHistorysMapper historysMapper; - - @Autowired - private WflowModelsMapper wflowModelsMapper; - //超时缓存,数据缓存20秒,用来存储审批人防止flowable高频调用 private static final TimedCache> taskCache = CacheUtil.newTimedCache(20000); - //用来存储正在处理的节点,防止并发处理 private static final Set HANDLER_NODE_LOCK = new ConcurrentHashSet<>(); @@ -106,6 +79,32 @@ public class ProcessTaskServiceImpl implements ProcessTaskService { taskCache.schedulePrune(10000); } + @Autowired + private TaskService taskService; + @Autowired + private RuntimeService runtimeService; + @Autowired + private NotifyService notifyService; + @Autowired + private BusinessDataStorageService businessDataService; + @Autowired + private UserDeptOrLeaderService userDeptOrLeaderService; + @Autowired + private OrgRepositoryService orgRepositoryService; + @Autowired + private HistoryService historyService; + @Autowired + private RepositoryService repositoryService; + @Autowired + private ManagementService managementService; + @Autowired + private WflowModelHistorysMapper historysMapper; + @Autowired + private WflowModelsMapper wflowModelsMapper; + @Lazy + @Autowired + private WflowFormDataMapper formDataMapper; + @Override public Page getUserTodoList(Integer pageSize, Integer pageNo, String code, String[] startTimes, String startUser, String key) { String userId = UserUtil.getLoginUserId(); @@ -211,9 +210,26 @@ public class ProcessTaskServiceImpl implements ProcessTaskService { page.setRecords(taskVos); } } + setWflowFormDataList(taskVos); return page; } + /** + * 设置流程表单数据表 + * + * @param taskVos + */ + private void setWflowFormDataList(List taskVos) { + if (CollUtil.isNotEmpty(taskVos)) { + List instIds = taskVos.stream().map(ProcessTaskVo::getInstanceId).collect(Collectors.toList()); + Map> instanceIdMap = formDataMapper.selectList(new LambdaQueryWrapper() + .in(WflowFormData::getInstanceId, instIds)).stream().collect(Collectors.groupingBy(WflowFormData::getInstanceId)); + taskVos.forEach(vo -> { + vo.setWflowFormDataList(instanceIdMap.get(vo.getInstanceId())); + }); + } + } + @Override public Page getUserIdoList(Integer pageSize, Integer pageNo, String code, String[] startTimes, String startUser, String result, String key) { String userId = UserUtil.getLoginUserId(); @@ -261,17 +277,17 @@ public class ProcessTaskServiceImpl implements ProcessTaskService { //批量获取所有任务的发起部门信息 Map startDept = FlowableUtils.getProcessVars(instanceMap.keySet(), "startDept"); List taskVos = taskInstances.stream().map(task -> { - HistoricProcessInstance instance = instanceMap.get(task.getProcessInstanceId()); - HistoricVariableInstance variableInstance = historyService.createHistoricVariableInstanceQuery() - .processInstanceId(instance.getId()).variableName("approve_" + task.getId()).singleResult(); - if (StringUtils.isNotBlank(result)) { - System.out.println("11111" + variableInstance.getValue()); - if (!variableInstance.getValue().toString().equals(result)) { - return null; - } + HistoricProcessInstance instance = instanceMap.get(task.getProcessInstanceId()); + HistoricVariableInstance variableInstance = historyService.createHistoricVariableInstanceQuery() + .processInstanceId(instance.getId()).variableName("approve_" + task.getId()).singleResult(); + if (StringUtils.isNotBlank(result)) { + System.out.println("11111" + variableInstance.getValue()); + if (!variableInstance.getValue().toString().equals(result)) { + return null; } - //构造用户id -> 部门id - staterUsers.add(instance.getStartUserId() + "_" + startDept.getOrDefault(instance.getId(), + } + //构造用户id -> 部门id + staterUsers.add(instance.getStartUserId() + "_" + startDept.getOrDefault(instance.getId(), //如果没有就从流程变量 owner 里取(之前是存owner变量) FlowableUtils.getOwnerDept(instance.getId(), false))); return ProcessTaskVo.builder() @@ -334,6 +350,7 @@ public class ProcessTaskServiceImpl implements ProcessTaskService { page.setRecords(taskVos); } } + setWflowFormDataList(taskVos); return page; } @@ -352,7 +369,7 @@ public class ProcessTaskServiceImpl implements ProcessTaskService { if (ProcessHandlerParamsVo.Action.cancel.equals(params.getAction())) { params.getComment().setText("撤销:" + params.getComment().getText()); } - if (!(isComment || putComment)){ + if (!(isComment || putComment)) { throw new BusinessException("任务不存在,请刷新数据"); } taskService.addComment(params.getTaskId(), params.getInstanceId(), JSONObject.toJSONString(params.getComment())); @@ -415,11 +432,11 @@ public class ProcessTaskServiceImpl implements ProcessTaskService { //throw new BusinessException("暂不支持单独评论"); break; } - }catch (Exception e) { + } catch (Exception e) { log.error("处理任务异常", e); // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); throw new BusinessException(e.getMessage()); - }finally { + } finally { //移除锁 HANDLER_NODE_LOCK.remove(lockKey); } @@ -548,14 +565,15 @@ public class ProcessTaskServiceImpl implements ProcessTaskService { /** * 获取审批人 * - * @param props 节点熟悉 + * @param props 节点熟悉 * @param tenantId * @return 审批人ID列表 */ public List getApprovalUsers(String instanceId, String nodeId, ApprovalProps props, String tenantId) { String userId = runtimeService.getVariable(instanceId, WflowGlobalVarDef.INITIATOR, String.class); String deptId = runtimeService.getVariable(instanceId, WflowGlobalVarDef.START_DEPT, String.class); - deptId = StrUtil.isNotBlank(deptId) ? deptId : runtimeService.getVariable(instanceId, WflowGlobalVarDef.OWNER, ProcessInstanceOwnerDto.class).getOwnerDeptId();; + deptId = StrUtil.isNotBlank(deptId) ? deptId : runtimeService.getVariable(instanceId, WflowGlobalVarDef.OWNER, ProcessInstanceOwnerDto.class).getOwnerDeptId(); + ; Set userSet = new LinkedHashSet<>(); switch (props.getAssignedType()) { case REFUSE: