This commit is contained in:
那些花儿
2025-07-29 14:25:33 +08:00
parent 72546696fa
commit 9d8002ec93
40 changed files with 1410 additions and 13555 deletions
@@ -5,9 +5,12 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.vo.LabelValueVO;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.engine.model.ProcessModel;
import com.budwk.app.flow.engine.model.TaskModel;
import com.budwk.app.flow.entity.Candidate;
import com.budwk.app.flow.entity.ProcessDefine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
@@ -27,9 +30,7 @@ import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.*;
@IocBean
@At("/flow/common")
@@ -163,6 +164,14 @@ public class FlowCommonController {
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("撤回流程实例")
public Result withdrawInstance(@Param("instanceId") Long instanceId) {
flowEngine.processInstanceService().withdraw(instanceId, SecurityUtil.getUserId());
return Result.success();
}
@At("/executeTask")
@SaCheckLogin
@@ -177,6 +186,14 @@ public class FlowCommonController {
submitType = ProcessSubmitTypeEnum.AGREE.getCode();
}
args.put(FlowConst.SUBMIT_TYPE, submitType);
// 设置办理人信息到表单参数
args.put(FlowConst.TASK_FORM_DATA_PREFIX + "userName", SecurityUtil.getUserUsername());
args.put(FlowConst.TASK_FORM_DATA_PREFIX + "loginName", SecurityUtil.getUserLoginname());
args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unitId", SecurityUtil.getUnitId());
args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unitName", SecurityUtil.getUnitId());
args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unionId", SecurityUtil.getUnionId());
if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK.getCode())) {
// 退回上一个节点
flowEngine.executeAndJumpTask(processTaskId, operator, args, null);
@@ -201,4 +218,35 @@ public class FlowCommonController {
return Result.success();
}
@At("/candidate")
@SaCheckLogin
@ApiOperation("获取候选用户")
public Result candidate(@Param("taskId") Long taskId) {
ProcessTask task = flowEngine.processTaskService().fetch(taskId);
ProcessInstance instance = flowEngine.processInstanceService().fetch(task.getProcessInstanceId());
ProcessModel processModel = flowEngine.processDefineService().getProcessModel(instance.getProcessDefineId());
// 是否存在候选处理
List<TaskModel> nextTaskModels = processModel.getNextTaskModels(task.getTaskName());
boolean b = nextTaskModels.stream().anyMatch(item -> item.getCandidateHandler() != null);
List<Candidate> candidates = processModel.getNextTaskModelCandidates(task.getTaskName());
return Result.success(Map.of("candidates", candidates, "support", b));
}
@At("/jumpTaskNames")
@SaCheckLogin
@ApiOperation("获取可跳转的任务节点")
public Result jumpAbleTaskNames(@Param("instanceId") Long instanceId) {
List<LabelValueVO> vos = flowEngine.processTaskService().jumpAbleTaskNameList(instanceId);
return Result.success(vos);
}
@At("/surrogate")
@SaCheckLogin
@ApiOperation("代理")
public Result surrogate(@Param("taskId") Long taskId, @Param("actorIds") String[] actorIds) {
flowEngine.processTaskService().addTaskActor(taskId, Arrays.asList(actorIds));
return Result.success();
}
}
@@ -4,11 +4,10 @@ import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.hutool.core.lang.ClassScanner;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.AssignmentHandler;
import com.budwk.app.flow.engine.CandidateHandler;
import com.budwk.app.flow.entity.ProcessDesign;
import com.budwk.app.flow.service.ProcessDesignService;
import com.budwk.app.sys.services.SysUserService;
@@ -47,6 +46,8 @@ public class FlowDesignController {
// 获取所有任务参与者处理类
public static final List<JSONObject> ASSIGMENT_HANDLER_LIST;
// 获取所有候选用户处理类
public static final List<JSONObject> CANDIDATE_HANDLER_LIST;
static {
Set<Class<?>> classes = ClassScanner.scanPackageBySuper("com.budwk.app", AssignmentHandler.class);
@@ -68,6 +69,26 @@ public class FlowDesignController {
ASSIGMENT_HANDLER_LIST = Collections.unmodifiableList(list);
}
static {
Set<Class<?>> classes = ClassScanner.scanPackageBySuper("com.budwk.app", CandidateHandler.class);
ArrayList<JSONObject> list = new ArrayList<>(classes.size());
for (Class<?> aClass : classes) {
try {
CandidateHandler handler = (CandidateHandler) ReflectUtil.newInstance(aClass);
JSONObject jsonObject = new JSONObject();
jsonObject.set("value", handler.getClass().getName());
jsonObject.set("order", handler.getOrder());
jsonObject.set("name", handler.getMessage());
list.add(jsonObject);
} catch (Exception e) {
log.error("初始化CandidateHandler失败: {}", aClass.getName());
}
}
// 排序 按order
list.sort(Comparator.comparingInt(o -> o.getInt("order")));
CANDIDATE_HANDLER_LIST = Collections.unmodifiableList(list);
}
@At("")
@Ok("beetl:/platform/flow/design/index.html")
@@ -101,6 +122,8 @@ public class FlowDesignController {
jsonObject.set("category", processDesign.getCategory());
jsonObject.set("instanceUrl", processDesign.getInstanceUrl());
jsonObject.set("h5InstanceUrl", processDesign.getH5InstanceUrl());
jsonObject.set("instanceViewUrl",processDesign.getInstanceViewUrl());
jsonObject.set("h5InstanceViewUrl",processDesign.getH5InstanceViewUrl());
processDesign.setContent(jsonObject);
dao.insert(processDesign);
return Result.success();
@@ -116,6 +139,8 @@ public class FlowDesignController {
jsonObject.set("category", processDesign.getCategory());
jsonObject.set("instanceUrl", processDesign.getInstanceUrl());
jsonObject.set("h5InstanceUrl", processDesign.getH5InstanceUrl());
jsonObject.set("instanceViewUrl",processDesign.getInstanceViewUrl());
jsonObject.set("h5InstanceViewUrl",processDesign.getH5InstanceViewUrl());
processDesign.setContent(jsonObject);
processDesignService.update(processDesign);
return Result.success();
@@ -125,6 +150,15 @@ public class FlowDesignController {
@SaCheckLogin
@ApiOperation("修改流程设计")
public Result updateContent(@Param("design") ProcessDesign processDesign) {
JSONObject jsonObject = processDesign.getContent();
jsonObject.set("name", processDesign.getName());
jsonObject.set("displayName", processDesign.getDisplayName());
jsonObject.set("category", processDesign.getCategory());
jsonObject.set("instanceUrl", processDesign.getInstanceUrl());
jsonObject.set("h5InstanceUrl", processDesign.getH5InstanceUrl());
jsonObject.set("instanceViewUrl",processDesign.getInstanceViewUrl());
jsonObject.set("h5InstanceViewUrl",processDesign.getH5InstanceViewUrl());
processDesign.setContent(jsonObject);
processDesignService.update(processDesign);
return Result.success();
}
@@ -160,9 +194,17 @@ public class FlowDesignController {
@ApiOperation("获取流程设计任务参与者处理类")
public Result assigmentHandlerClass() {
return Result.success(ASSIGMENT_HANDLER_LIST);
}
@At
@SaCheckLogin
@ApiOperation("获取流程设计任务参与者处理类")
public Result candidateHandlerClass() {
return Result.success(CANDIDATE_HANDLER_LIST);
}
@At
@SaCheckLogin
@ApiOperation("获取流程设计任务参与者分页数据")