Commit 1f2222cf83934529cc5cd576ce8af5b417d668c6
Merge remote-tracking branch 'origin/feature/bpm' into feature/bpm
Showing
9 changed files
with
75 additions
and
14 deletions
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeTypeEnum.java
| @@ -25,6 +25,7 @@ public enum BpmSimpleModelNodeTypeEnum implements ArrayValuable<Integer> { | @@ -25,6 +25,7 @@ public enum BpmSimpleModelNodeTypeEnum implements ArrayValuable<Integer> { | ||
| 25 | START_USER_NODE(10, "发起人", "userTask"), // 发起人节点。前端的开始节点,Id 固定 | 25 | START_USER_NODE(10, "发起人", "userTask"), // 发起人节点。前端的开始节点,Id 固定 |
| 26 | APPROVE_NODE(11, "审批人", "userTask"), | 26 | APPROVE_NODE(11, "审批人", "userTask"), |
| 27 | COPY_NODE(12, "抄送人", "serviceTask"), | 27 | COPY_NODE(12, "抄送人", "serviceTask"), |
| 28 | + TRANSACTOR_NODE(13, "办理人", "userTask"), | ||
| 28 | 29 | ||
| 29 | DELAY_TIMER_NODE(14, "延迟器", "receiveTask"), | 30 | DELAY_TIMER_NODE(14, "延迟器", "receiveTask"), |
| 30 | TRIGGER_NODE(15, "触发器", "serviceTask"), | 31 | TRIGGER_NODE(15, "触发器", "serviceTask"), |
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; | ||
| 4 | import cn.iocoder.yudao.framework.common.validation.InEnum; | 3 | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| 5 | import cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveTypeEnum; | 4 | import cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveTypeEnum; |
| 6 | import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; | 5 | import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; |
| @@ -27,8 +26,7 @@ import java.util.List; | @@ -27,8 +26,7 @@ import java.util.List; | ||
| 27 | @Data | 26 | @Data |
| 28 | public class BpmModelMetaInfoVO { | 27 | public class BpmModelMetaInfoVO { |
| 29 | 28 | ||
| 30 | - @Schema(description = "流程图标", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/yudao.jpg") | ||
| 31 | - @NotEmpty(message = "流程图标不能为空") | 29 | + @Schema(description = "流程图标", example = "https://www.iocoder.cn/yudao.jpg") |
| 32 | @URL(message = "流程图标格式不正确") | 30 | @URL(message = "流程图标格式不正确") |
| 33 | private String icon; | 31 | private String icon; |
| 34 | 32 |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java
| @@ -85,6 +85,9 @@ public class BpmTaskRespVO { | @@ -85,6 +85,9 @@ public class BpmTaskRespVO { | ||
| 85 | @Schema(description = "是否填写审批意见", example = "false") | 85 | @Schema(description = "是否填写审批意见", example = "false") |
| 86 | private Boolean reasonRequire; | 86 | private Boolean reasonRequire; |
| 87 | 87 | ||
| 88 | + @Schema(description = "节点类型", example = "10") | ||
| 89 | + private Integer nodeType; // 参见 BpmSimpleModelNodeTypeEnum 枚举。 | ||
| 90 | + | ||
| 88 | @Data | 91 | @Data |
| 89 | @Schema(description = "流程实例") | 92 | @Schema(description = "流程实例") |
| 90 | public static class ProcessInstance { | 93 | public static class ProcessInstance { |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java
| 1 | package cn.iocoder.yudao.module.bpm.framework.flowable.core.enums; | 1 | package cn.iocoder.yudao.module.bpm.framework.flowable.core.enums; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum; | ||
| 4 | + | ||
| 3 | /** | 5 | /** |
| 4 | * BPMN XML 常量信息 | 6 | * BPMN XML 常量信息 |
| 5 | * | 7 | * |
| @@ -129,4 +131,11 @@ public interface BpmnModelConstants { | @@ -129,4 +131,11 @@ public interface BpmnModelConstants { | ||
| 129 | */ | 131 | */ |
| 130 | String REASON_REQUIRE = "reasonRequire"; | 132 | String REASON_REQUIRE = "reasonRequire"; |
| 131 | 133 | ||
| 134 | + /** | ||
| 135 | + * 节点类型 | ||
| 136 | + * | ||
| 137 | + * 目前只有 {@link BpmModelTypeEnum#SIMPLE} 的 UserTask 节点会设置该属性,用于区分是审批节点、还是办理节点 | ||
| 138 | + */ | ||
| 139 | + String NODE_TYPE = "nodeType"; | ||
| 140 | + | ||
| 132 | } | 141 | } |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java
| @@ -410,6 +410,26 @@ public class BpmnModelUtils { | @@ -410,6 +410,26 @@ public class BpmnModelUtils { | ||
| 410 | return parseExtensionElement(flowElement, TRIGGER_PARAM); | 410 | return parseExtensionElement(flowElement, TRIGGER_PARAM); |
| 411 | } | 411 | } |
| 412 | 412 | ||
| 413 | + /** | ||
| 414 | + * 给节点添加节点类型 | ||
| 415 | + * | ||
| 416 | + * @param nodeType 节点类型 | ||
| 417 | + * @param flowElement 节点 | ||
| 418 | + */ | ||
| 419 | + public static void addNodeType(Integer nodeType, FlowElement flowElement) { | ||
| 420 | + addExtensionElement(flowElement, BpmnModelConstants.NODE_TYPE, nodeType); | ||
| 421 | + } | ||
| 422 | + | ||
| 423 | + /** | ||
| 424 | + * 解析节点类型 | ||
| 425 | + * | ||
| 426 | + * @param flowElement 节点 | ||
| 427 | + * @return 节点类型 | ||
| 428 | + */ | ||
| 429 | + public static Integer parseNodeType(FlowElement flowElement) { | ||
| 430 | + return NumberUtils.parseInt(parseExtensionElement(flowElement, BpmnModelConstants.NODE_TYPE)); | ||
| 431 | + } | ||
| 432 | + | ||
| 413 | // ========== BPM 简单查找相关的方法 ========== | 433 | // ========== BPM 简单查找相关的方法 ========== |
| 414 | 434 | ||
| 415 | /** | 435 | /** |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java
| @@ -40,7 +40,7 @@ public class SimpleModelUtils { | @@ -40,7 +40,7 @@ public class SimpleModelUtils { | ||
| 40 | 40 | ||
| 41 | static { | 41 | static { |
| 42 | List<NodeConvert> converts = asList(new StartNodeConvert(), new EndNodeConvert(), | 42 | List<NodeConvert> converts = asList(new StartNodeConvert(), new EndNodeConvert(), |
| 43 | - new StartUserNodeConvert(), new ApproveNodeConvert(), new CopyNodeConvert(), | 43 | + new StartUserNodeConvert(), new ApproveNodeConvert(), new CopyNodeConvert(), new TransactorNodeConvert(), |
| 44 | new DelayTimerNodeConvert(), new TriggerNodeConvert(), | 44 | new DelayTimerNodeConvert(), new TriggerNodeConvert(), |
| 45 | new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert(), new RouteBranchNodeConvert()); | 45 | new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert(), new RouteBranchNodeConvert()); |
| 46 | converts.forEach(convert -> NODE_CONVERTS.put(convert.getType(), convert)); | 46 | converts.forEach(convert -> NODE_CONVERTS.put(convert.getType(), convert)); |
| @@ -445,6 +445,8 @@ public class SimpleModelUtils { | @@ -445,6 +445,8 @@ public class SimpleModelUtils { | ||
| 445 | addSignEnable(node.getSignEnable(), userTask); | 445 | addSignEnable(node.getSignEnable(), userTask); |
| 446 | // 审批意见 | 446 | // 审批意见 |
| 447 | addReasonRequire(node.getReasonRequire(), userTask); | 447 | addReasonRequire(node.getReasonRequire(), userTask); |
| 448 | + // 节点类型 | ||
| 449 | + addNodeType(node.getType(), userTask); | ||
| 448 | return userTask; | 450 | return userTask; |
| 449 | } | 451 | } |
| 450 | 452 | ||
| @@ -514,6 +516,15 @@ public class SimpleModelUtils { | @@ -514,6 +516,15 @@ public class SimpleModelUtils { | ||
| 514 | 516 | ||
| 515 | } | 517 | } |
| 516 | 518 | ||
| 519 | + private static class TransactorNodeConvert extends ApproveNodeConvert { | ||
| 520 | + | ||
| 521 | + @Override | ||
| 522 | + public BpmSimpleModelNodeTypeEnum getType() { | ||
| 523 | + return BpmSimpleModelNodeTypeEnum.TRANSACTOR_NODE; | ||
| 524 | + } | ||
| 525 | + | ||
| 526 | + } | ||
| 527 | + | ||
| 517 | private static class CopyNodeConvert implements NodeConvert { | 528 | private static class CopyNodeConvert implements NodeConvert { |
| 518 | 529 | ||
| 519 | @Override | 530 | @Override |
| @@ -785,10 +796,11 @@ public class SimpleModelUtils { | @@ -785,10 +796,11 @@ public class SimpleModelUtils { | ||
| 785 | BpmSimpleModelNodeTypeEnum nodeType = BpmSimpleModelNodeTypeEnum.valueOf(currentNode.getType()); | 796 | BpmSimpleModelNodeTypeEnum nodeType = BpmSimpleModelNodeTypeEnum.valueOf(currentNode.getType()); |
| 786 | Assert.notNull(nodeType, "模型节点类型不支持"); | 797 | Assert.notNull(nodeType, "模型节点类型不支持"); |
| 787 | 798 | ||
| 788 | - // 情况:START_NODE/START_USER_NODE/APPROVE_NODE/COPY_NODE/END_NODE | 799 | + // 情况:START_NODE/START_USER_NODE/APPROVE_NODE/COPY_NODE/END_NODE/TRANSACTOR_NODE |
| 789 | if (nodeType == BpmSimpleModelNodeTypeEnum.START_NODE | 800 | if (nodeType == BpmSimpleModelNodeTypeEnum.START_NODE |
| 790 | || nodeType == BpmSimpleModelNodeTypeEnum.START_USER_NODE | 801 | || nodeType == BpmSimpleModelNodeTypeEnum.START_USER_NODE |
| 791 | || nodeType == BpmSimpleModelNodeTypeEnum.APPROVE_NODE | 802 | || nodeType == BpmSimpleModelNodeTypeEnum.APPROVE_NODE |
| 803 | + || nodeType == BpmSimpleModelNodeTypeEnum.TRANSACTOR_NODE | ||
| 792 | || nodeType == BpmSimpleModelNodeTypeEnum.COPY_NODE | 804 | || nodeType == BpmSimpleModelNodeTypeEnum.COPY_NODE |
| 793 | || nodeType == BpmSimpleModelNodeTypeEnum.END_NODE) { | 805 | || nodeType == BpmSimpleModelNodeTypeEnum.END_NODE) { |
| 794 | // 添加元素 | 806 | // 添加元素 |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java
| @@ -28,8 +28,7 @@ import java.util.*; | @@ -28,8 +28,7 @@ import java.util.*; | ||
| 28 | 28 | ||
| 29 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 29 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 30 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.addIfNotNull; | 30 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.addIfNotNull; |
| 31 | -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH; | ||
| 32 | -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH; | 31 | +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; |
| 33 | import static java.util.Collections.emptyList; | 32 | import static java.util.Collections.emptyList; |
| 34 | 33 | ||
| 35 | /** | 34 | /** |
| @@ -156,16 +155,25 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ | @@ -156,16 +155,25 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ | ||
| 156 | 155 | ||
| 157 | @Override | 156 | @Override |
| 158 | public void updateProcessDefinitionState(String id, Integer state) { | 157 | public void updateProcessDefinitionState(String id, Integer state) { |
| 158 | + ProcessDefinition processDefinition = repositoryService.getProcessDefinition(id); | ||
| 159 | + if (processDefinition == null) { | ||
| 160 | + throw exception(PROCESS_DEFINITION_NOT_EXISTS); | ||
| 161 | + } | ||
| 162 | + | ||
| 159 | // 激活 | 163 | // 激活 |
| 160 | if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), state)) { | 164 | if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), state)) { |
| 161 | - repositoryService.activateProcessDefinitionById(id, false, null); | 165 | + if (processDefinition.isSuspended()) { |
| 166 | + repositoryService.activateProcessDefinitionById(id, false, null); | ||
| 167 | + } | ||
| 162 | return; | 168 | return; |
| 163 | } | 169 | } |
| 164 | // 挂起 | 170 | // 挂起 |
| 165 | if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), state)) { | 171 | if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), state)) { |
| 166 | // suspendProcessInstances = false,进行中的任务,不进行挂起。 | 172 | // suspendProcessInstances = false,进行中的任务,不进行挂起。 |
| 167 | // 原因:只要新的流程不允许发起即可,老流程继续可以执行。 | 173 | // 原因:只要新的流程不允许发起即可,老流程继续可以执行。 |
| 168 | - repositoryService.suspendProcessDefinitionById(id, false, null); | 174 | + if (!processDefinition.isSuspended()) { |
| 175 | + repositoryService.suspendProcessDefinitionById(id, false, null); | ||
| 176 | + } | ||
| 169 | return; | 177 | return; |
| 170 | } | 178 | } |
| 171 | log.error("[updateProcessDefinitionState][流程定义({}) 修改未知状态({})]", id, state); | 179 | log.error("[updateProcessDefinitionState][流程定义({}) 修改未知状态({})]", id, state); |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
| @@ -5,6 +5,7 @@ import cn.hutool.core.collection.ListUtil; | @@ -5,6 +5,7 @@ import cn.hutool.core.collection.ListUtil; | ||
| 5 | import cn.hutool.core.date.DateUtil; | 5 | import cn.hutool.core.date.DateUtil; |
| 6 | import cn.hutool.core.lang.Assert; | 6 | 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.ObjUtil; | ||
| 8 | import cn.hutool.core.util.ObjectUtil; | 9 | import cn.hutool.core.util.ObjectUtil; |
| 9 | import cn.hutool.core.util.StrUtil; | 10 | import cn.hutool.core.util.StrUtil; |
| 10 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 11 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| @@ -67,6 +68,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. | @@ -67,6 +68,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. | ||
| 67 | import static cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNode; | 68 | import static cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNode; |
| 68 | import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; | 69 | import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; |
| 69 | import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID; | 70 | import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID; |
| 71 | +import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseNodeType; | ||
| 70 | import static java.util.Arrays.asList; | 72 | import static java.util.Arrays.asList; |
| 71 | import static java.util.Collections.singletonList; | 73 | import static java.util.Collections.singletonList; |
| 72 | import static org.flowable.bpmn.constants.BpmnXMLConstants.*; | 74 | import static org.flowable.bpmn.constants.BpmnXMLConstants.*; |
| @@ -325,7 +327,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -325,7 +327,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 325 | ActivityNode activityNode = new ActivityNode().setId(task.getTaskDefinitionKey()).setName(task.getName()) | 327 | ActivityNode activityNode = new ActivityNode().setId(task.getTaskDefinitionKey()).setName(task.getName()) |
| 326 | .setNodeType(START_USER_NODE_ID.equals(task.getTaskDefinitionKey()) | 328 | .setNodeType(START_USER_NODE_ID.equals(task.getTaskDefinitionKey()) |
| 327 | ? BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType() | 329 | ? BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType() |
| 328 | - : BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()) | 330 | + : ObjUtil.defaultIfNull(parseNodeType(flowNode), // 目的:解决“办理节点”的识别 |
| 331 | + BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType())) | ||
| 329 | .setStatus(FlowableUtils.getTaskStatus(task)) | 332 | .setStatus(FlowableUtils.getTaskStatus(task)) |
| 330 | .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) | 333 | .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) |
| 331 | .setStartTime(DateUtils.of(task.getCreateTime())).setEndTime(DateUtils.of(task.getEndTime())) | 334 | .setStartTime(DateUtils.of(task.getCreateTime())).setEndTime(DateUtils.of(task.getEndTime())) |
| @@ -402,7 +405,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -402,7 +405,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 402 | HistoricActivityInstance firstActivity = CollUtil.getFirst(taskActivities); // 取第一个任务,会签/或签的任务,开始时间相同 | 405 | HistoricActivityInstance firstActivity = CollUtil.getFirst(taskActivities); // 取第一个任务,会签/或签的任务,开始时间相同 |
| 403 | ActivityNode activityNode = new ActivityNode().setId(firstActivity.getActivityId()) | 406 | ActivityNode activityNode = new ActivityNode().setId(firstActivity.getActivityId()) |
| 404 | .setName(firstActivity.getActivityName()) | 407 | .setName(firstActivity.getActivityName()) |
| 405 | - .setNodeType(BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType()) | 408 | + .setNodeType(ObjUtil.defaultIfNull(parseNodeType(flowNode), // 目的:解决“办理节点”的识别 |
| 409 | + BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType())) | ||
| 406 | .setStatus(BpmTaskStatusEnum.RUNNING.getStatus()) | 410 | .setStatus(BpmTaskStatusEnum.RUNNING.getStatus()) |
| 407 | .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) | 411 | .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode)) |
| 408 | .setStartTime(DateUtils.of(CollUtil.getFirst(taskActivities).getStartTime())) | 412 | .setStartTime(DateUtils.of(CollUtil.getFirst(taskActivities).getStartTime())) |
| @@ -479,7 +483,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -479,7 +483,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 479 | // 1. 开始节点/审批节点 | 483 | // 1. 开始节点/审批节点 |
| 480 | if (ObjectUtils.equalsAny(node.getType(), | 484 | if (ObjectUtils.equalsAny(node.getType(), |
| 481 | BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType(), | 485 | BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType(), |
| 482 | - BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType())) { | 486 | + BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType(), |
| 487 | + BpmSimpleModelNodeTypeEnum.TRANSACTOR_NODE.getType())) { | ||
| 483 | List<Long> candidateUserIds = getTaskCandidateUserList(bpmnModel, node.getId(), | 488 | List<Long> candidateUserIds = getTaskCandidateUserList(bpmnModel, node.getId(), |
| 484 | startUserId, processDefinitionInfo.getProcessDefinitionId(), processVariables); | 489 | startUserId, processDefinitionInfo.getProcessDefinitionId(), processVariables); |
| 485 | activityNode.setCandidateUserIds(candidateUserIds); | 490 | activityNode.setCandidateUserIds(candidateUserIds); |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
| @@ -61,6 +61,7 @@ import java.util.stream.Stream; | @@ -61,6 +61,7 @@ import java.util.stream.Stream; | ||
| 61 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 61 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 62 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; | 62 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| 63 | import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; | 63 | import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; |
| 64 | +import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID; | ||
| 64 | import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_RETURN_FLAG; | 65 | import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_RETURN_FLAG; |
| 65 | import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.*; | 66 | import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.*; |
| 66 | 67 | ||
| @@ -162,6 +163,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -162,6 +163,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 162 | bpmnModel, todoTask.getTaskDefinitionKey()); | 163 | bpmnModel, todoTask.getTaskDefinitionKey()); |
| 163 | Boolean signEnable = parseSignEnable(bpmnModel, todoTask.getTaskDefinitionKey()); | 164 | Boolean signEnable = parseSignEnable(bpmnModel, todoTask.getTaskDefinitionKey()); |
| 164 | Boolean reasonRequire = parseReasonRequire(bpmnModel, todoTask.getTaskDefinitionKey()); | 165 | Boolean reasonRequire = parseReasonRequire(bpmnModel, todoTask.getTaskDefinitionKey()); |
| 166 | + Integer nodeType = parseNodeType(BpmnModelUtils.getFlowElementById(bpmnModel, todoTask.getTaskDefinitionKey())); | ||
| 165 | 167 | ||
| 166 | // 4. 任务表单 | 168 | // 4. 任务表单 |
| 167 | BpmFormDO taskForm = null; | 169 | BpmFormDO taskForm = null; |
| @@ -170,8 +172,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -170,8 +172,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 170 | } | 172 | } |
| 171 | 173 | ||
| 172 | return BpmTaskConvert.INSTANCE.buildTodoTask(todoTask, childrenTasks, buttonsSetting, taskForm) | 174 | return BpmTaskConvert.INSTANCE.buildTodoTask(todoTask, childrenTasks, buttonsSetting, taskForm) |
| 173 | - .setSignEnable(signEnable) | ||
| 174 | - .setReasonRequire(reasonRequire); | 175 | + .setNodeType(nodeType).setSignEnable(signEnable).setReasonRequire(reasonRequire); |
| 175 | } | 176 | } |
| 176 | 177 | ||
| 177 | @Override | 178 | @Override |
| @@ -194,6 +195,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { | @@ -194,6 +195,10 @@ public class BpmTaskServiceImpl implements BpmTaskService { | ||
| 194 | return PageResult.empty(); | 195 | return PageResult.empty(); |
| 195 | } | 196 | } |
| 196 | List<HistoricTaskInstance> tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); | 197 | List<HistoricTaskInstance> tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); |
| 198 | + | ||
| 199 | + // 特殊:强制移除自动完成的“发起人”节点 | ||
| 200 | + // 补充说明:由于 taskQuery 无法方面的过滤,所以暂时通过内存过滤 | ||
| 201 | + tasks.removeIf(task -> task.getTaskDefinitionKey().equals(START_USER_NODE_ID)); | ||
| 197 | return new PageResult<>(tasks, count); | 202 | return new PageResult<>(tasks, count); |
| 198 | } | 203 | } |
| 199 | 204 |