This commit is contained in:
那些花儿
2025-07-30 15:19:03 +08:00
parent 65b7960783
commit 73974dbdd3
32 changed files with 1403 additions and 388 deletions
@@ -0,0 +1,32 @@
package com.budwk.app.flow.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.entity.ProcessCategory;
import io.swagger.annotations.Api;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
@IocBean
@At("/flow/category")
@Ok("json:full")
@Api("流程分类")
public class FlowCategoryController {
@Inject
private Dao dao;
@At
@SaCheckLogin
public Result list() {
List<ProcessCategory> list = dao.query(ProcessCategory.class, Cnd.NEW());
return Result.success(list);
}
}
@@ -4,16 +4,20 @@ import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
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.event.ProcessEvent;
import com.budwk.app.flow.engine.event.ProcessPublisher;
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;
import com.budwk.app.flow.enums.ProcessEventTypeEnum;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.flow.vo.ProcessInstanceVO;
@@ -66,17 +70,9 @@ public class FlowCommonController {
todoTaskVos.add(taskVO);
}
// List<ProcessTaskVO> doneTaskVos = new ArrayList<>();
// List<ProcessTask> doneTaskList = flowEngine.processTaskService().getDoneTaskList(instanceId, null);
// for (ProcessTask doneTask : doneTaskList) {
// ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId());
// doneTaskVos.add(taskVO);
// }
HashMap<String, Object> result = new HashMap<>();
result.put("processInstance", instanceVO);
result.put("todoTasks", todoTaskVos);
// result.put("doneTasks", doneTaskVos);
return Result.success(result);
}
@@ -105,12 +101,20 @@ public class FlowCommonController {
@At("/defineInfo")
@SaCheckLogin
@ApiOperation("流程定义详情")
public Result defineInfo(String defineKey) {
// 通过defineKey获取最新的流程定义
ProcessDefine define = flowEngine.processDefineService().getLastByName(defineKey);
if (define == null) {
return Result.error("未找到指定的流程定义");
public Result defineInfo(String defineKey, Long instanceId) {
ProcessDefine define = null;
if (StrUtil.isNotBlank(defineKey)) {
define = flowEngine.processDefineService().getLastByName(defineKey);
}
if (instanceId != null) {
ProcessInstance instance = dao.fetch(ProcessInstance.class, instanceId);
define = flowEngine.processDefineService().getById(instanceId);
}
if (define == null) {
return Result.error("没有流程定义");
}
return Result.success(define);
}
@@ -170,9 +174,34 @@ public class FlowCommonController {
@At
@SaCheckLogin
@ApiOperation("撤回流程实例")
public Result withdrawInstance(@Param("instanceId") Long instanceId) {
flowEngine.processInstanceService().withdraw(instanceId, SecurityUtil.getUserId());
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("重新发起流程实例")
public Result reissueInstance(@Param("instanceId") Long instanceId, @Param("bizData") String bizData) {
// // 把已撤销流程修改为进行中
// dao.update(ProcessInstance.class, Chain.make("state", ProcessInstanceStateEnum.DOING.getCode()), Cnd.where(ProcessInstance::getId, "=", instanceId));
// Dict args = Dict.create();
// args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
// args.set(FlowConst.FORM_DATA, bizData);
//
// // 查找第一个提交任务节点
// ProcessInstance instance = dao.fetch(ProcessInstance.class, instanceId);
// ProcessModel processModel = flowEngine.processDefineService().getProcessModel(instance.getProcessDefineId());
//
// args.set(FlowConst.PROCESS_INSTANCE_ID_KEY, instanceId);
// args.set(FlowConst.INITIATOR,instance.getCreatedBy());
//
// // 构建执行参数对象
// Execution execution = new Execution();
// execution.setProcessModel(processModel);
// execution.setProcessInstance(instance);
// execution.setProcessInstanceId(instance.getId());
// execution.setEngine(flowEngine);
// execution.setArgs(args);
// execution.setOperator(SecurityUtil.getUserId());
// // 拿到开始节点模型,调用其execute方法
// processModel.getStart().execute(execution);
//
// return Result.success();
return Result.success();
}
@@ -215,6 +244,10 @@ public class FlowCommonController {
// 会签不同意,追加不同意标识
args.put(FlowConst.COUNTERSIGN_DISAGREE_FLAG, 1);
flowEngine.executeProcessTask(processTaskId, operator, args);
} else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.RE_APPLY.getCode())) {
// 重新提交
// args.put(FlowConst.FORM_DATA, args.getStr(FlowConst.FORM_DATA));
flowEngine.executeProcessTask(processTaskId, operator, args);
} else {
// 默认执行
flowEngine.executeProcessTask(processTaskId, operator, args);
@@ -222,6 +255,32 @@ public class FlowCommonController {
return Result.success();
}
@At
@SaCheckLogin
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("撤销任务")
public Result revokeTask(@Param("taskId") Long taskId) {
// 1.撤销任务
List<ProcessTask> taskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getTaskParentId, "=", taskId));
for (ProcessTask processTask : taskList) {
processTask.setTaskState(ProcessTaskStateEnum.WITHDRAW.getCode());
dao.update(processTask);
}
// 2.再次激活自己任务
ProcessTask processTask = dao.fetch(ProcessTask.class, taskId);
processTask.setTaskState(ProcessTaskStateEnum.DOING.getCode());
dao.update(processTask);
// 3.发送任务撤回事件 确保上面执行成功
for (ProcessTask task : taskList) {
ProcessPublisher.notify(ProcessEvent.builder().eventType(ProcessEventTypeEnum.PROCESS_TASK_REVOKE).sourceId(task.getId()).build());
}
return Result.success();
}
@At("/candidate")
@SaCheckLogin
@ApiOperation("获取候选用户")
@@ -252,5 +311,13 @@ public class FlowCommonController {
return Result.success();
}
@At("/addCandidate")
@SaCheckLogin
@ApiOperation("代理")
public Result addCandidate(@Param("taskId") Long taskId, @Param("actorIds") String[] actorIds) {
flowEngine.processTaskService().addCandidateActor(taskId, Arrays.asList(actorIds));
return Result.success();
}
}
@@ -122,8 +122,9 @@ 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());
jsonObject.set("instanceViewUrl", processDesign.getInstanceViewUrl());
jsonObject.set("h5InstanceViewUrl", processDesign.getH5InstanceViewUrl());
jsonObject.set("icon", processDesign.getIcon());
processDesign.setContent(jsonObject);
dao.insert(processDesign);
return Result.success();
@@ -139,8 +140,9 @@ 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());
jsonObject.set("instanceViewUrl", processDesign.getInstanceViewUrl());
jsonObject.set("h5InstanceViewUrl", processDesign.getH5InstanceViewUrl());
jsonObject.set("icon", processDesign.getIcon());
processDesign.setContent(jsonObject);
processDesignService.update(processDesign);
return Result.success();
@@ -156,8 +158,9 @@ 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());
jsonObject.set("instanceViewUrl", processDesign.getInstanceViewUrl());
jsonObject.set("h5InstanceViewUrl", processDesign.getH5InstanceViewUrl());
jsonObject.set("icon", processDesign.getIcon());
processDesign.setContent(jsonObject);
processDesignService.update(processDesign);
return Result.success();
@@ -43,14 +43,16 @@ public class FlowTodoCenter {
public Result todo(Integer pageNumber, Integer pageSize, String keyword, String categoty) {
Sql sql = Sqls.create("""
SELECT
t.id,
t.id AS taskId,
t.displayName AS taskName,
t.taskState,
t.formKey,
t.createdAt,
t.finishTime,
t.variable,
ins.state AS instanceState
ins.state AS instanceState,
ins.id AS instanceId,
ins.businessNo
FROM
wf_process_task t
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
@@ -76,12 +78,16 @@ public class FlowTodoCenter {
public Result done(Integer pageNumber, Integer pageSize, String keyword, String categoty) {
Sql sql = Sqls.create("""
SELECT
t.id,
t.id AS taskId,
t.displayName AS taskName,
t.taskState,
t.formKey,
t.createdAt,
t.finishTime,
ins.state AS instanceState
t.variable,
ins.state AS instanceState,
ins.id AS instanceId,
ins.businessNo
FROM
wf_process_task t
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
@@ -107,14 +113,14 @@ public class FlowTodoCenter {
public Result started(Integer pageNumber, Integer pageSize, String keyword, String categoty) {
Sql sql = Sqls.create("""
SELECT
ins.id,
ins.id AS instanceId,
ins.processDefineId,
ins.state,
ins.businessNo,
ins.operator,
ins.variable,
ins.createdAt,
GROUP_CONCAT(t.displayName) as taskName
GROUP_CONCAT(DISTINCT t.displayName) as taskName
FROM
wf_process_instance ins
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id and t.taskState = 10