diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/behavior/CustomServiceTaskDelegateExpressionActivityBehavior.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/behavior/CustomServiceTaskDelegateExpressionActivityBehavior.java index 108939712..2b9c306df 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/behavior/CustomServiceTaskDelegateExpressionActivityBehavior.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/behavior/CustomServiceTaskDelegateExpressionActivityBehavior.java @@ -62,6 +62,7 @@ public class CustomServiceTaskDelegateExpressionActivityBehavior extends Service task.setPropagatedStageInstanceId(execution.getPropagatedStageInstanceId()); task.setName(serviceTask.getName()); TaskHelper.insertTask(task, (ExecutionEntity) execution, true, false); + log.error("ServiceTask execute taskId: {}", task.getId()); // 添加 taskInst 扩展表数据 FlowableEventDispatcher eventDispatcher = processEngineConfiguration.getEventDispatcher(); @@ -81,6 +82,7 @@ public class CustomServiceTaskDelegateExpressionActivityBehavior extends Service org.flowable.engine.TaskService taskService = processEngineConfiguration.getTaskService(); TaskEntity serviceTask = (TaskEntity) taskService.createTaskQuery().taskId(task.getId()) .taskDefinitionKey(execution.getCurrentActivityId()).singleResult(); + log.error("ServiceTask leave taskId: {}", serviceTask.getId()); if (Objects.nonNull(serviceTask)) { // 用于新版日志 serviceTask.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + serviceTask.getId(), APPROVED.getStatus()); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/helper/CustomTaskHelper.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/helper/CustomTaskHelper.java index c506a981d..8f3503ac1 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/helper/CustomTaskHelper.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/helper/CustomTaskHelper.java @@ -80,13 +80,13 @@ public class CustomTaskHelper { return; } ProcessEngineConfigurationImpl processEngineConfiguration = - CommandContextUtil.getProcessEngineConfiguration(commandContext); + CommandContextUtil.getProcessEngineConfiguration(commandContext); Map executionVariables = new HashMap<>(); executionVariables.put("assigneeName", newTaskAssignee.buildAssigneeId()); RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); Execution subExecution = runtimeService.addMultiInstanceExecution(originTask.getTaskDefinitionKey(), - originTask.getProcessInstanceId(), executionVariables); + originTask.getProcessInstanceId(), executionVariables); setParentTaskId(originTask, subExecution); } @@ -96,19 +96,19 @@ public class CustomTaskHelper { return; } ProcessEngineConfigurationImpl processEngineConfiguration = - CommandContextUtil.getProcessEngineConfiguration(commandContext); + CommandContextUtil.getProcessEngineConfiguration(commandContext); RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); runtimeService.deleteMultiInstanceExecution(originTask.getExecutionId(), false); } private static void setParentTaskId(TaskEntity originTask, Execution subExecution) { CommandContextUtil.getEntityCache().findInCache(TaskEntity.class).stream() - .filter(i -> Objects.equals(i.getExecutionId(), subExecution.getId())) - .findAny().ifPresent(i -> i.setParentTaskId(originTask.getId())); + .filter(i -> Objects.equals(i.getExecutionId(), subExecution.getId())) + .findAny().ifPresent(i -> i.setParentTaskId(originTask.getId())); CommandContextUtil.getEntityCache().findInCache(HistoricTaskInstanceEntity.class).stream() - .filter(i -> Objects.equals(i.getExecutionId(), subExecution.getId())) - .findAny().ifPresent(i -> i.setParentTaskId(originTask.getId())); + .filter(i -> Objects.equals(i.getExecutionId(), subExecution.getId())) + .findAny().ifPresent(i -> i.setParentTaskId(originTask.getId())); } /** @@ -121,7 +121,7 @@ public class CustomTaskHelper { public static void validTask(HistoricTaskInstance historicTaskInstance, TaskEntity taskEntity, BpmnTaskDelegateAssigner originTaskAssigner, List nodeTypes) { if (Objects.nonNull(historicTaskInstance) && - (Objects.nonNull(historicTaskInstance.getEndTime()) || Objects.isNull(taskEntity))) { + (Objects.nonNull(historicTaskInstance.getEndTime()) || Objects.isNull(taskEntity))) { throw new WorkflowEngineException(TASK_HAS_BEEN_COMPLETE); } @@ -171,14 +171,14 @@ public class CustomTaskHelper { TaskEntity taskEntity, List targetAssigneeList) { ProcessEngineConfigurationImpl processEngineConfiguration = - CommandContextUtil.getProcessEngineConfiguration(commandContext); + CommandContextUtil.getProcessEngineConfiguration(commandContext); RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); // 这个节点下所有审批人快照 String activityListSnapshot = - INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + taskEntity.getTaskDefinitionKey(); + INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + taskEntity.getTaskDefinitionKey(); List taskAssignerListSnapshot = - runtimeService.getVariable(taskEntity.getProcessInstanceId(), activityListSnapshot, List.class); + runtimeService.getVariable(taskEntity.getProcessInstanceId(), activityListSnapshot, List.class); AtomicInteger existsCount = new AtomicInteger(); taskAssignerListSnapshot.forEach(i -> { targetAssigneeList.forEach(j -> { @@ -228,19 +228,19 @@ public class CustomTaskHelper { return; } ProcessEngineConfigurationImpl processEngineConfiguration = - CommandContextUtil.getProcessEngineConfiguration(commandContext); + CommandContextUtil.getProcessEngineConfiguration(commandContext); TaskService taskService = processEngineConfiguration.getTaskService(); Authentication.setAuthenticatedUserId(assigner.buildAssigneeId()); attachmentList.forEach(dto -> { Attachment attachment = taskService.createAttachment(dto.getType().getType(), taskId, processInstanceId, - dto.getName(), dto.getDescription(), dto.getUrl()); + dto.getName(), dto.getDescription(), dto.getUrl()); taskService.saveAttachment(attachment); }); Authentication.setAuthenticatedUserId(null); } public static void addComment(CommandContext commandContext, String taskId, String processInstanceId, - String type, String message) { + String type, String message) { TaskEntity task = new TaskEntityImpl(); task.setId(taskId); task.setProcessInstanceId(processInstanceId); @@ -256,7 +256,7 @@ public class CustomTaskHelper { return; } ProcessEngineConfigurationImpl processEngineConfiguration = - CommandContextUtil.getProcessEngineConfiguration(commandContext); + CommandContextUtil.getProcessEngineConfiguration(commandContext); String userId = Authentication.getAuthenticatedUserId(); CommentEntity comment = processEngineConfiguration.getCommentEntityManager().create(); @@ -276,13 +276,12 @@ public class CustomTaskHelper { comment.setFullMessage(message); processEngineConfiguration.getCommentEntityManager().insert(comment); - - task.setTransientVariable(type, message); + task.setTransientVariableLocal(type, message); } public static Attachment addAttachment(CommandContext commandContext, Task task, AttachmentDTO attachmentDto) { ProcessEngineConfigurationImpl processEngineConfiguration = - CommandContextUtil.getProcessEngineConfiguration(commandContext); + CommandContextUtil.getProcessEngineConfiguration(commandContext); AttachmentEntity attachment = processEngineConfiguration.getAttachmentEntityManager().create(); attachment.setName(attachmentDto.getName()); attachment.setProcessInstanceId(task.getProcessInstanceId()); @@ -298,11 +297,11 @@ public class CustomTaskHelper { ExecutionEntity processInstance = null; if (task.getProcessInstanceId() != null) { processInstance = - processEngineConfiguration.getExecutionEntityManager().findById(task.getProcessInstanceId()); + processEngineConfiguration.getExecutionEntityManager().findById(task.getProcessInstanceId()); } processEngineConfiguration.getHistoryManager().createAttachmentComment((TaskEntity) task, processInstance, - attachmentDto.getName(), true); + attachmentDto.getName(), true); return attachment; } @@ -321,15 +320,15 @@ public class CustomTaskHelper { * @return */ public static Task createVirtualTask(CommandContext commandContext, ExtAxHiTaskInstService extAxHiTaskInstService - , String processInstanceId, String nodeName, String taskDefinitionKey, String advice, + , String processInstanceId, String nodeName, String taskDefinitionKey, String advice, BpmnTaskDelegateAssigner assigner, String extTaskInstStatus, AddComment addComment) { ProcessEngineConfigurationImpl processEngineConfiguration = - CommandContextUtil.getProcessEngineConfiguration(commandContext); + CommandContextUtil.getProcessEngineConfiguration(commandContext); HistoryService historyService = processEngineConfiguration.getHistoryService(); HistoricProcessInstance processInstance = - historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); TaskService taskService = processEngineConfiguration.getTaskService(); IdGenerator idGenerator = processEngineConfiguration.getIdGenerator(); @@ -346,12 +345,12 @@ public class CustomTaskHelper { if (Objects.nonNull(assigner)) { CommandContextUtil.getEntityCache().findInCache(TaskEntity.class).stream() - .filter(i -> Objects.equals(i.getId(), task.getId())).findAny() - .ifPresent(i -> i.setAssignee(assigner.buildAssigneeId())); + .filter(i -> Objects.equals(i.getId(), task.getId())).findAny() + .ifPresent(i -> i.setAssignee(assigner.buildAssigneeId())); CommandContextUtil.getEntityCache().findInCache(HistoricTaskInstanceEntity.class).stream() - .filter(i -> Objects.equals(i.getId(), task.getId())).findAny() - .ifPresent(i -> i.setAssignee(assigner.buildAssigneeId())); + .filter(i -> Objects.equals(i.getId(), task.getId())).findAny() + .ifPresent(i -> i.setAssignee(assigner.buildAssigneeId())); } // 添加审批意见 @@ -360,7 +359,7 @@ public class CustomTaskHelper { addComment(commandContext, task, addComment); CustomTaskHelper.createExtTaskInst(extAxHiTaskInstService, task.getProcessInstanceId(), task.getId(), - task.getTaskDefinitionKey(), assigner, extTaskInstStatus); + task.getTaskDefinitionKey(), assigner, extTaskInstStatus); task.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + task.getId(), extTaskInstStatus); // 保存任务 @@ -389,7 +388,6 @@ public class CustomTaskHelper { if (StringUtils.hasLength(comment)) { Authentication.setAuthenticatedUserId(userId); addComment(commandContext, task, COMMENT_TYPE_ADVICE, comment); - task.setTransientVariable(COMMENT_TYPE_ADVICE + task.getId(), comment); Authentication.setAuthenticatedUserId(null); } } @@ -417,10 +415,10 @@ public class CustomTaskHelper { return delegateAssigners; } return new ArrayList<>(delegateAssigners.stream() - .filter(i -> StringUtils.hasText(i.getPersonId())) - .filter(i -> !Objects.equals(i.getPersonId(), "null")) - .collect(Collectors.toMap(BpmnTaskDelegateAssigner::getPersonId, Function.identity(), (s, t) -> s)) - .values()); + .filter(i -> StringUtils.hasText(i.getPersonId())) + .filter(i -> !Objects.equals(i.getPersonId(), "null")) + .collect(Collectors.toMap(BpmnTaskDelegateAssigner::getPersonId, Function.identity(), (s, t) -> s)) + .values()); } /** @@ -447,27 +445,27 @@ public class CustomTaskHelper { List result = new ArrayList<>(); List taskInstances = historyService.createHistoricTaskInstanceQuery() - .processInstanceId(processInstanceId) - .orderByHistoricTaskInstanceStartTime() - .desc().list(); + .processInstanceId(processInstanceId) + .orderByHistoricTaskInstanceStartTime() + .desc().list(); List vos = historicTaskInstanceConverter.toVosSkipSystemOperation(taskInstances, - serviceVersion); + serviceVersion); Map variableInstanceMap = - // 不能使用框架提供的历史变量 API 查询,有 BUG - historyService.createNativeHistoricVariableInstanceQuery() - .sql("select * from ACT_HI_VARINST t where t.proc_inst_id_= #{processInstanceId}") - .parameter("processInstanceId", processInstanceId) - .list().stream() - .collect(Collectors.toMap(HistoricVariableInstance::getVariableName, - Function.identity(), (s, t) -> s)); + // 不能使用框架提供的历史变量 API 查询,有 BUG + historyService.createNativeHistoricVariableInstanceQuery() + .sql("select * from ACT_HI_VARINST t where t.proc_inst_id_= #{processInstanceId}") + .parameter("processInstanceId", processInstanceId) + .list().stream() + .collect(Collectors.toMap(HistoricVariableInstance::getVariableName, + Function.identity(), (s, t) -> s)); vos.forEach(vo -> { HistoricVariableInstance assginerSnapshot = - variableInstanceMap.getOrDefault(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + vo.getTaskId(), - null); + variableInstanceMap.getOrDefault(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + vo.getTaskId(), + null); if (Objects.isNull(assginerSnapshot)) { assginerSnapshot = - variableInstanceMap.getOrDefault(OLD_INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + vo.getTaskId(), null); + variableInstanceMap.getOrDefault(OLD_INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + vo.getTaskId(), null); } if (Objects.nonNull(assginerSnapshot)) { BpmnTaskDelegateAssigner assigner = BpmnTaskDelegateAssigner.toObjectCompatible(assginerSnapshot.getValue()); @@ -483,27 +481,27 @@ public class CustomTaskHelper { ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); Process process = ProcessDefinitionUtil.getProcess(processDefinitionId); List taskDefinitionKeys = process.getFlowElements().stream() - .filter(i -> Objects.equals(BpmnMetaParserHelper.getNodeType(i).orElse(null), BpmnFlowNodeType.NODE_CARBON_COPY)) - .map(FlowElement::getId) - .collect(Collectors.toList()); + .filter(i -> Objects.equals(BpmnMetaParserHelper.getNodeType(i).orElse(null), BpmnFlowNodeType.NODE_CARBON_COPY)) + .map(FlowElement::getId) + .collect(Collectors.toList()); if (CollectionUtils.isEmpty(taskDefinitionKeys)) { return Collections.emptyList(); } List variableInstances = processEngineConfiguration.getHistoryService().createHistoricVariableInstanceQuery() - .variableNameLike(INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT) - .processInstanceId(processInstanceId) - .list(); + .variableNameLike(INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT) + .processInstanceId(processInstanceId) + .list(); if (CollectionUtils.isEmpty(variableInstances)) { return Collections.emptyList(); } List result = new ArrayList<>(); taskDefinitionKeys.forEach(j -> { variableInstances.stream() - .filter(i -> Objects.equals(i.getVariableName(), INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + j)) - .findFirst().ifPresent(i -> { - result.addAll((List) i.getValue()); - }); + .filter(i -> Objects.equals(i.getVariableName(), INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + j)) + .findFirst().ifPresent(i -> { + result.addAll((List) i.getValue()); + }); }); return result; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/entity/type/TaskEntityEventHandle.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/entity/type/TaskEntityEventHandle.java index 65597e5eb..7cf46102f 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/entity/type/TaskEntityEventHandle.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/entity/type/TaskEntityEventHandle.java @@ -108,12 +108,12 @@ public class TaskEntityEventHandle implements EntityEventHandle { update.setStatus(APPROVED.getStatus()); } else { - Object advice = taskEntity.getTransientVariable(COMMENT_TYPE_ADVICE); + Object advice = taskEntity.getTransientVariableLocal(COMMENT_TYPE_ADVICE); if (Objects.nonNull(advice) && StringUtils.hasText(advice.toString())) { log.info("COMMENT_TYPE_ADVICE: {}", advice); update.setAdvice(advice.toString()); } - Object operationDesc = taskEntity.getTransientVariable(COMMENT_TYPE_OPERATION_DESC); + Object operationDesc = taskEntity.getTransientVariableLocal(COMMENT_TYPE_OPERATION_DESC); if (Objects.nonNull(operationDesc) && StringUtils.hasText(operationDesc.toString())) { log.info("COMMENT_TYPE_OPERATION_DESC: {}", operationDesc); update.setOperationDesc(Objects.nonNull(assignee) ? assignee.getAssignerName() + operationDesc : operationDesc.toString()); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java index c4b05732b..6dae6bbb1 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java @@ -1061,7 +1061,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic .orElse(variables.getOrDefault(OLD_INTERNAL_INITIATOR, null)))) .tenantId(historicProcessInstance.getTenantId()) .agented((Boolean) Optional.ofNullable(variables.get(INTERNAL_PROCESS_AGENT)).orElse(false)) - .taskDetails(genericTaskLogVos(historicProcessInstance.getId(), logs, forecasting, dto.getEncrypt())) + .taskDetails(genericTaskLogVos(historicProcessInstance.getId(), logs, forecasting, dto)) .defaultButtonConf(getButtonConfig(bpmnModel.getMainProcess()).orElse(new BpmnButtonConf())) .supportBatchOperation(getProcessApproveConf(bpmnModel.getMainProcess()).orElse(new BpmnApproveConf()).getSupportBatchOperation()) .userAgreeSignature(getProcessApproveConf(bpmnModel.getMainProcess()).orElse(new BpmnApproveConf()).getUserAgreeSignature()) @@ -1199,17 +1199,17 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic private List genericTaskLogVos(String processInstanceId, List logs, List forecasting, - Boolean encrypt) { + BpmnProcessInstanceLogQueryDTO dto) { List tasks = new ArrayList<>(); Map> attachmentByTaskMap = taskService.getProcessInstanceAttachments(processInstanceId).stream() .collect(Collectors.groupingBy(Attachment::getTaskId)); // 已完成的和进行中的 - getHistoricTasks(logs, tasks, attachmentByTaskMap); + getHistoricTasks(logs, tasks, attachmentByTaskMap, dto.getVisitor()); // 未来节点 getFutureTasks(forecasting, tasks); // 处理是否加密 - handleEncrypt(encrypt, tasks); + handleEncrypt(dto.getEncrypt(), tasks); return tasks; } @@ -1249,7 +1249,10 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic }); } - private void getHistoricTasks(List logs, List tasks, Map> attachmentByTaskMap) { + private void getHistoricTasks(List logs, + List tasks, + Map> attachmentByTaskMap, + BpmnTaskDelegateAssigner visitor) { ListUtils.emptyIfNull(logs).forEach(e -> { Optional processingTask = tasks.stream().filter(i -> Objects.equals(PROCESSING, i.getResult())) .filter(i -> Objects.equals(i.getTaskDefinitionKey(), e.getActivityId())).findAny(); @@ -1258,7 +1261,9 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic // 多实例的情况,需要合并节点 processingTask.ifPresent(i -> { List assigners = new ArrayList<>(ListUtils.emptyIfNull(i.getForecastAssignees())); - assigners.add(i.getAssigneeSnapshot()); + if(CollectionUtils.isEmpty(assigners)) { + assigners.add(i.getAssigneeSnapshot()); + } assigners.add(BpmnTaskDelegateAssigner.toObjectCompatible(CollectionUtils.isEmpty(ListUtils.emptyIfNull(e.getAssigneeFull())) ? null : e.getAssigneeFull().get(0))); switch (i.getNodeMode()) { case AND: @@ -1273,6 +1278,9 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic } i.setAssigneeSnapshot(null); i.setForecastAssignees(assigners); + // 根据当前登录人重设聚合后的节点 taskId + assigners.stream().filter(user-> Objects.equals(user.getPersonId(), visitor.getPersonId())).findFirst() + .ifPresent(user-> i.setTaskId(e.getTaskId())); }); } else { tasks.add(BpmnTaskInstanceLogVO.builder() diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/BasicPopulateAvatarController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/BasicPopulateAvatarController.java new file mode 100644 index 000000000..fe22b2991 --- /dev/null +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/BasicPopulateAvatarController.java @@ -0,0 +1,62 @@ +package cn.axzo.workflow.server.controller.web; + +import cn.axzo.karma.client.feign.FlowSupportApi; +import cn.axzo.karma.client.model.request.PersonProfileQueryReq; +import cn.axzo.karma.client.model.response.PersonProfileResp; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; +import cn.axzo.workflow.server.common.util.RpcExternalUtil; +import com.google.common.collect.Lists; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * 公共的获取 BpmnTask + * + * @author wangli + * @since 2024-09-09 16:51 + */ +public abstract class BasicPopulateAvatarController { + + @Resource + protected FlowSupportApi flowSupportApi; + + /** + * 为一个人填充头像 + * + * @param assigner + */ + protected final void populateUsersAvatar(BpmnTaskDelegateAssigner assigner) { + if (Objects.isNull(assigner)) { + return; + } + populateUsersAvatar(Lists.newArrayList(assigner)); + } + + /** + * 为一个集合的人填充头像 + * + * @param assigners + */ + protected final void populateUsersAvatar(List assigners) { + List personIds = assigners.stream().filter(e -> !StringUtils.hasText(e.getAvatar()) && StringUtils.hasText(e.getPersonId())) + .map(BpmnTaskDelegateAssigner::getPersonId) + .map(Long::parseLong) + .distinct().collect(Collectors.toList()); + Map personMap = RpcExternalUtil.rpcApiResultProcessor(() -> flowSupportApi.listPersons(PersonProfileQueryReq.builder().personIds(personIds).build()), + "查询档案信息", "cn.axzo.karma.client.feign.FlowSupportApi.listPersons", personIds).stream() + .collect(Collectors.toMap(PersonProfileResp::getId, PersonProfileResp::getAvatarUrl)); + assigners.forEach(e -> { + long personId = Long.parseLong(Optional.ofNullable(e.getPersonId()).orElse("-1")); + if (personMap.containsKey(personId)) { + e.setAvatar(personMap.getOrDefault(personId, "")); + } + }); + } + +} diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java index 21df13adc..87b927577 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java @@ -1,5 +1,8 @@ package cn.axzo.workflow.server.controller.web.bpmn; +import cn.axzo.karma.client.feign.FlowSupportApi; +import cn.axzo.karma.client.model.request.PersonProfileQueryReq; +import cn.axzo.karma.client.model.response.PersonProfileResp; import cn.axzo.workflow.client.feign.bpmn.ProcessActivityApi; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO; @@ -8,10 +11,13 @@ import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.service.BpmnProcessActivityService; import cn.axzo.workflow.server.common.annotation.ErrorReporter; import cn.axzo.workflow.server.common.annotation.RepeatSubmit; +import cn.axzo.workflow.server.common.util.RpcExternalUtil; +import cn.axzo.workflow.server.controller.web.BasicPopulateAvatarController; import cn.azxo.framework.common.model.CommonResponse; import com.alibaba.fastjson.JSON; import io.swagger.v3.oas.annotations.Operation; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -24,6 +30,9 @@ import javax.annotation.Resource; import javax.validation.constraints.NotBlank; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; import static cn.axzo.workflow.core.common.code.BpmnTaskRespCode.ACTIVITY_BIZ_SET_ASSIGNEE_HAS_REPEAT; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDuplicateByPersonId; @@ -40,10 +49,12 @@ import static cn.azxo.framework.common.model.CommonResponse.success; @RestController @ErrorReporter @Validated -public class BpmnProcessActivityController implements ProcessActivityApi { +public class BpmnProcessActivityController extends BasicPopulateAvatarController implements ProcessActivityApi { @Resource private BpmnProcessActivityService bpmnProcessActivityService; + @Resource + private FlowSupportApi flowSupportApi; /** * 业务节点唤醒 旧版本使用的接口 @@ -101,6 +112,10 @@ public class BpmnProcessActivityController implements ProcessActivityApi { } else { dto.setAssigners(removeDuplicateByPersonId(dto.getAssigners())); } + + //填充头像 + populateUsersAvatar(dto.getAssigners()); + bpmnProcessActivityService.setAssignee(dto); return success(true); } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessInstanceController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessInstanceController.java index 6f50246cb..2b024a66e 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessInstanceController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessInstanceController.java @@ -31,6 +31,7 @@ import cn.axzo.workflow.core.service.BpmnProcessInstanceService; import cn.axzo.workflow.server.common.annotation.ErrorReporter; import cn.axzo.workflow.server.common.annotation.RepeatSubmit; import cn.axzo.workflow.server.common.util.RpcExternalUtil; +import cn.axzo.workflow.server.controller.web.BasicPopulateAvatarController; import cn.azxo.framework.common.model.CommonResponse; import cn.hutool.json.JSONUtil; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -70,7 +71,7 @@ import static cn.azxo.framework.common.model.CommonResponse.success; @RestController @ErrorReporter @Validated -public class BpmnProcessInstanceController implements ProcessInstanceApi { +public class BpmnProcessInstanceController extends BasicPopulateAvatarController implements ProcessInstanceApi { @Resource private BpmnProcessInstanceService bpmnProcessInstanceService; @@ -113,13 +114,8 @@ public class BpmnProcessInstanceController implements ProcessInstanceApi { @RepeatSubmit public CommonResponse createProcessInstance(@Validated @RequestBody BpmnProcessInstanceCreateDTO dto) { log.info("发起审核createProcessInstance===>>>参数:{}", JSONUtil.toJsonStr(dto)); - long personId = Long.parseLong(Optional.ofNullable(dto.getInitiator().getPersonId()).orElse("-1")); - Map personMap = RpcExternalUtil.rpcApiResultProcessor(() -> flowSupportApi.listPersons(PersonProfileQueryReq.builder().personId(personId).build()), - "查询档案信息", "cn.axzo.karma.client.feign.FlowSupportApi.listPersons", personId).stream() - .collect(Collectors.toMap(PersonProfileResp::getId, PersonProfileResp::getAvatarUrl)); - if (personMap.containsKey(personId)) { - dto.getInitiator().setAvatar(personMap.getOrDefault(personId, "")); - } + // 填充头像 + populateUsersAvatar(dto.getInitiator()); return success(bpmnProcessInstanceService.createProcessInstance(dto)); } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessTaskController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessTaskController.java index 257aaeb53..94e43fa20 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessTaskController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessTaskController.java @@ -29,6 +29,7 @@ import cn.axzo.workflow.core.service.BpmnProcessTaskService; import cn.axzo.workflow.server.common.annotation.ErrorReporter; import cn.axzo.workflow.server.common.annotation.RepeatSubmit; import cn.axzo.workflow.server.common.util.RpcExternalUtil; +import cn.axzo.workflow.server.controller.web.BasicPopulateAvatarController; import cn.azxo.framework.common.model.CommonResponse; import com.alibaba.fastjson.JSON; import io.swagger.v3.oas.annotations.Operation; @@ -64,7 +65,7 @@ import static cn.azxo.framework.common.model.CommonResponse.success; @RestController @ErrorReporter @Validated -public class BpmnProcessTaskController implements ProcessTaskApi { +public class BpmnProcessTaskController extends BasicPopulateAvatarController implements ProcessTaskApi { @Resource private BpmnProcessTaskService bpmnProcessTaskService; @@ -189,15 +190,8 @@ public class BpmnProcessTaskController implements ProcessTaskApi { @RepeatSubmit public CommonResponse transferTask(@Validated @RequestBody BpmnTaskTransferDTO dto) { log.info("转交任务 transferTask===>>>参数:{}", JSON.toJSONString(dto)); - - long personId = Long.parseLong(Optional.ofNullable(dto.getTargetAssigner().getPersonId()).orElse("-1")); - Map personMap = RpcExternalUtil.rpcApiResultProcessor(() -> flowSupportApi.listPersons(PersonProfileQueryReq.builder().personId(personId).build()), - "查询档案信息", "cn.axzo.karma.client.feign.FlowSupportApi.listPersons", personId).stream() - .collect(Collectors.toMap(PersonProfileResp::getId, PersonProfileResp::getAvatarUrl)); - if (personMap.containsKey(personId)) { - dto.getTargetAssigner().setAvatar(personMap.getOrDefault(personId, "")); - } - + // 填充头像 + populateUsersAvatar(dto.getTargetAssigner()); bpmnProcessTaskService.transferTask(dto); return success(true); } @@ -234,21 +228,8 @@ public class BpmnProcessTaskController implements ProcessTaskApi { @RepeatSubmit public CommonResponse countersignTask(@Validated @RequestBody BpmnTaskCountersignDTO countersignDTO) { log.info("加签任务 countersignTask===>>>参数:{}", JSON.toJSONString(countersignDTO)); - - List personIds = countersignDTO.getTargetAssignerList().stream().filter(e -> !StringUtils.hasText(e.getAvatar()) && StringUtils.hasText(e.getPersonId())) - .map(BpmnTaskDelegateAssigner::getPersonId) - .map(Long::parseLong) - .distinct().collect(Collectors.toList()); - Map personMap = RpcExternalUtil.rpcApiResultProcessor(() -> flowSupportApi.listPersons(PersonProfileQueryReq.builder().personIds(personIds).build()), - "查询档案信息", "cn.axzo.karma.client.feign.FlowSupportApi.listPersons", personIds).stream() - .collect(Collectors.toMap(PersonProfileResp::getId, PersonProfileResp::getAvatarUrl)); - countersignDTO.getTargetAssignerList().forEach(e -> { - long personId = Long.parseLong(Optional.ofNullable(e.getPersonId()).orElse("-1")); - if (personMap.containsKey(personId)) { - e.setAvatar(personMap.getOrDefault(personId, "")); - } - }); - + // 填充头像 + populateUsersAvatar(countersignDTO.getTargetAssignerList()); bpmnProcessTaskService.countersignTask(countersignDTO); return success(true); }