Flow 与 Formula Evaluation:Apex 集成 Flow Builder 完全指南

Flow与Formula Evaluation完整指南:Flow.Interview.getVariableValue获取Flow变量(子Flow面包屑导航)、屏幕Flow中callout=true修饰符(提交当前事务+启动新事务三条件)、InvocableActionExtension元数据文件(参数Order排序/Group折叠分组/ProvidedValuesList静态选择列表500上限)、DynamicPicklist动态选择列表(扩展VisualEditor.DynamicPicklist/apex://引用/高效防超时)、CustomHeaderLwcName自定义头部(LWC/c:componentName)、Partial CPE部分自定义属性编辑器(CpeName+ConfiguredBy/新参数自动标准编辑器)、Process.Plugin接口(@InvocableMethod强烈推荐替代/不支持Blob+Collection+sObject+批量/Legacy不支持自动布局/describe+invoke两方法/no查询+数据修改+邮件+嵌套callout)、Process.PluginRequest(Map构造)/PluginResult(Map或单值构造)/PluginDescribeResult(InputParameter+OutputParameter/11种ParameterType枚举)、Flow↔Apex类型转换、Lead转换完整示例(8输入3输出/Database.convertLead/测试类5场景)、Formula Evaluation(FormulaBuilder.withType/global类/Address+Location+URL+UUID/多态关系/3900字符限制/Formula.recalculateFormulas)。...

📅 2026/7/16 ✍️ ponybai 🏷️ apex, salesforce

Flow 与 Formula Evaluation in Apex

Flow与Formula

Flow Builder 让管理员构建自动化业务流程的应用。Apex 通过 Flow.Interview 类、@InvocableMethod/@InvocableVariable 注解、Process.Plugin 接口和 Formula Evaluation 等多种方式与 Flow 集成。

使用 Flow.Interview 获取 Flow 变量

Flow.Interview

Flow.Interview Apex 类提供 getVariableValue 方法,用于检索嵌入在 Visualforce 页面中的 Flow 或通过子 Flow 元素调用的单独 Flow 中的变量。典型应用:从嵌套子 Flow 中获取面包屑导航信息。

public class SampleController {
    public Flow.Interview.Flow_Template_Gallery myFlow { get; set; }
    public String getBreadCrumb() {
        String aBreadCrumb;
        if (myFlow == null) { return 'Home'; }
        else aBreadCrumb = (String) myFlow.getVariableValue('vaBreadCrumb');
        return (aBreadCrumb == null ? 'Home' : aBreadCrumb);
    }
}

从可调用操作进行 Callout

Callout

屏幕 Flow中作为可调用操作运行并需 callout 外部系统时,使用 callout=true 修饰符。当三个条件全部满足时(callout=true + Flow 的 Transaction Control 设为让 Flow 决定 + 当前事务有未提交工作),Flow提交当前事务并启动新事务安全调用外部系统。callout=false 或非屏幕 Flow 或无未提交工作时直接在当前事务中执行。

InvocableActionExtension:扩展 Flow Builder

InvocableActionExtension

使用 .invocableactionextension-meta.xml 元数据文件简化 Apex 可调用操作在 Flow Builder 中的配置。文件命名:ClassName.invocableactionextension-meta.xml——放在 invocableactionextensions 目录中。支持功能:控制输入参数显示顺序(必须为所有参数定义 Order)、将参数组织到可折叠分组(Group 属性)、提供静态/动态选择列表值、添加自定义头部(Lightning Web Component)、创建部分自定义属性编辑器(Partial CPE——仅自定义特定参数,其他使用标准编辑器)。

静态与动态选择列表

选择列表

静态选择列表:使用 ProvidedValuesList 标准附加属性——逗号分隔的值列表,可选管道符分隔的显示标签:hotel|Hotel Reservation, flight|Flight Booking。每个输入参数最多 500 个选择列表值。

动态选择列表:创建扩展 VisualEditor.DynamicPicklist 的 Apex 类——重写 getValues()(返回 DynamicPicklistRows)和 getDefaultValue()(返回 DataRow)。在元数据文件中使用 apex://ClassName URI 格式引用。注意:动态选择列表逻辑在用户配置操作时运行——高效代码防止超时。

public class BookingTypeDynamicPicklist extends VisualEditor.DynamicPicklist {
    public override VisualEditor.DataRow getDefaultValue() {
        return new VisualEditor.DataRow('hotel', 'Hotel Reservation');
    }
    public override VisualEditor.DynamicPicklistRows getValues() {
        VisualEditor.DynamicPicklistRows values = new VisualEditor.DynamicPicklistRows();
        for (BookingType__mdt type : [SELECT Value__c, Label__c FROM BookingType__mdt]) {
            values.addRow(new VisualEditor.DataRow(type.Value__c, type.Label__c));
        }
        return values;
    }
}

自定义头部与部分 CPE

头部与CPE

自定义头部:创建 Lightning Web Component(JS + HTML),在元数据文件中使用 ActionDefinition 目标类型和 CustomHeaderLwcName 属性引用 c:componentName——显示在 Flow Builder 属性面板顶部。

部分自定义属性编辑器(Partial CPE):为特定输入参数创建 LWC——主参数使用 CpeName 属性关联,关联参数使用 ConfiguredBy 属性链接到主参数名。添加新参数时无需更新 CPE 代码——自动使用标准属性编辑器。主参数的 Order 属性决定 CPE 在面板中的位置。每个参数只能属于一个 Partial CPE。

Process.Plugin 接口:概述与实现

Process.Plugin

强烈推荐使用 @InvocableMethod 注解替代 Process.Plugin 接口!接口不支持 Blob/Collection/sObject 类型和批量操作;仅能从 Flow 引用。注解支持所有数据类型和批量操作——可从 Flow、Process 和 REST API 调用。Legacy Apex 操作不支持 Flow Builder 自动布局——仅可在自由形式模式添加。

实现 Process.Plugin 接口需两个方法:describe() 返回 Process.PluginDescribeResult(描述输入/输出参数)和 invoke(Process.PluginRequest) 返回 Process.PluginResult(主要处理逻辑)。不支持的函数:查询、数据修改、邮件、Apex 嵌套 callout。

global class flowChat implements Process.Plugin {
    global Process.PluginResult invoke(Process.PluginRequest request) {
        String subject = (String) request.inputParameters.get('subject');
        FeedItem fItem = new FeedItem();
        fItem.ParentId = UserInfo.getUserId();
        fItem.Body = 'Flow Update: ' + subject;
        insert fItem;
        return new Process.PluginResult(new Map<String, Object>());
    }
    global Process.PluginDescribeResult describe() {
        Process.PluginDescribeResult result = new Process.PluginDescribeResult();
        result.Name = 'flowchatplugin';
        result.Tag = 'chat';
        result.inputParameters = new List<Process.PluginDescribeResult.InputParameter>{
            new Process.PluginDescribeResult.InputParameter('subject',
                Process.PluginDescribeResult.ParameterType.STRING, true)
        };
        return result;
    }
}

Process.Plugin:输入输出参数与类型

参数类型

Process.PluginRequest:构造函数 Process.PluginRequest(Map<String, Object>)——传递输入参数。通过 request.inputParameters.get('paramName') 获取。

Process.PluginResult:两种构造方式——Process.PluginResult(Map<String, Object>)(多个结果)或 Process.PluginResult(String, Object)(单个结果)。

Process.PluginDescribeResult:InputParameter 构造函数——(Name, OptionalDescription, ParameterType.Enum, Boolean_required);OutputParameter——(Name, OptionalDescription, ParameterType.Enum)。支持的 ParameterType:BOOLEAN/DATE/DATETIME/DECIMAL/DOUBLE/FLOAT/ID/INTEGER/LONG/STRING/TIME。

Flow 到 Apex 数据类型转换:Number→Decimal、DateTime/Date→Datetime/Date、Boolean+1/0→Boolean、Text→String。

Process.Plugin:Lead 转换示例

Lead示例

完整的 Lead 转换插件实现:定义 8 个输入参数(LeadID 必填、AccountID/ContactID/ConvertedStatus/OpportunityName/OverwriteLeadSource/CreateOpportunity/SendEmailToOwner)和 3 个输出参数(AccountID/ContactID/OpportunityID)。在 invoke 中调用 Database.convertLead 执行转换——测试类覆盖基本转换/带账户转换/多账户转换/错误测试/describe 测试。

Formula Evaluation in Apex

Formula

Formula evaluation 避免不必要的 DML 语句重新计算公式字段值、评估动态公式表达式。支持 sObject 和 Apex 对象作为上下文对象——FormulaBuilder.withType() 使用的 Apex 类必须为 global 且引用的字段/属性/方法也须为 global。

支持特性:引用 Apex 类型(Address/Location/URL/UUID 系统类型)、标准/自定义查找字段、多态关系字段、toString() 返回值。公式长度限制 3,900 字符(不受编译大小限制)。可用函数与验证规则中相同。如需数据库往返计算公式字段使用 Formula.recalculateFormulas()

从 Flow Builder 集成到 Process.Plugin 接口和 Formula Evaluation,Apex 提供了丰富的工具将自定义逻辑嵌入声明式自动化流程中。