fix: 代码审查修改

This commit is contained in:
Lesan 2025-02-24 09:38:37 +08:00
parent 8c681a77f5
commit dee2b7cb96
7 changed files with 43 additions and 68 deletions

View File

@ -30,8 +30,7 @@ public enum BpmSimpleModelNodeTypeEnum implements ArrayValuable<Integer> {
DELAY_TIMER_NODE(14, "延迟器", "receiveTask"), DELAY_TIMER_NODE(14, "延迟器", "receiveTask"),
TRIGGER_NODE(15, "触发器", "serviceTask"), TRIGGER_NODE(15, "触发器", "serviceTask"),
CHILD_PROCESS(20, "子流程", "callActivity"), // TODO @lesanCHILD_PROCESSASYNC_CHILD_PROCESS 可以合并为一个么 CHILD_PROCESS(20, "子流程", "callActivity"),
ASYNC_CHILD_PROCESS(21, "异步子流程", "callActivity"),
// 50 ~ 条件分支 // 50 ~ 条件分支
CONDITION_NODE(50, "条件", "sequenceFlow"), // 用于构建流转条件的表达式 CONDITION_NODE(50, "条件", "sequenceFlow"), // 用于构建流转条件的表达式

View File

@ -425,33 +425,30 @@ public class BpmSimpleModelNodeVO {
@Valid @Valid
public static class ChildProcessSetting { public static class ChildProcessSetting {
// TODO @lesancalledElement => calledProcessDefinitionKey ? 这样更容易理解不过如果一个流程多次发起key 变了好像会有问题
@Schema(description = "被调用流程", requiredMode = Schema.RequiredMode.REQUIRED, example = "xxx") @Schema(description = "被调用流程", requiredMode = Schema.RequiredMode.REQUIRED, example = "xxx")
@NotEmpty(message = "被调用流程不能为空") @NotEmpty(message = "被调用流程不能为空")
private String calledElement; private String calledProcessDefinitionKey;
@Schema(description = "被调用流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "xxx") @Schema(description = "被调用流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "xxx")
@NotEmpty(message = "被调用流程名称不能为空") @NotEmpty(message = "被调用流程名称不能为空")
private String calledElementName; private String calledProcessDefinitionName;
@Schema(description = "是否异步", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") @Schema(description = "是否异步", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
@NotNull(message = "是否异步不能为空") @NotNull(message = "是否异步不能为空")
private Boolean async; private Boolean async;
// TODO @lesaninVariables @Schema(description = "输入参数(主->子)", example = "[]")
@Schema(description = "输入参数(主->子)", requiredMode = Schema.RequiredMode.REQUIRED, example = "[]") private List<IOParameter> inVariables;
private List<IOParameter> inVariable;
// TODO @lesanoutVariables
@Schema(description = "输出参数(子->主)", example = "[]") @Schema(description = "输出参数(子->主)", example = "[]")
private List<IOParameter> outVariable; private List<IOParameter> outVariables;
@Schema(description = "是否自动跳过子流程发起节点", example = "false") @Schema(description = "是否自动跳过子流程发起节点", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
@NotNull(message = "是否自动跳过子流程发起节点不能为空") @NotNull(message = "是否自动跳过子流程发起节点不能为空")
private Boolean skipStartUserNode; private Boolean skipStartUserNode;
@Schema(description = "子流程发起人配置", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}") @Schema(description = "子流程发起人配置", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}")
// TODO @lesan这个应该也必须填写 @NotNull(message = "子流程发起人配置不能为空")
private StartUserSetting startUserSetting; private StartUserSetting startUserSetting;
@Schema(description = "子流程发起人配置") @Schema(description = "子流程发起人配置")
@ -467,11 +464,10 @@ public class BpmSimpleModelNodeVO {
@Schema(description = "表单", example = "xxx") @Schema(description = "表单", example = "xxx")
private String formField; private String formField;
// TODO @lesanemptyHandleType => emptyType type 对上
@Schema(description = "当子流程发起人为空时类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "当子流程发起人为空时类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "当子流程发起人为空时类型不能为空") @NotNull(message = "当子流程发起人为空时类型不能为空")
@InEnum(BpmChildProcessStartUserEmptyTypeEnum.class) @InEnum(BpmChildProcessStartUserEmptyTypeEnum.class)
private Integer emptyHandleType; private Integer emptyType;
} }

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.bpm.framework.flowable.core.util; package cn.iocoder.yudao.module.bpm.framework.flowable.core.util;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.spring.SpringUtil;
import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.core.KeyValue;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
@ -244,8 +244,7 @@ public class FlowableUtils {
return formFieldsMap.entrySet().stream() return formFieldsMap.entrySet().stream()
.limit(3) .limit(3)
.map(entry -> new KeyValue<>(entry.getValue().getTitle(), .map(entry -> new KeyValue<>(entry.getValue().getTitle(),
// TODO @lesan MapUtil.getStr 可以更简单 MapUtil.getStr(processVariables, entry.getValue().getField(), "")))
StrUtil.toStringOrEmpty(processVariables.getOrDefault(entry.getValue().getField(), ""))))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

View File

@ -48,7 +48,7 @@ public class SimpleModelUtils {
new StartUserNodeConvert(), new ApproveNodeConvert(), new CopyNodeConvert(), new TransactorNodeConvert(), new StartUserNodeConvert(), new ApproveNodeConvert(), new CopyNodeConvert(), new TransactorNodeConvert(),
new DelayTimerNodeConvert(), new TriggerNodeConvert(), new DelayTimerNodeConvert(), new TriggerNodeConvert(),
new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert(), new RouteBranchNodeConvert(), new ConditionBranchNodeConvert(), new ParallelBranchNodeConvert(), new InclusiveBranchNodeConvert(), new RouteBranchNodeConvert(),
new ChildProcessConvert(), new AsyncChildProcessConvert()); new ChildProcessConvert());
converts.forEach(convert -> NODE_CONVERTS.put(convert.getType(), convert)); converts.forEach(convert -> NODE_CONVERTS.put(convert.getType(), convert));
} }
@ -819,46 +819,38 @@ public class SimpleModelUtils {
@Override @Override
public CallActivity convert(BpmSimpleModelNodeVO node) { public CallActivity convert(BpmSimpleModelNodeVO node) {
BpmSimpleModelNodeVO.ChildProcessSetting childProcessSetting = node.getChildProcessSetting(); BpmSimpleModelNodeVO.ChildProcessSetting childProcessSetting = node.getChildProcessSetting();
List<IOParameter> inVariable = childProcessSetting.getInVariable() == null ? List<IOParameter> inVariables = childProcessSetting.getInVariables() == null ?
new ArrayList<>() : new ArrayList<>(childProcessSetting.getInVariable()); new ArrayList<>() : new ArrayList<>(childProcessSetting.getInVariables());
CallActivity callActivity = new CallActivity(); CallActivity callActivity = new CallActivity();
callActivity.setId(node.getId()); callActivity.setId(node.getId());
callActivity.setName(node.getName()); callActivity.setName(node.getName());
callActivity.setCalledElementType("key"); // TODO @lesan这里为啥是 key callActivity.setCalledElementType("key");
// 1. 是否异步 // 1. 是否异步
callActivity.setAsynchronous(node.getChildProcessSetting().getAsync()); if (node.getChildProcessSetting().getAsync()) {
// TODO @lesan: 这里目前测试没有跳过执行call activity 后面的节点
// 2. 调用的子流程 callActivity.setAsynchronous(true);
callActivity.setCalledElement(childProcessSetting.getCalledElement());
callActivity.setProcessInstanceName(childProcessSetting.getCalledElementName());
// 3. 是否自动跳过子流程发起节点
// TODO @lesan貌似只有 SourceExpression 的区别直接通过 valueOf childProcessSetting.getSkipStartUserNode()
if (Boolean.TRUE.equals(childProcessSetting.getSkipStartUserNode())) {
IOParameter ioParameter = new IOParameter();
ioParameter.setSourceExpression("true");
ioParameter.setTarget(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE);
inVariable.add(ioParameter);
} else {
IOParameter ioParameter = new IOParameter();
ioParameter.setSourceExpression("false");
ioParameter.setTarget(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE);
inVariable.add(ioParameter);
} }
// 4. 子变量传递 // 2. 调用的子流程
// 4.1 默认需要传递的一些变量流程状态 callActivity.setCalledElement(childProcessSetting.getCalledProcessDefinitionKey());
// TODO @lesan4.1 这个要不单独一个序号类似 3. 这个然后下面就是把 子变量传递主变量传递这样逻辑连贯点哈 callActivity.setProcessInstanceName(childProcessSetting.getCalledProcessDefinitionName());
// 3. 是否自动跳过子流程发起节点
IOParameter ioParameter = new IOParameter(); IOParameter ioParameter = new IOParameter();
ioParameter.setSourceExpression(childProcessSetting.getSkipStartUserNode().toString());
ioParameter.setTarget(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE);
inVariables.add(ioParameter);
// 4. 默认需要传递的一些变量流程状态
ioParameter = new IOParameter();
ioParameter.setSource(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS); ioParameter.setSource(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS);
ioParameter.setTarget(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS); ioParameter.setTarget(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS);
inVariable.add(ioParameter); inVariables.add(ioParameter);
callActivity.setInParameters(inVariable);
// 5. 主变量传递 // 5. 子变量传递->主变量传递
// TODO @lesan通过 isNotEmpty 这种哈 callActivity.setInParameters(inVariables);
if (childProcessSetting.getOutVariable() != null && !childProcessSetting.getOutVariable().isEmpty()) { if (ArrayUtil.isNotEmpty(childProcessSetting.getOutVariables()) && ObjUtil.notEqual(childProcessSetting.getAsync(), Boolean.TRUE)) {
callActivity.setOutParameters(childProcessSetting.getOutVariable()); callActivity.setOutParameters(childProcessSetting.getOutVariables());
} }
// 6. 子流程发起人配置 // 6. 子流程发起人配置
@ -886,16 +878,6 @@ public class SimpleModelUtils {
} }
private static class AsyncChildProcessConvert extends ChildProcessConvert {
@Override
public BpmSimpleModelNodeTypeEnum getType() {
return BpmSimpleModelNodeTypeEnum.ASYNC_CHILD_PROCESS;
}
}
private static String buildGatewayJoinId(String id) { private static String buildGatewayJoinId(String id) {
return id + "_join"; return id + "_join";
} }
@ -926,7 +908,6 @@ public class SimpleModelUtils {
|| nodeType == BpmSimpleModelNodeTypeEnum.TRANSACTOR_NODE || nodeType == BpmSimpleModelNodeTypeEnum.TRANSACTOR_NODE
|| nodeType == BpmSimpleModelNodeTypeEnum.COPY_NODE || nodeType == BpmSimpleModelNodeTypeEnum.COPY_NODE
|| nodeType == BpmSimpleModelNodeTypeEnum.CHILD_PROCESS || nodeType == BpmSimpleModelNodeTypeEnum.CHILD_PROCESS
|| nodeType == BpmSimpleModelNodeTypeEnum.ASYNC_CHILD_PROCESS
|| nodeType == BpmSimpleModelNodeTypeEnum.END_NODE) { || nodeType == BpmSimpleModelNodeTypeEnum.END_NODE) {
// 添加元素 // 添加元素
resultNodes.add(currentNode); resultNodes.add(currentNode);

View File

@ -320,7 +320,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
// 遍历 tasks 列表只处理已结束的 UserTask // 遍历 tasks 列表只处理已结束的 UserTask
// 为什么不通过 activities 因为加签场景下它只存在于 tasks没有 activities导致如果遍历 activities // 为什么不通过 activities 因为加签场景下它只存在于 tasks没有 activities导致如果遍历 activities
// 的话它无法成为一个节点 // 的话它无法成为一个节点
// TODO @芋艿子流程只有activity这里获取不到已结束的子流程TODO @lesan这个会有啥影响微信聊 // TODO @芋艿子流程只有activity这里获取不到已结束的子流程TODO @lesan这个会导致timeline不会展示已结束的子流程
List<HistoricTaskInstance> endTasks = filterList(tasks, task -> task.getEndTime() != null); List<HistoricTaskInstance> endTasks = filterList(tasks, task -> task.getEndTime() != null);
List<ActivityNode> approvalNodes = convertList(endTasks, task -> { List<ActivityNode> approvalNodes = convertList(endTasks, task -> {
FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey());
@ -414,7 +414,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
// 处理每个任务的 tasks 属性 // 处理每个任务的 tasks 属性
for (HistoricActivityInstance activity : taskActivities) { for (HistoricActivityInstance activity : taskActivities) {
HistoricTaskInstance task = taskMap.get(activity.getTaskId()); HistoricTaskInstance task = taskMap.get(activity.getTaskId());
// TODO @lesan这里为啥 continue // TODO @lesan这里为啥 continue @芋艿子流程的 activity task 是null 下面的方法会报错
if (task == null) { if (task == null) {
continue; continue;
} }
@ -510,8 +510,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
} }
// 4. 子流程节点 // 4. 子流程节点
if (BpmSimpleModelNodeTypeEnum.CHILD_PROCESS.getType().equals(node.getType()) || if (BpmSimpleModelNodeTypeEnum.CHILD_PROCESS.getType().equals(node.getType())) {
BpmSimpleModelNodeTypeEnum.ASYNC_CHILD_PROCESS.getType().equals(node.getType())) {
return activityNode; return activityNode;
} }
return null; return null;

View File

@ -1230,7 +1230,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
if (userTaskElement.getId().equals(START_USER_NODE_ID) if (userTaskElement.getId().equals(START_USER_NODE_ID)
&& (skipStartUserNodeFlag == null // 目的一般是主流程发起人节点自动通过审核 && (skipStartUserNodeFlag == null // 目的一般是主流程发起人节点自动通过审核
|| Boolean.TRUE.equals(skipStartUserNodeFlag)) // 目的一般是子流程发起人节点按配置自动通过审核 || Boolean.TRUE.equals(skipStartUserNodeFlag)) // 目的一般是子流程发起人节点按配置自动通过审核
&& !Boolean.TRUE.equals(returnTaskFlag)) { // TODO @lesanObjUtil.notEqual(returnTaskFlag, Boolean.TRUE) 改成这个有问题么尽量不用 ! 取反 && ObjUtil.notEqual(returnTaskFlag, Boolean.TRUE)) {
getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId())
.setReason(BpmReasonEnum.ASSIGN_START_USER_APPROVE_WHEN_SKIP_START_USER_NODE.getReason())); .setReason(BpmReasonEnum.ASSIGN_START_USER_APPROVE_WHEN_SKIP_START_USER_NODE.getReason()));
return; return;

View File

@ -59,19 +59,19 @@ public class BpmCallActivityListener implements ExecutionListener {
// 2.1 当表单值为空时 // 2.1 当表单值为空时
if (StrUtil.isEmpty(formFieldValue)) { if (StrUtil.isEmpty(formFieldValue)) {
// 2.1.1 来自主流程发起人 // 2.1.1 来自主流程发起人
if (startUserSetting.getEmptyHandleType().equals(BpmChildProcessStartUserEmptyTypeEnum.MAIN_PROCESS_START_USER.getType())) { if (startUserSetting.getEmptyType().equals(BpmChildProcessStartUserEmptyTypeEnum.MAIN_PROCESS_START_USER.getType())) {
FlowableUtils.setAuthenticatedUserId(Long.parseLong(parent.getStartUserId())); FlowableUtils.setAuthenticatedUserId(Long.parseLong(parent.getStartUserId()));
return; return;
} }
// 2.1.2 来自子流程管理员 // 2.1.2 来自子流程管理员
if (startUserSetting.getEmptyHandleType().equals(BpmChildProcessStartUserEmptyTypeEnum.CHILD_PROCESS_ADMIN.getType())) { if (startUserSetting.getEmptyType().equals(BpmChildProcessStartUserEmptyTypeEnum.CHILD_PROCESS_ADMIN.getType())) {
BpmProcessDefinitionInfoDO processDefinition = processDefinitionService.getProcessDefinitionInfo(execution.getProcessDefinitionId()); BpmProcessDefinitionInfoDO processDefinition = processDefinitionService.getProcessDefinitionInfo(execution.getProcessDefinitionId());
List<Long> managerUserIds = processDefinition.getManagerUserIds(); List<Long> managerUserIds = processDefinition.getManagerUserIds();
FlowableUtils.setAuthenticatedUserId(managerUserIds.get(0)); FlowableUtils.setAuthenticatedUserId(managerUserIds.get(0));
return; return;
} }
// 2.1.3 来自主流程管理员 // 2.1.3 来自主流程管理员
if (startUserSetting.getEmptyHandleType().equals(BpmChildProcessStartUserEmptyTypeEnum.MAIN_PROCESS_ADMIN.getType())) { if (startUserSetting.getEmptyType().equals(BpmChildProcessStartUserEmptyTypeEnum.MAIN_PROCESS_ADMIN.getType())) {
BpmProcessDefinitionInfoDO processDefinition = processDefinitionService.getProcessDefinitionInfo(parent.getProcessDefinitionId()); BpmProcessDefinitionInfoDO processDefinition = processDefinitionService.getProcessDefinitionInfo(parent.getProcessDefinitionId());
List<Long> managerUserIds = processDefinition.getManagerUserIds(); List<Long> managerUserIds = processDefinition.getManagerUserIds();
FlowableUtils.setAuthenticatedUserId(managerUserIds.get(0)); FlowableUtils.setAuthenticatedUserId(managerUserIds.get(0));
@ -82,7 +82,8 @@ public class BpmCallActivityListener implements ExecutionListener {
try { try {
FlowableUtils.setAuthenticatedUserId(Long.parseLong(formFieldValue)); FlowableUtils.setAuthenticatedUserId(Long.parseLong(formFieldValue));
} catch (Exception e) { } catch (Exception e) {
// todo @lesan打个日志方便排查 log.error("[error][监听器:{},子流程监听器设置流程的发起人字符串转 Long 失败,字符串:{}]",
DELEGATE_EXPRESSION, formFieldValue);
FlowableUtils.setAuthenticatedUserId(Long.parseLong(parent.getStartUserId())); FlowableUtils.setAuthenticatedUserId(Long.parseLong(parent.getStartUserId()));
} }
} }