diff --git a/src/main/java/com/budwk/app/flow/controller/FlowCategoryController.java b/src/main/java/com/budwk/app/flow/controller/FlowCategoryController.java new file mode 100644 index 00000000..f86fc866 --- /dev/null +++ b/src/main/java/com/budwk/app/flow/controller/FlowCategoryController.java @@ -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 list = dao.query(ProcessCategory.class, Cnd.NEW()); + return Result.success(list); + } + +} diff --git a/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java b/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java index c9b3ccde..6f921475 100644 --- a/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java +++ b/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java @@ -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 doneTaskVos = new ArrayList<>(); -// List doneTaskList = flowEngine.processTaskService().getDoneTaskList(instanceId, null); -// for (ProcessTask doneTask : doneTaskList) { -// ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId()); -// doneTaskVos.add(taskVO); -// } - HashMap 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 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(); + } + } diff --git a/src/main/java/com/budwk/app/flow/controller/FlowDesignController.java b/src/main/java/com/budwk/app/flow/controller/FlowDesignController.java index 7ea6bf06..ad890f7a 100644 --- a/src/main/java/com/budwk/app/flow/controller/FlowDesignController.java +++ b/src/main/java/com/budwk/app/flow/controller/FlowDesignController.java @@ -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(); diff --git a/src/main/java/com/budwk/app/flow/controller/FlowTodoCenter.java b/src/main/java/com/budwk/app/flow/controller/FlowTodoCenter.java index ae3a4ca6..f268df55 100644 --- a/src/main/java/com/budwk/app/flow/controller/FlowTodoCenter.java +++ b/src/main/java/com/budwk/app/flow/controller/FlowTodoCenter.java @@ -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 diff --git a/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java b/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java index ed49e724..a04a7213 100644 --- a/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java +++ b/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java @@ -19,6 +19,7 @@ import com.budwk.app.flow.service.ProcessDefineService; import com.budwk.app.flow.service.ProcessInstanceService; import com.budwk.app.flow.service.ProcessTaskService; import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; import org.nutz.ioc.aop.Aop; import java.util.Collections; diff --git a/src/main/java/com/budwk/app/flow/engine/model/ProcessModel.java b/src/main/java/com/budwk/app/flow/engine/model/ProcessModel.java index cfe53216..9ca10142 100644 --- a/src/main/java/com/budwk/app/flow/engine/model/ProcessModel.java +++ b/src/main/java/com/budwk/app/flow/engine/model/ProcessModel.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; @Data public class ProcessModel extends BaseModel { private String type; // 流程定义分类 + private String icon; // 流程定义图标 private String category; // 流程定义分类 private String instanceUrl; // 启动实例要填写的表单key private String h5InstanceUrl; // 启动实例要填写的手机端表单key diff --git a/src/main/java/com/budwk/app/flow/engine/model/logicflow/LfModel.java b/src/main/java/com/budwk/app/flow/engine/model/logicflow/LfModel.java index fbd766c8..e93273f9 100644 --- a/src/main/java/com/budwk/app/flow/engine/model/logicflow/LfModel.java +++ b/src/main/java/com/budwk/app/flow/engine/model/logicflow/LfModel.java @@ -4,15 +4,17 @@ import com.budwk.app.flow.engine.model.BaseModel; import lombok.Data; import java.util.List; + /** - * * logicFlow模型 + * * @author mldong * @date 2023/4/26 */ @Data public class LfModel extends BaseModel { private String type; // 流程定义分类 + private String category; private String expireTime;// 过期时间(常量或变量) private String instanceUrl; // 启动实例的url,前后端分离后,定义为路由名或或路由地址 private String h5InstanceUrl; diff --git a/src/main/java/com/budwk/app/flow/engine/parser/ModelParser.java b/src/main/java/com/budwk/app/flow/engine/parser/ModelParser.java index 10b95a00..ef7a7f4f 100644 --- a/src/main/java/com/budwk/app/flow/engine/parser/ModelParser.java +++ b/src/main/java/com/budwk/app/flow/engine/parser/ModelParser.java @@ -78,6 +78,7 @@ public class ModelParser { processModel.setName(lfModel.getName()); processModel.setDisplayName(lfModel.getDisplayName()); processModel.setType(lfModel.getType()); + processModel.setCategory(lfModel.getCategory()); processModel.setInstanceUrl(lfModel.getInstanceUrl()); processModel.setH5InstanceUrl(lfModel.getH5InstanceUrl()); processModel.setInstanceViewUrl(lfModel.getInstanceViewUrl()); diff --git a/src/main/java/com/budwk/app/flow/entity/ProcessCategory.java b/src/main/java/com/budwk/app/flow/entity/ProcessCategory.java new file mode 100644 index 00000000..db3ece49 --- /dev/null +++ b/src/main/java/com/budwk/app/flow/entity/ProcessCategory.java @@ -0,0 +1,28 @@ +package com.budwk.app.flow.entity; + +import com.budwk.app.base.model.BaseModel; +import lombok.Getter; +import lombok.Setter; +import org.nutz.dao.entity.annotation.*; + +@Getter +@Setter +@Table("wf_process_category") +@Comment("流程分类") +public class ProcessCategory extends BaseModel { + + @Id + @Comment("ID") + private Long id; + + @Comment("名称") + @Column + @ColDefine(type = ColType.VARCHAR, width = 10) + private String name; + + @Comment("图标") + @Column + @ColDefine(type = ColType.VARCHAR, width = 255) + private String icon; + +} diff --git a/src/main/java/com/budwk/app/flow/entity/ProcessDefine.java b/src/main/java/com/budwk/app/flow/entity/ProcessDefine.java index c68dadb7..33798565 100644 --- a/src/main/java/com/budwk/app/flow/entity/ProcessDefine.java +++ b/src/main/java/com/budwk/app/flow/entity/ProcessDefine.java @@ -1,5 +1,6 @@ package com.budwk.app.flow.entity; +import cn.hutool.extra.pinyin.PinyinUtil; import cn.hutool.json.JSONObject; import com.budwk.app.base.model.BaseModel; import lombok.Getter; @@ -72,4 +73,9 @@ public class ProcessDefine extends BaseModel { @Column private Integer version; + @Comment + @Column + @ColDefine(type = ColType.CHAR) + private Character pinyinName; + } diff --git a/src/main/java/com/budwk/app/flow/enums/ProcessEventTypeEnum.java b/src/main/java/com/budwk/app/flow/enums/ProcessEventTypeEnum.java index 0f8280f7..538afd2c 100644 --- a/src/main/java/com/budwk/app/flow/enums/ProcessEventTypeEnum.java +++ b/src/main/java/com/budwk/app/flow/enums/ProcessEventTypeEnum.java @@ -9,6 +9,9 @@ public enum ProcessEventTypeEnum{ PROCESS_INSTANCE_END(2, "流程实例结束事件"), PROCESS_TASK_START(3, "流程任务开始事件"), PROCESS_TASK_END(4, "流程任务结束事件"), + + PROCESS_TASK_REVOKE(5, "流程任务撤销事件"), + ; private final Integer code; diff --git a/src/main/java/com/budwk/app/flow/listenter/ProcessTaskRevokeEventListener.java b/src/main/java/com/budwk/app/flow/listenter/ProcessTaskRevokeEventListener.java new file mode 100644 index 00000000..2e470456 --- /dev/null +++ b/src/main/java/com/budwk/app/flow/listenter/ProcessTaskRevokeEventListener.java @@ -0,0 +1,47 @@ +package com.budwk.app.flow.listenter; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.event.ProcessEvent; +import com.budwk.app.flow.engine.event.ProcessEventListener; +import com.budwk.app.flow.entity.ProcessInstance; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.enums.ProcessEventTypeEnum; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; + +/** + * 流程任务撤销事件监听器 + */ +@IocBean +public class ProcessTaskRevokeEventListener implements ProcessEventListener { + + @Inject + private Dao dao; + + @Override + public void onEvent(ProcessEvent event) { + if(event.getEventType()== ProcessEventTypeEnum.PROCESS_TASK_REVOKE){ + Long taskId = event.getSourceId(); + ProcessTask task = dao.fetch(ProcessTask.class, taskId); + + String taskDisplayName = task.getDisplayName(); + + ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId()); + + JSONObject variable = JSONUtil.parseObj(instance.getVariable()); + String initiatorName = variable.getStr(FlowConst.INITIATOR_NAME); + String instanceName = variable.getStr(FlowConst.PROCESS_INSTANCE_NAME); + + + // 消息API提醒 + String msgTemplate = "{},您的{}已被撤销,无需审核。"; + String msg = StrUtil.format(msgTemplate, instanceName, taskDisplayName); + + // 发送 go go go + } + } +} diff --git a/src/main/java/com/budwk/app/flow/service/ProcessInstanceService.java b/src/main/java/com/budwk/app/flow/service/ProcessInstanceService.java index 5d14252f..07b51c6c 100644 --- a/src/main/java/com/budwk/app/flow/service/ProcessInstanceService.java +++ b/src/main/java/com/budwk/app/flow/service/ProcessInstanceService.java @@ -233,4 +233,17 @@ public interface ProcessInstanceService extends BaseService { * @return */ List getAssigneeTextData(Long processInstanceId); + + /** + * 删除流程实例 + * @param processInstanceId + */ + void deleteProcessInstanceById(Long processInstanceId); + + /** + * 删除流程实例 + * @param businessKey + */ + void deleteProcessInstanceByBusinessKey(String businessKey); + } diff --git a/src/main/java/com/budwk/app/flow/service/impl/ProcessDefineServiceImpl.java b/src/main/java/com/budwk/app/flow/service/impl/ProcessDefineServiceImpl.java index d9c8deb1..86b52043 100644 --- a/src/main/java/com/budwk/app/flow/service/impl/ProcessDefineServiceImpl.java +++ b/src/main/java/com/budwk/app/flow/service/impl/ProcessDefineServiceImpl.java @@ -3,17 +3,14 @@ package com.budwk.app.flow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; -import cn.hutool.core.lang.Dict; -import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.pinyin.PinyinUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.budwk.app.base.enums.UpAndDownParam; -import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.flow.engine.model.ProcessModel; import com.budwk.app.flow.engine.parser.ModelParser; 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 org.nutz.aop.interceptor.ioc.TransAop; @@ -23,9 +20,7 @@ import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.IocBean; import java.io.InputStream; -import java.nio.charset.Charset; import java.util.Date; -import java.util.List; @IocBean(args = {"refer:dao"}) public class ProcessDefineServiceImpl extends BaseServiceImpl implements ProcessDefineService { @@ -100,8 +95,6 @@ public class ProcessDefineServiceImpl extends BaseServiceImpl imp // 1. json定义文件转成流程模型 ProcessModel processModel = ModelParser.parse(defineJsonStr); // 2. 根据名称查询,取最新版本的流程定义记录 - List processDefineList = query(Cnd.where(ProcessDefine::getName, "=", processModel.getName()).desc(ProcessDefine::getId)); - ProcessDefine latestDefine = dao().fetch(ProcessDefine.class, Cnd.where(ProcessDefine::getName, "=", processModel.getName()).desc(ProcessDefine::getId)); ProcessDefine define = null; @@ -122,9 +115,8 @@ public class ProcessDefineServiceImpl extends BaseServiceImpl imp define.setH5InstanceUrl(processModel.getH5InstanceUrl()); define.setInstanceViewUrl(processModel.getInstanceViewUrl()); define.setH5InstanceViewUrl(processModel.getH5InstanceViewUrl()); - -// define.setInstanceViewUrl(latestDefine.getInstanceViewUrl()); -// define.setH5InstanceViewUrl(latestDefine.getH5InstanceViewUrl()); + define.setIcon(processModel.getIcon()); + define.setPinyinName(PinyinUtil.getFirstLetter(define.getDisplayName().charAt(0))); define.setState(1); define.setContent(JSONUtil.parseObj(defineJsonStr)); diff --git a/src/main/java/com/budwk/app/flow/service/impl/ProcessInstanceServiceImpl.java b/src/main/java/com/budwk/app/flow/service/impl/ProcessInstanceServiceImpl.java index d8e067b4..f00be8fd 100644 --- a/src/main/java/com/budwk/app/flow/service/impl/ProcessInstanceServiceImpl.java +++ b/src/main/java/com/budwk/app/flow/service/impl/ProcessInstanceServiceImpl.java @@ -9,11 +9,9 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.extra.expression.ExpressionUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; -import com.budwk.app.base.enums.YesNoEnum; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.vo.LabelValueVO; import com.budwk.app.flow.constant.FlowConst; -import com.budwk.app.flow.engine.Context; import com.budwk.app.flow.engine.DecisionHandler; import com.budwk.app.flow.engine.FlowEngine; import com.budwk.app.flow.engine.core.Execution; @@ -93,7 +91,13 @@ public class ProcessInstanceServiceImpl extends BaseServiceImpl ProcessInstanceVO instanceVO = new ProcessInstanceVO(); BeanUtil.fillBeanWithMapIgnoreCase(nutMap, instanceVO, true); - instanceVO.setJsonObject(processDefineService.getDefineJsonObject(instanceVO.getProcessDefineId())); + + ProcessDefine define = processDefineService.fetch(instanceVO.getProcessDefineId()); + +// instanceVO.setJsonObject(processDefineService.getDefineJsonObject(instanceVO.getProcessDefineId())); + + instanceVO.setJsonObject(JSONUtil.parseObj(define)); + return instanceVO; } @@ -319,24 +323,38 @@ public class ProcessInstanceServiceImpl extends BaseServiceImpl @Override public void withdraw(Long processInstanceId, String operator) { - Date now = new Date(); +// Date now = new Date(); // 1. 将该流程实例状态修改为撤回 ProcessInstance processInstance = new ProcessInstance(); + processInstance.setId(processInstanceId); processInstance.setState(ProcessInstanceStateEnum.WITHDRAW.getCode()); processInstance.setUpdatedAt(System.currentTimeMillis()); processInstance.setUpdatedBy(operator); - int update = dao().update(ProcessInstance.class, Chain.from(processInstance), Cnd.where(ProcessInstance::getId, "=", processInstanceId) - .and(ProcessInstance::getState, "=", ProcessInstanceStateEnum.DOING.getCode())); + int updated = dao().updateIgnoreNull(processInstance); - if (update >= 1) { - // 2. 将该流程实例产生的任务状态修改为撤回 - ProcessTask processTask = new ProcessTask(); - processTask.setTaskState(ProcessTaskStateEnum.WITHDRAW.getCode()); - processTask.setUpdatedAt(System.currentTimeMillis()); - processTask.setUpdatedBy(operator); - dao().update(ProcessTask.class, Chain.from(processTask), Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstanceId) - .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.DOING.getCode())); + // 2. 将该流程实例产生的任务状态修改为撤回 + if (updated > 0) { + List taskList = dao().query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstanceId).and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.DOING.getCode())); + for (ProcessTask processTask : taskList) { + processTask.setTaskState(ProcessTaskStateEnum.WITHDRAW.getCode()); + processTask.setUpdatedAt(System.currentTimeMillis()); + processTask.setUpdatedBy(operator); + } + dao().update(taskList, "taskState|updateAt|updateBy"); } + +// int update = dao().update(ProcessInstance.class, Chain.from(processInstance), Cnd.where(ProcessInstance::getId, "=", processInstanceId) +// .and(ProcessInstance::getState, "=", ProcessInstanceStateEnum.DOING.getCode())); +// +// if (update >= 1) { +// // 2. 将该流程实例产生的任务状态修改为撤回 +// ProcessTask processTask = new ProcessTask(); +// processTask.setTaskState(ProcessTaskStateEnum.WITHDRAW.getCode()); +// processTask.setUpdatedAt(System.currentTimeMillis()); +// processTask.setUpdatedBy(operator); +// dao().update(ProcessTask.class, Chain.from(processTask), Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstanceId) +// .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.DOING.getCode())); +// } } /** @@ -531,4 +549,22 @@ public class ProcessInstanceServiceImpl extends BaseServiceImpl .collect(Collectors.toList()); return result; } + + + @Override + @Aop(TransAop.READ_COMMITTED) + public void deleteProcessInstanceById(Long processInstanceId) { + List taskList = dao().query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstanceId)); + List taskIds = taskList.stream().map(ProcessTask::getId).toList(); + dao().clear(ProcessTask.class, Cnd.where(ProcessTask::getId, "in", taskIds)); + dao().clear(ProcessInstance.class, Cnd.where(ProcessInstance::getId, "=", processInstanceId)); + } + + @Override + public void deleteProcessInstanceByBusinessKey(String businessKey) { + ProcessInstance processInstance = fetch(Cnd.where(ProcessInstance::getBusinessNo, "=", businessKey)); + if (processInstance != null) { + deleteProcessInstanceById(processInstance.getId()); + } + } } diff --git a/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java b/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java index 38f28e64..4ea2e00d 100644 --- a/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java +++ b/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java @@ -108,7 +108,7 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme @Override public List getDoneTaskList(Long processInstanceId, String[] taskNames) { - Cnd cnd = Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstanceId).and(ProcessTask::getTaskState, "!=", ProcessTaskStateEnum.DOING.getCode()); + Cnd cnd = Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstanceId).and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()); cnd.andEX(ProcessTask::getTaskName, "", taskNames); List processTaskList = query(cnd); return processTaskList; diff --git a/src/main/java/com/budwk/app/sys/controller/SysHomeV4Controller.java b/src/main/java/com/budwk/app/sys/controller/SysHomeV4Controller.java index 67f21534..122d4645 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysHomeV4Controller.java +++ b/src/main/java/com/budwk/app/sys/controller/SysHomeV4Controller.java @@ -47,6 +47,16 @@ public class SysHomeV4Controller { } + /** + * 服务中心 + */ + @At("/serv") + @Ok("beetl:/layouts/v4/serv.html") + @SaCheckLogin + public void serv(){ + + } + /** * 子系统 * @param appId 应用ID diff --git a/src/main/java/com/budwk/app/sys/controller/v4/SysV4ServController.java b/src/main/java/com/budwk/app/sys/controller/v4/SysV4ServController.java new file mode 100644 index 00000000..49e50275 --- /dev/null +++ b/src/main/java/com/budwk/app/sys/controller/v4/SysV4ServController.java @@ -0,0 +1,69 @@ +package com.budwk.app.sys.controller.v4; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.result.Result; +import com.budwk.app.flow.entity.ProcessCategory; +import com.budwk.app.sys.services.SysMenuService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +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.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("/platform/v4/serv") +@Api(value = "服务中心接口", tags = "服务中心接口") +public class SysV4ServController { + + @Inject + private Dao dao; + @Inject + private SysMenuService sysMenuService; + + @At("/categories") + @Ok("json") + @SaCheckLogin + @ApiOperation("获取分类") + public Result categories() { + List list = dao.query(ProcessCategory.class, Cnd.NEW()); + return Result.success(list); + } + + @At("/list") + @Ok("json:full") + @SaCheckLogin + @ApiOperation("获取应用列表") + public Result list(@Param("categoryId") String categoryId, @Param("letter") String letter, @Param("keyword") String keyword, HttpServletRequest req) { + Sql sql = Sqls.create(""" + SELECT t.* + FROM wf_process_define t + INNER JOIN ( + SELECT name, MAX(id) AS max_id + FROM wf_process_define + GROUP BY name + ) sub ON t.name = sub.name AND t.id = sub.max_id + $condition + """); + Cnd cnd = Cnd.NEW(); + if (StrUtil.isNotBlank(keyword)) { + cnd.where().andLike("t.disPlayName", keyword); + } + cnd.andEX("t.category", "=", categoryId); + sql.setCondition(cnd); + List list = sysMenuService.listMap(sql); + return Result.success(list); + } + + +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/suggestionBox/controller/SuggestionApplyController.java b/src/main/java/com/budwk/app/zhgh/democratic/suggestionBox/controller/SuggestionApplyController.java index 0a90416a..7ba6fe48 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/suggestionBox/controller/SuggestionApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/suggestionBox/controller/SuggestionApplyController.java @@ -3,17 +3,22 @@ package com.budwk.app.zhgh.democratic.suggestionBox.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.engine.FlowEngine; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.democratic.suggestionBox.service.SuggestionBoxService; 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.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; @IocBean @At("/platform/suggestionBox2/apply") @@ -23,11 +28,13 @@ public class SuggestionApplyController { @Inject private SuggestionBoxService suggestionBoxService; + @Inject + private FlowEngine flowEngine; @At("/index") @Ok("beetl:/platform/zhgh/dayofficework/suggestionBox/apply/index.html") @SaCheckLogin - public void index(){ + public void index() { } @@ -62,7 +69,9 @@ public class SuggestionApplyController { t.taskState, t.finishTime, t.taskParentId, - t.variable taskVariale + t.variable taskVariale, + IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke, + (select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask') AS startTaskId FROM suggestion_box info LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id @@ -78,5 +87,14 @@ public class SuggestionApplyController { return Result.success(pagination); } + @At + @SaCheckLogin + @Aop(TransAop.READ_COMMITTED) + @ApiOperation("删除") + public Result delete(@Param("id") String id) { + suggestionBoxService.delete(id); + flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id); + return Result.success(); + } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/suggestionBox/controller/SuggestionXghController.java b/src/main/java/com/budwk/app/zhgh/democratic/suggestionBox/controller/SuggestionXghController.java index 9c945fba..b78ca772 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/suggestionBox/controller/SuggestionXghController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/suggestionBox/controller/SuggestionXghController.java @@ -68,12 +68,16 @@ public class SuggestionXghController { t.taskState, t.finishTime, t.taskParentId, - t.variable taskVariale + t.variable taskVariable, + IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName, + IF(rt.id IS NOT NULL, 1, 0) AS canRevoke FROM wf_process_task t LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId LEFT JOIN suggestion_box info ON info.id = ins.businessNo LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id + LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10 + LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10 $condition """); Cnd cnd = Cnd.NEW(); @@ -86,8 +90,6 @@ public class SuggestionXghController { cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); } - cnd.desc("t.createdAt"); - cnd.andEX("YEAR(info.submitTime)", "=", year); cnd.and(Cnd.likeEX("info.title", title)); @@ -96,6 +98,8 @@ public class SuggestionXghController { } else { cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); } + cnd.groupBy("t.id"); + cnd.desc("t.createdAt"); sql.setCondition(cnd); Pagination pageVO = suggestionBoxService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); return Result.success(pageVO); diff --git a/src/main/resources/static/assets/platform/css/common.css b/src/main/resources/static/assets/platform/css/common.css index 5f6fe9b5..5b7c5352 100644 --- a/src/main/resources/static/assets/platform/css/common.css +++ b/src/main/resources/static/assets/platform/css/common.css @@ -664,7 +664,6 @@ td.no-b { } .flow-task-form .el-descriptions-item__label.is-bordered-label { - color: rgb(102, 102, 102) !important; background: rgb(248, 249, 250) !important; padding: 8px 12px !important; border: 1px solid rgb(221, 221, 221) !important; diff --git a/src/main/resources/static/components/plugins/snaker/snakerFlow.vue b/src/main/resources/static/components/plugins/snaker/snakerFlow.vue index ec3c84c0..1a633f7e 100644 --- a/src/main/resources/static/components/plugins/snaker/snakerFlow.vue +++ b/src/main/resources/static/components/plugins/snaker/snakerFlow.vue @@ -36,7 +36,7 @@
-