From 58a1b6cc86727b85809605af9a7ede6ef15b04c7 Mon Sep 17 00:00:00 2001 From: shanj <18996038927@163.com> Date: Sun, 29 Oct 2023 01:21:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=8F=B8=E5=8D=97=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SiNan.API/Program.cs | 4 +- SiNan.Business/GOIBusiness.cs | 199 ++++++++++++++++++++++++----- SiNan.Model/Core/GOI/GOIByLevel.cs | 9 ++ SiNan.Model/Db/Order/OrderCost.cs | 89 +++++++++++++ 4 files changed, 265 insertions(+), 36 deletions(-) create mode 100644 SiNan.Model/Core/GOI/GOIByLevel.cs create mode 100644 SiNan.Model/Db/Order/OrderCost.cs diff --git a/SiNan.API/Program.cs b/SiNan.API/Program.cs index 6afca3a..c9a12c9 100644 --- a/SiNan.API/Program.cs +++ b/SiNan.API/Program.cs @@ -5,8 +5,10 @@ using Newtonsoft.Json.Serialization; using SiNan.API.Filters; using SiNan.API.Middlewares; using SiNan.Business; +using SiNan.Common.Extensions; using SiNan.Common.Http; using SiNan.Common.Log; +using SiNan.Common.Models; using System.Reflection; using System.Text; using Yitter.IdGenerator; @@ -33,6 +35,7 @@ services.AddSingleton(new FreeSqlMultiDBManager() services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); +services.BatchRegisterServices(new Assembly[] { Assembly.Load("SiNan.Business") }, typeof(IDenpendency), ServiceLifetime.Singleton); services.AddMemoryCache(); services.AddControllers(); services.AddHttpContextAccessor(); @@ -48,7 +51,6 @@ services.AddCors(options => p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); }); }); - services.AddControllers(c => { c.Filters.Add(); diff --git a/SiNan.Business/GOIBusiness.cs b/SiNan.Business/GOIBusiness.cs index 802c473..1f71cf2 100644 --- a/SiNan.Business/GOIBusiness.cs +++ b/SiNan.Business/GOIBusiness.cs @@ -44,27 +44,14 @@ namespace SiNan.Business Profit = g.Sum(g.Value.Item1.SkuGrossProfit), Sku = g.Key }); - IList list = new List(); - foreach (var c in costs) - { - var skugoi = list.FirstOrDefault(x => x.Sku == c.Sku); - if (skugoi == null) - { - skugoi = new GOIBySku() { Sku = c.Sku }; - list.Add(skugoi); - } - skugoi.Cost = c.Cost; - } - foreach (var p in profits) + IList list = new List(); + foreach (var skuId in skuIdList) { - var skugoi = list.FirstOrDefault(x => x.Sku == p.Sku); - if (skugoi == null) - { - skugoi = new GOIBySku() { Sku = p.Sku }; - list.Add(skugoi); - } - skugoi.Profit = p.Profit; + var cost = costs.FirstOrDefault(x => x.Sku == skuId)?.Cost ?? 0M; + var profit = profits.FirstOrDefault(x => x.Sku == skuId)?.Profit ?? 0M; + var skugoi = new GOIBySku() { Sku = skuId, Cost = cost, Profit = profit }; + list.Add(skugoi); } return list; } @@ -98,28 +85,170 @@ namespace SiNan.Business Sku = g.Key }); - foreach (var c in costs) + foreach (var skuId in skuIdList) { - var skugoi = list.FirstOrDefault(x => x.Sku == c.Sku); - if (skugoi == null) - { - skugoi = new GOIBySku() { Sku = c.Sku }; - list.Add(skugoi); - } - skugoi.Cost = c.Cost; + var cost = costs.FirstOrDefault(x => x.Sku == skuId)?.Cost ?? 0M; + var profit = profits.FirstOrDefault(x => x.Sku == skuId)?.Profit ?? 0M; + var skugoi = new GOIBySku() { Sku = skuId, Cost = cost, Profit = profit }; + list.Add(skugoi); } + return list; + } - foreach (var p in profits) + public IList CalculationCampaignLevelGOI(IList campaignIdList, DateTime startDate, DateTime endDate) + { + var costs = fsql.Select().Where(x => campaignIdList.Contains(x.CampaignId.Value) && + x.Date >= startDate && + x.Date <= endDate) + .GroupBy(x => x.CampaignId) + .ToList(g => new + { + Cost = g.Sum(g.Value.Cost), + CampaignId = g.Key + }); + + var profits = fsql.Select().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId) + .InnerJoin((jr, oc, o) => jr.OrderId == o.Id) + .Where((jr, oc, o) => campaignIdList.Contains(jr.CampaignId.Value) && + jr.CookieTime >= startDate && + jr.CookieTime <= endDate && + o.OrderState != Enums.OrderState.已取消) + .GroupBy((jr, oc, o) => jr.CampaignId) + .ToList(g => new + { + CampaignId = g.Key, + Profit = g.Sum(g.Value.Item2.Profit) + }); + IList list = new List(); + foreach (var campaignId in campaignIdList) { - var skugoi = list.FirstOrDefault(x => x.Sku == p.Sku); - if (skugoi == null) - { - skugoi = new GOIBySku() { Sku = p.Sku }; - list.Add(skugoi); - } - skugoi.Profit = p.Profit; + var cost = costs.FirstOrDefault(x => x.CampaignId == campaignId)?.Cost ?? 0M; + var profit = profits.FirstOrDefault(x => x.CampaignId == campaignId)?.Profit ?? 0M; + var skugoi = new GOIByLevel() { LevelId = campaignId, Cost = cost, Profit = profit }; + list.Add(skugoi); } + return list; + } + + public IList CalculationAdGroupLevelGOI(IList adGroupIdList, DateTime startDate, DateTime endDate) + { + var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1); + + DateTime? _7dEndDate = null; + DateTime? _7dStartDate = null; + DateTime? _7dEndTime = null; + DateTime? _30dEndDate = null; + DateTime? _30dStartDate = null; + DateTime? _30dEndTime = null; + + if (!gOIRequest.OnlyCustomDate) + { + _7dEndDate = DateTime.Now.Date.AddDays(-1); + _7dStartDate = _7dEndDate.Value.AddDays(-6); + _7dEndTime = _7dEndDate.Value.AddDays(1).AddSeconds(-1); + _30dEndDate = DateTime.Now.Date.AddDays(-1); + _30dStartDate = _30dEndDate.Value.AddDays(-29); + _30dEndTime = _30dEndDate.Value.AddDays(1).AddSeconds(-1); + } + + var _7dAdGroupCosts = gOIRequest.OnlyCustomDate ? null : fsql.Select().Where(x => gOIRequest.LevelIdList.Contains(x.AdGroupId.Value) && + x.Date >= _7dStartDate && + x.Date <= _7dEndDate) + .GroupBy(x => x.AdGroupId) + .ToList(g => new + { + Cost = g.Sum(g.Value.Cost), + AdGroupId = g.Key + }); + + var _7dAdGroupProfits = gOIRequest.OnlyCustomDate ? null : fsql.Select().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId) + .InnerJoin((jr, oc, o) => jr.OrderId == o.Id) + .Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.AdGroupId.Value) && + jr.CookieTime >= _7dStartDate && + jr.CookieTime <= _7dEndTime && + o.OrderState != Enums.OrderState.已取消) + .GroupBy((jr, oc, o) => jr.AdGroupId) + .ToList(g => new + { + AdGroupId = g.Key, + Profit = g.Sum(g.Value.Item2.Profit) + }); + + var _30dAdGroupCosts = gOIRequest.OnlyCustomDate ? null : fsql.Select().Where(x => gOIRequest.LevelIdList.Contains(x.AdGroupId.Value) && + x.Date >= _30dStartDate && + x.Date <= _30dEndDate) + .GroupBy(x => x.AdGroupId) + .ToList(g => new + { + Cost = g.Sum(g.Value.Cost), + AdGroupId = g.Key + }); + + var _30dAdGroupProfits = gOIRequest.OnlyCustomDate ? null : fsql.Select().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId) + .InnerJoin((jr, oc, o) => jr.OrderId == o.Id) + .Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.AdGroupId.Value) && + jr.CookieTime >= _30dStartDate && + jr.CookieTime <= _30dEndTime && + o.OrderState != Enums.OrderState.已取消) + .GroupBy((jr, oc, o) => jr.AdGroupId) + .ToList(g => new + { + AdGroupId = g.Key, + Profit = g.Sum(g.Value.Item2.Profit) + }); + + var customDaysAdGroupCosts = fsql.Select().Where(x => gOIRequest.LevelIdList.Contains(x.AdGroupId.Value) && + x.Date >= gOIRequest.StartDate && + x.Date <= gOIRequest.EndDate) + .GroupBy(x => x.AdGroupId) + .ToList(g => new + { + Cost = g.Sum(g.Value.Cost), + AdGroupId = g.Key + }); + + var customDaysAdGroupProfits = fsql.Select().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId) + .InnerJoin((jr, oc, o) => jr.OrderId == o.Id) + .Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.AdGroupId.Value) && + jr.CookieTime >= gOIRequest.StartDate && + jr.CookieTime <= customEndTime && + o.OrderState != Enums.OrderState.已取消) + .GroupBy((jr, oc, o) => jr.AdGroupId) + .ToList(g => new + { + AdGroupId = g.Key, + Profit = g.Sum(g.Value.Item2.Profit) + }); + + var totalAdGroupCosts = fsql.Select().Where(x => gOIRequest.LevelIdList.Contains(x.AdGroupId.Value)) + .GroupBy(x => x.AdGroupId) + .ToList(g => new + { + Cost = g.Sum(g.Value.Cost), + AdGroupId = g.Key + }); + + var list = new List(); + foreach (var levelId in gOIRequest.LevelIdList) + { + var goiResponse = new JDMultiLevelGOIResponse() + { + LevelId = levelId, + BusinessType = gOIRequest.BusinessType + }; + goiResponse._7GOI.Cost = _7dAdGroupCosts == null ? 0 : (_7dAdGroupCosts.FirstOrDefault(x => x.AdGroupId == levelId)?.Cost ?? 0M); + goiResponse._7GOI.Profit = _7dAdGroupProfits == null ? 0 : (_7dAdGroupProfits.FirstOrDefault(x => x.AdGroupId == levelId)?.Profit ?? 0M); + + goiResponse._30GOI.Cost = _30dAdGroupCosts == null ? 0 : (_30dAdGroupCosts.FirstOrDefault(x => x.AdGroupId == levelId)?.Cost ?? 0M); + goiResponse._30GOI.Profit = _30dAdGroupProfits == null ? 0 : (_30dAdGroupProfits.FirstOrDefault(x => x.AdGroupId == levelId)?.Profit ?? 0M); + + goiResponse.CustomDaysGOI.Cost = customDaysAdGroupCosts.FirstOrDefault(x => x.AdGroupId == levelId)?.Cost ?? 0M; + goiResponse.CustomDaysGOI.Profit = customDaysAdGroupProfits.FirstOrDefault(x => x.AdGroupId == levelId)?.Profit ?? 0M; + + goiResponse.TotalCost = totalAdGroupCosts.FirstOrDefault(x => x.AdGroupId == levelId)?.Cost ?? 0M; + list.Add(goiResponse); + } return list; } diff --git a/SiNan.Model/Core/GOI/GOIByLevel.cs b/SiNan.Model/Core/GOI/GOIByLevel.cs new file mode 100644 index 0000000..bfd5f7d --- /dev/null +++ b/SiNan.Model/Core/GOI/GOIByLevel.cs @@ -0,0 +1,9 @@ +using SiNan.Model.Dto; + +namespace SiNan.Model.Core +{ + public class GOIByLevel : GOIResponse + { + public long LevelId { get; set; } + } +} diff --git a/SiNan.Model/Db/Order/OrderCost.cs b/SiNan.Model/Db/Order/OrderCost.cs new file mode 100644 index 0000000..7855d23 --- /dev/null +++ b/SiNan.Model/Db/Order/OrderCost.cs @@ -0,0 +1,89 @@ +using FreeSql.DataAnnotations; +using System; + +namespace SiNan.Model.Db +{ + + [Table(Name = "ordercost", DisableSyncStructure = true)] + public partial class OrderCost + { + + [Column(StringLength = 50, IsPrimary = true, IsNullable = false)] + public string OrderId { get; set; } + + /// + /// 平台扣点金额 + /// + [Column(DbType = "decimal(20,2)")] + public decimal PlatformCommissionAmount { get; set; } = 0.00M; + + /// + /// 平台扣点百分比 + /// + [Column(DbType = "decimal(20,5)")] + public decimal PlatformCommissionRatio { get; set; } = 0.05M; + + /// + /// 刷单佣金 + /// + [Column(DbType = "decimal(20,2)")] + public decimal SDCommissionAmount { get; set; } = 0.00M; + + /// + /// 刷单号费 + /// + [Column(DbType = "decimal(20,2)")] + public decimal SDOrderAmount { get; set; } = 0.00M; + + /// + /// 优惠金额 + /// + [Column(DbType = "decimal(20,2)")] + public decimal PreferentialAmount { get; set; } = 0.00M; + + /// + /// 利润 + /// + [Column(DbType = "decimal(20,2)")] + public decimal Profit { get; set; } = 0.00M; + + /// + /// 采购金额 + /// + [Column(DbType = "decimal(20,2)")] + public decimal PurchaseAmount { get; set; } = 0.00M; + + /// + /// 发货快递费 + /// + [Column(DbType = "decimal(20,2)")] + public decimal DeliveryExpressFreight { get; set; } = 0.00M; + + /// + /// 是否手动编辑过成本 + /// + public bool IsManualEdited { get; set; } = false; + + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } + + /// + /// 退款金额 + /// + [Column(DbType = "decimal(20,2)")] + public decimal RefundAmount { get; set; } = 0.00M; + + /// + /// 退款采购成本 + /// + [Column(DbType = "decimal(20,2)")] + public decimal RefundPurchaseAmount { get; set; } = 0.0M; + + /// + /// 所有服务单的售后成本(不含退款采购成本) + /// + [Column(DbType = "decimal(20,2)")] + public decimal AfterTotalCost { get; set; } = 0.0M; + } + +}