Kaynağa Gözat

feat: BPM-报表

LesanOuO 6 ay önce
ebeveyn
işleme
3342ae1be8

+ 19 - 0
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 {
                 processDefinitionMap, categoryMap, taskMap, userMap, deptMap, processDefinitionInfoMap));
     }
 
+    @GetMapping("/report-page")
+    @Operation(summary = "获得流程实例报表的分页列表", description = "获得流程实例报表的分页列表")
+    public CommonResult<BpmProcessInstanceReportPageRespVO> getProcessInstanceReportPage(
+            @Valid BpmProcessInstanceReportPageReqVO pageReqVO) {
+        PageResult<HistoricProcessInstance> pageResult = processInstanceService.getProcessInstanceReportPage(pageReqVO);
+        if (CollUtil.isEmpty(pageResult.getList())) {
+            return success(new BpmProcessInstanceReportPageRespVO().setPageResult(PageResult.empty(pageResult.getTotal())));
+        }
+
+        // 拼接返回
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+                convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId())));
+        BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(
+                pageReqVO.getProcessDefinitionId()
+        );
+        return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceReportPage(pageResult,
+                userMap, processDefinitionInfo));
+    }
+
     @PostMapping("/create")
     @Operation(summary = "新建流程实例")
     @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")

+ 41 - 4
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;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.core.KeyValue;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
+import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormFieldVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceBpmnModelViewRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceReportPageRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
 import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert;
@@ -35,10 +39,7 @@ import org.mapstruct.Mapping;
 import org.mapstruct.MappingTarget;
 import org.mapstruct.factory.Mappers;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -84,6 +85,42 @@ public interface BpmProcessInstanceConvert {
         return vpPageResult;
     }
 
+    default BpmProcessInstanceReportPageRespVO buildProcessInstanceReportPage(PageResult<HistoricProcessInstance> pageResult,
+                                                                              Map<Long, AdminUserRespDTO> userMap,
+                                                                              BpmProcessDefinitionInfoDO processDefinitionInfo) {
+        PageResult<BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO> vpPageResult = BeanUtils.toBean(pageResult,
+                BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO.class);
+        // 表单列表
+        List<BpmFormFieldVO> formFieldsList = new ArrayList<>();
+        processDefinitionInfo.getFormFields().forEach(formFieldStr -> {
+            BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class);
+            if (formField != null) {
+                formFieldsList.add(formField);
+            }
+        });
+        for (int i = 0; i < pageResult.getList().size(); i++) {
+            HistoricProcessInstance historicProcessInstance = pageResult.getList().get(i);
+            BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO respVO = vpPageResult.getList().get(i);
+            respVO.setStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance));
+            // user
+            if (userMap != null) {
+                AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(historicProcessInstance.getStartUserId()));
+                if (startUser != null) {
+                    respVO.setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class));
+                }
+            }
+            // 表单数据
+            List<KeyValue<String, Object>> variables = new ArrayList<>();
+            formFieldsList.forEach(formField -> {
+                variables.add(new KeyValue<String, Object>()
+                        .setKey(formField.getField())
+                        .setValue(historicProcessInstance.getProcessVariables().getOrDefault(formField.getField(), "")));
+            });
+            respVO.setVariables(variables);
+        }
+        return new BpmProcessInstanceReportPageRespVO().setPageResult(vpPageResult).setFormFields(formFieldsList);
+    }
+
     default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance,
                                                           ProcessDefinition processDefinition,
                                                           BpmProcessDefinitionInfoDO processDefinitionInfo,

+ 2 - 0
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 {
     PageResult<HistoricProcessInstance> getProcessInstancePage(Long userId,
                                                                @Valid BpmProcessInstancePageReqVO pageReqVO);
 
+    PageResult<HistoricProcessInstance> getProcessInstanceReportPage(@Valid BpmProcessInstanceReportPageReqVO pageReqVO);
+
     // TODO @芋艿:重点在 review 下
     /**
      * 获取审批详情。

+ 37 - 0
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
         return new PageResult<>(processInstanceList, processInstanceCount);
     }
 
+    @Override
+    public PageResult<HistoricProcessInstance> getProcessInstanceReportPage(BpmProcessInstanceReportPageReqVO pageReqVO) {
+        // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页
+        HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery()
+                .includeProcessVariables()
+                .processInstanceTenantId(FlowableUtils.getTenantId())
+                .orderByProcessInstanceStartTime().desc();
+        if (pageReqVO.getStartUserId() != null) {
+            processInstanceQuery.startedBy(String.valueOf(pageReqVO.getStartUserId()));
+        }
+        if (StrUtil.isNotEmpty(pageReqVO.getName())) {
+            processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%");
+        }
+        if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionKey())) {
+            processInstanceQuery.processDefinitionKey(pageReqVO.getProcessDefinitionKey());
+        }
+        if (pageReqVO.getStatus() != null) {
+            processInstanceQuery.variableValueEquals(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, pageReqVO.getStatus());
+        }
+        if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) {
+            processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0]));
+            processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1]));
+        }
+        if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) {
+            processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0]));
+            processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1]));
+        }
+        // TODO 流程表单数据也要支持查询
+        // 查询数量
+        long processInstanceCount = processInstanceQuery.count();
+        if (processInstanceCount == 0) {
+            return PageResult.empty(processInstanceCount);
+        }
+        // 查询列表
+        List<HistoricProcessInstance> processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), pageReqVO.getPageSize());
+        return new PageResult<>(processInstanceList, processInstanceCount);
+    }
 
     private Map<String, String> getFormFieldsPermission(BpmnModel bpmnModel,
                                                         String activityId, String taskId) {