因为客户需要,特定场景下,需要给客户回报补贴。但是补贴是根据系统设置的阶梯条件进行,最后给出补贴总金额以及每个等级的明细,以便保存到数据库。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 阶梯价格优惠政策一
{
public class QuantityTierDiscountCalculator
{
public double CalculateTotalDiscount(double totalQuantity, List<DiscountTier> tiers, out List<PreferentialDetail> detail)
{
double totalDiscount = 0;
detail = new List<PreferentialDetail>();
//优惠政策由小到大
for (int i = 0; i < tiers.Count; i++)
{
var tier = tiers[i];
// 1)首先确定是否达标最低标准
if (totalQuantity < tier.MinimumQuantity) break;
// 2)达标时,进行第一等级优惠计算,然后计算下一等级
double quantityThisTier = 0;
if (totalQuantity >= tier.MaximumQuantity)
{
quantityThisTier = tier.MaximumQuantity - tier.MinimumQuantity;
totalDiscount += quantityThisTier * tier.PreferentialAmount;
PreferentialDetail preferential = new PreferentialDetail();
preferential.PreferentialName = tier.PreferentialName;
preferential.PreferentialId = tier.PreferentialId;
preferential.PreferentialQuantity = quantityThisTier;
preferential.PreferentialMoney = tier.PreferentialAmount;
preferential.PreferentialAmount = quantityThisTier * tier.PreferentialAmount;
detail.Add(preferential);
Debug.Print(string.Format("本次符合吨位:{0}t,优惠:{1}元", quantityThisTier, (quantityThisTier * tier.PreferentialAmount)));
}
else
{
quantityThisTier = (totalQuantity - tier.MinimumQuantity);
totalDiscount += quantityThisTier * tier.PreferentialAmount;
PreferentialDetail preferential = new PreferentialDetail();
preferential.PreferentialName = tier.PreferentialName;
preferential.PreferentialId = tier.PreferentialId;
preferential.PreferentialQuantity = quantityThisTier;
preferential.PreferentialMoney = tier.PreferentialAmount;
preferential.PreferentialAmount = quantityThisTier * tier.PreferentialAmount;
detail.Add(preferential);
Debug.Print(string.Format("本次符合吨位:{0}t,优惠:{1}元", quantityThisTier, (quantityThisTier * tier.PreferentialAmount)));
break;
}
}
return totalDiscount;
}
}
public class DiscountTier
{
public double MinimumQuantity { get; set; }
public double MaximumQuantity { get; set; }
public double PreferentialAmount { get; set; }
public string PreferentialName { get; set; }
public string PreferentialId { get; set; }
}
public class PreferentialDetail
{
public string PreferentialName { get; set; }
public string PreferentialId { get; set; }
public double PreferentialQuantity { get; set; }
public double PreferentialMoney { get; set; }
public double PreferentialAmount { get; set; }
}
class Program
{
static void Main(string[] args)
{
// 使用示例
var calculator = new QuantityTierDiscountCalculator();
double totalQuantity = 76595.39; // 总数量
var tiers = new List<DiscountTier>
{
new DiscountTier { MinimumQuantity = 20000, MaximumQuantity = 30000, PreferentialAmount = 1 , PreferentialId = "A", PreferentialName = "满足2-3万" },
new DiscountTier { MinimumQuantity = 30000, MaximumQuantity = 40000, PreferentialAmount = 2 , PreferentialId = "B", PreferentialName = "满足3-4万" },
new DiscountTier { MinimumQuantity = 40000, MaximumQuantity = 50000, PreferentialAmount = 3 , PreferentialId = "C", PreferentialName = "满足4-5万" },
new DiscountTier { MinimumQuantity = 50000, MaximumQuantity = 60000, PreferentialAmount = 4 , PreferentialId = "D", PreferentialName = "满足5-6万" },
new DiscountTier { MinimumQuantity = 60000, MaximumQuantity = 999999999, PreferentialAmount = 5 , PreferentialId = "E", PreferentialName = "满足6万以上" },
};
//输出优惠政策明细
List<PreferentialDetail> detail;
double totalDiscount = calculator.CalculateTotalDiscount(totalQuantity, tiers, out detail);
Debug.Print($"总优惠金额为: {totalDiscount}");
}
}
}