You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

372 lines
25 KiB

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<string> QueryPurchaserNameList(string keywords)
{
if (string.IsNullOrEmpty(keywords))
throw new BusinessException("关键字不能为空");
var list = fsql.Select<Purchaser>().Where(p => p.Name.Contains(keywords)).Distinct().ToList(x => x.Name);
return new ListResponse<string> { Items = list, TotalCount = list.Count() };
}
public ListResponse<string> QueryPurchaserLocationList(string keywords)
{
if (string.IsNullOrEmpty(keywords))
throw new BusinessException("关键字不能为空");
var list = fsql.Select<Purchaser>().Where(p => p.Location.Contains(keywords)).Distinct().ToList(x => x.Location);
return new ListResponse<string> { Items = list, TotalCount = list.Count() };
}
public ListResponse<PurchaserResponse> 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<Purchaser>()
.WhereIf(!string.IsNullOrEmpty(request.Spu), p => fsql.Select<PurchaseSchemeProduct>()
.Where(psp1 => psp1.PurchaserId == p.Id &&
psp1.ProductId == request.Spu)
.Any())
.WhereIf(!string.IsNullOrEmpty(request.Sku), p => fsql.Select<PurchaseSchemeProduct>()
.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<Purchaser_ExtendedInfo_Relation>()
.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<OrderPurchaseInfo, Order>()
.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<OrderCostDetail, Order, OrderPurchaseRelationInfo, OrderPurchaseInfo>()
.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<PurchaserResponse>();
if (purchaserList.Count() > 0)
{
var purchaserIdList = purchaserList.Select(p => p.Id).ToList();
#region 查询SPU绑定数/SKU绑定数
var bindList = fsql.Select<PurchaseSchemeProduct, PurchaseScheme>()
.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<SkuHistoryPurchaserRelation, ProductSku>()
.InnerJoin((spr, ps) => spr.SkuId == ps.Id)
.WhereIf(request.ShopId != null && request.ShopId > 0, (spr, ps) => spr.ShopId == request.ShopId)
.Where((spr, ps) => purchaserIdList.Contains(spr.PurchaserId))
.GroupBy((spr, ps) => new { spr.PurchaserId, spr.SkuId, ps.ProductId })
.ToList(g => new
{
g.Key.PurchaserId,
g.Key.ProductId,
g.Key.SkuId
});
#endregion
#region 查询订单数
var poList = fsql.Select<OrderPurchaseInfo, Order>()
.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<OrderCostDetail, Order, OrderPurchaseRelationInfo, OrderPurchaseInfo>()
.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<OrderPurchaseInfo, Order>()
.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<OrderPurchaseInfo>()
.InnerJoin((opi1, opi2) => opi1.MaxId == opi2.Id)
.ToList((opi1, opi2) => new
{
opi2.PurchaserId,
opi2.CreateTime
});
#endregion
#region 查询标签/主营类目
var purchaserExtendInfoList = fsql.Select<PurchaserExtendedInfo, Purchaser_ExtendedInfo_Relation>()
.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<OrderPurchaseInfo, OrderPurchaseRelationInfo, Order, ProductSku>()
.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<BBWYB.Server.Model.Db.BBWY.ProductSku>(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<PurchaserResponse>()
{
Items = purchaserList,
TotalCount = count
};
}
public ListResponse<PurchaserExtendedInfoResponse> QueryPurchaserCategoryList(QueryPurchaserExtendedRequest request)
{
var list = fsql.Select<PurchaserExtendedInfo>()
.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<PurchaserExtendedInfoResponse>();
return new ListResponse<PurchaserExtendedInfoResponse> { Items = list, TotalCount = count };
}
public void EditPurchaserExtendedInfo(EditPurchaserExtendedInfoRequest request)
{
var insertRelationList = new List<Purchaser_ExtendedInfo_Relation>();
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<Purchaser_ExtendedInfo_Relation>().Where(r => r.PurchaserId == request.PurchaserId).ExecuteAffrows();
fsql.Update<Purchaser>(request.PurchaserId).Set(p => p.ManagmentMode, request.ManagmentMode).ExecuteAffrows();
if (insertRelationList.Count() > 0)
fsql.Insert(insertRelationList).ExecuteAffrows();
});
}
}
}