Commit 623a41d48c874cdc95498d92091bdb10fd7f013d
Committed by
Gitee
!1215 feat: BPM-报表
Merge pull request !1215 from Lesan/feature/bpm-报表
Showing
4 changed files
with
99 additions
and
4 deletions
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,6 +109,25 @@ public class BpmProcessInstanceController { | ||
| 109 | processDefinitionMap, categoryMap, taskMap, userMap, deptMap, processDefinitionInfoMap)); | 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 | @PostMapping("/create") | 131 | @PostMapping("/create") |
| 113 | @Operation(summary = "新建流程实例") | 132 | @Operation(summary = "新建流程实例") |
| 114 | @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") | 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,16 +2,20 @@ package cn.iocoder.yudao.module.bpm.convert.task; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.util.StrUtil; | 4 | import cn.hutool.core.util.StrUtil; |
| 5 | +import cn.iocoder.yudao.framework.common.core.KeyValue; | ||
| 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | 7 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| 7 | import cn.iocoder.yudao.framework.common.util.collection.SetUtils; | 8 | import cn.iocoder.yudao.framework.common.util.collection.SetUtils; |
| 9 | +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||
| 8 | import cn.iocoder.yudao.framework.common.util.number.NumberUtils; | 10 | import cn.iocoder.yudao.framework.common.util.number.NumberUtils; |
| 9 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 11 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 10 | import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; | 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 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; | 14 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; |
| 12 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; | 15 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; |
| 13 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO; | 16 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO; |
| 14 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceBpmnModelViewRespVO; | 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 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; | 19 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; |
| 16 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; | 20 | import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; |
| 17 | import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert; | 21 | import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert; |
| @@ -35,10 +39,7 @@ import org.mapstruct.Mapping; | @@ -35,10 +39,7 @@ import org.mapstruct.Mapping; | ||
| 35 | import org.mapstruct.MappingTarget; | 39 | import org.mapstruct.MappingTarget; |
| 36 | import org.mapstruct.factory.Mappers; | 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 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | 44 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| 44 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | 45 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| @@ -84,6 +85,42 @@ public interface BpmProcessInstanceConvert { | @@ -84,6 +85,42 @@ public interface BpmProcessInstanceConvert { | ||
| 84 | return vpPageResult; | 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 | default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance, | 124 | default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance, |
| 88 | ProcessDefinition processDefinition, | 125 | ProcessDefinition processDefinition, |
| 89 | BpmProcessDefinitionInfoDO processDefinitionInfo, | 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,6 +84,8 @@ public interface BpmProcessInstanceService { | ||
| 84 | PageResult<HistoricProcessInstance> getProcessInstancePage(Long userId, | 84 | PageResult<HistoricProcessInstance> getProcessInstancePage(Long userId, |
| 85 | @Valid BpmProcessInstancePageReqVO pageReqVO); | 85 | @Valid BpmProcessInstancePageReqVO pageReqVO); |
| 86 | 86 | ||
| 87 | + PageResult<HistoricProcessInstance> getProcessInstanceReportPage(@Valid BpmProcessInstanceReportPageReqVO pageReqVO); | ||
| 88 | + | ||
| 87 | // TODO @芋艿:重点在 review 下 | 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,6 +180,43 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 180 | return new PageResult<>(processInstanceList, processInstanceCount); | 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 | private Map<String, String> getFormFieldsPermission(BpmnModel bpmnModel, | 221 | private Map<String, String> getFormFieldsPermission(BpmnModel bpmnModel, |
| 185 | String activityId, String taskId) { | 222 | String activityId, String taskId) { |