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 Newtonsoft.Json; using Yitter.IdGenerator; namespace BBWYB.Server.Business { public class PurchaseSchemeBusiness : BaseBusiness, IDenpendency { private PurchaseProductAPIService purchaseProductAPIService; private RestApiService restApiService; private IList invalidOrderStateList; public PurchaseSchemeBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, PurchaseProductAPIService purchaseProductAPIService, RestApiService restApiService) : base(fsql, nLogManager, idGenerator) { this.purchaseProductAPIService = purchaseProductAPIService; this.restApiService = restApiService; this.invalidOrderStateList = new List() { Enums.OrderState.待付款, Enums.OrderState.已取消, Enums.OrderState.等待采购, Enums.OrderState.部分采购 }; } 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) { nLogManager.Default().Info($"EditPurchaseSchemeV2 {JsonConvert.SerializeObject(batchCURDSchemeRequest)}"); List dbSchemeGroupList = null; List dbPurchaseSchemeList = null; List deleteSchemeIdList = new List(); #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) { var groupCount = batchCURDSchemeRequest.EditPurchaseSchemeList.GroupBy(ps => ps.ProductId).Count(); if (groupCount > 1) throw new BusinessException("只能对同一个spu的方案进行编辑"); if (batchCURDSchemeRequest.EditPurchaseSchemeList.Any(ps => ps.Id == 0)) throw new BusinessException("更新方案中采购方案缺少Id"); 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"); } #region 验证是否存在数据残缺的采购方案 for (var i = 0; i < batchCURDSchemeRequest.EditPurchaseSchemeList.Count(); i++) { var editScheme = batchCURDSchemeRequest.EditPurchaseSchemeList[i]; if (editScheme.PurchaseSchemeProductList != null && editScheme.PurchaseSchemeProductList.Count() > 0) { for (var j = 0; j < editScheme.PurchaseSchemeProductList.Count(); j++) { var editSchemeProduct = editScheme.PurchaseSchemeProductList[j]; if (editSchemeProduct.PurchaseSchemeProductSkuList == null || editSchemeProduct.PurchaseSchemeProductSkuList.Count() == 0) { //如果采购商品不具备配件,则移除该采购商品 editScheme.PurchaseSchemeProductList.RemoveAt(j); j--; } } } if (editScheme.PurchaseSchemeProductList == null || editScheme.PurchaseSchemeProductList.Count() == 0) { //采购方案不再具备采购商品,则移除该采购方案 batchCURDSchemeRequest.EditPurchaseSchemeList.RemoveAt(i); i--; deleteSchemeIdList.Add(editScheme.Id); } } #endregion 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.SchemeGroupId == null || ps.SchemeGroupId == 0)) throw new BusinessException("更新方案中采购方案缺少分组Id"); } if (batchCURDSchemeRequest.AddPurchaseSchemeList != null && batchCURDSchemeRequest.AddPurchaseSchemeList.Count() > 0) { var groupCount = batchCURDSchemeRequest.AddPurchaseSchemeList.GroupBy(ps => ps.ProductId).Count(); if (groupCount > 1) throw new BusinessException("只能对同一个spu的方案进行编辑"); 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 deletePartsSchemeIdList = new List(); List> updatePurchaseSchemeList = new List>(); List insertPurchaseSchemeGroupsList = new List(); IInsert? insertPurchaseSchemeGroupIndex = null; IUpdate? updatePurchaseSchemeGroupIndex = null; List insertHistoryPSList = new List(); List insertHistoryPSPList = new List(); List insertHistoryPSSList = new List(); if (batchCURDSchemeRequest.AddPurchaseSchemeList != null && batchCURDSchemeRequest.AddPurchaseSchemeList.Count > 0) { var firstScheme = batchCURDSchemeRequest.AddPurchaseSchemeList.First(); ExtractNewPurchaser(batchCURDSchemeRequest.AddPurchaseSchemeList, newPurchaserList); #region 新建分组 long? newPurchaseGroupId = null; if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(ps => ps.SchemeGroupId == 0 || ps.SchemeGroupId == null)) { var dbPurchaseSchemeGroupIndex = fsql.Select().Where(psgi => psgi.ProductId == firstScheme.ProductId).ToOne(); if (dbPurchaseSchemeGroupIndex == null) { dbPurchaseSchemeGroupIndex = new PurchaseSchemeGroupIndex() { CreateTime = DateTime.Now, Index = 1, ProductId = firstScheme.ProductId, ShopId = firstScheme.ShopId }; insertPurchaseSchemeGroupIndex = fsql.Insert(dbPurchaseSchemeGroupIndex); } else { dbPurchaseSchemeGroupIndex.Index++; updatePurchaseSchemeGroupIndex = fsql.Update(dbPurchaseSchemeGroupIndex.ProductId) .Set(x => x.Index, dbPurchaseSchemeGroupIndex.Index); } var insertSchemeGroup = new PurchaseSchemeGroup() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, GroupName = $"{firstScheme.ProductId}-{dbPurchaseSchemeGroupIndex.Index}", ProductId = firstScheme.ProductId, ShopId = firstScheme.ShopId }; insertPurchaseSchemeGroupsList.Add(insertSchemeGroup); newPurchaseGroupId = insertSchemeGroup.Id; } #endregion foreach (var psReq in batchCURDSchemeRequest.AddPurchaseSchemeList) { if (psReq.SchemeGroupId == null || psReq.SchemeGroupId == 0) psReq.SchemeGroupId = newPurchaseGroupId; var defaultCost = 0M; decimal? bargainingCost = null; var isContainsActualPrice = psReq.PurchaseSchemeProductList.Any(pspReq => pspReq.PurchaseSchemeProductSkuList.Any(pssReq => pssReq.ActualPrice != null)); 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, Version = 1 }; 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); defaultCost += pssReq.DefaultPrice ?? 0; if (isContainsActualPrice) { if (bargainingCost == null) bargainingCost = 0M; bargainingCost += ((pssReq.ActualPrice ?? pssReq.DefaultPrice) ?? 0) * (pssReq.PurchaseRatio ?? 1); if (pssReq.ActualPrice != null && pssReq.ActualPrice > 0) pss.LastBargainingTime = DateTime.Now; } #region 处理历史版本 var historyPss = pss.Map(); historyPss.HistoryId = idGenerator.NewLong(); historyPss.Version = 1; insertHistoryPSSList.Add(historyPss); #endregion } #region 处理历史版本 var historyPsp = psp.Map(); historyPsp.HistoryId = idGenerator.NewLong(); historyPsp.Version = 1; insertHistoryPSPList.Add(historyPsp); #endregion } #region 处理历史版本 ps.DefaultCost = defaultCost; ps.BargainingCost = bargainingCost; if (bargainingCost != null) ps.LastBargainingTime = DateTime.Now; var historyPs = ps.Map(); historyPs.HistoryId = idGenerator.NewLong(); insertHistoryPSList.Add(historyPs); #endregion } } #region 更新采购方案 if (batchCURDSchemeRequest.EditPurchaseSchemeList != null && batchCURDSchemeRequest.EditPurchaseSchemeList.Count > 0) { ExtractNewPurchaser(batchCURDSchemeRequest.EditPurchaseSchemeList, newPurchaserList); var editSchemeIdList = batchCURDSchemeRequest.EditPurchaseSchemeList.Select(ps => ps.Id).ToList(); var dbPurchaseSchemes = GetPurchaseSchemeList(new QuerySchemeRequest() { SchemeIdList = editSchemeIdList, IncludePurchaseSkuBasicInfo = 0, IncludeSkuStatisticsInfo = 0 }); var dbPssList = dbPurchaseSchemes.SelectMany(ps => ps.PurchaseSchemeProductList.SelectMany(psp => psp.PurchaseSchemeProductSkuList)); //List dbPurchaseSchemes = fsql.Select().Where(ps => editSchemeIdList.Contains(ps.Id)).ToList(); deletePartsSchemeIdList.AddRange(batchCURDSchemeRequest.EditPurchaseSchemeList.Select(ps => ps.Id)); foreach (var psReq in batchCURDSchemeRequest.EditPurchaseSchemeList) { var schemeId = psReq.Id; var dbps = dbPurchaseSchemes.FirstOrDefault(x => x.Id == schemeId); if (dbps == null) throw new BusinessException($"未找到编辑方案{schemeId}"); var newVersion = dbps.Version + 1; //采购方案版本 var defaultCost = 0M; decimal? bargainingCost = null; //只有当任意配件包含议价成本时才具备此值 var isContainsActualPrice = psReq.PurchaseSchemeProductList.Any(pspReq => pspReq.PurchaseSchemeProductSkuList.Any(pssReq => pssReq.ActualPrice != null)); 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; var dbPss = dbPssList.FirstOrDefault(x => x.SkuId == pssReq.SkuId && x.PurchaseSkuId == pssReq.PurchaseSkuId && x.SkuPurchaseSchemeId == schemeId); pss.LastBargainingTime = dbPss?.LastBargainingTime; addPurchaseSchemeProductSkuList.Add(pss); defaultCost += pssReq.DefaultPrice ?? 0; if (isContainsActualPrice) { if (bargainingCost == null) bargainingCost = 0M; bargainingCost += ((pssReq.ActualPrice ?? pssReq.DefaultPrice) ?? 0) * (pssReq.PurchaseRatio ?? 1); if (pssReq.ActualPrice != null && pssReq.ActualPrice > 0M && dbPss != null && dbPss.ActualPrice != pssReq.ActualPrice) pss.LastBargainingTime = DateTime.Now; } #region 处理历史版本 var historyPss = pssReq.Map(); historyPss.HistoryId = idGenerator.NewLong(); historyPss.CreateTime = DateTime.Now; historyPss.SkuPurchaseSchemeId = schemeId; historyPss.Version = newVersion; insertHistoryPSSList.Add(historyPss); #endregion } #region 处理历史版本 var historyPsp = pspReq.Map(); historyPsp.HistoryId = idGenerator.NewLong(); historyPsp.CreateTime = DateTime.Now; historyPsp.SkuPurchaseSchemeId = schemeId; historyPsp.Version = newVersion; insertHistoryPSPList.Add(historyPsp); #endregion } var psupdate = fsql.Update(schemeId) .Set(ps => ps.DefaultCost, defaultCost) .Set(ps => ps.BargainingCost, bargainingCost) .SetIf(bargainingCost != null && bargainingCost != dbps.BargainingCost, ps => ps.LastBargainingTime, DateTime.Now) .Set(ps => ps.HYSchemeId, psReq.HYSchemeId) .Set(ps => ps.HYBDId, psReq.HYBDId) .Set(ps => ps.Version, newVersion); updatePurchaseSchemeList.Add(psupdate); #region 处理历史版本 var historyPs = psReq.Map(); historyPs.LastPurchaseTime = dbps.LastPurchaseTime; historyPs.LastPurchasePriceCost = dbps.LastPurchasePriceCost; historyPs.DefaultCost = defaultCost; historyPs.BargainingCost = bargainingCost; historyPs.PurchasedCount = dbps.PurchasedCount; historyPs.PurchasedAmount = dbps.PurchasedAmount; historyPs.CreateTime = DateTime.Now; historyPs.Version = newVersion; historyPs.HistoryId = idGenerator.NewLong(); insertHistoryPSList.Add(historyPs); #endregion } } #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 (deletePartsSchemeIdList.Count > 0) { fsql.Delete().Where(p => deletePartsSchemeIdList.Contains(p.SkuPurchaseSchemeId)).ExecuteAffrows(); fsql.Delete().Where(p => deletePartsSchemeIdList.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(); } insertPurchaseSchemeGroupIndex?.ExecuteAffrows(); updatePurchaseSchemeGroupIndex?.ExecuteAffrows(); if (insertHistoryPSList.Count() > 0) fsql.Insert(insertHistoryPSList).ExecuteAffrows(); if (insertHistoryPSPList.Count() > 0) fsql.Insert(insertHistoryPSPList).ExecuteAffrows(); if (insertHistoryPSSList.Count() > 0) fsql.Insert(insertHistoryPSSList).ExecuteAffrows(); }); //删除信息残缺的采购方案 if (deleteSchemeIdList.Count() > 0) DeletePurchaseScheme(deleteSchemeIdList); } /// /// 获取采购方案 /// /// /// 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.IsFirst).OrderByDescending(ps => ps.CreateTime).ToList(); if (purchaseSchemeList.Count > 0) { var purchaseSchemeIdList = purchaseSchemeList.Select(p => p.Id).ToList(); var spuIdList = purchaseSchemeList.Select(ps => ps.ProductId).Distinct().ToList(); var skuIdList = purchaseSchemeList.Select(ps => ps.SkuId).Distinct().ToList(); var recentDate = DateTime.Now.Date.AddDays(-30); 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, PurchaserPurchasedCount = p.PurchasedCount, PurchaserPurchasedSkuCount = p.PurchasedSkuCount, }); var purchaseSchemeProductSkuList = fsql.Select().Where(p => purchaseSchemeIdList.Contains(p.SkuPurchaseSchemeId)) .ToList().Map>(); if (request.IncludeSkuStatisticsInfo == 1) { var recent30daySpuItemCountGroups = fsql.Select() .LeftJoin((osku, o) => osku.OrderId == o.Id) .Where((osku, o) => spuIdList.Contains(osku.ProductId) && !invalidOrderStateList.Contains(o.OrderState) && o.StartTime >= recentDate) .GroupBy((osku, o) => osku.ProductId) .ToList(g => new { ProductId = g.Key, ItemTotal = g.Sum(g.Value.Item1.ItemTotal) }); var recent30daySkuItemCountGroups = fsql.Select() .LeftJoin((osku, o) => osku.OrderId == o.Id) .Where((osku, o) => skuIdList.Contains(osku.SkuId) && !invalidOrderStateList.Contains(o.OrderState) && o.StartTime >= recentDate) .GroupBy((osku, o) => osku.SkuId) .ToList(g => new { SkuId = g.Key, ItemTotal = g.Sum(g.Value.Item1.ItemTotal) }); //sku最近使用的采购方案 var skuRecentPurchaseList = fsql.Select() .Where(ps => skuIdList.Contains(ps.SkuId)) .GroupBy(ps => ps.SkuId) .WithTempQuery(g => new { SkuId = g.Key, MaxTime = g.Max(g.Value.LastPurchaseTime) }) .From() .InnerJoin((ps1, ps2) => ps1.SkuId == ps2.SkuId && ps1.MaxTime == ps2.LastPurchaseTime) .ToList((ps1, ps2) => new { SkuId = ps2.SkuId, LastPurchaseTime = ps2.LastPurchaseTime, LastPurchasePriceCost = ps2.LastPurchasePriceCost }); foreach (var scheme in purchaseSchemeList) { #region 近30天spu/sku销量 scheme.Recent30DaySpuItemCount = Convert.ToInt64(recent30daySpuItemCountGroups.FirstOrDefault(x => x.ProductId == scheme.ProductId)?.ItemTotal ?? 0); scheme.Recent30DaySkuItemCount = Convert.ToInt64(recent30daySkuItemCountGroups.FirstOrDefault(x => x.SkuId == scheme.SkuId)?.ItemTotal ?? 0); #endregion #region sku最近采购价和最近采购时间 var recentScheme = skuRecentPurchaseList.FirstOrDefault(x => x.SkuId == scheme.SkuId); scheme.SkuLastPurchasePriceCost = recentScheme?.LastPurchasePriceCost; scheme.SkuLastPurchaseTime = recentScheme?.LastPurchaseTime; #endregion } } 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, PurchasedCount = schemeProduct.PurchaserPurchasedCount, PurchasedSkuCount = schemeProduct.PurchaserPurchasedSkuCount }); } } #endregion #region 获取采购方案基本信息 if (request.IncludePurchaseSkuBasicInfo == 1) { scheme.DefaultCost = 0; 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 && !basicInfo.IsInvalid) { schemeProduct.PurchaseProductLogo = basicInfo.ProductLogo; schemeProduct.PurchaseProductName = basicInfo.ProductName; foreach (var schemeProductSku in schemeProduct.PurchaseSchemeProductSkuList) { schemeProductSku.IsInvalid = 1; var basicSku = basicInfo.ItemList.FirstOrDefault(x => x.PurchaseSkuId == schemeProductSku.PurchaseSkuId); if (basicSku != null) { schemeProductSku.IsInvalid = 0; schemeProductSku.PurchaseSkuTitle = basicSku.Title; schemeProductSku.PurchaseSkuPrice = basicSku.Price; schemeProductSku.PurchaseSkuLogo = basicSku.Logo; scheme.DefaultCost += schemeProductSku.PurchaseSkuPrice.Value * (schemeProductSku.PurchaseRatio ?? 1); } } } schemeProduct.IsInvalid = (basicInfo == null || basicInfo.IsInvalid) ? 1 : 0; } 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(); //}); DeletePurchaseScheme(new List() { schemeId }); } public void DeletePurchaseScheme(List schemeIdList) { IList deleteSchemeGroupIdList = new List(); var purchaseSchemeList = fsql.Select(schemeIdList).ToList(); if (purchaseSchemeList.Count() == 0) return; var schemeGroupIdList = purchaseSchemeList.Where(ps => ps.SchemeGroupId != 0).Select(ps => ps.SchemeGroupId).ToList(); var sameSchemeGroupCountGroups = fsql.Select().Where(ps => ps.SchemeGroupId != 0 && schemeGroupIdList.Contains(ps.SchemeGroupId) && !schemeIdList.Contains(ps.Id)) .GroupBy(ps => ps.SchemeGroupId) .ToList(g => new { SchemeGroupId = g.Key, SchemeCount = g.Count() }); foreach (var purchaseScheme in purchaseSchemeList) { if (purchaseScheme.SchemeGroupId != 0) { var sameSchemeGroupCount = sameSchemeGroupCountGroups.FirstOrDefault(g => g.SchemeGroupId == purchaseScheme.SchemeGroupId); if (sameSchemeGroupCount != null && sameSchemeGroupCount.SchemeCount == 0) deleteSchemeGroupIdList.Add(purchaseScheme.SchemeGroupId); } } fsql.Transaction(() => { if (deleteSchemeGroupIdList.Count() > 0) fsql.Delete(deleteSchemeGroupIdList).ExecuteAffrows(); fsql.Delete(schemeIdList).ExecuteAffrows(); fsql.Delete().Where(p => schemeIdList.Contains(p.SkuPurchaseSchemeId)).ExecuteAffrows(); fsql.Delete().Where(p => schemeIdList.Contains(p.SkuPurchaseSchemeId)).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 pId in param.PurchaseProductIds) { var response = GetPurchaseSkuBasicInfo(new PurchaseSkuBasicInfoRequest() { FirstApiMode = request.FirstApiMode, PriceMode = request.PriceMode, Platform = param.Platform, PurchaseProductId = pId }); 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 isContainsActualPrice = scheme.PurchaseSchemeProductList.Any(pspReq => pspReq.PurchaseSchemeProductSkuList.Any(pssReq => pssReq.ActualPrice != null)); var defaultCost = 0M; decimal? bargainingCost = null; 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; } if (pssId == null) throw new BusinessException("未找到需要更新的采购配件"); defaultCost += schemeProduct.PurchaseSchemeProductSkuList.Sum(pss => (pss.PurchaseSkuPrice ?? 0) * (pss.PurchaseRatio ?? 1)); if (isContainsActualPrice) { if (bargainingCost == null) bargainingCost = 0M; bargainingCost += schemeProduct.PurchaseSchemeProductSkuList.Sum(pss => ((pss.ActualPrice ?? pss.PurchaseSkuPrice) ?? 0) * (pss.PurchaseRatio ?? 1)); } } fsql.Transaction(() => { fsql.Update(request.SchemeId).Set(ps => ps.DefaultCost, defaultCost) .SetIf(bargainingCost != null, ps => ps.BargainingCost, bargainingCost) .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]; if (scheme.PurchaseSchemeProductList.Count() == 1) { var lastProduct = scheme.PurchaseSchemeProductList.FirstOrDefault(); if (lastProduct.PurchaseSchemeProductSkuList.Count() == 1) { var lastSku = lastProduct.PurchaseSchemeProductSkuList.FirstOrDefault(); if (lastSku.PurchaseSkuId == request.PurchaseSkuId && lastSku.SkuId == request.SkuId) { DeletePurchaseScheme(request.SchemeId); return 0M; } else { throw new BusinessException("未找到需要移除的采购sku"); } } } var defaultCost = 0M; long? pssId = null; IDelete deletePss = null; IDelete deletePsp = null; IUpdate updatePs = 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) deletePsp = fsql.Delete(schemeProduct.Id); pssId = tartegtPurchaseProductSku.Id; deletePss = fsql.Delete(pssId); } 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"); updatePs = fsql.Update(request.SchemeId).Set(ps => ps.DefaultCost, defaultCost); fsql.Transaction(() => { updatePs?.ExecuteAffrows(); deletePsp?.ExecuteAffrows(); deletePss?.ExecuteAffrows(); }); return defaultCost; } /// /// 设置首选采购方案 /// /// public void SetFirstPurchaseScheme(long schemeId) { var scheme = fsql.Select(schemeId).ToOne(s => new { s.Id, s.SkuId }); if (scheme == null) new BusinessException("采购方案不存在"); fsql.Transaction(() => { fsql.Update().Set(s => s.IsFirst, 0).Where(s => s.SkuId == scheme.SkuId && s.Id != schemeId).ExecuteAffrows(); fsql.Update(schemeId).Set(s => s.IsFirst, 1).ExecuteAffrows(); }); } /// /// 查询同spu同采购商的其他配件接口,排除失效和重复配件 /// /// /// public IList QuerySameSpuAndSamePurchaserOtherPurchaseSkuList(QuerySameSpuAndSamePurchaserOtherPurchaseSkuRequest request) { var purchaseSchemeProductSkuList = new List(); var purchaseSchemeList = GetPurchaseSchemeList(new QuerySchemeRequest() { IncludePurchaseSkuBasicInfo = 0, PurchasePlatform = Enums.Platform.阿里巴巴, ProductIdList = new List() { request.ProductId }, PurchaserId = request.PurchaserId, ShopId = request.ShopId }); if (purchaseSchemeList != null && purchaseSchemeList.Count() > 0) { var purchaseProductIdList = new List(); foreach (var scheme in purchaseSchemeList) { var samePspList = scheme.PurchaseSchemeProductList.Where(psp => psp.PurchaserId == request.PurchaserId); if (samePspList.Any()) { purchaseProductIdList.AddRange(samePspList.Select(psp => psp.PurchaseProductId)); var currentPssList = samePspList.SelectMany(psp => psp.PurchaseSchemeProductSkuList); foreach (var currentPss in currentPssList) { if (purchaseSchemeProductSkuList.Any(x => x.PurchaseSkuId == currentPss.PurchaseSkuId)) continue; purchaseSchemeProductSkuList.Add(currentPss); } } } purchaseProductIdList = purchaseProductIdList.Distinct().ToList(); var purchaseProductSkuIdList = purchaseSchemeProductSkuList.Select(pss => pss.PurchaseSkuId).Distinct().ToList(); var skuBasicInfoList = BatchGetPurchaseSkuBasicInfo(new BatchPurchaseSkuBasicInfoRequest() { FirstApiMode = Enums.PurchaseProductAPIMode.Spider, PriceMode = Enums.PurchaseOrderMode.批发, Params = new List() { new BatchPurchaseSkuBasicInfoParamRequest() { Platform = Enums.Platform.阿里巴巴, PurchaseProductIds = purchaseProductIdList, PurchaseSkuIds = purchaseProductSkuIdList } } }); for (var i = 0; i < purchaseSchemeProductSkuList.Count(); i++) { var pss = purchaseSchemeProductSkuList[i]; pss.IsInvalid = 0; var basicInfo = skuBasicInfoList.FirstOrDefault(x => x.PurchaseProductId == pss.PurchaseProductId); if (basicInfo == null || basicInfo.IsInvalid) { //排除失效配件 purchaseSchemeProductSkuList.RemoveAt(i); i--; } var skuBasicInfo = basicInfo.ItemList?.FirstOrDefault(x => x.PurchaseSkuId == pss.PurchaseSkuId); if (skuBasicInfo == null) { //排除失效配件 purchaseSchemeProductSkuList.RemoveAt(i); i--; } pss.PurchaseSkuLogo = skuBasicInfo.Logo; pss.PurchaseSkuPrice = skuBasicInfo.Price; pss.PurchaseSkuTitle = skuBasicInfo.Title; } } return purchaseSchemeProductSkuList; } /// /// 批量修改采购配件实际单价 /// /// public void BatchEditPurchaseSkuActualPrice(BatchEditPurchaseSkuActualPriceRequest request) { if (request.ItemList == null || request.ItemList.Count() == 0) throw new BusinessException("缺少参数"); //var schemeIdList = request.ItemList.Select(x => x.SchemeId).Distinct().ToList(); var purchseSkuIdList = request.ItemList.Select(x => x.PurchaseSkuId).Distinct().ToList(); var schemeIdList = fsql.Select() .Where(pss => purchseSkuIdList.Contains(pss.PurchaseSkuId)) .Distinct() .ToList(pss => pss.SkuPurchaseSchemeId); var purchaseSchemeList = GetPurchaseSchemeList(new QuerySchemeRequest() { IncludePurchaseSkuBasicInfo = 1, IncludeSkuStatisticsInfo = 0, SchemeIdList = schemeIdList }); if (purchaseSchemeList.Count() == 0) return; foreach (var ps in purchaseSchemeList) { foreach (var psp in ps.PurchaseSchemeProductList) { if (psp.IsInvalid == 1) throw new BusinessException($"采购商品{psp.PurchaseProductId}已失效"); foreach (var pss in psp.PurchaseSchemeProductSkuList) { if (pss.IsInvalid == 1) throw new BusinessException($"采购配件{pss.PurchaseSkuId}已失效"); var requestSku = request.ItemList.FirstOrDefault(x => x.SkuId == pss.SkuId && x.PurchaseSkuId == pss.PurchaseSkuId); if (requestSku != null) pss.ActualPrice = requestSku.ActualPrice; } } } EditPurchaseSchemeV2(new BatchCURDSchemeRequest() { EditPurchaseSchemeList = purchaseSchemeList.Select(ps => new EditPurchaseSchemeRequest() { HYBDId = ps.HYBDId, HYSchemeId = ps.HYSchemeId, Id = ps.Id, ProductId = ps.ProductId, SkuId = ps.SkuId, ShopId = ps.ShopId, SchemeGroupId = ps.SchemeGroupId, PurchaseSchemeProductList = ps.PurchaseSchemeProductList.Select(psp => new InputPurchaseSchemeProductRequest() { ProductId = psp.ProductId, PurchasePlatform = psp.PurchasePlatform, PurchaseProductId = psp.PurchaseProductId, PurchaserId = psp.PurchaserId, PurchaserId2 = psp.PurchaserId2, PurchaserLocation = psp.PurchaserLocation, PurchaserMemberId = psp.PurchaserMemberId, PurchaserName = psp.PurchaserName, PurchaseUrl = psp.PurchaseUrl, SkuId = psp.SkuId, PurchaseSchemeProductSkuList = psp.PurchaseSchemeProductSkuList.Select(pss => new InputPurchaseSchemeProductSkuRequest() { ActualPrice = pss.ActualPrice, DefaultPrice = pss.PurchaseSkuPrice, ProductId = pss.ProductId, SkuId = pss.SkuId, PurchaseProductId = pss.PurchaseProductId, PurchaseRatio = pss.PurchaseRatio, PurchaseSkuId = pss.PurchaseSkuId, PurchaseSkuSpecId = pss.PurchaseSkuSpecId }).ToList() }).ToList() }).ToList() }); } } }