使用 Notify.js 添加 link 到新创建的实体记录 - CRM

Add link to the newly created entity record using Notify.js - CRM

我有一个自定义工作流程 activity,它从我的自定义工作流程 activity 中创造了新机会。 我将 activity 作为行动步骤。我正在使用动作,因为它有一个输出。我需要获取我创建的机会的 ID。 我使用 Process.js 从 JS 网络资源调用该操作。之后,我使用 Notify.js 通知用户机会已创建。在该通知上,我需要有一个按钮,该按钮将 link 用于新创建的机会。

以下是与输出参数相关的部分 C# 代码。只需注意用于创建机会的代码部分,并执行更多任务即可正常工作:

//define variable
[Output("Opportunity")]
[ReferenceTarget("opportunity")]
public OutArgument<EntityReference> NewOpportunity { get; set; }

//create opportunity and entity reference(i am not sure do ineed entity reference, or something else for that link)
Guid opportunityId = service.Create(opportunity);
EntityReference OppId = new EntityReference(opportunity.LogicalName, opportunityId);

//assign value to the output variable
NewOpportunity.Set(Econtext, OppId);

以下是我在动作定义中创建动作参数的方式:

这里是调用 action 的 JS 代码:

function toOpportunity(){

Process.callAction("ad_opportunity",
    [{
        key: "Target",
        type: Process.Type.EntityReference,
        value: { id: Xrm.Page.data.entity.getId(), entityType: "ad_productsamplerequest" }
    }],
    function (param) {
        //Success            
         Notify.add("New Opportunity was created:", "INFO", "opportunity",
    [{
        type: "button",
        text: "Go to opportunity",
        callback: function () {

        }
    }]);
    },
    function () {
        // Error
        alert("Opportunity was not created");
    }
);

只是说,它起作用了,调用了动作,创造了机会,之后有通知。只是不知道如何使用操作输出参数将 link 设置为机会。

您似乎正在尝试处理 CodeActivity class 中的操作。这是行不通的。 OutArgument 属性只能在工作流中访问,不能返回给调用进程。

而是创建一个具有所需输入和输出参数的操作。然后创建一个插件并在此操作上注册同步 post 更新步骤。插件 class 实现必须将机会 ID 添加到 OutputParameters 集合,如下所示:

public void Execute(IServiceProvider serviceProvider)
{
    var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
    var service = factory.CreateOrganizationService(context.UserId);

    Entity opportunity;
    // TODO: add code here to build the opportunity.

    Guid opportunityId = service.Create(opportunity);
    context.OutputParameters.Add("NewOpportunity", new EntityReference("opportunity", opportunityId));
}

另请参阅 MSDN 上的解释。

Henk 很伤心,无法传递实体引用,因此我在 CodeActivity:

中将 Guid 作为字符串传递
 [Output("Opportunity")]
 public OutArgument<string> NewOpportunity { get; set; }

...

Guid opportunityId = service.Create(opportunity);
 string guidSend = opportunityId.ToString();
 NewOpportunity.Set(Econtext, guidSend);

之后我在 JS 中使用了那个输出:

var OGuid = param["NewOpportunity"];
        Opport = OGuid.replace(/ /g,'');

并像这样设置与新机会的关系:

Xrm.Utility.openEntityForm("opportunity",""+Opport);

JavaScript的第一部分在Action调用中,但不在通知中,最后一行在通知中,所以它们在代码的不同部分。因此,我将 Opport 定义为全局变量,然后我可以在一个函数中设置值,并在通知中从另一个函数调用它。

还有一个选项,没有C#部分。可以在通知回调函数和 return 上次创建的机会 ID 中创建提取。这更容易,但不是更好:

     var contactFetchXML = "<fetch mapping='logical' version='1.0' distinct='true' count='1' >"+
                              "<entity name='opportunity' >"+
                                "<attribute name='opportunityid' />"+
                                "<order attribute='createdon' descending='true' />"+
                              "</entity>"+
                          "</fetch>";


    var Guid = XrmServiceToolkit.Soap.Fetch(contactFetchXML);

    Xrm.Utility.openEntityForm("opportunity",""+Guid[0].id);