This commit is contained in:
那些花儿
2025-08-29 08:59:48 +08:00
parent 48cc8a448c
commit a408793a33
62 changed files with 15910 additions and 14042 deletions
@@ -65,6 +65,10 @@ public interface FlowConst {
String NR_OF_INSTANCES = "nrOfInstances";
// 会签已完成实例数
String NR_OF_COMPLETED_INSTANCES = "nrOfCompletedInstances";
// 会签已完成并且已通过实例数
String NR_OF_COMPLETED_AGREE_INSTANCES = "nrOfCompletedAgreeInstances";
// 会签操作人列表
String COUNTERSIGN_OPERATOR_LIST = "operatorList";
// 会签类型 PARALLEL表示并行会签,SEQUENTIAL表示串行会签
@@ -106,4 +110,5 @@ public interface FlowConst {
String PROCESS_INSTANCE_NAME = "instanceName";
}
@@ -15,52 +15,63 @@ import java.util.stream.Collectors;
/**
* 会签任务处理,用于判断会签任务是否可通过
*
* @author mldong
* @date 2023/11/24
*/
public class CountersignHandler implements IHandler {
private TaskModel taskModel;
public CountersignHandler(TaskModel taskModel) {
this.taskModel = taskModel;
}
@Override
public void handle(Execution execution) {
boolean isMerged = false;
String countersignType = taskModel.getExt().get("countersignType","PARALLEL");
String countersignCompletionCondition = taskModel.getExt().get("countersignCompletionCondition","");
String countersignType = taskModel.getExt().get("countersignType", "PARALLEL");
String countersignCompletionCondition = taskModel.getExt().get("countersignCompletionCondition", "");
countersignCompletionCondition = taskModel.getCountersignCompletionCondition();
String prefix = FlowConst.COUNTERSIGN_VARIABLE_PREFIX +taskModel.getName()+"_";
String prefix = FlowConst.COUNTERSIGN_VARIABLE_PREFIX + taskModel.getName() + "_";
// 会签办理人列表
List<String> operatorList = Convert.toList(String.class,execution.getArgs().get(prefix+FlowConst.COUNTERSIGN_OPERATOR_LIST));
List<String> operatorList = Convert.toList(String.class, execution.getArgs().get(prefix + FlowConst.COUNTERSIGN_OPERATOR_LIST));
// 循环计数器,办理人在列表中的索引
int loopCounter = operatorList.indexOf(execution.getOperator());
// 追加计数器
execution.getArgs().put(prefix+FlowConst.LOOP_COUNTER,loopCounter);
execution.getArgs().put(prefix + FlowConst.LOOP_COUNTER, loopCounter);
// 追加已完成数量
execution.getArgs().put(prefix + FlowConst.NR_OF_COMPLETED_INSTANCES,
execution.getArgs().get(prefix + FlowConst.NR_OF_COMPLETED_INSTANCES,0)+1);
execution.getArgs().get(prefix + FlowConst.NR_OF_COMPLETED_INSTANCES, 0) + 1);
// 追加已完成并且同意数量
if (!execution.getArgs().containsKey(FlowConst.COUNTERSIGN_DISAGREE_FLAG)) {
execution.getArgs().put(prefix + FlowConst.NR_OF_COMPLETED_AGREE_INSTANCES,
execution.getArgs().get(prefix + FlowConst.NR_OF_COMPLETED_AGREE_INSTANCES, 0) + 1);
}
/**
*
* ● 全部通过:为空
* ● 按数量通过:#nrOfCompletedInstances==n,这里表示n人完成任务,会签结束。
* ● 按比例通过:#nrOfCompletedInstances/nrOfInstances==n,这里表示已完成会签数与总实例数达到一定比例时,会签结束
* ● 一票通过:#nrOfCompletedInstances==1,这里表示1人完成任务,会签结束。
* ● 一票否决:ONE_VOTE_VETO
*/
if("ONE_VOTE_VETO".equalsIgnoreCase(countersignCompletionCondition)) {
if ("ONE_VOTE_VETO".equalsIgnoreCase(countersignCompletionCondition)) {
// 一票否决
if(execution.getArgs().containsKey(FlowConst.COUNTERSIGN_DISAGREE_FLAG)) {
if (execution.getArgs().containsKey(FlowConst.COUNTERSIGN_DISAGREE_FLAG)) {
// 存在拒绝标识,则直接通过
isMerged = true;
}
} else if(!StrUtil.isBlank(countersignCompletionCondition)) {
} else if (!StrUtil.isBlank(countersignCompletionCondition)) {
// 根据条件判断是否通过
Dict dict = Dict.create();
execution.getArgs().forEach((k,v)->{
dict.set(k.replace(prefix,""),v);
execution.getArgs().forEach((k, v) -> {
dict.set(k.replace(prefix, ""), v);
});
isMerged = Convert.toBool(ExpressionUtil.eval(countersignCompletionCondition, dict));
}
if(!isMerged && CountersignTypeEnum.SEQUENTIAL.toString().equalsIgnoreCase(countersignType)) {
if (!isMerged && CountersignTypeEnum.SEQUENTIAL.toString().equalsIgnoreCase(countersignType)) {
// 串行未通过,则判断是否为最后一个
if (loopCounter == operatorList.size() - 1) {
isMerged = true;
@@ -69,27 +80,28 @@ public class CountersignHandler implements IHandler {
execution.getEngine().processTaskService().createCountersignTask(taskModel, execution);
}
}
if(!isMerged && CountersignTypeEnum.PARALLEL.toString().equalsIgnoreCase(countersignType)) {
if (!isMerged && CountersignTypeEnum.PARALLEL.toString().equalsIgnoreCase(countersignType)) {
// 是否所有会签任务已完成
isMerged = execution.getEngine().processTaskService().getDoingTaskList(execution.getProcessInstanceId(), new String[]{taskModel.getName()}).size()==0;
if(!isMerged) {
isMerged = execution.getEngine().processTaskService().getDoingTaskList(execution.getProcessInstanceId(), new String[]{taskModel.getName()}).size() == 0;
if (!isMerged) {
// 未通过,更新已完成实例数量
Dict addVariable = Dict.create();
addVariable.put(prefix + FlowConst.NR_OF_COMPLETED_INSTANCES, execution.getArgs().get(prefix+FlowConst.NR_OF_COMPLETED_INSTANCES));
addVariable.put(prefix + FlowConst.NR_OF_COMPLETED_INSTANCES, execution.getArgs().get(prefix + FlowConst.NR_OF_COMPLETED_INSTANCES));
addVariable.put(prefix + FlowConst.NR_OF_COMPLETED_AGREE_INSTANCES, execution.getArgs().get(prefix + FlowConst.NR_OF_COMPLETED_AGREE_INSTANCES));
execution.getEngine().processInstanceService().addVariable(execution.getProcessInstanceId(), addVariable);
}
}
if(isMerged) {
if (isMerged) {
// 获取所有会签参数键值
List<String> keys = execution.getArgs().keySet().stream().filter(k->k.startsWith(prefix)).collect(Collectors.toList());
List<String> keys = execution.getArgs().keySet().stream().filter(k -> k.startsWith(prefix)).collect(Collectors.toList());
keys.add(FlowConst.COUNTERSIGN_DISAGREE_FLAG);
// 如果可以合并,则把流程实例中的会签参数清空
execution.getEngine().processInstanceService().removeVariable(
execution.getProcessInstanceId(),
keys.toArray(new String[]{}));
// 如果为并行会签,需将其他会签任务设置为废弃
if(CountersignTypeEnum.PARALLEL.toString().equalsIgnoreCase(countersignType)) {
execution.getEngine().processTaskService().getDoingTaskList(execution.getProcessInstanceId(), new String[]{taskModel.getName()}).stream().forEach(t->{
if (CountersignTypeEnum.PARALLEL.toString().equalsIgnoreCase(countersignType)) {
execution.getEngine().processTaskService().getDoingTaskList(execution.getProcessInstanceId(), new String[]{taskModel.getName()}).stream().forEach(t -> {
execution.getEngine().processTaskService().abandonProcessTask(t.getId(), FlowConst.AUTO_ID, execution.getArgs());
});
}
@@ -42,6 +42,10 @@ public class ProcessTaskActor extends BaseModel {
@Column
private String actorName;
@Comment("参与者单位ID")
@Column
private String actorUnitId;
@Comment("参与者单位")
@Column
private String actorUnitName;
@@ -36,18 +36,14 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
*/
boolean update(ProcessTask param);
/**
* 自定义分页查询流程任务
* @param param
* @return
*/
// CommonPage<ProcessTaskVO> page(ProcessTaskPageParam param);
/**
* 通过id查询
* @param id
* @return
*/
ProcessTaskVO findById(Long id);
/**
* 保存流程任务
* @param processTask
@@ -67,6 +63,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
* @return
*/
List<ProcessTask> getDoingTaskList(Long processInstanceId, String[] taskNames);
/**
* 根据流程实例ID获取已完成的任务
* @param processInstanceId 流程实例ID
@@ -74,6 +71,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
* @return
*/
List<ProcessTask> getDoneTaskList(Long processInstanceId, String[] taskNames);
/**
* 将流程任务修改为已完成
* @param processTaskId
@@ -104,12 +102,14 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
* @return
*/
ProcessTask getById(Long id);
/**
* 向指定的任务id添加参与者
* @param processTaskId 任务id
* @param actors 参与者
*/
void addTaskActor(Long processTaskId, List<String> actors);
/**
* 向指定的任务id添加参与者
* @param processTaskId 流程任务id
@@ -137,18 +137,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
* @return
*/
List<String> getTaskActors(Long processTaskId);
/**
* 查询待办列表
* @param param
* @return
*/
// CommonPage<ProcessTaskVO> todoList(ProcessTaskPageParam param);
/**
* 查询已办列表
* @param param
* @return
*/
// CommonPage<ProcessTaskVO> doneList(ProcessTaskPageParam param);
/**
* 根据当前任务对象驳回至上一步处理
* @param model 流程定义模型,用以获取上一步模型对象
@@ -164,12 +153,6 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
*/
List<LabelValueVO> jumpAbleTaskNameList(Long processInstanceId);
/**
* 分页查询获取候选人
* @param query
* @return
*/
// CommonPage<Map<String,Object>> candidatePage(Dict query);
/**
* 创建会签任务
* @param taskModel
@@ -177,6 +160,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
* @return
*/
List<ProcessTask> createCountersignTask(TaskModel taskModel, Execution execution);
/**
* 根据执行对象、自定义节点模型创建历史任务记录
* @param execution 执行对象
@@ -211,7 +211,7 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl<ProcessTask> impleme
if (CollectionUtil.isEmpty(actors)) return;
List<String> dbActors = getTaskActors(processTaskId);
List<String> newActors = actors.stream().filter(actor -> !dbActors.contains(actor)).toList();
Sql sql = Sqls.create("select id,username,loginname,unitname from vw_user where id in (@ids)");
Sql sql = Sqls.create("select id,username,loginname,unitName from vw_user where id in (@ids)");
sql.setParam("ids", newActors);
List<NutMap> list = listMap(sql);
@@ -221,7 +221,7 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl<ProcessTask> impleme
processTaskActor.setActorId(actor.getString("id"));
processTaskActor.setActorName(actor.getString("username"));
processTaskActor.setActorAccount(actor.getString("loginname"));
processTaskActor.setActorUnitName(actor.getString("unitname"));
processTaskActor.setActorUnitName(actor.getString("unitName"));
processTaskActor.setCreatedAt(System.currentTimeMillis());
System.out.println(StrUtil.format("给任务:{},添加参与者:{}", processTaskId, actor.toString()));
insert(processTaskActor);