Commit d11684c2aeee19488be74867f0c0beedff93a1c1

Authored by 芋道源码
Committed by Gitee
2 parents 846d0605 39e68af1

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

Merge pull request !1210 from Lesan/feature/bpm-摘要设置
Showing 11 changed files with 136 additions and 23 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 package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; 1 package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model;
2 2
  3 +import cn.iocoder.yudao.framework.common.core.KeyValue;
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 4 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 import cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveTypeEnum; 5 import cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveTypeEnum;
5 import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; 6 import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum;
@@ -75,7 +76,10 @@ public class BpmModelMetaInfoVO { @@ -75,7 +76,10 @@ public class BpmModelMetaInfoVO {
75 private Integer autoApprovalType; 76 private Integer autoApprovalType;
76 77
77 @Schema(description = "标题设置", example = "{}") 78 @Schema(description = "标题设置", example = "{}")
78 - private CustomTitleSetting customTitleSetting; 79 + private TitleSetting titleSetting;
  80 +
  81 + @Schema(description = "摘要设置", example = "{}")
  82 + private SummarySetting summarySetting;
79 83
80 @Schema(description = "流程 ID 规则") 84 @Schema(description = "流程 ID 规则")
81 @Data 85 @Data
@@ -101,11 +105,10 @@ public class BpmModelMetaInfoVO { @@ -101,11 +105,10 @@ public class BpmModelMetaInfoVO {
101 105
102 } 106 }
103 107
104 - // TODO @lesan:TitleSetting 会不会更好。因为 Custom 和 Setting 有点重叠  
105 @Schema(description = "标题设置") 108 @Schema(description = "标题设置")
106 @Data 109 @Data
107 @Valid 110 @Valid
108 - public static class CustomTitleSetting { 111 + public static class TitleSetting {
109 112
110 @Schema(description = "是否自定义", example = "false") 113 @Schema(description = "是否自定义", example = "false")
111 @NotNull(message = "是否自定义不能为空") 114 @NotNull(message = "是否自定义不能为空")
@@ -116,4 +119,18 @@ public class BpmModelMetaInfoVO { @@ -116,4 +119,18 @@ public class BpmModelMetaInfoVO {
116 119
117 } 120 }
118 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 +
119 } 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,8 +74,10 @@ public class BpmProcessInstanceController {
74 convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId)); 74 convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
75 Map<String, BpmCategoryDO> categoryMap = categoryService.getCategoryMap( 75 Map<String, BpmCategoryDO> categoryMap = categoryService.getCategoryMap(
76 convertSet(processDefinitionMap.values(), ProcessDefinition::getCategory)); 76 convertSet(processDefinitionMap.values(), ProcessDefinition::getCategory));
  77 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(
  78 + convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
77 return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult, 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 @GetMapping("/manager-page") 83 @GetMapping("/manager-page")
@@ -101,8 +103,10 @@ public class BpmProcessInstanceController { @@ -101,8 +103,10 @@ public class BpmProcessInstanceController {
101 convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId()))); 103 convertSet(pageResult.getList(), processInstance -> NumberUtils.parseLong(processInstance.getStartUserId())));
102 Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap( 104 Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
103 convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); 105 convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
  106 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(
  107 + convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
104 return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult, 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 @PostMapping("/create") 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 +7,9 @@ import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
7 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; 7 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
8 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; 8 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
  10 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
10 import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService; 11 import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
  12 +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
11 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; 13 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
12 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; 14 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
13 import cn.iocoder.yudao.module.system.api.dept.DeptApi; 15 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
@@ -50,6 +52,8 @@ public class BpmTaskController { @@ -50,6 +52,8 @@ public class BpmTaskController {
50 private BpmProcessInstanceService processInstanceService; 52 private BpmProcessInstanceService processInstanceService;
51 @Resource 53 @Resource
52 private BpmFormService formService; 54 private BpmFormService formService;
  55 + @Resource
  56 + private BpmProcessDefinitionService processDefinitionService;
53 57
54 @Resource 58 @Resource
55 private AdminUserApi adminUserApi; 59 private AdminUserApi adminUserApi;
@@ -70,7 +74,9 @@ public class BpmTaskController { @@ -70,7 +74,9 @@ public class BpmTaskController {
70 convertSet(pageResult.getList(), Task::getProcessInstanceId)); 74 convertSet(pageResult.getList(), Task::getProcessInstanceId));
71 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 75 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
72 convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); 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 @GetMapping("done-page") 82 @GetMapping("done-page")
@@ -87,7 +93,9 @@ public class BpmTaskController { @@ -87,7 +93,9 @@ public class BpmTaskController {
87 convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId)); 93 convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId));
88 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 94 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
89 convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); 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 @GetMapping("manager-page") 101 @GetMapping("manager-page")
@@ -108,7 +116,9 @@ public class BpmTaskController { @@ -108,7 +116,9 @@ public class BpmTaskController {
108 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); 116 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
109 Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap( 117 Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
110 convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); 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 @GetMapping("/list-by-process-instance-id") 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 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; 1 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance;
2 2
  3 +import cn.iocoder.yudao.framework.common.core.KeyValue;
3 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; 4 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
4 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; 5 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
5 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
@@ -59,6 +60,8 @@ public class BpmProcessInstanceRespVO { @@ -59,6 +60,8 @@ public class BpmProcessInstanceRespVO {
59 */ 60 */
60 private List<Task> tasks; // 仅在流程实例分页才返回 61 private List<Task> tasks; // 仅在流程实例分页才返回
61 62
  63 + private List<KeyValue<String, String>> summary;
  64 +
62 @Schema(description = "流程任务") 65 @Schema(description = "流程任务")
63 @Data 66 @Data
64 public static class Task { 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 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task; 1 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
2 2
  3 +import cn.iocoder.yudao.framework.common.core.KeyValue;
3 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; 4 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
4 import com.fasterxml.jackson.annotation.JsonIgnore; 5 import com.fasterxml.jackson.annotation.JsonIgnore;
5 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
@@ -84,6 +85,9 @@ public class BpmTaskRespVO { @@ -84,6 +85,9 @@ public class BpmTaskRespVO {
84 @Schema(description = "是否填写审批意见", example = "false") 85 @Schema(description = "是否填写审批意见", example = "false")
85 private Boolean reasonRequire; 86 private Boolean reasonRequire;
86 87
  88 + @Schema(description = "摘要", example = "[]")
  89 + private List<KeyValue<String, String>> summary;
  90 +
87 @Data 91 @Data
88 @Schema(description = "流程实例") 92 @Schema(description = "流程实例")
89 public static class ProcessInstance { 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,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.convert.task;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.framework.common.core.KeyValue;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.collection.MapUtils; 7 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
7 import cn.iocoder.yudao.framework.common.util.collection.SetUtils; 8 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
@@ -58,7 +59,8 @@ public interface BpmProcessInstanceConvert { @@ -58,7 +59,8 @@ public interface BpmProcessInstanceConvert {
58 Map<String, BpmCategoryDO> categoryMap, 59 Map<String, BpmCategoryDO> categoryMap,
59 Map<String, List<Task>> taskMap, 60 Map<String, List<Task>> taskMap,
60 Map<Long, AdminUserRespDTO> userMap, 61 Map<Long, AdminUserRespDTO> userMap,
61 - Map<Long, DeptRespDTO> deptMap) { 62 + Map<Long, DeptRespDTO> deptMap,
  63 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap) {
62 PageResult<BpmProcessInstanceRespVO> vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstanceRespVO.class); 64 PageResult<BpmProcessInstanceRespVO> vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstanceRespVO.class);
63 for (int i = 0; i < pageResult.getList().size(); i++) { 65 for (int i = 0; i < pageResult.getList().size(); i++) {
64 BpmProcessInstanceRespVO respVO = vpPageResult.getList().get(i); 66 BpmProcessInstanceRespVO respVO = vpPageResult.getList().get(i);
@@ -76,6 +78,9 @@ public interface BpmProcessInstanceConvert { @@ -76,6 +78,9 @@ public interface BpmProcessInstanceConvert {
76 MapUtils.findAndThen(deptMap, startUser.getDeptId(), dept -> respVO.getStartUser().setDeptName(dept.getName())); 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 return vpPageResult; 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,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.convert.task;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.map.MapUtil; 4 import cn.hutool.core.map.MapUtil;
  5 +import cn.iocoder.yudao.framework.common.core.KeyValue;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 7 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
7 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 8 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
@@ -9,6 +10,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -9,6 +10,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
9 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; 10 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
10 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; 11 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
11 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; 12 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
  13 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
12 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum; 14 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
13 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; 15 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
14 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; 16 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
@@ -41,7 +43,8 @@ public interface BpmTaskConvert { @@ -41,7 +43,8 @@ public interface BpmTaskConvert {
41 43
42 default PageResult<BpmTaskRespVO> buildTodoTaskPage(PageResult<Task> pageResult, 44 default PageResult<BpmTaskRespVO> buildTodoTaskPage(PageResult<Task> pageResult,
43 Map<String, ProcessInstance> processInstanceMap, 45 Map<String, ProcessInstance> processInstanceMap,
44 - Map<Long, AdminUserRespDTO> userMap) { 46 + Map<Long, AdminUserRespDTO> userMap,
  47 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap) {
45 return BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> { 48 return BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> {
46 ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId()); 49 ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId());
47 if (processInstance == null) { 50 if (processInstance == null) {
@@ -50,13 +53,17 @@ public interface BpmTaskConvert { @@ -50,13 +53,17 @@ public interface BpmTaskConvert {
50 taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class)); 53 taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
51 AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); 54 AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
52 taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); 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 default PageResult<BpmTaskRespVO> buildTaskPage(PageResult<HistoricTaskInstance> pageResult, 62 default PageResult<BpmTaskRespVO> buildTaskPage(PageResult<HistoricTaskInstance> pageResult,
57 Map<String, HistoricProcessInstance> processInstanceMap, 63 Map<String, HistoricProcessInstance> processInstanceMap,
58 Map<Long, AdminUserRespDTO> userMap, 64 Map<Long, AdminUserRespDTO> userMap,
59 - Map<Long, DeptRespDTO> deptMap) { 65 + Map<Long, DeptRespDTO> deptMap,
  66 + Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap) {
60 List<BpmTaskRespVO> taskVOList = CollectionUtils.convertList(pageResult.getList(), task -> { 67 List<BpmTaskRespVO> taskVOList = CollectionUtils.convertList(pageResult.getList(), task -> {
61 BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class); 68 BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
62 taskVO.setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task)); 69 taskVO.setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task));
@@ -72,6 +79,9 @@ public interface BpmTaskConvert { @@ -72,6 +79,9 @@ public interface BpmTaskConvert {
72 AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); 79 AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
73 taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class)); 80 taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
74 taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); 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 return taskVO; 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
@@ -174,6 +174,12 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { @@ -174,6 +174,12 @@ public class BpmProcessDefinitionInfoDO extends BaseDO {
174 * 标题设置 174 * 标题设置
175 */ 175 */
176 @TableField(typeHandler = JacksonTypeHandler.class) 176 @TableField(typeHandler = JacksonTypeHandler.class)
177 - private BpmModelMetaInfoVO.CustomTitleSetting customTitleSetting; 177 + private BpmModelMetaInfoVO.TitleSetting titleSetting;
  178 +
  179 + /**
  180 + * 摘要设置
  181 + */
  182 + @TableField(typeHandler = JacksonTypeHandler.class)
  183 + private BpmModelMetaInfoVO.SummarySetting summarySetting;
178 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,8 +2,13 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.util;
2 2
3 import cn.hutool.core.util.ObjectUtil; 3 import cn.hutool.core.util.ObjectUtil;
4 import cn.hutool.extra.spring.SpringUtil; 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 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; 7 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
6 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; 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 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; 12 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants;
8 import lombok.SneakyThrows; 13 import lombok.SneakyThrows;
9 import org.flowable.common.engine.api.delegate.Expression; 14 import org.flowable.common.engine.api.delegate.Expression;
@@ -19,10 +24,7 @@ import org.flowable.engine.impl.util.CommandContextUtil; @@ -19,10 +24,7 @@ import org.flowable.engine.impl.util.CommandContextUtil;
19 import org.flowable.engine.runtime.ProcessInstance; 24 import org.flowable.engine.runtime.ProcessInstance;
20 import org.flowable.task.api.TaskInfo; 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 import java.util.concurrent.Callable; 28 import java.util.concurrent.Callable;
27 29
28 /** 30 /**
@@ -277,4 +279,43 @@ public class FlowableUtils { @@ -277,4 +279,43 @@ public class FlowableUtils {
277 return getExpressionValue(variableContainer, expressionString); 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 + return summaryList;
  317 + }
  318 + return null;
  319 + }
  320 +
280 } 321 }
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,7 +128,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
128 128
129 @Override 129 @Override
130 public List<ProcessInstance> getProcessInstances(Set<String> ids) { 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 @Override 134 @Override
@@ -138,7 +138,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -138,7 +138,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
138 138
139 @Override 139 @Override
140 public List<HistoricProcessInstance> getHistoricProcessInstances(Set<String> ids) { 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 @Override 144 @Override
@@ -618,15 +618,14 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -618,15 +618,14 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
618 processInstanceBuilder.predefineProcessInstanceId(processIdRedisDAO.generate(processIdRule)); 618 processInstanceBuilder.predefineProcessInstanceId(processIdRedisDAO.generate(processIdRule));
619 } 619 }
620 // 3.2 流程名称 620 // 3.2 流程名称
621 - BpmModelMetaInfoVO.CustomTitleSetting customTitleSetting = processDefinitionInfo.getCustomTitleSetting();  
622 - if (customTitleSetting != null && Boolean.TRUE.equals(customTitleSetting.getEnable())) { 621 + BpmModelMetaInfoVO.TitleSetting titleSetting = processDefinitionInfo.getTitleSetting();
  622 + if (titleSetting != null && Boolean.TRUE.equals(titleSetting.getEnable())) {
623 AdminUserRespDTO user = adminUserApi.getUser(userId); 623 AdminUserRespDTO user = adminUserApi.getUser(userId);
624 - // TODO @lesan:new HashMap 会更好哈。clone 感觉反射,不一定合适。  
625 - Map<String, Object> cloneVariables = ObjectUtil.clone(variables); 624 + Map<String, Object> cloneVariables = new HashMap<>(variables);
626 cloneVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, user.getNickname()); 625 cloneVariables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, user.getNickname());
627 cloneVariables.put(BpmnVariableConstants.PROCESS_START_TIME, DateUtil.now()); 626 cloneVariables.put(BpmnVariableConstants.PROCESS_START_TIME, DateUtil.now());
628 cloneVariables.put(BpmnVariableConstants.PROCESS_DEFINITION_NAME, definition.getName().trim()); 627 cloneVariables.put(BpmnVariableConstants.PROCESS_DEFINITION_NAME, definition.getName().trim());
629 - processInstanceBuilder.name(StrUtil.format(customTitleSetting.getTitle(), cloneVariables)); 628 + processInstanceBuilder.name(StrUtil.format(titleSetting.getTitle(), cloneVariables));
630 } else { 629 } else {
631 processInstanceBuilder.name(definition.getName().trim()); 630 processInstanceBuilder.name(definition.getName().trim());
632 } 631 }