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 = scheme.PurchasePlatform }); } } } } 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为空"); List addPurchaseSchemeList = null; List addPurchaseSchemeProductList = new List(); List addPurchaseSchemeProductSkuList = new List(); List newPurchaserList = new List(); List deletePurchaseSchemeIdList = new List(); #region 新增采购方案 if (batchCURDSchemeRequest.AddPurchaseSchemeList.Count > 0) { ExtractNewPurchaser(batchCURDSchemeRequest.AddPurchaseSchemeList, newPurchaserList); addPurchaseSchemeList = batchCURDSchemeRequest.AddPurchaseSchemeList.Map>(); foreach (var scheme in addPurchaseSchemeList) { scheme.Id = idGenerator.NewLong(); scheme.CreateTime = DateTime.Now; 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 #region 更新采购方案 if (batchCURDSchemeRequest.EditPurchaseSchemeList.Count > 0) { //ExtractNewPurchaser(batchCURDSchemeRequest.EditPurchaseSchemeList, newPurchaserList); deletePurchaseSchemeIdList.AddRange(batchCURDSchemeRequest.EditPurchaseSchemeList.Select(ps => ps.Id)); 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 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(); }); } /// /// 获取采购方案(不含采购配配件基本信息) /// /// /// public IList GetPurchaseSchemeList(QuerySchemeRequest querySchemeRequest) { var select = fsql.Select(); if (querySchemeRequest.SchemeId != null && querySchemeRequest.SchemeId != 0) select = select.Where(ps => ps.Id == querySchemeRequest.SchemeId); else if (querySchemeRequest.SchemeIdList != null && querySchemeRequest.SchemeIdList.Count() > 0) select = select.Where(ps => querySchemeRequest.SchemeIdList.Contains(ps.Id)); else { select = select.WhereIf(querySchemeRequest.ShopId != null && querySchemeRequest.ShopId != 0, ps => ps.ShopId == querySchemeRequest.ShopId) .WhereIf(querySchemeRequest.SkuIdList != null && querySchemeRequest.SkuIdList.Count() > 0, ps => querySchemeRequest.SkuIdList.Contains(ps.SkuId)); //.WhereIf(querySchemeRequest.PurchasePlatform != null, ps => ps.PurchasePlatform == querySchemeRequest.PurchasePlatform); } 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, }); 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 }); } } #endregion } } return purchaseSchemeList; } public IList RefreshPurchaseScheme(RefreshSchemeRequest request) { var purchaseSchemeList = GetPurchaseSchemeList(new QuerySchemeRequest() { SchemeIdList = request.SchemeIdList }); List> updatePurchaseSchemeList = new List>(); foreach (var purchaseScheme in purchaseSchemeList) { var amount = 0M; var purchasePlatformGroups = purchaseScheme.PurchaseSchemeProductList.GroupBy(p => p.PurchasePlatform); foreach (var purchasePlatformGroup in purchasePlatformGroups) { var purchaseProductIds = purchasePlatformGroup.Select(p => p.PurchaseProductId).ToArray(); var purchaseSkuIds = new List(); foreach (var purchaseProduct in purchaseScheme.PurchaseSchemeProductList) { purchaseSkuIds.AddRange(purchaseProduct.PurchaseSchemeProductSkuList.Select(ps => ps.PurchaseSkuId)); } var purchaseSkuBasicInfoList = BatchGetPurchaseSkuBasicInfo(new BatchPurchaseSkuBasicInfoRequest() { FirstApiMode = Enums.PurchaseProductAPIMode.Spider, PriceMode = Enums.PurchaseOrderMode.批发, Params = new List() { new BatchPurchaseSkuBasicInfoParamRequest() { Platform = purchasePlatformGroup.Key.Value, PurchaseProductIds = purchaseProductIds, PurchaseSkuIds = purchaseSkuIds } } }); amount += purchaseSkuBasicInfoList.Sum(p => p.ItemList.Sum(s => s.Price)); } if (purchaseScheme.DefaultCost != amount) { purchaseScheme.DefaultCost = amount; var update = fsql.Update(purchaseScheme.Id).Set(p => p.DefaultCost, amount); 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; } } }