用 Apex 自动化业务流程

通过为 BOTanicals 公司自动化奖励花束促销,掌握 Apex 自动化:创建 Apex 类和方法、用 SOQL 查询数据、用 DML 插入记录、编写 trigger 并在订单激活时自动添加奖励产品。...

📅 2026/10/4 ✍️ ponybai 🏷️ salesforce, developer, apex, headless

学习目标

slide_2

在本项目中,你将:

  • 在 Trailhead Playground 中安装一个包。
  • 创建 Apex 类和方法。
  • 创建 trigger。
  • 自动化创建新 sObject 的过程。

BOTanicals 简介

slide_3

BOTanicals 是一家制造机器人花卉的公司——传统花卉的环保、低过敏性替代品。这些花会根据心情变色、夜间发光、永不凋谢,由一个连接物联网的先进 Salesforce org 控制。你正赶上 BOTanical Bonus Bouquet 促销活动。在本项目中,我们自动化一个业务流程来支持这个促销——具体来说,编写代码让每次订单被激活(activated)时自动添加一个奖励花束。

注意:本项目处理的业务流程其实可以轻松用点击式管理工具自动化。在做步骤时,思考代码里发生的事情与你在 Salesforce UI 中做同样任务之间的联系。

BOTanical 对象模型

slide_4

先看对象模型。本项目涉及几个熟悉的标准对象:Account、Order、OrderItem 和 Product,OrderItem 和 Product 对象里还有一些自定义字段(如 numberOfFlowers__c、percentOfOpening__c、fragrance__c、grow__c、colorTheme__c)。

关系:每个 Order 属于单个 Account;每个 OrderItem 属于单个 Order 和单个 Product。我们的大部分编码都围绕 Order 和 OrderItem 标准对象展开。

创建新的 Trailhead Playground

slide_5

本项目需要创建全新的 Trailhead Playground。滚动到页面底部,点击 Launch 旁的下拉箭头,选 Create a Trailhead Playground,通常需要 3–4 分钟。注意:必须是全新 Playground,使用现有 org 可能导致挑战无法完成。

启动 Playground 并安装包

slide_6
  1. 点击页面底部 Launch 打开 Playground,点击 Install a Package 选项卡。
  2. 粘贴 04tbm0000009S0H。
  3. 点击 Install。
  4. 选择 Install for Admins Only,点击 Install。

包安装完成后会看到确认页,并收到一封邮件。该包提供 BOTanicals 应用、预构建对象和示例数据。

更新默认 Order 页面布局

slide_7
  1. Setup → Object Manager → Order → Page Layouts。
  2. 点击 Page Layout Assignment → Edit Assignment。
  3. 点击 Page Layout 列头全选所有 profile。
  4. Page Layout to Use 选 Order Layout (BOTanicals)。
  1. 确认 Page Layout 列现在每个 profile 都列出 Order Layout(BOTanicals)。
  2. 点击 Save。

固定列表视图并加载示例数据

slide_8

从 App Launcher 打开 BOTanicals,在 Accounts、Orders、Products 分别固定 All Accounts、All Orders、All Products 列表视图(点击 Recently Viewed 选对应视图,再点 pin 图标)。

加载示例数据:Setup → Quick Find 输入 Flows → Process Automation 下选 Flows → 点击 AddSampleBOTanicalsData → Run。看到 YOUR FLOW FINISHED 后关闭窗口,回到 BOTanicals 应用,Accounts、Orders、Products 区块就有了数据。

创建自动化 — 类和方法

slide_9

本单元创建 Apex 类和方法,检查所有订单状态——当订单被激活时自动添加奖励花束。

创建类和方法

slide_10
  1. 点击 Setup,选择 Developer Console。
  2. 点击 File | New | Apex Class,命名 OrderItemUtility,OK。
  3. 替换现有代码为:
//Create the class
public class OrderItemUtility {
    //Create the method that will add free bonus bouquet when order is activated
    public static void addBonusBouquet(List<Order> ordersFromTrigger) {
        //TO DO 3.1: Determine if we have a bonus product and get its ID to add to the order
            //TO DO 2.1: Create a list to store any new bouquets we'll insert later
            //TO DO 2.2: Loop over orders in ordersFromTrigger
                //TO DO 2.3: Verify the order status is 'Activated'
                    //TO DO 2.4: Create a new bouquet and set values
                    //TO DO 2.5: Add the freeBouquet sObject to your list
                //TO DO 2.6: Close the "if" and "for loop" sections
            //TO DO 3.2: Use DML to add the new list of newBouquets
        //TO DO 3.3: Close the if section
    } //end method
} //end class
  1. 点击 File | Save 保存类。

代码中 // 开头的是注释,描述代码块的用途。这个方法 addBonusBouquet 接收来自 trigger 的订单列表(后续创建),检查每个订单状态。

添加创建新花束的自动化

slide_11

接下来给类添加自动化代码(粘贴时注意删除空行上多余的注释 //)。

  • 在 //TO DO 2.1 下粘贴 List<OrderItem> newBouquets = new List<OrderItem>();
  • 在 //TO DO 2.2 下粘贴 for(Order currentOrder : ordersFromTrigger) {
  • 在 //TO DO 2.3 下粘贴 if(currentOrder.Status == 'Activated') {
  • 在 //TO DO 2.4 下创建 freeBouquet sObject:
    OrderItem freeBouquet = new OrderItem(
        OrderId = currentOrder.id,
        PricebookEntryId = entry.id,
        numberOfFlowers__c = 3,
        description = 'FREE Bouquet',
        Quantity = 1,
        colorTheme__c = 'Spectacular Sunset',
        percentOfOpening__c = 0,
        UnitPrice = 0.00
    );
  • 在 //TO DO 2.5 下粘贴 newBouquets.add(freeBouquet);
  • 在 //TO DO 2.6 下粘贴 } //end if 和 } //end for loop

保存类。下一步学习如何从 Salesforce 获取数据、向 Salesforce 发送数据,并创建 trigger。

在 Apex 代码中使用 Salesforce 数据

slide_12

本单元用 SOQL 查询奖励花束产品,用 DML 插入新的 OrderItem 记录——在 Apex 中读写 Salesforce 数据。

用 SOQL 从 Salesforce 获取数据

slide_13

在 //TO DO 3.1 下粘贴:

List<Product2> bonusProductList = [SELECT Id, ProductCode FROM Product2 WHERE ProductCode = 'BOT-BB-12'];
Product2 bonusProduct = new Product2();
if(bonusProductList.size() > 0) {
    bonusProduct = bonusProductList[0];
    List<PricebookEntry> entryList = [SELECT Id, Product2Id FROM PricebookEntry WHERE Product2Id = :bonusProduct.Id];
    PricebookEntry entry = new PricebookEntry();
    if(entryList.size() > 0) {
        entry = entryList[0];
    }

先用 SOQL 获取产品代码为 BOT-BB-12 的花束产品的 Id 和 ProductCode,存入 bonusProductList;再检查列表是否为空,若至少有一项,则定义 bonusProduct 并赋值为列表第一项(列表编号从 0 开始)。然后用第二个 SOQL 查询获取 bonusProduct 的 PricebookEntry,存入 entryList 并赋给 entry。

用 DML 向 Salesforce 发送数据

slide_14

DML 是向 Salesforce org 发送数据的数据操作语言——即 Insert(创建)、Update(编辑)、Delete(删除)。我们创建了一个或多个免费花束并加入了列表,但它们只存在于 Apex 代码中,还没保存到 org。

  1. 在 //TO DO 3.2 下粘贴 insert newBouquets;
  2. 在 //TO DO 2.4 下,去掉 //PricebookEntryId = entry.id, 一行的注释符 //。
  3. 在 //TO DO 3.3 下粘贴 } //end if
  4. 保存类。

现在整个 OrderItemUtility 类应该长这样:

public class OrderItemUtility {
    public static void addBonusBouquet(List<Order> ordersFromTrigger) {
        List<Product2> bonusProductList = [SELECT Id, ProductCode FROM Product2 WHERE ProductCode = 'BOT-BB-12'];
        Product2 bonusProduct = new Product2();
        if(bonusProductList.size() > 0) {
            bonusProduct = bonusProductList[0];
            List<PricebookEntry> entryList = [SELECT Id, Product2Id FROM PricebookEntry WHERE Product2Id = :bonusProduct.Id];
            PricebookEntry entry = new PricebookEntry();
            if(entryList.size() > 0) {
                entry = entryList[0];
            }
            List<OrderItem> newBouquets = new List<OrderItem>();
            for(Order currentOrder : ordersFromTrigger) {
                if(currentOrder.Status == 'Activated') {
                    OrderItem freeBouquet = new OrderItem(
                        OrderId = currentOrder.id,
                        PricebookEntryId = entry.id,
                        numberOfFlowers__c = 3,
                        description = 'FREE Bouquet',
                        Quantity = 1,
                        colorTheme__c = 'Spectacular Sunset',
                        percentOfOpening__c = 0,
                        UnitPrice = 0.00
                    );
                    newBouquets.add(freeBouquet);
                } //end if
            } //end for loop
            insert newBouquets;
        } //end if
    } //end method
} //end class

创建并测试 Trigger

slide_15

本单元创建 Apex trigger 调用 addBonusBouquet 方法,端到端测试完整自动化,并激活订单验证奖励花束出现。

创建 Trigger

slide_16

先关闭一个会影响此 trigger 的 Release Update:Setup → Quick Find 输入 Release Updates → 找到 Enable New Order Save Behavior tile → Get Started → Disable Test Run。

  1. 在 Developer Console 点击 File | New | Apex Trigger。
  2. Name=orderTrigger,sObject=Order,Submit。
  3. 替换代码为:
trigger orderTrigger on Order(before update) {
    OrderItemUtility.addBonusBouquet(Trigger.new);
}
  1. 保存 trigger。

trigger 在订单更新(before update)时运行 OrderItemUtility 类的 addBonusBouquet 方法,把 Trigger.new(正在更新的订单列表)传给它。你已经创建了类、方法和 trigger 来自动化创建新的 order item。

试一试

slide_17
  1. 在 BOTanicals 应用 Orders 页找到 All Orders 列表视图,点击关联 Alsarraf Enterprises 的订单号。
  2. 在 Order Products 相关列表点击 Add Products。
  3. 确认选中 Standard Price Book,点击 Save。
  4. 在 Search Products 输入 BOT 回车,勾选一个产品,Next。
  5. 输入数量,Save。

订单应为 Draft 状态,包含 Alsarraf Enterprises 账户和一个订单产品。

激活订单

slide_18
  1. 在 Path 点击 Activated,再点 Mark as Current Status。
  2. 你会看到订单多了一个单价 $0 的新条目(若没看到请刷新)。
  3. 在 Order Products 相关列表点击 View All,可以看到 FREE Bouquet 已自动添加到订单。

恭喜!你编写了一个业务流程,在订单激活时自动添加奖励 orderItem。背后的流程:订单更新 → trigger 触发 → addBonusBouquet 运行 → SOQL 找到产品 → DML 插入 OrderItem → 奖励花束出现。


文章来源:Trailhead - Use Apex to Automate Business Processes