using BBWY.Common.Http ;
using BBWY.Common.Models ;
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 System ;
using System.Collections.Generic ;
using System.IO ;
using System.Linq ;
using System.Threading ;
using BBWY.Server.Business.Extensions ;
namespace BBWY.Server.Business
{
public class TestBusiness : BasePlatformRelayBusiness , IDenpendency
{
private FreeSqlMultiDBManager freeSqlMultiDBManager ;
private VenderBusiness venderBusiness ;
private IFreeSql fsql ;
private OrderSyncBusiness orderSyncBusiness ;
public TestBusiness ( RestApiService restApiService ,
IOptions < GlobalConfig > options ,
FreeSqlMultiDBManager freeSqlMultiDBManager ,
VenderBusiness venderBusiness ,
YunDingBusiness yunDingBusiness ,
IFreeSql fsql ,
OrderSyncBusiness orderSyncBusiness ) : base ( restApiService , options , yunDingBusiness )
{
this . freeSqlMultiDBManager = freeSqlMultiDBManager ;
this . venderBusiness = venderBusiness ;
this . fsql = fsql ;
this . orderSyncBusiness = orderSyncBusiness ;
}
public void SyncVenderId ( )
{
var noVenderShops = freeSqlMultiDBManager . MDSfsql . Select < Shops > ( ) . Where ( s = > ! string . IsNullOrEmpty ( s . AppToken ) & & ! string . IsNullOrEmpty ( s . ShopId ) & & string . IsNullOrEmpty ( s . VenderId ) ) . ToList ( ) ;
//IList < IUpdate < Shops >> updateShops = new List<IUpdate<Shops>>();
foreach ( var noVenderShop in noVenderShops )
{
if ( string . IsNullOrEmpty ( noVenderShop . AppKey ) )
{
}
var venderResponse = venderBusiness . GetVenderInfo ( new Model . Dto . PlatformRequest ( )
{
AppKey = noVenderShop . AppKey ,
AppSecret = noVenderShop . AppSecret ,
AppToken = noVenderShop . AppToken ,
Platform = ( Enums . Platform ) noVenderShop . PlatformId
} ) ;
freeSqlMultiDBManager . MDSfsql . Update < Shops > ( noVenderShop . Id ) . Set ( s = > s . VenderId , venderResponse . VenderId ) . ExecuteAffrows ( ) ;
}
}
public void StatisticsProduct ( )
{
var shopList = venderBusiness . GetShopList ( platform : Enums . Platform . 京 东 ) ;
var list = new List < string > ( ) ;
foreach ( var shop in shopList )
{
long shopId = long . Parse ( shop . ShopId ) ;
var productCount = fsql . Select < Product > ( ) . Where ( p = > p . ShopId = = shopId )
. Where ( p = > p . State = = 8 )
. Count ( ) ;
var productSkuCount = fsql . Select < ProductSku > ( ) . Where ( p = > p . ShopId = = shopId )
. Where ( p = > p . State = = 1 )
. Count ( ) ;
var jpspu_sql = $"select count(1) as Count,t.ShopId from (select max(osku1.Id) as oskuId,max(osku1.CreateTime) as maxTime,osku1.ProductId,o.ShopId from OrderSku osku1 inner join `Order` o on osku1.OrderId=o.Id where o.OrderState !=6 and o.IsGift=0 and o.StartTime>='2022-05-01' and o.ShopId='{shopId}' Group By osku1.ProductId,o.ShopId order by maxTime desc,osku1.ProductId desc,o.ShopId desc) as t inner join orderSku osku on t.oskuId=osku.Id inner join `order` o on osku.OrderId=o.Id inner join product p on t.ProductId = p.Id where o.StorageType in (0,1) and p.state=8 group by t.ShopId" ;
//京配spu数
var jpspu = fsql . Ado . QuerySingle < JPCount > ( jpspu_sql ) ;
var jpsku_sql = $"select count(1) as Count,t.ShopId from (select max(osku1.Id) as oskuId,max(osku1.CreateTime) as maxTime,osku1.SkuId,o.ShopId from OrderSku osku1 inner join `Order` o on osku1.OrderId=o.Id where o.OrderState !=6 and o.IsGift=0 and o.StartTime>='2022-05-01' and o.ShopId='{shopId}' Group By osku1.SkuId,o.ShopId order by maxTime desc,osku1.SkuId desc,o.ShopId desc) as t inner join orderSku osku on t.oskuId=osku.Id inner join `order` o on osku.OrderId=o.Id inner join productsku psku on t.SkuId = psku.Id where o.StorageType in (0,1) and psku.State=1 group by t.ShopId" ;
var jpsku = fsql . Ado . QuerySingle < JPCount > ( jpsku_sql ) ;
//list.Add($"{shop.ShopName},{productCount},{productSkuCount},{productSkuCount}/{productCount},{jpspu?.Count ?? 0},{jpsku?.Count ?? 0},{(productCount == 0 ? 0 : Math.Round(1.0 * jpspu?.Count ?? 0 / productCount * 100, 2))}%,{(productSkuCount == 0 ? 0 : Math.Round(1.0 * jpsku?.Count ?? 0 / productSkuCount * 100, 2))}%");
var jpspuCount = jpspu ? . Count ? ? 0 ;
var jpskuCount = jpsku ? . Count ? ? 0 ;
var jpspuPercent = productCount = = 0 ? 0 : Math . Round ( 1.0 * jpspuCount / productCount * 1 0 0 , 2 ) ;
var jpskuPercent = productSkuCount = = 0 ? 0 : Math . Round ( 1.0 * jpskuCount / productSkuCount * 1 0 0 , 2 ) ;
list . Add ( $"{shop.ShopName},{productCount},{productSkuCount},{productSkuCount}/{productCount},{jpspuCount},{jpskuCount},{jpspuPercent}%,{jpskuPercent}%" ) ;
}
list . Insert ( 0 , "店铺,SPU数,SKU数,SKU/SPU,京配SPU数,京配SKU数,京配SPU占比,京配SKU占比" ) ;
var filePath = Path . Combine ( AppContext . BaseDirectory , "result.csv" ) ;
File . WriteAllLines ( filePath , list , System . Text . Encoding . UTF8 ) ;
}
public void XiuFu ( )
{
var st = DateTime . Parse ( "2023-09-01" ) ;
var orderList = fsql . Select < OrderCoupon , Order > ( ) . InnerJoin ( ( oc , o ) = > oc . OrderId = = o . Id )
. Where ( ( oc , o ) = > o . OrderState ! = Enums . OrderState . 已 取 消 & & o . StartTime > = st & & o . PreferentialAmount = = 0 )
. GroupBy ( ( oc , o ) = > oc . OrderId )
. ToList ( g = > new Order
{
Id = g . Key ,
PreferentialAmount = g . Sum ( g . Value . Item1 . CouponPrice )
} ) ;
List < IUpdate < Order > > updateOrderList = new List < IUpdate < Order > > ( ) ;
var totalCount = orderList . Count ( ) ;
for ( var i = 0 ; i < totalCount ; i + + )
{
var order = orderList [ i ] ;
updateOrderList . Add ( fsql . Update < Order > ( order . Id ) . Set ( o = > o . PreferentialAmount , order . PreferentialAmount ) ) ;
if ( updateOrderList . Count ( ) = = 5 0 )
{
Console . WriteLine ( $"执行数据库更新 {i}/{totalCount}" ) ;
fsql . Transaction ( ( ) = >
{
foreach ( var update in updateOrderList )
update . ExecuteAffrows ( ) ;
} ) ;
updateOrderList . Clear ( ) ;
}
}
if ( updateOrderList . Count ( ) > 0 )
{
fsql . Transaction ( ( ) = >
{
foreach ( var update in updateOrderList )
update . ExecuteAffrows ( ) ;
} ) ;
updateOrderList . Clear ( ) ;
}
Console . WriteLine ( "更新完毕" ) ;
}
public void RepairSkuDetailAndSkuGriooProfit ( RepairSkuDetailAndSkuGriooProfit request )
{
request . EndTime = request . EndTime . Date . AddDays ( 1 ) . AddSeconds ( - 1 ) ;
var banedList = new List < string > ( )
{
"森王汽车用品专营店" ,
"森王玩具专营店" ,
"广发玩具专营店" ,
"广发汽车用品专营店" ,
"言义汽车用品专营店" ,
"杰博玩具专营店" ,
"安吉玩具专营店" ,
"布莱特玩具专营店" ,
"畅阳汽车用品专营店" ,
"熊猴汽车用品专营店" ,
"布莱特汽车用品专营店" ,
"越驭玩具专营店" ,
"言义玩具专营店" ,
"瑞源汽车用品专营店" ,
"熊猴玩具专营店" ,
"奥德汽车用品专营店" ,
"创天户外专营店" ,
"桑妮玩具专营店" ,
"瑞源玩具专营店"
} ;
var shopList = venderBusiness . GetShopList ( request . ShopId , Enums . Platform . 京 东 ) ;
var shopIndex = 0 ;
foreach ( var shop in shopList )
{
shopIndex + + ;
Console . WriteLine ( $"shopProgress {shopIndex}/{shopList.Count()}" ) ;
var shopId = long . Parse ( shop . ShopId ) ;
if ( banedList . Contains ( shop . ShopName ) )
continue ;
var orderIdList = fsql . Select < Order > ( )
. Where ( o = > o . ShopId = = shopId & &
o . OrderState ! = Enums . OrderState . 已 取 消 & &
o . StorageType ! = Enums . StorageType . SD & &
o . StartTime > = request . StartTime & &
o . StartTime < = request . EndTime )
. ToList ( o = > o . Id ) ;
//fsql.Transaction(() =>
//{
// fsql.Delete<OrderTotalInfo>(orderIdList).ExecuteAffrows();
// fsql.Delete<OrderCoupon_New>().Where(on => orderIdList.Contains(on.OrderId)).ExecuteAffrows();
// fsql.Delete<OrderPromotion>().Where(op => orderIdList.Contains(op.OrderId)).ExecuteAffrows();
//});
//foreach (var orderId in orderIdList)
//{
// orderSyncBusiness.SyncOrder(shop, orderId);
// Thread.Sleep(500);
//}
var orderList = fsql . Select < Order > ( orderIdList ) . ToList ( ) ;
var orderSkuList = fsql . Select < OrderSku > ( ) . Where ( osku = > osku . Price > 0 & & orderIdList . Contains ( osku . OrderId ) ) . ToList ( ) ;
var orderCostDetailList = fsql . Select < OrderCostDetail > ( ) . Where ( ocd = > orderIdList . Contains ( ocd . OrderId ) & & ocd . IsEnabled = = true ) . ToList ( ) ;
var orderIndex = 0 ;
foreach ( var order in orderList )
{
orderIndex + + ;
Console . WriteLine ( $"shopProgress {shopIndex}/{shopList.Count()}, orderProgress {orderIndex}/{orderList.Count()}" ) ;
var currentOrderCostDetailList = orderCostDetailList . Where ( ocd = > ocd . OrderId = = order . Id ) . ToList ( ) ;
if ( currentOrderCostDetailList . Count ( ) > 0 )
{
List < IUpdate < OrderCostDetail > > updateOrderCostDetailList = new List < IUpdate < OrderCostDetail > > ( ) ;
var currentOrderSkuList = orderSkuList . Where ( osku = > osku . OrderId = = order . Id ) . ToList ( ) ;
foreach ( var orderSku in currentOrderSkuList )
{
var ocd = currentOrderCostDetailList . FirstOrDefault ( x = > x . SkuId = = orderSku . SkuId ) ;
//ocd.SkuGrossProfit = ((orderSku.ShouldPay ?? 0M) + (orderSku.Coupon ?? 0M)) * ocd.DeductionQuantity - ocd.TotalCost - ocd.DeliveryExpressFreight;
ocd . CalculationSkuGrossProfit ( orderSku . ShouldPay ? ? 0 M , orderSku . PingTaiChengDanYouHuiQuan ? ? 0 M , orderSku . VenderFee ? ? 0 M , shop . PlatformCommissionRatio ? ? 0.05 M ) ;
var update = fsql . Update < OrderCostDetail > ( ocd . Id ) . Set ( x = > x . SkuGrossProfit , ocd . SkuGrossProfit ) ;
updateOrderCostDetailList . Add ( update ) ;
}
if ( updateOrderCostDetailList . Count ( ) > 0 )
{
fsql . Transaction ( ( ) = >
{
foreach ( var update in updateOrderCostDetailList )
update . ExecuteAffrows ( ) ;
} ) ;
}
}
}
}
}
}
public class JPCount
{
public int Count { get ; set ; }
public long ShopId { get ; set ; }
}
}