Merge branch 'feature/REQ-4418' into dev
This commit is contained in:
commit
d8124a67dd
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -20,6 +20,9 @@ public enum FlowableEngineRespCode implements IModuleRespCode {
|
||||
ENGINE_NOTICE_CUSTOM_FLOW_ELEMENT_ERROR("005", "查询通知目标用户前参数发生异常,未获取到 WorkspaceType"),
|
||||
ENGINE_ASYNC_COMMAND_EXECUTION_ERROR("006", "引擎出现 SQL 相关异常, 异常信息:【{}】"),
|
||||
ENGINE_ASYNC_COMMAND_EXECUTION_RETRY_GIVE_UP("007", "命令重试尝试【{}】次仍然失败,并出现异常, 将放弃, 错误信息:{}"),
|
||||
ENGINE_POSITION_V2_CONFIG_INVALID("008", "新版本岗位配置不合法, 缺少【{}】, nodeId:【{}】"),
|
||||
ENGINE_ROLE_V2_CONFIG_INVALID("009", "新版本角色配置不合法, 缺少【{}】, nodeId:【{}】"),
|
||||
ENGINE_IDENTITY_V2_CONFIG_INVALID("009", "新版本身份配置不合法, 缺少【{}】, nodeId:【{}】"),
|
||||
;
|
||||
|
||||
private final String code;
|
||||
|
||||
@ -65,6 +65,7 @@ public interface BpmnConstants {
|
||||
String FLOW_SERVER_VERSION_130 = "1.3.0";
|
||||
// 1.4.2 开始启用新版本日志
|
||||
String FLOW_SERVER_VERSION_142 = "1.4.2";
|
||||
String FLOW_CATEGORY_VERSION = "categoryVersion";
|
||||
String CONFIG_SIGN = "signConfig";
|
||||
String CONFIG_NOTICE = "noticeConfig";
|
||||
String CONFIG_APPROVE = "approveConfig";
|
||||
|
||||
@ -27,7 +27,7 @@ public enum ApproverSpecifyEnum {
|
||||
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),
|
||||
preAllNodApprover_v2("preAllNodeApprover_v2", "所有前序节点审批人", 2),
|
||||
;
|
||||
|
||||
private String type;
|
||||
|
||||
@ -8,8 +8,8 @@ package cn.axzo.workflow.common.enums;
|
||||
*/
|
||||
public enum ApproverSpecifyRangeEnum {
|
||||
|
||||
positions_within_the_project("positions_within_the_project", "项目内岗位"),
|
||||
positions_within_the_project_construction_units("positions_within_the_project_construction_units", "项目内参建单位的企业岗位"),
|
||||
within_the_project("within_the_project", "项目内岗位"),
|
||||
within_the_project_construction_units("within_the_project_construction_units", "项目内参建单位的企业岗位"),
|
||||
specified_org("specified_org", "审批单指定的末级组织"),
|
||||
initiator("initiator", "审批单发起人"),
|
||||
pre_node_approver("pre_node_approver", "上节点审批人"),
|
||||
|
||||
@ -7,15 +7,23 @@ package cn.axzo.workflow.common.enums;
|
||||
* @since 2025-08-13 15:05
|
||||
*/
|
||||
public enum ApproverSpecifyRangeUnitEnum {
|
||||
in_project("in_project", "项目内"),
|
||||
in_ent("in_ent", "企业内"),
|
||||
in_project("in_project", "项目内", null),
|
||||
in_ent("in_ent", "企业内", null),
|
||||
in_group_lv_1("in_group_lv_1", "集团岗位,上一级", 1),
|
||||
in_group_lv_2("in_group_lv_2", "集团岗位,上二级", 2),
|
||||
in_group_lv_3("in_group_lv_3", "集团岗位,上三级", 3),
|
||||
in_group_lv_4("in_group_lv_4", "集团岗位,上四级", 4),
|
||||
in_group_lv_top("in_group_lv_top", "集团岗位,总公司", Integer.MAX_VALUE),
|
||||
UNKNOWN("UNKNOWN", "未知范围", null)
|
||||
;
|
||||
private final String type;
|
||||
private final String desc;
|
||||
private final Integer value;
|
||||
|
||||
ApproverSpecifyRangeUnitEnum(String type, String desc) {
|
||||
ApproverSpecifyRangeUnitEnum(String type, String desc, Integer value) {
|
||||
this.type = type;
|
||||
this.desc = desc;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
@ -26,4 +34,7 @@ public enum ApproverSpecifyRangeUnitEnum {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public Integer getValue() {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
@ -39,4 +39,5 @@ public enum CooperateShipTypeEnum {
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -17,6 +17,8 @@ public enum SignApproverOrgLimitEnum {
|
||||
LV_4("LV_4", "上4级组织", 4),
|
||||
LV_5("LV_5", "上5级组织", 5),
|
||||
LV_ALL("LV_ALL", "所有组织", -1),
|
||||
LV_TOP("LV_TOP", "顶层组织", Integer.MAX_VALUE),
|
||||
UNKNOWN("UNKNOWN", "未知层级", null)
|
||||
;
|
||||
|
||||
private final String type;
|
||||
|
||||
@ -30,6 +30,16 @@ public class CooperationOrgDTO implements Serializable {
|
||||
*/
|
||||
private Long nodeId;
|
||||
|
||||
/**
|
||||
* 基于人权事的,需要排除的身份类型
|
||||
*/
|
||||
private List<String> includeAreaCodes;
|
||||
|
||||
/**
|
||||
* 基于人权事的,需要排除的参建单位类型
|
||||
*/
|
||||
private List<String> includeSpecialtyCodes;
|
||||
|
||||
/**
|
||||
* 企业组织架构范围
|
||||
**/
|
||||
|
||||
@ -81,7 +81,7 @@ public class BpmnJsonNodeProperty {
|
||||
@ApiModelProperty(value = "任务节点: 当选择approverSpecify的值为 initiatorSpecified_v2,做的范围选择的值")
|
||||
private InitiatorSpecifiedRangeEnum initiatorSpecifyRange;
|
||||
@ApiModelProperty(value = "是否开起发起人的筛选策略")
|
||||
private Boolean InitiatorSpecifiedFilter;
|
||||
private Boolean initiatorSpecifiedFilter;
|
||||
/**
|
||||
* 需要排除的身份类型
|
||||
*/
|
||||
@ -189,7 +189,7 @@ public class BpmnJsonNodeProperty {
|
||||
|
||||
//************* 抄送节点Start **************//
|
||||
/**
|
||||
* 抄送节点配置
|
||||
* 抄送节点配置,(老的配置)
|
||||
*/
|
||||
@ApiModelProperty(value = "抄送节点: 多组配置,最多五组")
|
||||
private List<BpmnCarbonCopyConf> carbonCopyConf;
|
||||
|
||||
@ -240,9 +240,15 @@ public class BpmnTaskDelegateAssigner extends BaseBpmnTaskDelegateAssigner imple
|
||||
public Long parsePersonId() {
|
||||
if (NumberUtils.isDigits(personId)) {
|
||||
return Long.parseLong(personId);
|
||||
} else {
|
||||
return 0L;
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
|
||||
public Long parseNodeId() {
|
||||
if (NumberUtils.isDigits(nodeId)) {
|
||||
return Long.parseLong(nodeId);
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -1,7 +1,12 @@
|
||||
package cn.axzo.workflow.core.common.utils;
|
||||
|
||||
import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.ModelBizTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
|
||||
@ -10,9 +15,7 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnFieldConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonModel;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnUpgradeApprovalConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelCreateDTO;
|
||||
import cn.axzo.workflow.core.converter.json.AbstractBpmnJsonConverter;
|
||||
import cn.axzo.workflow.core.converter.json.BoundaryEventJsonConverter;
|
||||
@ -100,6 +103,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_O
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.END_EVENT_ID;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_CATEGORY_VERSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_MODEL_BIZ_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_NODE_JSON;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION;
|
||||
@ -120,13 +124,22 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SMS_MESSAG
|
||||
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.getApproverSpecifyRange;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeUnit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValue;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonConfig;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType;
|
||||
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;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignConfig;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getUpgradeApprovalConf;
|
||||
|
||||
/**
|
||||
* BPMN json 格式转换工具
|
||||
@ -182,11 +195,12 @@ public final class BpmnJsonConverterUtil {
|
||||
/**
|
||||
* 将 json 格式数据转的 BpmnJsonNode 对象,转换成 Flowable 标准的模型 {@link BpmnModel}
|
||||
*
|
||||
* @param bpmnJsonNode json 格式对象,可以直接解析
|
||||
* @param approveConf 流程高审批相关高级配置
|
||||
* @param bpmnJsonNode json 格式对象,可以直接解析
|
||||
* @param approveConf 流程高审批相关高级配置
|
||||
* @param noticeConf
|
||||
* @param buttonConf
|
||||
* @param fieldConf
|
||||
* @param categoryVersion 用于区分新老版本配置
|
||||
* @return {@link BpmnModel}
|
||||
*/
|
||||
public static BpmnModel convertToBpmn(BpmnJsonNode bpmnJsonNode, ModelBizTypeEnum modelBizType,
|
||||
@ -197,7 +211,8 @@ public final class BpmnJsonConverterUtil {
|
||||
BpmnNoticeConf noticeConf,
|
||||
BpmnButtonConf buttonConf,
|
||||
List<BpmnFieldConf> fieldConf,
|
||||
String serverVersionStr) {
|
||||
String serverVersionStr,
|
||||
Integer categoryVersion) {
|
||||
if (Objects.isNull(bpmnJsonNode)) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "JSON 数据为空");
|
||||
}
|
||||
@ -209,16 +224,21 @@ public final class BpmnJsonConverterUtil {
|
||||
ExtensionAttribute serverVersion = new ExtensionAttribute();
|
||||
serverVersion.setName(FLOW_SERVER_VERSION);
|
||||
serverVersion.setValue(serverVersionStr);
|
||||
ExtensionAttribute categoryVersionAttr = new ExtensionAttribute();
|
||||
categoryVersionAttr.setName(FLOW_CATEGORY_VERSION);
|
||||
categoryVersionAttr.setValue(String.valueOf(categoryVersion));
|
||||
ExtensionAttribute jsonMetaValue = new ExtensionAttribute();
|
||||
jsonMetaValue.setName(FLOW_NODE_JSON);
|
||||
jsonMetaValue.setValue(JSONUtil.toJsonStr(bpmnJsonNode));
|
||||
|
||||
|
||||
Process mainProcess = new Process();
|
||||
mainProcess.setId(id);
|
||||
mainProcess.setName(name);
|
||||
mainProcess.setDocumentation(documentation);
|
||||
mainProcess.addAttribute(modelType);
|
||||
mainProcess.addAttribute(serverVersion);
|
||||
mainProcess.addAttribute(categoryVersionAttr);
|
||||
mainProcess.addAttribute(jsonMetaValue);
|
||||
|
||||
//设置流程审批相关高级配置
|
||||
@ -768,7 +788,7 @@ public final class BpmnJsonConverterUtil {
|
||||
}
|
||||
|
||||
private static FlowElement convertJsonToElement(Class<? extends BaseElement> clz, BpmnJsonNode bpmnJsonNode,
|
||||
Process process, String formKey) {
|
||||
Process process, String formKey) {
|
||||
AbstractBpmnJsonConverter converter = CONVERTERS.getOrDefault(clz, new NotSupportConverter());
|
||||
FlowElement flowElement = converter.convertJsonToElement(bpmnJsonNode, process, formKey);
|
||||
if (Objects.nonNull(bpmnJsonNode)) {
|
||||
@ -817,19 +837,25 @@ public final class BpmnJsonConverterUtil {
|
||||
model.getJsonModel().getSignConf(),
|
||||
model.getJsonModel().getNoticeConf(),
|
||||
model.getJsonModel().getButtonConf(), model.getJsonModel().getFieldConf(),
|
||||
"1.3.1-SNAPSHOT");
|
||||
"1.3.1-SNAPSHOT",
|
||||
2);
|
||||
|
||||
getNoticeConfig(bpmnModel.getMainProcess());
|
||||
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);
|
||||
Optional<Integer> categoryVersion = getCategoryVersion(bpmnModel.getMainProcess());
|
||||
Optional<ApproverSpecifyRangeEnum> approverSpecifyRange = getApproverSpecifyRange(flowElement);
|
||||
Optional<String> approverSpecifyValue = getApproverSpecifyValue(flowElement);
|
||||
Optional<String> approverSpecifyValueV2 = getApproverSpecifyValueV2(flowElement);
|
||||
Optional<CooperateShipTypeEnum> cooperateShipType = getCooperateShipType(flowElement);
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit = getApproverSpecifyRangeUnit(flowElement);
|
||||
Optional<SignApproverOrgLimitEnum> approverSpecifyRangeOrgLimit = getApproverSpecifyRangeOrgLimit(flowElement);
|
||||
// generateImage(bpmnModel);
|
||||
|
||||
byte[] xml = transformBytes(bpmnModel);
|
||||
|
||||
@ -4,11 +4,15 @@ 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.ApproverSpecifyRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||
import cn.axzo.workflow.common.enums.AutoApprovalTypeEnum;
|
||||
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.CooperateShipTypeEnum;
|
||||
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;
|
||||
@ -63,6 +67,10 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_EMPTY_HANDLE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SCOPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SPECIFY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_UNIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_META;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_CARBON_COPY;
|
||||
@ -77,6 +85,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;
|
||||
@ -94,6 +106,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_O
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_ORG_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_CATEGORY_VERSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.SUPPORT_BATCH_OPERATION_DEFAULT_VALUE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_CARBON_COPY_MESSAGE_ID;
|
||||
@ -127,6 +140,21 @@ public final class BpmnMetaParserHelper {
|
||||
return Optional.ofNullable(process.getAttributeValue(null, FLOW_SERVER_VERSION));
|
||||
}
|
||||
|
||||
public static Optional<Integer> getCategoryVersion(Process process) {
|
||||
String categoryVersion = process.getAttributeValue(null, FLOW_CATEGORY_VERSION);
|
||||
if (StringUtils.hasText(categoryVersion)) {
|
||||
try {
|
||||
return Optional.of(Integer.parseInt(categoryVersion));
|
||||
} catch (NumberFormatException e) {
|
||||
// 如果转换失败,返回空
|
||||
return Optional.of(0);
|
||||
}
|
||||
} else {
|
||||
// 如果没有设置版本号,返回空
|
||||
return Optional.of(0);
|
||||
}
|
||||
}
|
||||
|
||||
public static Optional<BpmnApproveConf> getProcessApproveConf(Process process) {
|
||||
List<ExtensionElement> elements = process.getExtensionElements().getOrDefault(CONFIG_APPROVE, Collections.emptyList());
|
||||
BpmnApproveConf conf = new BpmnApproveConf();
|
||||
@ -438,8 +466,13 @@ public final class BpmnMetaParserHelper {
|
||||
}
|
||||
|
||||
public static Optional<ApproverSpecifyEnum> getApproverSpecify(FlowElement flowElement) {
|
||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||
return getApproverSpecify((UserTask) flowElement);
|
||||
if (Objects.nonNull(flowElement) ){
|
||||
if(flowElement instanceof UserTask) {
|
||||
return getApproverSpecify((UserTask) flowElement);
|
||||
|
||||
} else if(flowElement instanceof ServiceTask) {
|
||||
return getApproverSpecify((ServiceTask) flowElement);
|
||||
}
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
@ -448,6 +481,164 @@ public final class BpmnMetaParserHelper {
|
||||
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
|
||||
}
|
||||
|
||||
public static Optional<ApproverSpecifyEnum> getApproverSpecify(ServiceTask serviceTask) {
|
||||
return defaultValid(serviceTask, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public static Optional<ApproverSpecifyRangeEnum> getApproverSpecifyRange(FlowElement flowElement) {
|
||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||
return getApproverSpecifyRange((UserTask) flowElement);
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<ApproverSpecifyRangeEnum> getApproverSpecifyRange(UserTask userTask) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
|
||||
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.position_v2)) {
|
||||
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyRangeEnum.valueOf(element.getChildElements()
|
||||
.getOrDefault(CONFIG_APPROVE_SPECIFY_RANGE, Collections.emptyList())
|
||||
.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<SignApproverOrgLimitEnum> getApproverSpecifyRangeOrgLimit(FlowElement flowElement) {
|
||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||
return getApproverSpecifyRangeOrgLimit((UserTask) flowElement);
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<SignApproverOrgLimitEnum> getApproverSpecifyRangeOrgLimit(UserTask userTask) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
|
||||
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.position_v2)) {
|
||||
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> SignApproverOrgLimitEnum.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<CooperateShipTypeEnum> getCooperateShipType(FlowElement flowElement) {
|
||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||
return getCooperateShipType((UserTask) flowElement);
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<CooperateShipTypeEnum> getCooperateShipType(UserTask userTask) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
|
||||
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.position_v2)) {
|
||||
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> CooperateShipTypeEnum.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<ApproverSpecifyRangeUnitEnum> getApproverSpecifyRangeUnit(FlowElement flowElement) {
|
||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||
return getApproverSpecifyRangeUnit((UserTask) flowElement);
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<ApproverSpecifyRangeUnitEnum> getApproverSpecifyRangeUnit(UserTask userTask) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(userTask);
|
||||
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.position_v2)) {
|
||||
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_APPROVE_SPECIFY_RANGE_UNIT, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> ApproverSpecifyRangeUnitEnum.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
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).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_RANGE, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> InitiatorSpecifiedRangeEnum.valueOf(e.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).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_FILTER, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> Boolean.valueOf(e.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).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> JSON.parseArray(e.getElementText(), 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).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> JSON.parseArray(e.getElementText(), String.class)));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
|
||||
public static Optional<String> getApproverSpecifyValue(FlowElement flowElement) {
|
||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||
return getApproverSpecifyValue((UserTask) flowElement);
|
||||
@ -459,6 +650,17 @@ public final class BpmnMetaParserHelper {
|
||||
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> StringUtils.hasLength(element.getElementText()) ? element.getElementText() : "[]");
|
||||
}
|
||||
|
||||
public static Optional<String> getApproverSpecifyValueV2(FlowElement flowElement) {
|
||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||
return getApproverSpecifyValueV2((UserTask) flowElement);
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<String> getApproverSpecifyValueV2(UserTask userTask) {
|
||||
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> element.getChildElements().getOrDefault(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE, Collections.emptyList()).get(0).getElementText());
|
||||
}
|
||||
|
||||
public static Optional<ApproverEmptyHandleTypeEnum> getApproverEmptyHandleType(FlowElement flowElement) {
|
||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||
return getApproverEmptyHandleType((UserTask) flowElement);
|
||||
@ -588,7 +790,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());
|
||||
|
||||
@ -1,25 +1,43 @@
|
||||
package cn.axzo.workflow.core.converter.json;
|
||||
|
||||
import cn.axzo.framework.jackson.utility.JSON;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnCarbonCopyConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNodeProperty;
|
||||
import org.flowable.bpmn.model.ExtensionAttribute;
|
||||
import org.flowable.bpmn.model.ExtensionElement;
|
||||
import org.flowable.bpmn.model.Process;
|
||||
import org.flowable.bpmn.model.ServiceTask;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.axzo.workflow.common.code.ConvertorRespCode.CONVERTOR_COMMON_ERROR;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVAL_METHOD;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SCOPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SPECIFY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_UNIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPIES;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY_OBJECT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY_SPECIFY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_LEADER_RANGE_UNIT;
|
||||
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.ELEMENT_ATTRIBUTE_DESC;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_NAME;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION;
|
||||
|
||||
/**
|
||||
@ -35,17 +53,290 @@ public class ServiceTaskJsonConverter extends AbstractBpmnJsonConverter<ServiceT
|
||||
serviceTask.setId(node.getId());
|
||||
serviceTask.setName(node.getName());
|
||||
|
||||
// 设置抄送具体的实现类
|
||||
setCarbonCopyDelegate(serviceTask);
|
||||
Integer categoryVersion = getCategoryVersion(process).orElse(0);
|
||||
if (categoryVersion < 2) {
|
||||
|
||||
// 持久化节点抄送配置元数据
|
||||
setCarbonCopyExtensionElement(node, serviceTask);
|
||||
// 设置抄送具体的实现类
|
||||
setCarbonCopyDelegate(serviceTask);
|
||||
|
||||
// 持久化节点抄送配置元数据
|
||||
setCarbonCopyExtensionElement(node, serviceTask);
|
||||
} else {
|
||||
// 设置抄送具体的实现类
|
||||
setCarbonCopyDelegateV2(serviceTask);
|
||||
// 持久化节点抄送配置元数据
|
||||
setCarbonCopyExtensionElementV2(node, serviceTask);
|
||||
}
|
||||
|
||||
// "表单权限设置"
|
||||
setFormFieldExtensionElement(node, serviceTask);
|
||||
return serviceTask;
|
||||
}
|
||||
|
||||
private void setCarbonCopyDelegateV2(ServiceTask serviceTask) {
|
||||
serviceTask.setImplementation("${engineCarbonCopyV2EventListener}");
|
||||
serviceTask.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
|
||||
}
|
||||
|
||||
private static void setCarbonCopyExtensionElementV2(BpmnJsonNode node, ServiceTask serviceTask) {
|
||||
BpmnJsonNodeProperty property = node.getProperty();
|
||||
if (Objects.isNull(property)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(Objects.nonNull(property.getApproverSpecify())) {
|
||||
// 审批人指定
|
||||
ExtensionElement approverSpecifyElement = new ExtensionElement();
|
||||
approverSpecifyElement.setName(CONFIG_APPROVER_SPECIFY);
|
||||
|
||||
ExtensionAttribute approverSpecifyValueAttribute = new ExtensionAttribute();
|
||||
approverSpecifyValueAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyValueAttribute.setValue(property.getApproverSpecify().getType());
|
||||
approverSpecifyElement.addAttribute(approverSpecifyValueAttribute);
|
||||
ExtensionAttribute approverSpecifyDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyDescAttribute.setValue("审批人指定");
|
||||
approverSpecifyElement.addAttribute(approverSpecifyDescAttribute);
|
||||
|
||||
if (property.getApproverSpecify().name().contains("_v2")) {
|
||||
switch (property.getApproverSpecify()) {
|
||||
case position_v2:
|
||||
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少岗位的二级配置");
|
||||
}
|
||||
ExtensionElement approverSpecifyRangePosition = new ExtensionElement();
|
||||
approverSpecifyRangePosition.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||
approverSpecifyRangePosition.addAttribute(approverSpecifyRangeAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||
approverSpecifyRangePosition.addAttribute(approverSpecifyRangeDescAttribute);
|
||||
|
||||
switch (property.getApproverSpecifyRange()) {
|
||||
case within_the_project_construction_units:
|
||||
if (Objects.isNull(property.getCooperateShipType())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "岗位“项目内岗位”缺少级联配置");
|
||||
}
|
||||
ExtensionElement cooperateShipType = new ExtensionElement();
|
||||
cooperateShipType.setName(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE);
|
||||
ExtensionAttribute cooperateShipTypeAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
cooperateShipTypeAttribute.setValue(property.getCooperateShipType().name());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeAttribute);
|
||||
|
||||
ExtensionAttribute cooperateShipTypeDescAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
cooperateShipTypeDescAttribute.setValue(property.getCooperateShipType().getDesc());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeDescAttribute);
|
||||
approverSpecifyElement.addChildElement(cooperateShipType);
|
||||
|
||||
ExtensionElement approverSpecifyRangeUnit = new ExtensionElement();
|
||||
approverSpecifyRangeUnit.setName(CONFIG_APPROVE_SPECIFY_RANGE_UNIT);
|
||||
ExtensionAttribute approverSpecifyRangeUnitAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeUnitAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeUnitDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeUnitDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitDescAttribute);
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangeUnit);
|
||||
break;
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "岗位“审批单指定的末级组织”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "岗位“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "岗位“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangePosition);
|
||||
break;
|
||||
case role_v2:
|
||||
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少角色的二级配置");
|
||||
}
|
||||
ExtensionElement approverSpecifyRangeRole = new ExtensionElement();
|
||||
approverSpecifyRangeRole.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||
ExtensionAttribute approverSpecifyRangeRoleAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeRoleAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeRoleAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||
approverSpecifyRangeRole.addAttribute(approverSpecifyRangeRoleAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeRoleDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeRoleDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeRoleDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||
approverSpecifyRangeRole.addAttribute(approverSpecifyRangeRoleDescAttribute);
|
||||
switch (property.getApproverSpecifyRange()) {
|
||||
case within_the_project_construction_units:
|
||||
if (Objects.isNull(property.getCooperateShipType())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "角色“项目内角色”缺少级联配置");
|
||||
}
|
||||
ExtensionElement cooperateShipType = new ExtensionElement();
|
||||
cooperateShipType.setName(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE);
|
||||
ExtensionAttribute cooperateShipTypeAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
cooperateShipTypeAttribute.setValue(property.getCooperateShipType().name());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeAttribute);
|
||||
|
||||
ExtensionAttribute cooperateShipTypeDescAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
cooperateShipTypeDescAttribute.setValue(property.getCooperateShipType().getDesc());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeDescAttribute);
|
||||
|
||||
approverSpecifyRangeRole.addChildElement(cooperateShipType);
|
||||
break;
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "角色“审批单指定的末级组织”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "角色“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "角色“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangeRole);
|
||||
break;
|
||||
case identity_v2:
|
||||
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少身份的二级配置");
|
||||
}
|
||||
ExtensionElement approverSpecifyRangeIdentity = new ExtensionElement();
|
||||
approverSpecifyRangeIdentity.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||
ExtensionAttribute approverSpecifyRangeIdentityAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeIdentityAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeIdentityAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||
approverSpecifyRangeIdentity.addAttribute(approverSpecifyRangeIdentityAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeIdentityDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeIdentityDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeIdentityDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||
approverSpecifyRangeIdentity.addAttribute(approverSpecifyRangeIdentityDescAttribute);
|
||||
|
||||
switch (property.getApproverSpecifyRange()) {
|
||||
case within_the_project_construction_units:
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "身份不支持“项目内参建单位的企业身份”选项");
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "身份“审批单指定的末级组织”");
|
||||
addCascadeConfig(property, approverSpecifyElement, false);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "身份“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyElement, false);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "身份“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyElement, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangeIdentity);
|
||||
break;
|
||||
case initiatorSpecified_v2:
|
||||
if (Objects.isNull(property.getInitiatorSpecifyRange())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少发起人自选的二级配置");
|
||||
}
|
||||
ExtensionElement initiatorSpecifyRange = new ExtensionElement();
|
||||
initiatorSpecifyRange.setName(CONFIG_INITIATOR_SPECIFIED_RANGE);
|
||||
|
||||
ExtensionAttribute initiatorSpecifyRangeAttribute = new ExtensionAttribute();
|
||||
initiatorSpecifyRangeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
initiatorSpecifyRangeAttribute.setValue(property.getInitiatorSpecifyRange().getType());
|
||||
initiatorSpecifyRange.addAttribute(initiatorSpecifyRangeAttribute);
|
||||
|
||||
ExtensionAttribute initiatorSpecifyRangeDescAttribute = new ExtensionAttribute();
|
||||
initiatorSpecifyRangeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
initiatorSpecifyRangeDescAttribute.setValue(property.getInitiatorSpecifyRange().getDesc());
|
||||
initiatorSpecifyRange.addAttribute(initiatorSpecifyRangeDescAttribute);
|
||||
|
||||
approverSpecifyElement.addChildElement(initiatorSpecifyRange);
|
||||
|
||||
boolean enableFilter = Boolean.TRUE.equals(property.getInitiatorSpecifiedFilter());
|
||||
ExtensionElement InitiatorSpecifiedFilter = new ExtensionElement();
|
||||
InitiatorSpecifiedFilter.setName(CONFIG_INITIATOR_SPECIFIED_FILTER);
|
||||
ExtensionAttribute InitiatorSpecifiedFilterAttribute = new ExtensionAttribute();
|
||||
InitiatorSpecifiedFilterAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
InitiatorSpecifiedFilterAttribute.setValue(String.valueOf(enableFilter));
|
||||
InitiatorSpecifiedFilter.addAttribute(InitiatorSpecifiedFilterAttribute);
|
||||
|
||||
ExtensionAttribute InitiatorSpecifiedFilterDescAttribute = new ExtensionAttribute();
|
||||
InitiatorSpecifiedFilterDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
InitiatorSpecifiedFilterDescAttribute.setValue("是否开起发起人的筛选策略");
|
||||
InitiatorSpecifiedFilter.addAttribute(InitiatorSpecifiedFilterDescAttribute);
|
||||
approverSpecifyElement.addChildElement(InitiatorSpecifiedFilter);
|
||||
|
||||
if (enableFilter) {
|
||||
ExtensionElement excludeIdentityTypes = new ExtensionElement();
|
||||
excludeIdentityTypes.setName(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES);
|
||||
excludeIdentityTypes.setElementText(JSON.toJSONString(
|
||||
CollectionUtils.isEmpty(property.getExcludeIdentityTypes()) ? new ArrayList<>() : property.getExcludeIdentityTypes())
|
||||
);
|
||||
approverSpecifyElement.addChildElement(excludeIdentityTypes);
|
||||
|
||||
ExtensionElement excludeCooperateShipTypes = new ExtensionElement();
|
||||
excludeCooperateShipTypes.setName(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES);
|
||||
excludeCooperateShipTypes.setElementText(JSON.toJSONString(
|
||||
CollectionUtils.isEmpty(property.getExcludeCooperateShipTypes()) ? new ArrayList<>() : property.getExcludeCooperateShipTypes())
|
||||
);
|
||||
approverSpecifyElement.addChildElement(excludeCooperateShipTypes);
|
||||
}
|
||||
break;
|
||||
case initiator_v2:
|
||||
break;
|
||||
case initiatorLeader_v2:
|
||||
if (Objects.isNull(property.getApproverSpecifyRangeUnit())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少发起人主管的二级配置");
|
||||
}
|
||||
ExtensionElement initiatorLeader = new ExtensionElement();
|
||||
initiatorLeader.setName(CONFIG_INITIATOR_LEADER_RANGE_UNIT);
|
||||
ExtensionAttribute initiatorLeaderAttribute = new ExtensionAttribute();
|
||||
initiatorLeaderAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
initiatorLeaderAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||
initiatorLeader.addAttribute(initiatorLeaderAttribute);
|
||||
|
||||
ExtensionAttribute initiatorLeaderDescAttribute = new ExtensionAttribute();
|
||||
initiatorLeaderDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
initiatorLeaderDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||
initiatorLeader.addAttribute(initiatorLeaderDescAttribute);
|
||||
approverSpecifyElement.addChildElement(initiatorLeader);
|
||||
break;
|
||||
case fixedPerson_v2:
|
||||
break;
|
||||
case preAllNodApprover_v2:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 审批人指定的具体值
|
||||
ExtensionElement specifyValueElement = new ExtensionElement();
|
||||
specifyValueElement.setName(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE);
|
||||
specifyValueElement.setElementText(property.getSpecifyValue());
|
||||
approverSpecifyElement.addChildElement(specifyValueElement);
|
||||
serviceTask.addExtensionElement(approverSpecifyElement);
|
||||
}
|
||||
}
|
||||
|
||||
private static void setCarbonCopyExtensionElement(BpmnJsonNode node, ServiceTask serviceTask) {
|
||||
if (Objects.isNull(node.getProperty())) {
|
||||
return;
|
||||
@ -120,4 +411,53 @@ public class ServiceTaskJsonConverter extends AbstractBpmnJsonConverter<ServiceT
|
||||
JSON.toJSONString(node.getProperty().getFieldPermission()) : null);
|
||||
serviceTask.addExtensionElement(fieldElement);
|
||||
}
|
||||
|
||||
public static void checkCascadeConfig(BpmnJsonNodeProperty property, String tips) {
|
||||
if (Objects.isNull(property.getApproverSpecifyRangeOrgLimit())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, tips + "缺少级联组织配置");
|
||||
}
|
||||
if (Objects.isNull(property.getApproverSpecifyRangeUnit())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, tips + "缺少级联配置");
|
||||
}
|
||||
}
|
||||
|
||||
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement parentElement) {
|
||||
addCascadeConfig(property, parentElement, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加级联配置协议转换
|
||||
*
|
||||
* @param property
|
||||
* @param parentElement
|
||||
*/
|
||||
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement parentElement, boolean containsRangeUnit) {
|
||||
ExtensionElement specifiedOrg = new ExtensionElement();
|
||||
specifiedOrg.setName(CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT);
|
||||
ExtensionAttribute specifiedOrgAttribute = new ExtensionAttribute();
|
||||
specifiedOrgAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
specifiedOrgAttribute.setValue(property.getApproverSpecifyRangeOrgLimit().name());
|
||||
specifiedOrg.addAttribute(specifiedOrgAttribute);
|
||||
|
||||
ExtensionAttribute specifiedOrgDescAttribute = new ExtensionAttribute();
|
||||
specifiedOrgDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
specifiedOrgDescAttribute.setValue(property.getApproverSpecifyRangeOrgLimit().getDesc());
|
||||
specifiedOrg.addAttribute(specifiedOrgDescAttribute);
|
||||
parentElement.addChildElement(specifiedOrg);
|
||||
|
||||
if (containsRangeUnit) {
|
||||
ExtensionElement approverSpecifyRangeUnit = new ExtensionElement();
|
||||
approverSpecifyRangeUnit.setName(CONFIG_APPROVE_SPECIFY_RANGE_UNIT);
|
||||
ExtensionAttribute approverSpecifyRangeUnitAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeUnitAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeUnitDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeUnitDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitDescAttribute);
|
||||
parentElement.addChildElement(approverSpecifyRangeUnit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -304,7 +304,7 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
approverSpecifyRangePosition.addAttribute(approverSpecifyRangeDescAttribute);
|
||||
|
||||
switch (property.getApproverSpecifyRange()) {
|
||||
case positions_within_the_project_construction_units:
|
||||
case within_the_project_construction_units:
|
||||
if (Objects.isNull(property.getCooperateShipType())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "岗位“项目内岗位”缺少级联配置");
|
||||
}
|
||||
@ -319,19 +319,32 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
cooperateShipTypeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
cooperateShipTypeDescAttribute.setValue(property.getCooperateShipType().getDesc());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeDescAttribute);
|
||||
approverSpecifyRangePosition.addChildElement(cooperateShipType);
|
||||
approverSpecifyElement.addChildElement(cooperateShipType);
|
||||
|
||||
ExtensionElement approverSpecifyRangeUnit = new ExtensionElement();
|
||||
approverSpecifyRangeUnit.setName(CONFIG_APPROVE_SPECIFY_RANGE_UNIT);
|
||||
ExtensionAttribute approverSpecifyRangeUnitAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeUnitAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeUnitDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeUnitDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitDescAttribute);
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangeUnit);
|
||||
break;
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "岗位“审批单指定的末级组织”");
|
||||
addCascadeConfig(property, approverSpecifyRangePosition);
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "岗位“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyRangePosition);
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "岗位“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyRangePosition);
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -354,7 +367,7 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
approverSpecifyRangeRoleDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||
approverSpecifyRangeRole.addAttribute(approverSpecifyRangeRoleDescAttribute);
|
||||
switch (property.getApproverSpecifyRange()) {
|
||||
case positions_within_the_project_construction_units:
|
||||
case within_the_project_construction_units:
|
||||
if (Objects.isNull(property.getCooperateShipType())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "角色“项目内角色”缺少级联配置");
|
||||
}
|
||||
@ -374,15 +387,15 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
break;
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "角色“审批单指定的末级组织”");
|
||||
addCascadeConfig(property, approverSpecifyRangeRole);
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "角色“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyRangeRole);
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "角色“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyRangeRole);
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -406,29 +419,19 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
approverSpecifyRangeIdentity.addAttribute(approverSpecifyRangeIdentityDescAttribute);
|
||||
|
||||
switch (property.getApproverSpecifyRange()) {
|
||||
case positions_within_the_project_construction_units:
|
||||
// if (Objects.isNull(property.getCooperateShipType())) {
|
||||
// throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "身份“项目内角色”缺少级联配置");
|
||||
// }
|
||||
// ExtensionElement cooperateShipType = new ExtensionElement();
|
||||
// cooperateShipType.setName(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE);
|
||||
// ExtensionAttribute cooperateShipTypeAttribute = new ExtensionAttribute();
|
||||
// cooperateShipTypeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
// cooperateShipTypeAttribute.setValue(property.getCooperateShipType().name());
|
||||
// cooperateShipType.addAttribute(cooperateShipTypeAttribute);
|
||||
// approverSpecifyRangeIdentity.addChildElement(cooperateShipType);
|
||||
case within_the_project_construction_units:
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "身份不支持“项目内参建单位的企业身份”选项");
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "身份“审批单指定的末级组织”");
|
||||
addCascadeConfig(property, approverSpecifyRangeIdentity, false);
|
||||
addCascadeConfig(property, approverSpecifyElement, false);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "身份“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyRangeIdentity, false);
|
||||
addCascadeConfig(property, approverSpecifyElement, false);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "身份“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyRangeIdentity, false);
|
||||
addCascadeConfig(property, approverSpecifyElement, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -612,17 +615,17 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
}
|
||||
}
|
||||
|
||||
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement approverSpecifyRange) {
|
||||
addCascadeConfig(property, approverSpecifyRange, true);
|
||||
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement parentElement) {
|
||||
addCascadeConfig(property, parentElement, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加级联配置协议转换
|
||||
*
|
||||
* @param property
|
||||
* @param approverSpecifyRange
|
||||
* @param parentElement
|
||||
*/
|
||||
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement approverSpecifyRange, boolean containsRangeUnit) {
|
||||
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement parentElement, boolean containsRangeUnit) {
|
||||
ExtensionElement specifiedOrg = new ExtensionElement();
|
||||
specifiedOrg.setName(CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT);
|
||||
ExtensionAttribute specifiedOrgAttribute = new ExtensionAttribute();
|
||||
@ -634,7 +637,7 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
specifiedOrgDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
specifiedOrgDescAttribute.setValue(property.getApproverSpecifyRangeOrgLimit().getDesc());
|
||||
specifiedOrg.addAttribute(specifiedOrgDescAttribute);
|
||||
approverSpecifyRange.addChildElement(specifiedOrg);
|
||||
parentElement.addChildElement(specifiedOrg);
|
||||
|
||||
if (containsRangeUnit) {
|
||||
ExtensionElement approverSpecifyRangeUnit = new ExtensionElement();
|
||||
@ -648,7 +651,7 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
approverSpecifyRangeUnitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeUnitDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitDescAttribute);
|
||||
approverSpecifyRange.addChildElement(approverSpecifyRangeUnit);
|
||||
parentElement.addChildElement(approverSpecifyRangeUnit);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -6,6 +6,9 @@ import cn.axzo.workflow.common.model.dto.SignatureDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.common.utils.SpringContextUtils;
|
||||
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
|
||||
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.common.engine.impl.identity.Authentication;
|
||||
@ -155,12 +158,23 @@ public class CustomApproveTaskCmd extends AbstractCommand<Void> implements Seria
|
||||
// 记录电子签名的图片
|
||||
recordSignature(task, runtimeService);
|
||||
|
||||
resetApproverNode(task.getProcessInstanceId());
|
||||
|
||||
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
|
||||
|
||||
executeSynchronous(task, taskService, runtimeService);
|
||||
return null;
|
||||
}
|
||||
|
||||
private void resetApproverNode(String processInstanceId) {
|
||||
ExtAxProcessLogService logService = SpringContextUtils.getBean(ExtAxProcessLogService.class);
|
||||
ExtAxProcessLog processLog = logService.findByProcessIdAndTaskIdWithDeleted(processInstanceId, taskId);
|
||||
if (CollectionUtils.isEmpty(processLog.getAssigneeFull())) {
|
||||
return;
|
||||
}
|
||||
approver.setNodeId(processLog.getAssigneeFull().get(0).getNodeId());
|
||||
}
|
||||
|
||||
private void recordSignature(TaskEntity task, RuntimeService runtimeService) {
|
||||
List<SignatureDTO> signatures = runtimeService.getVariable(task.getProcessInstanceId(), SIGNATURE_COLLECTION, List.class);
|
||||
if (Objects.isNull(signatures)) {
|
||||
|
||||
@ -178,12 +178,23 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand<Void> implemen
|
||||
// 记录电子签名的图片
|
||||
recordSignature(task, runtimeService);
|
||||
|
||||
resetApproverNode(task.getProcessInstanceId());
|
||||
|
||||
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
|
||||
|
||||
executeSynchronous(task, taskService, runtimeService, commandContext, historicTaskInstance.getTenantId());
|
||||
return null;
|
||||
}
|
||||
|
||||
private void resetApproverNode(String processInstanceId) {
|
||||
ExtAxProcessLogService logService = SpringContextUtils.getBean(ExtAxProcessLogService.class);
|
||||
ExtAxProcessLog processLog = logService.findByProcessIdAndTaskIdWithDeleted(processInstanceId, taskId);
|
||||
if (CollectionUtils.isEmpty(processLog.getAssigneeFull())) {
|
||||
return;
|
||||
}
|
||||
approver.setNodeId(processLog.getAssigneeFull().get(0).getNodeId());
|
||||
}
|
||||
|
||||
/**
|
||||
* 表单校验
|
||||
*
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -0,0 +1,123 @@
|
||||
package cn.axzo.workflow.core.engine.listener;
|
||||
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.ExtHiTaskSearchDTO;
|
||||
import cn.axzo.workflow.core.engine.event.MessagePushEventBuilder;
|
||||
import cn.axzo.workflow.core.engine.event.MessagePushEventImpl;
|
||||
import cn.axzo.workflow.core.engine.event.MessagePushEventType;
|
||||
import cn.axzo.workflow.core.repository.entity.ExtAxHiTaskInst;
|
||||
import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
|
||||
import cn.axzo.workflow.core.service.converter.BpmnHistoricTaskInstanceConverter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.Process;
|
||||
import org.flowable.bpmn.model.ServiceTask;
|
||||
import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.delegate.JavaDelegate;
|
||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||
import org.flowable.spring.SpringProcessEngineConfiguration;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getActivitySignature;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNoticeConfig;
|
||||
import static cn.axzo.workflow.core.listener.AbstractBpmnEventListener.parseProcessDefinitionKey;
|
||||
|
||||
/**
|
||||
* 抄送功能的具体实现
|
||||
* <p>
|
||||
* 只负责完成抄送自身功能即可, 关于审批日志中需要记录抄送节点的功能,由 CustomServiceTaskDelegateExpressionActivityBehavior 完成
|
||||
*
|
||||
* @author wangli
|
||||
* @since 08/03/2024 17:17
|
||||
*/
|
||||
@Component
|
||||
@RefreshScope
|
||||
@Slf4j
|
||||
public class EngineCarbonCopyV2EventListener implements JavaDelegate {
|
||||
@Value("${workflow.carbonCopyTemplateCode}")
|
||||
private String carbonCopyTemplateCode;
|
||||
@Resource
|
||||
private EngineExecutionStartListener engineExecutionStartListener;
|
||||
@Resource
|
||||
private SpringProcessEngineConfiguration springProcessEngineConfiguration;
|
||||
@Resource
|
||||
private ExtAxHiTaskInstService extAxHiTaskInstService;
|
||||
|
||||
@Override
|
||||
public void execute(DelegateExecution execution) {
|
||||
log.info("EngineCarbonCopyEventListener exec...,processInstanceId: {}", execution.getProcessInstanceId());
|
||||
String currentActivityId = execution.getCurrentActivityId();
|
||||
String processDefinitionId = execution.getProcessDefinitionId();
|
||||
String processInstanceId = execution.getProcessInstanceId();
|
||||
Process mainProcess = ProcessDefinitionUtil.getBpmnModel(processDefinitionId).getMainProcess();
|
||||
|
||||
ServiceTask serviceTask = (ServiceTask) mainProcess.getFlowElement(currentActivityId);
|
||||
|
||||
List<BpmnTaskDelegateAssigner> carbonUsers = new ArrayList<>();
|
||||
getApproverSpecify(serviceTask).ifPresent(specify -> {
|
||||
carbonUsers.addAll(engineExecutionStartListener.approverSelect(specify.getType(), serviceTask, execution, false));
|
||||
});
|
||||
|
||||
RuntimeService runtimeService =
|
||||
springProcessEngineConfiguration.getProcessEngineConfiguration().getRuntimeService();
|
||||
runtimeService.setVariable(processInstanceId,
|
||||
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + currentActivityId, carbonUsers);
|
||||
|
||||
// 发送抄送事件
|
||||
invokeCarbonCopy(carbonUsers, getNoticeConfig(mainProcess), getActivitySignature(serviceTask), execution);
|
||||
}
|
||||
|
||||
private void invokeCarbonCopy(List<BpmnTaskDelegateAssigner> carbonUsers,
|
||||
Optional<BpmnNoticeConf> noticeConf,
|
||||
Boolean activitySignature, DelegateExecution execution) {
|
||||
if (CollectionUtils.isEmpty(carbonUsers)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
|
||||
FlowableEventDispatcher eventDispatcher = processEngineConfiguration.getEventDispatcher();
|
||||
|
||||
BpmnNoticeConf bpmnNoticeConf = noticeConf.map(conf -> {
|
||||
if (!StringUtils.hasText(conf.getCarbonCopy().getCarbonCopyMessageId())) {
|
||||
conf.getCarbonCopy().setCarbonCopyMessageId(carbonCopyTemplateCode);
|
||||
}
|
||||
return conf;
|
||||
}).orElse(null);
|
||||
MessagePushEventImpl event = MessagePushEventBuilder.createEvent(MessagePushEventType.CARBON_COPY,
|
||||
carbonUsers, bpmnNoticeConf, execution.getProcessInstanceId(),
|
||||
parseProcessDefinitionKey(execution.getProcessDefinitionId()),
|
||||
execution.getTenantId(), getCarbonTaskId(execution), activitySignature);
|
||||
eventDispatcher.dispatchEvent(event, processEngineConfiguration.getEngineCfgKey());
|
||||
}
|
||||
|
||||
private String getCarbonTaskId(DelegateExecution execution) {
|
||||
AtomicReference<String> taskId = new AtomicReference<>(null);
|
||||
ExtHiTaskSearchDTO searchDTO = new ExtHiTaskSearchDTO();
|
||||
searchDTO.setProcessInstanceId(execution.getProcessInstanceId());
|
||||
searchDTO.setTaskDefinitionKey(execution.getCurrentActivityId());
|
||||
extAxHiTaskInstService.queryList(searchDTO)
|
||||
.stream()
|
||||
.max(Comparator.comparing(ExtAxHiTaskInst::getCreateAt))
|
||||
.ifPresent(i -> taskId.set(i.getTaskId()));
|
||||
return taskId.get();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -63,6 +63,7 @@ import static cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAs
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprovalMethod;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessServerVersion;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getLimitedElementList;
|
||||
@ -102,11 +103,12 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
||||
|
||||
// 从 version=1.2.1-SNAPSHOT 开始,才给 process 节点增加了 serverVersion 属性
|
||||
Optional<String> processServerVersion = getProcessServerVersion(mainProcess);
|
||||
Optional<Integer> categoryVersion = getCategoryVersion(mainProcess);
|
||||
if (processServerVersion.isPresent()) {
|
||||
// 创建检查下个节点的配置
|
||||
createCheckNextActivityJob(execution.getProcessInstanceId(), currentActivityId);
|
||||
calcTaskAssigner121(execution, userTask, processServerVersion.get(), assigneeListVariableName,
|
||||
currentActivityId);
|
||||
currentActivityId, categoryVersion.orElse(0));
|
||||
} else {
|
||||
calcTaskAssignerDefault(execution, userTask, currentActivityId, assigneeListVariableName);
|
||||
}
|
||||
@ -139,7 +141,7 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
||||
}
|
||||
|
||||
private void calcTaskAssigner121(DelegateExecution execution, UserTask userTask, String processServerVersion,
|
||||
String assigneeListVariableName, String currentActivityId) {
|
||||
String assigneeListVariableName, String currentActivityId, Integer categoryVersion) {
|
||||
Optional<BpmnFlowNodeType> nodeType = getNodeType(userTask);
|
||||
DefaultArtifactVersion supportVersion = new DefaultArtifactVersion(FLOW_SERVER_VERSION_121);
|
||||
DefaultArtifactVersion currentVersion = new DefaultArtifactVersion(processServerVersion);
|
||||
@ -184,8 +186,11 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
||||
assigners.addAll(approverSelect(specify.getType(), userTask, execution, true));
|
||||
});
|
||||
|
||||
// 审批候选人为空时的兜底
|
||||
emptyAssigneeHandle(assigners, userTask, execution);
|
||||
// 只有老版本的配置会走这里, 新版本配置会直接在找过的过程中直接由人岗架接口内部处理超管
|
||||
if (categoryVersion < 2) {
|
||||
// 审批候选人为空时的兜底,
|
||||
emptyAssigneeHandle(assigners, userTask, execution);
|
||||
}
|
||||
List<BpmnTaskDelegateAssigner> resultAssigners = getLimitedElementList(assigners, APPROVAL_ASSIGNER_LIMIT_NUMBER);
|
||||
for (BpmnTaskDelegateAssigner user : resultAssigners) {
|
||||
assigneeIdList.add(user.buildAssigneeId());
|
||||
|
||||
@ -165,7 +165,8 @@ public class BpmnProcessDefinitionServiceImpl implements BpmnProcessDefinitionSe
|
||||
dto.getJsonModel().getNoticeConf(),
|
||||
dto.getJsonModel().getButtonConf(),
|
||||
dto.getJsonModel().getFieldConf(),
|
||||
serviceVersion);
|
||||
serviceVersion,
|
||||
optCategory.get().getVersion());
|
||||
byte[] bpmn = BpmnJsonConverterUtil.transformBytes(bpmnModel);
|
||||
updateProcessDefinition(model.getId(), bpmn);
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -282,7 +282,8 @@ public class BpmnProcessModelServiceImpl implements BpmnProcessModelService {
|
||||
dto.getJsonModel().getNoticeConf(),
|
||||
dto.getJsonModel().getButtonConf(),
|
||||
dto.getJsonModel().getFieldConf(),
|
||||
serviceVersion);
|
||||
serviceVersion,
|
||||
optCategory.get().getVersion());
|
||||
BpmnJsonConverterUtil.setCategory(bpmnModel, dto.getKey());
|
||||
byte[] bpmn = BpmnJsonConverterUtil.transformBytes(bpmnModel);
|
||||
processDefinitionService.updateProcessDefinition(model.getId(), bpmn);
|
||||
@ -376,7 +377,8 @@ public class BpmnProcessModelServiceImpl implements BpmnProcessModelService {
|
||||
dto.getJsonModel().getNoticeConf(),
|
||||
dto.getJsonModel().getButtonConf(),
|
||||
dto.getJsonModel().getFieldConf(),
|
||||
serviceVersion);
|
||||
serviceVersion,
|
||||
optCategory.get().getVersion());
|
||||
BpmnJsonConverterUtil.setCategory(bpmnModel, dto.getKey());
|
||||
byte[] bpmn = BpmnJsonConverterUtil.transformBytes(bpmnModel);
|
||||
processDefinitionService.updateProcessDefinition(originModel.getId(), bpmn);
|
||||
|
||||
@ -4,6 +4,7 @@ import cn.axzo.framework.domain.web.result.ApiResult;
|
||||
import cn.axzo.karma.client.feign.FlowSupportApi;
|
||||
import cn.axzo.karma.client.model.request.PersonProfileQueryReq;
|
||||
import cn.axzo.karma.client.model.response.PersonProfileResp;
|
||||
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
||||
import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
@ -265,4 +266,22 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
|
||||
this.applicationContext = context;
|
||||
}
|
||||
|
||||
public static List<BpmnTaskDelegateAssigner> convertApprover(List<FlowTaskAssignerV2Resp> flowTaskAssignersV2) {
|
||||
if (CollectionUtils.isEmpty(flowTaskAssignersV2)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return flowTaskAssignersV2.stream()
|
||||
.map(i -> BpmnTaskDelegateAssigner.builder()
|
||||
.assignee(i.getIdentityId())
|
||||
.assigneeType(i.getIdentityType())
|
||||
.assignerName(i.getRealName())
|
||||
.personId(String.valueOf(i.getPersonId()))
|
||||
.tenantId(String.valueOf(i.getWorkspaceId()))
|
||||
.ouId(String.valueOf(i.getOuId()))
|
||||
.avatar(i.getAvatarUrl())
|
||||
.nodeId(i.getNodeId())
|
||||
.build())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -9,6 +9,8 @@ import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import groovy.util.logging.Slf4j;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
@ -33,10 +35,11 @@ import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TA
|
||||
* @author wangli
|
||||
* @since 2023/11/18 22:56
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@AllArgsConstructor
|
||||
public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
@Resource
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
private final OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
|
||||
@ -0,0 +1,106 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.bpmn.model.UserTask;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_CALC_ERROR;
|
||||
|
||||
/**
|
||||
* 基于固定人员的任务审批人选择器
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-18 14:58
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@AllArgsConstructor
|
||||
public class BasedFixedPersonV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
private final OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.fixedPerson_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
|
||||
Boolean throwException) {
|
||||
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
|
||||
if (!(flowElement instanceof UserTask)) {
|
||||
return super.select(flowElement, execution, throwException);
|
||||
}
|
||||
BpmnMetaParserHelper.getApproverSpecifyValue((UserTask) flowElement)
|
||||
.ifPresent(s -> assigners.addAll(JSON.parseArray(s, BpmnTaskDelegateAssigner.class)));
|
||||
|
||||
Set<Long> workspaceIds = assigners.stream()
|
||||
.map(BpmnTaskDelegateAssigner::getTenantId)
|
||||
.filter(StringUtils::hasText)
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
List<Long> personIds = assigners.stream()
|
||||
.map(BpmnTaskDelegateAssigner::getPersonId)
|
||||
.filter(StringUtils::hasText)
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(personIds)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<OrgNodeUserDTO> onlineUsers = new ArrayList<>();
|
||||
try {
|
||||
ListOrgNodeUserReq searchReq = new ListOrgNodeUserReq();
|
||||
searchReq.setWorkspaceIds(workspaceIds);
|
||||
searchReq.setPersonIds(personIds);
|
||||
searchReq.setPage(1);
|
||||
searchReq.setPageSize(personIds.size());
|
||||
PageResp<OrgNodeUserDTO> pageResp = parseFoundationApiResult(() -> orgNodeUserApi.list(searchReq), "查询指定人员是否在职",
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.list", searchReq);
|
||||
if (pageResp != null) {
|
||||
onlineUsers = pageResp.getData();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (Boolean.TRUE.equals(throwException)) {
|
||||
throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(),
|
||||
this.getType(), e.getMessage());
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
// 只要有在职的人,不会走审批人为空
|
||||
if (ListUtils.emptyIfNull(onlineUsers).stream()
|
||||
.filter(i -> Objects.equals(i.getIsDelete(), 0L))
|
||||
.anyMatch(u -> assigners.stream()
|
||||
.anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId()))
|
||||
&& Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) {
|
||||
return assigners;
|
||||
}
|
||||
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,135 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.FlowTaskAssignerScopeDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerIdentityEnum;
|
||||
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerQuerySceneEnum;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerV2Req;
|
||||
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.bpmn.model.UserTask;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_IDENTITY_V2_CONFIG_INVALID;
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_ROLE_V2_CONFIG_INVALID;
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_TYPE_NOT_SUPPORT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
|
||||
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_project;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeUnit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType;
|
||||
|
||||
/**
|
||||
* 基于新版配置的身份查询审批人
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-15 10:58
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class BasedIdentityV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
@Resource
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.identity_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
Optional<ApproverSpecifyRangeEnum> optRange = getApproverSpecifyRange(flowElement);
|
||||
if (!optRange.isPresent()) {
|
||||
throw new WorkflowEngineException(ENGINE_ROLE_V2_CONFIG_INVALID, "级联配置", flowElement.getId());
|
||||
}
|
||||
CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
|
||||
|
||||
// 获取发起人
|
||||
BpmnTaskDelegateAssigner initiator =
|
||||
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||
|
||||
FlowTaskAssignerV2Req.FlowTaskAssignerV2ReqBuilder v2ReqBuilder = FlowTaskAssignerV2Req.builder()
|
||||
.scene(FlowTaskAssignerQuerySceneEnum.BY_ROLE)
|
||||
.identities(getApproverSpecifyValue(flowElement))
|
||||
.initiatorPersonId(initiator.parsePersonId())
|
||||
.areaCodes(Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())))
|
||||
.specialtyCodes(Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())))
|
||||
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
|
||||
switch (optRange.get()) {
|
||||
case within_the_project:
|
||||
log.info("executing role v2 with within_the_project");
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||
.crossDomain(false)
|
||||
.build());
|
||||
break;
|
||||
case within_the_project_construction_units:
|
||||
throw new WorkflowEngineException(ENGINE_USER_TASK_TYPE_NOT_SUPPORT);
|
||||
case specified_org:
|
||||
log.info("executing role v2 with specified_org");
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.build());
|
||||
break;
|
||||
case initiator:
|
||||
log.info("executing role v2 with initiator");
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(initiator.parseNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.build());
|
||||
break;
|
||||
case pre_node_approver:
|
||||
log.info("executing role v2 with pre_node_approver");
|
||||
BpmnTaskDelegateAssigner lastOperationApprover = execution.getVariable(CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class);
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(lastOperationApprover.parseNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.build());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
FlowTaskAssignerV2Req request = v2ReqBuilder.build();
|
||||
List<FlowTaskAssignerV2Resp> apiResultUsers = parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssignerV2(request), "新版查询角色下的人",
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssignerV2", request);
|
||||
return convertApprover(apiResultUsers);
|
||||
}
|
||||
|
||||
public Set<FlowTaskAssignerIdentityEnum> getApproverSpecifyValue(FlowElement flowElement) {
|
||||
return getApproverSpecifyValueV2((UserTask) flowElement)
|
||||
.map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject)
|
||||
.map(i -> i.getString("value"))
|
||||
.map(FlowTaskAssignerIdentityEnum::valueOf)
|
||||
.collect(Collectors.toSet()))
|
||||
.orElse(Collections.emptySet());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,78 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_CALC_ERROR;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INITIATOR_SPECIFY;
|
||||
|
||||
/**
|
||||
* 基于发起人指定的任务审批人选择器
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-18 14:43
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@AllArgsConstructor
|
||||
public class BasedInitiatorSpecifiedV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
private final RuntimeService runtimeService;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.initiatorSpecified_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
|
||||
try {
|
||||
populateAssigneeByInitiatorSpecify(assigners, flowElement, execution);
|
||||
} catch (Throwable t) {
|
||||
if (Boolean.TRUE.equals(throwException)) {
|
||||
log.warn("执行查询发起时指定审批人时发现异常, 审批节点:{}, 异常信息:{}", flowElement.getId(), t.getMessage());
|
||||
if (!(t instanceof WorkflowEngineException)) {
|
||||
throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(),
|
||||
this.getType(), t.getMessage());
|
||||
}
|
||||
throw t;
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
return assigners.stream().filter(i -> StringUtils.hasText(i.getPersonId())).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建审批时,传入各个节点应该设置的审批人的数据信息,此处直接设置人
|
||||
*
|
||||
* @param assigners
|
||||
* @param flowElement
|
||||
* @param execution
|
||||
*/
|
||||
private void populateAssigneeByInitiatorSpecify(List<BpmnTaskDelegateAssigner> assigners, FlowElement flowElement, DelegateExecution execution) {
|
||||
String processInstanceId = execution.getProcessInstanceId();
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, List<BpmnTaskDelegateAssigner>> initiatorSpecifyMap = runtimeService.getVariable(processInstanceId, INITIATOR_SPECIFY, Map.class);
|
||||
if (CollectionUtils.isEmpty(initiatorSpecifyMap)) {
|
||||
return;
|
||||
}
|
||||
|
||||
assigners.addAll(initiatorSpecifyMap.getOrDefault(flowElement.getId(), Collections.emptyList()));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,36 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
|
||||
/**
|
||||
* 基于发起自己的任务审批人选择器
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-18 14:54
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class BasedInitiatorV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.initiator_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
// 获取发起人
|
||||
BpmnTaskDelegateAssigner initiator =
|
||||
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||
return Collections.singletonList(initiator);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,151 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.FlowTaskAssignerScopeDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerQuerySceneEnum;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerV2Req;
|
||||
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.bpmn.model.UserTask;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_POSITION_V2_CONFIG_INVALID;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
|
||||
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_project;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeUnit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType;
|
||||
|
||||
/**
|
||||
* 基于新版配置的岗位查询审批人
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-15 10:58
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class BasedPositionV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
@Resource
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.position_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
Optional<ApproverSpecifyRangeEnum> optRange = getApproverSpecifyRange(flowElement);
|
||||
if (!optRange.isPresent()) {
|
||||
throw new WorkflowEngineException(ENGINE_POSITION_V2_CONFIG_INVALID, "级联配置", flowElement.getId());
|
||||
}
|
||||
|
||||
CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
|
||||
|
||||
// 获取发起人
|
||||
BpmnTaskDelegateAssigner initiator =
|
||||
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||
|
||||
FlowTaskAssignerV2Req.FlowTaskAssignerV2ReqBuilder v2ReqBuilder = FlowTaskAssignerV2Req.builder()
|
||||
.scene(FlowTaskAssignerQuerySceneEnum.BY_JOB)
|
||||
.jobCodes(getApproverSpecifyValue(flowElement))
|
||||
.initiatorPersonId(initiator.parsePersonId())
|
||||
.areaCodes(Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())))
|
||||
.specialtyCodes(Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())))
|
||||
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
|
||||
switch (optRange.get()) {
|
||||
case within_the_project:
|
||||
log.info("executing position v2 with within_the_project");
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||
.crossDomain(false)
|
||||
.build());
|
||||
break;
|
||||
case within_the_project_construction_units:
|
||||
log.info("executing position v2 with within_the_project_construction_units");
|
||||
CooperateShipTypeEnum workflowType = getCooperateShipType(flowElement).orElseThrow(() -> new WorkflowEngineException(ENGINE_POSITION_V2_CONFIG_INVALID, "缺少参建单位类型配置", flowElement.getId()));
|
||||
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||
.crossDomain(true)
|
||||
.cooperateTypes(Sets.newHashSet(cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum.valueOf(workflowType.name())))
|
||||
.build());
|
||||
break;
|
||||
case specified_org:
|
||||
log.info("executing position v2 with specified_org");
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit = getApproverSpecifyRangeUnit(flowElement);
|
||||
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.crossDomain(approverSpecifyRangeUnit.filter(unit -> unit != in_project).isPresent())
|
||||
.entUpLevel(approverSpecifyRangeUnit.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||
.build());
|
||||
break;
|
||||
case initiator:
|
||||
log.info("executing position v2 with initiator");
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4Initiator = getApproverSpecifyRangeUnit(flowElement);
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(initiator.parseNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.crossDomain(approverSpecifyRangeUnit4Initiator.filter(unit -> unit != in_project).isPresent())
|
||||
.entUpLevel(approverSpecifyRangeUnit4Initiator.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||
.build());
|
||||
break;
|
||||
case pre_node_approver:
|
||||
log.info("executing position v2 with pre_node_approver");
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4PreNodeApprover = getApproverSpecifyRangeUnit(flowElement);
|
||||
BpmnTaskDelegateAssigner lastOperationApprover = execution.getVariable(CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class);
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(lastOperationApprover.parseNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.crossDomain(approverSpecifyRangeUnit4PreNodeApprover.filter(unit -> unit != in_project).isPresent())
|
||||
.entUpLevel(approverSpecifyRangeUnit4PreNodeApprover.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||
.build());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
FlowTaskAssignerV2Req request = v2ReqBuilder.build();
|
||||
List<FlowTaskAssignerV2Resp> apiResultUsers = parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssignerV2(request), "新版查询岗位下的人",
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssignerV2", request);
|
||||
return convertApprover(apiResultUsers);
|
||||
}
|
||||
|
||||
public Set<String> getApproverSpecifyValue(FlowElement flowElement) {
|
||||
return getApproverSpecifyValueV2((UserTask) flowElement)
|
||||
.map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject)
|
||||
.map(i -> i.getString("value"))
|
||||
.collect(Collectors.toSet()))
|
||||
.orElse(Collections.emptySet());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,51 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
|
||||
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* 基于前序节点的任务审批人选择器(除非抄送节点)
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-18 15:11
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@AllArgsConstructor
|
||||
public class BasedPreAllNodeTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
private final ExtAxProcessLogService processLogService;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.pre_all_node_approver_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
// NODE_CARBON_COPY
|
||||
ExtAxProcessLog query = new ExtAxProcessLog();
|
||||
query.setProcessInstanceId(execution.getProcessInstanceId());
|
||||
List<ExtAxProcessLog> logs = processLogService.genericQuery(query);
|
||||
if (CollectionUtils.isEmpty(logs)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<BpmnTaskDelegateAssigner> allAssignees = logs.stream()
|
||||
.flatMap(log -> !CollectionUtils.isEmpty(log.getAssigneeFull()) ? log.getAssigneeFull().stream() : Stream.empty())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,152 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.FlowTaskAssignerScopeDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerQuerySceneEnum;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerV2Req;
|
||||
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.bpmn.model.UserTask;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_POSITION_V2_CONFIG_INVALID;
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_ROLE_V2_CONFIG_INVALID;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
|
||||
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_project;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeUnit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType;
|
||||
|
||||
/**
|
||||
* 基于新版配置的角色查询审批人
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-15 10:58
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class BasedRoleV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
@Resource
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.role_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
Optional<ApproverSpecifyRangeEnum> optRange = getApproverSpecifyRange(flowElement);
|
||||
if (!optRange.isPresent()) {
|
||||
throw new WorkflowEngineException(ENGINE_ROLE_V2_CONFIG_INVALID, "级联配置", flowElement.getId());
|
||||
}
|
||||
CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
|
||||
|
||||
// 获取发起人
|
||||
BpmnTaskDelegateAssigner initiator =
|
||||
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||
|
||||
FlowTaskAssignerV2Req.FlowTaskAssignerV2ReqBuilder v2ReqBuilder = FlowTaskAssignerV2Req.builder()
|
||||
.scene(FlowTaskAssignerQuerySceneEnum.BY_ROLE)
|
||||
.roleIds(getApproverSpecifyValue(flowElement))
|
||||
.initiatorPersonId(initiator.parsePersonId())
|
||||
.areaCodes(Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())))
|
||||
.specialtyCodes(Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())))
|
||||
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
|
||||
switch (optRange.get()) {
|
||||
case within_the_project:
|
||||
log.info("executing role v2 with within_the_project");
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||
.crossDomain(false)
|
||||
.build());
|
||||
break;
|
||||
case within_the_project_construction_units:
|
||||
log.info("executing role v2 with within_the_project_construction_units");
|
||||
CooperateShipTypeEnum workflowType = getCooperateShipType(flowElement).orElseThrow(() -> new WorkflowEngineException(ENGINE_ROLE_V2_CONFIG_INVALID, "缺少参建单位类型配置", flowElement.getId()));
|
||||
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||
.crossDomain(true)
|
||||
.cooperateTypes(Sets.newHashSet(cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum.valueOf(workflowType.name())))
|
||||
.build());
|
||||
break;
|
||||
case specified_org:
|
||||
log.info("executing role v2 with specified_org");
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit = getApproverSpecifyRangeUnit(flowElement);
|
||||
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.crossDomain(approverSpecifyRangeUnit.filter(unit -> unit != in_project).isPresent())
|
||||
.entUpLevel(approverSpecifyRangeUnit.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||
.build());
|
||||
break;
|
||||
case initiator:
|
||||
log.info("executing role v2 with initiator");
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4Initiator = getApproverSpecifyRangeUnit(flowElement);
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(initiator.parseNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.crossDomain(approverSpecifyRangeUnit4Initiator.filter(unit -> unit != in_project).isPresent())
|
||||
.entUpLevel(approverSpecifyRangeUnit4Initiator.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||
.build());
|
||||
break;
|
||||
case pre_node_approver:
|
||||
log.info("executing role v2 with pre_node_approver");
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4PreNodeApprover = getApproverSpecifyRangeUnit(flowElement);
|
||||
BpmnTaskDelegateAssigner lastOperationApprover = execution.getVariable(CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class);
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(lastOperationApprover.parseNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.crossDomain(approverSpecifyRangeUnit4PreNodeApprover.filter(unit -> unit != in_project).isPresent())
|
||||
.entUpLevel(approverSpecifyRangeUnit4PreNodeApprover.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||
.build());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
FlowTaskAssignerV2Req request = v2ReqBuilder.build();
|
||||
List<FlowTaskAssignerV2Resp> apiResultUsers = parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssignerV2(request), "新版查询角色下的人",
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssignerV2", request);
|
||||
return convertApprover(apiResultUsers);
|
||||
}
|
||||
|
||||
public Set<Long> getApproverSpecifyValue(FlowElement flowElement) {
|
||||
return getApproverSpecifyValueV2((UserTask) flowElement)
|
||||
.map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject)
|
||||
.map(i -> i.getString("value"))
|
||||
.map(Long::valueOf)
|
||||
.collect(Collectors.toSet()))
|
||||
.orElse(Collections.emptySet());
|
||||
}
|
||||
}
|
||||
@ -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
@ -13,11 +13,13 @@
|
||||
"id": "node_779068202795_ltht",
|
||||
"parentId": "NODE_STARTER",
|
||||
"property": {
|
||||
"approverSpecify": "initiatorLeader_v2",
|
||||
"initiatorSpecifyRange": "self_and_children_in_project",
|
||||
"initiatorSpecifiedFilter": true,
|
||||
// "approverSpecifyRangeOrgLimit": "LV_0",
|
||||
"approverSpecify": "position_v2",
|
||||
"approverSpecifyRange": "specified_org",
|
||||
"approverSpecifyRangeOrgLimit": "LV_0",
|
||||
"approverSpecifyRangeUnit": "in_project",
|
||||
// "initiatorSpecifiedFilter": true,
|
||||
// "excludeIdentityTypes": ["1", "2"],
|
||||
// "excludeCooperateShipTypes": ["3","4"],
|
||||
"approvalMethod": "human",
|
||||
"multiMode": "AND",
|
||||
"sign": false,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user