优化完成 加签、减签、认领 支持
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.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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user