diff --git a/BBWY.Server.API/Controllers/TestController.cs b/BBWY.Server.API/Controllers/TestController.cs index 4f830b5d..c05c2808 100644 --- a/BBWY.Server.API/Controllers/TestController.cs +++ b/BBWY.Server.API/Controllers/TestController.cs @@ -48,5 +48,11 @@ namespace BBWY.Server.API.Controllers { testBusiness.RepairDFOrder(); } + + [HttpPost] + public void Test_20231221() + { + testBusiness.Test_20231221(); + } } } diff --git a/BBWY.Server.Business/TestBusiness.cs b/BBWY.Server.Business/TestBusiness.cs index b63ba0fb..ac9fa485 100644 --- a/BBWY.Server.Business/TestBusiness.cs +++ b/BBWY.Server.Business/TestBusiness.cs @@ -1,21 +1,21 @@ using BBWY.Common.Http; using BBWY.Common.Models; +using BBWY.Server.Business.Extensions; using BBWY.Server.Model; using BBWY.Server.Model.Db; using BBWY.Server.Model.Db.Mds; using BBWY.Server.Model.Dto; using FreeSql; using Microsoft.Extensions.Options; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Threading; -using BBWY.Server.Business.Extensions; -using Newtonsoft.Json; using System.Net.Http; +using System.Reflection; +using System.Threading; using System.Threading.Tasks; -using Org.BouncyCastle.Crypto.Signers; namespace BBWY.Server.Business { @@ -408,6 +408,152 @@ namespace BBWY.Server.Business Thread.Sleep(1000); } } + + public void Test_20231221() + { + var invalidOrderStateList = new List() { Enums.OrderState.已取消, Enums.OrderState.待付款 }; + var shopList = venderBusiness.GetShopList(10224131, Enums.Platform.京东); + var objList = new List<(string id, string shopName, DateTime sjtime, decimal? lastOrderAmount, decimal fto20SearchUv, decimal fto50SearchUv, decimal fto100SearchUv, decimal fto200SearchUv, decimal fto30SearchUv, decimal fto500SearchUv)>(); + var result = new List() { "店铺名,SPU,上架时间,最后一单成交价,推荐访客首次到达20时的搜索访客,推荐访客首次到达50时的搜索访客,推荐访客首次到达100时的搜索访客,推荐访客首次到达200时的搜索访客,推荐访客首次到达300时的搜索访客,推荐访客首次到达50时的搜索访客" }; + foreach (var shop in shopList) + { + Console.WriteLine(shop.ShopName); + var shopId = long.Parse(shop.ShopId); + var productList = fsql.Select().Where(p => p.ShopId == shopId).ToList(); + var productIdList = productList.Select(p => p.Id).ToList(); + + var skuList = fsql.Select() + .InnerJoin((osku, o) => osku.OrderId == o.Id) + .Where((osku, o) => o.ShopId == shopId && + !invalidOrderStateList.Contains(o.OrderState) && + o.IsGift == false && + o.StorageType != Enums.StorageType.SD && + osku.Price > 0) + .GroupBy((osku, o) => osku.ProductId) + .WithTempQuery(g => new { MaxId = g.Max(g.Value.Item1.Id), ProductId = g.Key }) + .From() + .InnerJoin((osku, osku1) => osku1.Id == osku.MaxId) + .ToList((osku, osku1) => new { osku1.ProductId, osku1.OrderId }); + var orderIdList = skuList.Select(s => s.OrderId).Distinct().ToList(); + var orderList = fsql.Select(orderIdList).ToList(o => new Order() { Id = o.Id, ShopId = o.ShopId, OrderTotalPrice = o.OrderTotalPrice }); + + + #region 20 + var _20list = freeSqlMultiDBManager.JDXXfsql.Select() + .Where(s => productIdList.Contains(s.Spu)) + .GroupBy(s => new { s.Spu, s.CreateTime }) + .Having(g => g.Sum(g.Value.StarUv) >= 50) + .OrderBy(g => g.Value.CreateTime) + .ToList(g => new + { + spu = g.Key, + g.Value.CreateTime, + sumSearchUv = g.Sum(g.Value.SearchUv), + sumStarUv = g.Sum(g.Value.StarUv) + }); + + #endregion + + #region 50 + var _50list = freeSqlMultiDBManager.JDXXfsql.Select() + .Where(s => productIdList.Contains(s.Spu)) + .GroupBy(s => new { s.Spu, s.CreateTime }) + .Having(g => g.Sum(g.Value.StarUv) >= 50) + .OrderBy(g => g.Value.CreateTime) + .ToList(g => new + { + spu = g.Key, + g.Value.CreateTime, + sumSearchUv = g.Sum(g.Value.SearchUv), + sumStarUv = g.Sum(g.Value.StarUv) + }); + + #endregion + + #region 100 + var _100list = freeSqlMultiDBManager.JDXXfsql.Select() + .Where(s => productIdList.Contains(s.Spu)) + .GroupBy(s => new { s.Spu, s.CreateTime }) + .Having(g => g.Sum(g.Value.StarUv) >= 100) + .OrderBy(g => g.Value.CreateTime) + .ToList(g => new + { + spu = g.Key, + g.Value.CreateTime, + sumSearchUv = g.Sum(g.Value.SearchUv), + sumStarUv = g.Sum(g.Value.StarUv) + }); + + #endregion + + #region 200 + var _200list = freeSqlMultiDBManager.JDXXfsql.Select() + .Where(s => productIdList.Contains(s.Spu)) + .GroupBy(s => new { s.Spu, s.CreateTime }) + .Having(g => g.Sum(g.Value.StarUv) >= 200) + .OrderBy(g => g.Value.CreateTime) + .ToList(g => new + { + spu = g.Key, + g.Value.CreateTime, + sumSearchUv = g.Sum(g.Value.SearchUv), + sumStarUv = g.Sum(g.Value.StarUv) + }); + + #endregion + + #region 300 + var _300list = freeSqlMultiDBManager.JDXXfsql.Select() + .Where(s => productIdList.Contains(s.Spu)) + .GroupBy(s => new { s.Spu, s.CreateTime }) + .Having(g => g.Sum(g.Value.StarUv) >= 300) + .OrderBy(g => g.Value.CreateTime) + .ToList(g => new + { + spu = g.Key, + g.Value.CreateTime, + sumSearchUv = g.Sum(g.Value.SearchUv), + sumStarUv = g.Sum(g.Value.StarUv) + }); + + #endregion + + #region 500 + var _500list = freeSqlMultiDBManager.JDXXfsql.Select() + .Where(s => productIdList.Contains(s.Spu)) + .GroupBy(s => new { s.Spu, s.CreateTime }) + .Having(g => g.Sum(g.Value.StarUv) >= 500) + .OrderBy(g => g.Value.CreateTime) + .ToList(g => new + { + spu = g.Key, + g.Value.CreateTime, + sumSearchUv = g.Sum(g.Value.SearchUv), + sumStarUv = g.Sum(g.Value.StarUv) + }); + + #endregion + + foreach (var product in productList) + { + var orderTotalPrice = orderList.FirstOrDefault(o => o.Id == (skuList.FirstOrDefault(s => s.ProductId == product.Id)?.OrderId))?.OrderTotalPrice ?? 0M; + var shopName = shop.ShopName; + var sjtime = product.CreateTime; + var fto20SearchUv = _20list.FirstOrDefault(s => s.spu.Spu == product.Id)?.sumSearchUv ?? 0M; + var fto50SearchUv = _50list.FirstOrDefault(s => s.spu.Spu == product.Id)?.sumSearchUv ?? 0M; + var fto100SearchUv = _100list.FirstOrDefault(s => s.spu.Spu == product.Id)?.sumSearchUv ?? 0M; + var fto200SearchUv = _200list.FirstOrDefault(s => s.spu.Spu == product.Id)?.sumSearchUv ?? 0M; + var fto300SearchUv = _300list.FirstOrDefault(s => s.spu.Spu == product.Id)?.sumSearchUv ?? 0M; + var fto500SearchUv = _500list.FirstOrDefault(s => s.spu.Spu == product.Id)?.sumSearchUv ?? 0M; + result.Add($"{shopName},{product.Id},{sjtime},{orderTotalPrice},{fto20SearchUv},{fto50SearchUv},{fto100SearchUv},{fto200SearchUv},{fto300SearchUv},{fto500SearchUv}"); + } + } + + System.IO.File.WriteAllLines(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "result.csv"), result, System.Text.Encoding.UTF8); + Console.WriteLine("结束"); + } + + } public class JPCount diff --git a/BBWY.Server.Business/Vender/VenderBusiness.cs b/BBWY.Server.Business/Vender/VenderBusiness.cs index 5ad45bd3..9eb61897 100644 --- a/BBWY.Server.Business/Vender/VenderBusiness.cs +++ b/BBWY.Server.Business/Vender/VenderBusiness.cs @@ -293,14 +293,14 @@ namespace BBWY.Server.Business return departmentList; } - public IList GetShopList(long? shopId = null, Enums.Platform? platform = null, bool filterTurnoverDays = false, bool filterSiNan = false) + public IList GetShopList(long? shopId = null, Enums.Platform? platform = null, bool filterTurnoverDays = false, bool filterSiNan = false, bool? isEnabled = true) { return freeSqlMultiDBManager.MDSfsql.Select().Where(s => !string.IsNullOrEmpty(s.ShopId)) .WhereIf(shopId != null, s => s.ShopId == shopId.ToString()) .WhereIf(platform != null, s => s.PlatformId == (int)platform) .WhereIf(filterTurnoverDays, s => s.SkuSafeTurnoverDays != 0) .WhereIf(filterSiNan, s => !string.IsNullOrEmpty(s.SiNanDingDingWebHook)) - .Where(s => s.IsEnabled == true) + .WhereIf(isEnabled != null, s => s.IsEnabled == isEnabled) .ToList(); } diff --git a/BBWY.Server.Model/Db/JDXX/Newskus.cs b/BBWY.Server.Model/Db/JDXX/Newskus.cs new file mode 100644 index 00000000..3cf75553 --- /dev/null +++ b/BBWY.Server.Model/Db/JDXX/Newskus.cs @@ -0,0 +1,426 @@ +using FreeSql.DataAnnotations; +using System; + +namespace JDXX.Model.Db +{ + [Table(Name = "newskus", DisableSyncStructure = true)] + public partial class Newskus + { + + /// + /// Id + /// + [Column(StringLength = 50, IsPrimary = true, IsNullable = false)] + public string Id { get; set; } + + /// + /// 加购物车数量 + /// + [Column(DbType = "int")] + public int? AddCardCount { get; set; } + + /// + /// 加购人数 + /// + [Column(DbType = "int")] + public int? AddCardMember { get; set; } + + /// + /// 加购率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? AddCardRate { get; set; } + + /// + /// 点击次数 + /// + [Column(DbType = "int")] + public int? ClickCount { get; set; } + + /// + /// 点击率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? ClickRate { get; set; } + + /// + /// 栏目订单 + /// + [Column(DbType = "int")] + public int? ColumnOrder { get; set; } + + /// + /// 转化率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? ConversionRate { get; set; } + + /// + /// 收费流量 + /// + [Column(DbType = "int")] + public int? CostUv { get; set; } + + /// + /// 创建时间 + /// + [Column(DbType = "datetime")] + public DateTime CreateTime { get; set; } + + /// + /// 盈亏小节 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? EarningsPrice { get; set; } + + /// + /// 曝光量 + /// + [Column(DbType = "int")] + public int? Exposure { get; set; } + + /// + /// 快车点击率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? ExposureClickRate { get; set; } + + /// + /// 快车点击 + /// + [Column(DbType = "int")] + public int? ExpressClick { get; set; } + + /// + /// 快车花费 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? ExpressCost { get; set; } + + /// + /// 快车展现 + /// + + public decimal? ExpressExposure { get; set; } + + /// + /// 快车订单 + /// + [Column(DbType = "int")] + public int? ExpressOrder { get; set; } + + /// + /// 快车成交额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? ExpressPayPrice { get; set; } + + /// + /// 快车人均点击 + /// + [Column(DbType = "decimal(11,4)")] + public decimal? ExpressPeopleClick { get; set; } + + /// + /// 快车访客 + /// + [Column(DbType = "int")] + public int? ExpressUv { get; set; } + + /// + /// 免费订单 + /// + [Column(DbType = "int")] + public int? FreeOrder { get; set; } + + /// + /// 免费成交额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? FreePayPrice { get; set; } + + /// + /// 免费流量 + /// + [Column(DbType = "int")] + public int? FreeUv { get; set; } + + /// + /// 首页访客 + /// + [Column(DbType = "int")] + public int? IndexUv { get; set; } + + /// + /// 是否收藏 + /// + [Column(DbType = "tinyint")] + public sbyte? IsStar { get; set; } + + /// + /// 新品交易榜单 + /// + [Column(DbType = "int")] + public int? NewSaleTopIndex { get; set; } + + /// + /// 新品人气榜单 + /// + [Column(DbType = "int")] + public int? NewUvTopIndex { get; set; } + + /// + /// 一级类目 + /// + [Column(StringLength = 50)] + public string OneCatId { get; set; } + + /// + /// 其他订单 + /// + [Column(DbType = "int")] + public int? OtherOrder { get; set; } + + /// + /// 其他成交额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? OtherPrice { get; set; } + + /// + /// 其他访客 + /// + [Column(DbType = "int")] + public int? OtherUv { get; set; } + + /// + /// 流量路径 + /// + [Column(StringLength = -2)] + public string PathList { get; set; } + + /// + /// 下单商品件数 + /// + [Column(DbType = "int")] + public int? PayItemCount { get; set; } + + /// + /// 下单客户数 + /// + [Column(DbType = "int")] + public int? PayMember { get; set; } + + /// + /// 下单数 + /// + [Column(DbType = "int")] + public int? PayOrder { get; set; } + + /// + /// 下单金额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? PayPrice { get; set; } + + /// + /// 下单转化率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? PayRate { get; set; } + + /// + /// 毛利 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? Profits { get; set; } + + /// + /// 流量 + /// + [Column(DbType = "int")] + public int? Pv { get; set; } + + /// + /// 真实转化率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? RealConversionRate { get; set; } + + /// + /// 真实成交额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? RealPrice { get; set; } + + /// + /// 成交客户数 + /// + [Column(DbType = "int")] + public int? SaleMember { get; set; } + + /// + /// 成交金额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? SalePrice { get; set; } + + /// + /// 成交转化率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? SaleRate { get; set; } + + /// + /// 成交件数 + /// + [Column(DbType = "int")] + public int? Sales { get; set; } + + /// + /// 交易榜单排名 + /// + [Column(DbType = "int")] + public int? SaleTopIndex { get; set; } + + /// + /// 风向标 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? ScoreRank { get; set; } + + /// + /// 刷单花费 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? SdCost { get; set; } + + /// + /// 刷单单量 + /// + [Column(DbType = "int")] + public int? SdOrder { get; set; } + + /// + /// 刷单成交额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? SdPrice { get; set; } + + /// + /// 搜索访客 + /// + [Column(DbType = "int")] + public int? SearchUv { get; set; } + + /// + /// 二级类目 + /// + [Column(StringLength = 50)] + public string SecondCatId { get; set; } + + /// + /// 自主订单 + /// + [Column(DbType = "int")] + public int? SelfOrder { get; set; } + + /// + /// 店铺ID + /// + [Column(StringLength = 50)] + public string ShopId { get; set; } + + /// + /// 海投点击 + /// + [Column(DbType = "int")] + public int? ShotgunClick { get; set; } + + /// + /// 海投点击率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? ShotgunClickRate { get; set; } + + /// + /// 海投花费 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? ShotgunCost { get; set; } + + /// + /// 海投展现 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? ShotgunExposure { get; set; } + + /// + /// 海投订单 + /// + [Column(DbType = "int")] + public int? ShotgunOrder { get; set; } + + /// + /// 海投成交额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? ShotgunPayPrice { get; set; } + + /// + /// 海投人均点击 + /// + [Column(DbType = "decimal(11,4)")] + public decimal? ShotgunPeopleClick { get; set; } + + /// + /// 海投访客 + /// + [Column(DbType = "int")] + public int? ShotgunUv { get; set; } + + /// + /// sku + /// + [Column(StringLength = 50)] + public string Sku { get; set; } + + /// + /// Spu + /// + [Column(StringLength = 50)] + public string Spu { get; set; } + + /// + /// 推荐访客 + /// + [Column(DbType = "int")] + public int? StarUv { get; set; } + + /// + /// 三级类目 + /// + [Column(StringLength = 50)] + public string ThirdCatId { get; set; } + + /// + /// 总花费 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? TotalCost { get; set; } + + /// + /// 访客 + /// + [Column(DbType = "int")] + public int? Uv { get; set; } + + /// + /// 人气榜单排名 + /// + [Column(DbType = "int")] + public int? UvTopIndex { get; set; } + + } + +} diff --git a/BBWY.Test/Program.cs b/BBWY.Test/Program.cs index af0464aa..eec7bc71 100644 --- a/BBWY.Test/Program.cs +++ b/BBWY.Test/Program.cs @@ -68,49 +68,51 @@ namespace BBWY.Test //var token = "50a4c0f5c55848b5a8a715709e8d6fe0jntb"; //卿卿玩具专营店 var fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, "data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=bbwy_test;charset=utf8;sslmode=none;").Build(); - var sercvice = new ServiceCollection(); - sercvice.AddHttpClient(); - var servicePriovder = sercvice.BuildServiceProvider(); - var restApiService = new Common.Http.RestApiService(servicePriovder.GetRequiredService()); + //var sercvice = new ServiceCollection(); + //sercvice.AddHttpClient(); + //var servicePriovder = sercvice.BuildServiceProvider(); + //var restApiService = new Common.Http.RestApiService(servicePriovder.GetRequiredService()); + + //var files = System.IO.Directory.GetFiles(@"C:\Users\pengcong001\Desktop\bbwylog"); + //var startTime = DateTime.Parse("2023-10-16"); + //var endTime = DateTime.Parse("2023-11-22"); + //foreach (var file in files) + //{ + // var fileName = file.Substring(file.LastIndexOf("\\") + 1); + // Console.WriteLine(file); + + // var lines = System.IO.File.ReadAllLines(file); + // var priceModifyMsgList = lines.Where(l => !string.IsNullOrEmpty(l) && l.Contains("ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY")).ToList(); + // var orderIndex = 0; + // foreach (var priceModifyMsg in priceModifyMsgList) + // { + // orderIndex++; + // var poId = JObject.Parse(priceModifyMsg)["data"]["orderId"].ToString(); + // var orderDropshipping = fsql.Select().Where(o => o.PurchaseOrderId == poId).ToOne(); + // if (orderDropshipping == null) + // continue; + // var orderId = orderDropshipping.OrderId; + // var shopId = orderDropshipping.ShopId; + + // var result = restApiService.SendRequest("http://bbwytest.qiyue666.com/", "api/test/RepairSkuDetailAndSkuGriooProfit", new + // { + // StartTime = startTime, + // EndTime = endTime, + // ShopId = shopId, + // OrderId = orderId, + // OrderIdList = new List() + // }, null, HttpMethod.Post); + // Console.WriteLine($"{DateTime.Now} {fileName} {orderIndex}/{priceModifyMsgList.Count()} HttpResult{result.StatusCode}"); + // Thread.Sleep(2000); + // } + // try + // { + // System.IO.File.Delete(file); + // } + // catch { } + //} + - var files = System.IO.Directory.GetFiles(@"C:\Users\pengcong001\Desktop\bbwylog"); - var startTime = DateTime.Parse("2023-10-16"); - var endTime = DateTime.Parse("2023-11-22"); - foreach (var file in files) - { - var fileName = file.Substring(file.LastIndexOf("\\") + 1); - Console.WriteLine(file); - - var lines = System.IO.File.ReadAllLines(file); - var priceModifyMsgList = lines.Where(l => !string.IsNullOrEmpty(l) && l.Contains("ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY")).ToList(); - var orderIndex = 0; - foreach (var priceModifyMsg in priceModifyMsgList) - { - orderIndex++; - var poId = JObject.Parse(priceModifyMsg)["data"]["orderId"].ToString(); - var orderDropshipping = fsql.Select().Where(o => o.PurchaseOrderId == poId).ToOne(); - if (orderDropshipping == null) - continue; - var orderId = orderDropshipping.OrderId; - var shopId = orderDropshipping.ShopId; - - var result = restApiService.SendRequest("http://bbwytest.qiyue666.com/", "api/test/RepairSkuDetailAndSkuGriooProfit", new - { - StartTime = startTime, - EndTime = endTime, - ShopId = shopId, - OrderId = orderId, - OrderIdList = new List() - }, null, HttpMethod.Post); - Console.WriteLine($"{DateTime.Now} {fileName} {orderIndex}/{priceModifyMsgList.Count()} HttpResult{result.StatusCode}"); - Thread.Sleep(2000); - } - try - { - System.IO.File.Delete(file); - } - catch { } - }