using BBWYB.Common.Log; using BBWYB.Common.Models; using BBWYB.Server.Model; using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Dto; using FreeSql; using Yitter.IdGenerator; namespace BBWYB.Server.Business { public class PurchaserBusiness : BaseBusiness, IDenpendency { private FreeSqlMultiDBManager _freeSqlMultiDBManager; public PurchaserBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, FreeSqlMultiDBManager freeSqlMultiDBManager) : base(fsql, nLogManager, idGenerator) { this._freeSqlMultiDBManager = freeSqlMultiDBManager; } public ListResponse QueryPurchaserNameList(string keywords) { if (string.IsNullOrEmpty(keywords)) throw new BusinessException("关键字不能为空"); var list = fsql.Select().Where(p => p.Name.Contains(keywords)).Distinct().ToList(x => x.Name); return new ListResponse { Items = list, TotalCount = list.Count() }; } public ListResponse QueryPurchaserLocationList(string keywords) { if (string.IsNullOrEmpty(keywords)) throw new BusinessException("关键字不能为空"); var list = fsql.Select().Where(p => p.Location.Contains(keywords)).Distinct().ToList(x => x.Location); return new ListResponse { Items = list, TotalCount = list.Count() }; } public ListResponse QueryPurchaserList(QueryPurchaserRequest request) { //默认ShopId为空 request.ShopId = null; #region 数据验证 if (request.RecentDayCondition != null && request.RecentDayCondition.RecentDay > 0) { if (request.RecentDayCondition.PurchasedCountComparisonOperator != null) { if (request.RecentDayCondition.PurchasedCount == null || (request.RecentDayCondition.PurchasedCountComparisonOperator == Enums.ComparisonOperator.介于 && request.RecentDayCondition.PurchasedCount2 == null)) throw new BusinessException("采购量条件不完整"); } if (request.RecentDayCondition.PurchasedAmountComparisonOperator != null) { if (request.RecentDayCondition.PurchasedAmount == null || (request.RecentDayCondition.PurchasedAmountComparisonOperator == Enums.ComparisonOperator.介于 && request.RecentDayCondition.PurchasedAmount2 == null)) throw new BusinessException("采购金额条件不完整"); } } #endregion if (request.PageSize > 20) request.PageSize = 20; var select = fsql.Select() .WhereIf(!string.IsNullOrEmpty(request.Spu), p => fsql.Select() .Where(psp1 => psp1.PurchaserId == p.Id && psp1.ProductId == request.Spu) .Any()) .WhereIf(!string.IsNullOrEmpty(request.Sku), p => fsql.Select() .Where(psp2 => psp2.PurchaserId == p.Id && psp2.SkuId == request.Sku) .Any()) .WhereIf(request.PurchaserNameList != null && request.PurchaserNameList.Count() > 0, p => request.PurchaserNameList.Contains(p.Name)) .WhereIf(request.CategoryIdList != null && request.CategoryIdList.Count() > 0, p => fsql.Select() .Where(per => per.PurchaserId == p.Id && request.CategoryIdList.Contains(per.ExtendedInfoId.Value)).Any()) .WhereIf(request.LocationList != null && request.LocationList.Count() > 0, p => request.LocationList.Contains(p.Location)) .WhereIf(request.ManagmentMode != null, p => p.ManagmentMode == request.ManagmentMode); if (request.RecentDayCondition != null && request.RecentDayCondition.RecentDay > 0) { var recentStartDay = DateTime.Now.Date.AddDays(request.RecentDayCondition.RecentDay.Value * -1); if (request.RecentDayCondition.PurchasedCountComparisonOperator != null && request.RecentDayCondition.PurchasedCountComparisonOperator != 0 && request.RecentDayCondition.PurchasedCount != null && request.RecentDayCondition.PurchasedCount != 0) { var childSelect = fsql.Select() .InnerJoin((opi, o) => opi.OrderId == o.Id) .WhereIf(request.ShopId != null && request.ShopId > 0, (opi, o) => opi.ShopId == request.ShopId) .Where((opi, o) => opi.IsEnabled == true && o.OrderState != Enums.OrderState.已取消 && opi.CreateTime >= recentStartDay) .GroupBy((opi, o) => opi.PurchaserId) .HavingIf(request.RecentDayCondition.PurchasedCountComparisonOperator == Enums.ComparisonOperator.等于, g => g.Count() == request.RecentDayCondition.PurchasedCount) .HavingIf(request.RecentDayCondition.PurchasedCountComparisonOperator == Enums.ComparisonOperator.小于, g => g.Count() <= request.RecentDayCondition.PurchasedCount) .HavingIf(request.RecentDayCondition.PurchasedCountComparisonOperator == Enums.ComparisonOperator.大于, g => g.Count() >= request.RecentDayCondition.PurchasedCount) .HavingIf(request.RecentDayCondition.PurchasedCountComparisonOperator == Enums.ComparisonOperator.介于, g => g.Count() >= request.RecentDayCondition.PurchasedCount && g.Count() <= request.RecentDayCondition.PurchasedCount2) .WithTempQuery(g => new { g.Value.Item1.PurchaserId, Count = g.Count() }).As("pcc"); select = select.Where(p => childSelect.Where(pcc => pcc.PurchaserId == p.Id).Any()); } if (request.RecentDayCondition.PurchasedAmountComparisonOperator != null && request.RecentDayCondition.PurchasedAmountComparisonOperator != 0 && request.RecentDayCondition.PurchasedAmount != null && request.RecentDayCondition.PurchasedAmount != 0) { var childSelect = fsql.Select() .InnerJoin((ocd, o, ori, opi) => ocd.OrderId == o.Id) .InnerJoin((ocd, o, ori, opi) => ocd.OrderId == ori.OrderId && ocd.SkuId == ori.BelongSkuId) .InnerJoin((ocd, o, ori, opi) => ori.OrderId == opi.OrderId) .WhereIf(request.ShopId != null && request.ShopId > 0, (ocd, o, ori, opi) => o.ShopId == request.ShopId) .Where((ocd, o, ori, opi) => o.OrderState != Enums.OrderState.已取消 && ocd.IsEnabled == true && opi.IsEnabled == true && opi.CreateTime >= recentStartDay) .GroupBy((ocd, o, ori, opi) => opi.PurchaserId) .HavingIf(request.RecentDayCondition.PurchasedAmountComparisonOperator == Enums.ComparisonOperator.等于, g => g.Sum(g.Value.Item1.SkuAmount + g.Value.Item1.PurchaseFreight) == request.RecentDayCondition.PurchasedAmount) .HavingIf(request.RecentDayCondition.PurchasedAmountComparisonOperator == Enums.ComparisonOperator.小于, g => g.Sum(g.Value.Item1.SkuAmount + g.Value.Item1.PurchaseFreight) <= request.RecentDayCondition.PurchasedAmount) .HavingIf(request.RecentDayCondition.PurchasedAmountComparisonOperator == Enums.ComparisonOperator.大于, g => g.Sum(g.Value.Item1.SkuAmount + g.Value.Item1.PurchaseFreight) >= request.RecentDayCondition.PurchasedAmount) .HavingIf(request.RecentDayCondition.PurchasedAmountComparisonOperator == Enums.ComparisonOperator.介于, g => g.Sum(g.Value.Item1.SkuAmount + g.Value.Item1.PurchaseFreight) >= request.RecentDayCondition.PurchasedAmount && g.Sum(g.Value.Item1.SkuAmount + g.Value.Item1.PurchaseFreight) <= request.RecentDayCondition.PurchasedAmount2) .WithTempQuery(g => new { g.Value.Item4.PurchaserId, PurchasedAmount = g.Sum(g.Value.Item1.SkuAmount + g.Value.Item1.PurchaseFreight) }).As("pca"); select = select.Where(p => childSelect.Where(pca => pca.PurchaserId == p.Id).Any()); } } var pageSelect = select.Page(request.PageIndex, request.PageSize); var sql = pageSelect.ToSql(); var purchaserList = select.Page(request.PageIndex, request.PageSize) .Count(out var count) .ToList(); if (purchaserList.Count() > 0) { var purchaserIdList = purchaserList.Select(p => p.Id).ToList(); #region 查询SPU绑定数/SKU绑定数 var bindList = fsql.Select() .InnerJoin((psp, psc) => psp.SkuPurchaseSchemeId == psc.Id) .WhereIf(request.ShopId != null && request.ShopId > 0, (psp, psc) => psc.ShopId == request.ShopId) .Where((psp, psc) => purchaserIdList.Contains(psp.PurchaserId)) .GroupBy((psp, psc) => new { psp.PurchaserId, psp.ProductId, psp.SkuId }) .ToList(g => new { g.Key.PurchaserId, g.Key.ProductId, g.Key.SkuId }); #endregion #region 查询SPU采购数/SKU采购数 var purchasedList = fsql.Select() .InnerJoin((ps, ori, opi, o) => ps.Id == ori.BelongSkuId) .InnerJoin((ps, ori, opi, o) => ori.PurchaseOrderId == opi.PurchaseOrderId && ori.OrderId == opi.OrderId) .InnerJoin((ps, ori, opi, o) => opi.OrderId == o.Id) .WhereIf(request.ShopId != null && request.ShopId > 0, (ps, ori, opi, o) => o.ShopId == request.ShopId) .Where((ps, ori, opi, o) => o.OrderState != Enums.OrderState.已取消 && opi.IsEnabled == true && purchaserIdList.Contains(opi.PurchaserId)) .GroupBy((ps, ori, opi, o) => new { opi.PurchaserId, ps.Id, ps.ProductId }) .ToList(g => new { g.Key.PurchaserId, g.Key.ProductId, SkuId = g.Key.Id }); #endregion #region 查询订单数 var poList = fsql.Select() .InnerJoin((opi, o) => opi.OrderId == o.Id) .WhereIf(request.ShopId != null && request.ShopId > 0, (opi, o) => opi.ShopId == request.ShopId) .Where((opi, o) => opi.IsEnabled == true && o.OrderState != Enums.OrderState.已取消 && purchaserIdList.Contains(opi.PurchaserId)) .GroupBy((opi, o) => opi.PurchaserId) .ToList(g => new { PurchaserId = g.Key, Count = g.Count() }); #endregion #region 查询采购金额 var purchaseAmountList = fsql.Select() .InnerJoin((ocd, o, ori, opi) => ocd.OrderId == o.Id) .InnerJoin((ocd, o, ori, opi) => ocd.OrderId == ori.OrderId && ocd.SkuId == ori.BelongSkuId) .InnerJoin((ocd, o, ori, opi) => ori.OrderId == opi.OrderId) .WhereIf(request.ShopId != null && request.ShopId > 0, (ocd, o, ori, opi) => o.ShopId == request.ShopId) .Where((ocd, o, ori, opi) => o.OrderState != Enums.OrderState.已取消 && ocd.IsEnabled == true && opi.IsEnabled == true && purchaserIdList.Contains(opi.PurchaserId)) .GroupBy((ocd, o, ori, opi) => opi.PurchaserId) .ToList(g => new { PurchaserId = g.Key, PurchaseAmount = g.Sum(g.Value.Item1.SkuAmount + g.Value.Item1.PurchaseFreight) }); #endregion #region 查询最近采购时间 var recentPurchaseTimeList = fsql.Select() .InnerJoin((opi1, o) => opi1.OrderId == o.Id) .WhereIf(request.ShopId != null && request.ShopId > 0, (opi1, o) => o.ShopId == request.ShopId) .Where((opi1, o) => o.OrderState != Enums.OrderState.已取消 && purchaserIdList.Contains(opi1.PurchaserId) && opi1.IsEnabled == true) .GroupBy((opi1, o) => opi1.PurchaserId) .WithTempQuery(g => new { MaxId = g.Max(g.Value.Item1.Id) }) .From() .InnerJoin((opi1, opi2) => opi1.MaxId == opi2.Id) .ToList((opi1, opi2) => new { opi2.PurchaserId, opi2.CreateTime }); #endregion #region 查询标签/主营类目 var purchaserExtendInfoList = fsql.Select() .InnerJoin((pei, per) => pei.Id == per.ExtendedInfoId) .Where((pei, per) => purchaserIdList.Contains(per.PurchaserId)) .ToList((pei, per) => new { pei.Id, pei.Name, pei.Type, per.PurchaserId }); #endregion #region 最近采购的店铺商品 var recent30d = DateTime.Now.AddDays(-90); var bePurchasedProductSkuList = fsql.Select() .InnerJoin((opi, opri, o, ps) => opi.OrderId == o.Id) .InnerJoin((opi, opri, o, ps) => opri.PurchaseOrderId == opi.PurchaseOrderId) .InnerJoin((opi, opri, o, ps) => opri.BelongSkuId == ps.Id) .WhereIf(request.ShopId != null && request.ShopId > 0, (opi, opri, o, ps) => o.ShopId == request.ShopId) .Where((opi, opri, o, ps) => o.OrderState != Enums.OrderState.已取消 && opi.IsEnabled == true && opi.CreateTime >= recent30d && purchaserIdList.Contains(opi.PurchaserId)) .GroupBy((opi, opri, o, ps) => new { ps.Id, opi.PurchaserId, ps.Logo, ps.SkuName, opri.SourceSkuId }) .ToList(g => new { g.Key.Id, g.Key.PurchaserId, g.Key.Logo, g.Key.SkuName, g.Key.SourceSkuId }); var belongSkuIdList = bePurchasedProductSkuList.Select(x => x.SourceSkuId).Distinct().ToList(); var belongSkuList = _freeSqlMultiDBManager.BBWYCfsql.Select(belongSkuIdList).ToList(ps => new { ps.Id, ps.Logo }); #endregion foreach (var purchaser in purchaserList) { #region SPU绑定数/SKU绑定数 var currentBindList = bindList.Where(x => x.PurchaserId == purchaser.Id).ToList(); purchaser.BindingSpuCount = currentBindList.Select(x => x.ProductId).Distinct().Count(); purchaser.BindingSkuCount = currentBindList.Select(x => x.SkuId).Count(); #endregion #region SPU采购数/SKU采购数 var currentPurchasedList = purchasedList.Where(x => x.PurchaserId == purchaser.Id).ToList(); purchaser.PurchasedSpuCount = currentPurchasedList.Select(x => x.ProductId).Distinct().Count(); purchaser.PurchasedSkuCount = currentPurchasedList.Select(x => x.SkuId).Count(); #endregion #region 订单数 purchaser.PurchasedCount = poList.FirstOrDefault(x => x.PurchaserId == purchaser.Id)?.Count ?? 0; #endregion #region 采购金额 purchaser.PurchaseAmount = purchaseAmountList.FirstOrDefault(x => x.PurchaserId == purchaser.Id)?.PurchaseAmount ?? 0; #endregion #region 最近采购时间 purchaser.LastPurchaseTime = recentPurchaseTimeList.FirstOrDefault(x => x.PurchaserId == purchaser.Id)?.CreateTime; #endregion #region 主营类目/标签 var currentExtendInfoList = purchaserExtendInfoList.Where(x => x.PurchaserId == purchaser.Id).ToList(); purchaser.CategoryList = currentExtendInfoList.Where(x => x.Type == Enums.PurchaserBasicInfoType.主营类目) .Select(x => new PurchaserExtendedInfoResponse() { Id = x.Id, Name = x.Name, Type = x.Type }).ToList(); purchaser.TagList = currentExtendInfoList.Where(x => x.Type == Enums.PurchaserBasicInfoType.标签) .Select(x => new PurchaserExtendedInfoResponse() { Id = x.Id, Name = x.Name, Type = x.Type }).ToList(); #endregion #region 最近采购店铺商品 purchaser.Recent30dProductSku = bePurchasedProductSkuList.Where(x => x.PurchaserId == purchaser.Id).Take(10).Select(x => { var belongSku = belongSkuList.FirstOrDefault(b => b.Id == x.SourceSkuId); return new RecentPurchasedSkuResponse() { Id = x.Id, Logo = belongSku?.Logo ?? x.Logo, SkuName = x.SkuName, BelongSku = x.SourceSkuId }; }).ToList(); #endregion } } return new ListResponse() { Items = purchaserList, TotalCount = count }; } public ListResponse QueryPurchaserCategoryList(QueryPurchaserExtendedRequest request) { var list = fsql.Select() .WhereIf(request.Type != null, x => x.Type == request.Type) .WhereIf(!string.IsNullOrEmpty(request.Keywords), x => x.Name.Contains(request.Keywords)) .Count(out var count) .ToList(); return new ListResponse { Items = list, TotalCount = count }; } public void EditPurchaserExtendedInfo(EditPurchaserExtendedInfoRequest request) { var insertRelationList = new List(); insertRelationList.AddRange(request.CategoryIdList.Select(x => new Purchaser_ExtendedInfo_Relation() { Id = idGenerator.NewLong(), PurchaserId = request.PurchaserId, ExtendedType = Enums.PurchaserBasicInfoType.主营类目, ExtendedInfoId = x })); insertRelationList.AddRange(request.TagIdList.Select(x => new Purchaser_ExtendedInfo_Relation() { Id = idGenerator.NewLong(), PurchaserId = request.PurchaserId, ExtendedType = Enums.PurchaserBasicInfoType.标签, ExtendedInfoId = x })); fsql.Transaction(() => { fsql.Delete().Where(r => r.PurchaserId == request.PurchaserId).ExecuteAffrows(); fsql.Update(request.PurchaserId).Set(p => p.ManagmentMode, request.ManagmentMode).ExecuteAffrows(); if (insertRelationList.Count() > 0) fsql.Insert(insertRelationList).ExecuteAffrows(); }); } } }