塑造商務程序流程

 

發行︰ 2017年1月

適用於: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online

商務程序流程」(Business Process Flow) 可讓您建立更有效率且更流暢的銷售、服務及其他商務程序。 擁有高效率的程序將有助於提升成交機率、提高客戶滿意度,以及帶動營收。

商務程序流程會透過將特殊控制項放置在實體表單的頂端,建立商務程序的視覺效果。 使用者將經由引導進行各個不同階段的銷售、行銷或服務程序,直到完成。 每個程序都支援多個階段和步驟。 您可以新增或移除步驟、變更各階段的順序,或是新增實體至商務程序流程。

在 Dynamics 365 (Online 和內部部署) 的 2016 年 12 月更新 中,不同的商務程序流程定義可以與不同角色關聯,且執行個體可以對相同的實體記錄並行執行。 使用者可以在並行的商務程序執行個體之間切換,並且在程序中於目前階段恢復其工作。 新的視覺拖放處理設計師允許建立程序,例如商務程序流程和工作流程,以及商務規則,使用 Dynamics 365 中直覺的圖形介面。

如需程序的詳細資訊,請參閱 TechNet:商務程序流程

本主題內容

伺服器端對商務程序流程的程式設計功能支援

用戶端對商務程序流程的程式設計功能支援

程序、階段和步驟的數目上限。

伺服器端對商務程序流程的程式設計功能支援

商務程序流程定義儲存在 Workflow 實體中。 商務程序流程是程序的其中一個類別。 其他程序類別包括動作、工作流程和對話方塊。 如需詳細資訊,請參閱Dynamics 365 程序類別。 自訂實體和已更新 UI 表單的實體都可以參與商務程序流程。 已更新 UI 實體的 IsAIRUpdated 屬性會設定為 true。 若要啟用商務程序流程的實體,請將 IsBusinessProcessEnabled 屬性設定為 true

重要

啟用商務程序流程的實體是一個單向程序。 該程序無法反向。

  • 定義商務程序流程

  • 啟用商務程序流程

  • 管理商務程序流程安全性

  • 管理商務程序流程執行個體

  • 在建立實體記錄時套用商務程序流程

定義商務程序流程

使用 Dynamics 365 中新的視覺商務程序流程設計師定義商務程序流程。Workflow 實體會儲存商務程序流程定義,且下列屬性值必須在商務程序流程的 Workflow 實體記錄中指定:namecategorybusinessprocesstypeprimaryentityuniquenamexaml。 如需這些屬性的詳細資訊,請參閱 workflow EntityType。 根據預設,商務程序流程記錄是以 Draft 狀態建立。

啟用商務程序流程

使用程序流程之前,必須先將它啟用。 若要啟用,您必須具有 Workflow 實體的 prvActivateBusinessProcessFlow 權限。 使用 UpdateRequest 訊息將 Workflow 實體記錄的狀態設定為 Activated。其他資訊:使用 Update 執行特製化作業

一旦啟用商務程序流程定義 (變更對應 Workflow 實體記錄的狀態),具有下列名稱的自訂實體就會自動建立,以儲存啟用的商務程序流程執行個體:"<activesolutionprefix>_<uniquename>"。

例如,如果您指定商務程序流程定義的唯一名稱為 "myuniquebpf1",並針對使用中解決方案使用預設發行者,建立用來儲存程序執行個體的自訂實體名稱會是 "new_myuniquebpf1"。

如果 uniquename 值無法用於商務程序流程定義,例如,商務程序流程是從舊版解決方案中匯入,則自訂實體的預設名稱會是 "<activesolutionprefix>_bpf_<GUID_BPF_Definition>"

重要

範例商務程序流程記錄在 Dynamics 365 中提供,會使用系統實體儲存對應的商務程序流程執行個體記錄。 以下是範例商務程序流程實體記錄:opportunitysalesprocess EntityTypeleadtoopportunitysalesprocess EntityType

不過,您建立的任何新商務程序流程定義都會使用自訂實體來儲存其執行個體記錄,如前面所述。

管理商務程序流程安全性

啟用商務程序流程時為了存放商務程序流程執行個體而自動建立的自訂實體會遵循標準安全性模型,一如 Customer Engagement 中的任何其他自訂實體。 這意味著對這些實體授與的權限會定義商務程序流程使用者的執行階段權限。

自訂商務程序流程實體適用範圍包括整個組織。 此實體上的一般建立、擷取、更新及刪除權限定義了使用者根據其受指派角色所擁有的權限。 根據預設,建立商務程序流程自訂實體時,只有系統管理員及系統自訂員資訊安全角色被授與存取該實體的權限,您必須依需要將權限明確授與其他資訊安全角色的這個自訂實體。

管理商務程序流程執行個體

啟用商務程序流程定義時自動建立的自訂實體,會儲存商務程序流程定義的所有程序執行個體。 自訂實體支援程式化建立和管理記錄 (程序執行個體),使用 Web API 和 CRM 2011 端點。 例如,如果自訂實體的名稱是 "new_myuniquebpf1",您可以使用下列 Web API 查詢擷取自訂實體中的所有記錄 (程序執行個體):


[組織 URI]/api/data/v8.2/new_myuniquebpf1s

程序執行個體的狀態可以是下列其中一種:ActiveFinishedAborted

重要

本節提供以程式設計方式管理各種不同商務程序流程案例的資訊,例如切換商務程序、擷取實體記錄的程序執行個體、擷取程序執行個體的使用中路徑和使用中階段,以及移至下一個或上一個階段。 您必須使用本節中所述的訊息和適當的商務程序流程實體,才能以程式設計方式管理和自動化商務程序流程。

在針對商務程序流程啟用的實體上操作程序相關屬性 (例如 ProcessIdStageIdTraversedPath) 並不保證商務程序流程的一致性,也不是支援的案例。 此情況的唯一例外是,在建立實體記錄以將商務程序流程的預設應用程式覆寫至新記錄時,利用程式設計方式修改 ProcessId 屬性。 其他資訊:在建立實體記錄時套用商務程序流程

使用 SetProcess ActionSetProcessRequest 訊息設定另一個商務程序流程,做為目標實體記錄的使用中程序執行個體。 使用中程序執行個體可在實體記錄的 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 變數代表您要切換的目標商務程序流程定義的識別碼;您可以透過查詢 Workflow 實體的方式,擷取所需商務程序流程定義的識別碼。 下列範例程式碼示範如何透過查詢 Workflow 實體,擷取範例「商機銷售程序」商務程序流程定義的識別碼︰

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 FunctionRetrieveProcessInstancesRequest 訊息,跨所有商務程序定義擷取實體記錄的所有商務程序流程執行個體。 針對實體傳回的商務程序流程執行個體,會依執行個體的 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"]);
    }
}

針對實體記錄傳回的商務程序流程執行個體記錄也會儲存使用中階段的識別碼在 processstageid 屬性中,可用來尋找使用中階段,然後移至上一個或下一個階段。 若要這樣做,您必須先找到商務程序流程執行個體的使用中路徑,以及程序流程執行個體中可用的階段,使用 RetrieveActivePath FunctionRetrieveActivePathRequest。 下列範例程式碼示範如何擷取商務程序流程執行個體的使用中路徑中的程序階段,以及執行個體的使用中階段:

// 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 中已建立之新實體記錄的預設行為,以及如何覆寫該記錄以套用您為新的實體記錄所選擇的商務程序流程。

根據預設,對於已定義多個商務程序流程的實體,系統會使用下列多步驟邏輯,將商務程序流程套用至新實體記錄:

  1. 根據商務程序流程定義記錄的 Workflow.PrimaryEntity 屬性,識別所有適用於新實體記錄的商務程序流程。

  2. 識別目前使用者可以存取的商務程序流程定義。 如需有關如何決定和管理商務程序流程存取權的詳細資訊,請參閱本主題稍早的管理商務程序流程安全性。

  3. 系統中的所有商務程序流程定義受都限於每個實體的全域順序。 商務程序流程中的順序儲存在 Workflow.ProcessOrder 屬性中。 實體的商務程序流程定義是根據此順序進行排序,將會挑選順序值最小的定義。

  4. 最後,如果實體記錄是從商務應用程式 (應用程式模組) 中建立,就會多套用一層篩選來選擇要自動套用至新實體記錄的商務程序流程。 在應用程式中工作時,使用者只能存取他們因為指派給商務應用程式的資訊安全角色而可存取的相關實體、商務程序流程、檢視表和表單。

    • 如果商務應用程式不含任何商務程序流程,則會依照直到步驟 3 前所述的方式套用商務程序流程。

    • 如果商務應用程式有一個或多個商務程序流程,則只有應用程式中存在的商務程序流程才適用。 在這種情況下,當使用者在商務應用程式環境中工作時,會進一步將步驟 3 的商務程序流程清單篩選成屬於商務應用程式一部分、存在於應用程式模組內且依程序順序排序的商務程序流程。

    • 如果實體的商務應用程式沒有任何商務程序流程,或是有使用者可以存取的商務程序流程,則新的實體記錄不會套用任何商務程序流程。

您可以覆寫自動將商務程序流程套用至新實體記錄的預設行為。 若要這樣做,請在建立新的實體記錄時,將實體的 ProcessId 屬性設定為下列其中一個值:

  • 設定為 Guid.Empty 可略過設定新實體記錄的商務程序流程。 如果您要大量建立實體記錄,但不希望將商務程序流程套用至這些記錄時,您可能會想要這樣做。

  • 將其設定為特定商務程序流程實體 (做為實體參照)。 在這種情況下,系統將會套用指定的商務程序流程,而不是預設邏輯。

如果建立新的實體記錄時沒有設定 ProcessId 屬性的值,系統將會套用預設邏輯,如前面所述。

注意

只有透過程式設計方式,才會支援覆寫自動將商務程序流程套用至新實體記錄的預設行為。 無法使用 UI 執行這個工作。

用戶端對商務程序流程的程式設計功能支援

Dynamics 365 有用戶端物件,可用來與表單指令碼中的商務程序流程互動。 商務程序流程在每次程序套用至記錄、階段變更,或其狀態變更為 ActiveFinishedAborted 時,觸發用戶端事件。其他資訊:為商務程序流程撰寫指令碼

程序、階段和步驟的數目上限。

每個實體的已啟動商務程序流程的最大數目預設值為 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. 著作權所有,並保留一切權利。 著作權