优化完成 加签、减签、认领 支持
This commit is contained in:
parent
e366512794
commit
72b112bcf2
@ -27,9 +27,9 @@ FlowLong🐉飞龙工作流
|
||||
| 跳转 | 可以将当前流程实例跳转到任意办理节点 | ✅ |
|
||||
| 拿回 | 在当前办理人尚未处理文件前,允许上一节点提交人员执行拿回 | ✅ |
|
||||
| 撤销 | 流程发起者可以对流程进行撤销处理 | ✅ |
|
||||
| 加签 | 允许当前办理人根据需要自行增加当前办理节点的办理人员 | 🔘 |
|
||||
| 减签 | 在当前办理人操作之前减少办理人 | 🔘 |
|
||||
| 认领 | 公共任务认领 | 🔘 |
|
||||
| 加签 | 允许当前办理人根据需要自行增加当前办理节点的办理人员 | ✅ |
|
||||
| 减签 | 在当前办理人操作之前减少办理人 | ✅ |
|
||||
| 认领 | 公共任务认领 | ✅ |
|
||||
| 已阅 | 任务是否查看状态显示 | ✅ |
|
||||
| 催办 | 通知当前活动任务处理人办理任务 | ✅ |
|
||||
| 沟通 | 与当前活动任务处理人沟通 | ✅ |
|
||||
|
@ -16,6 +16,7 @@ package com.flowlong.bpm.engine;
|
||||
|
||||
import com.flowlong.bpm.engine.core.Execution;
|
||||
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.entity.Task;
|
||||
import com.flowlong.bpm.engine.entity.TaskActor;
|
||||
@ -213,26 +214,26 @@ public interface TaskService {
|
||||
/**
|
||||
* 向指定的任务ID添加参与者【加签】
|
||||
*
|
||||
* @param taskId 任务ID
|
||||
* @param taskType 参与类型 {@link TaskType}
|
||||
* @param taskActors 参与者列表
|
||||
* @param taskId 任务ID
|
||||
* @param performType 参与类型 {@link PerformType}
|
||||
* @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) {
|
||||
return this.addTaskActor(taskId, taskType, Arrays.asList(taskActor));
|
||||
default boolean addTaskActor(Long taskId, PerformType performType, TaskActor taskActor) {
|
||||
return this.addTaskActor(taskId, performType, Arrays.asList(taskActor));
|
||||
}
|
||||
|
||||
/**
|
||||
* 对指定的任务ID删除参与者【减签】
|
||||
*
|
||||
* @param taskId 任务ID
|
||||
* @param actors 参与者
|
||||
* @param taskId 任务ID
|
||||
* @param actorIds 参与者ID列表
|
||||
*/
|
||||
boolean removeTaskActor(Long taskId, List<String> actors);
|
||||
boolean removeTaskActor(Long taskId, List<String> actorIds);
|
||||
|
||||
default boolean removeTaskActor(Long taskId, String actor) {
|
||||
return removeTaskActor(taskId, Arrays.asList(actor));
|
||||
default boolean removeTaskActor(Long taskId, String actorId) {
|
||||
return removeTaskActor(taskId, Arrays.asList(actorId));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -523,7 +523,7 @@ public class TaskServiceImpl implements TaskService {
|
||||
}
|
||||
|
||||
Assert.isTrue(ObjectUtils.isEmpty(taskActors), "任务参与者不能为空");
|
||||
task.setPerformType(performType.getValue());
|
||||
task.setPerformType(performType);
|
||||
if (performType == PerformType.orSign) {
|
||||
/**
|
||||
* 或签一条任务多个参与者
|
||||
@ -629,79 +629,40 @@ public class TaskServiceImpl implements TaskService {
|
||||
* 向指定的任务ID添加参与者
|
||||
*
|
||||
* @param taskId 任务ID
|
||||
* @param taskType 参与类型 {@link TaskType}
|
||||
* @param taskActors 参与者列表
|
||||
*/
|
||||
@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);
|
||||
if (!task.major() || ObjectUtils.isEmpty(taskActors)) {
|
||||
return false;
|
||||
}
|
||||
if (taskType == null) {
|
||||
taskType = TaskType.get(task.getPerformType());
|
||||
}
|
||||
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);
|
||||
List<TaskActor> taskActorList = this.getTaskActorsByTaskId(taskId);
|
||||
Map<String, TaskActor> taskActorMap = taskActorList.stream().collect(Collectors.toMap(TaskActor::getActorId, t -> t));
|
||||
for (TaskActor taskActor : taskActors) {
|
||||
// 不存在的参与者
|
||||
if (null == taskActorMap.get(taskActor.getActorId())) {
|
||||
this.assignTask(task.getInstanceId(), taskId, 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
|
||||
public boolean removeTaskActor(Long taskId, List<String> actors) {
|
||||
Task task = taskMapper.getCheckById(taskId);
|
||||
if (ObjectUtils.isEmpty(actors)) {
|
||||
return false;
|
||||
}
|
||||
if (task.major()) {
|
||||
Map<String, Object> taskData = task.variableMap();
|
||||
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;
|
||||
public boolean removeTaskActor(Long taskId, List<String> actorIds) {
|
||||
List<TaskActor> taskActorList = this.getTaskActorsByTaskId(taskId);
|
||||
Assert.isTrue(Objects.equals(actorIds.size(), taskActorList.size()), "cannot all be deleted");
|
||||
|
||||
// 删除参与者表,任务关联关系
|
||||
taskActorMapper.delete(Wrappers.<TaskActor>lambdaQuery().eq(TaskActor::getTaskId, taskId).in(TaskActor::getActorId, actorIds));
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -18,6 +18,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.flowlong.bpm.engine.assist.Assert;
|
||||
import com.flowlong.bpm.engine.assist.DateUtils;
|
||||
import com.flowlong.bpm.engine.core.FlowLongContext;
|
||||
import com.flowlong.bpm.engine.core.enums.PerformType;
|
||||
import com.flowlong.bpm.engine.core.enums.TaskType;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
@ -123,10 +124,19 @@ public class Task extends FlowEntity {
|
||||
}
|
||||
|
||||
public void setTaskType(Integer taskType) {
|
||||
Assert.notNull(TaskType.get(taskType), "插入的任务类型异常 [taskType=" + taskType + "]");
|
||||
Assert.notNull(TaskType.get(taskType), "illegal type [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) {
|
||||
this.variable = FlowLongContext.JSON_HANDLER.toJson(args);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user