Commit 86f568280aa373a1f7bda6ab2e4acf7fa3d635b3

Authored by LesanOuO
1 parent 8f167864

feat: BPM-数据报表

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