Commit 0723e4571d8e8745dac142897cce5d70b0e94ead
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 |