This commit is contained in:
那些花儿
2025-07-28 10:48:38 +08:00
parent 030cf7cc4c
commit 3b51ed7a51
450 changed files with 82310 additions and 1213 deletions
@@ -0,0 +1,204 @@
package com.budwk.app.flow.controller;
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 com.budwk.app.base.result.Result;
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.entity.ProcessDefine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.flow.vo.ProcessInstanceVO;
import com.budwk.app.flow.vo.ProcessTaskVO;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.json.Json;
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;
@IocBean
@At("/flow/common")
@Api("流程通用")
@Ok("json:full")
public class FlowCommonController {
@Inject
private FlowEngine flowEngine;
@Inject
private Dao dao;
@At("/approval/form")
@SaCheckLogin
@Ok("beetl:/platform/flow/common/approval/form.html")
public void approval(Long taskId, Long instanceId, String businessId) {
}
@At("/instanceInfo")
@SaCheckLogin
@ApiOperation("流程信息")
public Result info(Long instanceId) {
// 流程实例信息
ProcessInstanceVO instanceVO = flowEngine.processInstanceService().findById(instanceId);
// 当前办理环节 可能会有并行网关
List<ProcessTaskVO> todoTaskVos = new ArrayList<>();
List<ProcessTask> todoTasks = flowEngine.processTaskService().getDoingTaskList(instanceId, null);
for (ProcessTask todoTask : todoTasks) {
ProcessTaskVO taskVO = flowEngine.processTaskService().findById(todoTask.getId());
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);
}
@At
@SaCheckLogin
@ApiOperation("已办任务")
public Result doneTasks(Long instanceId) {
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);
}
return Result.success().addData(doneTaskVos);
}
@At("/taskInfo")
@SaCheckLogin
@ApiOperation("任务详情")
public Result taskInfo(Long taskId) {
ProcessTaskVO currentTask = flowEngine.processTaskService().findById(taskId);
return Result.success(currentTask);
}
@At("/defineInfo")
@SaCheckLogin
@ApiOperation("流程定义详情")
public Result defineInfo(String defineKey) {
// 通过defineKey获取最新的流程定义
ProcessDefine define = flowEngine.processDefineService().getLastByName(defineKey);
if (define == null) {
return Result.error("未找到指定的流程定义");
}
return Result.success(define);
}
@At("/instanceUrl")
@SaCheckLogin
@ApiOperation("获取流程定义的第一个任务节点")
public Result firstTaskNode(Long processDefineId) {
ProcessModel processModel = flowEngine.processDefineService().getProcessModel(processDefineId);
return Result.success().addData(processModel.getInstanceUrl());
}
@At("/approvalRecord")
@SaCheckLogin
@ApiOperation("获取流程定义的审批记录")
public Result approvalRecord(Long instanceId) {
List<ProcessTask> processTaskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", instanceId)
.and(ProcessTask::getTaskState, "not in", List.of(ProcessTaskStateEnum.DOING, ProcessTaskStateEnum.WITHDRAW, ProcessTaskStateEnum.ABANDON))
.asc(ProcessTask::getUpdatedAt));
List<ProcessTaskVO> res = new ArrayList<>();
processTaskList.forEach(processTask -> {
ProcessTaskVO vo = BeanUtil.toBean(processTask, ProcessTaskVO.class);
res.add(vo);
});
return Result.success(res);
}
@At
@SaCheckLogin
@ApiOperation("启动流程实例并自动完成")
public Result startInstanceAndExecute(@Param("defineKey") String defineKey, @Param("bizData") String bizData, @Param("submitType") Integer submitType) {
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, submitType);
args.set(FlowConst.FORM_DATA, bizData);
ProcessInstance instance = flowEngine.startProcessInstanceByKey(defineKey, null, SecurityUtil.getUserId(), args);
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("启动流程实例并自动完成")
public Result startInstance(@Param("defineKey") String defineKey, @Param("bizData") String bizData, @Param("submitType") Integer submitType) {
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, submitType);
args.set(FlowConst.FORM_DATA, bizData);
flowEngine.startProcessInstanceByKey(defineKey, null, SecurityUtil.getUserId(), args);
return Result.success();
}
@At("/executeTask")
@SaCheckLogin
@ApiOperation("执行任务")
public Result executeTask(@Param("data") String param) {
Dict args = Json.fromJson(Dict.class, param);
Long processTaskId = args.getLong(FlowConst.PROCESS_TASK_ID_KEY);
String operator = SecurityUtil.getUserId();
args.remove(FlowConst.PROCESS_TASK_ID_KEY);
Integer submitType = args.getInt(FlowConst.SUBMIT_TYPE);
if (submitType == null) {
submitType = ProcessSubmitTypeEnum.AGREE.getCode();
}
args.put(FlowConst.SUBMIT_TYPE, submitType);
if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK.getCode())) {
// 退回上一个节点
flowEngine.executeAndJumpTask(processTaskId, operator, args, null);
} else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.REJECT.getCode())) {
// 拒绝,跳转到结束节点
flowEngine.executeAndJumpToEnd(processTaskId, operator, args);
} else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.JUMP.getCode())) {
// 跳转到指定节点
String taskName = args.getStr(FlowConst.TASK_NAME);
flowEngine.executeAndJumpTask(processTaskId, operator, args, taskName);
} else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK_TO_OPERATOR.getCode())) {
// 退回发起人
flowEngine.executeAndJumpToFirstTaskNode(processTaskId, operator, args);
} else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.COUNTERSIGN_DISAGREE.getCode())) {
// 会签不同意,追加不同意标识
args.put(FlowConst.COUNTERSIGN_DISAGREE_FLAG, 1);
flowEngine.executeProcessTask(processTaskId, operator, args);
} else {
// 默认执行
flowEngine.executeProcessTask(processTaskId, operator, args);
}
return Result.success();
}
}
@@ -0,0 +1,103 @@
package com.budwk.app.flow.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.entity.ProcessDefine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.service.ProcessDefineService;
import com.budwk.app.flow.vo.ProcessDefineVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.aop.Aop;
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 org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletRequest;
@IocBean
@At("/flow/define")
@Ok("json:full")
@Api("流程定义")
public class FlowDefineController {
@Inject
private Dao dao;
@Inject
private ProcessDefineService processDefineService;
@At("")
@Ok("beetl:/platform/flow/define/index.html")
@SaCheckLogin
public void index() {
}
@At("/preview")
@Ok("beetl:/platform/flow/define/preview.html")
@SaCheckLogin
public void preview(HttpServletRequest request) {
request.setAttribute("id", request.getParameter("id"));
}
@At
@SaCheckLogin
@ApiOperation("删除流程定义")
@Aop(TransAop.READ_COMMITTED)
public Result delete(@Param("id") Long id) {
int count = dao.count(ProcessInstance.class, Cnd.where(ProcessInstance::getProcessDefineId, "=", id));
if (count > 0) {
throw new BaseException("该流程定义正在使用中,请勿删除!");
}
dao.delete(ProcessDefine.class, id);
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("流程定义详情")
public Result detail(@Param("id") Long id) {
ProcessDefine define = dao.fetch(ProcessDefine.class, id);
return Result.success(define);
}
@At
@SaCheckLogin
@ApiOperation("获取流程定义分页列表")
public Result pageData(Integer pageNumber, Integer pageSize, String type, String name, String displayName) {
Cnd cnd = Cnd.NEW();
Pagination pagination = processDefineService.listPage(pageNumber, pageSize, cnd);
return Result.success(pagination);
}
@At
@SaCheckLogin
@ApiOperation("启用流程定义")
public Result enable(@Param("id") Long id) {
ProcessDefine define = new ProcessDefine();
define.setId(id);
define.setState(1);
dao.updateIgnoreNull(define);
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("禁用流程定义")
public Result disable(@Param("id") Long id) {
ProcessDefine define = new ProcessDefine();
define.setId(id);
define.setState(0);
dao.updateIgnoreNull(define);
return Result.success();
}
}
@@ -0,0 +1,187 @@
package com.budwk.app.flow.controller;
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.entity.ProcessDesign;
import com.budwk.app.flow.service.ProcessDesignService;
import com.budwk.app.sys.services.SysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
@IocBean
@At("/flow/design")
@Ok("json:full")
@Api("流程设计")
@Slf4j
public class FlowDesignController {
@Inject
private SysUserService sysUserService;
@Inject
private ProcessDesignService processDesignService;
@Inject
private Dao dao;
// 获取所有任务参与者处理类
public static final List<JSONObject> ASSIGMENT_HANDLER_LIST;
static {
Set<Class<?>> classes = ClassScanner.scanPackageBySuper("com.budwk.app", AssignmentHandler.class);
ArrayList<JSONObject> list = new ArrayList<>(classes.size());
for (Class<?> aClass : classes) {
try {
AssignmentHandler handler = (AssignmentHandler) 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("初始化AssignmentHandler失败: {}", aClass.getName());
}
}
// 排序 按order
list.sort(Comparator.comparingInt(o -> o.getInt("order")));
ASSIGMENT_HANDLER_LIST = Collections.unmodifiableList(list);
}
@At("")
@Ok("beetl:/platform/flow/design/index.html")
@SaCheckLogin
public void index() {
}
@At
@Ok("beetl:/platform/flow/design/designer.html")
@SaCheckLogin
public void designer(HttpServletRequest request) {
request.setAttribute("id", request.getParameter("id"));
}
@At
@SaCheckLogin
@ApiOperation("获取流程设计分页列表")
public Result pageData(Integer pageNumber, Integer pageSize, String name, String key, String category) {
Cnd cnd = Cnd.NEW();
Pagination pagination = processDesignService.listPage(pageNumber, pageSize, cnd);
return Result.success(pagination);
}
@At
@SaCheckLogin
@ApiOperation("保存流程设计")
public Result insert(@Param("design") ProcessDesign processDesign) {
JSONObject jsonObject = new JSONObject();
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());
processDesign.setContent(jsonObject);
dao.insert(processDesign);
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("修改流程设计")
public Result update(@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());
processDesign.setContent(jsonObject);
processDesignService.update(processDesign);
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("修改流程设计")
public Result updateContent(@Param("design") ProcessDesign processDesign) {
processDesignService.update(processDesign);
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("删除流程设计")
public Result delete(@Param("id") Long id) {
dao.delete(ProcessDesign.class, id);
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("流程设计详情")
public Result detail(@Param("id") Long id) {
ProcessDesign design = dao.fetch(ProcessDesign.class, id);
return Result.success(design);
}
@At
@SaCheckLogin
@ApiOperation("发布流程设计")
@Aop(TransAop.READ_COMMITTED)
public Result deploy(@Param("id") Long id) {
processDesignService.deploy(id);
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("获取流程设计任务参与者处理类")
public Result assigmentHandlerClass() {
return Result.success(ASSIGMENT_HANDLER_LIST);
}
@At
@SaCheckLogin
@ApiOperation("获取流程设计任务参与者分页数据")
public Result assigneePage(Integer pageNumber, Integer pageSize, String keyword, @Param("userIds") String[] userIds) {
Sql sql = Sqls.create("select id,loginname,username,unitName from vw_user $condition");
Cnd cnd = Cnd.NEW();
// cnd.andEX("id", "in", userIds);
Pagination pagination = sysUserService.listPageMap(pageNumber, pageSize, sql);
return Result.success(pagination);
}
@At
@SaCheckLogin
@ApiOperation("获取流程设计任务参与者分页数据回显")
public Result assigneeEcho(@Param("userIds") String[] userIds) {
Sql sql = Sqls.create("select id,loginname,username,unitName from vw_user where id in (@userIds)");
sql.setParam("userIds", userIds);
List<NutMap> list = sysUserService.listMap(sql);
return Result.success(list);
}
}
@@ -0,0 +1,57 @@
package com.budwk.app.flow.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.entity.ProcessDesign;
import com.budwk.app.flow.entity.ProcessDesignHis;
import com.budwk.app.flow.service.ProcessDesignService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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 org.nutz.mvc.annotation.Param;
@IocBean
@At("/flow/designer")
@Ok("json:full")
@Api("流程设计")
public class FlowDesignerController {
@Inject
private ProcessDesignService processDesignService;
@Inject
private Dao dao;
@At
@SaCheckLogin
@ApiOperation("保存流程设计")
public Result insert(ProcessDesign processDesign){
dao.insert(processDesign);
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("修改流程设计")
public Result update(ProcessDesign processDesign){
processDesignService.update(processDesign);
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("删除流程设计")
public Result delete(@Param("id")Long id){
dao.delete(ProcessDesign.class, id);
return Result.success();
}
}
@@ -0,0 +1,34 @@
package com.budwk.app.flow.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.hutool.core.lang.Dict;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.service.ProcessInstanceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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;
@IocBean
@At("/flow/instance")
@Ok("json:full")
@Api("流程实例")
public class FlowInstanceController {
@Inject
private ProcessInstanceService processInstanceService;
@At
@SaCheckLogin
@ApiOperation("启动并执行流程实例")
public Result startAndExecute(Dict args) {
Long processDefineId = args.getLong(FlowConst.PROCESS_DEFINE_ID_KEY);
args.remove(FlowConst.PROCESS_DEFINE_ID_KEY);
processInstanceService.startAndExecute(processDefineId,args);
return Result.success();
}
}
@@ -0,0 +1,176 @@
package com.budwk.app.flow.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.sys.services.SysUserService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@IocBean
@At("/flow/todoCenter")
@Ok("json:full")
public class FlowTodoCenter {
@Inject
private Dao dao;
@Inject
private SysUserService sysUserService;
@At("")
@SaCheckLogin
@Ok("beetl:/platform/flow/todoCenter/index.html")
public void index() {
}
@At
@SaCheckLogin
public Result todo(Integer pageNumber, Integer pageSize, String keyword, String categoty) {
Sql sql = Sqls.create("""
SELECT
t.id,
t.displayName AS taskName,
t.taskState,
t.formKey,
t.createdAt,
t.finishTime,
t.variable,
ins.state AS instanceState
FROM
wf_process_task t
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
cnd.and("ta.actorId", "=", SecurityUtil.getUserId());
cnd.desc("t.createdAt");
sql.setCondition(cnd);
Pagination pagination = sysUserService.listPageMap(pageNumber, pageSize, sql);
List<NutMap> list = pagination.getList();
for (NutMap row : list) {
NutMap variable = Json.fromJson(NutMap.class, row.getString("variable"));
row.put("variable", variable);
}
return Result.success(pagination);
}
@At
@SaCheckLogin
public Result done(Integer pageNumber, Integer pageSize, String keyword, String categoty) {
Sql sql = Sqls.create("""
SELECT
t.id,
t.displayName AS taskName,
t.taskState,
t.formKey,
t.finishTime,
ins.state AS instanceState
FROM
wf_process_task t
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("t.taskState", "=", ProcessTaskStateEnum.FINISHED.getCode());
cnd.and("ta.actorId", "=", SecurityUtil.getUserId());
cnd.desc("t.createdAt");
sql.setCondition(cnd);
Pagination pagination = sysUserService.listPageMap(pageNumber, pageSize, sql);
List<NutMap> list = pagination.getList();
for (NutMap row : list) {
NutMap variable = Json.fromJson(NutMap.class, row.getString("variable"));
row.put("variable", variable);
}
return Result.success(pagination);
}
@At
@SaCheckLogin
public Result started(Integer pageNumber, Integer pageSize, String keyword, String categoty) {
Sql sql = Sqls.create("""
SELECT
ins.id,
ins.processDefineId,
ins.state,
ins.businessNo,
ins.operator,
ins.variable,
ins.createdAt,
GROUP_CONCAT(t.displayName) as taskName
FROM
wf_process_instance ins
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id and t.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("ins.operator", "=", SecurityUtil.getUserId());
cnd.desc("ins.createdAt");
sql.setCondition(cnd);
Pagination pagination = sysUserService.listPageMap(pageNumber, pageSize, sql);
List<NutMap> list = pagination.getList();
for (NutMap row : list) {
NutMap variable = Json.fromJson(NutMap.class, row.getString("variable"));
row.put("variable", variable);
}
return Result.success(pagination);
}
@At
@SaCheckLogin
public Result statistics() {
// 查询我发起的流程
int startedCount = dao.count(ProcessInstance.class, Cnd.where(ProcessInstance::getOperator, "=", SecurityUtil.getUserId()));
// 查询我的待办任务
Sql todoSql = Sqls.create("""
SELECT
count(1)
FROM
wf_process_task t
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
WHERE
ta.actorId = @userId
AND t.taskState = 10
""");
todoSql.setParam("userId", SecurityUtil.getUserId());
todoSql.setCallback(Sqls.callback.integer());
dao.execute(todoSql);
int todoCount = todoSql.getInt();
// 查询我的已办任务
Sql doneSql = Sqls.create("""
SELECT
count(1)
FROM
wf_process_task t
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
WHERE
ta.actorId = @userId
AND t.taskState = 20
""");
doneSql.setParam("userId", SecurityUtil.getUserId());
doneSql.setCallback(Sqls.callback.integer());
dao.execute(doneSql);
int doneCount = doneSql.getInt();
return Result.success(Map.of("startedCount", startedCount, "todoCount", todoCount, "doneCount", doneCount));
}
}