using BBWYB.Common.Extensions; 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 PurchaseSchemeBusiness : BaseBusiness, IDenpendency { private PurchaseProductAPIService purchaseProductAPIService; public PurchaseSchemeBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, PurchaseProductAPIService purchaseProductAPIService) : base(fsql, nLogManager, idGenerator) { this.purchaseProductAPIService = purchaseProductAPIService; } private void ExtractNewPurchaser(IList purchaserSchemeList, IList addPurchaserList) where T : InputPurchaseSchemeRequest { List reqeustPurchaserIdList = new List(); foreach (var scheme in purchaserSchemeList) reqeustPurchaserIdList.AddRange(scheme.PurchaseSchemeProductList.Select(p => p.PurchaserId)); reqeustPurchaserIdList = reqeustPurchaserIdList.Distinct().ToList(); //var reqeustPurchaserIdList = purchaserSchemeList.Select(s => s.PurchaserId).Distinct().ToList(); var existPurchaserIdList = fsql.Select().Where(p => reqeustPurchaserIdList.Contains(p.Id)).ToList(p => p.Id); var newPurchaserIdList = reqeustPurchaserIdList.Except(existPurchaserIdList); foreach (var scheme in purchaserSchemeList) { foreach (var ps in scheme.PurchaseSchemeProductList) { if (newPurchaserIdList.Any(p => p == ps.PurchaserId) && !addPurchaserList.Any(p => p.Id == ps.PurchaserId)) { addPurchaserList.Add(new Purchaser() { Id = ps.PurchaserId, Id2 = ps.PurchaserId2, Name = ps.PurchaserName, Location = ps.PurchaserLocation, Platform = ps.PurchasePlatform ?? Enums.Platform.阿里巴巴, MemberId = ps.PurchaserMemberId }); } } } } public void EditPurchaseScheme(BatchCURDSchemeRequest batchCURDSchemeRequest) { if (batchCURDSchemeRequest.EditPurchaseSchemeList.Count == 0 && batchCURDSchemeRequest.AddPurchaseSchemeList.Count == 0) throw new BusinessException("非法参数"); if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(ps => ps.PurchaseSchemeProductList.Any(pp => string.IsNullOrEmpty(pp.PurchaserId) || string.IsNullOrEmpty(pp.PurchaserName)))) throw new BusinessException("新增方案中有采购商Id/Name/Location为空"); if (batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => ps.PurchaseSchemeProductList.Any(pp => string.IsNullOrEmpty(pp.PurchaserId) || string.IsNullOrEmpty(pp.PurchaserName)))) throw new BusinessException("编辑方案中有采购商Id/Name/Location为空"); if (batchCURDSchemeRequest.EditPurchaseSchemeList.Count() > 0 && batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => ps.Id == 0)) throw new BusinessException("编辑方案中采购方案缺少Id"); List addPurchaseSchemeList = new List(); List addPurchaseSchemeProductList = new List(); List addPurchaseSchemeProductSkuList = new List(); List newPurchaserList = new List(); List deletePurchaseSchemeIdList = new List(); List> updatePurchaseSchemeList = new List>(); if (batchCURDSchemeRequest.AddPurchaseSchemeList.Count > 0) { ExtractNewPurchaser(batchCURDSchemeRequest.AddPurchaseSchemeList, newPurchaserList); foreach (var psReq in batchCURDSchemeRequest.AddPurchaseSchemeList) { var ps = new PurchaseScheme() { CreateTime = DateTime.Now, Id = idGenerator.NewLong(), ProductId = psReq.ProductId, SkuId = psReq.SkuId, ShopId = psReq.ShopId }; addPurchaseSchemeList.Add(ps); foreach (var pspReq in psReq.PurchaseSchemeProductList) { var psp = pspReq.Map(); psp.Id = idGenerator.NewLong(); psp.CreateTime = DateTime.Now; psp.SkuPurchaseSchemeId = ps.Id; addPurchaseSchemeProductList.Add(psp); foreach (var pssReq in pspReq.PurchaseSchemeProductSkuList) { var pss = pssReq.Map(); pss.Id = idGenerator.NewLong(); pss.CreateTime = DateTime.Now; pss.SkuPurchaseSchemeId = ps.Id; addPurchaseSchemeProductSkuList.Add(pss); ps.DefaultCost += ((pssReq.ActualPrice ?? pssReq.DefaultPrice) ?? 0) * (pssReq.PurchaseRatio ?? 1); } } } } #region 更新采购方案 if (batchCURDSchemeRequest.EditPurchaseSchemeList.Count > 0) { deletePurchaseSchemeIdList.AddRange(batchCURDSchemeRequest.EditPurchaseSchemeList.Select(ps => ps.Id)); foreach (var psReq in batchCURDSchemeRequest.EditPurchaseSchemeList) { var schemeId = psReq.Id; var defaultCost = 0M; foreach (var pspReq in psReq.PurchaseSchemeProductList) { var psp = pspReq.Map(); psp.Id = idGenerator.NewLong(); psp.CreateTime = DateTime.Now; psp.SkuPurchaseSchemeId = schemeId; addPurchaseSchemeProductList.Add(psp); foreach (var pssReq in pspReq.PurchaseSchemeProductSkuList) { var pss = pssReq.Map(); pss.Id = idGenerator.NewLong(); pss.CreateTime = DateTime.Now; pss.SkuPurchaseSchemeId = schemeId; addPurchaseSchemeProductSkuList.Add(pss); defaultCost += ((pssReq.ActualPrice ?? pssReq.DefaultPrice) ?? 0) * (pssReq.PurchaseRatio ?? 1); } } var psupdate = fsql.Update(schemeId) .Set(ps => ps.DefaultCost, defaultCost); updatePurchaseSchemeList.Add(psupdate); } //var editPurchaseSchemeList = batchCURDSchemeRequest.EditPurchaseSchemeList.Map>(); //foreach (var scheme in editPurchaseSchemeList) //{ // foreach (var purchaseProduct in scheme.PurchaseSchemeProductList) // { // purchaseProduct.Id = idGenerator.NewLong(); // purchaseProduct.CreateTime = DateTime.Now; // purchaseProduct.SkuPurchaseSchemeId = scheme.Id; // foreach (var purchaseProductSku in purchaseProduct.PurchaseSchemeProductSkuList) // { // purchaseProductSku.Id = idGenerator.NewLong(); // purchaseProductSku.CreateTime = DateTime.Now; // purchaseProductSku.SkuPurchaseSchemeId = scheme.Id; // } // addPurchaseSchemeProductSkuList.AddRange(purchaseProduct.PurchaseSchemeProductSkuList); // } // addPurchaseSchemeProductList.AddRange(scheme.PurchaseSchemeProductList); //} } #endregion foreach (var purchaseProductSku in addPurchaseSchemeProductSkuList) { if (purchaseProductSku.PurchaseRatio == null) purchaseProductSku.PurchaseRatio = 1; } fsql.Transaction(() => { if (newPurchaserList.Count > 0) fsql.Insert(newPurchaserList).ExecuteAffrows(); //更新,删除已存在的采购方案商品和Sku if (deletePurchaseSchemeIdList.Count > 0) { fsql.Delete().Where(p => deletePurchaseSchemeIdList.Contains(p.SkuPurchaseSchemeId)).ExecuteAffrows(); fsql.Delete().Where(p => deletePurchaseSchemeIdList.Contains(p.SkuPurchaseSchemeId)).ExecuteAffrows(); } //新增 if (addPurchaseSchemeList != null && addPurchaseSchemeList.Count > 0) fsql.Insert(addPurchaseSchemeList).ExecuteAffrows(); if (addPurchaseSchemeProductList.Count > 0) fsql.Insert(addPurchaseSchemeProductList).ExecuteAffrows(); if (addPurchaseSchemeProductSkuList.Count > 0) fsql.Insert(addPurchaseSchemeProductSkuList).ExecuteAffrows(); if (updatePurchaseSchemeList.Count() > 0) { foreach (var update in updatePurchaseSchemeList) update.ExecuteAffrows(); } }); } /// /// 获取采购方案 /// /// /// public IList GetPurchaseSchemeList(QuerySchemeRequest request) { var select = fsql.Select(); if (request.SchemeId != null && request.SchemeId != 0) select = select.Where(ps => ps.Id == request.SchemeId); else if (request.SchemeIdList != null && request.SchemeIdList.Count() > 0) select = select.Where(ps => request.SchemeIdList.Contains(ps.Id)); else { select = select.WhereIf(request.ShopId != null && request.ShopId != 0, ps => ps.ShopId == request.ShopId) .WhereIf(request.SkuIdList != null && request.SkuIdList.Count() > 0, ps => request.SkuIdList.Contains(ps.SkuId)); if (request.PurchasePlatform != null || !string.IsNullOrEmpty(request.PurchaserId)) { select = select.Where(ps => fsql.Select() .InnerJoin((psp, p) => psp.PurchaserId == p.Id) .WhereIf(request.PurchasePlatform != null, (psp, p) => p.Platform == request.PurchasePlatform) .WhereIf(!string.IsNullOrEmpty(request.PurchaserId), (psp, p) => psp.PurchaserId == request.PurchaserId) .Where((psp, p) => psp.SkuPurchaseSchemeId == ps.Id).Any()); } } var sql = select.ToSql(); var purchaseSchemeList = select.ToList(); if (purchaseSchemeList.Count > 0) { var purchaseSchemeIdList = purchaseSchemeList.Select(p => p.Id).ToList(); var purchaseSchemeProductList = fsql.Select() .InnerJoin((psp, p) => psp.PurchaserId == p.Id) .Where((psp, p) => purchaseSchemeIdList.Contains(psp.SkuPurchaseSchemeId)) .ToList((psp, p) => new PurchaseSchemeProductResponse { CreateTime = psp.CreateTime, Id = psp.Id, ProductId = psp.ProductId, PurchaseProductId = psp.PurchaseProductId, PurchaseUrl = psp.PurchaseUrl, SkuId = psp.SkuId, SkuPurchaseSchemeId = psp.SkuPurchaseSchemeId, PurchaserId = p.Id, PurchaserId2 = p.Id2, PurchaserLocation = p.Location, PurchaserName = p.Name, PurchasePlatform = p.Platform, PurchaserMemberId = p.MemberId }); var purchaseSchemeProductSkuList = fsql.Select().Where(p => purchaseSchemeIdList.Contains(p.SkuPurchaseSchemeId)) .ToList().Map>(); foreach (var scheme in purchaseSchemeList) { var schemeProductList = purchaseSchemeProductList.Where(ps => ps.SkuPurchaseSchemeId == scheme.Id); if (schemeProductList.Count() > 0) { scheme.PurchaseSchemeProductList.AddRange(schemeProductList); foreach (var schemeProduct in schemeProductList) { var schemeProductSkuList = purchaseSchemeProductSkuList.Where(psk => psk.SkuPurchaseSchemeId == scheme.Id && psk.PurchaseProductId == schemeProduct.PurchaseProductId); if (schemeProductSkuList.Count() > 0) schemeProduct.PurchaseSchemeProductSkuList.AddRange(schemeProductSkuList); } } #region 封装采购商 foreach (var schemeProduct in schemeProductList) { if (!scheme.PurchaserList.Any(p => p.Id == schemeProduct.PurchaserId)) { scheme.PurchaserList.Add(new Purchaser() { Id = schemeProduct.PurchaserId, Id2 = schemeProduct.PurchaserId2, Location = schemeProduct.PurchaserLocation, Name = schemeProduct.PurchaserName, Platform = schemeProduct.PurchasePlatform, MemberId = schemeProduct.PurchaserMemberId }); } } #endregion #region 获取采购方案基本信息 if (request.IncludePurchaseSkuBasicInfo == 1) { foreach (var schemeProduct in schemeProductList) { try { var basicInfo = GetPurchaseSkuBasicInfo(new PurchaseSkuBasicInfoRequest() { FirstApiMode = Enums.PurchaseProductAPIMode.Spider, PriceMode = Enums.PurchaseOrderMode.批发, Platform = schemeProduct.PurchasePlatform ?? Enums.Platform.阿里巴巴, PurchaseProductId = schemeProduct.PurchaseProductId }); if (basicInfo != null) { foreach (var schemeProductSku in schemeProduct.PurchaseSchemeProductSkuList) { var basicSku = basicInfo.ItemList.FirstOrDefault(x => x.PurchaseSkuId == schemeProductSku.PurchaseSkuId); if (basicSku != null) { schemeProductSku.PurchaseSkuTitle = basicSku.Title; schemeProductSku.PurchaseSkuPrice = basicSku.Price; schemeProductSku.PurchaseSkuLogo = basicSku.Logo; } } } } catch { } } } #endregion } } return purchaseSchemeList; } public IList GetPurchaseSchemeCountList(QuerySchemeCountRequest request) { var list = fsql.Select().Where(ps => ps.ShopId == request.ShopId && request.SkuIdList.Contains(ps.SkuId)) .GroupBy(ps => ps.SkuId) .ToList(g => new PurchaseSchemeCountResponse() { SkuId = g.Key, SchemeCount = g.Count() }); return list; } public IList RefreshPurchaseScheme(RefreshSchemeRequest request) { var purchaseSchemeList = GetPurchaseSchemeList(new QuerySchemeRequest() { SchemeIdList = request.SchemeIdList, IncludePurchaseSkuBasicInfo = 1 }); List> updatePurchaseSchemeList = new List>(); foreach (var ps in purchaseSchemeList) { var defaultCost = 0M; foreach (var psp in ps.PurchaseSchemeProductList) { foreach (var pss in psp.PurchaseSchemeProductSkuList) { defaultCost += ((pss.ActualPrice ?? pss.PurchaseSkuPrice) ?? 0) * (pss.PurchaseRatio ?? 1); } } if (ps.DefaultCost != defaultCost) { var update = fsql.Update(ps.Id).Set(p => p.DefaultCost, defaultCost); updatePurchaseSchemeList.Add(update); } } if (updatePurchaseSchemeList.Count() > 0) { fsql.Transaction(() => { foreach (var update in updatePurchaseSchemeList) update.ExecuteAffrows(); }); } return purchaseSchemeList; } ///// ///// 获取共同拥有的采购商 ///// ///// ///// //public IList GetSharePurchaser(QuerySchemeRequest querySchemeRequest) //{ // var skuCount = querySchemeRequest.SkuIdList.Count(); // var purchaseSchemeList = fsql.Select().InnerJoin((ps, p) => ps.PurchaserId == p.Id) // .Where((ps, p) => ps.ShopId == querySchemeRequest.ShopId) // .Where((ps, p) => querySchemeRequest.SkuIdList.Contains(ps.SkuId)) // .ToList(); // if (purchaseSchemeList.Count() == 0) // return null; // var group = purchaseSchemeList.GroupBy(p => p.PurchaserId); // var sharePurchaserIdList = new List(); // foreach (var g in group) // { // if (g.Count() == skuCount) // sharePurchaserIdList.Add(g.Key); // } // if (sharePurchaserIdList.Count == 0) // return null; // return fsql.Select().Where(p => sharePurchaserIdList.Contains(p.Id)).ToList(); //} //public void DeletePurchaser(DeletePurchaseSchemeRequest deletePurchaseSchemeRequest) //{ // var purchaseSchemeIdList = fsql.Select().Where(ps => ps.ProductId == deletePurchaseSchemeRequest.ProductId && // ps.PurchaserId == deletePurchaseSchemeRequest.PurchaserId).ToList(ps => ps.Id); // fsql.Transaction(() => // { // fsql.Delete(purchaseSchemeIdList).ExecuteAffrows(); // fsql.Delete().Where(psp => purchaseSchemeIdList.Contains(psp.SkuPurchaseSchemeId)).ExecuteAffrows(); // fsql.Delete().Where(psps => purchaseSchemeIdList.Contains(psps.SkuPurchaseSchemeId)).ExecuteAffrows(); // }); //} public void DeletePurchaseScheme(long schemeId) { fsql.Transaction(() => { fsql.Delete(schemeId).ExecuteAffrows(); fsql.Delete().Where(p => p.SkuPurchaseSchemeId == schemeId).ExecuteAffrows(); fsql.Delete().Where(p => p.SkuPurchaseSchemeId == schemeId).ExecuteAffrows(); }); } /// /// 获取采购Sku的基本信息 /// /// /// public PurchaseSkuBasicInfoResponse GetPurchaseSkuBasicInfo(PurchaseSkuBasicInfoRequest request) { return purchaseProductAPIService.GetProductInfo(request); } public IList BatchGetPurchaseSkuBasicInfo(BatchPurchaseSkuBasicInfoRequest request) { var list = new List(); foreach (var param in request.Params) { foreach (var purchaseId in param.PurchaseProductIds) { var response = GetPurchaseSkuBasicInfo(new PurchaseSkuBasicInfoRequest() { FirstApiMode = request.FirstApiMode, PriceMode = request.PriceMode, Platform = param.Platform, PurchaseProductId = purchaseId }); if (response != null) { if (param.PurchaseSkuIds != null && param.PurchaseSkuIds.Count() > 0) { for (var i = 0; i < response.ItemList.Count(); i++) { var skuInfo = response.ItemList[i]; if (!param.PurchaseSkuIds.Any(s => s == skuInfo.PurchaseSkuId)) { response.ItemList.RemoveAt(i); i--; } } } list.Add(response); } } } return list; } //public void EditPurchaseRatio(EditPurchaseRatioAndActualPriceRequest request) //{ // if (request.Ratio < 1) // request.Ratio = 1; // fsql.Update().Set(pss => pss.PurchaseRatio, request.Ratio) // .Set(pss => pss.ActualPrice, request.ActualPrice) // .Where(pss => pss.SkuPurchaseSchemeId == request.SchemeId && // pss.SkuId == request.SkuId && // pss.PurchaseSkuId == request.PurchaseSkuId) // .ExecuteAffrows(); //} } }