对业务流程建模
发布日期: 2017年1月
适用于: Dynamics 365 (online),Dynamics 365 (on-premises),Dynamics CRM 2016,Dynamics CRM Online
通过业务流程流,可以创建更高效、更简化的销售、服务和其他业务流程。 采用高性能流程可帮助您提高胜算,提高客户满意度,增加您的收入。
业务流程流通过在实体窗体顶部放置特殊控件,创建业务流程的可视化。 用户可在引导下完成销售、营销或服务流程的各个阶段,直到完成。 每个流程支持多个阶段和步骤。 您可以添加或删除步骤,各个阶段顺序,或者向业务流程流添加新实体。
通过适用于 Dynamics 365 的 2016 年 12 月更新(联机和本地),可将不同业务流程定义与不同角色关联,并且可以同时运行针对同一条实体记录的多个实例。 用户可以在并行业务流程实例之间切换,并在流程的当前阶段恢复工作。 可使用新的拖放可视流程设计器,通过 Dynamics 365 中直观的图形界面创建流程(如业务流程和任务流),以及业务规则。
有关流程的详细信息,请参阅 TechNet:业务流程。
本主题内容
服务器端对业务流程的可编程性支持
客户端对业务流程的可编程性支持
流程、阶段和步骤的最大数量
服务器端对业务流程的可编程性支持
业务流程定义存储在 Workflow 实体中。 业务流程是流程的类别之一。 其他类别包括操作、工作流和对话。 有关详细信息,请参阅Dynamics 365 流程类别。 自定义实体和具有更新 UI 窗体的实体可以参与业务流程。 更新的 UI 实体的 IsAIRUpdated 属性设置为 true。 若要为业务流程流启用实体,请将 IsBusinessProcessEnabled 属性设置为 true。
重要
为业务流程流启用实体是单向过程。 该过程不能逆转。
定义业务流程
激活业务流程
管理业务流程的安全性
管理业务流程实例
创建实体记录时应用业务流程
定义业务流程
可使用 Dynamics 365 中新增的业务流程可视设计器定义业务流程。Workflow 实体存储业务流程定义,并且必须在 Workflow 实体记录中为业务流程指定以下属性值:name、category、businessprocesstype、primaryentity、uniquename 和 xaml。 有关这些属性的信息,请参阅 workflow EntityType。 默认情况下,业务流程记录在 Draft 阶段创建。
激活业务流程
使用流程流之前,必须激活它。 若要激活它,您必须具有 Workflow 实体的 prvActivateBusinessProcessFlow 权限。 使用 UpdateRequest 消息可将 Workflow 实体记录的状态设置为 Activated。详细信息:使用更新执行专业化操作
一旦您激活了业务流程定义(通过更改相应 Workflow 实体记录的状态),将创建具有以下名称的自定义实体以存储激活的业务流程实例:"<activesolutionprefix>_<uniquename>"。
例如,如果您指定的业务流程定义唯一名称为 "myuniquebpf1",并且您在使用您的有效解决方案的默认发布商,则为存储流程实例创建的自定义实体的名称将为 "new_myuniquebpf1"。
如果业务流程定义没有可用的 uniquename 值,例如,业务流程是作为早期版本中的解决方案的一部分导入的,则自定义实体的默认名称将为 "<activesolutionprefix>_bpf_<GUID_BPF_Definition>:
重要
Dynamics 365 中提供的示例业务流程记录使用系统实体存储相应的业务流程实例记录。 其中的一些示例业务流程实体记录为 opportunitysalesprocess EntityType 和 leadtoopportunitysalesprocess EntityType。
但是,您创建的所有新业务流程都将使用自定义实体存储其实例记录,如前面所述。
管理业务流程的安全性
激活业务流程时自动创建来存储业务流程实例的自定义实体遵守标准安全模型,正如 Customer Engagement 中的其他任何自定义实体。 这意味着为这些实体授予的权限定义业务流程的用户的运行时权限。
自定义业务流程实体的作用范围为组织。 此实体的常规创建、检索、更新和删除权限定义用户根据为其分派的角色拥有的权限。 默认情况下,创建业务流程自定义实体时,仅为系统管理员和系统定制员授予其访问权限,而您必须根据需要为其他安全角色明确授予此自定义实体的权限。
管理业务流程实例
激活业务流程定义时自动创建的自定义实体存储该业务流程定义的所有流程实例。 自定义实体支持使用 Web API 和 CRM 2011 终结点以编程方式创建和管理记录(流程实例)。 例如,如果自定义实体的名称为 "new_myuniquebpf1",则您可以使用下面的 Web API 查询检索自定义实体中的所有记录(流程实例):
[组织 URI]/api/data/v8.2/new_myuniquebpf1s
流程实例可以为以下状态之一:Active、Finished 或 Aborted。
重要
此部分提供有关以编程方式管理各种业务流程方案的信息,如切换业务流程、检索流程实例以查找实体记录、检索活动路径和活动阶段以查找流程实例,以及转到下一阶段或上一阶段。 必须按照此部分中的说明,将消息和相应业务流程实体用于以编程方式管理和自动化业务流程。
处理为业务流程启用的实体的流程相关属性(如 ProcessId、StageId 和 TraversedPath)不保证业务流程状态一致,因此不是支持的方案。 唯一例外是,创建实体记录时以编程方式修改 ProcessId 属性,以便替代为新记录默认应用业务流程。 更多信息:创建实体记录时应用业务流程
可使用 SetProcess Action 或 SetProcessRequest 消息将其他业务流程设置为目标实体记录的活动流程实例。 活动流程实例是实体记录的 UI 上的可见流程实例。 如果没有指定的业务流程定义的任何活动流程实例,将创建一个新的业务流程实例,并将其设置为实体记录的活动实例。 如果有一个业务流程定义的流程实例,将把该流程实例设置为实体记录的活动流程实例。 如果要将特定流程实例设置为实体记录的活动流程实例,可使用 NewProcessInstance 属性指定实例。
以编程方式设置活动流程与在 UI 中切换到实体记录的其他流程实例相同。 由于每个业务流程实例都维持自己的阶段和步骤进度信息,所以切换到其他业务流程实例不会导致您丢失进度信息,并且您将从上次的同一个点恢复。
以下示例代码演示如何切换到实体记录的其他业务流程:
SetProcessRequest setProcReq = new SetProcessRequest
{
Target = new EntityReference(Opportunity.EntityLogicalName, _opportunityId),
NewProcess = new EntityReference(Workflow.EntityLogicalName, _bpfId)
};
SetProcessResponse setProcResp = (SetProcessResponse)_serviceProxy.Execute(setProcReq);
在上面的代码示例中,_bpfId 变量表示要切换到的业务流程定义的 ID,可以通过查询 Workflow 实体检索所需业务流程定义的 ID。 以下示例代码演示如何通过查询 Workflow 实体检索示例“商机销售流程”业务流程定义的 ID:
QueryExpression opportunityBpfQuery = new QueryExpression
{
EntityName = "workflow",
ColumnSet = new ColumnSet("name"),
Criteria = new FilterExpression
{
Conditions =
{
new ConditionExpression
{
AttributeName = "uniquename",
Operator = ConditionOperator.Equal,
Values = { "opportunitysalesprocess" }
}
}
}
};
Workflow retrievedBPF = (Workflow)_serviceProxy.RetrieveMultiple(opportunityBpfQuery).Entities[0];
_bpfId = retrievedBPF.Id;
有关完整示例,请参阅 示例:使用业务流程
可使用 RetrieveProcessInstances Function 或 RetrieveProcessInstancesRequest 消息检索所有业务流程定义中某个实体记录的所有业务流程实例。 为某个实体返回的业务流程实例基于该实例的 modifiedon 属性排序。 例如,最近修改的业务流程实例将为返回的集合中的第一条记录。 最近修改的业务流程实例是 UI 中实体记录的活动实例。
以下示例代码演示如何检索实体记录的业务流程实例,然后列出与该实体记录关联的流程实例:
RetrieveProcessInstancesRequest procOpp2Req = new RetrieveProcessInstancesRequest
{
EntityId = _opportunityId,
EntityLogicalName = Opportunity.EntityLogicalName
};
RetrieveProcessInstancesResponse procOpp2Resp = (RetrieveProcessInstancesResponse)_serviceProxy.Execute(procOpp2Req);
// Declare variables to store values returned in response
int processCount = procOpp2Resp.Processes.Entities.Count;
var activeProcessInstance = procOpp2Resp.Processes.Entities[0]; // First record is the active process instance
_processOpp2Id = activeProcessInstance.Id; // Id of the active process instance, which will be used
// later to retrieve the active path of the process instance
if (processCount > 0)
{
// Display the count of process instances concurrently associated with the opportunity record
Console.WriteLine("\nCount of process instances for the opportunity record: {0}", processCount);
// Display all the process instances associated with the opportunity record
// Demonstrates that multiple processes can run concurrently against the same record
Console.WriteLine("\nProcess instances associated with the opportunity record:");
for (int i = 0; i<processCount; i++)
{
Console.WriteLine("\t{0}", procOpp2Resp.Processes.Entities[i].Attributes["name"]);
}
}
为实体记录返回的业务流程实例记录也将活动阶段的 ID 存储在 processstageid 属性中,可使用该 ID 查找活动阶段,然后移到上一阶段或下一阶段。 为此,首先需要使用 RetrieveActivePath Function 或 RetrieveActivePathRequest 找到业务流程实例的活动部分和流程实例中的可用阶段。 以下示例代码演示如何在业务流程实例的活动路径中检索流程阶段和实例的活动阶段。
// Retrieve the active stage ID of in the active process instance
_activeStageId = new Guid(activeProcessInstance.Attributes["processstageid"].ToString());
// Retrieve the process stages in the active path of the current process instance
RetrieveActivePathRequest pathReq = new RetrieveActivePathRequest
{
ProcessInstanceId = _processOpp2Id
};
RetrieveActivePathResponse pathResp = (RetrieveActivePathResponse)_serviceProxy.Execute(pathReq);
Console.WriteLine("\nRetrieved stages in the active path of the process instance:");
for (int i = 0; i <pathResp.ProcessStages.Entities.Count; i++)
{
Console.WriteLine("\tStage {0}: {1} (StageId: {2})", i + 1,
pathResp.ProcessStages.Entities[i].Attributes["stagename"],
pathResp.ProcessStages.Entities[i].Attributes["processstageid"]);
// Retrieve the active stage name and active stage position based on the activeStageId for the process instance
if (pathResp.ProcessStages.Entities[i].Attributes["processstageid"].ToString() == _activeStageId.ToString())
{
_activeStageName = pathResp.ProcessStages.Entities[i].Attributes["stagename"].ToString();
_activeStagePosition = i;
}
}
// Display the active stage name and Id
Console.WriteLine("\nActive stage for the process instance: {0} (StageID: {1})", _activeStageName, _activeStageId);
获得业务流程实例的活动阶段和活动路径信息之后,可使用这些信息移到活动路径中的上一阶段或下一阶段。 阶段的前进导航必须按顺序执行,即,只应前进到活动路径中的下一阶段。 以下示例代码演示如何移到业务流程实例的下一阶段:
// Retrieve the stage ID of the next stage that you want to set as active
_activeStageId = (Guid)pathResp.ProcessStages.Entities[_activeStagePosition + 1].Attributes["processstageid"];
// Retrieve the process instance record to update its active stage
ColumnSet cols1 = new ColumnSet();
cols1.AddColumn("activestageid");
Entity retrievedProcessInstance = _serviceProxy.Retrieve("opportunitysalesprocess", _processOpp2Id, cols1);
// Set the next stage as the active stage
retrievedProcessInstance["activestageid"] = new EntityReference(ProcessStage.EntityLogicalName, _activeStageId);
_serviceProxy.Update(retrievedProcessInstance);
有关完整示例,请参阅示例:使用业务流程。
创建实体记录时应用业务流程
此部分提供有关将业务流程自动应用于 Customer Engagement 中新建的实体记录的默认行为的信息,以及有关如何将其替代来为新实体记录应用您选择的业务流程的信息。
默认情况下,对于为其定义了多个业务流程的实体,系统使用以下多步骤逻辑为新实体记录应用业务流程:
根据业务流程定义记录的 Workflow.PrimaryEntity 属性识别适用于新实体记录的所有业务流程。
识别当前用户可访问的业务流程定义。 有关如何确定和管理业务流程的访问权限的信息,请参阅本主题中前面的管理业务流程的安全性。
系统中的所有业务流程定义均遵守按实体的全局顺序。 业务流程的顺序存储在 Workflow.ProcessOrder 属性中。 将根据此顺序存储实体的业务流程定义,并选择顺序值最小的定义。
最后,如果实体记录是从业务应用程序(应用程序模块)创建的,则选择要自动应用于新实体记录的业务流程时,将多应用一级筛选。 在应用程序中工作时,用户只能访问根据为其分派的业务应用程序安全角色可访问的相关实体、业务流程、视图和窗体。
如果业务应用程序中不包含任何业务流程,则按照截止步骤 3 的说明应用业务流程。
如果业务应用程序有一个或多个业务流程,则仅应用该应用程序中存在的业务流程。 在这种情况下,用户在业务应用程序上下文中工作时,将把筛选步骤 3 中的业务流程列表进一步筛选到属于业务应用程序且在应用程序模块中存在的业务流程,并根据流程顺序排序。
如果业务应用程序中没有实体的可用业务流程或用户可访问的业务流程,则不为新实体记录应用业务流程。
可替代将业务流程自动应用于新实体记录这一默认行为。 方法是在新建实体记录时,将实体的 ProcessId 属性设置为以下值之一:
设置为 Guid.Empty 将跳过为新实体记录设置业务流程。 如果在批量创建实体记录,但不希望为其应用业务流程,则可能需要这样做。
将其设置为特定业务流程实体(作为实体引用)。 在这种情况下,系统将应用指定的业务流程,而不是应用默认逻辑。
如果新建实体记录时不为 ProcessId 属性设置值,系统将按照前面的说明应用默认逻辑。
备注
仅支持以编程方式替代将业务流程自动应用于新实体记录这一默认行为。 不能使用 UI 替代。
客户端对业务流程的可编程性支持
通过 Dynamics 365,您可以使用客户端对象与您窗体脚本中的业务流程进行交互。 只要为记录应用流程,或状态更改为 Active、Finished 或 Aborted,业务流程都将触发客户端事件。详细信息:编写业务流程脚本
流程、阶段和步骤的最大数量
每个实体的最大激活业务流程流数量默认值为 10。 可以使用 Organization.MaximumActiveBusinessProcessFlowsAllowedPerEntity 属性指定其他值。 但是,如果该值大于 10,当您进行流程切换或打开某个有分派业务流程的记录的时候,会发现系统性能下降。 如果该流程涉及到多个实体,这种现象会更明显。
不能自定义下列设置:
每个实体的流程的最大阶段数量为 30。
每个阶段的最大步骤数量为 30。
可参与流程流的最大实体数量为 5。
另请参阅
视频:Microsoft Dynamics CRM 2015 中的业务流程
Dynamics 365 流程类别
使用Dynamics 365 流程自动化业务流程
创建实时工作流
Microsoft Dynamics CRM 2013 的流程启用
帮助和培训:创建新的业务流程
帮助和培训:为业务流程分派安全角色
帮助和培训:通过有关流程的操作来引导员工应对常见任务
帮助和培训:添加随时可用的业务流程
TechNet:业务流程
编写业务流程脚本
Microsoft Dynamics 365
© 2017 Microsoft。 保留所有权利。 版权