using BBWY.Common.Models;
using BBWY.Server.Model;
using BBWY.Server.Model.Db;
using BBWY.Server.Model.Dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Yitter.IdGenerator;

namespace BBWY.Server.Business.Statistics
{
    public class JDReportFormStatisticsBusiness : BaseBusiness, IDenpendency
    {
        public JDReportFormStatisticsBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator) : base(fsql, nLogManager, idGenerator)
        {

        }

        public IList<JDMultiLevelGOIResponse> CalculationCampaignLevelGOI(GOIRequest gOIRequest)
        {
            var _7dEndDate = DateTime.Now.Date.AddDays(-1);
            var _7dStartDate = _7dEndDate.AddDays(-6);
            var _7dEndTime = _7dEndDate.AddDays(1).AddSeconds(-1);

            var _30dEndDate = DateTime.Now.Date.AddDays(-1);
            var _30dStartDate = _30dEndDate.AddDays(-29);
            var _30dEndTime = _30dEndDate.AddDays(1).AddSeconds(-1);

            var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1);

            var _7dCampaignCosts = fsql.Select<JDPopularizeCampaign>().Where(x => gOIRequest.LevelIdList.Contains(x.CampaignId.Value) &&
                                                                                  x.Date >= _7dStartDate &&
                                                                                  x.Date <= _7dEndDate)
                                                                      .GroupBy(x => x.CampaignId)
                                                                      .ToList(g => new
                                                                      {
                                                                          Cost = g.Sum(g.Value.Cost),
                                                                          CampaignId = g.Key
                                                                      });

            var _7dCampaignProfits = 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.CampaignId.Value) &&
                                                                                                     jr.CookieTime >= _7dStartDate &&
                                                                                                     jr.CookieTime <= _7dEndTime &&
                                                                                                     o.OrderState != Enums.OrderState.已取消)
                                                                               .GroupBy((jr, oc, o) => jr.CampaignId)
                                                                               .ToList(g => new
                                                                               {
                                                                                   CampaignId = g.Key,
                                                                                   Profit = g.Sum(g.Value.Item2.Profit)
                                                                               });

            var _30dCampaignCosts = fsql.Select<JDPopularizeCampaign>().Where(x => gOIRequest.LevelIdList.Contains(x.CampaignId.Value) &&
                                                                                 x.Date >= _30dStartDate &&
                                                                                 x.Date <= _30dEndDate)
                                                                     .GroupBy(x => x.CampaignId)
                                                                     .ToList(g => new
                                                                     {
                                                                         Cost = g.Sum(g.Value.Cost),
                                                                         CampaignId = g.Key
                                                                     });

            var _30dCampaignProfits = 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.CampaignId.Value) &&
                                                                                                     jr.CookieTime >= _30dStartDate &&
                                                                                                     jr.CookieTime <= _30dEndTime &&
                                                                                                     o.OrderState != Enums.OrderState.已取消)
                                                                               .GroupBy((jr, oc, o) => jr.CampaignId)
                                                                               .ToList(g => new
                                                                               {
                                                                                   CampaignId = g.Key,
                                                                                   Profit = g.Sum(g.Value.Item2.Profit)
                                                                               });

            var customDaysCampaignCosts = fsql.Select<JDPopularizeCampaign>().Where(x => gOIRequest.LevelIdList.Contains(x.CampaignId.Value) &&
                                                                                 x.Date >= gOIRequest.StartDate &&
                                                                                 x.Date <= gOIRequest.EndDate)
                                                                     .GroupBy(x => x.CampaignId)
                                                                     .ToList(g => new
                                                                     {
                                                                         Cost = g.Sum(g.Value.Cost),
                                                                         CampaignId = g.Key
                                                                     });

            var customDaysCampaignProfits = 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.CampaignId.Value) &&
                                                                                                     jr.CookieTime >= gOIRequest.StartDate &&
                                                                                                     jr.CookieTime <= customEndTime &&
                                                                                                     o.OrderState != Enums.OrderState.已取消)
                                                                               .GroupBy((jr, oc, o) => jr.CampaignId)
                                                                               .ToList(g => new
                                                                               {
                                                                                   CampaignId = g.Key,
                                                                                   Profit = g.Sum(g.Value.Item2.Profit)
                                                                               });

            var totalCampaginCosts = fsql.Select<JDPopularizeCampaign>().Where(x => gOIRequest.LevelIdList.Contains(x.CampaignId.Value))
                                                                        .GroupBy(x => x.CampaignId)
                                                                        .ToList(g => new
                                                                        {
                                                                            Cost = g.Sum(g.Value.Cost),
                                                                            CampaignId = 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 = _7dCampaignCosts.FirstOrDefault(x => x.CampaignId == levelId)?.Cost ?? 0M;
                goiResponse._7GOI.Profit = _7dCampaignProfits.FirstOrDefault(x => x.CampaignId == levelId)?.Profit ?? 0M;

                goiResponse._30GOI.Cost = _30dCampaignCosts.FirstOrDefault(x => x.CampaignId == levelId)?.Cost ?? 0M;
                goiResponse._30GOI.Profit = _30dCampaignProfits.FirstOrDefault(x => x.CampaignId == levelId)?.Profit ?? 0M;

                goiResponse.CustomDaysGOI.Cost = customDaysCampaignCosts.FirstOrDefault(x => x.CampaignId == levelId)?.Cost ?? 0M;
                goiResponse.CustomDaysGOI.Profit = customDaysCampaignProfits.FirstOrDefault(x => x.CampaignId == levelId)?.Profit ?? 0M;

                goiResponse.TotalCost = totalCampaginCosts.FirstOrDefault(x => x.CampaignId == levelId)?.Cost ?? 0M;
                list.Add(goiResponse);
            }
            return list;
        }

        public IList<JDMultiLevelGOIResponse> CalculationAdGroupLevelGOI(GOIRequest gOIRequest)
        {
            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;
        }

        public IList<JDMultiLevelGOIResponse> CalculationAdLevelGOI(GOIRequest gOIRequest)
        {
            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 _7dAdCosts = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.AdId.Value) &&
                                                                             x.Date >= _7dStartDate &&
                                                                             x.Date <= _7dEndDate)
                                                                     .GroupBy(x => x.AdId)
                                                                     .ToList(g => new
                                                                     {
                                                                         Cost = g.Sum(g.Value.Cost),
                                                                         AdId = g.Key
                                                                     });

            var _7dAdProfits = 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.AdId.Value) &&
                                                                                                           jr.CookieTime >= _7dStartDate &&
                                                                                                           jr.CookieTime <= _7dEndTime &&
                                                                                                           o.OrderState != Enums.OrderState.已取消)
                                                                                        .GroupBy((jr, oc, o) => jr.AdId)
                                                                                        .ToList(g => new
                                                                                        {
                                                                                            AdId = g.Key,
                                                                                            Profit = g.Sum(g.Value.Item2.Profit)
                                                                                        });

            var _30dAdCosts = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.AdId.Value) &&
                                                                                 x.Date >= _30dStartDate &&
                                                                                 x.Date <= _30dEndDate)
                                                                     .GroupBy(x => x.AdId)
                                                                     .ToList(g => new
                                                                     {
                                                                         Cost = g.Sum(g.Value.Cost),
                                                                         AdId = g.Key
                                                                     });

            var _30dAdProfits = 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.AdId.Value) &&
                                                                                                           jr.CookieTime >= _30dStartDate &&
                                                                                                           jr.CookieTime <= _30dEndTime &&
                                                                                                           o.OrderState != Enums.OrderState.已取消)
                                                                                        .GroupBy((jr, oc, o) => jr.AdId)
                                                                                        .ToList(g => new
                                                                                        {
                                                                                            AdId = g.Key,
                                                                                            Profit = g.Sum(g.Value.Item2.Profit)
                                                                                        });

            var customDaysAdCosts = fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.AdId.Value) &&
                                                                                 x.Date >= gOIRequest.StartDate &&
                                                                                 x.Date <= gOIRequest.EndDate)
                                                                     .GroupBy(x => x.AdId)
                                                                     .ToList(g => new
                                                                     {
                                                                         Cost = g.Sum(g.Value.Cost),
                                                                         AdId = g.Key
                                                                     });

            var customDaysAdProfits = 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.AdId.Value) &&
                                                                                                           jr.CookieTime >= gOIRequest.StartDate &&
                                                                                                           jr.CookieTime <= customEndTime &&
                                                                                                           o.OrderState != Enums.OrderState.已取消)
                                                                                        .GroupBy((jr, oc, o) => jr.AdId)
                                                                                        .ToList(g => new
                                                                                        {
                                                                                            AdId = g.Key,
                                                                                            Profit = g.Sum(g.Value.Item2.Profit)
                                                                                        });

            var totalAdCosts = fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.AdId.Value))
                                                                 .GroupBy(x => x.AdId)
                                                                 .ToList(g => new
                                                                 {
                                                                     Cost = g.Sum(g.Value.Cost),
                                                                     AdId = 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 = _7dAdCosts == null ? 0 : (_7dAdCosts.FirstOrDefault(x => x.AdId == levelId)?.Cost ?? 0M);
                goiResponse._7GOI.Profit = _7dAdProfits == null ? 0 : (_7dAdProfits.FirstOrDefault(x => x.AdId == levelId)?.Profit ?? 0M);

                goiResponse._30GOI.Cost = _30dAdCosts == null ? 0 : (_30dAdCosts.FirstOrDefault(x => x.AdId == levelId)?.Cost ?? 0M);
                goiResponse._30GOI.Profit = _30dAdProfits == null ? 0 : (_30dAdProfits.FirstOrDefault(x => x.AdId == levelId)?.Profit ?? 0M);

                goiResponse.CustomDaysGOI.Cost = customDaysAdCosts.FirstOrDefault(x => x.AdId == levelId)?.Cost ?? 0M;
                goiResponse.CustomDaysGOI.Profit = customDaysAdProfits.FirstOrDefault(x => x.AdId == levelId)?.Profit ?? 0M;

                goiResponse.TotalCost = totalAdCosts.FirstOrDefault(x => x.AdId == levelId)?.Cost ?? 0M;
                list.Add(goiResponse);
            }
            return list;
        }

        public IList<JDSkuLevelGOIResponse> CalculationSkuLevelGOI(SkuGOIRequest gOIRequest)
        {
            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 _7dSkuCosts = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.Sku) &&
                                                                             x.BusinessType == 134217728 &&
                                                                             x.Date >= _7dStartDate &&
                                                                             x.Date <= _7dEndDate)
                                                                     .GroupBy(x => x.Sku)
                                                                     .ToList(g => new
                                                                     {
                                                                         Cost = g.Sum(g.Value.Cost),
                                                                         Sku = g.Key
                                                                     });

            var _7dSkuProfits = 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.PopularizeSku) &&
                                                                                                        jr.BusinessType == 134217728 &&
                                                                                                        jr.CookieTime >= _7dStartDate &&
                                                                                                        jr.CookieTime <= _7dEndTime &&
                                                                                                        o.OrderState != Enums.OrderState.已取消)
                                                                                  .GroupBy((jr, oc, o) => jr.PopularizeSku)
                                                                                  .ToList(g => new
                                                                                  {
                                                                                      Sku = g.Key,
                                                                                      Profit = g.Sum(g.Value.Item2.Profit)
                                                                                  });

            var _30dSkuCosts = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.Sku) &&
                                                                           x.BusinessType == 134217728 &&
                                                                           x.Date >= _30dStartDate &&
                                                                           x.Date <= _30dEndDate)
                                                                     .GroupBy(x => x.Sku)
                                                                     .ToList(g => new
                                                                     {
                                                                         Cost = g.Sum(g.Value.Cost),
                                                                         Sku = g.Key
                                                                     });

            var _30dSkuProfits = 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.PopularizeSku) &&
                                                                                                        jr.BusinessType == 134217728 &&
                                                                                                        jr.CookieTime >= _30dStartDate &&
                                                                                                        jr.CookieTime <= _30dEndTime &&
                                                                                                        o.OrderState != Enums.OrderState.已取消)
                                                                                  .GroupBy((jr, oc, o) => jr.PopularizeSku)
                                                                                  .ToList(g => new
                                                                                  {
                                                                                      Sku = g.Key,
                                                                                      Profit = g.Sum(g.Value.Item2.Profit)
                                                                                  });

            var customDaysSkuCosts = fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.Sku) &&
                                                                                 x.BusinessType == 134217728 &&
                                                                                 x.Date >= gOIRequest.StartDate &&
                                                                                 x.Date <= gOIRequest.EndDate)
                                                                     .GroupBy(x => x.Sku)
                                                                     .ToList(g => new
                                                                     {
                                                                         Cost = g.Sum(g.Value.Cost),
                                                                         Sku = g.Key
                                                                     });

            var customDaysSkuProfits = 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.PopularizeSku) &&
                                                                                                        jr.BusinessType == 134217728 &&
                                                                                                        jr.CookieTime >= gOIRequest.StartDate &&
                                                                                                        jr.CookieTime <= customEndTime &&
                                                                                                        o.OrderState != Enums.OrderState.已取消)
                                                                                  .GroupBy((jr, oc, o) => jr.PopularizeSku)
                                                                                  .ToList(g => new
                                                                                  {
                                                                                      Sku = g.Key,
                                                                                      Profit = g.Sum(g.Value.Item2.Profit)
                                                                                  });

            var skuTotalCosts = fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.Sku) &&
                                                                            x.BusinessType == 134217728)
                                                                .GroupBy(x => x.Sku)
                                                                .ToList(g => new
                                                                {
                                                                    Cost = g.Sum(g.Value.Cost),
                                                                    Sku = g.Key
                                                                });


            var list = new List<JDSkuLevelGOIResponse>();
            foreach (var levelId in gOIRequest.LevelIdList)
            {
                var goiResponse = new JDSkuLevelGOIResponse()
                {
                    LevelId = levelId,
                    BusinessType = gOIRequest.BusinessType
                };
                goiResponse._7GOI.Cost = _7dSkuCosts == null ? 0 : (_7dSkuCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M);
                goiResponse._7GOI.Profit = _7dSkuProfits == null ? 0 : (_7dSkuProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M);

                goiResponse._30GOI.Cost = _30dSkuCosts == null ? 0 : (_30dSkuCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M);
                goiResponse._30GOI.Profit = _30dSkuProfits == null ? 0 : (_30dSkuProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M);

                goiResponse.CustomDaysGOI.Cost = customDaysSkuCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M;
                goiResponse.CustomDaysGOI.Profit = customDaysSkuProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M;

                goiResponse.TotalCost = skuTotalCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M;
                list.Add(goiResponse);
            }
            return list;
        }

        public IList<JDProductAndPopularizeLevelGOIResponse> CalculationCampaignLevelProductGOI(GOIRequest gOIRequest)
        {
            var _7dEndDate = DateTime.Now.Date.AddDays(-1);
            var _7dStartDate = _7dEndDate.AddDays(-6);
            var _7dEndTime = _7dEndDate.AddDays(1).AddSeconds(-1);

            var _30dEndDate = DateTime.Now.Date.AddDays(-1);
            var _30dStartDate = _30dEndDate.AddDays(-29);
            var _30dEndTime = _30dEndDate.AddDays(1).AddSeconds(-1);

            var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1);

            var campaignList = fsql.Select<JDPopularizeAdSku>().Where(s => gOIRequest.LevelIdList.Contains(s.CampaignId.Value))
                                                         .GroupBy(s => new { s.CampaignId, s.Sku })
                                                         .ToList(g => new { g.Key.CampaignId, g.Key.Sku });

            var skuIds = campaignList.Select(campaign => campaign.Sku).Distinct().ToList();

            var _7dCosts = fsql.Select<JDPopularizeAdSku>()
                               .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= _7dStartDate && jas.Date <= _7dEndDate)
                               .GroupBy(jas => jas.Sku)
                               .ToList(g => new
                               {
                                   Cost = g.Sum(g.Value.Cost),
                                   Sku = g.Key
                               });

            var _7dProfits = fsql.Select<OrderCostDetail, Order>()
                                 .InnerJoin((ocd, o) => ocd.OrderId == o.Id)
                                 .Where((ocd, o) => skuIds.Contains(ocd.SkuId) &&
                                               ocd.IsEnabled &&
                                               ocd.CreateTime >= _7dStartDate &&
                                               ocd.CreateTime <= _7dEndTime &&
                                               o.OrderState != Enums.OrderState.已取消)
                                 .GroupBy((ocd, o) => ocd.SkuId)
                                 .ToList(g => new
                                 {
                                     Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
                                     Sku = g.Key
                                 });

            var _30dCosts = fsql.Select<JDPopularizeAdSku>()
                               .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= _30dStartDate && jas.Date <= _30dEndDate)
                               .GroupBy(jas => jas.Sku)
                               .ToList(g => new
                               {
                                   Cost = g.Sum(g.Value.Cost),
                                   Sku = g.Key
                               });

            var _30dProfits = fsql.Select<OrderCostDetail, Order>()
                                 .InnerJoin((ocd, o) => ocd.OrderId == o.Id)
                                 .Where((ocd, o) => skuIds.Contains(ocd.SkuId) &&
                                               ocd.IsEnabled &&
                                               ocd.CreateTime >= _30dStartDate &&
                                               ocd.CreateTime <= _30dEndTime &&
                                               o.OrderState != Enums.OrderState.已取消)
                                 .GroupBy((ocd, o) => ocd.SkuId)
                                 .ToList(g => new
                                 {
                                     Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
                                     Sku = g.Key
                                 });

            var _customCosts = fsql.Select<JDPopularizeAdSku>()
                                   .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= gOIRequest.StartDate && jas.Date <= gOIRequest.EndDate)
                                   .GroupBy(jas => jas.Sku)
                                   .ToList(g => new
                                   {
                                       Cost = g.Sum(g.Value.Cost),
                                       Sku = g.Key
                                   });

            var _customProfits = fsql.Select<OrderCostDetail, Order>()
                                 .InnerJoin((ocd, o) => ocd.OrderId == o.Id)
                                 .Where((ocd, o) => skuIds.Contains(ocd.SkuId) &&
                                               ocd.IsEnabled &&
                                               ocd.CreateTime >= gOIRequest.StartDate &&
                                               ocd.CreateTime <= customEndTime &&
                                               o.OrderState != Enums.OrderState.已取消)
                                 .GroupBy((ocd, o) => ocd.SkuId)
                                 .ToList(g => new
                                 {
                                     Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
                                     Sku = g.Key
                                 });

            var _totalCosts = fsql.Select<JDPopularizeAdSku>()
                                  .Where(jas => skuIds.Contains(jas.Sku))
                                  .GroupBy(jas => jas.Sku)
                                  .ToList(g => new
                                  {
                                      Cost = g.Sum(g.Value.Cost),
                                      Sku = g.Key
                                  });

            var list = new List<JDProductAndPopularizeLevelGOIResponse>();
            foreach (var levelId in gOIRequest.LevelIdList)
            {
                var goiResponse = new JDProductAndPopularizeLevelGOIResponse()
                {
                    LevelId = levelId
                };

                var currentLevelIdSkuIds = campaignList.Where(campaign => campaign.CampaignId == levelId).Select(campaign => campaign.Sku).Distinct().ToList();

                goiResponse._7GOI.Cost = _7dCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse._7GOI.Profit = _7dProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse._30GOI.Cost = _30dCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse._30GOI.Profit = _30dProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse.CustomDaysGOI.Cost = _customCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse.CustomDaysGOI.Profit = _customProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse.TotalCost = _totalCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                list.Add(goiResponse);
            }
            return list;
        }

        public IList<JDProductAndPopularizeLevelGOIResponse> CalculationAdGroupLevelProductGOI(GOIRequest gOIRequest)
        {
            var _7dEndDate = DateTime.Now.Date.AddDays(-1);
            var _7dStartDate = _7dEndDate.AddDays(-6);
            var _7dEndTime = _7dEndDate.AddDays(1).AddSeconds(-1);

            var _30dEndDate = DateTime.Now.Date.AddDays(-1);
            var _30dStartDate = _30dEndDate.AddDays(-29);
            var _30dEndTime = _30dEndDate.AddDays(1).AddSeconds(-1);

            var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1);

            var adGroupList = fsql.Select<JDPopularizeAdSku>().Where(s => gOIRequest.LevelIdList.Contains(s.AdGroupId.Value))
                                                         .GroupBy(s => new { s.AdGroupId, s.Sku })
                                                         .ToList(g => new { g.Key.AdGroupId, g.Key.Sku });

            var skuIds = adGroupList.Select(adGroup => adGroup.Sku).Distinct().ToList();

            var _7dCosts = fsql.Select<JDPopularizeAdSku>()
                               .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= _7dStartDate && jas.Date <= _7dEndDate)
                               .GroupBy(jas => jas.Sku)
                               .ToList(g => new
                               {
                                   Cost = g.Sum(g.Value.Cost),
                                   Sku = g.Key
                               });

            var _7dProfits = fsql.Select<OrderCostDetail, Order>()
                                 .InnerJoin((ocd, o) => ocd.OrderId == o.Id)
                                 .Where((ocd, o) => skuIds.Contains(ocd.SkuId) &&
                                               ocd.IsEnabled &&
                                               ocd.CreateTime >= _7dStartDate &&
                                               ocd.CreateTime <= _7dEndTime &&
                                               o.OrderState != Enums.OrderState.已取消)
                                 .GroupBy((ocd, o) => ocd.SkuId)
                                 .ToList(g => new
                                 {
                                     Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
                                     Sku = g.Key
                                 });

            var _30dCosts = fsql.Select<JDPopularizeAdSku>()
                               .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= _30dStartDate && jas.Date <= _30dEndDate)
                               .GroupBy(jas => jas.Sku)
                               .ToList(g => new
                               {
                                   Cost = g.Sum(g.Value.Cost),
                                   Sku = g.Key
                               });

            var _30dProfits = fsql.Select<OrderCostDetail, Order>()
                                 .InnerJoin((ocd, o) => ocd.OrderId == o.Id)
                                 .Where((ocd, o) => skuIds.Contains(ocd.SkuId) &&
                                               ocd.IsEnabled &&
                                               ocd.CreateTime >= _30dStartDate &&
                                               ocd.CreateTime <= _30dEndTime &&
                                               o.OrderState != Enums.OrderState.已取消)
                                 .GroupBy((ocd, o) => ocd.SkuId)
                                 .ToList(g => new
                                 {
                                     Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
                                     Sku = g.Key
                                 });

            var _customCosts = fsql.Select<JDPopularizeAdSku>()
                                   .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= gOIRequest.StartDate && jas.Date <= gOIRequest.EndDate)
                                   .GroupBy(jas => jas.Sku)
                                   .ToList(g => new
                                   {
                                       Cost = g.Sum(g.Value.Cost),
                                       Sku = g.Key
                                   });

            var _customProfits = fsql.Select<OrderCostDetail, Order>()
                                 .InnerJoin((ocd, o) => ocd.OrderId == o.Id)
                                 .Where((ocd, o) => skuIds.Contains(ocd.SkuId) &&
                                               ocd.IsEnabled &&
                                               ocd.CreateTime >= gOIRequest.StartDate &&
                                               ocd.CreateTime <= customEndTime &&
                                               o.OrderState != Enums.OrderState.已取消)
                                 .GroupBy((ocd, o) => ocd.SkuId)
                                 .ToList(g => new
                                 {
                                     Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
                                     Sku = g.Key
                                 });

            var _totalCosts = fsql.Select<JDPopularizeAdSku>()
                                  .Where(jas => skuIds.Contains(jas.Sku))
                                  .GroupBy(jas => jas.Sku)
                                  .ToList(g => new
                                  {
                                      Cost = g.Sum(g.Value.Cost),
                                      Sku = g.Key
                                  });

            var list = new List<JDProductAndPopularizeLevelGOIResponse>();
            foreach (var levelId in gOIRequest.LevelIdList)
            {
                var goiResponse = new JDProductAndPopularizeLevelGOIResponse()
                {
                    LevelId = levelId
                };

                var currentLevelIdSkuIds = adGroupList.Where(adGroup => adGroup.AdGroupId == levelId).Select(adGroup => adGroup.Sku).Distinct().ToList();

                goiResponse._7GOI.Cost = _7dCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse._7GOI.Profit = _7dProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse._30GOI.Cost = _30dCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse._30GOI.Profit = _30dProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse.CustomDaysGOI.Cost = _customCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse.CustomDaysGOI.Profit = _customProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse.TotalCost = _totalCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                list.Add(goiResponse);
            }
            return list;
        }

        public IList<JDProductAndPopularizeLevelGOIResponse> CalculationAdLevelProductGOI(GOIRequest gOIRequest)
        {
            var _7dEndDate = DateTime.Now.Date.AddDays(-1);
            var _7dStartDate = _7dEndDate.AddDays(-6);
            var _7dEndTime = _7dEndDate.AddDays(1).AddSeconds(-1);

            var _30dEndDate = DateTime.Now.Date.AddDays(-1);
            var _30dStartDate = _30dEndDate.AddDays(-29);
            var _30dEndTime = _30dEndDate.AddDays(1).AddSeconds(-1);

            var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1);

            var adList = fsql.Select<JDPopularizeAdSku>().Where(s => gOIRequest.LevelIdList.Contains(s.AdId.Value))
                                                         .GroupBy(s => new { s.AdId, s.Sku })
                                                         .ToList(g => new { g.Key.AdId, g.Key.Sku });

            var skuIds = adList.Select(ad => ad.Sku).Distinct().ToList();

            var _7dCosts = fsql.Select<JDPopularizeAdSku>()
                               .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= _7dStartDate && jas.Date <= _7dEndDate)
                               .GroupBy(jas => jas.Sku)
                               .ToList(g => new
                               {
                                   Cost = g.Sum(g.Value.Cost),
                                   Sku = g.Key
                               });

            var _7dProfits = fsql.Select<OrderCostDetail, Order>()
                                 .InnerJoin((ocd, o) => ocd.OrderId == o.Id)
                                 .Where((ocd, o) => skuIds.Contains(ocd.SkuId) &&
                                               ocd.IsEnabled &&
                                               ocd.CreateTime >= _7dStartDate &&
                                               ocd.CreateTime <= _7dEndTime &&
                                               o.OrderState != Enums.OrderState.已取消)
                                 .GroupBy((ocd, o) => ocd.SkuId)
                                 .ToList(g => new
                                 {
                                     Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
                                     Sku = g.Key
                                 });

            var _30dCosts = fsql.Select<JDPopularizeAdSku>()
                               .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= _30dStartDate && jas.Date <= _30dEndDate)
                               .GroupBy(jas => jas.Sku)
                               .ToList(g => new
                               {
                                   Cost = g.Sum(g.Value.Cost),
                                   Sku = g.Key
                               });

            var _30dProfits = fsql.Select<OrderCostDetail, Order>()
                                 .InnerJoin((ocd, o) => ocd.OrderId == o.Id)
                                 .Where((ocd, o) => skuIds.Contains(ocd.SkuId) &&
                                               ocd.IsEnabled &&
                                               ocd.CreateTime >= _30dStartDate &&
                                               ocd.CreateTime <= _30dEndTime &&
                                               o.OrderState != Enums.OrderState.已取消)
                                 .GroupBy((ocd, o) => ocd.SkuId)
                                 .ToList(g => new
                                 {
                                     Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
                                     Sku = g.Key
                                 });

            var _customCosts = fsql.Select<JDPopularizeAdSku>()
                                   .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= gOIRequest.StartDate && jas.Date <= gOIRequest.EndDate)
                                   .GroupBy(jas => jas.Sku)
                                   .ToList(g => new
                                   {
                                       Cost = g.Sum(g.Value.Cost),
                                       Sku = g.Key
                                   });

            var _customProfits = fsql.Select<OrderCostDetail, Order>()
                                 .InnerJoin((ocd, o) => ocd.OrderId == o.Id)
                                 .Where((ocd, o) => skuIds.Contains(ocd.SkuId) &&
                                               ocd.IsEnabled &&
                                               ocd.CreateTime >= gOIRequest.StartDate &&
                                               ocd.CreateTime <= customEndTime &&
                                               o.OrderState != Enums.OrderState.已取消)
                                 .GroupBy((ocd, o) => ocd.SkuId)
                                 .ToList(g => new
                                 {
                                     Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
                                     Sku = g.Key
                                 });

            var _totalCosts = fsql.Select<JDPopularizeAdSku>()
                                  .Where(jas => skuIds.Contains(jas.Sku))
                                  .GroupBy(jas => jas.Sku)
                                  .ToList(g => new
                                  {
                                      Cost = g.Sum(g.Value.Cost),
                                      Sku = g.Key
                                  });

            var list = new List<JDProductAndPopularizeLevelGOIResponse>();
            foreach (var levelId in gOIRequest.LevelIdList)
            {
                var goiResponse = new JDProductAndPopularizeLevelGOIResponse()
                {
                    LevelId = levelId
                };

                var currentLevelIdSkuIds = adList.Where(ad => ad.AdId == levelId).Select(ad => ad.Sku).Distinct().ToList();

                goiResponse._7GOI.Cost = _7dCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse._7GOI.Profit = _7dProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse._30GOI.Cost = _30dCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse._30GOI.Profit = _30dProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse.CustomDaysGOI.Cost = _customCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse.CustomDaysGOI.Profit = _customProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse.TotalCost = _totalCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                list.Add(goiResponse);
            }
            return list;
        }

        public IList<JDSkuLevelProductAndPopularizeGOIResponse> CalculationSkuLevelProductGOI(SkuGOIRequest gOIRequest)
        {
            var _7dEndDate = DateTime.Now.Date.AddDays(-1);
            var _7dStartDate = _7dEndDate.AddDays(-6);
            var _7dEndTime = _7dEndDate.AddDays(1).AddSeconds(-1);

            var _30dEndDate = DateTime.Now.Date.AddDays(-1);
            var _30dStartDate = _30dEndDate.AddDays(-29);
            var _30dEndTime = _30dEndDate.AddDays(1).AddSeconds(-1);

            var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1);


            var _7dCosts = fsql.Select<JDPopularizeAdSku>()
                                       .Where(jas => gOIRequest.LevelIdList.Contains(jas.Sku) &&
                                                     jas.Date >= _7dStartDate && jas.Date <= _7dEndDate)
                                       .GroupBy(jas => jas.Sku)
                                       .ToList(g => new
                                       {
                                           Cost = g.Sum(g.Value.Cost),
                                           Sku = g.Key
                                       });

            var _7dProfits = fsql.Select<OrderCostDetail, Order>()
                                 .InnerJoin((ocd, o) => ocd.OrderId == o.Id)
                                 .Where((ocd, o) => gOIRequest.LevelIdList.Contains(ocd.SkuId) &&
                                               ocd.IsEnabled &&
                                               ocd.CreateTime >= _7dStartDate &&
                                               ocd.CreateTime <= _7dEndTime &&
                                               o.OrderState != Enums.OrderState.已取消)
                                 .GroupBy((ocd, o) => ocd.SkuId)
                                 .ToList(g => new
                                 {
                                     Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
                                     Sku = g.Key
                                 });

            var _30dCosts = fsql.Select<JDPopularizeAdSku>()
                                       .Where(jas => gOIRequest.LevelIdList.Contains(jas.Sku) &&
                                                     jas.Date >= _30dStartDate && jas.Date <= _30dEndDate)
                                       .GroupBy(jas => jas.Sku)
                                       .ToList(g => new
                                       {
                                           Cost = g.Sum(g.Value.Cost),
                                           Sku = g.Key
                                       });

            var _30dProfits = fsql.Select<OrderCostDetail, Order>()
                                 .InnerJoin((ocd, o) => ocd.OrderId == o.Id)
                                 .Where((ocd, o) => gOIRequest.LevelIdList.Contains(ocd.SkuId) &&
                                               ocd.IsEnabled &&
                                               ocd.CreateTime >= _30dStartDate &&
                                               ocd.CreateTime <= _30dEndTime &&
                                               o.OrderState != Enums.OrderState.已取消)
                                 .GroupBy((ocd, o) => ocd.SkuId)
                                 .ToList(g => new
                                 {
                                     Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
                                     Sku = g.Key
                                 });

            var _customCosts = fsql.Select<JDPopularizeAdSku>()
                                       .Where(jas => gOIRequest.LevelIdList.Contains(jas.Sku) &&
                                                     jas.Date >= gOIRequest.StartDate && jas.Date <= gOIRequest.EndDate)
                                       .GroupBy(jas => jas.Sku)
                                       .ToList(g => new
                                       {
                                           Cost = g.Sum(g.Value.Cost),
                                           Sku = g.Key
                                       });

            var _customProfits = fsql.Select<OrderCostDetail, Order>()
                                 .InnerJoin((ocd, o) => ocd.OrderId == o.Id)
                                 .Where((ocd, o) => gOIRequest.LevelIdList.Contains(ocd.SkuId) &&
                                               ocd.IsEnabled &&
                                               ocd.CreateTime >= gOIRequest.StartDate &&
                                               ocd.CreateTime <= customEndTime &&
                                               o.OrderState != Enums.OrderState.已取消)
                                 .GroupBy((ocd, o) => ocd.SkuId)
                                 .ToList(g => new
                                 {
                                     Profit = g.Sum(g.Value.Item1.SkuGrossProfit),
                                     Sku = g.Key
                                 });

            var _totalSkuCosts = fsql.Select<JDPopularizeAdSku>()
                                     .Where(jas => gOIRequest.LevelIdList.Contains(jas.Sku))
                                     .GroupBy(jas => jas.Sku)
                                     .ToList(g => new
                                     {
                                         Cost = g.Sum(g.Value.Cost),
                                         Sku = g.Key
                                     });

            var list = new List<JDSkuLevelProductAndPopularizeGOIResponse>();
            foreach (var levelId in gOIRequest.LevelIdList)
            {
                var goiResponse = new JDSkuLevelProductAndPopularizeGOIResponse()
                {
                    LevelId = levelId
                };
                goiResponse._7GOI.Cost = _7dCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M;
                goiResponse._7GOI.Profit = _7dProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M;

                goiResponse._30GOI.Cost = _30dCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M;
                goiResponse._30GOI.Profit = _30dProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M;

                goiResponse.CustomDaysGOI.Cost = _customCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M;
                goiResponse.CustomDaysGOI.Profit = _customProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M;

                goiResponse.TotalCost = _totalSkuCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M;
                list.Add(goiResponse);
            }
            return list;
        }


        public IList<JDProductAndPopularizeLevelGOIResponse> CalculationCampaignLevelPopularizeGOI(GOIRequest gOIRequest)
        {
            var _7dEndDate = DateTime.Now.Date.AddDays(-1);
            var _7dStartDate = _7dEndDate.AddDays(-6);
            var _7dEndTime = _7dEndDate.AddDays(1).AddSeconds(-1);

            var _30dEndDate = DateTime.Now.Date.AddDays(-1);
            var _30dStartDate = _30dEndDate.AddDays(-29);
            var _30dEndTime = _30dEndDate.AddDays(1).AddSeconds(-1);

            var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1);

            var campaignList = fsql.Select<JDPopularizeAdSku>().Where(s => gOIRequest.LevelIdList.Contains(s.CampaignId.Value))
                                                               .GroupBy(s => new { s.CampaignId, s.Sku })
                                                               .ToList(g => new { g.Key.CampaignId, g.Key.Sku });

            var skuIds = campaignList.Select(campaign => campaign.Sku).Distinct().ToList();

            var _7dCosts = fsql.Select<JDPopularizeAdSku>()
                               .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= _7dStartDate && jas.Date <= _7dEndDate)
                               .GroupBy(jas => jas.Sku)
                               .ToList(g => new
                               {
                                   Cost = g.Sum(g.Value.Cost),
                                   Sku = g.Key
                               });

            var _7dProfits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
                                         .InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
                                          .InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
                                         .Where((jr, ocd, o) => skuIds.Contains(jr.PopularizeSku) &&
                                                             jr.CookieTime >= _7dStartDate && jr.CookieTime <= _7dEndTime &&
                                                             ocd.IsEnabled == true &&
                                                             o.OrderState != Enums.OrderState.已取消)
                                   .GroupBy((jr, ocd, o) => jr.PopularizeSku)
                                   .ToList(g => new
                                   {
                                       Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
                                       Sku = g.Key
                                   });

            var _30dCosts = fsql.Select<JDPopularizeAdSku>()
                               .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= _30dStartDate && jas.Date <= _30dEndDate)
                               .GroupBy(jas => jas.Sku)
                               .ToList(g => new
                               {
                                   Cost = g.Sum(g.Value.Cost),
                                   Sku = g.Key
                               });

            var _30dProfits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
                                         .InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
                                          .InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
                                         .Where((jr, ocd, o) => skuIds.Contains(jr.PopularizeSku) &&
                                                             jr.CookieTime >= _30dStartDate && jr.CookieTime <= _30dEndTime &&
                                                             ocd.IsEnabled == true &&
                                                             o.OrderState != Enums.OrderState.已取消)
                                   .GroupBy((jr, ocd, o) => jr.PopularizeSku)
                                   .ToList(g => new
                                   {
                                       Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
                                       Sku = g.Key
                                   });

            var _customCosts = fsql.Select<JDPopularizeAdSku>()
                                .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= gOIRequest.StartDate && jas.Date <= gOIRequest.EndDate)
                                .GroupBy(jas => jas.Sku)
                                .ToList(g => new
                                {
                                    Cost = g.Sum(g.Value.Cost),
                                    Sku = g.Key
                                });

            var _customProfits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
                                         .InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
                                          .InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
                                         .Where((jr, ocd, o) => skuIds.Contains(jr.PopularizeSku) &&
                                                             jr.CookieTime >= gOIRequest.StartDate && jr.CookieTime <= customEndTime &&
                                                             ocd.IsEnabled == true &&
                                                             o.OrderState != Enums.OrderState.已取消)
                                   .GroupBy((jr, ocd, o) => jr.PopularizeSku)
                                   .ToList(g => new
                                   {
                                       Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
                                       Sku = g.Key
                                   });

            var _totalCosts = fsql.Select<JDPopularizeAdSku>()
                                  .Where(jas => skuIds.Contains(jas.Sku))
                                  .GroupBy(jas => jas.Sku)
                                  .ToList(g => new
                                  {
                                      Cost = g.Sum(g.Value.Cost),
                                      Sku = g.Key
                                  });

            var list = new List<JDProductAndPopularizeLevelGOIResponse>();
            foreach (var levelId in gOIRequest.LevelIdList)
            {
                var goiResponse = new JDProductAndPopularizeLevelGOIResponse()
                {
                    LevelId = levelId
                };

                var currentLevelIdSkuIds = campaignList.Where(campaign => campaign.CampaignId == levelId).Select(campaign => campaign.Sku).Distinct().ToList();

                goiResponse._7GOI.Cost = _7dCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse._7GOI.Profit = _7dProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse._30GOI.Cost = _30dCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse._30GOI.Profit = _30dProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse.CustomDaysGOI.Cost = _customCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse.CustomDaysGOI.Profit = _customProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse.TotalCost = _totalCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                list.Add(goiResponse);
            }
            return list;
        }

        public IList<JDProductAndPopularizeLevelGOIResponse> CalculationAdGroupLevelPopularizeGOI(GOIRequest gOIRequest)
        {
            var _7dEndDate = DateTime.Now.Date.AddDays(-1);
            var _7dStartDate = _7dEndDate.AddDays(-6);
            var _7dEndTime = _7dEndDate.AddDays(1).AddSeconds(-1);

            var _30dEndDate = DateTime.Now.Date.AddDays(-1);
            var _30dStartDate = _30dEndDate.AddDays(-29);
            var _30dEndTime = _30dEndDate.AddDays(1).AddSeconds(-1);

            var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1);

            var adGroupList = fsql.Select<JDPopularizeAdSku>().Where(s => gOIRequest.LevelIdList.Contains(s.AdGroupId.Value))
                                                              .GroupBy(s => new { s.AdGroupId, s.Sku })
                                                              .ToList(g => new { g.Key.AdGroupId, g.Key.Sku });

            var skuIds = adGroupList.Select(adGroup => adGroup.Sku).Distinct().ToList();

            var _7dCosts = fsql.Select<JDPopularizeAdSku>()
                               .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= _7dStartDate && jas.Date <= _7dEndDate)
                               .GroupBy(jas => jas.Sku)
                               .ToList(g => new
                               {
                                   Cost = g.Sum(g.Value.Cost),
                                   Sku = g.Key
                               });

            var _7dProfits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
                                         .InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
                                          .InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
                                         .Where((jr, ocd, o) => skuIds.Contains(jr.PopularizeSku) &&
                                                             jr.CookieTime >= _7dStartDate && jr.CookieTime <= _7dEndTime &&
                                                             ocd.IsEnabled == true &&
                                                             o.OrderState != Enums.OrderState.已取消)
                                   .GroupBy((jr, ocd, o) => jr.PopularizeSku)
                                   .ToList(g => new
                                   {
                                       Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
                                       Sku = g.Key
                                   });

            var _30dCosts = fsql.Select<JDPopularizeAdSku>()
                                .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= _30dStartDate && jas.Date <= _30dEndDate)
                                .GroupBy(jas => jas.Sku)
                                .ToList(g => new
                                {
                                    Cost = g.Sum(g.Value.Cost),
                                    Sku = g.Key
                                });

            var _30dProfits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
                                         .InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
                                          .InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
                                         .Where((jr, ocd, o) => skuIds.Contains(jr.PopularizeSku) &&
                                                             jr.CookieTime >= _30dStartDate && jr.CookieTime <= _30dEndTime &&
                                                             ocd.IsEnabled == true &&
                                                             o.OrderState != Enums.OrderState.已取消)
                                   .GroupBy((jr, ocd, o) => jr.PopularizeSku)
                                   .ToList(g => new
                                   {
                                       Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
                                       Sku = g.Key
                                   });

            var _customCosts = fsql.Select<JDPopularizeAdSku>()
                                   .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= gOIRequest.StartDate && jas.Date <= gOIRequest.EndDate)
                                   .GroupBy(jas => jas.Sku)
                                   .ToList(g => new
                                   {
                                       Cost = g.Sum(g.Value.Cost),
                                       Sku = g.Key
                                   });

            var _customProfits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
                                         .InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
                                          .InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
                                         .Where((jr, ocd, o) => skuIds.Contains(jr.PopularizeSku) &&
                                                             jr.CookieTime >= gOIRequest.StartDate && jr.CookieTime <= customEndTime &&
                                                             ocd.IsEnabled == true &&
                                                             o.OrderState != Enums.OrderState.已取消)
                                   .GroupBy((jr, ocd, o) => jr.PopularizeSku)
                                   .ToList(g => new
                                   {
                                       Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
                                       Sku = g.Key
                                   });

            var _totalCosts = fsql.Select<JDPopularizeAdSku>()
                                 .Where(jas => skuIds.Contains(jas.Sku))
                                 .GroupBy(jas => jas.Sku)
                                 .ToList(g => new
                                 {
                                     Cost = g.Sum(g.Value.Cost),
                                     Sku = g.Key
                                 });

            var list = new List<JDProductAndPopularizeLevelGOIResponse>();
            foreach (var levelId in gOIRequest.LevelIdList)
            {
                var goiResponse = new JDProductAndPopularizeLevelGOIResponse()
                {
                    LevelId = levelId
                };

                var currentLevelIdSkuIds = adGroupList.Where(adGroup => adGroup.AdGroupId == levelId).Select(adGroup => adGroup.Sku).Distinct().ToList();

                goiResponse._7GOI.Cost = _7dCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse._7GOI.Profit = _7dProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse._30GOI.Cost = _30dCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse._30GOI.Profit = _30dProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse.CustomDaysGOI.Cost = _customCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse.CustomDaysGOI.Profit = _customProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse.TotalCost = _totalCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                list.Add(goiResponse);
            }
            return list;
        }

        public IList<JDProductAndPopularizeLevelGOIResponse> CalculationAdLevelPopularizeGOI(GOIRequest gOIRequest)
        {
            var _7dEndDate = DateTime.Now.Date.AddDays(-1);
            var _7dStartDate = _7dEndDate.AddDays(-6);
            var _7dEndTime = _7dEndDate.AddDays(1).AddSeconds(-1);

            var _30dEndDate = DateTime.Now.Date.AddDays(-1);
            var _30dStartDate = _30dEndDate.AddDays(-29);
            var _30dEndTime = _30dEndDate.AddDays(1).AddSeconds(-1);

            var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1);

            var adList = fsql.Select<JDPopularizeAdSku>().Where(s => gOIRequest.LevelIdList.Contains(s.AdId.Value))
                                                        .GroupBy(s => new { s.AdId, s.Sku })
                                                        .ToList(g => new { g.Key.AdId, g.Key.Sku });

            var skuIds = adList.Select(ad => ad.Sku).Distinct().ToList();

            var _7dCosts = fsql.Select<JDPopularizeAdSku>()
                               .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= _7dStartDate && jas.Date <= _7dEndDate)
                               .GroupBy(jas => jas.Sku)
                               .ToList(g => new
                               {
                                   Cost = g.Sum(g.Value.Cost),
                                   Sku = g.Key
                               });

            var _7dProfits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
                                         .InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
                                          .InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
                                         .Where((jr, ocd, o) => skuIds.Contains(jr.PopularizeSku) &&
                                                             jr.CookieTime >= _7dStartDate && jr.CookieTime <= _7dEndTime &&
                                                             ocd.IsEnabled == true &&
                                                             o.OrderState != Enums.OrderState.已取消)
                                   .GroupBy((jr, ocd, o) => jr.PopularizeSku)
                                   .ToList(g => new
                                   {
                                       Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
                                       Sku = g.Key
                                   });

            var _30dCosts = fsql.Select<JDPopularizeAdSku>()
                                .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= _30dStartDate && jas.Date <= _30dEndDate)
                                .GroupBy(jas => jas.Sku)
                                .ToList(g => new
                                {
                                    Cost = g.Sum(g.Value.Cost),
                                    Sku = g.Key
                                });

            var _30dProfits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
                                         .InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
                                          .InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
                                         .Where((jr, ocd, o) => skuIds.Contains(jr.PopularizeSku) &&
                                                             jr.CookieTime >= _30dStartDate && jr.CookieTime <= _30dEndTime &&
                                                             ocd.IsEnabled == true &&
                                                             o.OrderState != Enums.OrderState.已取消)
                                   .GroupBy((jr, ocd, o) => jr.PopularizeSku)
                                   .ToList(g => new
                                   {
                                       Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
                                       Sku = g.Key
                                   });

            var _customCosts = fsql.Select<JDPopularizeAdSku>()
                                   .Where(jas => skuIds.Contains(jas.Sku) && jas.Date >= gOIRequest.StartDate && jas.Date <= gOIRequest.EndDate)
                                   .GroupBy(jas => jas.Sku)
                                   .ToList(g => new
                                   {
                                       Cost = g.Sum(g.Value.Cost),
                                       Sku = g.Key
                                   });

            var _customProfits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
                                         .InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
                                          .InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
                                         .Where((jr, ocd, o) => skuIds.Contains(jr.PopularizeSku) &&
                                                             jr.CookieTime >= gOIRequest.StartDate && jr.CookieTime <= customEndTime &&
                                                             ocd.IsEnabled == true &&
                                                             o.OrderState != Enums.OrderState.已取消)
                                   .GroupBy((jr, ocd, o) => jr.PopularizeSku)
                                   .ToList(g => new
                                   {
                                       Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
                                       Sku = g.Key
                                   });

            var _totalCosts = fsql.Select<JDPopularizeAdSku>()
                                   .Where(jas => skuIds.Contains(jas.Sku))
                                   .GroupBy(jas => jas.Sku)
                                   .ToList(g => new
                                   {
                                       Cost = g.Sum(g.Value.Cost),
                                       Sku = g.Key
                                   });

            var list = new List<JDProductAndPopularizeLevelGOIResponse>();
            foreach (var levelId in gOIRequest.LevelIdList)
            {
                var goiResponse = new JDProductAndPopularizeLevelGOIResponse()
                {
                    LevelId = levelId
                };

                var currentLevelIdSkuIds = adList.Where(ad => ad.AdId == levelId).Select(ad => ad.Sku).Distinct().ToList();

                goiResponse._7GOI.Cost = _7dCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse._7GOI.Profit = _7dProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse._30GOI.Cost = _30dCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse._30GOI.Profit = _30dProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse.CustomDaysGOI.Cost = _customCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                goiResponse.CustomDaysGOI.Profit = _customProfits.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Profit);

                goiResponse.TotalCost = _totalCosts.Where(x => currentLevelIdSkuIds.Contains(x.Sku)).Sum(x => x.Cost);
                list.Add(goiResponse);
            }
            return list;
        }

        public IList<JDSkuLevelProductAndPopularizeGOIResponse> CalculationSkuLevelPopularizeGOI(SkuGOIRequest gOIRequest)
        {
            var _7dEndDate = DateTime.Now.Date.AddDays(-1);
            var _7dStartDate = _7dEndDate.AddDays(-6);
            var _7dEndTime = _7dEndDate.AddDays(1).AddSeconds(-1);

            var _30dEndDate = DateTime.Now.Date.AddDays(-1);
            var _30dStartDate = _30dEndDate.AddDays(-29);
            var _30dEndTime = _30dEndDate.AddDays(1).AddSeconds(-1);

            var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1);


            var _7dCosts = fsql.Select<JDPopularizeAdSku>()
                                       .Where(jas => gOIRequest.LevelIdList.Contains(jas.Sku) &&
                                                     jas.Date >= _7dStartDate && jas.Date <= _7dEndDate)
                                       .GroupBy(jas => jas.Sku)
                                       .ToList(g => new
                                       {
                                           Cost = g.Sum(g.Value.Cost),
                                           Sku = g.Key
                                       });

            var _7dProfits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
                                         .InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
                                          .InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
                                         .Where((jr, ocd, o) => gOIRequest.LevelIdList.Contains(jr.PopularizeSku) &&
                                                             jr.CookieTime >= _7dStartDate && jr.CookieTime <= _7dEndTime &&
                                                             ocd.IsEnabled == true &&
                                                             o.OrderState != Enums.OrderState.已取消)
                                   .GroupBy((jr, ocd, o) => jr.PopularizeSku)
                                   .ToList(g => new
                                   {
                                       Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
                                       Sku = g.Key
                                   });

            var _30dCosts = fsql.Select<JDPopularizeAdSku>()
                                       .Where(jas => gOIRequest.LevelIdList.Contains(jas.Sku) &&
                                                     jas.Date >= _30dStartDate && jas.Date <= _30dEndDate)
                                       .GroupBy(jas => jas.Sku)
                                       .ToList(g => new
                                       {
                                           Cost = g.Sum(g.Value.Cost),
                                           Sku = g.Key
                                       });

            var _30dProfits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
                                         .InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
                                          .InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
                                         .Where((jr, ocd, o) => gOIRequest.LevelIdList.Contains(jr.PopularizeSku) &&
                                                             jr.CookieTime >= _30dStartDate && jr.CookieTime <= _30dEndTime &&
                                                             ocd.IsEnabled == true &&
                                                             o.OrderState != Enums.OrderState.已取消)
                                   .GroupBy((jr, ocd, o) => jr.PopularizeSku)
                                   .ToList(g => new
                                   {
                                       Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
                                       Sku = g.Key
                                   });

            var _customCosts = fsql.Select<JDPopularizeAdSku>()
                                       .Where(jas => gOIRequest.LevelIdList.Contains(jas.Sku) &&
                                                     jas.Date >= gOIRequest.StartDate && jas.Date <= gOIRequest.EndDate)
                                       .GroupBy(jas => jas.Sku)
                                       .ToList(g => new
                                       {
                                           Cost = g.Sum(g.Value.Cost),
                                           Sku = g.Key
                                       });

            var _customProfits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
                                         .InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
                                          .InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
                                         .Where((jr, ocd, o) => gOIRequest.LevelIdList.Contains(jr.PopularizeSku) &&
                                                             jr.CookieTime >= gOIRequest.StartDate && jr.CookieTime <= customEndTime &&
                                                             ocd.IsEnabled == true &&
                                                             o.OrderState != Enums.OrderState.已取消)
                                   .GroupBy((jr, ocd, o) => jr.PopularizeSku)
                                   .ToList(g => new
                                   {
                                       Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
                                       Sku = g.Key
                                   });

            var _totalSkuCosts = fsql.Select<JDPopularizeAdSku>()
                                     .Where(jas => gOIRequest.LevelIdList.Contains(jas.Sku))
                                     .GroupBy(jas => jas.Sku)
                                     .ToList(g => new
                                     {
                                         Cost = g.Sum(g.Value.Cost),
                                         Sku = g.Key
                                     });

            var list = new List<JDSkuLevelProductAndPopularizeGOIResponse>();
            foreach (var levelId in gOIRequest.LevelIdList)
            {
                var goiResponse = new JDSkuLevelProductAndPopularizeGOIResponse()
                {
                    LevelId = levelId
                };
                goiResponse._7GOI.Cost = _7dCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M;
                goiResponse._7GOI.Profit = _7dProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M;

                goiResponse._30GOI.Cost = _30dCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M;
                goiResponse._30GOI.Profit = _30dProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M;

                goiResponse.CustomDaysGOI.Cost = _customCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M;
                goiResponse.CustomDaysGOI.Profit = _customProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M;

                goiResponse.TotalCost = _totalSkuCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M;
                list.Add(goiResponse);
            }
            return list;
        }
    }
}