Merge branch 'feature/REQ-4418' into dev

This commit is contained in:
wangli 2025-08-14 17:34:26 +08:00
commit 36a09735e3
13 changed files with 1753 additions and 13815 deletions

View File

@ -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";

View File

@ -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;

View File

@ -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;

View File

@ -75,6 +75,11 @@ public class ProcessInstanceDocumentVO {
*/
private String initiatorName;
/**
* 发起人模型 JSON 字符串
*/
private String initiatorJsonStr;
/**
* 实例对应的流程引擎服务端迭代版本
*/

View File

@ -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

View File

@ -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);
}
}
/**
* 设置执行监听
*

View File

@ -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;
/**
* 实例对应的流程引擎服务端迭代版本
*/

View File

@ -30,6 +30,13 @@ public interface EsProcessInstanceService {
*/
Boolean deleteIndex();
/**
* 更新流程实例索引
*
* @return
*/
Boolean updateIndex();
/**
* 新增流程实例文档
*

View File

@ -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);

View File

@ -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())

View File

@ -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