feat(bpm): 新增流程定义精简列表接口

- 新增 /list-simple 接口,用于获取流程定义列表(前端下拉框使用)
- 实现流程定义精简列表的查询逻辑
- 添加相关数据结构和 Mapper 支持
- 优化部门权限查询逻辑
This commit is contained in:
furongxin 2024-10-26 23:52:46 +08:00
parent 439c8caa12
commit cf9fc3a65e
8 changed files with 148 additions and 19 deletions

View File

@ -2,20 +2,14 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.*;
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@ -51,6 +45,14 @@ public class BpmProcessDefinitionController {
return success(respVOS);
}
@PostMapping ("/list-simple")
@Operation(summary = "获得流程定义列表-前端下拉框使用")
public CommonResult<List<BpmProcessDefinitionSimpleVO>> getProcessDefinitionSimpleList(@RequestBody BpmProcessDefinitionListReqVO reqVO) {
List<BpmProcessDefinitionSimpleVO> respVOS = bpmDefinitionService.getProcessDefinitionSimpleList(reqVO);
return success(respVOS);
}
@GetMapping ("/get-bpmn-xml")
@Operation(summary = "获得流程定义的 BPMN XML")
@Parameter(name = "id", description = "编号", required = true, example = "1024")

View File

@ -5,6 +5,11 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 流程定义列表 Request VO")
@Data
@ -15,4 +20,10 @@ public class BpmProcessDefinitionListReqVO extends PageParam {
@Schema(description = "中断状态-参见 SuspensionState 枚举", example = "1")
private Integer suspensionState;
@Schema(description = "公司部门编号")
private Long deptId;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "流程定义VO")
@Data
public class BpmProcessDefinitionSimpleVO {
@Schema(description = "流程定义编号")
private String ProcessDefinitionId;
@Schema(description = "流程名称", example = "芋道")
private String name;
@Schema(description = "待处理任务数量")
private Integer todoCount;
}

View File

@ -1,10 +1,12 @@
package cn.iocoder.yudao.module.bpm.dal.mysql.definition;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionSimpleVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
@ -19,4 +21,8 @@ public interface BpmProcessDefinitionExtMapper extends BaseMapperX<BpmProcessDef
return selectOne("process_definition_id", processDefinitionId);
}
List<BpmProcessDefinitionSimpleVO> selectSimpleList(@Param("definitionIds") List<String> definitionIds,
@Param("deptIds") List<Long> deptIds,
@Param("createTime") LocalDateTime[] createTime,
@Param("userId") Long userId);
}

View File

@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.definition;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.*;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
import org.flowable.bpmn.model.BpmnModel;
@ -156,4 +153,11 @@ public interface BpmProcessDefinitionService {
* @return Bpmn 模型
*/
BpmnModel getBpmnModel(String processDefinitionId);
/**
* 获得流程定义精简列表
* @param reqVO 参数列表
* @return 流程定义列表
*/
List<BpmProcessDefinitionSimpleVO> getProcessDefinitionSimpleList(BpmProcessDefinitionListReqVO reqVO);
}

View File

@ -7,15 +7,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.*;
import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper;
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.BpmnModel;
@ -31,10 +29,12 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH;
import static java.util.Collections.emptyList;
@ -63,6 +63,9 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
@Resource
private BpmFormService formService;
@Resource
private DeptApi deptApi;
@Override
public ProcessDefinition getProcessDefinition(String id) {
return repositoryService.getProcessDefinition(id);
@ -119,6 +122,47 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
return repositoryService.getBpmnModel(processDefinitionId);
}
@Override
public List<BpmProcessDefinitionSimpleVO> getProcessDefinitionSimpleList(BpmProcessDefinitionListReqVO reqVO) {
// 拼接查询条件
ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), reqVO.getSuspensionState())) {
definitionQuery.suspended();
} else if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), reqVO.getSuspensionState())) {
definitionQuery.active();
}
/**添加租户ID**/
definitionQuery.processDefinitionTenantId(TenantContextHolder.getTenantId().toString()) ;
// 执行查询
List<ProcessDefinition> processDefinitions = definitionQuery.list();
if (CollUtil.isEmpty(processDefinitions)) {
return Collections.emptyList();
}
List<Long> deptIds = null;
// 获取所选公司下 所有子部门
if (reqVO.getDeptId() != null) {
deptIds = deptApi.getChildDeptList(reqVO.getDeptId()).getCheckedData();
}
// 获取流程定义编号集合
List<String> definitionIds = convertList(processDefinitions, ProcessDefinition::getId);
// 获取各流程待审核得数量
List<BpmProcessDefinitionSimpleVO> definitionCounts = processDefinitionMapper.selectSimpleList(definitionIds, deptIds, reqVO.getCreateTime(), getLoginUserId());
Map<String, BpmProcessDefinitionSimpleVO> mapCount = convertMap(definitionCounts, BpmProcessDefinitionSimpleVO::getProcessDefinitionId);
// 整合数据
return processDefinitions.stream()
.filter(item -> !item.getId().contains("work_task"))
.map(item -> new BpmProcessDefinitionSimpleVO()
.setName(item.getName())
.setProcessDefinitionId(item.getId())
.setTodoCount(Optional.ofNullable(mapCount.get(item.getId()).getTodoCount()).orElse(0)))
.collect(Collectors.toList());
}
@Override
public String createProcessDefinition(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) {
// 创建 Deployment 部署

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="selectSimpleList" resultType="cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionSimpleVO">
SELECT
a.process_definition_id AS ProcessDefinitionId,
count(*) AS todoCount
FROM
bpm_process_instance_ext a
INNER JOIN system_users u
ON u.id = a.start_user_id
<if test=" deptIds != null and deptIds.size > 0 ">
AND u.dept_id IN
<foreach collection="deptIds" item="deptId" index="index" open="(" close=")" separator=",">
#{deptId}
</foreach>
</if>
INNER JOIN bpm_task_ext b
ON a.process_instance_id = b.process_instance_id
AND b.result = 1
AND b.assignee_user_id = #{userId}
WHERE
a.process_definition_id IN
<foreach collection="definitionIds" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
<if test="createTime != null and createTime.length > 0">
AND a.create_time
<foreach collection="createTime" item="time" index="index" open="BETWEEN" close="" separator="AND">
#{time}
</foreach>
</if>
GROUP BY
a.process_definition_id
</select>
</mapper>

View File

@ -110,7 +110,7 @@ public class DeptApiImpl implements DeptApi {
@Override
@DataPermission(enable = false)
public CommonResult<List<Long>> getChildDeptList(Long deptId) {
List<DeptDO> deptDOS = deptService.getChildDeptList(deptId);
List<DeptDO> deptDOS = deptService.getChildDept(deptId);
if (CollectionUtil.isEmpty(deptDOS)) {
return success(Collections.emptyList());
}