Commit 86f568280aa373a1f7bda6ab2e4acf7fa3d635b3
1 parent
8f167864
feat: BPM-数据报表
Showing
5 changed files
with
25 additions
and
96 deletions
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
| @@ -109,26 +109,6 @@ public class BpmProcessInstanceController { | @@ -109,26 +109,6 @@ public class BpmProcessInstanceController { | ||
| 109 | processDefinitionMap, categoryMap, taskMap, userMap, deptMap, processDefinitionInfoMap)); | 109 | processDefinitionMap, categoryMap, taskMap, userMap, deptMap, processDefinitionInfoMap)); |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | - // TODO @lesan:貌似少提交了。ps:不确定和 getProcessInstanceManagerPage 接口的差异哈。 | ||
| 113 | -// @GetMapping("/report-page") | ||
| 114 | -// @Operation(summary = "获得流程实例报表的分页列表", description = "获得流程实例报表的分页列表") | ||
| 115 | -// public CommonResult<BpmProcessInstanceReportPageRespVO> getProcessInstanceReportPage( | ||
| 116 | -// @Valid BpmProcessInstanceReportPageReqVO pageReqVO) { | ||
| 117 | -// PageResult<HistoricProcessInstance> pageResult = processInstanceService.getProcessInstanceReportPage(pageReqVO); | ||
| 118 | -// if (CollUtil.isEmpty(pageResult.getList())) { | ||
| 119 | -// return success(new BpmProcessInstanceReportPageRespVO().setPageResult(PageResult.empty(pageResult.getTotal()))); | ||
| 120 | -// } | ||
| 121 | -// | ||
| 122 | -// // 拼接返回 | ||
| 123 | -// Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( | ||
| 124 | -// convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId()))); | ||
| 125 | -// BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( | ||
| 126 | -// pageReqVO.getProcessDefinitionId() | ||
| 127 | -// ); | ||
| 128 | -// return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceReportPage(pageResult, | ||
| 129 | -// userMap, processDefinitionInfo)); | ||
| 130 | -// } | ||
| 131 | - | ||
| 132 | @PostMapping("/create") | 112 | @PostMapping("/create") |
| 133 | @Operation(summary = "新建流程实例") | 113 | @Operation(summary = "新建流程实例") |
| 134 | @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") | 114 | @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageReqVO.java
| @@ -8,6 +8,7 @@ import lombok.Data; | @@ -8,6 +8,7 @@ import lombok.Data; | ||
| 8 | import org.springframework.format.annotation.DateTimeFormat; | 8 | import org.springframework.format.annotation.DateTimeFormat; |
| 9 | 9 | ||
| 10 | import java.time.LocalDateTime; | 10 | import java.time.LocalDateTime; |
| 11 | +import java.util.Map; | ||
| 11 | 12 | ||
| 12 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | 13 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| 13 | 14 | ||
| @@ -32,7 +33,14 @@ public class BpmProcessInstancePageReqVO extends PageParam { | @@ -32,7 +33,14 @@ public class BpmProcessInstancePageReqVO extends PageParam { | ||
| 32 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | 33 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| 33 | private LocalDateTime[] createTime; | 34 | private LocalDateTime[] createTime; |
| 34 | 35 | ||
| 36 | + @Schema(description = "结束时间") | ||
| 37 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||
| 38 | + private LocalDateTime[] endTime; | ||
| 39 | + | ||
| 35 | @Schema(description = "发起用户编号", example = "1024") | 40 | @Schema(description = "发起用户编号", example = "1024") |
| 36 | private Long startUserId; // 注意,只有在【流程实例】菜单,才使用该参数 | 41 | private Long startUserId; // 注意,只有在【流程实例】菜单,才使用该参数 |
| 37 | 42 | ||
| 43 | + @Schema(description = "动态表单字段查询JSON Str", example = "{}") | ||
| 44 | + private String formFieldsParams; | ||
| 45 | + | ||
| 38 | } | 46 | } |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java
| @@ -80,46 +80,12 @@ public interface BpmProcessInstanceConvert { | @@ -80,46 +80,12 @@ public interface BpmProcessInstanceConvert { | ||
| 80 | // 摘要 | 80 | // 摘要 |
| 81 | respVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(respVO.getProcessDefinitionId()), | 81 | respVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(respVO.getProcessDefinitionId()), |
| 82 | pageResult.getList().get(i).getProcessVariables())); | 82 | pageResult.getList().get(i).getProcessVariables())); |
| 83 | + // 表单 | ||
| 84 | + respVO.setFormVariables(pageResult.getList().get(i).getProcessVariables()); | ||
| 83 | } | 85 | } |
| 84 | return vpPageResult; | 86 | return vpPageResult; |
| 85 | } | 87 | } |
| 86 | 88 | ||
| 87 | -// default BpmProcessInstanceReportPageRespVO buildProcessInstanceReportPage(PageResult<HistoricProcessInstance> pageResult, | ||
| 88 | -// Map<Long, AdminUserRespDTO> userMap, | ||
| 89 | -// BpmProcessDefinitionInfoDO processDefinitionInfo) { | ||
| 90 | -// PageResult<BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO> vpPageResult = BeanUtils.toBean(pageResult, | ||
| 91 | -// BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO.class); | ||
| 92 | -// // 表单列表 | ||
| 93 | -// List<BpmFormFieldVO> formFieldsList = new ArrayList<>(); | ||
| 94 | -// processDefinitionInfo.getFormFields().forEach(formFieldStr -> { | ||
| 95 | -// BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); | ||
| 96 | -// if (formField != null) { | ||
| 97 | -// formFieldsList.add(formField); | ||
| 98 | -// } | ||
| 99 | -// }); | ||
| 100 | -// for (int i = 0; i < pageResult.getList().size(); i++) { | ||
| 101 | -// HistoricProcessInstance historicProcessInstance = pageResult.getList().get(i); | ||
| 102 | -// BpmProcessInstanceReportPageRespVO.BpmProcessInstanceReportRespVO respVO = vpPageResult.getList().get(i); | ||
| 103 | -// respVO.setStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance)); | ||
| 104 | -// // user | ||
| 105 | -// if (userMap != null) { | ||
| 106 | -// AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(historicProcessInstance.getStartUserId())); | ||
| 107 | -// if (startUser != null) { | ||
| 108 | -// respVO.setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); | ||
| 109 | -// } | ||
| 110 | -// } | ||
| 111 | -// // 表单数据 | ||
| 112 | -// List<KeyValue<String, Object>> variables = new ArrayList<>(); | ||
| 113 | -// formFieldsList.forEach(formField -> { | ||
| 114 | -// variables.add(new KeyValue<String, Object>() | ||
| 115 | -// .setKey(formField.getField()) | ||
| 116 | -// .setValue(historicProcessInstance.getProcessVariables().getOrDefault(formField.getField(), ""))); | ||
| 117 | -// }); | ||
| 118 | -// respVO.setVariables(variables); | ||
| 119 | -// } | ||
| 120 | -// return new BpmProcessInstanceReportPageRespVO().setPageResult(vpPageResult).setFormFields(formFieldsList); | ||
| 121 | -// } | ||
| 122 | - | ||
| 123 | default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance, | 89 | default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance, |
| 124 | ProcessDefinition processDefinition, | 90 | ProcessDefinition processDefinition, |
| 125 | BpmProcessDefinitionInfoDO processDefinitionInfo, | 91 | BpmProcessDefinitionInfoDO processDefinitionInfo, |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java
| @@ -84,8 +84,6 @@ public interface BpmProcessInstanceService { | @@ -84,8 +84,6 @@ 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 | - | ||
| 89 | // TODO @芋艿:重点在 review 下 | 87 | // TODO @芋艿:重点在 review 下 |
| 90 | /** | 88 | /** |
| 91 | * 获取审批详情。 | 89 | * 获取审批详情。 |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
| @@ -7,6 +7,7 @@ import cn.hutool.core.lang.Assert; | @@ -7,6 +7,7 @@ import cn.hutool.core.lang.Assert; | ||
| 7 | import cn.hutool.core.util.ArrayUtil; | 7 | import cn.hutool.core.util.ArrayUtil; |
| 8 | import cn.hutool.core.util.ObjectUtil; | 8 | import cn.hutool.core.util.ObjectUtil; |
| 9 | import cn.hutool.core.util.StrUtil; | 9 | import cn.hutool.core.util.StrUtil; |
| 10 | +import cn.hutool.json.JSONObject; | ||
| 10 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 11 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 11 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; | 12 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; |
| 12 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | 13 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| @@ -170,6 +171,20 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -170,6 +171,20 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 170 | processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); | 171 | processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); |
| 171 | processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); | 172 | processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); |
| 172 | } | 173 | } |
| 174 | + if (ArrayUtil.isNotEmpty(pageReqVO.getEndTime())) { | ||
| 175 | + processInstanceQuery.finishedAfter(DateUtils.of(pageReqVO.getEndTime()[0])); | ||
| 176 | + processInstanceQuery.finishedBefore(DateUtils.of(pageReqVO.getEndTime()[1])); | ||
| 177 | + } | ||
| 178 | + // 表单字段查询 | ||
| 179 | + // TODO 应支持多种类型的查询方式,目前只有字符串全等 | ||
| 180 | + if (StrUtil.isNotEmpty(pageReqVO.getFormFieldsParams())) { | ||
| 181 | + JSONObject formFieldsParams = new JSONObject(pageReqVO.getFormFieldsParams()); | ||
| 182 | + for (Map.Entry<String, Object> field : formFieldsParams.entrySet()) { | ||
| 183 | + if (StrUtil.isNotEmpty(field.getValue().toString())) { | ||
| 184 | + processInstanceQuery.variableValueEquals(field.getKey(), field.getValue()); | ||
| 185 | + } | ||
| 186 | + } | ||
| 187 | + } | ||
| 173 | // 查询数量 | 188 | // 查询数量 |
| 174 | long processInstanceCount = processInstanceQuery.count(); | 189 | long processInstanceCount = processInstanceQuery.count(); |
| 175 | if (processInstanceCount == 0) { | 190 | if (processInstanceCount == 0) { |
| @@ -180,44 +195,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -180,44 +195,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 180 | return new PageResult<>(processInstanceList, processInstanceCount); | 195 | return new PageResult<>(processInstanceList, processInstanceCount); |
| 181 | } | 196 | } |
| 182 | 197 | ||
| 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 | -// } | ||
| 220 | - | ||
| 221 | private Map<String, String> getFormFieldsPermission(BpmnModel bpmnModel, | 198 | private Map<String, String> getFormFieldsPermission(BpmnModel bpmnModel, |
| 222 | String activityId, String taskId) { | 199 | String activityId, String taskId) { |
| 223 | // 1. 获取流程活动编号。流程活动 Id 为空事,从流程任务中获取流程活动 Id | 200 | // 1. 获取流程活动编号。流程活动 Id 为空事,从流程任务中获取流程活动 Id |