Merge branch 'feature/REQ-4418' into dev
This commit is contained in:
commit
36a09735e3
@ -99,6 +99,15 @@ public interface BpmnConstants {
|
||||
String CONFIG_SIGN_APPROVER_ROLE_LIMIT = "roleLimit";
|
||||
String CONFIG_APPROVER_SCOPE = "approverScope";
|
||||
String CONFIG_APPROVER_SPECIFY = "approverSpecify";
|
||||
String CONFIG_APPROVE_SPECIFY_RANGE = "approverSpecifyRange";
|
||||
String CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE = "approverSpecifyCooperateType";
|
||||
String CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT = "approverSpecifyRangeOrgLimit";
|
||||
String CONFIG_APPROVE_SPECIFY_RANGE_UNIT = "approverSpecifyRangeUnit";
|
||||
String CONFIG_INITIATOR_SPECIFIED_RANGE = "initiatorSpecifiedRange";
|
||||
String CONFIG_INITIATOR_SPECIFIED_FILTER = "initiatorSpecifiedFilter";
|
||||
String CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES = "excludeIdentityTypes";
|
||||
String CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES = "excludeCooperateShipTypes";
|
||||
String CONFIG_INITIATOR_LEADER_RANGE_UNIT = "initiatorLeaderRangeUnit";
|
||||
String CONFIG_APPROVER_MODE_TYPE = "approverModeType";
|
||||
String CONFIG_APPROVER_EMPTY_HANDLE_TYPE = "approverEmptyHandleType";
|
||||
String CONFIG_ACTIVITY_SIGNATURE = "signature";
|
||||
@ -122,6 +131,7 @@ public interface BpmnConstants {
|
||||
String ELEMENT_ATTRIBUTE_TYPE = "type";
|
||||
String ELEMENT_ATTRIBUTE_ORG_LIMIT = "orgLimit";
|
||||
String ELEMENT_ATTRIBUTE_APPROVER_SPECIFY = "approverSpecify";
|
||||
String ELEMENT_ATTRIBUTE_APPROVER_SPECIFY_RANGE = "approverSpecifyRange";
|
||||
String START_EVENT_ID = "startEventNode";
|
||||
String SEQUENCE_FLOW_ID = "SequenceFlowId";
|
||||
String END_EVENT_ID = "endEventNode";
|
||||
|
||||
@ -27,6 +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),
|
||||
;
|
||||
|
||||
private String type;
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
package cn.axzo.workflow.common.enums;
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* 新版配置下的发起人自选的范围限定枚举
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-13 15:13
|
||||
*/
|
||||
public enum InitiatorSpecifiedRangeEnum {
|
||||
SelfAndChildrenInProject("SelfAndChildrenInProject", "项目内本组织及其下属组织所有成员"),
|
||||
SelfInProject("SelfInProject", "项目内本组织所有成员"),
|
||||
inProject("inProject", "项目内所有成员"),
|
||||
inEnt("inEnt", "企业内所有成员"),
|
||||
self_and_children_in_project("self_and_children_in_project", "项目内本组织及其下属组织所有成员"),
|
||||
self_in_project("self_in_project", "项目内本组织所有成员"),
|
||||
in_project("in_project", "项目内所有成员"),
|
||||
in_ent("in_ent", "企业内所有成员"),
|
||||
;
|
||||
private final String type;
|
||||
private final String desc;
|
||||
|
||||
@ -75,6 +75,11 @@ public class ProcessInstanceDocumentVO {
|
||||
*/
|
||||
private String initiatorName;
|
||||
|
||||
/**
|
||||
* 发起人模型 JSON 字符串
|
||||
*/
|
||||
private String initiatorJsonStr;
|
||||
|
||||
/**
|
||||
* 实例对应的流程引擎服务端迭代版本
|
||||
*/
|
||||
|
||||
@ -812,7 +812,7 @@ public final class BpmnJsonConverterUtil {
|
||||
String content = new String(bytes, StandardCharsets.UTF_8);
|
||||
|
||||
BpmnModelCreateDTO model = JSON.parseObject(content, BpmnModelCreateDTO.class);
|
||||
BpmnModel bpmnModel = convertToBpmn(model.getJsonModel().getNode(), ModelBizTypeEnum.SIGN, "id", "测试", "test-form", "remark",
|
||||
BpmnModel bpmnModel = convertToBpmn(model.getJsonModel().getNode(), ModelBizTypeEnum.FLOWABLE, "id", "测试", "test-form", "remark",
|
||||
model.getJsonModel().getApproveConf(),
|
||||
model.getJsonModel().getSignConf(),
|
||||
model.getJsonModel().getNoticeConf(),
|
||||
@ -823,8 +823,8 @@ public final class BpmnJsonConverterUtil {
|
||||
getSignConfig(bpmnModel.getMainProcess());
|
||||
BpmnJsonModel bpmnJsonModel = convertToJson(bpmnModel);
|
||||
|
||||
FlowElement flowElement = bpmnModel.getFlowElement("node_350687681316");
|
||||
Optional<BpmnUpgradeApprovalConf> upgradeApprovalConf = getUpgradeApprovalConf(flowElement);
|
||||
// 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
|
||||
|
||||
@ -5,6 +5,7 @@ import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
|
||||
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNodeProperty;
|
||||
@ -25,6 +26,7 @@ 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.AND_SIGN_EXPRESSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.AUTO_APPROVAL_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_ACTIVITY_SIGNATURE;
|
||||
@ -33,12 +35,21 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_EMP
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_MODE_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_TYPE_CARBON_COPY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_CURRENT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_HISTORY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_INITIATOR;
|
||||
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.CONFIG_SIGN_APPROVER_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ORG_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ROLE_LIMIT;
|
||||
@ -268,13 +279,241 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
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 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);
|
||||
|
||||
ExtensionAttribute cooperateShipTypeDescAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
cooperateShipTypeDescAttribute.setValue(property.getCooperateShipType().getDesc());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeDescAttribute);
|
||||
approverSpecifyRangePosition.addChildElement(cooperateShipType);
|
||||
break;
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "岗位“审批单指定的末级组织”");
|
||||
addCascadeConfig(property, approverSpecifyRangePosition);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "岗位“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyRangePosition);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "岗位“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyRangePosition);
|
||||
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 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);
|
||||
|
||||
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, approverSpecifyRangeRole);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "角色“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyRangeRole);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "角色“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyRangeRole);
|
||||
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 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);
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "身份不支持“项目内参建单位的企业身份”选项");
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "身份“审批单指定的末级组织”");
|
||||
addCascadeConfig(property, approverSpecifyRangeIdentity, false);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "身份“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyRangeIdentity, false);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "身份“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyRangeIdentity, 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;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 审批人指定的具体值
|
||||
approverSpecifyElement.setElementText(property.getSpecifyValue());
|
||||
ExtensionElement specifyValueElement = new ExtensionElement();
|
||||
specifyValueElement.setName(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE);
|
||||
specifyValueElement.setElementText(property.getSpecifyValue());
|
||||
approverSpecifyElement.addChildElement(specifyValueElement);
|
||||
userTask.addExtensionElement(approverSpecifyElement);
|
||||
}
|
||||
|
||||
@ -333,7 +572,7 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
|
||||
// “提级审批配置”
|
||||
BpmnUpgradeApprovalConf upgradeApprovalConf = property.getUpgradeApprovalConf();
|
||||
if(Objects.nonNull(upgradeApprovalConf) && Objects.equals(Boolean.TRUE, upgradeApprovalConf.getEnabled())){
|
||||
if (Objects.nonNull(upgradeApprovalConf) && Objects.equals(Boolean.TRUE, upgradeApprovalConf.getEnabled())) {
|
||||
ExtensionElement upgradeApprovalElement = new ExtensionElement();
|
||||
upgradeApprovalElement.setName(TEMPLATE_UPGRADE_APPROVAL_CONF);
|
||||
ExtensionAttribute upgradeApprovalEnabledAttribute = new ExtensionAttribute();
|
||||
@ -363,6 +602,56 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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 approverSpecifyRange) {
|
||||
addCascadeConfig(property, approverSpecifyRange, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加级联配置协议转换
|
||||
*
|
||||
* @param property
|
||||
* @param approverSpecifyRange
|
||||
*/
|
||||
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement approverSpecifyRange, 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);
|
||||
approverSpecifyRange.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);
|
||||
approverSpecifyRange.addChildElement(approverSpecifyRangeUnit);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置执行监听
|
||||
*
|
||||
|
||||
@ -23,7 +23,7 @@ import static org.dromara.easyes.annotation.rely.Analyzer.IK_MAX_WORD;
|
||||
* @since 2024-09-25 20:32
|
||||
*/
|
||||
@Data
|
||||
@Settings(settingsProvider = CustomIndexSettingProvider.class)
|
||||
@Settings(settingsProvider = CustomIndexSettingProvider.class, replicasNum = 1, shardsNum = 3)
|
||||
@IndexName(value = "process_instance_document", keepGlobalPrefix = true, refreshPolicy = RefreshPolicy.IMMEDIATE)
|
||||
@Join(nodes = {@Node(parentClass = ProcessInstanceDocument.class, parentAlias = "process_instance_document", childClasses = {ProcessTaskDocument.class}, childAliases = {"process_task_document"})})
|
||||
public class ProcessInstanceDocument {
|
||||
@ -100,6 +100,11 @@ public class ProcessInstanceDocument {
|
||||
@IndexField(fieldType = FieldType.KEYWORD)
|
||||
private String initiatorName;
|
||||
|
||||
/**
|
||||
* 发起人模型
|
||||
*/
|
||||
private String initiatorJsonStr;
|
||||
|
||||
/**
|
||||
* 实例对应的流程引擎服务端迭代版本
|
||||
*/
|
||||
|
||||
@ -30,6 +30,13 @@ public interface EsProcessInstanceService {
|
||||
*/
|
||||
Boolean deleteIndex();
|
||||
|
||||
/**
|
||||
* 更新流程实例索引
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
Boolean updateIndex();
|
||||
|
||||
/**
|
||||
* 新增流程实例文档
|
||||
*
|
||||
|
||||
@ -12,6 +12,7 @@ import cn.axzo.workflow.es.model.ProcessInstanceDocument;
|
||||
import cn.axzo.workflow.es.model.ProcessTaskDocument;
|
||||
import cn.axzo.workflow.es.service.EsProcessInstanceService;
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -85,7 +86,12 @@ public class AggregateProcessInstanceService {
|
||||
if (Objects.nonNull(function) && !StringUtils.hasText(initiator.getAssignerName()) && NumberUtil.isNumber(initiator.getPersonId())) {
|
||||
fullAssigner = function.apply(Lists.newArrayList(initiator)).getOrDefault(Long.parseLong(initiator.getPersonId()), null);
|
||||
}
|
||||
processInstanceDocument.setInitiatorName(Objects.nonNull(fullAssigner) ? fullAssigner.getAssignerName() : StringUtils.hasText(initiator.getAssignerName()) ? initiator.getAssignerName() : "未知");
|
||||
if (Objects.nonNull(fullAssigner)) {
|
||||
fullAssigner.setAssignerName(StringUtils.hasText(initiator.getAssignerName()) ? initiator.getAssignerName() : "未知");
|
||||
processInstanceDocument.setInitiatorName(fullAssigner.getAssignerName());
|
||||
processInstanceDocument.setInitiatorJsonStr(JSON.toJSONString(fullAssigner));
|
||||
}
|
||||
|
||||
}
|
||||
processInstanceDocument.setWorkflowEngineVersion(String.valueOf(variables.getOrDefault(WORKFLOW_ENGINE_VERSION, FLOW_SERVER_VERSION_121)));
|
||||
processInstanceDocument.setProcessCategoryType(WorkspaceType.getType((Integer) variables.getOrDefault(INTERNAL_PROCESS_WORKSPACE_TYPE, WorkspaceType.UN_KNOW.getCode())).getDesc());
|
||||
@ -101,7 +107,7 @@ public class AggregateProcessInstanceService {
|
||||
esProcessInstanceService.insert(ES_FIXED_ROUTING, processInstanceDocument);
|
||||
|
||||
String instanceVersion = String.valueOf(variables.getOrDefault(WORKFLOW_ENGINE_VERSION, FLOW_SERVER_VERSION_121))
|
||||
.replaceAll("-SNAPSHOT","")
|
||||
.replaceAll("-SNAPSHOT", "")
|
||||
.replaceAll("-RELEASE", "");
|
||||
DefaultArtifactVersion version = new DefaultArtifactVersion(instanceVersion);
|
||||
DefaultArtifactVersion supportVersion = new DefaultArtifactVersion(FLOW_SERVER_VERSION_142);
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
package cn.axzo.workflow.es.service.impl;
|
||||
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.es.InstanceSearchReqDTO;
|
||||
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.es.mapper.EsProcessInstanceMapper;
|
||||
import cn.axzo.workflow.es.model.ProcessInstanceDocument;
|
||||
import cn.axzo.workflow.es.model.ProcessTaskDocument;
|
||||
@ -10,8 +10,10 @@ import cn.axzo.workflow.es.service.EsProcessInstanceService;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.easyes.annotation.IndexName;
|
||||
import org.dromara.easyes.annotation.rely.FieldType;
|
||||
import org.dromara.easyes.core.biz.EsPageInfo;
|
||||
import org.dromara.easyes.core.cache.GlobalConfigCache;
|
||||
import org.dromara.easyes.core.conditions.index.LambdaEsIndexWrapper;
|
||||
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
|
||||
import org.dromara.easyes.core.config.GlobalConfig;
|
||||
import org.dromara.easyes.core.toolkit.FieldUtils;
|
||||
@ -70,6 +72,19 @@ public class EsProcessInstanceServiceImpl implements EsProcessInstanceService {
|
||||
return esProcessInstanceMapper.deleteIndex(globalConfig.getDbConfig().getIndexPrefix() + annotation.value());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean updateIndex() {
|
||||
GlobalConfig globalConfig = GlobalConfigCache.getGlobalConfig();
|
||||
|
||||
LambdaEsIndexWrapper<ProcessInstanceDocument> wrapper = new LambdaEsIndexWrapper<>();
|
||||
// 指定要更新哪个索引
|
||||
IndexName annotation = AnnotationUtils.findAnnotation(ProcessInstanceDocument.class, IndexName.class);
|
||||
wrapper.indexName(globalConfig.getDbConfig().getIndexPrefix() + annotation.value());
|
||||
wrapper.mapping("initiator_json_str", FieldType.TEXT);
|
||||
esProcessInstanceMapper.updateIndex(wrapper);
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增流程实例文档文档
|
||||
*
|
||||
@ -121,7 +136,7 @@ public class EsProcessInstanceServiceImpl implements EsProcessInstanceService {
|
||||
.eq(StringUtils.hasText(dto.getBusinessStatus()), FieldUtils.val(ProcessInstanceDocument::getBusinessStatus), dto.getBusinessStatus())
|
||||
.and(StringUtils.hasText(dto.getProcessInstanceName()),
|
||||
w -> w.or(i -> i.eq(FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName(), 1.2F))
|
||||
.or(j->j.match(FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName()))
|
||||
.or(j -> j.match(FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName()))
|
||||
)
|
||||
.in(CollectionUtils.isEmpty(dto.getProcessInstanceIds()), FieldUtils.val(ProcessInstanceDocument::getId), dto.getProcessInstanceIds())
|
||||
.ge(Objects.nonNull(dto.getBeginStartTime()), ProcessInstanceDocument::getInstanceStartTime, dto.getBeginStartTime())
|
||||
|
||||
@ -6,9 +6,15 @@ import com.xxl.job.core.context.XxlJobHelper;
|
||||
import com.xxl.job.core.handler.annotation.XxlJob;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.easyes.common.utils.RestHighLevelClientUtils;
|
||||
import org.dromara.easyes.core.toolkit.IndexUtils;
|
||||
import org.elasticsearch.client.RestHighLevelClient;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import static org.dromara.easyes.annotation.rely.AnnotationConstants.DEFAULT_MAX_RESULT_WINDOW;
|
||||
import static org.dromara.easyes.common.utils.RestHighLevelClientUtils.DEFAULT_DS;
|
||||
|
||||
/**
|
||||
* 生产环境下手动创建索引
|
||||
*
|
||||
@ -20,17 +26,43 @@ import org.springframework.util.StringUtils;
|
||||
@Slf4j
|
||||
public class EsIndexOperationJobHandler {
|
||||
private final EsProcessInstanceService esProcessInstanceService;
|
||||
private final RestHighLevelClientUtils restHighLevelClientUtils;
|
||||
|
||||
@XxlJob("esIndexOperation")
|
||||
public ReturnT<String> execute(String param) {
|
||||
if (!StringUtils.hasText(param)) {
|
||||
createIndex();
|
||||
} else {
|
||||
} else if (StringUtils.hasText(param) && "delete".equalsIgnoreCase(param.trim())) {
|
||||
deleteIndex();
|
||||
} else if (StringUtils.hasText(param) && "update".equalsIgnoreCase(param.trim())) {
|
||||
updateIndex();
|
||||
} else if (StringUtils.hasText(param) && "reindex".equalsIgnoreCase(param.trim())) {
|
||||
reindex();
|
||||
}
|
||||
return ReturnT.SUCCESS;
|
||||
}
|
||||
|
||||
private void reindex() {
|
||||
log.info("开始执行 reindex 操作...");
|
||||
XxlJobHelper.log("开始执行 reindex 操作...");
|
||||
//获取动态数据源 若未配置多数据源,则使用默认数据源
|
||||
RestHighLevelClient client = restHighLevelClientUtils.getClient(DEFAULT_DS);
|
||||
boolean reindex = IndexUtils.reindex(client, "workflow_engine_test_process_instance_document", "workflow_engine_dev_process_instance_document", DEFAULT_MAX_RESULT_WINDOW);
|
||||
log.info("reindex 操作完成. 响应结果: {}", reindex);
|
||||
XxlJobHelper.log("reindex 操作完成. 响应结果: {}", reindex);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新索引
|
||||
*/
|
||||
private void updateIndex() {
|
||||
log.info("开始更新父子文档索引...");
|
||||
XxlJobHelper.log("开始更新父子文档索引...");
|
||||
Boolean index = esProcessInstanceService.updateIndex();
|
||||
log.info("更新完成. 响应结果: {}", index);
|
||||
XxlJobHelper.log("更新完成. 响应结果: {}", index);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除索引
|
||||
*/
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user