fix 修复会签 票签撤销问题

This commit is contained in:
gssong 2024-12-15 15:03:20 +08:00
parent 0e96074dac
commit 33e28daba6
2 changed files with 57 additions and 10 deletions

View File

@ -197,23 +197,16 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
if (definition == null) { if (definition == null) {
throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF); throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF);
} }
String message = bo.getMessage();
BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus()); BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
List<Task> list = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId()));
//获取已发布的流程节点 //获取已发布的流程节点
List<FlowNode> flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper<FlowNode>().eq(FlowNode::getDefinitionId, definition.getId())); List<FlowNode> flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper<FlowNode>().eq(FlowNode::getDefinitionId, definition.getId()));
AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE); AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE);
Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null); Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null);
AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE);
Node nextNode = nodeService.getNextNode(definition.getId(), startNode.getNodeCode(), null, SkipType.NONE.getKey()); Node nextNode = nodeService.getNextNode(definition.getId(), startNode.getNodeCode(), null, SkipType.NONE.getKey());
for (Task task : list) { //撤销
FlowParams flowParams = FlowParams.build(); cancelTask(message, instance, nextNode);
flowParams.nodeCode(nextNode.getNodeCode());
flowParams.message(bo.getMessage());
flowParams.skipType(SkipType.PASS.getKey());
flowParams.flowStatus(BusinessStatusEnum.CANCEL.getStatus()).hisStatus(TaskStatusEnum.CANCEL.getStatus());
flowParams.ignore(true);
taskService.skip(task.getId(), flowParams);
}
//判断申请人节点是否有多个只保留一个 //判断申请人节点是否有多个只保留一个
List<Task> currentTaskList = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId())); List<Task> currentTaskList = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId()));
if (CollUtil.isNotEmpty(currentTaskList)) { if (CollUtil.isNotEmpty(currentTaskList)) {
@ -242,6 +235,39 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
return true; return true;
} }
/**
* 撤销流程
*
* @param message 审批已经
* @param instance 流程实例
* @param nextNode 申请人节点
*/
private void cancelTask(String message, Instance instance, Node nextNode) {
List<Task> list = taskService.list(FlowFactory.newTask().setInstanceId(instance.getId()));
if (CollUtil.isNotEmpty(list)) {
List<Task> tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(nextNode.getNodeCode()));
if (list.size() == tasks.size()) {
return;
}
}
for (Task task : list) {
List<UserDTO> userList = flwTaskService.currentTaskAllUser(task.getId());
FlowParams flowParams = FlowParams.build();
flowParams.nodeCode(nextNode.getNodeCode());
flowParams.message(message);
flowParams.skipType(SkipType.PASS.getKey());
flowParams.flowStatus(BusinessStatusEnum.CANCEL.getStatus()).hisStatus(TaskStatusEnum.CANCEL.getStatus());
flowParams.ignore(true);
//解决会签或签撤销没权限问题
if (CollUtil.isNotEmpty(userList)) {
flowParams.handler(userList.get(0).getUserId().toString());
}
taskService.skip(task.getId(), flowParams);
}
//解决会签或签多人审批问题
cancelTask(message, instance, nextNode);
}
/** /**
* 获取当前登陆人发起的流程实例 * 获取当前登陆人发起的流程实例
* *
@ -423,6 +449,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
flowParams.message(bo.getComment()); flowParams.message(bo.getComment());
flowParams.flowStatus(BusinessStatusEnum.INVALID.getStatus()) flowParams.flowStatus(BusinessStatusEnum.INVALID.getStatus())
.hisStatus(TaskStatusEnum.INVALID.getStatus()); .hisStatus(TaskStatusEnum.INVALID.getStatus());
flowParams.ignore(true);
taskService.termination(flowTask.getId(), flowParams); taskService.termination(flowTask.getId(), flowParams);
} }
return true; return true;

20
script/bpmn/leave4.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<definition flowCode="leave4" flowName="请假申请-会签" version="1" category="1" formCustom="N">
<node nodeType="start" nodeCode="9ce8bf00-f25b-4fc6-91b8-827082fc4876" nodeName="开始" nodeRatio="0.000" coordinate="320,240|320,240" skipAnyNode="N" formCustom="N">
<skip coordinate="340,240;410,240" skipType="PASS">e90b98ef-35b4-410c-a663-bae8b7624b9f</skip>
</node>
<node nodeType="between" nodeCode="e90b98ef-35b4-410c-a663-bae8b7624b9f" nodeName="申请人" nodeRatio="0.000" coordinate="460,240|460,240" skipAnyNode="N" formCustom="N">
<skip coordinate="510,240;590,240" skipType="PASS">768b5b1a-6726-4d67-8853-4cc70d5b1045</skip>
</node>
<node nodeType="between" nodeCode="768b5b1a-6726-4d67-8853-4cc70d5b1045" nodeName="百分之60通过" permissionFlag="${userList}" nodeRatio="60.000" coordinate="640,240|640,240" skipAnyNode="N" formCustom="N">
<skip coordinate="690,240;770,240" skipType="PASS">2f9f2e21-9bcf-42a3-a07c-13037aad22d1</skip>
</node>
<node nodeType="between" nodeCode="2f9f2e21-9bcf-42a3-a07c-13037aad22d1" nodeName="全部审批通过" permissionFlag="role:1,role:3" nodeRatio="100.000" coordinate="820,240|820,240" skipAnyNode="N" formCustom="N">
<skip coordinate="870,240;950,240" skipType="PASS">27461e01-3d9f-4530-8fe3-bd5ec7f9571f</skip>
</node>
<node nodeType="between" nodeCode="27461e01-3d9f-4530-8fe3-bd5ec7f9571f" nodeName="CEO" permissionFlag="1" nodeRatio="0.000" coordinate="1000,240|1000,240" skipAnyNode="N" formCustom="N">
<skip coordinate="1050,240;1080,240;1080,240;1070,240;1070,240;1100,240" skipType="PASS">b62b88c3-8d8d-4969-911e-2aaea219e7fc</skip>
</node>
<node nodeType="end" nodeCode="b62b88c3-8d8d-4969-911e-2aaea219e7fc" nodeName="结束" nodeRatio="0.000" coordinate="1120,240|1120,240" skipAnyNode="N" formCustom="N"/>
</definition>