first commit
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
package com.budwk.app.flow.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import com.budwk.app.base.annotation.SLog;
|
||||
import com.budwk.app.base.page.Pagination;
|
||||
import com.budwk.app.base.param.PageForm;
|
||||
import com.budwk.app.base.result.Result;
|
||||
import com.budwk.app.flow.entity.ProcessCategory;
|
||||
import com.budwk.app.flow.entity.ProcessDefine;
|
||||
import com.budwk.app.flow.entity.ProcessDesign;
|
||||
import com.budwk.app.flow.service.ProcessDefineService;
|
||||
import com.budwk.app.zhgh.club.model.SysClubRule;
|
||||
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.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.mvc.annotation.At;
|
||||
import org.nutz.mvc.annotation.Ok;
|
||||
import org.nutz.mvc.annotation.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@IocBean
|
||||
@At("/flow/category")
|
||||
@Ok("json:full")
|
||||
@Api("流程分类")
|
||||
public class FlowCategoryController {
|
||||
|
||||
@Inject
|
||||
private Dao dao;
|
||||
@Inject
|
||||
private ProcessDefineService defineService;
|
||||
|
||||
@At("")
|
||||
@Ok("beetl:/platform/flow/category/index.html")
|
||||
@SaCheckLogin
|
||||
public void index() {}
|
||||
|
||||
@At
|
||||
@ApiOperation("分页查询")
|
||||
@SaCheckPermission("flow.category")
|
||||
public Result pageData(PageForm pageForm, String name) {
|
||||
Sql sql = Sqls.create("""
|
||||
select
|
||||
*,
|
||||
(select count(1) from wf_process_design where category = pc.id) as categoryCount
|
||||
from
|
||||
wf_process_category pc
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.and(Cnd.likeEX(ProcessCategory::getName, name));
|
||||
sql.setCondition(cnd);
|
||||
Pagination pagination = defineService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
|
||||
return Result.success(pagination);
|
||||
}
|
||||
|
||||
@At
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
@SaCheckPermission("flow.category")
|
||||
@SLog(tag = "流程管理-流程分类", msg = "新增/编辑流程分类")
|
||||
public Result submit(ProcessCategory category) {
|
||||
dao.insertOrUpdate(category);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
@At
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
@SaCheckPermission("flow.category")
|
||||
@SLog(tag = "流程管理-流程分类", msg = "删除流程分类")
|
||||
public Result delete(String id) {
|
||||
int count = dao.count(ProcessDesign.class, Cnd.where(ProcessDesign::getCategory, "=", id));
|
||||
if(count > 0) {
|
||||
return Result.error("此分类已关联%s个流程,无法删除".formatted(count));
|
||||
}
|
||||
dao.delete(ProcessCategory.class, id);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
@At
|
||||
@SaCheckLogin
|
||||
public Result list() {
|
||||
List<ProcessCategory> list = dao.query(ProcessCategory.class, Cnd.NEW());
|
||||
return Result.success(list);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,322 @@
|
||||
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.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.ProcessInstanceStateEnum;
|
||||
import com.budwk.app.flow.enums.ProcessTaskPerformTypeEnum;
|
||||
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
|
||||
import com.budwk.app.flow.service.FlowCommonService;
|
||||
import com.budwk.app.flow.vo.HighLightVO;
|
||||
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.aop.interceptor.ioc.TransAop;
|
||||
import org.nutz.dao.Chain;
|
||||
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.json.Json;
|
||||
import org.nutz.mvc.annotation.At;
|
||||
import org.nutz.mvc.annotation.Ok;
|
||||
import org.nutz.mvc.annotation.Param;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@IocBean
|
||||
@At("/flow/common")
|
||||
@Api("流程通用")
|
||||
@Ok("json:full")
|
||||
public class FlowCommonController {
|
||||
|
||||
@Inject
|
||||
private FlowEngine flowEngine;
|
||||
@Inject
|
||||
private Dao dao;
|
||||
@Inject
|
||||
private FlowCommonService flowCommonService;
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
HashMap<String, Object> result = new HashMap<>();
|
||||
result.put("processInstance", instanceVO);
|
||||
result.put("todoTasks", todoTaskVos);
|
||||
return Result.success(result);
|
||||
}
|
||||
|
||||
@At
|
||||
@SaCheckLogin
|
||||
@ApiOperation("已办任务")
|
||||
public Result doneTasks(Long instanceId, String bizId) {
|
||||
if (instanceId == null && StrUtil.isBlank(bizId)) {
|
||||
return Result.error("参数错误");
|
||||
}
|
||||
if (instanceId == null) {
|
||||
ProcessInstance instance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", bizId));
|
||||
if (instance == null) {
|
||||
return Result.success(Collections.emptyList());
|
||||
}
|
||||
instanceId = instance.getId();
|
||||
}
|
||||
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, 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);
|
||||
}
|
||||
|
||||
@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);
|
||||
if (vo.getTaskState().equals(ProcessTaskStateEnum.FINISHED.getCode()) && StrUtil.isNotBlank(vo.getOperator())) {
|
||||
|
||||
}
|
||||
|
||||
res.add(vo);
|
||||
});
|
||||
return Result.success(res);
|
||||
}
|
||||
|
||||
@At
|
||||
@SaCheckLogin
|
||||
@ApiOperation("流程图高亮")
|
||||
public Result instanceHighLight(@Param("instanceId") Long instanceId) {
|
||||
HighLightVO highLightVO = flowEngine.processInstanceService().highLight(instanceId);
|
||||
return Result.success(highLightVO);
|
||||
}
|
||||
|
||||
@At
|
||||
@SaCheckLogin
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
@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
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
@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
|
||||
@SaCheckLogin
|
||||
@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();
|
||||
}
|
||||
|
||||
|
||||
@At("/executeTask")
|
||||
@SaCheckLogin
|
||||
@ApiOperation("执行任务")
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
public Result executeTask(@Param("data") String param) {
|
||||
Dict args = Json.fromJson(Dict.class, param);
|
||||
flowCommonService.executeTask(args);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
@At
|
||||
@SaCheckLogin
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
@ApiOperation("撤销任务")
|
||||
public Result revokeTask(@Param("taskId") Long taskId) {
|
||||
// 自己任务
|
||||
ProcessTask selfTask = dao.fetch(ProcessTask.class, taskId);
|
||||
selfTask.setTaskState(ProcessTaskStateEnum.DOING.getCode());
|
||||
|
||||
// 撤销任务
|
||||
List<ProcessTask> taskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getTaskParentId, "=", taskId));
|
||||
for (ProcessTask task : taskList) {
|
||||
task.setTaskState(ProcessTaskStateEnum.WITHDRAW.getCode());
|
||||
dao.update(task);
|
||||
}
|
||||
// 会签并行任务 撤销后续任务
|
||||
if (selfTask.getPerformType().equals(ProcessTaskPerformTypeEnum.COUNTERSIGN.getCode())) {
|
||||
List<ProcessTask> doingTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.DOING.getCode())
|
||||
.and(ProcessTask::getProcessInstanceId, "=", selfTask.getProcessInstanceId()));
|
||||
for (ProcessTask doingTask : doingTasks) {
|
||||
doingTask.setTaskState(ProcessTaskStateEnum.WITHDRAW.getCode());
|
||||
dao.update(doingTask);
|
||||
}
|
||||
}
|
||||
|
||||
// 激活
|
||||
dao.update(selfTask);
|
||||
|
||||
// 流程激活
|
||||
dao.update(ProcessInstance.class, Chain.make("state", ProcessInstanceStateEnum.DOING.getCode()),Cnd.where(ProcessInstance::getId, "=", selfTask.getProcessInstanceId()));
|
||||
|
||||
// 发送任务撤回事件 确保上面执行成功
|
||||
for (ProcessTask task : taskList) {
|
||||
ProcessPublisher.notify(ProcessEvent.builder().eventType(ProcessEventTypeEnum.PROCESS_TASK_REVOKE).sourceId(task.getId()).build());
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
package com.budwk.app.flow.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.budwk.app.base.exception.BaseException;
|
||||
import com.budwk.app.base.page.Pagination;
|
||||
import com.budwk.app.base.param.PageForm;
|
||||
import com.budwk.app.base.result.Result;
|
||||
import com.budwk.app.flow.entity.ProcessDefine;
|
||||
import com.budwk.app.flow.entity.ProcessDesign;
|
||||
import com.budwk.app.flow.entity.ProcessInstance;
|
||||
import com.budwk.app.flow.service.ProcessDefineService;
|
||||
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.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.List;
|
||||
|
||||
@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")
|
||||
@SaCheckPermission("flow.define")
|
||||
public void index() {
|
||||
}
|
||||
|
||||
@At("/preview")
|
||||
@Ok("beetl:/platform/flow/define/preview.html")
|
||||
@SaCheckLogin
|
||||
public void preview(HttpServletRequest request) {
|
||||
request.setAttribute("defineId", request.getParameter("defineId"));
|
||||
request.setAttribute("instanceId", request.getParameter("instanceId"));
|
||||
|
||||
String defineKey = request.getParameter("defineKey");
|
||||
if (StrUtil.isNotBlank(defineKey)) {
|
||||
ProcessDefine define = dao.fetch(ProcessDefine.class, Cnd.where(ProcessDefine::getName, "=", defineKey).desc(ProcessDefine::getVersion));
|
||||
if (define != null) {
|
||||
request.setAttribute("defineId", define.getId());
|
||||
request.setAttribute("showImg", true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@At
|
||||
@ApiOperation("删除流程定义")
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
@SaCheckPermission("flow.define")
|
||||
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
|
||||
@ApiOperation("获取流程定义分页列表")
|
||||
@SaCheckPermission("flow.define")
|
||||
public Result pageData(PageForm pageForm, String displayName, String name, String category) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
*,
|
||||
ROW_NUMBER() OVER (ORDER BY name ) AS rowNum
|
||||
FROM
|
||||
( SELECT *, ROW_NUMBER() OVER ( PARTITION BY NAME ORDER BY version DESC ) AS rn FROM wf_process_define ) t
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
|
||||
cnd.and("rn", "=", 1);
|
||||
cnd.and(Cnd.likeEX(ProcessDesign::getDisplayName, displayName));
|
||||
cnd.and(Cnd.likeEX(ProcessDesign::getName, name));
|
||||
cnd.andEX(ProcessDesign::getCategory, "=", category);
|
||||
|
||||
sql.setCondition(cnd);
|
||||
Pagination pagination = processDefineService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
|
||||
|
||||
List<NutMap> list = pagination.getList(NutMap.class);
|
||||
for (NutMap nutMap : list) {
|
||||
List<ProcessDefine> defineList = dao.query(
|
||||
ProcessDefine.class,
|
||||
Cnd.where(ProcessDefine::getName, "=", nutMap.getString("name"))
|
||||
.and("id", "!=", nutMap.getString("id"))
|
||||
.desc(ProcessDefine::getVersion)
|
||||
);
|
||||
nutMap.put("children", defineList);
|
||||
}
|
||||
|
||||
return Result.success(pagination);
|
||||
}
|
||||
|
||||
@At
|
||||
@ApiOperation("启用流程定义")
|
||||
@SaCheckPermission("flow.define")
|
||||
public Result enable(@Param("id") Long id) {
|
||||
ProcessDefine define = new ProcessDefine();
|
||||
define.setId(id);
|
||||
define.setState(1);
|
||||
dao.updateIgnoreNull(define);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
@At
|
||||
@ApiOperation("禁用流程定义")
|
||||
@SaCheckPermission("flow.define")
|
||||
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,252 @@
|
||||
package com.budwk.app.flow.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import cn.hutool.core.lang.ClassScanner;
|
||||
import cn.hutool.core.util.ReflectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import com.budwk.app.base.page.Pagination;
|
||||
import com.budwk.app.base.param.PageForm;
|
||||
import com.budwk.app.base.result.Result;
|
||||
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;
|
||||
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.dao.util.cri.SqlExpressionGroup;
|
||||
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;
|
||||
// 获取所有候选用户处理类
|
||||
public static final List<JSONObject> CANDIDATE_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);
|
||||
}
|
||||
|
||||
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")
|
||||
@SaCheckPermission("flow.design")
|
||||
public void index() {
|
||||
}
|
||||
|
||||
@At
|
||||
@Ok("beetl:/platform/flow/design/designer.html")
|
||||
@SaCheckLogin
|
||||
public void designer(HttpServletRequest request) {
|
||||
request.setAttribute("id", request.getParameter("id"));
|
||||
}
|
||||
|
||||
@At
|
||||
@ApiOperation("获取流程设计分页列表")
|
||||
@SaCheckPermission("flow.design")
|
||||
public Result pageData(PageForm pageForm, String displayName, String name, String category, Boolean deployed) {
|
||||
Cnd cnd = Cnd.NEW();
|
||||
|
||||
cnd.and(Cnd.likeEX(ProcessDesign::getDisplayName, displayName));
|
||||
cnd.and(Cnd.likeEX(ProcessDesign::getName, name));
|
||||
cnd.andEX(ProcessDesign::getCategory, "=", category);
|
||||
cnd.andEX(ProcessDesign::getIsDeployed, "=", deployed);
|
||||
|
||||
Pagination pagination = processDesignService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd);
|
||||
return Result.success(pagination);
|
||||
}
|
||||
|
||||
@At
|
||||
@ApiOperation("保存流程设计")
|
||||
@SaCheckPermission("flow.design")
|
||||
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());
|
||||
jsonObject.set("instanceViewUrl", processDesign.getInstanceViewUrl());
|
||||
jsonObject.set("h5InstanceViewUrl", processDesign.getH5InstanceViewUrl());
|
||||
jsonObject.set("icon", processDesign.getIcon());
|
||||
jsonObject.set("picIcon", processDesign.getPicIcon());
|
||||
jsonObject.set("description", processDesign.getDescription());
|
||||
processDesign.setContent(jsonObject);
|
||||
dao.insert(processDesign);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
@At
|
||||
@ApiOperation("修改流程设计")
|
||||
@SaCheckPermission("flow.design")
|
||||
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());
|
||||
jsonObject.set("instanceViewUrl", processDesign.getInstanceViewUrl());
|
||||
jsonObject.set("h5InstanceViewUrl", processDesign.getH5InstanceViewUrl());
|
||||
jsonObject.set("icon", processDesign.getIcon());
|
||||
jsonObject.set("picIcon", processDesign.getPicIcon());
|
||||
jsonObject.set("description", processDesign.getDescription());
|
||||
processDesign.setContent(jsonObject);
|
||||
processDesignService.update(processDesign);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
@At
|
||||
@ApiOperation("修改流程设计")
|
||||
@SaCheckPermission("flow.design")
|
||||
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());
|
||||
jsonObject.set("icon", processDesign.getIcon());
|
||||
jsonObject.set("picIcon", processDesign.getPicIcon());
|
||||
jsonObject.set("description", processDesign.getDescription());
|
||||
processDesign.setContent(jsonObject);
|
||||
processDesignService.update(processDesign);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
@At
|
||||
@ApiOperation("删除流程设计")
|
||||
@SaCheckPermission("flow.design")
|
||||
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
|
||||
@ApiOperation("发布流程设计")
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
@SaCheckPermission("flow.design")
|
||||
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 candidateHandlerClass() {
|
||||
return Result.success(CANDIDATE_HANDLER_LIST);
|
||||
}
|
||||
|
||||
|
||||
@At
|
||||
@SaCheckLogin
|
||||
@ApiOperation("获取流程设计任务参与者分页数据")
|
||||
public Result assigneePage(Integer pageNumber, Integer pageSize, String searchKeyword, @Param("userIds") String[] userIds) {
|
||||
Sql sql = Sqls.create("select id,loginname,username,unitName from vw_user $condition");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
if(StrUtil.isNotBlank(searchKeyword)) {
|
||||
SqlExpressionGroup group = new SqlExpressionGroup();
|
||||
group.orLike("username", searchKeyword);
|
||||
group.orLike("loginname", searchKeyword);
|
||||
cnd.and(group);
|
||||
}
|
||||
sql.setCondition(cnd);
|
||||
// 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,268 @@
|
||||
package com.budwk.app.flow.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
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.List;
|
||||
import java.util.Map;
|
||||
|
||||
@IocBean
|
||||
@At("/flow/todoCenter")
|
||||
@Ok("json:full")
|
||||
public class FlowTodoCenterController {
|
||||
|
||||
@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 searchKeyword, String category) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
t.id AS taskId,
|
||||
t.taskName AS taskKey,
|
||||
t.displayName AS taskName,
|
||||
t.taskState,
|
||||
t.formKey,
|
||||
t.h5FormKey,
|
||||
t.createdAt,
|
||||
t.finishTime,
|
||||
t.variable,
|
||||
ins.state AS instanceState,
|
||||
ins.id AS instanceId,
|
||||
ins.businessNo,
|
||||
cat.`name` categoryName,
|
||||
ins.variable ->> '$.instanceName' AS instanceName
|
||||
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
|
||||
LEFT JOIN wf_process_define def ON def.id = ins.processDefineId
|
||||
LEFT JOIN wf_process_category cat ON cat.id = def.category
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
|
||||
cnd.and("ta.actorId", "=", SecurityUtil.getUserId());
|
||||
cnd.andEX("def.category", "=", category);
|
||||
if (StrUtil.isNotBlank(searchKeyword)) {
|
||||
cnd.where().andLike("ins.variable ->> '$.instanceName'", searchKeyword);
|
||||
}
|
||||
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 searchKeyword, String category) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
t.id AS taskId,
|
||||
t.taskName AS taskKey,
|
||||
t.displayName AS taskName,
|
||||
t.taskState,
|
||||
t.formKey,
|
||||
t.h5FormKey,
|
||||
t.createdAt,
|
||||
t.finishTime,
|
||||
t.variable,
|
||||
ins.state AS instanceState,
|
||||
ins.id AS instanceId,
|
||||
ins.businessNo,
|
||||
cat.`name` categoryName,
|
||||
ins.variable ->> '$.instanceName' AS instanceName
|
||||
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
|
||||
LEFT JOIN wf_process_define def ON def.id = ins.processDefineId
|
||||
LEFT JOIN wf_process_category cat ON cat.id = def.category
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.and("t.taskState", "=", ProcessTaskStateEnum.FINISHED.getCode());
|
||||
cnd.and("ta.actorId", "=", SecurityUtil.getUserId());
|
||||
cnd.andEX("def.category", "=", category);
|
||||
if (StrUtil.isNotBlank(searchKeyword)) {
|
||||
cnd.where().andLike("ins.variable ->> '$.instanceName'", searchKeyword);
|
||||
}
|
||||
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 searchKeyword, String category) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
ins.id AS instanceId,
|
||||
ins.processDefineId,
|
||||
ins.state,
|
||||
ins.businessNo,
|
||||
ins.operator,
|
||||
ins.variable,
|
||||
ins.createdAt,
|
||||
ins.variable ->> '$.instanceName' AS instanceName,
|
||||
GROUP_CONCAT(DISTINCT t.displayName) as taskName,
|
||||
cat.`name` categoryName,
|
||||
t.formKey,
|
||||
t.h5FormKey
|
||||
FROM
|
||||
wf_process_instance ins
|
||||
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id and t.taskState = 20
|
||||
LEFT JOIN wf_process_define def ON def.id = ins.processDefineId
|
||||
LEFT JOIN wf_process_category cat ON cat.id = def.category
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.and("ins.operator", "=", SecurityUtil.getUserId());
|
||||
cnd.andEX("def.category", "=", category);
|
||||
if (StrUtil.isNotBlank(searchKeyword)) {
|
||||
cnd.where().andLike("ins.variable ->> '$.instanceName'", searchKeyword);
|
||||
}
|
||||
cnd.groupBy("ins.id");
|
||||
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 completed(Integer pageNumber, Integer pageSize, String searchKeyword, String category) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
ins.id AS instanceId,
|
||||
ins.processDefineId,
|
||||
ins.state,
|
||||
ins.businessNo,
|
||||
ins.operator,
|
||||
ins.variable,
|
||||
ins.createdAt,
|
||||
ins.variable ->> '$.instanceName' AS instanceName,
|
||||
cat.`name` categoryName
|
||||
FROM
|
||||
wf_process_instance ins
|
||||
LEFT JOIN wf_process_define def ON def.id = ins.processDefineId
|
||||
LEFT JOIN wf_process_category cat ON cat.id = def.category
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.and("ins.state", "=", 20);
|
||||
cnd.and("ins.operator", "=", SecurityUtil.getUserId());
|
||||
if (StrUtil.isNotBlank(searchKeyword)) {
|
||||
cnd.where().andLike("ins.variable ->> '$.instanceName'", searchKeyword);
|
||||
}
|
||||
cnd.groupBy("ins.id");
|
||||
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();
|
||||
|
||||
// 查询未读消息
|
||||
Sql msgSql = Sqls.create("""
|
||||
SELECT
|
||||
count(DISTINCT r.messageId)
|
||||
FROM
|
||||
global_message_receiver r
|
||||
LEFT JOIN global_message m ON m.id = r.messageId
|
||||
WHERE
|
||||
r.receiverId = @userId
|
||||
AND r.isRead = 0
|
||||
AND m.`status` = 2
|
||||
""");
|
||||
msgSql.setParam("userId", SecurityUtil.getUserId());
|
||||
msgSql.setCallback(Sqls.callback.integer());
|
||||
dao.execute(msgSql);
|
||||
int msgCount = msgSql.getInt();
|
||||
|
||||
return Result.success(Map.of("startedCount", startedCount, "todoCount", todoCount, "doneCount", doneCount, "notifications", msgCount));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user