diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java index 2edcda60e..47d7046e2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwInstanceController.java @@ -7,6 +7,7 @@ import org.dromara.common.core.domain.R; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; +import org.dromara.workflow.domain.vo.FlowInstanceVo; import org.dromara.workflow.service.IFlwInstanceService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -34,7 +35,7 @@ public class FlwInstanceController extends BaseController { * @param pageQuery 分页 */ @GetMapping("/getPageByRunning") - public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { + public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { return flwInstanceService.getPageByRunning(instance, pageQuery); } @@ -45,7 +46,7 @@ public class FlwInstanceController extends BaseController { * @param pageQuery 分页 */ @GetMapping("/getPageByFinish") - public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { + public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { return flwInstanceService.getPageByFinish(instance, pageQuery); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java new file mode 100644 index 000000000..df8b6be7d --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowInstanceBo.java @@ -0,0 +1,41 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 任务请求对象 + * + * @author may + */ +@Data +public class FlowInstanceBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 任务名称 + */ + private String nodeName; + + /** + * 流程定义名称 + */ + private String flowName; + + /** + * 流程定义编码 + */ + private String flowCode; + + /** + * 流程实例id + */ + private Long instanceId; + + private List permissionList; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java index 8f677e60f..74a5d554e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowTaskBo.java @@ -33,6 +33,9 @@ public class FlowTaskBo implements Serializable { */ private String flowCode; + /** + * 流程实例id + */ private Long instanceId; private List permissionList; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index 1802cd376..1155d1dce 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -1,10 +1,13 @@ package org.dromara.workflow.domain.vo; -import com.warm.flow.orm.entity.FlowHisTask; import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; import java.io.Serial; import java.io.Serializable; +import java.util.Date; +import java.util.List; /** * 历史任务视图 @@ -12,13 +15,147 @@ import java.io.Serializable; * @author may */ @Data -public class FlowHisTaskVo extends FlowHisTask implements Serializable { +public class FlowHisTaskVo implements Serializable { @Serial private static final long serialVersionUID = 1L; + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 删除标记 + */ + private String delFlag; + + /** + * 对应flow_definition表的id + */ + private Long definitionId; + + /** + * 流程名称 + */ + private String flowName; + + /** + * 流程实例表id + */ + private Long instanceId; + + /** + * 任务表id + */ + private Long taskId; + + /** + * 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) + */ + private Integer cooperateType; + + /** + * 业务id + */ + private String businessId; + + /** + * 开始节点编码 + */ + private String nodeCode; + + /** + * 开始节点名称 + */ + private String nodeName; + + /** + * 开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 目标节点编码 + */ + private String targetNodeCode; + + /** + * 结束节点名称 + */ + private String targetNodeName; + + /** + * 审批者 + */ + private String approver; + + /** + * 协作人(只有转办、会签、票签、委派) + */ + private String collaborator; + + /** + * 权限标识 permissionFlag的list形式 + */ + private List permissionList; + + /** + * 跳转类型(PASS通过 REJECT退回 NONE无动作) + */ + private String skipType; + + /** + * 流程状态(1审批中 2 审批通过 9已退回 10失效) + */ + private Integer flowStatus; + + /** + * 审批意见 + */ + private String message; + + /** + * 业务详情 存业务类的json + */ + private String ext; + + /** + * 创建者 + */ + private String createBy; + + + /** + * 审批表单是否自定义(Y是 2否) + */ + private String formCustom; + + /** + * 审批表单路径 + */ + private String formPath; + /** * 流程定义编码 */ private String flowCode; + + /** + * 审批者 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "approver") + private String approverName; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java new file mode 100644 index 000000000..6e4181c6c --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowInstanceVo.java @@ -0,0 +1,111 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.util.Date; + +/** + * 流程实例视图 + * + * @author may + */ +@Data +public class FlowInstanceVo { + + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 删除标记 + */ + private String delFlag; + + /** + * 对应flow_definition表的id + */ + private Long definitionId; + + /** + * 流程名称 + */ + private String flowName; + + /** + * 流程名称 + */ + private String flowCode; + + /** + * 业务id + */ + private String businessId; + + /** + * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 流程节点编码 每个流程的nodeCode是唯一的,即definitionId+nodeCode唯一,在数据库层面做了控制 + */ + private String nodeCode; + + /** + * 流程节点名称 + */ + private String nodeName; + + /** + * 流程变量 + */ + private String variable; + + /** + * 流程状态(0待提交 1审批中 2 审批通过 3自动通过 8已完成 9已退回 10失效) + */ + private Integer flowStatus; + + /** + * 流程激活状态(0挂起 1激活) + */ + private Integer activityStatus; + + /** + * 创建者 + */ + private String createBy; + + /** + * 审批表单是否自定义(Y是 2否) + */ + private String formCustom; + + /** + * 审批表单是否自定义(Y是 2否) + */ + private String formPath; + + /** + * 扩展字段,预留给业务系统使用 + */ + private String ext; + + /** + * 流程定义版本 + */ + private String version; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 0ce330c20..304a37ceb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -1,11 +1,12 @@ package org.dromara.workflow.domain.vo; -import com.warm.flow.orm.entity.FlowTask; +import com.warm.flow.core.entity.User; import lombok.Data; import org.dromara.common.core.domain.dto.UserDTO; import java.io.Serial; import java.io.Serializable; +import java.util.Date; import java.util.List; /** @@ -14,16 +15,98 @@ import java.util.List; * @author may */ @Data -public class FlowTaskVo extends FlowTask implements Serializable { +public class FlowTaskVo implements Serializable { @Serial private static final long serialVersionUID = 1L; + private Long id; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 删除标记 + */ + private String delFlag; + + /** + * 对应flow_definition表的id + */ + private Long definitionId; + + /** + * 流程实例表id + */ + private Long instanceId; + + /** + * 流程名称 + */ + private String flowName; + + /** + * 业务id + */ + private String businessId; + + /** + * 节点编码 + */ + private String nodeCode; + + /** + * 节点名称 + */ + private String nodeName; + + /** + * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 权限标识 permissionFlag的list形式 + */ + private List permissionList; + + /** + * 流程用户列表 + */ + private List userList; + + /** + * 审批表单是否自定义(Y是 2否) + */ + private String formCustom; + + /** + * 审批表单 + */ + private String formPath; + /** * 流程定义编码 */ private String flowCode; + /** + * 流程版本号 + */ + private String version; + /** * 流程状态 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java new file mode 100644 index 000000000..6bb0f1ece --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwInstanceMapper.java @@ -0,0 +1,27 @@ +package org.dromara.workflow.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.workflow.domain.bo.FlowInstanceBo; +import org.dromara.workflow.domain.vo.FlowInstanceVo; + +/** + * 实例信息Mapper接口 + * + * @author may + * @date 2024-03-02 + */ +public interface FlwInstanceMapper { + /** + * 流程实例信息 + * + * @param page 分页 + * @param queryWrapper 条件 + * @return 结果 + */ + + Page page(@Param("page") Page page, + @Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java index b21bb15dc..a47a15690 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwInstanceService.java @@ -4,6 +4,7 @@ import com.warm.flow.core.entity.Instance; import com.warm.flow.orm.entity.FlowInstance; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.vo.FlowInstanceVo; import java.util.List; @@ -21,7 +22,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery); + TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery); /** * 分页查询已结束的流程实例 @@ -30,7 +31,7 @@ public interface IFlwInstanceService { * @param pageQuery 分页 * @return 结果 */ - TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery); + TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery); /** * 按照业务id查询流程实例 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 29fec5852..87fa0e45b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -1,8 +1,11 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.FlowFactory; import com.warm.flow.core.constant.ExceptionCons; import com.warm.flow.core.dto.FlowParams; @@ -15,7 +18,6 @@ import com.warm.flow.core.service.InsService; import com.warm.flow.core.service.NodeService; import com.warm.flow.core.service.TaskService; import com.warm.flow.core.utils.AssertUtil; -import com.warm.flow.core.utils.page.Page; import com.warm.flow.orm.entity.FlowInstance; import com.warm.flow.orm.mapper.FlowInstanceMapper; import lombok.RequiredArgsConstructor; @@ -23,6 +25,9 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.workflow.domain.bo.FlowInstanceBo; +import org.dromara.workflow.domain.vo.FlowInstanceVo; +import org.dromara.workflow.mapper.FlwInstanceMapper; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; @@ -45,6 +50,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { private final DefService defService; private final TaskService taskService; private final FlowInstanceMapper flowInstanceMapper; + private final FlwInstanceMapper flwInstanceMapper; /** * 分页查询正在运行的流程实例 @@ -53,12 +59,12 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { - Page page = Page.pageOf(pageQuery.getPageNum(), pageQuery.getPageSize()); - instance.setFlowStatus(FlowStatus.APPROVAL.getKey()); - page = insService.orderByCreateTime().desc().page(instance, page); - TableDataInfo build = TableDataInfo.build(); - build.setRows(page.getList()); + public TableDataInfo getPageByRunning(Instance instance, PageQuery pageQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("t.flow_status", FlowStatus.APPROVAL.getKey()); + Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); + TableDataInfo build = TableDataInfo.build(); + build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); build.setTotal(page.getTotal()); return build; } @@ -70,12 +76,12 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { * @param pageQuery 分页 */ @Override - public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { - Page page = Page.pageOf(pageQuery.getPageNum(), pageQuery.getPageSize()); - instance.setFlowStatus(FlowStatus.FINISHED.getKey()); - page = insService.orderByCreateTime().desc().page(instance, page); - TableDataInfo build = TableDataInfo.build(); - build.setRows(page.getList()); + public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("t.flow_status", FlowStatus.FINISHED.getKey()); + Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); + TableDataInfo build = TableDataInfo.build(); + build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); build.setTotal(page.getTotal()); return build; } @@ -136,10 +142,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { // 获取下一个节点,如果是网关节点,则重新获取后续节点 List nextNodes = FlowFactory.taskService().getNextByCheckGateWay(new FlowParams(), getFirstBetween(startNode)); Node node = nextNodes.get(0); - FlowParams flowParams = FlowParams.build() - .nodeCode(node.getNodeCode()) - .skipType(SkipType.PASS.getKey()) - .permissionFlag(WorkflowUtils.permissionList()); + FlowParams flowParams = FlowParams.build().nodeCode(node.getNodeCode()).skipType(SkipType.PASS.getKey()).permissionFlag(WorkflowUtils.permissionList()); taskService.skip(list.get(0).getId(), flowParams); } catch (Exception e) { throw new RuntimeException(e); @@ -148,10 +151,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { } private Node getFirstBetween(Node startNode) { - List skips = FlowFactory.skipService().list(FlowFactory.newSkip() - .setDefinitionId(startNode.getDefinitionId()).setNowNodeCode(startNode.getNodeCode())); + List skips = FlowFactory.skipService().list(FlowFactory.newSkip().setDefinitionId(startNode.getDefinitionId()).setNowNodeCode(startNode.getNodeCode())); Skip skip = skips.get(0); - return FlowFactory.nodeService().getOne(FlowFactory.newNode().setDefinitionId(startNode.getDefinitionId()) - .setNodeCode(skip.getNextNodeCode())); + return FlowFactory.nodeService().getOne(FlowFactory.newNode().setDefinitionId(startNode.getDefinitionId()).setNodeCode(skip.getNextNodeCode())); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml new file mode 100644 index 000000000..0836f981e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwInstanceMapper.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 9944da213..813186382 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -45,20 +45,7 @@ - - - - - - - - - - - - - - select*from ( SELECT distinct t.id, @@ -84,7 +71,7 @@ ${ew.getCustomSqlSegment} - select * from ( select t.id, @@ -111,7 +98,7 @@ from ( SELECT MAX(id) as id FROM flow_his_task - flow_status '10']]> + flow_status '10']]> and node_type = 1 AND approver in