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 | 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) { | ... | ... |