C# 如何平均分配所有机会价值的折扣

C# 如何平均分配所有机会价值的折扣,c#,dynamics-crm,C#,Dynamics Crm,我正在创建一个插件,将平均分配折扣。我想平均分配所有产品的折扣金额。因此,如果一个产品的价格为2000,而另一个产品的价格为1000,那么我想给折扣300,所以除以金额200,在crm中应该给2000,100到100 public class DivideEqualDiscount : IPlugin { static IOrganizationService _service; public void Execute(IServiceProvider serviceProvi

我正在创建一个插件,将平均分配折扣。我想平均分配所有产品的折扣金额。因此,如果一个产品的价格为2000,而另一个产品的价格为1000,那么我想给折扣300,所以除以金额200,在crm中应该给2000,100到100

public class DivideEqualDiscount : IPlugin

{
    static IOrganizationService _service;
    public void Execute(IServiceProvider serviceProvider)
    {


        IPluginExecutionContext context = (IPluginExecutionContext)
        serviceProvider.GetService(typeof(IPluginExecutionContext));

        ITracingService tracingService =


    (ITracingService)serviceProvider.GetService(typeof(ITracingService));

        if (context.InputParameters.Contains("Target") &&
            context.InputParameters["Target"] is Entity)
        {
            Entity target = (Entity)context.InputParameters["Target"];

            if (target.Attributes.Contains("new_amount"))
            {
                target["new_amount"] = "52";
            }
            if (target.Attributes.Contains("new_discount"))
            {
                target["new_discount"] = "52";
            }


            string fetchData = @"
               <entity name='opportunityproduct' >
               <attribute name='manualdiscountamount' />
               <attribute name='priceperunit' />
               <attribute name='volumediscountamount' />
               <attribute name='quantity' />
               <attribute name='extendedamount' />
               </entity>
              </fetch>";

            EntityCollection ec = ExecuteFetch(fetchData);
            foreach (var item in ec.Entities)
            {

                if (item.Attributes.Contains("msdyn_costpriceperunit"))
                {

                    target["new_discountamount"] = "";
                    target["new_discountpercentage"] = "";
                }
                if (item.Attributes.Contains("quantity"))
                {

                }
                if (item.Attributes.Contains("extendedamount"))
                {

                }

            }

        }

    }
    public static EntityCollection ExecuteFetch(string fetchXmlString)
    {
        return _service.RetrieveMultiple(new FetchExpression(fetchXmlString));
    }
}
public类DivideEqualDiscount:IPlugin
{
静态组织服务\u服务;
public void Execute(IServiceProvider服务提供程序)
{
IPluginExecutionContext上下文=(IPluginExecutionContext)
GetService(typeof(IPluginExecutionContext));
ITracingService跟踪服务=
(ITracingService)serviceProvider.GetService(类型(ITracingService));
if(context.InputParameters.Contains(“目标”)&&
context.InputParameters[“Target”]是实体)
{
实体目标=(实体)上下文。输入参数[“目标”];
if(target.Attributes.Contains(“新金额”))
{
目标[“新金额”]=“52”;
}
if(target.Attributes.Contains(“新折扣”))
{
目标[“新折扣”]=“52”;
}
字符串fetchData=@”
";
EntityCollection ec=ExecuteFetch(获取数据);
foreach(ec.实体中的var项目)
{
if(item.Attributes.Contains(“msdyn_costpriceperunit”))
{
目标[“新折扣量”]=“”;
目标[“新折扣百分比”]=“”;
}
if(item.Attributes.Contains(“数量”))
{
}
if(item.Attributes.Contains(“extendedamount”))
{
}
}
}
}
公共静态EntityCollection ExecuteFetch(字符串fetchXmlString)
{
return _service.RetrieveMultiple(新的FetchExpression(fetchXmlString));
}
}

}一种方法是计算折扣占Opportunity total的百分比,然后将该百分比折扣应用于每一行

例如:

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Tooling.Connector;
using System;
using System.Collections.Generic;
using System.Linq;

public override void Run()
{            
    var totalDiscount = 200000;
    using (var ctx = new OrganizationServiceContext(svc))
    {
        var q = from l in ctx.CreateQuery("opportunityproduct")
                where l.GetAttributeValue<EntityReference>("opportunityid").Id.Equals(new Guid("D80E0283-5BF2-E311-945F-6C3BE5A8DD64"))                             
                select l;
        var lines = q.ToList();

        var total = lines.Sum(l => getLineTotal(l));
        var discountPercent = totalDiscount / total;

        lines.ForEach(l =>
        {
            var discount = discountPercent * getLineTotal(l);
            l["manualdiscountamount"] = new Money(discount);
            ctx.UpdateObject(l);
        });
        ctx.SaveChanges();
    }
}

private decimal getLineTotal(Entity line) => 
    line.GetAttributeValue<Money>("priceperunit").Value * line.GetAttributeValue<decimal>("quantity");
使用Microsoft.Xrm.Sdk;
使用Microsoft.Xrm.Sdk.Client;
使用Microsoft.Xrm.Tooling.Connector;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
公共覆盖无效运行()
{            
var总折扣=200000;
使用(var ctx=新的OrganizationServiceContext(svc))
{
var q=来自ctx.CreateQuery(“opportunityproduct”)中的l
其中l.GetAttributeValue(“opportunityid”).Id.Equals(新Guid(“D80E0283-5BF2-E311-945F-6C3BE5A8DD64”))
选择l;
变量行=q.ToList();
var total=lines.Sum(l=>getLineTotal(l));
var折扣百分比=总折扣/总折扣;
lines.ForEach(l=>
{
var折扣=折扣百分比*getLineTotal(l);
l[“手动折扣金额”]=新货币(折扣);
ctx.UpdateObject(l);
});
ctx.SaveChanges();
}
}
私有十进制getLineTotal(实体行)=>
line.GetAttributeValue(“价格单位”).Value*line.GetAttributeValue(“数量”);
之前:

申请$200000总折扣后:

你试过什么。您遇到了什么问题?您是对的,但我想除以百分比和我们提供的金额。假设你想给5000英镑的折扣,那么它应该分配给所有的产品,或者如果我加上10%,那也适用