feat(bpm): 新增流程定义精简列表接口
- 新增 /list-simple 接口,用于获取流程定义列表(前端下拉框使用) - 实现流程定义精简列表的查询逻辑 - 添加相关数据结构和 Mapper 支持 - 优化部门权限查询逻辑
This commit is contained in:
parent
439c8caa12
commit
cf9fc3a65e
@ -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.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.*;
|
||||||
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.service.definition.BpmProcessDefinitionService;
|
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -51,6 +45,14 @@ public class BpmProcessDefinitionController {
|
|||||||
return success(respVOS);
|
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")
|
@GetMapping ("/get-bpmn-xml")
|
||||||
@Operation(summary = "获得流程定义的 BPMN XML")
|
@Operation(summary = "获得流程定义的 BPMN XML")
|
||||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||||
|
@ -5,6 +5,11 @@ import io.swagger.v3.oas.annotations.media.Schema;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.ToString;
|
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")
|
@Schema(description = "管理后台 - 流程定义列表 Request VO")
|
||||||
@Data
|
@Data
|
||||||
@ -15,4 +20,10 @@ public class BpmProcessDefinitionListReqVO extends PageParam {
|
|||||||
@Schema(description = "中断状态-参见 SuspensionState 枚举", example = "1")
|
@Schema(description = "中断状态-参见 SuspensionState 枚举", example = "1")
|
||||||
private Integer suspensionState;
|
private Integer suspensionState;
|
||||||
|
|
||||||
|
@Schema(description = "公司部门编号")
|
||||||
|
private Long deptId;
|
||||||
|
|
||||||
|
@Schema(description = "创建时间")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
|
private LocalDateTime[] createTime;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
@ -1,10 +1,12 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.dal.mysql.definition;
|
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.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.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -19,4 +21,8 @@ public interface BpmProcessDefinitionExtMapper extends BaseMapperX<BpmProcessDef
|
|||||||
return selectOne("process_definition_id", processDefinitionId);
|
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);
|
||||||
}
|
}
|
||||||
|
@ -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.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
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.*;
|
||||||
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.dal.dataobject.definition.BpmProcessDefinitionExtDO;
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
|
||||||
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
|
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
|
||||||
import org.flowable.bpmn.model.BpmnModel;
|
import org.flowable.bpmn.model.BpmnModel;
|
||||||
@ -156,4 +153,11 @@ public interface BpmProcessDefinitionService {
|
|||||||
* @return Bpmn 模型
|
* @return Bpmn 模型
|
||||||
*/
|
*/
|
||||||
BpmnModel getBpmnModel(String processDefinitionId);
|
BpmnModel getBpmnModel(String processDefinitionId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得流程定义精简列表
|
||||||
|
* @param reqVO 参数列表
|
||||||
|
* @return 流程定义列表
|
||||||
|
*/
|
||||||
|
List<BpmProcessDefinitionSimpleVO> getProcessDefinitionSimpleList(BpmProcessDefinitionListReqVO reqVO);
|
||||||
}
|
}
|
||||||
|
@ -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.common.util.object.PageUtils;
|
||||||
import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils;
|
import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils;
|
||||||
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
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.*;
|
||||||
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.convert.definition.BpmProcessDefinitionConvert;
|
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.BpmFormDO;
|
||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
|
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.dal.mysql.definition.BpmProcessDefinitionExtMapper;
|
||||||
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
|
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 lombok.extern.slf4j.Slf4j;
|
||||||
import org.flowable.bpmn.converter.BpmnXMLConverter;
|
import org.flowable.bpmn.converter.BpmnXMLConverter;
|
||||||
import org.flowable.bpmn.model.BpmnModel;
|
import org.flowable.bpmn.model.BpmnModel;
|
||||||
@ -31,10 +29,12 @@ import org.springframework.validation.annotation.Validated;
|
|||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import java.util.*;
|
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.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
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.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_KEY_NOT_MATCH;
|
||||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH;
|
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH;
|
||||||
import static java.util.Collections.emptyList;
|
import static java.util.Collections.emptyList;
|
||||||
@ -63,6 +63,9 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
|||||||
@Resource
|
@Resource
|
||||||
private BpmFormService formService;
|
private BpmFormService formService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DeptApi deptApi;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ProcessDefinition getProcessDefinition(String id) {
|
public ProcessDefinition getProcessDefinition(String id) {
|
||||||
return repositoryService.getProcessDefinition(id);
|
return repositoryService.getProcessDefinition(id);
|
||||||
@ -119,6 +122,47 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
|||||||
return repositoryService.getBpmnModel(processDefinitionId);
|
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
|
@Override
|
||||||
public String createProcessDefinition(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) {
|
public String createProcessDefinition(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) {
|
||||||
// 创建 Deployment 部署
|
// 创建 Deployment 部署
|
||||||
|
@ -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>
|
@ -110,7 +110,7 @@ public class DeptApiImpl implements DeptApi {
|
|||||||
@Override
|
@Override
|
||||||
@DataPermission(enable = false)
|
@DataPermission(enable = false)
|
||||||
public CommonResult<List<Long>> getChildDeptList(Long deptId) {
|
public CommonResult<List<Long>> getChildDeptList(Long deptId) {
|
||||||
List<DeptDO> deptDOS = deptService.getChildDeptList(deptId);
|
List<DeptDO> deptDOS = deptService.getChildDept(deptId);
|
||||||
if (CollectionUtil.isEmpty(deptDOS)) {
|
if (CollectionUtil.isEmpty(deptDOS)) {
|
||||||
return success(Collections.emptyList());
|
return success(Collections.emptyList());
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user