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.Net.Http;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;

namespace BBWY.Server.Business
{
    public class TestBusiness : BasePlatformRelayBusiness, IDenpendency
    {
        private FreeSqlMultiDBManager freeSqlMultiDBManager;
        private VenderBusiness venderBusiness;
        private IFreeSql fsql;
        private OrderSyncBusiness orderSyncBusiness;
        private TaskSchedulerManager taskSchedulerManager;
        private PurchaseOrderBusiness purchaseOrderBusiness;
        public TestBusiness(RestApiService restApiService,
                            IOptions<GlobalConfig> options,
                            FreeSqlMultiDBManager freeSqlMultiDBManager,
                            VenderBusiness venderBusiness,
                            YunDingBusiness yunDingBusiness,
                            IFreeSql fsql,
                            OrderSyncBusiness orderSyncBusiness,
                            TaskSchedulerManager taskSchedulerManager,
                            PurchaseOrderBusiness purchaseOrderBusiness) : base(restApiService, options, yunDingBusiness)
        {
            this.freeSqlMultiDBManager = freeSqlMultiDBManager;
            this.venderBusiness = venderBusiness;
            this.fsql = fsql;
            this.orderSyncBusiness = orderSyncBusiness;
            this.taskSchedulerManager = taskSchedulerManager;
            this.purchaseOrderBusiness = purchaseOrderBusiness;
        }

        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 * 100, 2);
                var jpskuPercent = productSkuCount == 0 ? 0 : Math.Round(1.0 * jpskuCount / productSkuCount * 100, 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() == 50)
                {
                    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)
            {
                Task.Factory.StartNew(() =>
                {
                    Console.WriteLine(shop.ShopName);
                    //shopIndex++;
                    //Console.WriteLine($"shopProgress {shopIndex}/{shopList.Count()}");
                    var shopId = long.Parse(shop.ShopId);
                    if (banedList.Contains(shop.ShopName))
                        return;
                    var orderIdList = fsql.Select<Order>()
                                          .Where(o => o.ShopId == shopId &&
                                                      o.OrderState != Enums.OrderState.已取消 &&
                                                      o.StorageType != null && o.StorageType != Enums.StorageType.SD &&
                                                      o.StartTime >= request.StartTime &&
                                                      o.StartTime <= request.EndTime)
                                          .WhereIf(!string.IsNullOrEmpty(request.OrderId), o => o.Id == request.OrderId)
                                          .WhereIf(request.OrderIdList != null && request.OrderIdList.Count() > 0, o => request.OrderIdList.Contains(o.Id))
                                          .OrderByDescending(o => o.StartTime)
                                          .ToList(o => o.Id);

                    if (orderIdList.Count() == 0)
                        return;

                    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();
                        fsql.Update<OrderSku>().Set(osku => osku.ShouldPay, 0).Where(osku => orderIdList.Contains(osku.OrderId)).ExecuteAffrows();
                    });

                    for (var i = 0; i < orderIdList.Count(); i++)
                    {
                        var orderId = orderIdList[i];
                        orderSyncBusiness.SyncOrder(shop, orderId);
                        Console.WriteLine($"SyncOrder {shop.ShopName},SyncProgress {i + 1}/{orderIdList.Count()}");
                    }

                    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 orderCostList = fsql.Select<OrderCost>(orderIdList).ToList();
                    var afterOrderList = fsql.Select<AfterSaleOrder>().Where(af => orderIdList.Contains(af.OrderId)).ToList();
                    var orderTotalList = fsql.Select<OrderTotalInfo>().Where(on => orderIdList.Contains(on.Id)).ToList();
                    var orderIndex = 0;
                    foreach (var order in orderList)
                    {
                        orderIndex++;
                        Console.WriteLine($"Calculation {shop.ShopName}, CalculationProgress {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);
                                if (ocd != null)
                                {
                                    ocd.CalculationSkuGrossProfit(orderSku.ShouldPay ?? 0M,
                                                                  orderSku.PingTaiChengDanYouHuiQuan ?? 0M,
                                                                  orderSku.SuperRedEnvelope ?? 0M,
                                                                  orderSku.XianPinLeiDongQuan ?? 0M,
                                                                  orderSku.VenderFee ?? 0M,
                                                                  orderSku.JingDou ?? 0M,
                                                                  orderSku.DongQuan ?? 0M,
                                                                  orderSku.Balance ?? 0M,
                                                                  shop.PlatformCommissionRatio ?? 0.05M);
                                    var update = fsql.Update<OrderCostDetail>(ocd.Id).Set(x => x.SkuGrossProfit, ocd.SkuGrossProfit);
                                    updateOrderCostDetailList.Add(update);
                                }
                            }
                            var currentAfterOrderList = afterOrderList.Where(af => af.OrderId == order.Id).ToList();
                            var orderTotal = orderTotalList.FirstOrDefault(on => on.Id == order.Id);
                            var orderCost = orderCostList.FirstOrDefault(oc => oc.OrderId == order.Id);
                            if (orderCost != null && orderTotal != null)
                            {
                                var actualAmount = order.OrderSellerPrice + order.FreightPrice + (order.PingTaiChengDanYouHuiQuan ?? 0M);
                                orderCost.CalculationOrderProfitAndCost(actualAmount, currentAfterOrderList);
                                if (updateOrderCostDetailList.Count() > 0)
                                {
                                    fsql.Transaction(() =>
                                    {
                                        foreach (var update in updateOrderCostDetailList)
                                            update.ExecuteAffrows();
                                        fsql.Update<OrderCost>(orderCost.OrderId).Set(oc => oc.Profit, orderCost.Profit)
                                                                                 .Set(oc => oc.PlatformCommissionAmount, orderCost.PlatformCommissionAmount).ExecuteAffrows();
                                    });
                                }
                            }

                        }
                    }
                }, CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.RepairOrderTaskScheduler);
            }
        }

        public void RepairOrderProfit()
        {
            var startTime = DateTime.Parse("2023-12-12");
            var orderList = fsql.Select<Order>().Where(o => o.IsGift == false &&
                                                            o.OrderState != Enums.OrderState.已取消 &&
                                                            o.StorageType == Enums.StorageType.本地自发 &&
                                                            o.StartTime >= startTime)
                                                .ToList();
            var shopList = venderBusiness.GetShopList(platform: Enums.Platform.京东);
            var orderIdList = orderList.Select(o => o.Id).ToList();
            var orderCostList = fsql.Select<OrderCost>(orderIdList).ToList();
            var orderSkuList = fsql.Select<OrderSku>().Where(osku => orderIdList.Contains(osku.OrderId) && osku.Price > 0).ToList();
            var orderCostDetailList = fsql.Select<OrderCostDetail>().Where(ocd => orderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true && ocd.IsEstimateCost == false).ToList();

            List<IUpdate<OrderCost>> updateList = new List<IUpdate<OrderCost>>();
            List<IUpdate<OrderCostDetail>> updateDetailList = new List<IUpdate<OrderCostDetail>>();
            int index = 0;
            foreach (var orderCost in orderCostList)
            {
                index++;
                Console.WriteLine($"{DateTime.Now} OrderProgress {index}/{orderCostList.Count()}");
                var order = orderList.FirstOrDefault(o => o.Id == orderCost.OrderId);
                if (order == null)
                    continue;

                var shop = shopList.FirstOrDefault(s => s.ShopId == order.ShopId.ToString());

                var currentOCDList = orderCostDetailList.Where(ocd => ocd.OrderId == orderCost.OrderId).ToList();
                var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == orderCost.OrderId).ToList();
                foreach (var ocd in currentOCDList)
                {
                    var osku = currentOrderSkuList.FirstOrDefault(x => x.SkuId == ocd.SkuId);
                    if (osku == null)
                        continue;
                    ocd.CalculationSkuGrossProfit(osku.ShouldPay ?? 0M,
                                                  osku.PingTaiChengDanYouHuiQuan ?? 0M,
                                                  osku.SuperRedEnvelope ?? 0M,
                                                  osku.XianPinLeiDongQuan ?? 0M,
                                                  osku.VenderFee ?? 0M,
                                                  osku.JingDou ?? 0M,
                                                  osku.DongQuan ?? 0M,
                                                  osku.Balance ?? 0M,
                                                  shop.PlatformCommissionRatio ?? 0.05M);
                    var update = fsql.Update<OrderCostDetail>().SetSource(ocd);
                    updateDetailList.Add(update);
                }

                orderCost.PurchaseAmount = currentOCDList.Sum(ocd => ocd.TotalCost);
                orderCost.DeliveryExpressFreight = currentOCDList.Sum(ocd => ocd.DeliveryExpressFreight);

                orderCost.CalculationOrderProfitAndCost(order, null);
                updateList.Add(fsql.Update<OrderCost>(orderCost.OrderId)
                                    .Set(oc => oc.PurchaseAmount, orderCost.PurchaseAmount)
                                    .Set(oc => oc.DeliveryExpressFreight, orderCost.DeliveryExpressFreight)
                                    .Set(oc => oc.Profit, orderCost.Profit)
                                    .Set(oc => oc.PlatformCommissionAmount, orderCost.PlatformCommissionAmount));



                if (updateList.Count() > 10)
                {
                    Console.WriteLine($"{DateTime.Now} 执行数据库更新");
                    fsql.Transaction(() =>
                    {
                        foreach (var update in updateList)
                            update.ExecuteAffrows();
                        foreach (var update in updateDetailList)
                            update.ExecuteAffrows();
                    });
                    updateList.Clear();
                    updateDetailList.Clear();
                }
            }

            if (updateList.Count() > 0)
            {
                Console.WriteLine($"{DateTime.Now} 最后执行数据库更新");
                fsql.Transaction(() =>
                {
                    foreach (var update in updateList)
                        update.ExecuteAffrows();
                    foreach (var update in updateDetailList)
                        update.ExecuteAffrows();
                });
                updateList.Clear();
                updateDetailList.Clear();
            }
        }

        public void DeleteJDTask()
        {
            var appKey = "E1AA9247D5583A6D87449CE6AB290185";
            var appSecret = "e479558ddd9e40f8929cfc00c6cbbc9c";
            var appToken = "578d4074d5c04272af72de7f5fbe0ff2qwnz";
            var promotionId = 6106235467;
            var httpResult = restApiService.SendRequest(GetPlatformRelayAPIHost(Enums.Platform.京东),
                                                        "api/platformsdk/DeleteJDPromotionTask",
                                                        new DeleteJDPromotionTaskRequest()
                                                        {
                                                            AppKey = appKey,
                                                            AppSecret = appSecret,
                                                            AppToken = appToken,
                                                            Platform = Enums.Platform.京东,
                                                            PromotionId = promotionId
                                                        },
                                                        GetYunDingRequestHeader(),
                                                        HttpMethod.Post);
            if (httpResult.StatusCode != System.Net.HttpStatusCode.OK)
                throw new BusinessException(httpResult.Content);
            var response = JsonConvert.DeserializeObject<ApiResponse>(httpResult.Content);
            if (!response.Success)
                throw new BusinessException(response.Msg);
        }

        public void RepairDFOrder()
        {
            var st = DateTime.Parse("2023-11-01");
            var et = DateTime.Parse("2023-11-30 23:59:59");
            var list = fsql.Select<Order, OrderDropShipping, OrderCostDetail>()
                           .InnerJoin((o, ods, ocd) => o.Id == ods.OrderId)
                           .InnerJoin((o, ods, ocd) => o.Id == ocd.OrderId)
                           .Where((o, ods, ocd) => o.ShopId == 12897067 && o.OrderState != Enums.OrderState.已取消 && o.StartTime >= st && o.StartTime <= et && o.StorageType == Enums.StorageType.代发 && ocd.IsEnabled == true && ocd.SkuAmount == 0)
                           .ToList((o, ods, ocd) => ods.PurchaseOrderId).Distinct().ToList();

            for (var i = 0; i < list.Count; i++)
            {
                Console.WriteLine($"{i + 1}/{list.Count()},{list[i]}");
                var param = new { type = "ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY", data = new { orderId = list[i] } };
                purchaseOrderBusiness.CallbackFrom1688(JsonConvert.SerializeObject(param));
                Thread.Sleep(1000);
            }
        }

        public void Test_20231221()
        {
            var invalidOrderStateList = new List<Enums.OrderState?>() { 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<string>() { "店铺名,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<Product>().Where(p => p.ShopId == shopId).ToList();
                var productIdList = productList.Select(p => p.Id).ToList();

                var skuList = fsql.Select<OrderSku, Order>()
                                  .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<OrderSku>()
                                  .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<Order>(orderIdList).ToList(o => new Order() { Id = o.Id, ShopId = o.ShopId, OrderTotalPrice = o.OrderTotalPrice });


                #region 20
                var _20list = freeSqlMultiDBManager.JDXXfsql.Select<JDXX.Model.Db.Newskus>()
                                                            .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<JDXX.Model.Db.Newskus>()
                                                            .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<JDXX.Model.Db.Newskus>()
                                                            .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<JDXX.Model.Db.Newskus>()
                                                            .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<JDXX.Model.Db.Newskus>()
                                                            .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<JDXX.Model.Db.Newskus>()
                                                            .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
    {
        public int Count { get; set; }
        public long ShopId { get; set; }
    }


}