优化完成 加签、减签、认领 支持

This commit is contained in:
hubin 2023-09-03 20:44:54 +08:00
parent e366512794
commit 72b112bcf2
4 changed files with 52 additions and 80 deletions

View File

@ -27,9 +27,9 @@ FlowLong🐉飞龙工作流
| 跳转 | 可以将当前流程实例跳转到任意办理节点 | ✅ | | 跳转 | 可以将当前流程实例跳转到任意办理节点 | ✅ |
| 拿回 | 在当前办理人尚未处理文件前,允许上一节点提交人员执行拿回 | ✅ | | 拿回 | 在当前办理人尚未处理文件前,允许上一节点提交人员执行拿回 | ✅ |
| 撤销 | 流程发起者可以对流程进行撤销处理 | ✅ | | 撤销 | 流程发起者可以对流程进行撤销处理 | ✅ |
| 加签 | 允许当前办理人根据需要自行增加当前办理节点的办理人员 | 🔘 | | 加签 | 允许当前办理人根据需要自行增加当前办理节点的办理人员 | |
| 减签 | 在当前办理人操作之前减少办理人 | 🔘 | | 减签 | 在当前办理人操作之前减少办理人 | |
| 认领 | 公共任务认领 | 🔘 | | 认领 | 公共任务认领 | |
| 已阅 | 任务是否查看状态显示 | ✅ | | 已阅 | 任务是否查看状态显示 | ✅ |
| 催办 | 通知当前活动任务处理人办理任务 | ✅ | | 催办 | 通知当前活动任务处理人办理任务 | ✅ |
| 沟通 | 与当前活动任务处理人沟通 | ✅ | | 沟通 | 与当前活动任务处理人沟通 | ✅ |

View File

@ -16,6 +16,7 @@ package com.flowlong.bpm.engine;
import com.flowlong.bpm.engine.core.Execution; import com.flowlong.bpm.engine.core.Execution;
import com.flowlong.bpm.engine.core.FlowCreator; import com.flowlong.bpm.engine.core.FlowCreator;
import com.flowlong.bpm.engine.core.enums.PerformType;
import com.flowlong.bpm.engine.core.enums.TaskType; import com.flowlong.bpm.engine.core.enums.TaskType;
import com.flowlong.bpm.engine.entity.Task; import com.flowlong.bpm.engine.entity.Task;
import com.flowlong.bpm.engine.entity.TaskActor; import com.flowlong.bpm.engine.entity.TaskActor;
@ -213,26 +214,26 @@ public interface TaskService {
/** /**
* 向指定的任务ID添加参与者加签 * 向指定的任务ID添加参与者加签
* *
* @param taskId 任务ID * @param taskId 任务ID
* @param taskType 参与类型 {@link TaskType} * @param performType 参与类型 {@link PerformType}
* @param taskActors 参与者列表 * @param taskActors 参与者列表
*/ */
boolean addTaskActor(Long taskId, TaskType taskType, List<TaskActor> taskActors); boolean addTaskActor(Long taskId, PerformType performType, List<TaskActor> taskActors);
default boolean addTaskActor(Long taskId, TaskType taskType, TaskActor taskActor) { default boolean addTaskActor(Long taskId, PerformType performType, TaskActor taskActor) {
return this.addTaskActor(taskId, taskType, Arrays.asList(taskActor)); return this.addTaskActor(taskId, performType, Arrays.asList(taskActor));
} }
/** /**
* 对指定的任务ID删除参与者减签 * 对指定的任务ID删除参与者减签
* *
* @param taskId 任务ID * @param taskId 任务ID
* @param actors 参与者 * @param actorIds 参与者ID列表
*/ */
boolean removeTaskActor(Long taskId, List<String> actors); boolean removeTaskActor(Long taskId, List<String> actorIds);
default boolean removeTaskActor(Long taskId, String actor) { default boolean removeTaskActor(Long taskId, String actorId) {
return removeTaskActor(taskId, Arrays.asList(actor)); return removeTaskActor(taskId, Arrays.asList(actorId));
} }
/** /**

View File

@ -523,7 +523,7 @@ public class TaskServiceImpl implements TaskService {
} }
Assert.isTrue(ObjectUtils.isEmpty(taskActors), "任务参与者不能为空"); Assert.isTrue(ObjectUtils.isEmpty(taskActors), "任务参与者不能为空");
task.setPerformType(performType.getValue()); task.setPerformType(performType);
if (performType == PerformType.orSign) { if (performType == PerformType.orSign) {
/** /**
* 或签一条任务多个参与者 * 或签一条任务多个参与者
@ -629,79 +629,40 @@ public class TaskServiceImpl implements TaskService {
* 向指定的任务ID添加参与者 * 向指定的任务ID添加参与者
* *
* @param taskId 任务ID * @param taskId 任务ID
* @param taskType 参与类型 {@link TaskType}
* @param taskActors 参与者列表 * @param taskActors 参与者列表
*/ */
@Override @Override
public boolean addTaskActor(Long taskId, TaskType taskType, List<TaskActor> taskActors) { public boolean addTaskActor(Long taskId, PerformType performType, List<TaskActor> taskActors) {
Task task = taskMapper.getCheckById(taskId); Task task = taskMapper.getCheckById(taskId);
if (!task.major() || ObjectUtils.isEmpty(taskActors)) { List<TaskActor> taskActorList = this.getTaskActorsByTaskId(taskId);
return false; Map<String, TaskActor> taskActorMap = taskActorList.stream().collect(Collectors.toMap(TaskActor::getActorId, t -> t));
} for (TaskActor taskActor : taskActors) {
if (taskType == null) { // 不存在的参与者
taskType = TaskType.get(task.getPerformType()); if (null == taskActorMap.get(taskActor.getActorId())) {
} this.assignTask(task.getInstanceId(), taskId, taskActor);
if (taskType == TaskType.major) {
/**
* 普通任务
*/
taskActors.forEach(t -> this.assignTask(task.getInstanceId(), task.getId(), t));
} else if (taskType == TaskType.countersign) {
/**
* 会签任务
*/
for (TaskActor taskActor : taskActors) {
Task newTask = task.cloneTask(taskActor);
taskMapper.insert(newTask);
this.assignTask(task.getInstanceId(), newTask.getId(), taskActor);
} }
} }
return true; // 更新任务参与类型
Task temp = new Task();
temp.setId(taskId);
temp.setPerformType(performType);
return taskMapper.updateById(temp) > 0;
}
private List<TaskActor> getTaskActorsByTaskId(Long taskId) {
List<TaskActor> taskActorList = taskActorMapper.selectList(Wrappers.<TaskActor>lambdaQuery().eq(TaskActor::getTaskId, taskId));
Assert.isTrue(ObjectUtils.isEmpty(taskActorList), "not found task actor");
return taskActorList;
} }
@Override @Override
public boolean removeTaskActor(Long taskId, List<String> actors) { public boolean removeTaskActor(Long taskId, List<String> actorIds) {
Task task = taskMapper.getCheckById(taskId); List<TaskActor> taskActorList = this.getTaskActorsByTaskId(taskId);
if (ObjectUtils.isEmpty(actors)) { Assert.isTrue(Objects.equals(actorIds.size(), taskActorList.size()), "cannot all be deleted");
return false;
} // 删除参与者表任务关联关系
if (task.major()) { taskActorMapper.delete(Wrappers.<TaskActor>lambdaQuery().eq(TaskActor::getTaskId, taskId).in(TaskActor::getActorId, actorIds));
Map<String, Object> taskData = task.variableMap(); return true;
String actorStr = (String) taskData.get(Task.KEY_ACTOR);
if (ObjectUtils.isNotEmpty(actorStr)) {
String[] actorArray = actorStr.split(",");
StringBuilder newActor = new StringBuilder(actorStr.length());
boolean isMatch;
for (String actor : actorArray) {
isMatch = false;
if (ObjectUtils.isEmpty(actor)) {
continue;
}
for (String removeActor : actors) {
if (actor.equals(removeActor)) {
isMatch = true;
break;
}
}
if (isMatch) {
continue;
}
newActor.append(actor).append(",");
}
if (newActor.length() > 0) {
newActor.deleteCharAt(newActor.length() - 1);
}
// 删除参与者表任务关联关系
taskActorMapper.delete(Wrappers.<TaskActor>lambdaQuery().eq(TaskActor::getTaskId, taskId).in(TaskActor::getActorId, actors));
// 更新任务参数 JSON 信息
Task temp = new Task();
temp.setId(taskId);
taskData.put(Task.KEY_ACTOR, newActor.toString());
temp.setVariable(taskData);
return taskMapper.updateById(temp) > 0;
}
}
return false;
} }
/** /**

View File

@ -18,6 +18,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import com.flowlong.bpm.engine.assist.Assert; import com.flowlong.bpm.engine.assist.Assert;
import com.flowlong.bpm.engine.assist.DateUtils; import com.flowlong.bpm.engine.assist.DateUtils;
import com.flowlong.bpm.engine.core.FlowLongContext; import com.flowlong.bpm.engine.core.FlowLongContext;
import com.flowlong.bpm.engine.core.enums.PerformType;
import com.flowlong.bpm.engine.core.enums.TaskType; import com.flowlong.bpm.engine.core.enums.TaskType;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -123,10 +124,19 @@ public class Task extends FlowEntity {
} }
public void setTaskType(Integer taskType) { public void setTaskType(Integer taskType) {
Assert.notNull(TaskType.get(taskType), "插入的任务类型异常 [taskType=" + taskType + "]"); Assert.notNull(TaskType.get(taskType), "illegal type [taskType=" + taskType + "]");
this.taskType = taskType; this.taskType = taskType;
} }
public void setPerformType(PerformType performType) {
this.performType = performType.getValue();
}
public void setPerformType(Integer performType) {
Assert.notNull(PerformType.get(performType), "illegal type [performType=" + taskType + "]");
this.performType = performType;
}
public void setVariable(Map<String, Object> args) { public void setVariable(Map<String, Object> args) {
this.variable = FlowLongContext.JSON_HANDLER.toJson(args); this.variable = FlowLongContext.JSON_HANDLER.toJson(args);
} }