学习目标
在本项目中,你将:
- 在 Trailhead Playground 中安装一个包。
- 创建 Apex 类和方法。
- 创建 trigger。
- 自动化创建新 sObject 的过程。
BOTanicals 简介
BOTanicals 是一家制造机器人花卉的公司——传统花卉的环保、低过敏性替代品。这些花会根据心情变色、夜间发光、永不凋谢,由一个连接物联网的先进 Salesforce org 控制。你正赶上 BOTanical Bonus Bouquet 促销活动。在本项目中,我们自动化一个业务流程来支持这个促销——具体来说,编写代码让每次订单被激活(activated)时自动添加一个奖励花束。
注意:本项目处理的业务流程其实可以轻松用点击式管理工具自动化。在做步骤时,思考代码里发生的事情与你在 Salesforce UI 中做同样任务之间的联系。
BOTanical 对象模型
先看对象模型。本项目涉及几个熟悉的标准对象: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
本项目需要创建全新的 Trailhead Playground。滚动到页面底部,点击 Launch 旁的下拉箭头,选 Create a Trailhead Playground,通常需要 3–4 分钟。注意:必须是全新 Playground,使用现有 org 可能导致挑战无法完成。
启动 Playground 并安装包
- 点击页面底部 Launch 打开 Playground,点击 Install a Package 选项卡。
- 粘贴
04tbm0000009S0H。 - 点击 Install。
- 选择 Install for Admins Only,点击 Install。
包安装完成后会看到确认页,并收到一封邮件。该包提供 BOTanicals 应用、预构建对象和示例数据。
更新默认 Order 页面布局
- Setup → Object Manager → Order → Page Layouts。
- 点击 Page Layout Assignment → Edit Assignment。
- 点击 Page Layout 列头全选所有 profile。
- Page Layout to Use 选 Order Layout (BOTanicals)。
- 确认 Page Layout 列现在每个 profile 都列出 Order Layout(BOTanicals)。
- 点击 Save。
固定列表视图并加载示例数据
从 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 区块就有了数据。
创建自动化 — 类和方法
本单元创建 Apex 类和方法,检查所有订单状态——当订单被激活时自动添加奖励花束。
创建类和方法
- 点击 Setup,选择 Developer Console。
- 点击 File | New | Apex Class,命名
OrderItemUtility,OK。 - 替换现有代码为:
//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
- 点击 File | Save 保存类。
代码中 // 开头的是注释,描述代码块的用途。这个方法 addBonusBouquet 接收来自 trigger 的订单列表(后续创建),检查每个订单状态。
添加创建新花束的自动化
接下来给类添加自动化代码(粘贴时注意删除空行上多余的注释 //)。
- 在
//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 数据
本单元用 SOQL 查询奖励花束产品,用 DML 插入新的 OrderItem 记录——在 Apex 中读写 Salesforce 数据。
用 SOQL 从 Salesforce 获取数据
在 //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 发送数据
DML 是向 Salesforce org 发送数据的数据操作语言——即 Insert(创建)、Update(编辑)、Delete(删除)。我们创建了一个或多个免费花束并加入了列表,但它们只存在于 Apex 代码中,还没保存到 org。
- 在
//TO DO 3.2下粘贴insert newBouquets; - 在
//TO DO 2.4下,去掉//PricebookEntryId = entry.id,一行的注释符//。 - 在
//TO DO 3.3下粘贴} //end if - 保存类。
现在整个 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
本单元创建 Apex trigger 调用 addBonusBouquet 方法,端到端测试完整自动化,并激活订单验证奖励花束出现。
创建 Trigger
先关闭一个会影响此 trigger 的 Release Update:Setup → Quick Find 输入 Release Updates → 找到 Enable New Order Save Behavior tile → Get Started → Disable Test Run。
- 在 Developer Console 点击 File | New | Apex Trigger。
- Name=
orderTrigger,sObject=Order,Submit。 - 替换代码为:
trigger orderTrigger on Order(before update) {
OrderItemUtility.addBonusBouquet(Trigger.new);
}
- 保存 trigger。
trigger 在订单更新(before update)时运行 OrderItemUtility 类的 addBonusBouquet 方法,把 Trigger.new(正在更新的订单列表)传给它。你已经创建了类、方法和 trigger 来自动化创建新的 order item。
试一试
- 在 BOTanicals 应用 Orders 页找到 All Orders 列表视图,点击关联 Alsarraf Enterprises 的订单号。
- 在 Order Products 相关列表点击 Add Products。
- 确认选中 Standard Price Book,点击 Save。
- 在 Search Products 输入
BOT回车,勾选一个产品,Next。 - 输入数量,Save。
订单应为 Draft 状态,包含 Alsarraf Enterprises 账户和一个订单产品。
激活订单
- 在 Path 点击 Activated,再点 Mark as Current Status。
- 你会看到订单多了一个单价 $0 的新条目(若没看到请刷新)。
- 在 Order Products 相关列表点击 View All,可以看到 FREE Bouquet 已自动添加到订单。
恭喜!你编写了一个业务流程,在订单激活时自动添加奖励 orderItem。背后的流程:订单更新 → trigger 触发 → addBonusBouquet 运行 → SOQL 找到产品 → DML 插入 OrderItem → 奖励花束出现。
















