Browse Source

产品360头部统计

GOIAggregation
shanji 2 years ago
parent
commit
70eeb02cdc
  1. 13
      SiNan.API/Controllers/GOIController.cs
  2. 84
      SiNan.Business/GOIBusiness.cs
  3. 11
      SiNan.Model/Db/JDXX/Skus.cs
  4. 147
      SiNan.Model/Db/JDXX/Spuchange.cs
  5. 68
      SiNan.Model/Db/Order/OrderSku.cs
  6. 2
      SiNan.Model/Dto/Request/GOI/Product360PopularizeAnalysisRequest.cs
  7. 10
      SiNan.Model/Dto/Request/JDXX/JDXXHistogramRequest.cs
  8. 15
      SiNan.Model/Dto/Request/Statistics/Product360TopStatisticsRequest.cs
  9. 4
      SiNan.Model/Dto/Response/JDXX/JDXXHistogramResponse.cs
  10. 30
      SiNan.Model/Dto/Response/Statistics/Product360TopStatisticsResponse.cs

13
SiNan.API/Controllers/GOIController.cs

@ -41,9 +41,20 @@ namespace SiNan.API.Controllers
/// <param name="request"></param> /// <param name="request"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost] [HttpPost]
public ListResponse<JDXXHistogramResponse> QueryProduct360HistogramStatistics([FromBody]JDXXHistogramRequest request) public JDXXHistogramResponse QueryProduct360HistogramStatistics([FromBody]JDXXHistogramRequest request)
{ {
return goiBusiness.QueryProduct360HistogramStatistics(request); return goiBusiness.QueryProduct360HistogramStatistics(request);
} }
/// <summary>
/// 产品360分析-头部统计
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public Product360TopStatisticsResponse QueryProduct360TopStatistics([FromBody]Product360TopStatisticsRequest request)
{
return goiBusiness.QueryProduct360TopStatistics(request);
}
} }
} }

84
SiNan.Business/GOIBusiness.cs

@ -437,23 +437,87 @@ namespace SiNan.Business
}; };
} }
public ListResponse<JDXXHistogramResponse> QueryProduct360HistogramStatistics(JDXXHistogramRequest request) public JDXXHistogramResponse QueryProduct360HistogramStatistics(JDXXHistogramRequest request)
{ {
List<string> skuIdList = null;
if (!string.IsNullOrEmpty(request.Sku))
{
request.Spu = string.Empty;
skuIdList = new List<string>() { request.Sku };
}
if (!string.IsNullOrEmpty(request.Spu))
{
skuIdList = fsql.Select<ProductSku>().Where(ps => ps.ProductId == request.Spu).ToList(ps => ps.Id);
}
var startDate = DateTime.Now.Date.AddDays(-14); var startDate = DateTime.Now.Date.AddDays(-14);
var endDate = DateTime.Now.Date.AddSeconds(-1); var endDate = DateTime.Now.Date.AddSeconds(-1);
var list = fsql.Select<Server.Model.Db.Skus>().Where(s => request.SkuList.Contains(s.Sku)) var data = fsql.Select<Skus>().Where(s => skuIdList.Contains(s.Sku))
.Where(s => s.CreateTime >= startDate && s.CreateTime <= endDate) .Where(s => s.CreateTime >= startDate && s.CreateTime <= endDate)
.ToList(s => new JDXXHistogramResponse() .ToAggregate(s => new JDXXHistogramResponse()
{ {
UV = s.Uv, UV = s.Sum(s.Key.Uv),
Sales = s.Sales, Sales = s.Sum(s.Key.Sales),
Profit = s.Profits, Profit = s.Sum(s.Key.Profits),
TotalCost = s.TotalCost TotalCost = s.Sum(s.Key.TotalCost)
}); });
return new ListResponse<JDXXHistogramResponse>() return data;
}
public Product360TopStatisticsResponse QueryProduct360TopStatistics(Product360TopStatisticsRequest request)
{
if (string.IsNullOrEmpty(request.Sku) && string.IsNullOrEmpty(request.Spu))
throw new BusinessException("缺少必要参数");
if (!string.IsNullOrEmpty(request.Sku))
request.Spu = string.Empty;
Product p = null;
ProductSku productSku = null;
if (!string.IsNullOrEmpty(request.Spu))
p = fsql.Select<Product>(request.Spu).ToOne();
var psList = fsql.Select<ProductSku>().WhereIf(!string.IsNullOrEmpty(request.Spu), ps => ps.ProductId == request.Spu)
.WhereIf(!string.IsNullOrEmpty(request.Sku), ps => ps.Id == request.Sku)
.ToList();
if (!string.IsNullOrEmpty(request.Sku))
productSku = psList.FirstOrDefault(ps => ps.Id == request.Sku);
var skuIdList = psList.Select(ps => ps.Id).ToList();
var spu = psList.FirstOrDefault().ProductId;
var noOrderStateList = new List<Enums.OrderState?>()
{
Enums.OrderState.,
Enums.OrderState.
};
var saleQueryTime = DateTime.Now.Date.AddDays(-30);
var saleCount = fsql.Select<Order, OrderSku>()
.InnerJoin((o, osku) => o.Id == osku.OrderId)
.Where((o, osku) => !noOrderStateList.Contains(o.OrderState) &&
o.StartTime >= saleQueryTime)
.WhereIf(!string.IsNullOrEmpty(request.Spu), (o, osku) => osku.ProductId == request.Spu)
.WhereIf(!string.IsNullOrEmpty(request.Sku), (o, osku) => osku.SkuId == request.Sku)
.Sum((o, osku) => osku.ItemTotal);
var pingjia = fsql.Select<Spuchange>().Where(x => x.SpusId == spu).OrderByDescending(x => x.CreateTime).ToOne(x => x.TotalCount);
var historyPopularizeLevelGOIList = StatisticsPopularizeLevelGOI(skuIdList, null, null);
var totalDeficit = historyPopularizeLevelGOIList.Sum(x => x.Profit) - historyPopularizeLevelGOIList.Sum(x => x.Cost);
return new Product360TopStatisticsResponse()
{ {
Count = list.Count, CreateTime = p?.CreateTime ?? productSku?.CreateTime,
ItemList = list EvaluateCount = pingjia,
MaxDeficit = p?.MaxDeficitThreshold ?? productSku?.MaxDeficitThreshold,
MonthSaleCount = saleCount,
TotalDeficit = totalDeficit
}; };
} }
} }

11
SiNan.Model/Db/JDXX/Skus.cs

@ -1,13 +1,14 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
namespace SiNan.Server.Model.Db namespace SiNan.Model.Db
{ {
/// <summary> /// <summary>
/// sku表 /// sku表
/// </summary> /// </summary>
[Table(Name = "skus", DisableSyncStructure = true)] [Table(Name = "skus", DisableSyncStructure = true)]
public partial class Skus { public partial class Skus
{
/// <summary> /// <summary>
/// Id /// Id
@ -339,6 +340,12 @@ namespace SiNan.Server.Model.Db
[Column(DbType = "int")] [Column(DbType = "int")]
public int? SelfOrder { get; set; } public int? SelfOrder { get; set; }
/// <summary>
/// 店铺ID
/// </summary>
[Column(StringLength = 50)]
public string ShopId { get; set; }
/// <summary> /// <summary>
/// 店铺Id /// 店铺Id
/// </summary> /// </summary>

147
SiNan.Model/Db/JDXX/Spuchange.cs

@ -0,0 +1,147 @@
using FreeSql.DataAnnotations;
namespace SiNan.Model.Db
{
/// <summary>
/// spu评论数据变更表
/// </summary>
[Table(Name = "spuchange", DisableSyncStructure = true)]
public partial class Spuchange
{
/// <summary>
/// Id
/// </summary>
[Column(StringLength = 50, IsPrimary = true, IsNullable = false)]
public string Id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[Column(DbType = "datetime")]
public DateTime CreateTime { get; set; }
/// <summary>
/// 创建人Id
/// </summary>
[Column(StringLength = 50)]
public string CreatorId { get; set; }
/// <summary>
/// 好评率
/// </summary>
[Column(StringLength = 11)]
public string GoodRate { get; set; }
/// <summary>
/// 差评
/// </summary>
[Column(StringLength = 11)]
public string HasBad { get; set; }
/// <summary>
/// 好评
/// </summary>
[Column(StringLength = 11)]
public string HasGood { get; set; }
/// <summary>
/// 有图评价
/// </summary>
[Column(StringLength = 11)]
public string HasImg { get; set; }
/// <summary>
/// 中评
/// </summary>
[Column(StringLength = 11)]
public string HasMedium { get; set; }
/// <summary>
/// 追评
/// </summary>
[Column(StringLength = 11)]
public string HasMore { get; set; }
/// <summary>
/// 带视频评价
/// </summary>
[Column(StringLength = 11)]
public string HasVideo { get; set; }
/// <summary>
/// 旧的好评率
/// </summary>
[Column(StringLength = 11)]
public string OldGoodRate { get; set; }
/// <summary>
/// 旧的差评
/// </summary>
[Column(StringLength = 11)]
public string OldHasBad { get; set; }
/// <summary>
/// 旧的好评
/// </summary>
[Column(StringLength = 11)]
public string OldHasGood { get; set; }
/// <summary>
/// 旧的有图评价
/// </summary>
[Column(StringLength = 11)]
public string OldHasImg { get; set; }
/// <summary>
/// 旧的中评
/// </summary>
[Column(StringLength = 11)]
public string OldHasMedium { get; set; }
/// <summary>
/// 旧的追评
/// </summary>
[Column(StringLength = 11)]
public string OldHasMore { get; set; }
/// <summary>
/// 旧的带视频评价
/// </summary>
[Column(StringLength = 11)]
public string OldHasVideo { get; set; }
/// <summary>
/// 旧的全部评价
/// </summary>
[Column(StringLength = 11)]
public string OldTotalCount { get; set; }
/// <summary>
/// Spu
/// </summary>
[Column(StringLength = 50)]
public string Spu { get; set; }
/// <summary>
/// Spu表Id
/// </summary>
[Column(StringLength = 50)]
public string SpusId { get; set; }
/// <summary>
/// 团队ID
/// </summary>
[Column(StringLength = 50)]
public string TeamId { get; set; }
/// <summary>
/// 全部评价
/// </summary>
[Column(StringLength = 11)]
public string TotalCount { get; set; }
}
}

68
SiNan.Model/Db/Order/OrderSku.cs

@ -0,0 +1,68 @@
using FreeSql.DataAnnotations;
namespace SiNan.Model.Db
{
[Table(Name = "ordersku", DisableSyncStructure = true)]
public partial class OrderSku
{
[Column(DbType = "bigint(1)", IsPrimary = true)]
public long Id { get; set; }
[Column(DbType = "datetime")]
public DateTime? CreateTime { get; set; }
/// <summary>
/// 销售数量
/// </summary>
[Column(DbType = "int(1)")]
public int? ItemTotal { get; set; }
[Column(StringLength = 50)]
public string OrderId { get; set; }
/// <summary>
/// 销售单价
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal? Price { get; set; }
[Column(StringLength = 50)]
public string ProductId { get; set; }
/// <summary>
/// 货号
/// </summary>
[Column(StringLength = 50)]
public string ProductNo { get; set; }
[Column(StringLength = 50, IsNullable = false)]
public string SkuId { get; set; }
/// <summary>
/// Sku标题
/// </summary>
[Column(StringLength = 255)]
public string Title { get; set; }
[Column(StringLength = 255)]
public string Logo { get; set; }
/// <summary>
/// 代发信息Id
/// </summary>
[Column(DbType = "bigint(1)", IsNullable = true)]
public long? OrderDropShippingId { get; set; }
/// <summary>
/// 是否售后
/// </summary>
[Column(DbType = "bit")]
public bool IsRefund { get; set; } = false;
[Column(IsIgnore = true)]
public long ShopId { get; set; }
}
}

2
SiNan.Model/Dto/Request/GOI/Product360PopularizeAnalysisRequest.cs

@ -10,7 +10,7 @@
public string Spu { get; set; } public string Spu { get; set; }
/// <summary> /// <summary>
/// 按SKU条件查询时传值该字段,SPU和SKU同时有值会忽略SPU条件 /// 按SKU条件查询时传值该字段,同时有值会忽略SPU
/// </summary> /// </summary>
public string Sku { get; set; } public string Sku { get; set; }

10
SiNan.Model/Dto/Request/JDXX/JDXXHistogramRequest.cs

@ -2,6 +2,14 @@
{ {
public class JDXXHistogramRequest public class JDXXHistogramRequest
{ {
public IList<string> SkuList { get; set; } /// <summary>
/// 按SPU条件查询时传值该字段
/// </summary>
public string Spu { get; set; }
/// <summary>
/// 按SKU条件查询时传值该字段,同时有值会忽略SPU
/// </summary>
public string Sku { get; set; }
} }
} }

15
SiNan.Model/Dto/Request/Statistics/Product360TopStatisticsRequest.cs

@ -0,0 +1,15 @@
namespace SiNan.Model.Dto
{
public class Product360TopStatisticsRequest
{
/// <summary>
/// 按SPU查询传该值
/// </summary>
public string Spu { get; set; }
/// <summary>
/// 按SKU查询传该值,同时有值会忽略SPU
/// </summary>
public string Sku { get; set; }
}
}

4
SiNan.Model/Dto/Response/JDXX/JDXXHistogramResponse.cs

@ -5,12 +5,12 @@
/// <summary> /// <summary>
/// 访客 /// 访客
/// </summary> /// </summary>
public long? UV { get; set; } public decimal? UV { get; set; }
/// <summary> /// <summary>
/// 销量 /// 销量
/// </summary> /// </summary>
public long? Sales { get; set; } public decimal? Sales { get; set; }
/// <summary> /// <summary>
/// 花费 /// 花费

30
SiNan.Model/Dto/Response/Statistics/Product360TopStatisticsResponse.cs

@ -0,0 +1,30 @@
namespace SiNan.Model.Dto
{
public class Product360TopStatisticsResponse
{
/// <summary>
/// 月销量(近30天销量)
/// </summary>
public decimal? MonthSaleCount { get; set; }
/// <summary>
/// 评价数,string类型
/// </summary>
public string EvaluateCount { get; set; }
/// <summary>
/// 累计亏损
/// </summary>
public decimal? TotalDeficit { get; set; }
/// <summary>
/// 最大亏损阈值
/// </summary>
public decimal? MaxDeficit { get; set; }
/// <summary>
/// 上架时间
/// </summary>
public DateTime? CreateTime { get; set; }
}
}
Loading…
Cancel
Save