Commit 0723e4571d8e8745dac142897cce5d70b0e94ead

Authored by jason
2 parents 53789d9b 805e5704

Merge remote-tracking branch 'origin/feature/bpm' into feature/bpm

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