feat(REQ-4418) - 调整创建流程前的 node 节点列表响应参数,增加发起人自选的一些配置的响应

This commit is contained in:
wangli 2025-08-15 10:15:07 +08:00
parent c2055522b3
commit 791ee00e5f
13 changed files with 271 additions and 106 deletions

View File

@ -33,6 +33,7 @@ public enum BpmnInstanceRespCode implements IModuleRespCode {
PROCESS_SIGN_DATA_NOT_EXISTS("018", "签署业务审批未获取到初始模板复制数据"),
PROCESS_INSTANCE_CANT_REMIND("019", "流程实例【{}】不存在, 不能评论"),
PROCESS_EXT_LOG_PARAM_ERROR("020", "查询流程日志的审批人PersonId参数不合法"),
PROCESS_INSTANCE_CREATE_PARAM_ERROR("021", "当前审批业务必须传入叶子节点CooperationOrgDTO.nodeId"),
;
private final String code;
private final String message;

View File

@ -41,7 +41,8 @@ public enum BpmnTaskRespCode implements IModuleRespCode {
BACK_NODE_CANNOT_REACHABLE("024", "退回节点【{}】不可达,不允许退回"),
REACHED_BACKED_MAXIMUM_NUM("025", "达到回退操作次数上限【{}】次"),
TRANSFER_TO_SELF("026", "任务不能转交给自己"),
REMIND_TASK_TOO_MANY("027", "催办任务数据异常")
REMIND_TASK_TOO_MANY("027", "催办任务数据异常"),
PROCESS_SET_ASSIGNEE_PARAM_ERROR("028", "当前审批业务审批人模型中 NodeId 必传topNodeId/nodeId均可, 触发 ID: 【{}】"),
;
private final String code;

View File

@ -30,6 +30,16 @@ public class CooperationOrgDTO implements Serializable {
*/
private Long nodeId;
/**
* 基于人权事的需要排除的身份类型
*/
private List<String> excludeIdentityTypes;
/**
* 基于人权事的需要排除的参建单位类型
*/
private List<String> excludeCooperateShipTypes;
/**
* 企业组织架构范围
**/

View File

@ -81,7 +81,7 @@ public class BpmnJsonNodeProperty {
@ApiModelProperty(value = "任务节点: 当选择approverSpecify的值为 initiatorSpecified_v2做的范围选择的值")
private InitiatorSpecifiedRangeEnum initiatorSpecifyRange;
@ApiModelProperty(value = "是否开起发起人的筛选策略")
private Boolean InitiatorSpecifiedFilter;
private Boolean initiatorSpecifiedFilter;
/**
* 需要排除的身份类型
*/

View File

@ -4,6 +4,7 @@ import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum;
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ -12,6 +13,8 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 发起流程前的节点列表中每个节点的模型配置信息
*
@ -57,10 +60,41 @@ public class BpmnNodeConfigVO {
* fixedPerson("fixedPerson", "固定人员"), 如果节点是该类型则该节点下的人会默认回显至该上级模型属性中
* initiatorLeader("initiatorLeader", "发起人主管"),
* initiatorSpecified("initiatorSpecified", "发起人自选"),
* <p>
* // 新配置规则的审批人指定方式
* position_v2("position_v2", "指定岗位", 2),
* role_v2("role_v2", "指定角色", 2),
* identity_v2("identity_v2", "指定身份", 2),
* initiatorSpecified_v2("initiatorSpecified_v2", "发起人自选", 2),
* initiator_v2("initiator_v2", "发起人自己", 2),
* initiatorLeader_v2("initiatorLeader_v2", "发起人主管", 2),
* fixedPerson_v2("fixedPerson_v2", "固定人员", 2),
* pre_all_node_approver_v2("pre_all_node_approver_v2", "所有前序节点审批人", 2),
*/
@ApiModelProperty(value = "审批人指定")
private ApproverSpecifyEnum approverSpecifyEnum;
/**
* self_and_children_in_project("self_and_children_in_project", "项目内本组织及其下属组织所有成员"),
* self_in_project("self_in_project", "项目内本组织所有成员"),
* in_project("in_project", "项目内所有成员"),
* in_ent("in_ent", "企业内所有成员"),
*/
@ApiModelProperty(value = "任务节点: 当选择approverSpecifyEnum的值为 initiatorSpecified_v2做的范围选择的值")
private InitiatorSpecifiedRangeEnum initiatorSpecifyRange;
@ApiModelProperty(value = "是否开起发起人的筛选策略")
private Boolean initiatorSpecifiedFilter;
/**
* 需要排除的身份类型
*/
@ApiModelProperty(value = "需要排除的身份类型")
private List<String> excludeIdentityTypes;
/**
* 需要排查的参建单位类型
*/
@ApiModelProperty(value = "需要排除的参建单位类型")
private List<String> excludeCooperateShipTypes;
/**
* 审批人为空时的处理方式
* <p>

View File

@ -1,6 +1,7 @@
package cn.axzo.workflow.core.common.utils;
import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum;
import cn.axzo.workflow.common.enums.ModelBizTypeEnum;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
@ -121,7 +122,11 @@ import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CONDITION;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EMPTY;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EXCLUSIVE_GATEWAY;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonConfig;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeCooperateShipTypes;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeIdentityTypes;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getFieldConfig;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifiedFilter;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifyRange;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNoticeConfig;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessApproveConf;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignApproverLimit;
@ -823,13 +828,11 @@ public final class BpmnJsonConverterUtil {
getSignConfig(bpmnModel.getMainProcess());
BpmnJsonModel bpmnJsonModel = convertToJson(bpmnModel);
// FlowElement flowElement = bpmnModel.getFlowElement("node_350687681316");
// Optional<BpmnUpgradeApprovalConf> upgradeApprovalConf = getUpgradeApprovalConf(flowElement);
// Optional<BpmnSignApproverLimit> signApproverLimit = getSignApproverLimit(flowElement);
// ServiceTask serviceTask = (ServiceTask) bpmnModel.getFlowElement("node_946990365785");
// Optional<List<BpmnCarbonCopyConf>> carbonCopyConfigs = BpmnMetaParserHelper.getCarbonCopyConfigs
// (serviceTask);
FlowElement flowElement = bpmnModel.getFlowElement("node_779068202795_ltht");
Optional<InitiatorSpecifiedRangeEnum> initiatorSpecifyRange = getInitiatorSpecifyRange(flowElement);
Optional<Boolean> initiatorSpecifiedFilter = getInitiatorSpecifiedFilter(flowElement);
Optional<List<String>> excludeIdentityTypes = getExcludeIdentityTypes(flowElement);
Optional<List<String>> excludeCooperateShipTypes = getExcludeCooperateShipTypes(flowElement);
// generateImage(bpmnModel);
byte[] xml = transformBytes(bpmnModel);

View File

@ -9,6 +9,7 @@ import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.enums.BpmnSignType;
import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum;
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
import cn.axzo.workflow.common.enums.SignApproverRoleLimitEnum;
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
@ -77,6 +78,10 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_META;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_OPTION;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_FILTER;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_RANGE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NODE_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NOTICE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN;
@ -448,6 +453,77 @@ public final class BpmnMetaParserHelper {
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
}
public static Optional<InitiatorSpecifiedRangeEnum> getInitiatorSpecifyRange(FlowElement flowElement) {
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
return getInitiatorSpecifyRange((UserTask) flowElement);
}
return Optional.empty();
}
public static Optional<InitiatorSpecifiedRangeEnum> getInitiatorSpecifyRange(UserTask userTask) {
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.initiatorSpecified_v2)) {
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> InitiatorSpecifiedRangeEnum.valueOf(element.getChildElements()
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_RANGE, Collections.emptyList())
.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
}
return Optional.empty();
}
public static Optional<Boolean> getInitiatorSpecifiedFilter(FlowElement flowElement) {
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
return getInitiatorSpecifiedFilter(((UserTask) flowElement));
}
return Optional.empty();
}
public static Optional<Boolean> getInitiatorSpecifiedFilter(UserTask userTask) {
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.initiatorSpecified_v2)) {
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> Boolean.valueOf(element.getChildElements()
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_FILTER, Collections.emptyList())
.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
}
return Optional.empty();
}
public static Optional<List<String>> getExcludeIdentityTypes(FlowElement flowElement) {
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
return getExcludeIdentityTypes((UserTask) flowElement);
}
return Optional.empty();
}
public static Optional<List<String>> getExcludeIdentityTypes(UserTask userTask) {
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.initiatorSpecified_v2)) {
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> element.getChildElements()
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES, Collections.emptyList())
.get(0).getElementText())
.map(s -> JSON.parseArray(s, String.class));
}
return Optional.empty();
}
public static Optional<List<String>> getExcludeCooperateShipTypes(FlowElement flowElement) {
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
return getExcludeIdentityTypes((UserTask) flowElement);
}
return Optional.empty();
}
public static Optional<List<String>> getExcludeCooperateShipTypes(UserTask userTask) {
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.initiatorSpecified_v2)) {
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> element.getChildElements()
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES, Collections.emptyList())
.get(0).getElementText())
.map(s -> JSON.parseArray(s, String.class));
}
return Optional.empty();
}
public static Optional<String> getApproverSpecifyValue(FlowElement flowElement) {
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
return getApproverSpecifyValue((UserTask) flowElement);
@ -588,7 +664,7 @@ public final class BpmnMetaParserHelper {
BpmnUpgradeApprovalConf conf = new BpmnUpgradeApprovalConf();
Boolean enabled = Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED));
conf.setEnabled(enabled);
if(Objects.equals(Boolean.TRUE, enabled)) {
if (Objects.equals(Boolean.TRUE, enabled)) {
conf.setOrgLimit(SignApproverOrgLimitEnum.valueOfType(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_LIMIT_CONF).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_ORG_LIMIT)));
conf.setApproverSpecify(ApproverSpecifyEnum.valueOf(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_LIMIT_CONF).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_APPROVER_SPECIFY)));
conf.setSpecifyValue(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE).get(0).getElementText());

View File

@ -46,7 +46,7 @@ public class CustomBizSpecifyAssigneeToTaskAsyncCmd extends AbstractCommand<Stri
//校验
validate(processEngineConfiguration.getRuntimeService(), dto.getTriggerId(), task, dto.getAssigners());
validProcessInstance(commandContext, task);
validProcessInstance(commandContext, task, dto.getAssigners());
return startAsync(processEngineConfiguration, task);
}

View File

@ -2,7 +2,9 @@ package cn.axzo.workflow.core.engine.cmd;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.common.utils.SpringContextUtils;
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
import cn.axzo.workflow.core.service.CategoryService;
import com.alibaba.fastjson.JSON;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.HistoryService;
@ -17,6 +19,7 @@ import org.flowable.job.service.impl.persistence.entity.TimerJobEntity;
import org.flowable.task.api.Task;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.util.HashMap;
@ -28,12 +31,15 @@ import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_BIZ_SET_ASSIGNEE_ERROR;
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_CANT_SET_ASSIGNEE;
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.PROCESS_CANT_SET_ASSIGNEE;
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.PROCESS_SET_ASSIGNEE_PARAM_ERROR;
import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_MODEL_CATEGORY;
import static cn.axzo.workflow.common.constant.BpmnConstants.HIDDEN_ASSIGNEE_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.DELETED;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
import static cn.axzo.workflow.common.enums.WorkspaceType.PROJECT;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTaskAssignerCount;
/**
@ -62,8 +68,8 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
public static Task getOperateTask(TaskService taskService, String executionId) {
return taskService.createTaskQuery().executionId(executionId)
.taskAssignee(NO_ASSIGNEE)
.singleResult();
.taskAssignee(NO_ASSIGNEE)
.singleResult();
}
/**
@ -82,13 +88,13 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
@Override
public Boolean execute(CommandContext commandContext) {
ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext);
CommandContextUtil.getProcessEngineConfiguration(commandContext);
TaskService taskService = processEngineConfiguration.getTaskService();
TaskEntity task = (TaskEntity) getOperateTask(taskService, executionId);
//校验
validate(processEngineConfiguration.getRuntimeService(), executionId, task, addedAssigners);
validProcessInstance(commandContext, task);
validProcessInstance(commandContext, task, addedAssigners);
changeAssigneeSnapshot(commandContext, task);
@ -114,9 +120,9 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
}
public static void validProcessInstance(CommandContext commandContext, Task task) {
public static void validProcessInstance(CommandContext commandContext, Task task, List<BpmnTaskDelegateAssigner> addedAssigners) {
ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext);
CommandContextUtil.getProcessEngineConfiguration(commandContext);
HistoryService historyService = processEngineConfiguration.getHistoryService();
HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
if (Objects.isNull(processInstance)) {
@ -125,17 +131,29 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
if (!Objects.equals(PROCESSING.getStatus(), processInstance.getBusinessStatus())) {
throw new WorkflowEngineException(PROCESS_CANT_SET_ASSIGNEE);
}
CategoryService categoryService = SpringContextUtils.getBean(CategoryService.class);
categoryService.get(BPM_MODEL_CATEGORY, processInstance.getProcessDefinitionKey())
.ifPresent(category -> {
if (category.getWorkspaceTypeCode().equals(String.valueOf(PROJECT.getCode())) && category.getVersion() > 0) {
for (BpmnTaskDelegateAssigner assigner : addedAssigners) {
if (!StringUtils.hasText(assigner.getNodeId())) {
throw new WorkflowEngineException(PROCESS_SET_ASSIGNEE_PARAM_ERROR);
}
}
}
});
}
private void changeAssigneeSnapshot(CommandContext commandContext, Task task) {
ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext);
CommandContextUtil.getProcessEngineConfiguration(commandContext);
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
@SuppressWarnings("unchecked")
List<BpmnTaskDelegateAssigner> originAssingeeList = runtimeService.getVariable(task.getProcessInstanceId(),
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), List.class);
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), List.class);
for (BpmnTaskDelegateAssigner assigner : originAssingeeList) {
if (Objects.equals(assigner.buildAssigneeId(), NO_ASSIGNEE)) {
@ -145,8 +163,8 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
}
originAssingeeList.addAll(addedAssigners);
runtimeService.setVariable(task.getProcessInstanceId(),
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(),
originAssingeeList);
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(),
originAssingeeList);
}
private void addAssignee(CommandContext commandContext, TaskService taskService, Task task) {

View File

@ -154,6 +154,7 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.axzo.workflow.client.config.WorkflowRequestInterceptor.HEADER_SERVER_NAME;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CREATE_PARAM_ERROR;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_ID_NOT_EXISTS;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.RUNNING_INSTANCE_ONLY_FORECAST;
@ -187,9 +188,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_PROCESS_ENABLE
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_VARIABLE;
import static cn.axzo.workflow.common.constant.BpmnConstants.WORKFLOW_ENGINE_VERSION;
import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_TYPE_PROCESS;
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoPassed;
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoPassed_empty;
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoRejection;
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoRejection_empty;
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.human;
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.transferToAdmin;
@ -211,6 +210,7 @@ import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.DELETE
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.REJECTED;
import static cn.axzo.workflow.common.enums.WorkspaceType.GOVERNMENT;
import static cn.axzo.workflow.common.enums.WorkspaceType.PROJECT;
import static cn.axzo.workflow.common.util.BpmnNativeQueryUtil.countSql;
import static cn.axzo.workflow.common.util.BpmnNativeQueryUtil.sqlConnectors;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getActivitySignature;
@ -220,6 +220,10 @@ import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprove
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonConfig;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCarbonCopyConfigs;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeCooperateShipTypes;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeIdentityTypes;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifiedFilter;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifyRange;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessApproveConf;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignApproverLimit;
@ -421,6 +425,10 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
.approvalMethodEnum(getApprovalMethod(fe).orElse(null))
.approverScopeEnum(getApproverScope(fe).orElse(null))
.approverSpecifyEnum(approverSpecifyEnum)
.initiatorSpecifyRange(getInitiatorSpecifyRange(fe).orElse(null))
.initiatorSpecifiedFilter(getInitiatorSpecifiedFilter(fe).orElse(null))
.excludeIdentityTypes(getExcludeIdentityTypes(fe).orElse(null))
.excludeCooperateShipTypes(getExcludeCooperateShipTypes(fe).orElse(null))
.approverEmptyHandleTypeEnum(getApproverEmptyHandleType(fe).orElse(null))
.signature(getActivitySignature(fe))
.signApproverLimit(getSignApproverLimit(fe).orElse(null))
@ -466,7 +474,12 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
throw new WorkflowEngineException(PROCESS_DEFINITION_IS_INVALID, dto.getProcessDefinitionKey());
}
}
//新版入参 nodeId 校验
if (categoryItemVO.isPresent() && categoryItemVO.get().getWorkspaceTypeCode().equals(String.valueOf(PROJECT.getCode())) && categoryItemVO.get().getVersion() > 0) {
if(Objects.isNull(dto.getCooperationOrg().getNodeId())) {
throw new WorkflowEngineException(PROCESS_INSTANCE_CREATE_PARAM_ERROR);
}
}
categoryItemVO.ifPresent(itemVO -> {
dto.getVariables().put(INTERNAL_PROCESS_WORKSPACE_TYPE, WorkspaceType.getType(Integer.valueOf(itemVO.getWorkspaceTypeCode())).getCode());
dto.getVariables().put(INTERNAL_PROCESS_BIZ_TYPE, itemVO.getBusinessType().getType());
@ -1415,7 +1428,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
.findAny()
.ifPresent(i -> {
authorizedButtons.addAll(chooseButtons(logVO, CONFIG_BUTTON_TYPE_CURRENT));
supportUpgrade.set(Objects.equals(Boolean.TRUE,i.getSupportUpgradeApproval()));
supportUpgrade.set(Objects.equals(Boolean.TRUE, i.getSupportUpgradeApproval()));
});
@ -1586,63 +1599,63 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
ListUtils.emptyIfNull(forecasting).stream()
.filter(i -> Objects.equals(Boolean.TRUE, i.getFutureNode()))
.forEach(e -> {
BpmnTaskInstanceLogVO build = BpmnTaskInstanceLogVO.builder()
.taskDefinitionKey(e.getId())
.name(e.getName())
.approvalMethod(e.getApprovalMethod())
.nodeType(e.getNodeType())
.nodeMode(e.getNodeMode())
.forecastAssignees(e.getForecastAssigners())
.build();
if (Objects.nonNull(e.getApprovalMethod())) {
switch (e.getApprovalMethod()) {
case bizSpecify:
build.setOperationDesc("动态审批人");
break;
case nobody:
build.setOperationDesc("系统处理");
break;
case autoPassed:
build.setOperationDesc("无需审批人,自动同意");
break;
case autoRejection:
build.setOperationDesc("无需审批人,自动驳回");
break;
case autoPassed_empty:
build.setOperationDesc("未找到审批人,自动同意");
break;
case autoRejection_empty:
build.setOperationDesc("未找到审批人,自动驳回");
break;
case transferToAdmin:
build.setOperationDesc("找不到审批人且转交管理员失败,自动中止");
break;
case human:
if (Objects.equals(e.getNodeMode(), EXCEPTIONAL)) {
build.setOperationDesc("");
} else {
int countPerson = e.getForecastAssigners().size();
if (Objects.equals(BpmnFlowNodeMode.AND, e.getNodeMode())) {
build.setOperationDesc(countPerson + "人会签,需要全部同意");
} else if (Objects.equals(BpmnFlowNodeMode.OR, e.getNodeMode())) {
build.setOperationDesc(countPerson + "人或签,仅一人同意即可");
}
if (Objects.equals(countPerson, 1)) {
// 如果未来节点是单人则按单人节点展示
build.setAssigneeSnapshot(build.getForecastAssignees().get(0));
build.setOperationDesc(build.getAssigneeSnapshot().getAssignerName());
build.setForecastAssignees(null);
}
BpmnTaskInstanceLogVO build = BpmnTaskInstanceLogVO.builder()
.taskDefinitionKey(e.getId())
.name(e.getName())
.approvalMethod(e.getApprovalMethod())
.nodeType(e.getNodeType())
.nodeMode(e.getNodeMode())
.forecastAssignees(e.getForecastAssigners())
.build();
if (Objects.nonNull(e.getApprovalMethod())) {
switch (e.getApprovalMethod()) {
case bizSpecify:
build.setOperationDesc("动态审批人");
break;
case nobody:
build.setOperationDesc("系统处理");
break;
case autoPassed:
build.setOperationDesc("无需审批人,自动同意");
break;
case autoRejection:
build.setOperationDesc("无需审批人,自动驳回");
break;
case autoPassed_empty:
build.setOperationDesc("未找到审批人,自动同意");
break;
case autoRejection_empty:
build.setOperationDesc("未找到审批人,自动驳回");
break;
case transferToAdmin:
build.setOperationDesc("找不到审批人且转交管理员失败,自动中止");
break;
case human:
if (Objects.equals(e.getNodeMode(), EXCEPTIONAL)) {
build.setOperationDesc("");
} else {
int countPerson = e.getForecastAssigners().size();
if (Objects.equals(BpmnFlowNodeMode.AND, e.getNodeMode())) {
build.setOperationDesc(countPerson + "人会签,需要全部同意");
} else if (Objects.equals(BpmnFlowNodeMode.OR, e.getNodeMode())) {
build.setOperationDesc(countPerson + "人或签,仅一人同意即可");
}
if (Objects.equals(countPerson, 1)) {
// 如果未来节点是单人则按单人节点展示
build.setAssigneeSnapshot(build.getForecastAssignees().get(0));
build.setOperationDesc(build.getAssigneeSnapshot().getAssignerName());
build.setForecastAssignees(null);
}
}
break;
}
break;
}
}
if (Objects.equals(e.getNodeType(), NODE_CARBON_COPY)) {
build.setOperationDesc("抄送" + e.getForecastAssigners().size() + "");
}
build.setUpgradeApprovalConf(e.getUpgradeApprovalConf());
tasks.add(build);
});
}
if (Objects.equals(e.getNodeType(), NODE_CARBON_COPY)) {
build.setOperationDesc("抄送" + e.getForecastAssigners().size() + "");
}
build.setUpgradeApprovalConf(e.getUpgradeApprovalConf());
tasks.add(build);
});
}
private void getHistoricTasks(List<ExtAxProcessLog> logs,

View File

@ -42,12 +42,14 @@ import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
import cn.axzo.workflow.common.model.response.bpmn.process.doc.DocPendingVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceLogVO;
import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
import cn.axzo.workflow.common.valid.group.ValidGroup;
import cn.axzo.workflow.core.engine.cmd.CustomGetModelDocsCmd;
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
import cn.axzo.workflow.core.repository.mapper.ExtAxModelDocMapper;
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
import cn.axzo.workflow.core.service.BpmnProcessTaskService;
import cn.axzo.workflow.core.service.CategoryService;
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
import cn.axzo.workflow.core.service.ExtAxProcessSignService;
import cn.axzo.workflow.core.service.ExtAxReModelService;
@ -86,6 +88,7 @@ import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@ -93,6 +96,7 @@ import java.util.stream.Stream;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_DOC_ID_NOT_IN_MODEL;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_DOC_READ_PARAM_ERROR;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_EXT_LOG_PARAM_ERROR;
import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_MODEL_CATEGORY;
import static cn.azxo.framework.common.model.CommonResponse.success;
/**
@ -125,6 +129,8 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
private ExtAxReModelService extAxReModelService;
@Resource
private ExtAxProcessLogService extAxProcessLogService;
@Resource
private CategoryService categoryService;
/**
* 超管查询所有流程实例

File diff suppressed because one or more lines are too long

View File

@ -13,11 +13,11 @@
"id": "node_779068202795_ltht",
"parentId": "NODE_STARTER",
"property": {
"approverSpecify": "initiatorLeader_v2",
"approverSpecify": "initiatorSpecified_v2",
"initiatorSpecifyRange": "self_and_children_in_project",
"initiatorSpecifiedFilter": true,
// "approverSpecifyRangeOrgLimit": "LV_0",
"approverSpecifyRangeUnit": "in_project",
"excludeIdentityTypes": ["1", "2"],
"excludeCooperateShipTypes": ["3","4"],
"approvalMethod": "human",
"multiMode": "AND",
"sign": false,