Commit 623a41d48c874cdc95498d92091bdb10fd7f013d

Authored by 芋道源码
Committed by Gitee
2 parents 1ae51bde 3342ae1b

!1215 feat: BPM-报表

Merge pull request !1215 from Lesan/feature/bpm-报表
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
... ... @@ -109,6 +109,25 @@ public class BpmProcessInstanceController {
109 109 processDefinitionMap, categoryMap, taskMap, userMap, deptMap, processDefinitionInfoMap));
110 110 }
111 111  
  112 + @GetMapping("/report-page")
  113 + @Operation(summary = "获得流程实例报表的分页列表", description = "获得流程实例报表的分页列表")
  114 + public CommonResult<BpmProcessInstanceReportPageRespVO> getProcessInstanceReportPage(
  115 + @Valid BpmProcessInstanceReportPageReqVO pageReqVO) {
  116 + PageResult<HistoricProcessInstance> pageResult = processInstanceService.getProcessInstanceReportPage(pageReqVO);
  117 + if (CollUtil.isEmpty(pageResult.getList())) {
  118 + return success(new BpmProcessInstanceReportPageRespVO().setPageResult(PageResult.empty(pageResult.getTotal())));
  119 + }
  120 +
  121 + // 拼接返回
  122 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
  123 + convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId())));
  124 + BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(
  125 + pageReqVO.getProcessDefinitionId()
  126 + );
  127 + return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceReportPage(pageResult,
  128 + userMap, processDefinitionInfo));
  129 + }
  130 +
112 131 @PostMapping("/create")
113 132 @Operation(summary = "新建流程实例")
114 133 @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java
... ... @@ -2,16 +2,20 @@ package cn.iocoder.yudao.module.bpm.convert.task;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.framework.common.core.KeyValue;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 7 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
7 8 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
  9 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
8 10 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
9 11 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
10 12 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
  13 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormFieldVO;
11 14 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
12 15 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
13 16 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO;
14 17 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceBpmnModelViewRespVO;
  18 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceReportPageRespVO;
15 19 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
16 20 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
17 21 import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert;
... ... @@ -35,10 +39,7 @@ import org.mapstruct.Mapping;
35 39 import org.mapstruct.MappingTarget;
36 40 import org.mapstruct.factory.Mappers;
37 41  
38   -import java.util.HashSet;
39   -import java.util.List;
40   -import java.util.Map;
41   -import java.util.Set;
  42 +import java.util.*;
42 43  
43 44 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
44 45 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
... ... @@ -84,6 +85,42 @@ public interface BpmProcessInstanceConvert {
84 85 return vpPageResult;
85 86 }
86 87  
  88 + default BpmProcessInstanceReportPageRespVO buildProcessInstanceReportPage(PageResult<HistoricProcessInstance> pageResult,
  89 + Map<Long, AdminUserRespDTO> userMap,
  90 + BpmProcessDefinitionInfoDO processDefinitionInfo) {
  91 + PageResult<BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO> vpPageResult = BeanUtils.toBean(pageResult,
  92 + BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO.class);
  93 + // 表单列表
  94 + List<BpmFormFieldVO> formFieldsList = new ArrayList<>();
  95 + processDefinitionInfo.getFormFields().forEach(formFieldStr -> {
  96 + BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class);
  97 + if (formField != null) {
  98 + formFieldsList.add(formField);
  99 + }
  100 + });
  101 + for (int i = 0; i < pageResult.getList().size(); i++) {
  102 + HistoricProcessInstance historicProcessInstance = pageResult.getList().get(i);
  103 + BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO respVO = vpPageResult.getList().get(i);
  104 + respVO.setStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance));
  105 + // user
  106 + if (userMap != null) {
  107 + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(historicProcessInstance.getStartUserId()));
  108 + if (startUser != null) {
  109 + respVO.setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class));
  110 + }
  111 + }
  112 + // 表单数据
  113 + List<KeyValue<String, Object>> variables = new ArrayList<>();
  114 + formFieldsList.forEach(formField -> {
  115 + variables.add(new KeyValue<String, Object>()
  116 + .setKey(formField.getField())
  117 + .setValue(historicProcessInstance.getProcessVariables().getOrDefault(formField.getField(), "")));
  118 + });
  119 + respVO.setVariables(variables);
  120 + }
  121 + return new BpmProcessInstanceReportPageRespVO().setPageResult(vpPageResult).setFormFields(formFieldsList);
  122 + }
  123 +
87 124 default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance,
88 125 ProcessDefinition processDefinition,
89 126 BpmProcessDefinitionInfoDO processDefinitionInfo,
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java
... ... @@ -84,6 +84,8 @@ public interface BpmProcessInstanceService {
84 84 PageResult<HistoricProcessInstance> getProcessInstancePage(Long userId,
85 85 @Valid BpmProcessInstancePageReqVO pageReqVO);
86 86  
  87 + PageResult<HistoricProcessInstance> getProcessInstanceReportPage(@Valid BpmProcessInstanceReportPageReqVO pageReqVO);
  88 +
87 89 // TODO @芋艿:重点在 review 下
88 90 /**
89 91 * 获取审批详情。
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
... ... @@ -180,6 +180,43 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
180 180 return new PageResult<>(processInstanceList, processInstanceCount);
181 181 }
182 182  
  183 + @Override
  184 + public PageResult<HistoricProcessInstance> getProcessInstanceReportPage(BpmProcessInstanceReportPageReqVO pageReqVO) {
  185 + // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页
  186 + HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery()
  187 + .includeProcessVariables()
  188 + .processInstanceTenantId(FlowableUtils.getTenantId())
  189 + .orderByProcessInstanceStartTime().desc();
  190 + if (pageReqVO.getStartUserId() != null) {
  191 + processInstanceQuery.startedBy(String.valueOf(pageReqVO.getStartUserId()));
  192 + }
  193 + if (StrUtil.isNotEmpty(pageReqVO.getName())) {
  194 + processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%");
  195 + }
  196 + if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionKey())) {
  197 + processInstanceQuery.processDefinitionKey(pageReqVO.getProcessDefinitionKey());
  198 + }
  199 + if (pageReqVO.getStatus() != null) {
  200 + processInstanceQuery.variableValueEquals(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, pageReqVO.getStatus());
  201 + }
  202 + if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) {
  203 + processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0]));
  204 + processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1]));
  205 + }
  206 + if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) {
  207 + processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0]));
  208 + processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1]));
  209 + }
  210 + // TODO 流程表单数据也要支持查询
  211 + // 查询数量
  212 + long processInstanceCount = processInstanceQuery.count();
  213 + if (processInstanceCount == 0) {
  214 + return PageResult.empty(processInstanceCount);
  215 + }
  216 + // 查询列表
  217 + List<HistoricProcessInstance> processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), pageReqVO.getPageSize());
  218 + return new PageResult<>(processInstanceList, processInstanceCount);
  219 + }
183 220  
184 221 private Map<String, String> getFormFieldsPermission(BpmnModel bpmnModel,
185 222 String activityId, String taskId) {
... ...