CRM机会创建后插件开发求助:获取数据并保存接口返回ID
搞定CRM Post Operation Opportunity Create Plugin的两个核心需求
嘿,我来帮你解决剩下的两个关键问题:获取潜在客户名称,以及把Web服务返回的ID存到商机备注里。结合你已经完成的Web服务调用逻辑,咱们一步步来实现:
1. 获取你需要的潜在客户名称
首先得明确:你说的“潜在客户”是指商机(Opportunity)自身的名称,还是和商机关联的潜在客户(Lead)名称?两种情况的实现方式略有不同,我都给你列出来:
方式一:直接获取商机自身的名称
在Post Operation阶段,插件上下文的OutputParameters["Target"]里已经是创建完成的完整商机实体,直接读取name字段就行:
// 从服务提供者获取插件上下文 IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); // 拿到创建好的商机实体 Entity opportunity = (Entity)context.OutputParameters["Target"]; // 获取商机名称 string oppName = opportunity.GetAttributeValue<string>("name");
方式二:获取关联的潜在客户(Lead)名称
如果你的商机是从潜在客户转化来的,关联了Lead记录,那需要先读取商机的leadid关联字段,再查询Lead的名称:
// 接上面的代码,先判断商机是否关联了Lead if (opportunity.Contains("leadid")) { EntityReference leadRef = opportunity.GetAttributeValue<EntityReference>("leadid"); // 获取组织服务实例 IOrganizationService service = (IOrganizationService)serviceProvider.GetService(typeof(IOrganizationService)); // 查询Lead的全名(fullname字段) Entity lead = service.Retrieve(leadRef.LogicalName, leadRef.Id, new ColumnSet("fullname")); string leadName = lead.GetAttributeValue<string>("fullname"); // 现在leadName就是你要的潜在客户名称啦 }
小贴士:如果商机关联的是联系人(Contact),把
leadid换成contactid,fullname字段是通用的,不用改。
2. 把Web服务返回的ID保存到商机备注里
CRM里的“备注”对应的是annotation实体,咱们只需要创建一条新的Annotation记录,关联到当前商机,再把返回的ID填进去就行:
具体代码实现
假设你的Web服务返回的ID是string externalDbId = "WS-12345";(替换成你实际的返回值),代码如下:
// 接上面的service实例 Entity annotation = new Entity("annotation"); // 设置备注关联的商机 annotation["objectid"] = new EntityReference(opportunity.LogicalName, opportunity.Id); annotation["objecttypecode"] = opportunity.LogicalName; // 设置备注的标题和内容 annotation["subject"] = "自有数据库关联ID"; annotation["notetext"] = $"Web服务返回的数据库ID:{externalDbId}"; // 把备注保存到CRM service.Create(annotation);
备选方案:保存到商机的自定义字段
如果你不想用备注,而是想把ID存到商机的自定义字段里(比如你新建了new_externaldatabaseid字段),可以直接更新商机实体:
Entity updateOpportunity = new Entity("opportunity", opportunity.Id); updateOpportunity["new_externaldatabaseid"] = externalDbId; service.Update(updateOpportunity);
整合到你的现有插件里
把上面的代码和你已经写好的Web服务调用逻辑整合起来,完整流程就是:
- 从插件上下文获取创建完成的商机实体
- 按需获取商机名称/关联潜在客户名称
- 调用Web服务把名称插入自有数据库,拿到返回的ID
- 创建备注(或更新自定义字段)保存这个ID
测试时要注意的点
- 确保插件的执行账号有足够权限:读取Lead/Contact、创建Annotation、更新Opportunity的权限都得有
- 因为是Post Operation阶段,商机已经完全创建,不用担心拿不到完整数据
- 调试的时候可以开启CRM的插件追踪,方便排查报错
内容的提问来源于stack exchange,提问作者user3063952




