From b8a40869709fa5e71e3cda0457a1cd8e9e7946f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sat, 25 Jan 2025 10:43:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(flow):=20=E9=80=82=E9=85=8D=20form-design?= =?UTF-8?q?=20=E8=A1=A8=E5=8D=95=E8=AE=BE=E8=AE=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pigx-flow-engine-biz/pom.xml | 5 + .../controller/EngineFlowController.java | 2 - .../EngineProcessInstanceController.java | 6 +- .../controller/EngineTaskController.java | 24 + .../engine/expression/ExpressionHandler.java | 9 +- .../NodeExpressionStrategyFactory.java | 19 +- .../impl/DateNodeConditionStrategy.java | 2 +- .../impl/InputNodeConditionStrategy.java | 2 +- .../impl/MoneyNodeConditionStrategy.java | 28 -- .../impl/NumberNodeConditionStrategy.java | 2 +- .../impl/TimeNodeConditionStrategy.java | 2 +- .../listeners/FlowProcessEventListener.java | 17 +- .../impl/AssignUserFixedStrategyImpl.java | 10 +- .../node/impl/AssignUserFormStrategyImpl.java | 3 +- .../node/impl/AssignUserRoleStrategyImpl.java | 5 +- .../engine/service/ApproveServiceTask.java | 12 +- .../flow/engine/service/CopyServiceTask.java | 15 +- .../pigx/flow/engine/utils/FlowableUtils.java | 14 +- .../pigx/flow/engine/utils/ModelUtil.java | 3 +- .../api/feign/RemoteFlowEngineService.java | 6 +- .../task/api/feign/RemoteFlowTaskService.java | 7 - .../pigx/flow/task/constant/IBaseEnum.java | 6 +- .../pigx/flow/task/dto/TaskParamDto.java | 73 +-- .../pigx/flow/task/vo/FormItemVO.java | 5 +- .../pigx/flow/task/vo/ProcessVO.java | 5 + .../pigx-flow-task/pigx-flow-task-biz/pom.xml | 5 + .../task/config/SequenceConfiguration.java | 13 +- .../controller/ProcessInstanceController.java | 31 +- .../controller/ProcessNodeDataController.java | 2 - .../task/controller/RemoteController.java | 30 +- .../impl/CombinationGroupServiceImpl.java | 54 ++- .../service/impl/ProcessCopyServiceImpl.java | 114 ++--- .../impl/ProcessInstanceServiceImpl.java | 73 +-- .../impl/ProcessNodeDataServiceImpl.java | 9 +- ...rocessNodeRecordAssignUserServiceImpl.java | 22 +- .../impl/ProcessNodeRecordServiceImpl.java | 11 +- .../task/service/impl/ProcessServiceImpl.java | 350 +++++++------- .../task/service/impl/RemoteServiceImpl.java | 13 +- .../task/service/impl/TaskServiceImpl.java | 435 ++++++++---------- .../pigx/flow/task/utils/DataUtil.java | 10 +- .../pigx/flow/task/utils/NodeFormatUtil.java | 12 +- 41 files changed, 672 insertions(+), 794 deletions(-) delete mode 100644 pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/MoneyNodeConditionStrategy.java diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/pom.xml b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/pom.xml index e96096b60..f473cf8bc 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/pom.xml +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/pom.xml @@ -74,6 +74,11 @@ com.pig4cloud pigx-common-sentinel + + + com.pig4cloud + pigx-common-encrypt-api + com.pig4cloud diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java index 7a86dc0a5..ac353f0c6 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java @@ -11,7 +11,6 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.common.security.annotation.Inner; import com.pig4cloud.pigx.flow.engine.utils.ModelUtil; import com.pig4cloud.pigx.flow.task.dto.*; import com.pig4cloud.pigx.flow.task.entity.Process; @@ -96,7 +95,6 @@ public class EngineFlowController { * @param processInstanceParamDto 启动参数 * @return 流程实例ID */ - @Inner @PostMapping("/start") public R start(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { Authentication.setAuthenticatedUserId(processInstanceParamDto.getStartUserId()); diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineProcessInstanceController.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineProcessInstanceController.java index 392a3c0a5..36c7e75c1 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineProcessInstanceController.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineProcessInstanceController.java @@ -46,8 +46,10 @@ public class EngineProcessInstanceController { long completedNum = historicActivityInstanceQuery.taskAssignee(String.valueOf(userId)).finished().count(); - IndexPageStatistics indexPageStatistics = IndexPageStatistics.builder().pendingNum(pendingNum) - .completedNum(completedNum).build(); + IndexPageStatistics indexPageStatistics = IndexPageStatistics.builder() + .pendingNum(pendingNum) + .completedNum(completedNum) + .build(); return R.ok(indexPageStatistics); } diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineTaskController.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineTaskController.java index 470ba04df..46ba0cb5f 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineTaskController.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineTaskController.java @@ -154,4 +154,28 @@ public class EngineTaskController { return R.ok(); } + /** + * 设置执行人 (转办) + * + * @param taskParamDto 任务参数DTO + * @return 操作结果 + */ + @PostMapping("/transferTask") + public R transferTask(@RequestBody TaskParamDto taskParamDto) { + Map taskLocalParamMap = taskParamDto.getTaskLocalParamMap(); + if (CollUtil.isNotEmpty(taskLocalParamMap)) { + taskService.setVariablesLocal(taskParamDto.getTaskId(), taskLocalParamMap); + } + + // 设置任务的 owner 为当前任务的 assignee + Task task = taskService.createTaskQuery().taskId(taskParamDto.getTaskId()).includeTaskLocalVariables().singleResult(); + taskService.setOwner(taskParamDto.getTaskId(), task.getAssignee()); + + // 设置任务的 assignee 为目标用户 (转办用户) + for (Long targetUserId : taskParamDto.getTargetUserIdList()) { + taskService.setAssignee(taskParamDto.getTaskId(), targetUserId.toString()); + } + return R.ok(); + } + } diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/ExpressionHandler.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/ExpressionHandler.java index 21da08529..de102b0e3 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/ExpressionHandler.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/ExpressionHandler.java @@ -44,7 +44,8 @@ public class ExpressionHandler { Object variable = execution.getVariable(key); NodeUser nodeUserDto = objectMapper .readValue(objectMapper.writeValueAsString(variable), new TypeReference>() { - }).get(0); + }) + .get(0); return nodeUserDto.getId(); } @@ -289,11 +290,13 @@ public class ExpressionHandler { }); List deptIdList = paramDeptList.stream() - .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())).map(NodeUser::getId) + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())) + .map(NodeUser::getId) .collect(Collectors.toList()); List userIdList = paramDeptList.stream() - .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())).map(NodeUser::getId) + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())) + .map(NodeUser::getId) .collect(Collectors.toList()); if (CollUtil.isNotEmpty(deptIdList)) { diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeExpressionStrategyFactory.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeExpressionStrategyFactory.java index f4550879d..30c370825 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeExpressionStrategyFactory.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/NodeExpressionStrategyFactory.java @@ -10,18 +10,27 @@ import com.pig4cloud.pigx.flow.task.dto.Node; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; public class NodeExpressionStrategyFactory { public static String handleSingleCondition(Condition nodeConditionDto) { Map nodeConditionStrategyMap = SpringUtil - .getBeansOfType(NodeConditionStrategy.class); - NodeConditionStrategy nodeConditionHandler = nodeConditionStrategyMap - .get(nodeConditionDto.getKeyType() + "NodeConditionStrategy"); - if (nodeConditionHandler == null) { + .getBeansOfType(NodeConditionStrategy.class); + + // 通过keyType获取对应的处理器, 忽略大小写 + AtomicReference nodeConditionHandler = new AtomicReference<>(); + nodeConditionStrategyMap.forEach((k, v) -> { + if (k.equalsIgnoreCase(nodeConditionDto.getKeyType() + "NodeConditionStrategy")) { + nodeConditionHandler.set(v); + } + }); + + + if (nodeConditionHandler.get() == null) { return "(1==1)"; } - return nodeConditionHandler.handle(nodeConditionDto); + return nodeConditionHandler.get().handle(nodeConditionDto); } /** diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateNodeConditionStrategy.java index 85a17089f..8c4ff67c2 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateNodeConditionStrategy.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/DateNodeConditionStrategy.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; /** * 字符类型处理器 */ -@Component("DateNodeConditionStrategy") +@Component("datePickerNodeConditionStrategy") public class DateNodeConditionStrategy implements NodeConditionStrategy { /** diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/InputNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/InputNodeConditionStrategy.java index 6176f80b6..c9d8077d7 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/InputNodeConditionStrategy.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/InputNodeConditionStrategy.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; /** * 字符类型处理器 */ -@Component("InputNodeConditionStrategy") +@Component("inputNodeConditionStrategy") public class InputNodeConditionStrategy implements NodeConditionStrategy { /** diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/MoneyNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/MoneyNodeConditionStrategy.java deleted file mode 100644 index 90e720521..000000000 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/MoneyNodeConditionStrategy.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pig4cloud.pigx.flow.engine.expression.condition.impl; - -import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pigx.flow.engine.expression.condition.NodeConditionStrategy; -import com.pig4cloud.pigx.flow.task.dto.Condition; -import org.springframework.stereotype.Component; - -/** - * 字符类型处理器 - */ -@Component("MoneyNodeConditionStrategy") -public class MoneyNodeConditionStrategy implements NodeConditionStrategy { - - /** - * 抽象方法 处理表达式 - */ - @Override - public String handle(Condition condition) { - - String compare = condition.getExpression(); - String id = condition.getKey(); - Object value = condition.getValue(); - - return StrUtil.format("(expressionHandler.numberCompare(\"{}\",\"{}\",{},execution))", id, compare, value); - - } - -} diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/NumberNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/NumberNodeConditionStrategy.java index a55086c55..d722b6444 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/NumberNodeConditionStrategy.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/NumberNodeConditionStrategy.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; /** * 字符类型处理器 */ -@Component("NumberNodeConditionStrategy") +@Component("inputNumberNodeConditionStrategy") public class NumberNodeConditionStrategy implements NodeConditionStrategy { /** diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TimeNodeConditionStrategy.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TimeNodeConditionStrategy.java index 44db0c2f0..7ba8adea9 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TimeNodeConditionStrategy.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/expression/condition/impl/TimeNodeConditionStrategy.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; /** * 字符类型处理器 */ -@Component("TimeNodeConditionStrategy") +@Component("timePickerNodeConditionStrategy") public class TimeNodeConditionStrategy implements NodeConditionStrategy { /** diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/FlowProcessEventListener.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/FlowProcessEventListener.java index 6df3850f1..f3330ee82 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/FlowProcessEventListener.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/listeners/FlowProcessEventListener.java @@ -72,10 +72,12 @@ public class FlowProcessEventListener implements FlowableEventListener { remoteFlowTaskService.startNodeEvent(processNodeRecordParamDto); } - if (event.getType().toString() + if (event.getType() + .toString() .equals(FlowableEngineEventType.MULTI_INSTANCE_ACTIVITY_COMPLETED_WITH_CONDITION.toString()) - || event.getType().toString() - .equals(FlowableEngineEventType.MULTI_INSTANCE_ACTIVITY_COMPLETED.toString())) { + || event.getType() + .toString() + .equals(FlowableEngineEventType.MULTI_INSTANCE_ACTIVITY_COMPLETED.toString())) { // 多实例任务 FlowableMultiInstanceActivityCompletedEventImpl flowableActivityEvent = (FlowableMultiInstanceActivityCompletedEventImpl) event; String activityId = flowableActivityEvent.getActivityId(); @@ -140,7 +142,8 @@ public class FlowProcessEventListener implements FlowableEventListener { log.debug("变量[{}]删除了:{} ", flowableVariableEvent.getVariableName(), flowableVariableEvent.getVariableValue()); } - if (event.getType().toString() + if (event.getType() + .toString() .equals(FlowableEngineEventType.PROCESS_COMPLETED_WITH_TERMINATE_END_EVENT.toString())) { // 流程开完成 FlowableProcessTerminatedEventImpl e = (FlowableProcessTerminatedEventImpl) event; @@ -223,9 +226,9 @@ public class FlowProcessEventListener implements FlowableEventListener { processNodeRecordAssignUserParamDto.setTaskId(task.getId()); processNodeRecordAssignUserParamDto.setNodeName(task.getName()); processNodeRecordAssignUserParamDto - .setTaskType(StrUtil.equals(DelegationState.PENDING.toString(), delegationStateString) - ? "DELEGATION" : (StrUtil.equals(DelegationState.RESOLVED.toString(), delegationStateString) - ? "RESOLVED" : "")); + .setTaskType(StrUtil.equals(DelegationState.PENDING.toString(), delegationStateString) ? "DELEGATION" + : (StrUtil.equals(DelegationState.RESOLVED.toString(), delegationStateString) ? "RESOLVED" + : "")); processNodeRecordAssignUserParamDto.setApproveDesc(Convert.toStr(task.getVariableLocal("approveDesc"))); processNodeRecordAssignUserParamDto.setExecutionId(task.getExecutionId()); diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFixedStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFixedStrategyImpl.java index 098bcd5d1..6257e96b9 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFixedStrategyImpl.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFixedStrategyImpl.java @@ -44,12 +44,14 @@ public class AssignUserFixedStrategyImpl implements AssignUserStrategy { List userDtoList = node.getNodeUserList(); // 用户ID列表 List userIdList = userDtoList.stream() - .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())).map(NodeUser::getId) - .collect(Collectors.toList()); + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())) + .map(NodeUser::getId) + .collect(Collectors.toList()); // 部门ID列表 List deptIdList = userDtoList.stream() - .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())).map(NodeUser::getId) - .collect(Collectors.toList()); + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())) + .map(NodeUser::getId) + .collect(Collectors.toList()); if (CollUtil.isNotEmpty(deptIdList)) { R> r = remoteUserService.getUserIdListByDeptIdList(deptIdList); diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFormStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFormStrategyImpl.java index 2facc3138..5be14b2de 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFormStrategyImpl.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserFormStrategyImpl.java @@ -14,7 +14,6 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** * 来自表单 @@ -38,7 +37,7 @@ public class AssignUserFormStrategyImpl implements AssignUserStrategy { if (variable != null && !StrUtil.isBlankIfStr(variable)) { String jsonString = objectMapper.writeValueAsString(variable); List nodeUserDtoList = JSONUtil.toList(jsonString, NodeUser.class); - assignList.addAll(nodeUserDtoList.stream().map(NodeUser::getId).collect(Collectors.toList())); + assignList.addAll(nodeUserDtoList.stream().map(NodeUser::getId).toList()); } return assignList; diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserRoleStrategyImpl.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserRoleStrategyImpl.java index 192428c96..bae0d039e 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserRoleStrategyImpl.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/node/impl/AssignUserRoleStrategyImpl.java @@ -40,8 +40,9 @@ public class AssignUserRoleStrategyImpl implements AssignUserStrategy { // 使用 lambda 表达式和方法引用从 NodeUser 列表中提取角色 ID List roleIds = node.getNodeUserList().stream().map(NodeUser::getId).collect(Collectors.toList()); // 提取 Optional 结果中的数据 - List data = RetOps.of(remoteUserService.getUserIdListByRoleIdList(roleIds)).getData() - .orElseGet(Collections::emptyList); + List data = RetOps.of(remoteUserService.getUserIdListByRoleIdList(roleIds)) + .getData() + .orElseGet(Collections::emptyList); // 返回用户 ID 列表 return new ArrayList<>(data); diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/ApproveServiceTask.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/ApproveServiceTask.java index ee6021294..11881cbaa 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/ApproveServiceTask.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/ApproveServiceTask.java @@ -41,12 +41,16 @@ public class ApproveServiceTask implements JavaDelegate { if (refuse != null) { String handler = refuse.getHandler(); if (StrUtil.equals(handler, "TO_NODE")) { - runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId) - .moveActivityIdTo(nodeIdO, refuse.getNodeId()).changeState(); + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(processInstanceId) + .moveActivityIdTo(nodeIdO, refuse.getNodeId()) + .changeState(); } else { - runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId) - .moveActivityIdTo(nodeIdO, "end").changeState(); + runtimeService.createChangeActivityStateBuilder() + .processInstanceId(processInstanceId) + .moveActivityIdTo(nodeIdO, "end") + .changeState(); } } diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/CopyServiceTask.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/CopyServiceTask.java index c803988b7..16a880f6d 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/CopyServiceTask.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/service/CopyServiceTask.java @@ -46,12 +46,14 @@ public class CopyServiceTask implements JavaDelegate { List userDtoList = node.getNodeUserList(); // 用户ID列表 List userIdList = userDtoList.stream() - .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())) - .map(w -> Convert.toStr(w.getId())).collect(Collectors.toList()); + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey())) + .map(w -> Convert.toStr(w.getId())) + .collect(Collectors.toList()); // 部门ID列表 List deptIdList = userDtoList.stream() - .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())) - .map(w -> Convert.toStr(w.getId())).collect(Collectors.toList()); + .filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey())) + .map(w -> Convert.toStr(w.getId())) + .collect(Collectors.toList()); if (CollUtil.isNotEmpty(deptIdList)) { @@ -71,8 +73,9 @@ public class CopyServiceTask implements JavaDelegate { // 获取发起人 Object rootUserObj = execution.getVariable("root"); NodeUser rootUser = objectMapper - .readValue(objectMapper.writeValueAsString(rootUserObj), new TypeReference>() { - }).get(0); + .readValue(objectMapper.writeValueAsString(rootUserObj), new TypeReference>() { + }) + .get(0); Map variables = execution.getVariables(); diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/FlowableUtils.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/FlowableUtils.java index d62ba20e8..b528c8051 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/FlowableUtils.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/FlowableUtils.java @@ -128,7 +128,7 @@ public class FlowableUtils { // 获取子流程用户任务节点 List childUserTaskList = findChildProcessUserTasks( (StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements() - .toArray()[0], + .toArray()[0], null, null); // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 if (childUserTaskList != null && childUserTaskList.size() > 0) { @@ -189,7 +189,7 @@ public class FlowableUtils { if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { List childUserTaskList = iteratorFindChildUserTasks( (FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements() - .toArray()[0]), + .toArray()[0]), runActiveIdList, hasSequenceFlow, null); // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 if (childUserTaskList != null && childUserTaskList.size() > 0) { @@ -240,7 +240,7 @@ public class FlowableUtils { if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { List childUserTaskList = findChildProcessUserTasks( (FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements() - .toArray()[0]), + .toArray()[0]), hasSequenceFlow, null); // 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续 if (childUserTaskList != null && childUserTaskList.size() > 0) { @@ -302,12 +302,12 @@ public class FlowableUtils { if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) { dirtyRoads = findChildProcessAllDirtyRoad( (StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements() - .toArray()[0], + .toArray()[0], null, dirtyRoads); // 是否存在子流程上,true 是,false 否 Boolean isInChildProcess = dirtyTargetInChildProcess( (StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements() - .toArray()[0], + .toArray()[0], null, targets, null); if (isInChildProcess) { // 已在子流程上找到,该路线结束 @@ -354,7 +354,7 @@ public class FlowableUtils { if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { dirtyRoads = findChildProcessAllDirtyRoad( (FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements() - .toArray()[0]), + .toArray()[0]), hasSequenceFlow, dirtyRoads); } // 继续迭代 @@ -401,7 +401,7 @@ public class FlowableUtils { if (sequenceFlow.getTargetFlowElement() instanceof SubProcess) { inChildProcess = dirtyTargetInChildProcess( (FlowElement) (((SubProcess) sequenceFlow.getTargetFlowElement()).getFlowElements() - .toArray()[0]), + .toArray()[0]), hasSequenceFlow, targets, inChildProcess); } // 继续迭代 diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/ModelUtil.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/ModelUtil.java index 0e2b09758..27395839e 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/ModelUtil.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/utils/ModelUtil.java @@ -183,8 +183,7 @@ public class ModelUtil { if (nodeDto.getType() == NodeTypeEnum.EXCLUSIVE_GATEWAY.getValue().intValue()) { if (ord == size) { expression = NodeExpressionStrategyFactory.handleDefaultBranch(branchs, ord - 1); - } - else if (nodeDto.getType() == NodeTypeEnum.EXCLUSIVE_GATEWAY.getValue().intValue() && ord > 1) { + } else if (ord > 1) { expression = NodeExpressionStrategyFactory.handleDefaultBranch(branchs, ord - 1); } else { diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java index 670bcf3ef..31932bd4b 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java @@ -3,7 +3,6 @@ package com.pig4cloud.pigx.flow.task.api.feign; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.common.feign.annotation.NoToken; import com.pig4cloud.pigx.flow.task.dto.*; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -49,7 +48,6 @@ public interface RemoteFlowEngineService { * @param processInstanceParamDto 流程实例参数 * @return 启动流程结果 */ - @NoToken @PostMapping("/flow/start") R startProcess(@RequestBody ProcessInstanceParamDto processInstanceParamDto); @@ -82,8 +80,8 @@ public interface RemoteFlowEngineService { * @param taskParamDto 任务参数 * @return 设置负责人结果 */ - @PostMapping("/task/setAssignee") - R setAssignee(@RequestBody TaskParamDto taskParamDto); + @PostMapping("/task/transferTask") + R transferTask(@RequestBody TaskParamDto taskParamDto); /** * 停止流程实例 diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java index 856916d51..caf7aadfc 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java @@ -2,7 +2,6 @@ package com.pig4cloud.pigx.flow.task.api.feign; import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.common.feign.annotation.NoToken; import com.pig4cloud.pigx.flow.task.dto.*; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -23,7 +22,6 @@ public interface RemoteFlowTaskService { * 节点开始事件 * @param nodeRecordParamDto */ - @NoToken @PostMapping("/remote/startNodeEvent") void startNodeEvent(@RequestBody ProcessNodeRecordParamDto nodeRecordParamDto); @@ -31,7 +29,6 @@ public interface RemoteFlowTaskService { * 节点结束事件 * @param nodeRecordParamDto */ - @NoToken @PostMapping("/remote/endNodeEvent") void endNodeEvent(@RequestBody ProcessNodeRecordParamDto nodeRecordParamDto); @@ -46,7 +43,6 @@ public interface RemoteFlowTaskService { * 创建流程事件 * @param processInstanceRecordParamDto */ - @NoToken @PostMapping("/remote/createProcessEvent") void createProcessEvent(@RequestBody ProcessInstanceRecordParamDto processInstanceRecordParamDto); @@ -77,7 +73,6 @@ public interface RemoteFlowTaskService { * @param nodeId 节点id * @return */ - @NoToken @GetMapping("/processNodeData/getNodeData") R queryNodeOriData(@RequestParam("flowId") String flowId, @RequestParam("nodeId") String nodeId); @@ -85,7 +80,6 @@ public interface RemoteFlowTaskService { * 节点开始指派用户了 * @param processNodeRecordAssignUserParamDto */ - @NoToken @PostMapping("/remote/startAssignUser") R startAssignUser(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); @@ -93,7 +87,6 @@ public interface RemoteFlowTaskService { * 任务结束事件 * @param processNodeRecordAssignUserParamDto */ - @NoToken @PostMapping("/remote/taskEndEvent") R taskEndEvent(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/IBaseEnum.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/IBaseEnum.java index d2dd795fb..fcf55372f 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/IBaseEnum.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/constant/IBaseEnum.java @@ -61,8 +61,10 @@ public interface IBaseEnum { Objects.requireNonNull(label); EnumSet allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举 String finalLabel = label; - E matchEnum = allEnums.stream().filter(e -> ObjectUtil.equal(e.getLabel(), finalLabel)).findFirst() - .orElse(null); + E matchEnum = allEnums.stream() + .filter(e -> ObjectUtil.equal(e.getLabel(), finalLabel)) + .findFirst() + .orElse(null); Object value = null; if (matchEnum != null) { diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskParamDto.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskParamDto.java index 36689eeae..7b7448196 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskParamDto.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/dto/TaskParamDto.java @@ -7,53 +7,56 @@ import java.util.Map; /** * 任务完成参数对象 - * */ @Data public class TaskParamDto { - private String processInstanceId; + private String processInstanceId; - private List processInstanceIdList; + private List processInstanceIdList; - /** - * 节点id - */ - private String nodeId; + /** + * 节点id + */ + private String nodeId; - /** - * 添加子流程发起人 - */ - private Boolean appendChildProcessRootId; + /** + * 添加子流程发起人 + */ + private Boolean appendChildProcessRootId; - /** - * 任务id - */ - private String taskId; + /** + * 任务id + */ + private String taskId; - /** - * 用户id - */ - private String userId; + /** + * 用户id + */ + private String userId; - /** - * 模板用户id - */ - private String targetUserId; + /** + * 模板用户id + */ + private String targetUserId; - /** - * 参数 - */ - private Map paramMap; + /** + * 参数 + */ + private Map paramMap; - /** - * 任务本地变量 - */ - private Map taskLocalParamMap; + /** + * 任务本地变量 + */ + private Map taskLocalParamMap; - /** - * 模板节点 - */ - private String targetNodeId; + /** + * 模板节点 + */ + private String targetNodeId; + /** + * 转办目标用户 ID 列表 + */ + private List targetUserIdList; } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormItemVO.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormItemVO.java index 91bdb23ec..b9afca52f 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormItemVO.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/FormItemVO.java @@ -2,12 +2,14 @@ package com.pig4cloud.pigx.flow.task.vo; import lombok.Data; import lombok.NoArgsConstructor; +import lombok.experimental.FieldNameConstants; /** * 表单 */ @Data @NoArgsConstructor +@FieldNameConstants public class FormItemVO { private String id; @@ -26,10 +28,11 @@ public class FormItemVO { private String placeholder; - private Props props; + private Props props = new Props(); @Data @NoArgsConstructor + @FieldNameConstants public static class Props { private Object value; diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessVO.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessVO.java index 26898351a..7c3efb27b 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessVO.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/vo/ProcessVO.java @@ -16,4 +16,9 @@ public class ProcessVO extends Process { private Map variableMap; + /** + * 发起人节点的表单权限 + */ + private Map formPerms; + } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml index b012b32f0..4f5f5bbe2 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml @@ -73,6 +73,11 @@ com.pig4cloud pigx-common-log + + + com.pig4cloud + pigx-common-encrypt-api + com.baomidou diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/config/SequenceConfiguration.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/config/SequenceConfiguration.java index bb47b816e..47b3cfa25 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/config/SequenceConfiguration.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/config/SequenceConfiguration.java @@ -28,11 +28,12 @@ public class SequenceConfiguration { @Bean public Sequence flowSequence(DataSource dataSource, BaseSequenceProperties properties) { return DbSeqBuilder.create() - .bizName(() -> String.format("flow_%s_%s", TenantContextHolder.getTenantId(), DateUtil.today())) - .dataSource(dataSource) - .step(properties.getStep()) - .retryTimes(properties.getDb().getRetryTimes()) - .tableName(properties.getDb().getTableName()) - .build(); + .bizName(() -> String.format("flow_%s_%s", TenantContextHolder.getTenantId(), DateUtil.today())) + .dataSource(dataSource) + .step(properties.getStep()) + .retryTimes(properties.getDb().getRetryTimes()) + .tableName(properties.getDb().getTableName()) + .build(); } + } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java index d86a9058c..0509022c0 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java @@ -1,7 +1,6 @@ package com.pig4cloud.pigx.flow.task.controller; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.common.security.annotation.Inner; import com.pig4cloud.pigx.flow.task.dto.ProcessInstanceParamDto; import com.pig4cloud.pigx.flow.task.dto.TaskQueryParamDto; import com.pig4cloud.pigx.flow.task.service.IProcessInstanceService; @@ -32,23 +31,11 @@ public class ProcessInstanceController { } /** - * 启动内部流程实例 + * 查询挖矿任务 * - * @param processInstanceParamDto 进程实例参数 DTO + * @param queryParamDto Query param DTO * @return {@link R } */ - @Inner - @SneakyThrows - @PostMapping("startInnerProcessInstance") - public R startInnerProcessInstance(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { - return processInstanceService.startProcessInstance(processInstanceParamDto); - } - - /** - * 查询当前登录用户的待办任务 - * @param pageDto - * @return - */ @SneakyThrows @PostMapping("queryMineTask") public R queryMineTask(@RequestBody TaskQueryParamDto queryParamDto) { @@ -67,9 +54,10 @@ public class ProcessInstanceController { } /** - * 查询我发起的 - * @param pageDto - * @return + * 查询我已启动 + * + * @param taskQueryParamDto task query param dto + * @return {@link R } */ @SneakyThrows @PostMapping("queryMineStarted") @@ -78,9 +66,10 @@ public class ProcessInstanceController { } /** - * 查询抄送我的 - * @param pageDto - * @return + * 查询我 CC + * + * @param taskQueryParamDto task query param dto + * @return {@link R } */ @SneakyThrows @PostMapping("queryMineCC") diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java index 929ce5c0c..2a5d6dce9 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java @@ -1,7 +1,6 @@ package com.pig4cloud.pigx.flow.task.controller; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.common.security.annotation.Inner; import com.pig4cloud.pigx.flow.task.dto.Node; import com.pig4cloud.pigx.flow.task.dto.ProcessNodeDataDto; import com.pig4cloud.pigx.flow.task.service.IProcessNodeDataService; @@ -39,7 +38,6 @@ public class ProcessNodeDataController { * @param nodeId * @return */ - @Inner @GetMapping("getNodeData") public R getNodeData(String flowId, String nodeId) { return processNodeDataService.getNodeData(flowId, nodeId); diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java index 07ce38058..6c8a1725d 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java @@ -1,7 +1,6 @@ package com.pig4cloud.pigx.flow.task.controller; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.common.security.annotation.Inner; import com.pig4cloud.pigx.flow.task.dto.*; import com.pig4cloud.pigx.flow.task.service.IRemoteService; import lombok.RequiredArgsConstructor; @@ -92,8 +91,7 @@ public class RemoteController { * @param recordParamDto * @return */ - @Inner - @PostMapping("/startNodeEvent") + @PostMapping("startNodeEvent") public R startNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto) { return remoteService.startNodeEvent(recordParamDto); } @@ -104,7 +102,6 @@ public class RemoteController { * @param processInstanceRecordParamDto * @return */ - @Inner @PostMapping("createProcessEvent") public R createProcessEvent(@RequestBody ProcessInstanceRecordParamDto processInstanceRecordParamDto) { return remoteService.createProcessEvent(processInstanceRecordParamDto); @@ -116,7 +113,6 @@ public class RemoteController { * @param recordParamDto * @return */ - @Inner @PostMapping("endNodeEvent") public R endNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto) { return remoteService.endNodeEvent(recordParamDto); @@ -128,7 +124,6 @@ public class RemoteController { * @param processNodeRecordAssignUserParamDto * @return */ - @Inner @PostMapping("startAssignUser") public R startAssignUser(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { return remoteService.startAssignUser(processNodeRecordAssignUserParamDto); @@ -140,7 +135,6 @@ public class RemoteController { * @param processNodeRecordAssignUserParamDto * @return */ - @Inner @PostMapping("taskEndEvent") public R taskEndEvent(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { return remoteService.taskEndEvent(processNodeRecordAssignUserParamDto); @@ -148,24 +142,22 @@ public class RemoteController { /** * 实例结束 - * * @param processInstanceParamDto * @return */ @PostMapping("endProcess") public R endProcess(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { return remoteService.endProcess(processInstanceParamDto.getProcessInstanceId()); - } + } - /** - * 查询流程管理员 - * - * @param flowId - * @return - */ - @GetMapping("queryProcessAdmin") - public R queryProcessAdmin(String flowId) { - return remoteService.queryProcessAdmin(flowId); - } + /** + * 查询流程管理员 + * @param flowId + * @return + */ + @GetMapping("queryProcessAdmin") + public R queryProcessAdmin(String flowId) { + return remoteService.queryProcessAdmin(flowId); + } } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/CombinationGroupServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/CombinationGroupServiceImpl.java index 54f8cd6d2..066468d15 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/CombinationGroupServiceImpl.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/CombinationGroupServiceImpl.java @@ -39,8 +39,12 @@ public class CombinationGroupServiceImpl implements ICombinationGroupService { */ @Override public R listGroupWithProcess(Page page, Long groupId) { - return R.ok(processService.lambdaQuery().eq(Process::getGroupId, groupId).eq(Process::getHidden, false) - .orderByAsc(Process::getSort).orderByDesc(Process::getCreateTime).page(page)); + return R.ok(processService.lambdaQuery() + .eq(Process::getGroupId, groupId) + .eq(Process::getHidden, false) + .orderByAsc(Process::getSort) + .orderByDesc(Process::getCreateTime) + .page(page)); } /** @@ -53,16 +57,24 @@ public class CombinationGroupServiceImpl implements ICombinationGroupService { List formGroupVos = new LinkedList<>(); - List processGroupList = processGroupService.lambdaQuery().orderByAsc(ProcessGroup::getSort) - .list(); + List processGroupList = processGroupService.lambdaQuery() + .orderByAsc(ProcessGroup::getSort) + .list(); processGroupList.forEach(group -> { - FormGroupVo formGroupVo = FormGroupVo.builder().id(group.getId()).name(group.getGroupName()) - .items(new LinkedList<>()).build(); + FormGroupVo formGroupVo = FormGroupVo.builder() + .id(group.getId()) + .name(group.getGroupName()) + .items(new LinkedList<>()) + .build(); formGroupVos.add(formGroupVo); - List processList = processService.lambdaQuery().eq(Process::getGroupId, group.getId()) - .eq(Process::getHidden, YesNoEnum.NO.getCode()).eq(Process::getStop, YesNoEnum.NO.getCode()).orderByAsc(Process::getSort).list(); + List processList = processService.lambdaQuery() + .eq(Process::getGroupId, group.getId()) + .eq(Process::getHidden, YesNoEnum.NO.getCode()) + .eq(Process::getStop, YesNoEnum.NO.getCode()) + .orderByAsc(Process::getSort) + .list(); Map existMap = new HashMap<>(); @@ -70,9 +82,10 @@ public class CombinationGroupServiceImpl implements ICombinationGroupService { List idList = processList.stream().map(Process::getId).collect(Collectors.toList()); // 查询发起人集合 List processStarterList = processStarterService.lambdaQuery() - .in(ProcessStarter::getProcessId, idList).list(); + .in(ProcessStarter::getProcessId, idList) + .list(); Map> groupmap = processStarterList.stream() - .collect(Collectors.groupingBy(ProcessStarter::getProcessId)); + .collect(Collectors.groupingBy(ProcessStarter::getProcessId)); for (Process process : processList) { List processStarters = groupmap.get(process.getId()); @@ -80,15 +93,17 @@ public class CombinationGroupServiceImpl implements ICombinationGroupService { existMap.put(process.getId(), true); continue; } - boolean match = processStarters.stream().anyMatch(w -> w.getTypeId().longValue() == user.getId() - && w.getType().equals(NodeUserTypeEnum.USER.getKey())); + boolean match = processStarters.stream() + .anyMatch(w -> w.getTypeId().longValue() == user.getId() + && w.getType().equals(NodeUserTypeEnum.USER.getKey())); if (match) { existMap.put(process.getId(), true); continue; } Set deptIdSet = processStarters.stream() - .filter(w -> w.getType().equals(NodeUserTypeEnum.DEPT.getKey())).map(w -> w.getTypeId()) - .collect(Collectors.toSet()); + .filter(w -> w.getType().equals(NodeUserTypeEnum.DEPT.getKey())) + .map(w -> w.getTypeId()) + .collect(Collectors.toSet()); existMap.put(process.getId(), deptIdSet.contains(user.getDeptId())); @@ -103,9 +118,14 @@ public class CombinationGroupServiceImpl implements ICombinationGroupService { } formGroupVo.getItems() - .add(FormGroupVo.FlowVo.builder().flowId(process.getFlowId()).name(process.getName()) - .logo(process.getLogo()).remark(process.getRemark()).stop(process.getStop()) - .updated(process.getUpdateTime()).build()); + .add(FormGroupVo.FlowVo.builder() + .flowId(process.getFlowId()) + .name(process.getName()) + .logo(process.getLogo()) + .remark(process.getRemark()) + .stop(process.getStop()) + .updated(process.getUpdateTime()) + .build()); }); }); return R.ok(formGroupVos); diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessCopyServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessCopyServiceImpl.java index 2a3c56242..22f354284 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessCopyServiceImpl.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessCopyServiceImpl.java @@ -1,15 +1,9 @@ package com.pig4cloud.pigx.flow.task.service.impl; -import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Dict; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.pig4cloud.pigx.common.core.util.R; -import com.pig4cloud.pigx.flow.task.constant.FormTypeEnum; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; import com.pig4cloud.pigx.flow.task.dto.Node; import com.pig4cloud.pigx.flow.task.entity.Process; import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; @@ -17,13 +11,10 @@ import com.pig4cloud.pigx.flow.task.mapper.ProcessCopyMapper; import com.pig4cloud.pigx.flow.task.service.IProcessCopyService; import com.pig4cloud.pigx.flow.task.service.IProcessNodeDataService; import com.pig4cloud.pigx.flow.task.service.IProcessService; -import com.pig4cloud.pigx.flow.task.vo.FormItemVO; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; import java.util.Map; /** @@ -38,86 +29,39 @@ import java.util.Map; @RequiredArgsConstructor public class ProcessCopyServiceImpl extends ServiceImpl implements IProcessCopyService { - private final ObjectMapper objectMapper; + private final ObjectMapper objectMapper; - private final IProcessService processService; + private final IProcessService processService; - private final IProcessNodeDataService nodeDataService; + private final IProcessNodeDataService nodeDataService; - /** - * 查询单个抄送详细信息 - * @param id - * @return - */ - @SneakyThrows - @Override - public R querySingleDetail(long id) { - ProcessCopy processCopy = this.getById(id); - String flowId = processCopy.getFlowId(); - Process oaForms = processService.getByFlowId(flowId); - if (oaForms == null) { - return R.failed("流程不存在"); - } - String formData = processCopy.getFormData(); + /** + * 查询单个抄送详细信息 + * + * @param id + * @return + */ + @SneakyThrows + @Override + public R querySingleDetail(long id) { + ProcessCopy processCopy = this.getById(id); + String flowId = processCopy.getFlowId(); + Process oaForms = processService.getByFlowId(flowId); + if (oaForms == null) { + return R.failed("流程不存在"); + } + String formData = processCopy.getFormData(); + String nodeId = processCopy.getNodeId(); - Map variableMap = objectMapper.readValue(formData, new TypeReference>() { - }); + Node node = nodeDataService.getNodeData(flowId, nodeId).getData(); + Map formPerms = node.getFormPerms(); - String nodeId = processCopy.getNodeId(); - - Node node = nodeDataService.getNodeData(flowId, nodeId).getData(); - Map formPerms = node.getFormPerms(); - - List jsonObjectList = objectMapper.readValue(oaForms.getFormItems(), - new TypeReference>() { - }); - for (FormItemVO formItemVO : jsonObjectList) { - String fid = formItemVO.getId(); - String perm = formPerms.get(fid); - formItemVO.setPerm(StrUtil.isBlankIfStr(perm) ? ProcessInstanceConstant.FormPermClass.HIDE : perm); - - if (formItemVO.getType().equals(FormTypeEnum.LAYOUT.getType())) { - // 明细 - - List> subParamList = MapUtil.get(variableMap, fid, - new cn.hutool.core.lang.TypeReference>>() { - }); - - Object value = formItemVO.getProps().getValue(); - - List> l = new ArrayList<>(); - for (Map map : subParamList) { - List subItemList = Convert.toList(FormItemVO.class, value); - for (FormItemVO itemVO : subItemList) { - itemVO.getProps().setValue(map.get(itemVO.getId())); - - String permSub = formPerms.get(itemVO.getId()); - if (StrUtil.isNotBlank(permSub)) { - itemVO.setPerm(ProcessInstanceConstant.FormPermClass.EDIT.equals(permSub) - ? ProcessInstanceConstant.FormPermClass.READ : permSub - - ); - - } - else { - itemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE); - } - - } - l.add(subItemList); - } - formItemVO.getProps().setValue(l); - - } - else { - formItemVO.getProps().setValue(variableMap.get(fid)); - - } - - } - Dict set = Dict.create().set("formItems", jsonObjectList); - - return R.ok(set); - } + Dict set = Dict.create() + .set("process", oaForms.getProcess()) + .set("formItems", oaForms.getFormItems()) + .set("formData", formData) + .set("formPerms", formPerms); + return R.ok(set); + } } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java index a22a7bb99..9119979b7 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java @@ -2,9 +2,7 @@ package com.pig4cloud.pigx.flow.task.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Dict; -import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -16,16 +14,13 @@ import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.security.service.PigxUser; import com.pig4cloud.pigx.common.security.util.SecurityUtils; import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowEngineService; -import com.pig4cloud.pigx.flow.task.constant.FormTypeEnum; import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; import com.pig4cloud.pigx.flow.task.constant.NodeUserTypeEnum; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; import com.pig4cloud.pigx.flow.task.dto.*; import com.pig4cloud.pigx.flow.task.entity.Process; import com.pig4cloud.pigx.flow.task.entity.*; import com.pig4cloud.pigx.flow.task.service.*; import com.pig4cloud.pigx.flow.task.utils.NodeFormatUtil; -import com.pig4cloud.pigx.flow.task.vo.FormItemVO; import com.pig4cloud.pigx.flow.task.vo.NodeFormatParamVo; import com.pig4cloud.pigx.flow.task.vo.NodeVo; import com.pig4cloud.pigx.flow.task.vo.ProcessCopyVo; @@ -69,18 +64,16 @@ public class ProcessInstanceServiceImpl implements IProcessInstanceService { */ @Override public R startProcessInstance(ProcessInstanceParamDto processInstanceParamDto) { - // 如果没有传递根节点(发起人),则根据当前用户初始化一个 - if (StrUtil.isBlank(processInstanceParamDto.getStartUserId())) { - PigxUser user = SecurityUtils.getUser(); - processInstanceParamDto.setStartUserId(String.valueOf(user.getId())); - Map paramMap = processInstanceParamDto.getParamMap(); - Dict rootUser = Dict.create() - .set("id", user.getId()) - .set("name", user.getUsername()) - .set("type", NodeUserTypeEnum.USER.getKey()); - paramMap.put("root", CollUtil.newArrayList(rootUser)); - } + PigxUser user = SecurityUtils.getUser(); + + processInstanceParamDto.setStartUserId(String.valueOf(user.getId())); + Map paramMap = processInstanceParamDto.getParamMap(); + Dict rootUser = Dict.create() + .set("id", user.getId()) + .set("name", user.getUsername()) + .set("type", NodeUserTypeEnum.USER.getKey()); + paramMap.put("root", CollUtil.newArrayList(rootUser)); return flowEngineService.startProcess(processInstanceParamDto); } @@ -385,60 +378,18 @@ public class ProcessInstanceServiceImpl implements IProcessInstanceService { // 发起人变量数据 String formData = processInstanceRecord.getFormData(); - Map variableMap = objectMapper.readValue(formData, new TypeReference< Map>() { - }); - // 发起人表单权限 String process = oaForms.getProcess(); Node nodeDto = objectMapper.readValue(process, Node.class); Map formPerms1 = nodeDto.getFormPerms(); - List jsonObjectList = objectMapper.readValue(oaForms.getFormItems(), new TypeReference>() { - }); - for (FormItemVO formItemVO : jsonObjectList) { - String id = formItemVO.getId(); - String perm = formPerms1.get(id); - formItemVO.setPerm(StrUtil.isBlankIfStr(perm) ? ProcessInstanceConstant.FormPermClass.READ - : (StrUtil.equals(perm, ProcessInstanceConstant.FormPermClass.HIDE) ? perm - : ProcessInstanceConstant.FormPermClass.READ)); - - if (formItemVO.getType().equals(FormTypeEnum.LAYOUT.getType())) { - // 明细 - List> subParamList = MapUtil.get(variableMap, id, - new cn.hutool.core.lang.TypeReference< List>>() { - }); - - Object value = formItemVO.getProps().getValue(); - - List> l = new ArrayList<>(); - for (Map map : subParamList) { - List subItemList = Convert.toList(FormItemVO.class, value); - for (FormItemVO itemVO : subItemList) { - itemVO.getProps().setValue(map.get(itemVO.getId())); - - String permSub = formPerms1.get(itemVO.getId()); - - itemVO.setPerm(StrUtil.isBlankIfStr(permSub) ? ProcessInstanceConstant.FormPermClass.READ - : (StrUtil.equals(permSub, ProcessInstanceConstant.FormPermClass.HIDE) ? permSub - : ProcessInstanceConstant.FormPermClass.READ)); - - } - l.add(subItemList); - } - formItemVO.getProps().setValue(l); - - } else { - formItemVO.getProps().setValue(variableMap.get(id)); - - } - - } Dict set = Dict.create() .set("processInstanceId", processInstanceId) .set("process", oaForms.getProcess()) - - .set("formItems", jsonObjectList); + .set("formItems", oaForms.getFormItems()) + .set("formData", formData) + .set("formPerms", formPerms1); return R.ok(set); } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeDataServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeDataServiceImpl.java index a18db5d55..8ff8adedf 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeDataServiceImpl.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeDataServiceImpl.java @@ -45,11 +45,14 @@ public class ProcessNodeDataServiceImpl extends ServiceImpl getNodeData(String flowId, String nodeId) { - Optional processNodeDataOptional = this.lambdaQuery().eq(ProcessNodeData::getFlowId, flowId) - .eq(ProcessNodeData::getNodeId, nodeId).oneOpt(); + Optional processNodeDataOptional = this.lambdaQuery() + .eq(ProcessNodeData::getFlowId, flowId) + .eq(ProcessNodeData::getNodeId, nodeId) + .oneOpt(); Node node = processNodeDataOptional - .map(processNodeData -> JSONUtil.toBean(processNodeData.getData(), Node.class)).orElse(null); + .map(processNodeData -> JSONUtil.toBean(processNodeData.getData(), Node.class)) + .orElse(null); return R.ok(node); } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordAssignUserServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordAssignUserServiceImpl.java index d4ef450ed..8eb6c59b8 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordAssignUserServiceImpl.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordAssignUserServiceImpl.java @@ -35,8 +35,10 @@ public class ProcessNodeRecordAssignUserServiceImpl public R addAssignUser(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { if (StrUtil.isNotBlank(processNodeRecordAssignUserParamDto.getApproveDesc())) { ProcessNodeRecordAssignUser processNodeRecordAssignUser = this.lambdaQuery() - .eq(ProcessNodeRecordAssignUser::getTaskId, processNodeRecordAssignUserParamDto.getTaskId()) - .orderByDesc(ProcessNodeRecordAssignUser::getId).last("limit 1").one(); + .eq(ProcessNodeRecordAssignUser::getTaskId, processNodeRecordAssignUserParamDto.getTaskId()) + .orderByDesc(ProcessNodeRecordAssignUser::getId) + .last("limit 1") + .one(); if (processNodeRecordAssignUser != null) { processNodeRecordAssignUser.setApproveDesc(processNodeRecordAssignUserParamDto.getApproveDesc()); processNodeRecordAssignUser.setTaskType(processNodeRecordAssignUserParamDto.getTaskType()); @@ -48,7 +50,7 @@ public class ProcessNodeRecordAssignUserServiceImpl } ProcessNodeRecordAssignUser processNodeRecordAssignUser = BeanUtil - .copyProperties(processNodeRecordAssignUserParamDto, ProcessNodeRecordAssignUser.class); + .copyProperties(processNodeRecordAssignUserParamDto, ProcessNodeRecordAssignUser.class); processNodeRecordAssignUser.setStartTime(LocalDateTime.now()); processNodeRecordAssignUser.setStatus(NodeStatusEnum.JXZ.getCode()); processNodeRecordAssignUser.setApproveDesc(""); @@ -66,12 +68,14 @@ public class ProcessNodeRecordAssignUserServiceImpl @Override public R completeTaskEvent(ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { ProcessNodeRecordAssignUser processNodeRecordAssignUser = this.lambdaQuery() - .eq(ProcessNodeRecordAssignUser::getTaskId, processNodeRecordAssignUserParamDto.getTaskId()) - .eq(ProcessNodeRecordAssignUser::getUserId, processNodeRecordAssignUserParamDto.getUserId()) - .eq(ProcessNodeRecordAssignUser::getProcessInstanceId, - processNodeRecordAssignUserParamDto.getProcessInstanceId()) - .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.JXZ.getCode()) - .orderByDesc(ProcessNodeRecordAssignUser::getId).last("limit 1").one(); + .eq(ProcessNodeRecordAssignUser::getTaskId, processNodeRecordAssignUserParamDto.getTaskId()) + .eq(ProcessNodeRecordAssignUser::getUserId, processNodeRecordAssignUserParamDto.getUserId()) + .eq(ProcessNodeRecordAssignUser::getProcessInstanceId, + processNodeRecordAssignUserParamDto.getProcessInstanceId()) + .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.JXZ.getCode()) + .orderByDesc(ProcessNodeRecordAssignUser::getId) + .last("limit 1") + .one(); processNodeRecordAssignUser.setStatus(NodeStatusEnum.YJS.getCode()); processNodeRecordAssignUser.setApproveDesc(processNodeRecordAssignUserParamDto.getApproveDesc()); processNodeRecordAssignUser.setEndTime(LocalDateTime.now()); diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordServiceImpl.java index 8036c959e..750b93751 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordServiceImpl.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessNodeRecordServiceImpl.java @@ -54,11 +54,12 @@ public class ProcessNodeRecordServiceImpl extends ServiceImpl @@ -45,210 +46,201 @@ import java.util.Map; @RequiredArgsConstructor public class ProcessServiceImpl extends ServiceImpl implements IProcessService { - private final IProcessStarterService processStarterService; + private final IProcessStarterService processStarterService; - private final RemoteFlowEngineService flowEngineService; + private final RemoteFlowEngineService flowEngineService; - private final Sequence flowSequence; + private final ObjectMapper objectMapper; - private final ObjectMapper objectMapper; + private final Sequence flowSequence; - /** - * 获取详细数据 - * @param flowId - * @return - */ - @Override - public R getDetail(String flowId) { - // 获取流程详情 - ProcessVO processVO = this.getProcessVO(flowId); - return R.ok(processVO); - } - /** - * 根据流程ID获取流程详情 - * @param flowId 流程ID - * @return 流程详情 - */ - @SneakyThrows - private ProcessVO getProcessVO(String flowId) { + /** + * 获取详细数据 + * + * @param flowId + * @return + */ + @Override + public R getDetail(String flowId) { + // 获取流程详情 + ProcessVO processVO = this.getProcessVO(flowId); + return R.ok(processVO); + } - Process oaForms = getByFlowId(flowId); - String process = oaForms.getProcess(); - String formItems = oaForms.getFormItems(); - Node startNode = objectMapper.readValue(process, new TypeReference() { - }); + /** + * 根据流程ID获取流程详情 + * + * @param flowId 流程ID + * @return 流程详情 + */ + @SneakyThrows + private ProcessVO getProcessVO(String flowId) { - Map formPerms = startNode.getFormPerms(); + Process oaForms = getByFlowId(flowId); + String process = oaForms.getProcess(); + String formItems = oaForms.getFormItems(); + Node startNode = objectMapper.readValue(process, new TypeReference() { + }); - List formItemVOList = objectMapper.readValue(formItems, new TypeReference>() { - }); - for (FormItemVO formItemVO : formItemVOList) { - String perm = MapUtil.getStr(formPerms, formItemVO.getId(), ProcessInstanceConstant.FormPermClass.EDIT); - formItemVO.setPerm(perm); + List selectUserNodeId = NodeUtil.selectUserNodeId(startNode); - // 发号器赋值 - if (StrUtil.equals(formItemVO.getType(), FormTypeEnum.SEQUENCE.getType())) { - FormItemVO.Props props = formItemVO.getProps(); - String prefix = props.getPrefix(); - String nextNo = flowSequence.nextNo(); - formItemVO.setPlaceholder(StrUtil.isNotBlank(prefix) ? prefix + nextNo : nextNo); - props.setValue(StrUtil.isNotBlank(prefix) ? prefix + nextNo : nextNo); - formItemVO.setProps(props); - } + ProcessVO processVO = BeanUtil.copyProperties(oaForms, ProcessVO.class); + processVO.setSelectUserNodeId(selectUserNodeId); - if (StrUtil.equals(formItemVO.getType(), FormTypeEnum.LAYOUT.getType())) { - // 明细 - Object value = formItemVO.getProps().getValue(); - List subList = Convert.toList(FormItemVO.class, value); - for (FormItemVO itemVO : subList) { - String perm1 = MapUtil.getStr(formPerms, itemVO.getId(), - ProcessInstanceConstant.FormPermClass.EDIT); - itemVO.setPerm(perm1); - } + JSONArray formItemJsonArray = JSONUtil.parseArray(formItems); + // 特殊字段复制 + for (Object object : formItemJsonArray) { + if (object instanceof JSONObject) { + JSONObject formVO = (JSONObject) object; + JSONObject props = formVO.getJSONObject(FormItemVO.Fields.props); + if (Objects.nonNull(props) && FormTypeEnum.SEQUENCE.getType().equals(props.getStr(FormItemVO.Fields.type))) { + String nextNo = flowSequence.nextNo(); + props.set(FormItemVO.Props.Fields.value, nextNo); + formVO.set(FormItemVO.Props.Fields.value, nextNo); + } + } + } - formItemVO.getProps().setValue(subList); - formItemVO.getProps(); - } + processVO.setFormItems(formItemJsonArray.toStringPretty()); + processVO.setFormPerms(startNode.getFormPerms()); + return processVO; + } - } - oaForms.setFormItems(objectMapper.writeValueAsString(formItemVOList)); + /** + * 根据流程ID获取流程 + * + * @param flowId 流程ID + * @return 流程 + */ + @Override + public Process getByFlowId(String flowId) { + return this.lambdaQuery().eq(Process::getFlowId, flowId).one(); + } - List selectUserNodeId = NodeUtil.selectUserNodeId(startNode); + /** + * 更新流程 + * + * @param process 流程 + */ + @Override + public void updateByFlowId(Process process) { + this.lambdaUpdate().eq(Process::getFlowId, process.getFlowId()).update(process); + } - ProcessVO processVO = BeanUtil.copyProperties(oaForms, ProcessVO.class); - processVO.setSelectUserNodeId(selectUserNodeId); + /** + * 隐藏流程 + * + * @param flowId 流程ID + */ + @Override + public void hide(String flowId) { + this.lambdaUpdate().set(Process::getHidden, true).eq(Process::getFlowId, flowId).update(new Process()); + } - return processVO; - } + /** + * 创建流程 + * + * @param process 流程 + * @return 操作结果 + */ + @SneakyThrows + @Override + public R create(Process process) { + Map map = new HashMap<>(); + map.put("process", process); + map.put("userId", SecurityUtils.getUser().getId()); + R r = flowEngineService.createFlow(map); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } + String flowId = r.getData(); + NodeUser nodeUser = objectMapper.readValue(process.getAdminList(), new TypeReference>() { + }).get(0); - /** - * 根据流程ID获取流程 - * @param flowId 流程ID - * @return 流程 - */ - @Override - public Process getByFlowId(String flowId) { - return this.lambdaQuery().eq(Process::getFlowId, flowId).one(); - } + // 更新流程 + if (StrUtil.isNotBlank(process.getFlowId())) { - /** - * 更新流程 - * @param process 流程 - */ - @Override - public void updateByFlowId(Process process) { - this.lambdaUpdate().eq(Process::getFlowId, process.getFlowId()).update(process); - } + Process oldProcess = this.getByFlowId(process.getFlowId()); + this.hide(process.getFlowId()); + // 修改所有的管理员 + this.lambdaUpdate() + .set(Process::getAdminId, nodeUser.getId()) + .eq(Process::getUniqueId, oldProcess.getUniqueId()) + .update(new Process()); - /** - * 隐藏流程 - * @param flowId 流程ID - */ - @Override - public void hide(String flowId) { - this.lambdaUpdate().set(Process::getHidden, true).eq(Process::getFlowId, flowId).update(new Process()); - } + } - /** - * 创建流程 - * @param process 流程 - * @return 操作结果 - */ - @SneakyThrows - @Override - public R create(Process process) { - Map map = new HashMap<>(); - map.put("process", process); - map.put("userId", SecurityUtils.getUser().getId()); - R r = flowEngineService.createFlow(map); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } - String flowId = r.getData(); - NodeUser nodeUser = objectMapper.readValue(process.getAdminList(), new TypeReference>() { - }).get(0); + Node startNode = objectMapper.readValue(process.getProcess(), Node.class); - // 更新流程 - if (StrUtil.isNotBlank(process.getFlowId())) { + List nodeUserList = startNode.getNodeUserList(); - Process oldProcess = this.getByFlowId(process.getFlowId()); - this.hide(process.getFlowId()); - // 修改所有的管理员 - this.lambdaUpdate().set(Process::getAdminId, nodeUser.getId()) - .eq(Process::getUniqueId, oldProcess.getUniqueId()).update(new Process()); + StringBuilder stringBuilder = new StringBuilder(); + if (CollUtil.isNotEmpty(nodeUserList)) { + int index = 0; - } + for (NodeUser user : nodeUserList) { + if (index > 0) { + stringBuilder.append(","); + } + stringBuilder.append(user.getName()); + index++; + if (index > 5) { + break; + } - Node startNode = objectMapper.readValue(process.getProcess(), Node.class); + } + } - List nodeUserList = startNode.getNodeUserList(); + Process p = new Process(); + p.setFlowId(flowId); + p.setName(process.getName()); + p.setLogo(process.getLogo()); + p.setSettings(process.getSettings()); + p.setGroupId(process.getGroupId()); + p.setFormItems(process.getFormItems()); + p.setProcess(process.getProcess()); + p.setRemark(process.getRemark()); + p.setSort(0); + p.setHidden("0"); + p.setStop("0"); + p.setAdminId(nodeUser.getId()); + p.setUniqueId(IdUtil.fastSimpleUUID()); + p.setAdminList(process.getAdminList()); + p.setRangeShow(stringBuilder.toString()); - StringBuilder stringBuilder = new StringBuilder(); - if (CollUtil.isNotEmpty(nodeUserList)) { - int index = 0; + this.save(p); - for (NodeUser user : nodeUserList) { - if (index > 0) { - stringBuilder.append(","); - } - stringBuilder.append(user.getName()); - index++; - if (index > 5) { - break; - } + // 保存范围 + for (NodeUser nodeUserDto : nodeUserList) { + ProcessStarter processStarter = new ProcessStarter(); - } - } + processStarter.setProcessId(p.getId()); + processStarter.setTypeId(nodeUserDto.getId()); + processStarter.setType(nodeUserDto.getType()); + processStarterService.save(processStarter); + } - Process p = new Process(); - p.setFlowId(flowId); - p.setName(process.getName()); - p.setLogo(process.getLogo()); - p.setSettings(process.getSettings()); - p.setGroupId(process.getGroupId()); - p.setFormItems(process.getFormItems()); - p.setProcess(process.getProcess()); - p.setRemark(process.getRemark()); - p.setSort(0); - p.setHidden("0"); - p.setStop("0"); - p.setAdminId(nodeUser.getId()); - p.setUniqueId(IdUtil.fastSimpleUUID()); - p.setAdminList(process.getAdminList()); - p.setRangeShow(stringBuilder.toString()); + return R.ok(); + } - this.save(p); - - // 保存范围 - for (NodeUser nodeUserDto : nodeUserList) { - ProcessStarter processStarter = new ProcessStarter(); - - processStarter.setProcessId(p.getId()); - processStarter.setTypeId(nodeUserDto.getId()); - processStarter.setType(nodeUserDto.getType()); - processStarterService.save(processStarter); - } - - return R.ok(); - } - - /** - * 编辑表单 - * @param flowId 流程ID - * @param type 类型 stop using delete - * @param groupId 分组ID - * @return 操作结果 - */ - @Override - public R update(String flowId, String type, Long groupId) { - Process process = new Process(); - process.setFlowId(flowId); - process.setStop("stop".equals(type) ? "1" : "0"); - process.setHidden("delete".equals(type) ? "1" : "0"); - process.setGroupId(groupId); - this.updateByFlowId(process); - return R.ok(); - } + /** + * 编辑表单 + * + * @param flowId 流程ID + * @param type 类型 stop using delete + * @param groupId 分组ID + * @return 操作结果 + */ + @Override + public R update(String flowId, String type, Long groupId) { + Process process = new Process(); + process.setFlowId(flowId); + process.setStop("stop".equals(type) ? "1" : "0"); + process.setHidden("delete".equals(type) ? "1" : "0"); + process.setGroupId(groupId); + this.updateByFlowId(process); + return R.ok(); + } } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/RemoteServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/RemoteServiceImpl.java index 759195b2b..ec019d2aa 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/RemoteServiceImpl.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/RemoteServiceImpl.java @@ -73,13 +73,15 @@ public class RemoteServiceImpl implements IRemoteService { ThreadUtil.execute(() -> { try { ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() - .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId).one(); + .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) + .one(); int index = 10; while (index > 0 && processInstanceRecord == null) { TimeUnit.SECONDS.sleep(5); processInstanceRecord = processInstanceRecordService.lambdaQuery() - .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId).one(); + .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) + .one(); index--; } @@ -128,8 +130,11 @@ public class RemoteServiceImpl implements IRemoteService { */ @Override public R> queryUserIdListByDepIdList(List depIdList) { - List list = userService.getUserIdListByDeptIdList(depIdList).getData().stream().map(SysUser::getUserId) - .collect(Collectors.toList()); + List list = userService.getUserIdListByDeptIdList(depIdList) + .getData() + .stream() + .map(SysUser::getUserId) + .toList(); return R.ok(list); } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java index 851e2f4a2..3d13d07fd 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java @@ -1,19 +1,14 @@ package com.pig4cloud.pigx.flow.task.service.impl; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Dict; -import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.security.util.SecurityUtils; import com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowEngineService; -import com.pig4cloud.pigx.flow.task.constant.FormTypeEnum; import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; -import com.pig4cloud.pigx.flow.task.constant.ProcessInstanceConstant; import com.pig4cloud.pigx.flow.task.dto.IndexPageStatistics; import com.pig4cloud.pigx.flow.task.dto.Node; import com.pig4cloud.pigx.flow.task.dto.TaskParamDto; @@ -23,14 +18,12 @@ import com.pig4cloud.pigx.flow.task.entity.ProcessCopy; import com.pig4cloud.pigx.flow.task.entity.ProcessInstanceRecord; import com.pig4cloud.pigx.flow.task.entity.ProcessNodeRecordAssignUser; import com.pig4cloud.pigx.flow.task.service.*; -import com.pig4cloud.pigx.flow.task.vo.FormItemVO; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -40,295 +33,237 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class TaskServiceImpl implements ITaskService { - private final RemoteFlowEngineService flowEngineService; + private final RemoteFlowEngineService flowEngineService; - private final IProcessService processService; + private final IProcessService processService; - private final IProcessCopyService processCopyService; + private final IProcessCopyService processCopyService; - private final IProcessNodeDataService nodeDataService; + private final IProcessNodeDataService nodeDataService; - private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService; + private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService; - private final IProcessInstanceRecordService processInstanceRecordService; + private final IProcessInstanceRecordService processInstanceRecordService; - private final ObjectMapper objectMapper; + private final ObjectMapper objectMapper; - /** - * 查询首页数据看板 - * @return - */ - @Override - public R queryTaskData() { - R indexPageStatisticsR = flowEngineService - .querySimpleData(SecurityUtils.getUser().getId()); + /** + * 查询首页数据看板 + * + * @return + */ + @Override + public R queryTaskData() { + R indexPageStatisticsR = flowEngineService + .querySimpleData(SecurityUtils.getUser().getId()); - // 获取抄送任务 - Long copyCount = processCopyService.lambdaQuery().eq(ProcessCopy::getUserId, SecurityUtils.getUser().getId()) - .count(); - indexPageStatisticsR.getData().setCopyNum(copyCount); - return indexPageStatisticsR; - } + // 获取抄送任务 + Long copyCount = processCopyService.lambdaQuery() + .eq(ProcessCopy::getUserId, SecurityUtils.getUser().getId()) + .count(); + indexPageStatisticsR.getData().setCopyNum(copyCount); + return indexPageStatisticsR; + } - /** - * 查询任务 - * @param taskId - * @param view - * @return - */ - @SneakyThrows - @Override - public R queryTask(String taskId, boolean view) { + /** + * 查询任务 + * + * @param taskId + * @param view + * @return + */ + @SneakyThrows + @Override + public R queryTask(String taskId, boolean view) { - long userId = SecurityUtils.getUser().getId(); + long userId = SecurityUtils.getUser().getId(); - R r = flowEngineService.queryTask(taskId, userId); + R r = flowEngineService.queryTask(taskId, userId); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - TaskResultDto taskResultDto = r.getData(); + TaskResultDto taskResultDto = r.getData(); - // 变量 - Map paramMap = taskResultDto.getVariableAll(); - // 是否是当前活动任务 - Boolean currentTask = taskResultDto.getCurrentTask(); - if (!currentTask) { - ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService.lambdaQuery() - .eq(ProcessNodeRecordAssignUser::getTaskId, taskId) - .eq(ProcessNodeRecordAssignUser::getUserId, userId) - .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode()).last("limit 1") - .orderByDesc(ProcessNodeRecordAssignUser::getEndTime).one(); + // 变量 + Map paramMap = taskResultDto.getVariableAll(); + // 是否是当前活动任务 + Boolean currentTask = taskResultDto.getCurrentTask(); + if (!currentTask) { + ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService.lambdaQuery() + .eq(ProcessNodeRecordAssignUser::getTaskId, taskId) + .eq(ProcessNodeRecordAssignUser::getUserId, userId) + .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode()) + .last("limit 1") + .orderByDesc(ProcessNodeRecordAssignUser::getEndTime) + .one(); - if (processNodeRecordAssignUser != null) { - String data = processNodeRecordAssignUser.getData(); - if (StrUtil.isNotBlank(data)) { - Map collect = objectMapper.readValue(data, - new TypeReference>() { - }); - paramMap.putAll(collect); + if (processNodeRecordAssignUser != null) { + String data = processNodeRecordAssignUser.getData(); + if (StrUtil.isNotBlank(data)) { + Map collect = objectMapper.readValue(data, new TypeReference>() { + }); + paramMap.putAll(collect); - } - } + } + } - } + } - // 当前节点数据 - Node node = nodeDataService.getNodeData(taskResultDto.getFlowId(), taskResultDto.getNodeId()).getData(); - Map formPerms = node.getFormPerms(); + // 当前节点数据 + Node node = nodeDataService.getNodeData(taskResultDto.getFlowId(), taskResultDto.getNodeId()).getData(); + Map formPerms = node.getFormPerms(); - Process oaForms = processService.getByFlowId(taskResultDto.getFlowId()); - if (oaForms == null) { - return R.failed("流程不存在"); - } + Process oaForms = processService.getByFlowId(taskResultDto.getFlowId()); + if (oaForms == null) { + return R.failed("流程不存在"); + } - List formItemVOList = JSONUtil.toList(oaForms.getFormItems(), FormItemVO.class); - for (FormItemVO formItemVO : formItemVOList) { + Dict set = Dict.create() + .set("processInstanceId", taskResultDto.getProcessInstanceId()) + .set("node", taskResultDto.getTaskNode()) + .set("process", oaForms.getProcess()) + .set("delegateAgain", taskResultDto.getDelegate()) + .set("delegationTask", StrUtil.equals(taskResultDto.getDelegationState(), "PENDING")) + .set("formItems", oaForms.getFormItems()) + .set("formData", paramMap) + .set("formPerms", formPerms); - String id = formItemVO.getId(); + return R.ok(set); + } - String perm = formPerms.get(id); + /** + * 完成任务 + * + * @param taskParamDto + * @return + */ + @Override + public R completeTask(TaskParamDto taskParamDto) { + long userId = SecurityUtils.getUser().getId(); + taskParamDto.setUserId(String.valueOf(userId)); - if (StrUtil.isNotBlank(perm)) { + R r = flowEngineService.completeTask(taskParamDto); - formItemVO.setPerm(view ? (ProcessInstanceConstant.FormPermClass.EDIT.equals(perm) - ? ProcessInstanceConstant.FormPermClass.READ : perm) : perm); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - } - else { - formItemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE); - } + return R.ok(); + } - if (formItemVO.getType().equals(FormTypeEnum.LAYOUT.getType())) { - // 明细 + /** + * 前加签 + * + * @param taskParamDto + * @return + */ + @Transactional + @Override + public R delegateTask(TaskParamDto taskParamDto) { - List> subParamList = MapUtil.get(paramMap, id, - new cn.hutool.core.lang.TypeReference>>() { - }); + taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); - Object value = formItemVO.getProps().getValue(); + R r = flowEngineService.delegateTask(taskParamDto); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - List> l = new ArrayList<>(); - for (Map map : subParamList) { - List subItemList = Convert.toList(FormItemVO.class, value); - for (FormItemVO itemVO : subItemList) { - itemVO.getProps().setValue(map.get(itemVO.getId())); + return R.ok(); + } - String permSub = formPerms.get(itemVO.getId()); - if (StrUtil.isNotBlank(permSub)) { - itemVO.setPerm(view ? (ProcessInstanceConstant.FormPermClass.EDIT.equals(permSub) - ? ProcessInstanceConstant.FormPermClass.READ : permSub) : permSub); + /** + * 加签完成任务 + * + * @param taskParamDto + * @return + */ + @Override + public R resolveTask(TaskParamDto taskParamDto) { + R r = flowEngineService.resolveTask(taskParamDto); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - } - else { - itemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE); - } - - } - l.add(subItemList); - } - formItemVO.getProps().setValue(l); - { - List subItemList = Convert.toList(FormItemVO.class, value); - for (FormItemVO itemVO : subItemList) { - - String permSub = formPerms.get(itemVO.getId()); - if (StrUtil.isNotBlank(permSub)) { - - itemVO.setPerm(permSub); - - } - else { - itemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE); - } - - } - formItemVO.getProps().setOriForm(subItemList); - - } - - } - else { - formItemVO.getProps().setValue(paramMap.get(id)); - - } - - } - Dict set = Dict.create().set("processInstanceId", taskResultDto.getProcessInstanceId()) - .set("node", taskResultDto.getTaskNode()).set("process", oaForms.getProcess()) - .set("delegateAgain", taskResultDto.getDelegate()) - .set("delegationTask", StrUtil.equals(taskResultDto.getDelegationState(), "PENDING")) - - .set("formItems", formItemVOList); - - return R.ok(set); - } - - /** - * 完成任务 - * @param taskParamDto - * @return - */ - @Override - public R completeTask(TaskParamDto taskParamDto) { - long userId = SecurityUtils.getUser().getId(); - taskParamDto.setUserId(String.valueOf(userId)); - - R r = flowEngineService.completeTask(taskParamDto); - - if (!r.isOk()) { - return R.failed(r.getMsg()); - } - - return R.ok(); - } - - /** - * 前加签 - * @param taskParamDto - * @return - */ - @Transactional - @Override - public R delegateTask(TaskParamDto taskParamDto) { + return R.ok(); + } + /** + * 设置执行人 + * + * @param taskParamDto + * @return + */ + @Override + public R setAssignee(TaskParamDto taskParamDto) { taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); + R r = flowEngineService.transferTask(taskParamDto); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - R r = flowEngineService.delegateTask(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + return R.ok(); + } - return R.ok(); - } + /** + * 结束流程 + * + * @param taskParamDto + * @return + */ + @Override + public R stopProcessInstance(TaskParamDto taskParamDto) { - /** - * 加签完成任务 - * @param taskParamDto - * @return - */ - @Override - public R resolveTask(TaskParamDto taskParamDto) { - R r = flowEngineService.resolveTask(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + String processInstanceId = taskParamDto.getProcessInstanceId(); - return R.ok(); - } + List allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(processInstanceId); + CollUtil.reverse(allStopProcessInstanceIdList); + allStopProcessInstanceIdList.add(processInstanceId); - /** - * 设置执行人 - * @param taskParamDto - * @return - */ - @Override - public R setAssignee(TaskParamDto taskParamDto) { - taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); - R r = flowEngineService.setAssignee(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + taskParamDto.setProcessInstanceIdList(allStopProcessInstanceIdList); + taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); + R r = flowEngineService.stopProcessInstance(taskParamDto); - return R.ok(); - } + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - /** - * 结束流程 - * @param taskParamDto - * @return - */ - @Override - public R stopProcessInstance(TaskParamDto taskParamDto) { + return R.ok(); + } - String processInstanceId = taskParamDto.getProcessInstanceId(); + /** + * 退回 + * + * @param taskParamDto + * @return + */ + @Override + public R back(TaskParamDto taskParamDto) { + taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); + R r = flowEngineService.back(taskParamDto); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - List allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(processInstanceId); - CollUtil.reverse(allStopProcessInstanceIdList); - allStopProcessInstanceIdList.add(processInstanceId); + return R.ok(); + } - taskParamDto.setProcessInstanceIdList(allStopProcessInstanceIdList); - taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); - R r = flowEngineService.stopProcessInstance(taskParamDto); + private List getAllStopProcessInstanceIdList(String processInstanceId) { + List list = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getParentProcessInstanceId, processInstanceId) + .list(); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + List collect = list.stream().map(w -> w.getProcessInstanceId()).collect(Collectors.toList()); - return R.ok(); - } + for (ProcessInstanceRecord processInstanceRecord : list) { + List allStopProcessInstanceIdList = getAllStopProcessInstanceIdList( + processInstanceRecord.getProcessInstanceId()); - /** - * 退回 - * @param taskParamDto - * @return - */ - @Override - public R back(TaskParamDto taskParamDto) { - taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); - R r = flowEngineService.back(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + collect.addAll(allStopProcessInstanceIdList); - return R.ok(); - } - - private List getAllStopProcessInstanceIdList(String processInstanceId) { - List list = processInstanceRecordService.lambdaQuery() - .eq(ProcessInstanceRecord::getParentProcessInstanceId, processInstanceId).list(); - - List collect = list.stream().map(w -> w.getProcessInstanceId()).collect(Collectors.toList()); - - for (ProcessInstanceRecord processInstanceRecord : list) { - List allStopProcessInstanceIdList = getAllStopProcessInstanceIdList( - processInstanceRecord.getProcessInstanceId()); - - collect.addAll(allStopProcessInstanceIdList); - - } - return collect; - } + } + return collect; + } } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/DataUtil.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/DataUtil.java index 9edb25751..a072859a4 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/DataUtil.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/DataUtil.java @@ -40,8 +40,9 @@ public class DataUtil { List list = new ArrayList<>(); list.add(allDeptList.stream().filter(w -> w.getDeptId() == deptId).findFirst().get()); - List collect = allDeptList.stream().filter(w -> w.getParentId() == deptId) - .collect(Collectors.toList()); + List collect = allDeptList.stream() + .filter(w -> w.getParentId() == deptId) + .collect(Collectors.toList()); if (CollUtil.isEmpty(collect)) { return list; } @@ -63,8 +64,9 @@ public class DataUtil { List list = new ArrayList<>(); list.add(allMenuList.stream().filter(w -> w.getMenuId() == menuId).findFirst().get()); - List collect = allMenuList.stream().filter(w -> w.getParentId() == menuId) - .collect(Collectors.toList()); + List collect = allMenuList.stream() + .filter(w -> w.getParentId() == menuId) + .collect(Collectors.toList()); if (CollUtil.isEmpty(collect)) { return list; } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeFormatUtil.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeFormatUtil.java index 21d300227..ef2d22415 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeFormatUtil.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/utils/NodeFormatUtil.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.pig4cloud.pigx.admin.api.entity.SysUser; import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.common.core.util.RetOps; import com.pig4cloud.pigx.common.security.util.SecurityUtils; import com.pig4cloud.pigx.flow.task.constant.NodeStatusEnum; import com.pig4cloud.pigx.flow.task.constant.NodeTypeEnum; @@ -101,12 +102,16 @@ public class NodeFormatUtil { List value = entry.getValue(); List collect = value.stream().map(w -> { UserVo userVo = buildUser(Long.parseLong(w.getUserId())); + if (userVo == null) { + return null; + } + userVo.setShowTime(w.getEndTime()); userVo.setApproveDesc(w.getApproveDesc()); userVo.setStatus(w.getStatus()); userVo.setOperType(w.getTaskType()); return userVo; - }).collect(Collectors.toList()); + }).filter(Objects::nonNull).collect(Collectors.toList()); userVoList.addAll(collect); } @@ -257,7 +262,10 @@ public class NodeFormatUtil { } RemoteUserService userService = SpringUtil.getBean(RemoteUserService.class); - SysUser user = userService.getUserById(CollUtil.newArrayList(userId)).getData().get(0); + SysUser user = RetOps.of(userService.getUserById(CollUtil.newArrayList(userId))) + .getData() + .map(sysUsers -> sysUsers.isEmpty() ? null : sysUsers.get(0)) + .orElse(null); if (user == null) { return null; }