From 2d7195c61df64fb172255e0834606f296cccab58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 10 Mar 2026 17:20:37 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=A2=9E=E5=8A=A0=E7=A9=BA=E5=88=A4=E6=96=AD=E4=B8=8E?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/dto/StartProcessDTO.java | 3 +- .../MybatisEncryptInterceptor.java | 19 ++++----- .../service/GenTableServiceImpl.java | 3 ++ .../service/impl/SysDictTypeServiceImpl.java | 15 +++++++ .../workflow/domain/bo/BackProcessBo.java | 3 +- .../workflow/domain/bo/FlowNextNodeBo.java | 3 +- .../workflow/domain/bo/StartProcessBo.java | 3 +- .../listener/WorkflowGlobalListener.java | 4 +- .../service/impl/FlwCommonServiceImpl.java | 4 ++ .../service/impl/FlwInstanceServiceImpl.java | 9 +++++ .../service/impl/FlwSpelServiceImpl.java | 13 +++++- .../service/impl/FlwTaskServiceImpl.java | 40 ++++++++++++++++++- 12 files changed, 100 insertions(+), 19 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessDTO.java index fa3565789..115b42f68 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessDTO.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/StartProcessDTO.java @@ -48,7 +48,8 @@ public class StartProcessDTO implements Serializable { public Map getVariables() { if (variables == null) { - return new HashMap<>(16); + variables = new HashMap<>(16); + return variables; } variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); return variables; diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java index bcc2f4c9f..617fb7979 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java @@ -6,10 +6,7 @@ import cn.hutool.core.util.ObjectUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.executor.parameter.ParameterHandler; -import org.apache.ibatis.plugin.Interceptor; -import org.apache.ibatis.plugin.Intercepts; -import org.apache.ibatis.plugin.Invocation; -import org.apache.ibatis.plugin.Signature; +import org.apache.ibatis.plugin.*; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.encrypt.annotation.EncryptField; import org.dromara.common.encrypt.core.EncryptContext; @@ -42,19 +39,19 @@ public class MybatisEncryptInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { - return invocation; - } - - @Override - public Object plugin(Object target) { + Object target = invocation.getTarget(); if (target instanceof ParameterHandler parameterHandler) { - // 进行加密操作 Object parameterObject = parameterHandler.getParameterObject(); if (ObjectUtil.isNotNull(parameterObject) && !(parameterObject instanceof String)) { this.encryptHandler(parameterObject); } } - return target; + return invocation.proceed(); + } + + @Override + public Object plugin(Object target) { + return Plugin.wrap(target, this); } /** diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index 3e7bdf7bb..455f8d9e6 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -523,6 +523,9 @@ public class GenTableServiceImpl implements IGenTableService { * @param table 业务表信息 */ public void setPkColumn(GenTable table) { + if (CollUtil.isEmpty(table.getColumns())) { + throw new ServiceException("表【" + table.getTableName() + "】字段为空,请检查表结构"); + } for (GenTableColumn column : table.getColumns()) { if (column.isPk()) { table.setPkColumn(column); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java index 6d4d9fea9..a7bc06949 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -229,6 +229,9 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService @Override public String getDictLabel(String dictType, String dictValue, String separator) { List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + if (CollUtil.isEmpty(datas)) { + return StringUtils.EMPTY; + } Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); if (StringUtils.containsAny(dictValue, separator)) { return Arrays.stream(dictValue.split(separator)) @@ -250,6 +253,9 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService @Override public String getDictValue(String dictType, String dictLabel, String separator) { List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + if (CollUtil.isEmpty(datas)) { + return StringUtils.EMPTY; + } Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictLabel, SysDictDataVo::getDictValue); if (StringUtils.containsAny(dictLabel, separator)) { return Arrays.stream(dictLabel.split(separator)) @@ -269,6 +275,9 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService @Override public Map getAllDictByDictType(String dictType) { List list = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + if (CollUtil.isEmpty(list)) { + return new HashMap<>(); + } // 保证顺序 LinkedHashMap map = new LinkedHashMap<>(); for (SysDictDataVo vo : list) { @@ -286,6 +295,9 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService @Override public DictTypeDTO getDictType(String dictType) { SysDictTypeVo vo = SpringUtils.getAopProxy(this).selectDictTypeByType(dictType); + if (ObjectUtil.isNull(vo)) { + return null; + } return BeanUtil.toBean(vo, DictTypeDTO.class); } @@ -298,6 +310,9 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService @Override public List getDictData(String dictType) { List list = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(); + } return BeanUtil.copyToList(list, DictDataDTO.class); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java index a67a1f78e..a9674b0b3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java @@ -61,7 +61,8 @@ public class BackProcessBo implements Serializable { public Map getVariables() { if (variables == null) { - return new HashMap<>(16); + variables = new HashMap<>(16); + return variables; } variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); return variables; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java index 12f0653ef..de75ba621 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java @@ -30,7 +30,8 @@ public class FlowNextNodeBo implements Serializable { public Map getVariables() { if (variables == null) { - return new HashMap<>(16); + variables = new HashMap<>(16); + return variables; } variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); return variables; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java index b31f4fa14..98f33a007 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/StartProcessBo.java @@ -53,7 +53,8 @@ public class StartProcessBo implements Serializable { public Map getVariables() { if (variables == null) { - return new HashMap<>(16); + variables = new HashMap<>(16); + return variables; } variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); return variables; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index c21523f18..d8ba911f2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -80,11 +80,13 @@ public class WorkflowGlobalListener implements GlobalListener { NodeExtVo nodeExt = nodeExtService.parseNodeExt(ext, variable); Set copyList = nodeExt.getCopySettings(); if (CollUtil.isNotEmpty(copyList)) { + List userIds = StreamUtils.toList(copyList, Convert::toLong); + Map nickNameMap = userService.selectUserNicksByIds(userIds); List list = StreamUtils.toList(copyList, x -> { FlowCopyBo bo = new FlowCopyBo(); Long id = Convert.toLong(x); bo.setUserId(id); - bo.setNickName(userService.selectNicknameById(id)); + bo.setNickName(nickNameMap.getOrDefault(id, StringUtils.EMPTY)); return bo; }); variable.put(FlowConstant.FLOW_COPY_LIST, list); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java index 6f9ea3028..77389bcaa 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -126,6 +127,9 @@ public class FlwCommonServiceImpl implements IFlwCommonService { @Override public String applyNodeCode(Long definitionId) { List firstBetweenNode = FlowEngine.nodeService().getFirstBetweenNode(definitionId, new HashMap<>()); + if (CollUtil.isEmpty(firstBetweenNode)) { + throw new ServiceException("流程定义缺少申请人节点,请检查流程定义配置"); + } return firstBetweenNode.get(0).getNodeCode(); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 4de669da7..897d8a6e2 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -111,8 +111,14 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public FlowInstanceVo queryByBusinessId(Long businessId) { FlowInstance instance = this.selectInstByBusinessId(Convert.toStr(businessId)); + if (ObjectUtil.isNull(instance)) { + throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); + } FlowInstanceVo instanceVo = BeanUtil.toBean(instance, FlowInstanceVo.class); Definition definition = defService.getById(instanceVo.getDefinitionId()); + if (ObjectUtil.isNull(definition)) { + throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF); + } instanceVo.setFlowName(definition.getFlowName()); instanceVo.setFlowCode(definition.getFlowCode()); instanceVo.setVersion(definition.getVersion()); @@ -383,6 +389,9 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public Map instanceVariable(Long instanceId) { FlowInstance flowInstance = flowInstanceMapper.selectById(instanceId); + if (ObjectUtil.isNull(flowInstance)) { + throw new ServiceException(ExceptionCons.NOT_FOUNT_INSTANCE); + } Map variableMap = Optional.ofNullable(flowInstance.getVariableMap()).orElse(Collections.emptyMap()); List> variableList = variableMap.entrySet().stream() .map(entry -> Map.of("key", entry.getKey(), "value", entry.getValue())) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java index 3790cdfd4..090ac81db 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java @@ -1,6 +1,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -9,6 +10,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -125,7 +127,14 @@ public class FlwSpelServiceImpl implements IFlwSpelService { * 保存前的数据校验 */ private void validEntityBeforeSave(FlowSpel entity){ - //TODO 做一些数据校验,如唯一约束 + if (StringUtils.isNotBlank(entity.getViewSpel())) { + boolean exists = baseMapper.exists(new LambdaQueryWrapper() + .eq(FlowSpel::getViewSpel, entity.getViewSpel()) + .ne(ObjectUtil.isNotNull(entity.getId()), FlowSpel::getId, entity.getId())); + if (exists) { + throw new ServiceException("SpEL表达式已存在,请勿重复添加"); + } + } } /** @@ -137,7 +146,7 @@ public class FlwSpelServiceImpl implements IFlwSpelService { */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid){ //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index 71170ba6e..af693e6e1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -44,7 +44,6 @@ import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.ConditionalOnEnable; -import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.TaskAssigneeType; import org.dromara.workflow.common.enums.TaskOperationEnum; import org.dromara.workflow.common.enums.TaskStatusEnum; @@ -128,6 +127,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { // 已存在流程 BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus()); List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); + if (CollUtil.isEmpty(taskList)) { + throw new ServiceException("流程实例缺少任务,请检查流程定义配置"); + } taskService.mergeVariable(flowInstance, variables); insService.updateById(flowInstance); StartProcessReturnDTO dto = new StartProcessReturnDTO(); @@ -157,6 +159,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { this.buildFlowInstanceBizExt(instance, bizExt); // 申请人执行流程 List taskList = taskService.list(new FlowTask().setInstanceId(instance.getId())); + if (CollUtil.isEmpty(taskList)) { + throw new ServiceException("流程启动失败,未生成任务"); + } if (taskList.size() > 1) { throw new ServiceException("请检查流程第一个环节是否为申请人!"); } @@ -220,6 +225,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { throw new ServiceException("流程任务不存在或任务已审批!"); } Instance ins = insService.getById(flowTask.getInstanceId()); + if (ObjectUtil.isNull(ins)) { + throw new ServiceException("流程实例不存在"); + } // 检查流程状态是否为草稿、已撤销或已退回状态,若是则执行流程提交监听 if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) { variables.put(SUBMIT, true); @@ -483,6 +491,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { throw new ServiceException("任务不存在!"); } Instance inst = insService.getById(task.getInstanceId()); + if (ObjectUtil.isNull(inst)) { + throw new ServiceException("流程实例不存在"); + } BusinessStatusEnum.checkBackStatus(inst.getFlowStatus()); Long definitionId = task.getDefinitionId(); String applyNodeCode = flwCommonService.applyNodeCode(definitionId); @@ -514,6 +525,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override public List getBackTaskNode(Long taskId, String nowNodeCode) { FlowTask task = flowTaskMapper.selectById(taskId); + if (ObjectUtil.isNull(task)) { + throw new ServiceException("任务不存在!"); + } List nodeCodes = nodeService.getByNodeCodes(Collections.singletonList(nowNodeCode), task.getDefinitionId()); if (!CollUtil.isNotEmpty(nodeCodes)) { return nodeCodes; @@ -598,7 +612,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } FlowTaskVo flowTaskVo = BeanUtil.toBean(task, FlowTaskVo.class); Instance instance = insService.getById(task.getInstanceId()); + if (ObjectUtil.isNull(instance)) { + throw new ServiceException("流程实例不存在"); + } Definition definition = defService.getById(task.getDefinitionId()); + if (ObjectUtil.isNull(definition)) { + throw new ServiceException("流程定义不存在"); + } flowTaskVo.setFlowStatus(instance.getFlowStatus()); flowTaskVo.setVersion(definition.getVersion()); flowTaskVo.setFlowCode(definition.getFlowCode()); @@ -641,11 +661,23 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Long taskId = bo.getTaskId(); Map variables = bo.getVariables(); Task task = taskService.getById(taskId); + if (ObjectUtil.isNull(task)) { + throw new ServiceException("任务不存在!"); + } Instance instance = insService.getById(task.getInstanceId()); + if (ObjectUtil.isNull(instance)) { + throw new ServiceException("流程实例不存在"); + } Definition definition = defService.getById(task.getDefinitionId()); + if (ObjectUtil.isNull(definition)) { + throw new ServiceException("流程定义不存在"); + } Map mergeVariable = MapUtil.mergeAll(instance.getVariableMap(), variables); // 获取下一节点列表 List nextNodeList = nodeService.getNextNodeList(task.getDefinitionId(), task.getNodeCode(), null, SkipType.PASS.getKey(), mergeVariable); + if (CollUtil.isEmpty(nextNodeList)) { + return new ArrayList<>(); + } List nextFlowNodes = BeanUtil.copyToList(nextNodeList, FlowNode.class); // 只获取中间节点 nextFlowNodes = StreamUtils.filter(nextFlowNodes, node -> NodeType.BETWEEN.getKey().equals(node.getNodeType())); @@ -749,7 +781,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Long taskId = bo.getTaskId(); Task task = taskService.getById(taskId); + if (ObjectUtil.isNull(task)) { + throw new ServiceException("任务不存在!"); + } FlowNode flowNode = getByNodeCode(task.getNodeCode(), task.getDefinitionId()); + if (ObjectUtil.isNull(flowNode)) { + throw new ServiceException("流程节点不存在"); + } if (op == TaskOperationEnum.ADD_SIGNATURE || op == TaskOperationEnum.REDUCTION_SIGNATURE) { if (CooperateType.isOrSign(flowNode.getNodeRatio())) { throw new ServiceException(task.getNodeName() + "不是会签或票签节点!");