Commit b5ba500b60ff32bbfe6f1f7ab32bf45721605d27

Authored by LesanOuO
1 parent 8f4543a2

feat: BPM-更多设置-摘要设置

Showing 11 changed files with 130 additions and 14 deletions
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmFormFieldVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model;
  2 +
  3 +import lombok.Data;
  4 +
  5 +@Data
  6 +public class BpmFormFieldVO {
  7 +
  8 + private String type;
  9 +
  10 + private String field;
  11 +
  12 + private String title;
  13 +
  14 +}
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model;
2 2  
  3 +import cn.iocoder.yudao.framework.common.core.KeyValue;
3 4 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 5 import cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveTypeEnum;
5 6 import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum;
... ... @@ -77,6 +78,9 @@ public class BpmModelMetaInfoVO {
77 78 @Schema(description = "标题设置", example = "{}")
78 79 private TitleSetting titleSetting;
79 80  
  81 + @Schema(description = "摘要设置", example = "{}")
  82 + private SummarySetting summarySetting;
  83 +
80 84 @Schema(description = "流程 ID 规则")
81 85 @Data
82 86 @Valid
... ... @@ -115,4 +119,18 @@ public class BpmModelMetaInfoVO {
115 119  
116 120 }
117 121  
  122 + @Schema(description = "摘要设置")
  123 + @Data
  124 + @Valid
  125 + public static class SummarySetting {
  126 +
  127 + @Schema(description = "是否自定义", example = "false")
  128 + @NotNull(message = "是否自定义不能为空")
  129 + private Boolean enable;
  130 +
  131 + @Schema(description = "摘要字段数组", example = "[]")
  132 + private List<String> summary;
  133 +
  134 + }
  135 +
118 136 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
... ... @@ -74,8 +74,10 @@ public class BpmProcessInstanceController {
74 74 convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
75 75 Map<String, BpmCategoryDO> categoryMap = categoryService.getCategoryMap(
76 76 convertSet(processDefinitionMap.values(), ProcessDefinition::getCategory));
  77 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(
  78 + convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
77 79 return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult,
78   - processDefinitionMap, categoryMap, taskMap, null, null));
  80 + processDefinitionMap, categoryMap, taskMap, null, null, processDefinitionInfoMap));
79 81 }
80 82  
81 83 @GetMapping("/manager-page")
... ... @@ -101,8 +103,10 @@ public class BpmProcessInstanceController {
101 103 convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId())));
102 104 Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
103 105 convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
  106 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(
  107 + convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
104 108 return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult,
105   - processDefinitionMap, categoryMap, taskMap, userMap, deptMap));
  109 + processDefinitionMap, categoryMap, taskMap, userMap, deptMap, processDefinitionInfoMap));
106 110 }
107 111  
108 112 @PostMapping("/create")
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java
... ... @@ -7,7 +7,9 @@ import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
7 7 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
8 8 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
9 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
  10 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
10 11 import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
  12 +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
11 13 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
12 14 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
13 15 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
... ... @@ -50,6 +52,8 @@ public class BpmTaskController {
50 52 private BpmProcessInstanceService processInstanceService;
51 53 @Resource
52 54 private BpmFormService formService;
  55 + @Resource
  56 + private BpmProcessDefinitionService processDefinitionService;
53 57  
54 58 @Resource
55 59 private AdminUserApi adminUserApi;
... ... @@ -70,7 +74,9 @@ public class BpmTaskController {
70 74 convertSet(pageResult.getList(), Task::getProcessInstanceId));
71 75 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
72 76 convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
73   - return success(BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap));
  77 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(
  78 + convertSet(pageResult.getList(), Task::getProcessDefinitionId));
  79 + return success(BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap, processDefinitionInfoMap));
74 80 }
75 81  
76 82 @GetMapping("done-page")
... ... @@ -87,7 +93,9 @@ public class BpmTaskController {
87 93 convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId));
88 94 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
89 95 convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
90   - return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, null));
  96 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(
  97 + convertSet(pageResult.getList(), HistoricTaskInstance::getProcessDefinitionId));
  98 + return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, null, processDefinitionInfoMap));
91 99 }
92 100  
93 101 @GetMapping("manager-page")
... ... @@ -108,7 +116,9 @@ public class BpmTaskController {
108 116 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
109 117 Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
110 118 convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
111   - return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, deptMap));
  119 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(
  120 + convertSet(pageResult.getList(), HistoricTaskInstance::getProcessDefinitionId));
  121 + return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, deptMap, processDefinitionInfoMap));
112 122 }
113 123  
114 124 @GetMapping("/list-by-process-instance-id")
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance;
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 cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
5 6 import io.swagger.v3.oas.annotations.media.Schema;
... ... @@ -59,6 +60,8 @@ public class BpmProcessInstanceRespVO {
59 60 */
60 61 private List<Task> tasks; // 仅在流程实例分页才返回
61 62  
  63 + private List<KeyValue<String, String>> summary;
  64 +
62 65 @Schema(description = "流程任务")
63 66 @Data
64 67 public static class Task {
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
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 com.fasterxml.jackson.annotation.JsonIgnore;
5 6 import io.swagger.v3.oas.annotations.media.Schema;
... ... @@ -84,6 +85,9 @@ public class BpmTaskRespVO {
84 85 @Schema(description = "是否填写审批意见", example = "false")
85 86 private Boolean reasonRequire;
86 87  
  88 + @Schema(description = "摘要", example = "[]")
  89 + private List<KeyValue<String, String>> summary;
  90 +
87 91 @Data
88 92 @Schema(description = "流程实例")
89 93 public static class ProcessInstance {
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java
... ... @@ -2,6 +2,7 @@ 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;
... ... @@ -58,7 +59,8 @@ public interface BpmProcessInstanceConvert {
58 59 Map<String, BpmCategoryDO> categoryMap,
59 60 Map<String, List<Task>> taskMap,
60 61 Map<Long, AdminUserRespDTO> userMap,
61   - Map<Long, DeptRespDTO> deptMap) {
  62 + Map<Long, DeptRespDTO> deptMap,
  63 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap) {
62 64 PageResult<BpmProcessInstanceRespVO> vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstanceRespVO.class);
63 65 for (int i = 0; i < pageResult.getList().size(); i++) {
64 66 BpmProcessInstanceRespVO respVO = vpPageResult.getList().get(i);
... ... @@ -76,6 +78,9 @@ public interface BpmProcessInstanceConvert {
76 78 MapUtils.findAndThen(deptMap, startUser.getDeptId(), dept -> respVO.getStartUser().setDeptName(dept.getName()));
77 79 }
78 80 }
  81 + // 摘要
  82 + respVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(respVO.getProcessDefinitionId()),
  83 + pageResult.getList().get(i).getProcessVariables()));
79 84 }
80 85 return vpPageResult;
81 86 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.convert.task;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.map.MapUtil;
  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.CollectionUtils;
7 8 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
... ... @@ -9,6 +10,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
9 10 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
10 11 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
11 12 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
  13 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
12 14 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
13 15 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
14 16 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
... ... @@ -41,7 +43,8 @@ public interface BpmTaskConvert {
41 43  
42 44 default PageResult<BpmTaskRespVO> buildTodoTaskPage(PageResult<Task> pageResult,
43 45 Map<String, ProcessInstance> processInstanceMap,
44   - Map<Long, AdminUserRespDTO> userMap) {
  46 + Map<Long, AdminUserRespDTO> userMap,
  47 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap) {
45 48 return BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> {
46 49 ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId());
47 50 if (processInstance == null) {
... ... @@ -50,13 +53,17 @@ public interface BpmTaskConvert {
50 53 taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
51 54 AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
52 55 taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class));
  56 + // 摘要
  57 + taskVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()),
  58 + processInstance.getProcessVariables()));
53 59 });
54 60 }
55 61  
56 62 default PageResult<BpmTaskRespVO> buildTaskPage(PageResult<HistoricTaskInstance> pageResult,
57 63 Map<String, HistoricProcessInstance> processInstanceMap,
58 64 Map<Long, AdminUserRespDTO> userMap,
59   - Map<Long, DeptRespDTO> deptMap) {
  65 + Map<Long, DeptRespDTO> deptMap,
  66 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap) {
60 67 List<BpmTaskRespVO> taskVOList = CollectionUtils.convertList(pageResult.getList(), task -> {
61 68 BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
62 69 taskVO.setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task));
... ... @@ -72,6 +79,9 @@ public interface BpmTaskConvert {
72 79 AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
73 80 taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
74 81 taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class));
  82 + // 摘要
  83 + taskVO.setSummary(FlowableUtils.getSummary(processDefinitionInfoMap.get(processInstance.getProcessDefinitionId()),
  84 + processInstance.getProcessVariables()));
75 85 }
76 86 return taskVO;
77 87 });
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java
... ... @@ -176,4 +176,10 @@ public class BpmProcessDefinitionInfoDO extends BaseDO {
176 176 @TableField(typeHandler = JacksonTypeHandler.class)
177 177 private BpmModelMetaInfoVO.TitleSetting titleSetting;
178 178  
  179 + /**
  180 + * 摘要设置
  181 + */
  182 + @TableField(typeHandler = JacksonTypeHandler.class)
  183 + private BpmModelMetaInfoVO.SummarySetting summarySetting;
  184 +
179 185 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java
... ... @@ -2,8 +2,13 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.util;
2 2  
3 3 import cn.hutool.core.util.ObjectUtil;
4 4 import cn.hutool.extra.spring.SpringUtil;
  5 +import cn.iocoder.yudao.framework.common.core.KeyValue;
  6 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
5 7 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
6 8 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
  9 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmFormFieldVO;
  10 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
  11 +import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum;
7 12 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants;
8 13 import lombok.SneakyThrows;
9 14 import org.flowable.common.engine.api.delegate.Expression;
... ... @@ -19,10 +24,7 @@ import org.flowable.engine.impl.util.CommandContextUtil;
19 24 import org.flowable.engine.runtime.ProcessInstance;
20 25 import org.flowable.task.api.TaskInfo;
21 26  
22   -import java.util.HashMap;
23   -import java.util.List;
24   -import java.util.Map;
25   -import java.util.Objects;
  27 +import java.util.*;
26 28 import java.util.concurrent.Callable;
27 29  
28 30 /**
... ... @@ -277,4 +279,44 @@ public class FlowableUtils {
277 279 return getExpressionValue(variableContainer, expressionString);
278 280 }
279 281  
  282 + public static List<KeyValue<String, String>> getSummary(BpmProcessDefinitionInfoDO processDefinitionInfo,
  283 + Map<String, Object> processVariables) {
  284 + if (ObjectUtil.isNotNull(processDefinitionInfo)
  285 + && BpmModelFormTypeEnum.NORMAL.getType().equals(processDefinitionInfo.getFormType())) {
  286 + List<KeyValue<String, String>> summaryList = new ArrayList<>();
  287 + Map<String, BpmFormFieldVO> formFieldsMap = new HashMap<>();
  288 + processDefinitionInfo.getFormFields().forEach(formFieldStr -> {
  289 + BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class);
  290 + if (formField != null) {
  291 + formFieldsMap.put(formField.getField(), formField);
  292 + }
  293 + });
  294 + if (ObjectUtil.isNotNull(processDefinitionInfo.getSummarySetting())
  295 + && Boolean.TRUE.equals(processDefinitionInfo.getSummarySetting().getEnable())) {
  296 + for (String item : processDefinitionInfo.getSummarySetting().getSummary()) {
  297 + BpmFormFieldVO formField = formFieldsMap.get(item);
  298 + if (formField != null) {
  299 + summaryList.add(new KeyValue<>(formField.getTitle(),
  300 + processVariables.getOrDefault(item, "").toString()));
  301 + }
  302 + }
  303 + } else {
  304 + // 默认展示前三个
  305 + int j = 0;
  306 + for (Map.Entry<String, BpmFormFieldVO> entry : formFieldsMap.entrySet()) {
  307 + BpmFormFieldVO formField = entry.getValue();
  308 + if (j > 2) {
  309 + break;
  310 + }
  311 + summaryList.add(new KeyValue<>(formField.getTitle(),
  312 + processVariables.getOrDefault(formField.getField(), "").toString()));
  313 + j++;
  314 + }
  315 + }
  316 + Collections.reverse(summaryList);
  317 + return summaryList;
  318 + }
  319 + return null;
  320 + }
  321 +
280 322 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
... ... @@ -128,7 +128,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
128 128  
129 129 @Override
130 130 public List<ProcessInstance> getProcessInstances(Set<String> ids) {
131   - return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list();
  131 + return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).includeProcessVariables().list();
132 132 }
133 133  
134 134 @Override
... ... @@ -138,7 +138,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
138 138  
139 139 @Override
140 140 public List<HistoricProcessInstance> getHistoricProcessInstances(Set<String> ids) {
141   - return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).list();
  141 + return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).includeProcessVariables().list();
142 142 }
143 143  
144 144 @Override
... ...