using BBWYB.Common.Extensions; using BBWYB.Common.Http; 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 MySqlX.XDevAPI; using Newtonsoft.Json; using Org.BouncyCastle.Asn1.X509.Qualified; using System.Net.Http.Headers; using Yitter.IdGenerator; namespace BBWYB.Server.Business { public class PurchaseSchemeBusiness : BaseBusiness, IDenpendency { private PurchaseProductAPIService purchaseProductAPIService; private RestApiService restApiService; public PurchaseSchemeBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, PurchaseProductAPIService purchaseProductAPIService, RestApiService restApiService) : base(fsql, nLogManager, idGenerator) { this.purchaseProductAPIService = purchaseProductAPIService; this.restApiService = restApiService; } 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 != null && 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 != null && 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 void EditPurchaseSchemeV2(BatchCURDSchemeRequest batchCURDSchemeRequest) { List dbSchemeGroupList = null; List dbPurchaseSchemeList = null; #region 数据验证 if ((batchCURDSchemeRequest.EditPurchaseSchemeList == null || batchCURDSchemeRequest.EditPurchaseSchemeList.Count == 0) && (batchCURDSchemeRequest.AddPurchaseSchemeList == null || batchCURDSchemeRequest.AddPurchaseSchemeList.Count == 0)) throw new BusinessException("更新方案和新增方案参数不能同时为空"); if (batchCURDSchemeRequest.EditPurchaseSchemeList != null && batchCURDSchemeRequest.EditPurchaseSchemeList.Count() > 0) { if (batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => string.IsNullOrEmpty(ps.ProductId) || string.IsNullOrEmpty(ps.SkuId) || ps.PurchaseSchemeProductList.Any(psp => string.IsNullOrEmpty(psp.ProductId) || string.IsNullOrEmpty(psp.SkuId) || psp.PurchaseSchemeProductSkuList.Any(pss => string.IsNullOrEmpty(pss.ProductId) || string.IsNullOrEmpty(pss.SkuId))))) { throw new BusinessException("更新方案缺少ProductId/SkuId"); } if (batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => ps.PurchaseSchemeProductList == null || ps.PurchaseSchemeProductList.Count() == 0 || ps.PurchaseSchemeProductList.Any(psp => psp.PurchaseSchemeProductSkuList == null || psp.PurchaseSchemeProductSkuList.Count() == 0))) { throw new BusinessException("更新方案缺少商品信息"); } if (batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => ps.PurchaseSchemeProductList.Any(pp => string.IsNullOrEmpty(pp.PurchaserId) || string.IsNullOrEmpty(pp.PurchaserId2) || string.IsNullOrEmpty(pp.PurchaserName)))) throw new BusinessException("更新方案中有采购商Id/Id2/Name/Location为空"); if (batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => ps.Id == 0)) throw new BusinessException("更新方案中采购方案缺少Id"); if (batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => ps.SchemeGroupId == null || ps.SchemeGroupId == 0)) throw new BusinessException("更新方案中采购方案缺少分组Id"); } if (batchCURDSchemeRequest.AddPurchaseSchemeList != null && batchCURDSchemeRequest.AddPurchaseSchemeList.Count() > 0) { if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(ps => string.IsNullOrEmpty(ps.ProductId) || string.IsNullOrEmpty(ps.SkuId) || ps.PurchaseSchemeProductList.Any(psp => string.IsNullOrEmpty(psp.ProductId) || string.IsNullOrEmpty(psp.SkuId) || psp.PurchaseSchemeProductSkuList.Any(pss => string.IsNullOrEmpty(pss.ProductId) || string.IsNullOrEmpty(pss.SkuId))))) { throw new BusinessException("新增方案缺少ProductId/SkuId"); } if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(ps => ps.PurchaseSchemeProductList == null || ps.PurchaseSchemeProductList.Count() == 0 || ps.PurchaseSchemeProductList.Any(psp => psp.PurchaseSchemeProductSkuList == null || psp.PurchaseSchemeProductSkuList.Count() == 0))) { throw new BusinessException("新增方案缺少商品信息"); } if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(ps => ps.PurchaseSchemeProductList.Any(pp => string.IsNullOrEmpty(pp.PurchaserId) || string.IsNullOrEmpty(pp.PurchaserId2) || string.IsNullOrEmpty(pp.PurchaserName)))) throw new BusinessException("新增方案中有采购商Id/Id2/Name/Location为空"); var productIds = batchCURDSchemeRequest.AddPurchaseSchemeList.Select(ps => ps.ProductId).ToList(); dbSchemeGroupList = fsql.Select().Where(psg => productIds.Contains(psg.ProductId)).ToList(); var dbSchemeGroupIds = dbSchemeGroupList.Select(psg => psg.Id).ToList(); dbPurchaseSchemeList = fsql.Select().Where(ps => dbSchemeGroupIds.Contains(ps.SchemeGroupId)).ToList(); foreach (var addPurchaseScheme in batchCURDSchemeRequest.AddPurchaseSchemeList) { if (addPurchaseScheme.SchemeGroupId == null || addPurchaseScheme.SchemeGroupId == 0) continue; var dbSchemeGroup = dbSchemeGroupList.FirstOrDefault(g => g.Id == addPurchaseScheme.SchemeGroupId); if (dbSchemeGroup == null) throw new BusinessException($"新增方案中指定了不存在的分组{addPurchaseScheme.SchemeGroupId}"); var dbPurchaseSchemeList_sameGroup = dbPurchaseSchemeList.Where(ps => ps.SchemeGroupId == addPurchaseScheme.SchemeGroupId).ToList(); if (dbPurchaseSchemeList_sameGroup.Any(ps => ps.SkuId == addPurchaseScheme.SkuId)) throw new BusinessException($"采购方案分组中Sku不允许重复,{dbSchemeGroup.GroupName}已存在{addPurchaseScheme.SkuId}的采购方案"); if (!string.IsNullOrEmpty(addPurchaseScheme.HYSchemeId)) { if (dbPurchaseSchemeList.Any(ps => ps.HYSchemeId == addPurchaseScheme.HYSchemeId)) throw new BusinessException($"慧眼方案Id{addPurchaseScheme.HYSchemeId}已被其他采购方案使用"); } } } #endregion List addPurchaseSchemeList = new List(); List addPurchaseSchemeProductList = new List(); List addPurchaseSchemeProductSkuList = new List(); List newPurchaserList = new List(); List deletePurchaseSchemeIdList = new List(); List> updatePurchaseSchemeList = new List>(); List insertPurchaseSchemeGroupsList = new List(); if (batchCURDSchemeRequest.AddPurchaseSchemeList != null && batchCURDSchemeRequest.AddPurchaseSchemeList.Count > 0) { ExtractNewPurchaser(batchCURDSchemeRequest.AddPurchaseSchemeList, newPurchaserList); foreach (var psReq in batchCURDSchemeRequest.AddPurchaseSchemeList) { if (psReq.SchemeGroupId == null || psReq.SchemeGroupId == 0) { //新增分组 var insertSchemeGroup = new PurchaseSchemeGroup() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, GroupName = $"{psReq.ProductId}-{DateTime.Now:yyyyMMddHHmmss}", ProductId = psReq.ProductId, ShopId = psReq.ShopId }; insertPurchaseSchemeGroupsList.Add(insertSchemeGroup); } var ps = new PurchaseScheme() { CreateTime = DateTime.Now, Id = idGenerator.NewLong(), ProductId = psReq.ProductId, SkuId = psReq.SkuId, ShopId = psReq.ShopId, HYBDId = psReq.HYBDId, HYSchemeId = psReq.HYSchemeId, SchemeGroupId = psReq.SchemeGroupId ?? 0 }; 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 != null && 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); } } #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 (insertPurchaseSchemeGroupsList.Count() > 0) fsql.Insert(insertPurchaseSchemeGroupsList).ExecuteAffrows(); if (updatePurchaseSchemeList.Count() > 0) { foreach (var update in updatePurchaseSchemeList) update.ExecuteAffrows(); } }); } /// /// 获取采购方案 /// /// /// public IList GetPurchaseSchemeList(QuerySchemeRequest request) { #region 处理条件优先级 if (request.SchemeId != null) { request.SchemeIdList?.Clear(); request.SchemeGroupIdList?.Clear(); request.SkuIdList?.Clear(); request.ProductIdList?.Clear(); } else if (request.SchemeIdList != null && request.SchemeIdList.Count() > 0) { request.SchemeGroupIdList?.Clear(); request.SkuIdList?.Clear(); request.ProductIdList?.Clear(); } else if (request.SchemeGroupIdList != null && request.SchemeGroupIdList.Count() > 0) { request.SkuIdList?.Clear(); request.ProductIdList?.Clear(); } else if (request.SkuIdList != null && request.SkuIdList.Count() > 0) { request.ProductIdList?.Clear(); } #endregion var select = fsql.Select() .WhereIf(request.ShopId != null && request.ShopId != 0, ps => ps.ShopId == request.ShopId) .WhereIf(request.SchemeId != null && request.SchemeId != 0, ps => ps.Id == request.SchemeId) .WhereIf(request.SchemeIdList != null && request.SchemeIdList.Count() > 0, ps => request.SchemeIdList.Contains(ps.Id)) .WhereIf(request.SchemeGroupIdList != null && request.SchemeGroupIdList.Count() > 0, ps => request.SchemeGroupIdList.Contains(ps.SchemeGroupId)) .WhereIf(request.SkuIdList != null && request.SkuIdList.Count() > 0, ps => request.SkuIdList.Contains(ps.SkuId)) .WhereIf(request.ProductIdList != null && request.ProductIdList.Count() > 0, ps => request.ProductIdList.Contains(ps.ProductId)); 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.OrderByDescending(ps => ps.CreateTime).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) { schemeProduct.PurchaseProductLogo = basicInfo.ProductLogo; schemeProduct.PurchaseProductName = basicInfo.ProductName; 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 GetPurchaseSchemeAndGroupList(QuerySchemeAndGroupRequest request) { var purchaseSchemeGroupsList = fsql.Select() .Where(psg => psg.ShopId == request.ShopId && request.ProductIdList.Contains(psg.ProductId)) .ToList(); if (purchaseSchemeGroupsList.Count() > 0) { var groupIds = purchaseSchemeGroupsList.Select(g => g.Id).ToList(); var purchaseSchemeList = GetPurchaseSchemeList(new QuerySchemeRequest() { IncludePurchaseSkuBasicInfo = request.IncludePurchaseSkuBasicInfo, SchemeGroupIdList = groupIds }); foreach (var psg in purchaseSchemeGroupsList) psg.PurchaseSchemeList = purchaseSchemeList.Where(ps => ps.SchemeGroupId == psg.Id).ToList(); } return purchaseSchemeGroupsList; } public IList GetPurchaseSchemeCountList(QuerySchemeCountRequest request) { var list = fsql.Select().Where(ps => 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) { IDelete? deletePsg = null; var purchaseScheme = fsql.Select(schemeId).ToOne(); if (purchaseScheme == null) throw new BusinessException("采购方案不存在"); if (purchaseScheme.SchemeGroupId != 0) { var sameGroupSchemeCount = fsql.Select().Where(ps => ps.SchemeGroupId == purchaseScheme.SchemeGroupId && ps.Id != purchaseScheme.Id).Count(); if (sameGroupSchemeCount == 0) deletePsg = fsql.Delete(purchaseScheme.SchemeGroupId); } fsql.Transaction(() => { deletePsg?.ExecuteAffrows(); 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; } /// /// 根据慧眼标的Id获取采购方案(含全部配件基本信息) /// /// /// /// public IList GetPurchaseSchemeByHYBDId(QueryHYSchemeRequest request) { if (request.ShopId == 0) throw new BusinessException("缺少店铺Id"); if (string.IsNullOrEmpty(request.ProductId)) throw new BusinessException("缺少商品Id"); if (string.IsNullOrEmpty(request.HYBDId)) throw new BusinessException("缺少标的Id"); var hyHttpResult = restApiService.SendRequest("http://hyapi.qiyue666.com", "/HuiYan/ItemPlan/GetPlanByOrderId", $"orderId={request.HYBDId}", null, HttpMethod.Get); if (hyHttpResult.StatusCode != System.Net.HttpStatusCode.OK) throw new BusinessException(hyHttpResult.Content); var hyResponse = JsonConvert.DeserializeObject>>(hyHttpResult.Content); if (!hyResponse.Success) throw new BusinessException(hyResponse.Msg); if (hyResponse.Data == null || hyResponse.Data.Count() == 0) throw new BusinessException("该标的Id缺少采购方案"); var hySchemeList = hyResponse.Data; var hySchemeIdList = hySchemeList.Select(x => x.Id.ToString()).ToList(); var dbSchemeList = fsql.Select().Where(ps => ps.ProductId == request.ProductId && !string.IsNullOrEmpty(ps.HYSchemeId) && hySchemeIdList.Contains(ps.HYSchemeId)).ToList(); var resultList = new List(); foreach (var hyScheme in hySchemeList) { if (hyScheme.PlanItems == null || hyScheme.PlanItems.Count() == 0) continue; var hySchemeResponse = new HYPurchaseSchemeResponse() { Id = 0, CreateTime = DateTime.Now, HYBDId = request.HYBDId, IsAdded = dbSchemeList.Any(ps => ps.HYBDId == request.HYBDId && ps.HYSchemeId == hyScheme.Id.ToString()), HYSchemeId = hyScheme.Id.ToString(), ProductId = request.ProductId, ShopId = request.ShopId }; resultList.Add(hySchemeResponse); foreach (var hySchemeProduct in hyScheme.PlanItems) { var basicInfo = GetPurchaseSkuBasicInfo(new PurchaseSkuBasicInfoRequest() { FirstApiMode = Enums.PurchaseProductAPIMode.Spider, PriceMode = Enums.PurchaseOrderMode.批发, Platform = Enums.Platform.阿里巴巴, PurchaseProductId = hySchemeProduct.ItemId }); var hySchemeProductResponse = new PurchaseSchemeProductResponse() { Id = 0, ProductId = request.ProductId, PurchasePlatform = Enums.Platform.阿里巴巴, PurchaseProductId = hySchemeProduct.ItemId, PurchaseProductLogo = basicInfo.ProductLogo, PurchaseProductName = basicInfo.ProductName, PurchaserId = basicInfo.Purchaser?.Id, PurchaserId2 = basicInfo.Purchaser?.Id2, PurchaserMemberId = basicInfo.Purchaser?.MemberId, PurchaserLocation = basicInfo.Purchaser?.Location, PurchaserName = basicInfo.Purchaser?.Name, PurchaseUrl = $"https://detail.1688.com/offer/{hySchemeProduct.ItemId}.html" }; hySchemeResponse.PurchaseSchemeProductList.Add(hySchemeProductResponse); if (!hySchemeResponse.PurchaserList.Any(p => p.Id == hySchemeProductResponse.PurchaserId)) { hySchemeResponse.PurchaserList.Add(new Purchaser() { Id = hySchemeProductResponse.PurchaserId, Id2 = hySchemeProductResponse.PurchaserId2, Location = hySchemeProductResponse.PurchaserLocation, Name = hySchemeProductResponse.PurchaserName, Platform = hySchemeProductResponse.PurchasePlatform, MemberId = hySchemeProductResponse.PurchaserMemberId }); } foreach (var skuBasicInfo in basicInfo.ItemList) { var hySchemeProductSkuResponse = new PurchaseSchemeProductSkuResponse() { Id = 0, ActualPrice = skuBasicInfo.Price, ProductId = request.ProductId, PurchaseProductId = skuBasicInfo.PurchaseProductId, PurchaseRatio = 1, PurchaseSkuId = skuBasicInfo.PurchaseSkuId, PurchaseSkuLogo = skuBasicInfo.Logo, PurchaseSkuPrice = skuBasicInfo.Price, PurchaseSkuSpecId = skuBasicInfo.PurchaseSkuSpecId, PurchaseSkuTitle = skuBasicInfo.Title }; hySchemeProductResponse.PurchaseSchemeProductSkuList.Add(hySchemeProductSkuResponse); hySchemeResponse.DefaultCost += skuBasicInfo.Price; } } } return resultList; } public decimal EditPurchaseRatio(EditPurchaseRatioRequest request) { if (request.SchemeId == 0 || string.IsNullOrEmpty(request.SkuId) || string.IsNullOrEmpty(request.PurchaseSkuId)) throw new BusinessException("参数不完整"); if (request.Ratio < 1) request.Ratio = 1; var schemeList = GetPurchaseSchemeList(new QuerySchemeRequest() { IncludePurchaseSkuBasicInfo = 1, SchemeId = request.SchemeId }); if (schemeList.Count() == 0) throw new BusinessException("采购方案不存在"); var scheme = schemeList[0]; var defaultCost = 0M; long? pssId = null; foreach (var schemeProduct in scheme.PurchaseSchemeProductList) { var tartegtPurchaseProductSku = schemeProduct.PurchaseSchemeProductSkuList.FirstOrDefault(pss => pss.SkuId == request.SkuId && pss.PurchaseSkuId == request.PurchaseSkuId); if (tartegtPurchaseProductSku != null) { tartegtPurchaseProductSku.PurchaseRatio = request.Ratio; pssId = tartegtPurchaseProductSku.Id; } defaultCost += schemeProduct.PurchaseSchemeProductSkuList.Sum(pss => ((pss.ActualPrice ?? pss.PurchaseSkuPrice) ?? 0) * (pss.PurchaseRatio ?? 1)); //foreach (var schemeProductSku in schemeProduct.PurchaseSchemeProductSkuList) //{ // if (schemeProductSku.SkuId == request.SkuId && // schemeProductSku.PurchaseSkuId == request.PurchaseSkuId) // { // schemeProductSku.PurchaseRatio = request.Ratio; // pssId = schemeProductSku.Id; // } // defaultCost += ((schemeProductSku.ActualPrice ?? schemeProductSku.PurchaseSkuPrice) ?? 0) * (schemeProductSku.PurchaseRatio ?? 1); //} } if (pssId == null) throw new BusinessException("未找到需要更新的采购配件"); fsql.Transaction(() => { fsql.Update(request.SchemeId).Set(ps => ps.DefaultCost, defaultCost).ExecuteAffrows(); fsql.Update(pssId.Value).Set(pss => pss.PurchaseRatio, request.Ratio).ExecuteAffrows(); }); return defaultCost; } public decimal DeletePurchaseSku(DeletePurchaseSkuRequest request) { if (request.SchemeId == 0 || string.IsNullOrEmpty(request.SkuId) || string.IsNullOrEmpty(request.PurchaseSkuId)) throw new BusinessException("参数不完整"); var schemeList = GetPurchaseSchemeList(new QuerySchemeRequest() { IncludePurchaseSkuBasicInfo = 1, SchemeId = request.SchemeId }); if (schemeList.Count() == 0) throw new BusinessException("采购方案不存在"); var scheme = schemeList[0]; var defaultCost = 0M; long? pssId = null; foreach (var schemeProduct in scheme.PurchaseSchemeProductList) { var tartegtPurchaseProductSku = schemeProduct.PurchaseSchemeProductSkuList.FirstOrDefault(pss => pss.SkuId == request.SkuId && pss.PurchaseSkuId == request.PurchaseSkuId); if (tartegtPurchaseProductSku != null) { if (schemeProduct.PurchaseSchemeProductSkuList.Count() == 1) throw new BusinessException("最后一个采购sku不能被移除"); pssId = tartegtPurchaseProductSku.Id; } defaultCost += schemeProduct.PurchaseSchemeProductSkuList.Where(pss => !(pss.SkuId == request.SkuId && pss.PurchaseSkuId == request.PurchaseSkuId)) .Sum(pss => ((pss.ActualPrice ?? pss.PurchaseSkuPrice) ?? 0) * (pss.PurchaseRatio ?? 1)); } if (pssId == null) throw new BusinessException("未找到需要移除的采购sku"); fsql.Transaction(() => { fsql.Update(request.SchemeId).Set(ps => ps.DefaultCost, defaultCost).ExecuteAffrows(); fsql.Delete(pssId.Value).ExecuteAffrows(); }); return defaultCost; } } }