Commit 1ae51bde208036d5191194e40149e577a8e1780d

Authored by 芋道源码
Committed by Gitee
2 parents d63e3158 f409a67d

!1213 代码审查修改

Merge pull request !1213 from Lesan/feature/bpm-代码审查
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java
... ... @@ -32,6 +32,7 @@ public enum BpmReasonEnum {
32 32 ASSIGN_EMPTY_REJECT("审批人为空,自动不通过"),
33 33 APPROVE_TYPE_AUTO_APPROVE("非人工审核,自动通过"),
34 34 APPROVE_TYPE_AUTO_REJECT("非人工审核,自动不通过"),
  35 + CANCEL_BY_PROCESS_CLEAN("进程清理自动取消"),
35 36 ;
36 37  
37 38 private final String reason;
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java
... ... @@ -9,7 +9,10 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
9 9 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
10 10 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.cc.BpmProcessInstanceCopyRespVO;
11 11 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO;
  12 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
12 13 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO;
  14 +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
  15 +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
13 16 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceCopyService;
14 17 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
15 18 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
... ... @@ -42,6 +45,8 @@ public class BpmProcessInstanceCopyController {
42 45 private BpmProcessInstanceCopyService processInstanceCopyService;
43 46 @Resource
44 47 private BpmProcessInstanceService processInstanceService;
  48 + @Resource
  49 + private BpmProcessDefinitionService processDefinitionService;
45 50  
46 51 @Resource
47 52 private AdminUserApi adminUserApi;
... ... @@ -62,6 +67,8 @@ public class BpmProcessInstanceCopyController {
62 67 convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId));
63 68 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(pageResult.getList(),
64 69 copy -> Stream.of(copy.getStartUserId(), Long.parseLong(copy.getCreator()))));
  70 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(
  71 + convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessDefinitionId));
65 72 return success(convertPage(pageResult, copy -> {
66 73 BpmProcessInstanceCopyRespVO copyVO = BeanUtils.toBean(copy, BpmProcessInstanceCopyRespVO.class);
67 74 MapUtils.findAndThen(userMap, Long.valueOf(copy.getCreator()),
... ... @@ -69,7 +76,12 @@ public class BpmProcessInstanceCopyController {
69 76 MapUtils.findAndThen(userMap, copy.getStartUserId(),
70 77 user -> copyVO.setCreateUser(BeanUtils.toBean(user, UserSimpleBaseVO.class)));
71 78 MapUtils.findAndThen(processInstanceMap, copyVO.getProcessInstanceId(),
72   - processInstance -> copyVO.setProcessInstanceStartTime(DateUtils.of(processInstance.getStartTime())));
  79 + processInstance -> {
  80 + copyVO.setSummary(FlowableUtils.getSummary(
  81 + processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()),
  82 + processInstance.getProcessVariables()));
  83 + copyVO.setProcessInstanceStartTime(DateUtils.of(processInstance.getStartTime()));
  84 + });
73 85 return copyVO;
74 86 }));
75 87 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/cc/BpmProcessInstanceCopyRespVO.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.cc;
2 2  
  3 +import cn.iocoder.yudao.framework.common.core.KeyValue;
3 4 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
4 5 import io.swagger.v3.oas.annotations.media.Schema;
5 6 import lombok.Data;
6 7  
7 8 import java.time.LocalDateTime;
  9 +import java.util.List;
8 10  
9 11 @Schema(description = "管理后台 - 流程实例抄送的分页 Item Response VO")
10 12 @Data
... ... @@ -40,4 +42,7 @@ public class BpmProcessInstanceCopyRespVO {
40 42 @Schema(description = "抄送时间", requiredMode = Schema.RequiredMode.REQUIRED)
41 43 private LocalDateTime createTime;
42 44  
  45 + @Schema(description = "流程摘要", example = "[]")
  46 + private List<KeyValue<String, String>> summary;
  47 +
43 48 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java
... ... @@ -85,10 +85,6 @@ public class BpmTaskRespVO {
85 85 @Schema(description = "是否填写审批意见", example = "false")
86 86 private Boolean reasonRequire;
87 87  
88   - // TODO @lesan:要不放到 processInstance 里面?因为摘要是流程实例的,不是流程任务的
89   - @Schema(description = "流程摘要", example = "[]")
90   - private List<KeyValue<String, String>> summary; // 只有流程表单,才有摘要!
91   -
92 88 @Data
93 89 @Schema(description = "流程实例")
94 90 public static class ProcessInstance {
... ... @@ -105,6 +101,9 @@ public class BpmTaskRespVO {
105 101 @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
106 102 private String processDefinitionId;
107 103  
  104 + @Schema(description = "流程摘要", example = "[]")
  105 + private List<KeyValue<String, String>> summary; // 只有流程表单,才有摘要!
  106 +
108 107 /**
109 108 * 发起人的用户信息
110 109 */
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java
... ... @@ -54,7 +54,7 @@ public interface BpmTaskConvert {
54 54 AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
55 55 taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class));
56 56 // 摘要
57   - taskVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()),
  57 + taskVO.getProcessInstance().setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()),
58 58 processInstance.getProcessVariables()));
59 59 });
60 60 }
... ... @@ -80,7 +80,7 @@ public interface BpmTaskConvert {
80 80 taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
81 81 taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class));
82 82 // 摘要
83   - taskVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()),
  83 + taskVO.getProcessInstance().setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()),
84 84 processInstance.getProcessVariables()));
85 85 }
86 86 return taskVO;
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceCopyDO.java
... ... @@ -50,6 +50,12 @@ public class BpmProcessInstanceCopyDO extends BaseDO {
50 50 */
51 51 private String processInstanceId;
52 52 /**
  53 + * 流程实例的流程定义编号
  54 + *
  55 + * 关联 ProcessInstance 的 processDefinitionId 属性
  56 + */
  57 + private String processDefinitionId;
  58 + /**
53 59 * 流程分类
54 60 *
55 61 * 冗余 ProcessInstance 的 category 字段
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java
... ... @@ -27,6 +27,8 @@ import org.flowable.task.api.TaskInfo;
27 27 import java.util.*;
28 28 import java.util.concurrent.Callable;
29 29  
  30 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  31 +
30 32 /**
31 33 * Flowable 相关的工具方法
32 34 *
... ... @@ -193,7 +195,6 @@ public class FlowableUtils {
193 195 BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES);
194 196 }
195 197  
196   - // TODO @lesan:如果值是 null 的情况,可能要调研下飞书、钉钉,是不是不返回哈!
197 198 /**
198 199 * 获得流程实例的摘要
199 200 *
... ... @@ -206,53 +207,39 @@ public class FlowableUtils {
206 207 */
207 208 public static List<KeyValue<String, String>> getSummary(BpmProcessDefinitionInfoDO processDefinitionInfo,
208 209 Map<String, Object> processVariables) {
209   - // TODO @lesan:建议 if return,减少 { 层级
210   - if (ObjectUtil.isNotNull(processDefinitionInfo)
211   - && BpmModelFormTypeEnum.NORMAL.getType().equals(processDefinitionInfo.getFormType())) {
212   - List<KeyValue<String, String>> summaryList = new ArrayList<>();
213   - // TODO @lesan:可以使用 CollUtils.convertMap 简化工作量哈。
214   - Map<String, BpmFormFieldVO> formFieldsMap = new HashMap<>();
215   - processDefinitionInfo.getFormFields().forEach(formFieldStr -> {
216   - BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class);
  210 + // 只有流程表单才会显示摘要!
  211 + if (ObjectUtil.isNull(processDefinitionInfo)
  212 + || !BpmModelFormTypeEnum.NORMAL.getType().equals(processDefinitionInfo.getFormType())) {
  213 + return null;
  214 + }
  215 + List<KeyValue<String, String>> summaryList;
  216 + Map<String, BpmFormFieldVO> formFieldsMap = new HashMap<>();
  217 + processDefinitionInfo.getFormFields().forEach(formFieldStr -> {
  218 + BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class);
  219 + if (formField != null) {
  220 + formFieldsMap.put(formField.getField(), formField);
  221 + }
  222 + });
  223 + if (ObjectUtil.isNotNull(processDefinitionInfo.getSummarySetting())
  224 + && Boolean.TRUE.equals(processDefinitionInfo.getSummarySetting().getEnable())) {
  225 + // 情况一:当自定义了摘要
  226 + summaryList = convertList(processDefinitionInfo.getSummarySetting().getSummary(), item -> {
  227 + BpmFormFieldVO formField = formFieldsMap.get(item);
217 228 if (formField != null) {
218   - formFieldsMap.put(formField.getField(), formField);
  229 + return new KeyValue<String, String>(formField.getTitle(),
  230 + processVariables.getOrDefault(item, "").toString());
219 231 }
  232 + return null;
220 233 });
221   -
222   - // TODO @lesan:这里也可以 if return,还是为了减少括号哈。这样,就可以写注释,情况一:;情况二:
223   - if (ObjectUtil.isNotNull(processDefinitionInfo.getSummarySetting())
224   - && Boolean.TRUE.equals(processDefinitionInfo.getSummarySetting().getEnable())) {
225   - // TODO @lesan:这里,也可以通过 CollUtils.convertList 简化哈。
226   - for (String item : processDefinitionInfo.getSummarySetting().getSummary()) {
227   - BpmFormFieldVO formField = formFieldsMap.get(item);
228   - if (formField != null) {
229   - summaryList.add(new KeyValue<>(formField.getTitle(),
230   - processVariables.getOrDefault(item, "").toString()));
231   - }
232   - }
233   - } else {
234   - // 默认展示前三个
235   - /* TODO @lesan:stream 简化
236   - * summaryList.addAll(formFieldsMap.entrySet().stream()
237   - * .limit(3)
238   - * .map(entry -> new KeyValue<>(entry.getValue().getTitle(),
239   - * processVariables.getOrDefault(entry.getValue().getField(), "").toString()))
240   - * .collect(Collectors.toList()));
241   - */
242   - int j = 0;
243   - for (Map.Entry<String, BpmFormFieldVO> entry : formFieldsMap.entrySet()) {
244   - BpmFormFieldVO formField = entry.getValue();
245   - if (j > 2) {
246   - break;
247   - }
248   - summaryList.add(new KeyValue<>(formField.getTitle(),
249   - processVariables.getOrDefault(formField.getField(), "").toString()));
250   - j++;
251   - }
252   - }
253   - return summaryList;
  234 + } else {
  235 + // 情况二:默认摘要展示前三个表单字段
  236 + summaryList = new ArrayList<>(formFieldsMap.entrySet().stream()
  237 + .limit(3)
  238 + .map(entry -> new KeyValue<>(entry.getValue().getTitle(),
  239 + processVariables.getOrDefault(entry.getValue().getField(), "").toString()))
  240 + .toList());
254 241 }
255   - return null;
  242 + return summaryList;
256 243 }
257 244  
258 245 // ========== Task 相关的工具方法 ==========
... ... @@ -317,9 +304,9 @@ public class FlowableUtils {
317 304  
318 305 private static Object getExpressionValue(VariableContainer variableContainer, String expressionString,
319 306 ProcessEngineConfigurationImpl processEngineConfiguration) {
320   - assert processEngineConfiguration!= null;
  307 + assert processEngineConfiguration != null;
321 308 ExpressionManager expressionManager = processEngineConfiguration.getExpressionManager();
322   - assert expressionManager!= null;
  309 + assert expressionManager != null;
323 310 Expression expression = expressionManager.createExpression(expressionString);
324 311 return expression.getValue(variableContainer);
325 312 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
... ... @@ -288,8 +288,7 @@ public class BpmModelServiceImpl implements BpmModelService {
288 288 // 2.3 清理所有 Task
289 289 List<Task> tasks = taskService.createTaskQuery()
290 290 .processDefinitionKey(model.getKey()).list();
291   - // TODO @lesan:貌似传递一个 reason 会好点!
292   - tasks.forEach(task -> taskService.deleteTask(task.getId()));
  291 + tasks.forEach(task -> taskService.deleteTask(task.getId(),BpmReasonEnum.CANCEL_BY_PROCESS_CLEAN.getReason()));
293 292 }
294 293  
295 294 @Override
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java
... ... @@ -77,7 +77,8 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
77 77 .setUserId(userId).setReason(reason).setStartUserId(Long.valueOf(processInstance.getStartUserId()))
78 78 .setProcessInstanceId(processInstanceId).setProcessInstanceName(processInstance.getName())
79 79 .setCategory(processDefinition.getCategory()).setTaskId(taskId)
80   - .setActivityId(activityId).setActivityName(activityName));
  80 + .setActivityId(activityId).setActivityName(activityName)
  81 + .setProcessDefinitionId(processInstance.getProcessDefinitionId()));
81 82 processInstanceCopyMapper.insertBatch(copyList);
82 83 }
83 84  
... ...