update 调整驳回

This commit is contained in:
gssong 2024-12-17 15:49:31 +08:00
parent 0e530feee4
commit 1adffe70f3
6 changed files with 96 additions and 52 deletions

View File

@ -9,6 +9,8 @@ import org.dromara.workflow.domain.bo.FlowTaskBo;
import org.dromara.workflow.domain.vo.FlowHisTaskVo;
import org.dromara.workflow.domain.vo.FlowTaskVo;
import java.util.List;
/**
* 任务信息Mapper接口
@ -25,8 +27,15 @@ public interface FlwTaskMapper {
* @param queryWrapper 条件
* @return 结果
*/
Page<FlowTaskVo> getTaskWaitByPage(@Param("page") Page<FlowTaskVo> page, @Param(Constants.WRAPPER) Wrapper<FlowTaskBo> queryWrapper);
Page<FlowTaskVo> getListRunTask(@Param("page") Page<FlowTaskVo> page, @Param(Constants.WRAPPER) Wrapper<FlowTaskBo> queryWrapper);
/**
* 获取待办信息
*
* @param queryWrapper 条件
* @return 结果
*/
List<FlowTaskVo> getListRunTask(@Param(Constants.WRAPPER) Wrapper<FlowTaskBo> queryWrapper);
/**
* 获取已办
*
@ -34,7 +43,7 @@ public interface FlwTaskMapper {
* @param queryWrapper 条件
* @return 结果
*/
Page<FlowHisTaskVo> getTaskFinishByPage(@Param("page") Page<FlowTaskVo> page, @Param(Constants.WRAPPER) Wrapper<FlowTaskBo> queryWrapper);
Page<FlowHisTaskVo> getListFinishTask(@Param("page") Page<FlowTaskVo> page, @Param(Constants.WRAPPER) Wrapper<FlowTaskBo> queryWrapper);
/**
* 查询当前用户的抄送

View File

@ -22,23 +22,16 @@ import org.dromara.warm.flow.core.constant.ExceptionCons;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.entity.Definition;
import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.warm.flow.core.entity.Node;
import org.dromara.warm.flow.core.entity.Task;
import org.dromara.warm.flow.core.enums.NodeType;
import org.dromara.warm.flow.core.enums.SkipType;
import org.dromara.warm.flow.core.service.DefService;
import org.dromara.warm.flow.core.service.InsService;
import org.dromara.warm.flow.core.service.NodeService;
import org.dromara.warm.flow.core.service.TaskService;
import org.dromara.warm.flow.core.utils.AssertUtil;
import org.dromara.warm.flow.orm.entity.FlowHisTask;
import org.dromara.warm.flow.orm.entity.FlowInstance;
import org.dromara.warm.flow.orm.entity.FlowNode;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper;
import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper;
import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.bo.FlowCancelBo;
import org.dromara.workflow.domain.bo.FlowInstanceBo;
@ -69,12 +62,9 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
private final InsService insService;
private final DefService defService;
private final FlowHisTaskMapper flowHisTaskMapper;
private final FlowTaskMapper flowTaskMapper;
private final FlowInstanceMapper flowInstanceMapper;
private final FlwInstanceMapper flwInstanceMapper;
private final TaskService taskService;
private final FlowNodeMapper flowNodeMapper;
private final NodeService nodeService;
private final IFlwTaskService flwTaskService;
/**
@ -206,9 +196,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
if (CollUtil.isNotEmpty(currentTaskList)) {
if (currentTaskList.size() > 1) {
currentTaskList.remove(0);
List<Long> taskIds = StreamUtils.toList(currentTaskList, Task::getId);
WorkflowUtils.getFlowUserService().deleteByTaskIds(taskIds);
flowTaskMapper.deleteByIds(taskIds);
WorkflowUtils.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId));
}
}

View File

@ -44,6 +44,7 @@ import org.dromara.workflow.handler.WorkflowPermissionHandler;
import org.dromara.workflow.mapper.FlwTaskMapper;
import org.dromara.workflow.service.IFlwTaskService;
import org.dromara.workflow.utils.WorkflowUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -155,7 +156,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
Instance instance = taskService.skip(taskId, flowParams);
this.setHandler(instance, flowTask, flowCopyList);
// 消息通知
WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice);
sendMessage(definition.getFlowName(), ins.getId(), messageType, notice);
return true;
} catch (Exception e) {
log.error(e.getMessage(), e);
@ -203,7 +204,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
* @param task 任务信息
* @param flowCopyList 抄送人
*/
private void setCopy(FlowTask task, List<FlowCopy> flowCopyList) {
@Async
public void setCopy(FlowTask task, List<FlowCopy> flowCopyList) {
if (CollUtil.isEmpty(flowCopyList)) {
return;
}
@ -265,7 +267,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey());
queryWrapper.in("t.approver", LoginHelper.getUserIdStr());
queryWrapper.orderByDesc("t.create_time").orderByDesc("t.update_time");
Page<FlowHisTaskVo> page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper);
Page<FlowHisTaskVo> page = flwTaskMapper.getListFinishTask(pageQuery.build(), queryWrapper);
return TableDataInfo.build(page);
}
@ -284,7 +286,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
}
private Page<FlowTaskVo> getFlowTaskVoPage(PageQuery pageQuery, QueryWrapper<FlowTaskBo> queryWrapper) {
Page<FlowTaskVo> page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper);
Page<FlowTaskVo> page = flwTaskMapper.getListRunTask(pageQuery.build(), queryWrapper);
List<FlowTaskVo> records = page.getRecords();
if (CollUtil.isNotEmpty(records)) {
List<Long> taskIds = StreamUtils.toList(records, FlowTaskVo::getId);
@ -309,7 +311,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
@Override
public TableDataInfo<FlowHisTaskVo> pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
QueryWrapper<FlowTaskBo> queryWrapper = buildQueryWrapper(flowTaskBo);
Page<FlowHisTaskVo> page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper);
Page<FlowHisTaskVo> page = flwTaskMapper.getListFinishTask(pageQuery.build(), queryWrapper);
return TableDataInfo.build(page);
}
@ -360,36 +362,30 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
Long definitionId = task.getDefinitionId();
Definition definition = defService.getById(definitionId);
String applyNodeCode = WorkflowUtils.applyNodeCode(definitionId);
FlowNode node = flowNodes.stream().filter(e -> e.getNodeCode().equals(task.getNodeCode())).findFirst().orElse(null);
BigDecimal nodeRatio = node.getNodeRatio();
//票签
if (nodeRatio.compareTo(BigDecimal.ZERO) > 0 && nodeRatio.compareTo(new BigDecimal(100)) < 0) {
List<UserDTO> userList = this.currentTaskAllUser(task.getId());
FlowParams flowParams = FlowParams.build();
flowParams.nodeCode(bo.getNodeCode());
flowParams.message(message);
flowParams.skipType(SkipType.PASS.getKey());
if (applyNodeCode.equals(bo.getNodeCode())) {
flowParams.flowStatus(TaskStatusEnum.BACK.getStatus()).hisStatus(TaskStatusEnum.BACK.getStatus());
} else {
flowParams.flowStatus(TaskStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.BACK.getStatus());
}
flowParams.ignore(true);
//解决票签没权限问题
if (CollUtil.isNotEmpty(userList)) {
flowParams.handler(userList.get(0).getUserId().toString());
}
taskService.skip(task.getId(), flowParams);
List<FlowTaskVo> listRunTask = flwTaskMapper.getListRunTask(new QueryWrapper<FlowTaskBo>().eq("instance_id", task.getInstanceId()));
//不是当前节点的待审任务
List<FlowTaskVo> taskVos = StreamUtils.filter(listRunTask, e -> !e.getId().equals(taskId));
WorkflowUtils.deleteRunTask(StreamUtils.toList(taskVos, FlowTaskVo::getId));
if (applyNodeCode.equals(bo.getNodeCode())) {
WorkflowUtils.backTask(message, inst.getId(), bo.getNodeCode(), TaskStatusEnum.BACK.getStatus(), TaskStatusEnum.BACK.getStatus());
} else {
//申请人节点
if (applyNodeCode.equals(bo.getNodeCode())) {
WorkflowUtils.backTask(message, inst.getId(), applyNodeCode, TaskStatusEnum.BACK.getStatus(), TaskStatusEnum.BACK.getStatus());
} else {
WorkflowUtils.backTask(message, inst.getId(), bo.getNodeCode(), TaskStatusEnum.WAITING.getStatus(), TaskStatusEnum.BACK.getStatus());
WorkflowUtils.backTask(message, inst.getId(), bo.getNodeCode(), TaskStatusEnum.WAITING.getStatus(), TaskStatusEnum.BACK.getStatus());
}
//删除记录
FlowNode node = flowNodes.stream().filter(e -> e.getNodeCode().equals(task.getNodeCode())).findFirst().orElse(null);
if (node.getNodeRatio().compareTo(BigDecimal.ZERO) > 0) {
List<FlowHisTask> flowHisTasks = flowHisTaskMapper.selectList(
new LambdaQueryWrapper<FlowHisTask>()
.eq(FlowHisTask::getFlowStatus, BusinessStatusEnum.BACK.getStatus())
.eq(FlowHisTask::getTaskId, taskId)
.ne(FlowHisTask::getApprover, LoginHelper.getUserIdStr())
);
if (CollUtil.isNotEmpty(flowHisTasks)) {
flowHisTaskMapper.deleteByIds(StreamUtils.toList(flowHisTasks, FlowHisTask::getId));
}
}
Instance instance = insService.getById(inst.getId());
//判断申请人节点是否有多个只保留一个
//判断节点是否有多个只保留一个
List<FlowTask> currentTaskList = selectByInstId(instance.getId());
if (CollUtil.isNotEmpty(currentTaskList)) {
List<String> nodeCodes = StreamUtils.toList(currentTaskList, FlowTask::getNodeCode);
@ -398,15 +394,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
List<FlowTask> flowTasks = currentTaskList.stream().filter(e -> e.getNodeCode().equals(n.getNodeCode()) && n.getNodeRatio().compareTo(BigDecimal.ZERO) == 0).collect(Collectors.toList());
if (flowTasks.size() > 1) {
flowTasks.remove(0);
List<Long> taskIds = StreamUtils.toList(flowTasks, Task::getId);
WorkflowUtils.getFlowUserService().deleteByTaskIds(taskIds);
flowTaskMapper.deleteByIds(taskIds);
WorkflowUtils.deleteRunTask(StreamUtils.toList(flowTasks, Task::getId));
}
}
}
this.setHandler(instance, task, null);
//消息通知
WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
return true;
} catch (Exception e) {
log.error(e.getMessage(), e);
@ -414,6 +408,18 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
}
}
/**
* 发送消息
*
* @param flowName 流程定义名称
* @param messageType 消息类型
* @param notice 消息内容为空则发送默认配置的消息内容
*/
@Async
public void sendMessage(String flowName, Long instId, List<String> messageType, String notice) {
WorkflowUtils.sendMessage(flowName, instId, messageType, notice);
}
/**
* 获取可驳回节点
*

View File

@ -28,6 +28,7 @@ import org.dromara.warm.flow.orm.entity.FlowNode;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.warm.flow.orm.entity.FlowUser;
import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
import org.dromara.workflow.common.enums.MessageTypeEnum;
import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.dromara.workflow.service.IFlwTaskService;
@ -52,6 +53,7 @@ public class WorkflowUtils {
private static final TaskService taskService = SpringUtils.getBean(TaskService.class);
private static final FlowNodeMapper FLOW_NODE_MAPPER = SpringUtils.getBean(FlowNodeMapper.class);
private static final NodeService nodeService = SpringUtils.getBean(NodeService.class);
private static final FlowTaskMapper FLOW_TASK_MAPPER = SpringUtils.getBean(FlowTaskMapper.class);
/**
* 获取工作流用户service
@ -189,4 +191,16 @@ public class WorkflowUtils {
return nextNode.getNodeCode();
}
/**
* 删除运行中的任务
*
* @param taskIds 任务id
*/
public static void deleteRunTask(List<Long> taskIds) {
if (CollUtil.isEmpty(taskIds)) {
return;
}
userService.deleteByTaskIds(taskIds);
FLOW_TASK_MAPPER.deleteByIds(taskIds);
}
}

View File

@ -8,7 +8,7 @@
<resultMap type="org.dromara.workflow.domain.vo.FlowHisTaskVo" id="FlowHisTaskResult">
</resultMap>
<select id="getTaskWaitByPage" resultMap="FlowTaskResult">
<select id="getListRunTask" resultMap="FlowTaskResult">
select * from (
select distinct
t.id,
@ -42,7 +42,7 @@
${ew.getCustomSqlSegment}
</select>
<select id="getTaskFinishByPage" resultMap="FlowHisTaskResult">
<select id="getListFinishTask" resultMap="FlowHisTaskResult">
select * from (
select
a.id,

27
script/bpmn/leave5.xml Normal file
View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<definition flowCode="leave5" flowName="请假申请-并行会签网关" version="1" category="100" formCustom="N" formPath="/workflow/leaveEdit/index">
<node nodeType="start" nodeCode="ebebaf26-9cb6-497e-8119-4c9fed4c597c" nodeName="开始" nodeRatio="0.000" coordinate="300,220|300,220" skipAnyNode="N" formCustom="N">
<skip coordinate="320,220;350,220;350,220;340,220;340,220;370,220" skipType="PASS">e1b04e96-dc81-4858-a309-2fe945d2f374</skip>
</node>
<node nodeType="between" nodeCode="e1b04e96-dc81-4858-a309-2fe945d2f374" nodeName="申请人" nodeRatio="0.000" coordinate="420,220|420,220" skipAnyNode="N" formCustom="N">
<skip coordinate="470,220;535,220" skipType="PASS">3e743f4f-51ca-41d4-8e94-21f5dd9b59c9</skip>
</node>
<node nodeType="parallel" nodeCode="3e743f4f-51ca-41d4-8e94-21f5dd9b59c9" nodeRatio="0.000" coordinate="560,220" skipAnyNode="N" formCustom="N">
<skip coordinate="560,245;560,320;650,320" skipType="PASS">c80f273e-1f17-4bd8-9ad1-04a4a94ea862</skip>
<skip coordinate="560,195;560,120;650,120" skipType="PASS">1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4</skip>
</node>
<node nodeType="between" nodeCode="c80f273e-1f17-4bd8-9ad1-04a4a94ea862" nodeName="会签" permissionFlag="role:1,role:3" nodeRatio="100.000" coordinate="700,320|700,320" skipAnyNode="N" formCustom="N">
<skip coordinate="750,320;860,320;860,245" skipType="PASS">1a20169e-3d82-4926-a151-e2daad28de1b</skip>
</node>
<node nodeType="parallel" nodeCode="1a20169e-3d82-4926-a151-e2daad28de1b" nodeRatio="0.000" coordinate="860,220" skipAnyNode="N" formCustom="N">
<skip coordinate="885,220;950,220" skipType="PASS">7a8f0473-e409-442e-a843-5c2b813d00e9</skip>
</node>
<node nodeType="between" nodeCode="7a8f0473-e409-442e-a843-5c2b813d00e9" nodeName="CEO" permissionFlag="1" nodeRatio="0.000" coordinate="1000,220|1000,220" skipAnyNode="N" formCustom="N">
<skip coordinate="1050,220;1120,220" skipType="PASS">03c4d2bc-58b5-4408-a2e4-65afb046f169</skip>
</node>
<node nodeType="end" nodeCode="03c4d2bc-58b5-4408-a2e4-65afb046f169" nodeName="结束" nodeRatio="0.000" coordinate="1140,220|1140,220" skipAnyNode="N" formCustom="N"/>
<node nodeType="between" nodeCode="1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4" nodeName="百分之60票签" permissionFlag="${userList}" nodeRatio="60.000" coordinate="700,120|700,120" skipAnyNode="N" formCustom="N">
<skip coordinate="750,120;860,120;860,195" skipType="PASS">1a20169e-3d82-4926-a151-e2daad28de1b</skip>
</node>
</definition>