Browse Source

完善司南接口

GOIAggregation
shanji 2 years ago
parent
commit
58a1b6cc86
  1. 4
      SiNan.API/Program.cs
  2. 199
      SiNan.Business/GOIBusiness.cs
  3. 9
      SiNan.Model/Core/GOI/GOIByLevel.cs
  4. 89
      SiNan.Model/Db/Order/OrderCost.cs

4
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<NLogManager>();
services.AddSingleton<RestApiService>();
services.AddSingleton<TaskSchedulerManager>();
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<ResultFilter>();

199
SiNan.Business/GOIBusiness.cs

@ -44,27 +44,14 @@ namespace SiNan.Business
Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
Sku = g.Key
});
IList<GOIBySku> list = new List<GOIBySku>();
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<GOIBySku> list = new List<GOIBySku>();
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<GOIByLevel> CalculationCampaignLevelGOI(IList<long> campaignIdList, DateTime startDate, DateTime endDate)
{
var costs = fsql.Select<JDPopularizeCampaign>().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<JDOrderPopularizeRelation, OrderCost, Order>().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<GOIByLevel> list = new List<GOIByLevel>();
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<GOIByLevel> CalculationAdGroupLevelGOI(IList<long> 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<JDPopularizeAdGroup>().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<JDOrderPopularizeRelation, OrderCost, Order>().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<JDPopularizeAdGroup>().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<JDOrderPopularizeRelation, OrderCost, Order>().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<JDPopularizeAdGroup>().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<JDOrderPopularizeRelation, OrderCost, Order>().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<JDPopularizeAdGroup>().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<JDMultiLevelGOIResponse>();
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;
}

9
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; }
}
}

89
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; }
/// <summary>
/// 平台扣点金额
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal PlatformCommissionAmount { get; set; } = 0.00M;
/// <summary>
/// 平台扣点百分比
/// </summary>
[Column(DbType = "decimal(20,5)")]
public decimal PlatformCommissionRatio { get; set; } = 0.05M;
/// <summary>
/// 刷单佣金
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal SDCommissionAmount { get; set; } = 0.00M;
/// <summary>
/// 刷单号费
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal SDOrderAmount { get; set; } = 0.00M;
/// <summary>
/// 优惠金额
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal PreferentialAmount { get; set; } = 0.00M;
/// <summary>
/// 利润
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal Profit { get; set; } = 0.00M;
/// <summary>
/// 采购金额
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal PurchaseAmount { get; set; } = 0.00M;
/// <summary>
/// 发货快递费
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal DeliveryExpressFreight { get; set; } = 0.00M;
/// <summary>
/// 是否手动编辑过成本
/// </summary>
public bool IsManualEdited { get; set; } = false;
[Column(DbType = "datetime")]
public DateTime? CreateTime { get; set; }
/// <summary>
/// 退款金额
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal RefundAmount { get; set; } = 0.00M;
/// <summary>
/// 退款采购成本
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal RefundPurchaseAmount { get; set; } = 0.0M;
/// <summary>
/// 所有服务单的售后成本(不含退款采购成本)
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal AfterTotalCost { get; set; } = 0.0M;
}
}
Loading…
Cancel
Save