using BBWY.Common.Models; using BBWY.Server.Model; using BBWY.Server.Model.Db; using BBWY.Server.Model.Dto; using FreeSql; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using Yitter.IdGenerator; namespace BBWY.Server.Business { public class BatchPurchaseBusiness : BaseBusiness, IDenpendency { private ProductBusiness productBusiness; public BatchPurchaseBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, ProductBusiness productBusiness, IEnumerable platformSDKBusinessList) : base(fsql, nLogManager, idGenerator, platformSDKBusinessList) { this.productBusiness = productBusiness; this.platformSDKBusinessList = platformSDKBusinessList; } /// /// 获取包含对应平台采购方案的sku列表 /// /// /// /// public IList GetProductSkuAndSchemeList(SearchProductSkuAndSchemeRequest request) { if (string.IsNullOrEmpty(request.Spu) && string.IsNullOrEmpty(request.Sku)) throw new BusinessException("至少具备一个Sku或Spu条件"); var productSkuList = productBusiness.GetProductSkuList(new SearchProductSkuRequest() { AppKey = request.AppKey, AppSecret = request.AppSecret, AppToken = request.AppToken, Platform = request.Platform, Sku = request.Sku, Spu = request.Spu }); if (productSkuList == null || productSkuList.Count() == 0) return null; var skuIdList = productSkuList.Select(s => s.Id).ToList(); var schemeList = fsql.Select().InnerJoin((ps, p) => ps.PurchaserId == p.Id) .Where((ps, p) => ps.ShopId == request.ShopId) .Where((ps, p) => skuIdList.Contains(ps.SkuId)) .ToList((ps, p) => new { PurchaseSchemeId = ps.Id, ps.PurchaserId, PurchaserName = p.Name, ps.PurchasePlatform, ps.SkuId }); var list = new List(); foreach (var productSku in productSkuList) { var currentSchemeList = schemeList.Where(ps => ps.SkuId == productSku.Id).ToList(); if (currentSchemeList == null || currentSchemeList.Count() == 0) { list.Add(new ProductSkuWithSchemeResponse() { Id = productSku.Id, SkuId = productSku.Id, ProductId = productSku.ProductId, CreateTime = productSku.CreateTime, Logo = productSku.Logo, Price = productSku.Price, Title = productSku.Title, State = productSku.State }); } else { foreach (var currentScheme in currentSchemeList) { list.Add(new ProductSkuWithSchemeResponse() { Id = $"{productSku.Id}_{currentScheme.PurchaseSchemeId}", SkuId = productSku.Id, ProductId = productSku.ProductId, CreateTime = productSku.CreateTime, Logo = productSku.Logo, Price = productSku.Price, Title = productSku.Title, State = productSku.State, PurchaserName = currentScheme.PurchaserName, PurchasePlatform = currentScheme.PurchasePlatform, PurchaserId = currentScheme.PurchaserId, PurchaseSchemeId = currentScheme.PurchaseSchemeId }); } } } return list; } /// /// 预览订单 /// /// /// /// public PreviewOrderResponse PreviewOrder(BatchPurchasePreviewOrderRequest request) { /* 记录报价日志 */ if (request.ProductParamList == null || request.ProductParamList.Count() == 0) throw new BusinessException("缺少商品参数"); if (request.Consignee == null || string.IsNullOrEmpty(request.Consignee.Address) || string.IsNullOrEmpty(request.Consignee.Mobile) || string.IsNullOrEmpty(request.Consignee.ContactName)) throw new BusinessException("缺少收货人信息"); if (request.PurchaseAccountList == null || request.PurchaseAccountList.Count() == 0) throw new BusinessException("缺少采购账号"); var skuGroups = request.ProductParamList.GroupBy(p => p.BelongSkuId); var extJArray = new List(); var errorBuilder = new StringBuilder(); var freightAmount = 0M; var productAmount = 0M; var totalAmount = 0M; foreach (var skuGroup in skuGroups) { var productParamList = skuGroup.ToList(); try { var purchasePlatform = productParamList.FirstOrDefault().PurchasePlatform; var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == purchasePlatform); if (purchaseAccount == null) throw new BusinessException($"缺少{purchasePlatform}采购平台账号,请在店铺配置中设置"); var platformSDKBusiness = platformSDKBusinessList.FirstOrDefault(p => p.Platform == purchasePlatform); var previewOrderResponse = platformSDKBusiness.PreviewOrder(new PreviewOrderReuqest() { AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, AppToken = purchaseAccount.AppToken, Consignee = request.Consignee, Platform = purchasePlatform, PurchaseOrderMode = request.PurchaseOrderMode, CargoParamList = productParamList.Select(p => new CargoParamRequest() { ProductId = p.PurchaseProductId, SkuId = p.PurchaseSkuId, Quantity = p.Quantity, SpecId = p.PurchaseSpecId }).ToList() }); if (purchasePlatform == Enums.Platform.拳探) extJArray.Add(new { BelongSkuId = skuGroup.Key, CardId = previewOrderResponse.Extensions }); else if (purchasePlatform == Enums.Platform.阿里巴巴) extJArray.Add(new { BelongSkuId = skuGroup.Key, OrderTradeTypeCode = previewOrderResponse.OrderTradeType?.Code }); freightAmount += previewOrderResponse.FreightAmount; productAmount += previewOrderResponse.ProductAmount; totalAmount += previewOrderResponse.TotalAmount; } catch (Exception ex) { errorBuilder.AppendLine($"采购商:{productParamList.FirstOrDefault().PurchaserName}"); errorBuilder.AppendLine($"店铺SkuId:{skuGroup.Key}"); errorBuilder.AppendLine(ex.Message); throw new BusinessException(errorBuilder.ToString()); } } return new PreviewOrderResponse() { Extensions = JsonConvert.SerializeObject(extJArray), FreightAmount = freightAmount, ProductAmount = productAmount, TotalAmount = totalAmount }; } /// /// 创建订单 /// /// public BatchCreareOrderResponse BatchCreateOrder(BatchPurchaseCreateOrderRequest request) { /* 下单报价日志 */ if (request.ProductParamList == null || request.ProductParamList.Count() == 0) throw new BusinessException("缺少商品参数"); if (request.Consignee == null || string.IsNullOrEmpty(request.Consignee.Address) || string.IsNullOrEmpty(request.Consignee.Mobile) || string.IsNullOrEmpty(request.Consignee.ContactName)) throw new BusinessException("缺少收货人信息"); if (request.PurchaseAccountList == null || request.PurchaseAccountList.Count() == 0) throw new BusinessException("缺少采购账号"); var successSkuIdList = new List(); var failSkuList = new List(); var extJArray = JsonConvert.DeserializeObject(request.Extensions); var skuGroups = request.ProductParamList.GroupBy(p => p.BelongSkuId); foreach (var skuGroup in skuGroups) { var productParamList = skuGroup.ToList(); try { var firstProductParam = productParamList.FirstOrDefault(); var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == firstProductParam.PurchasePlatform); var platformSDKBusiness = platformSDKBusinessList.FirstOrDefault(p => p.Platform == firstProductParam.PurchasePlatform); string tradeMode = "", cardId = ""; var extJson = extJArray.FirstOrDefault(j => j.Value("BelongSkuId") == skuGroup.Key); if (firstProductParam.PurchasePlatform == Enums.Platform.拳探) cardId = extJson.Value("CardId"); else if (firstProductParam.PurchasePlatform == Enums.Platform.阿里巴巴) tradeMode = extJson.Value("OrderTradeTypeCode"); var createOrderResponse = platformSDKBusinessList.FirstOrDefault(p => p.Platform == firstProductParam.PurchasePlatform) .FastCreateOrder(new CreateOnlinePurchaseOrderRequest() { AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, AppToken = purchaseAccount.AppToken, Platform = firstProductParam.PurchasePlatform, Consignee = request.Consignee, PurchaseOrderMode = request.PurchaseOrderMode, Remark = request.Remark, SourceShopName = request.ShopName, SourceSku = skuGroup.Key, CargoParamList = productParamList.Select(p => new CargoParamRequest() { ProductId = p.PurchaseProductId, SkuId = p.PurchaseSkuId, Quantity = p.Quantity, SpecId = p.PurchaseSpecId }).ToList(), TradeMode = tradeMode, Extensions = cardId }); var purchaseOrderSimpleInfo = platformSDKBusinessList.FirstOrDefault(p => p.Platform == firstProductParam.PurchasePlatform).GetOrderSimpleInfo(new GetOrderInfoRequest() { AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, AppToken = purchaseAccount.AppToken, OrderId = createOrderResponse.PurchaseOrderId, Platform = firstProductParam.PurchasePlatform }); var purchaseOrderV2 = new PurchaseOrderV2() { Id = createOrderResponse.PurchaseOrderId, ShopId = request.ShopId, OrderState = createOrderResponse.IsPay ? Enums.PurchaseOrderState.待发货 : Enums.PurchaseOrderState.待付款, PurchasePlatform = firstProductParam.PurchasePlatform, ConsigneeContactName = request.Consignee.ContactName, ConsigneeMobile = request.Consignee.Mobile, ConsigneeProvince = request.Consignee.Province, ConsigneeCity = request.Consignee.City, ConsigneeCounty = request.Consignee.County, ConsigneeTown = request.Consignee.Town, ConsigneeAddress = request.Consignee.Address, PurchaserId = firstProductParam.PurchaserId, PurchaserName = firstProductParam.PurchaserName, PurchaseAccountId = purchaseAccount.Id, PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount, ProductAmount = purchaseOrderSimpleInfo.ProductAmount, PurchaseFreight = purchaseOrderSimpleInfo.FreightAmount, Remark = request.Remark, CreateTime = DateTime.Now, PurchaseMethod = Enums.PurchaseMethod.线上采购, PurchaseOrderMode = request.PurchaseOrderMode }; if (createOrderResponse.IsPay) purchaseOrderV2.PayTime = DateTime.Now; var purchaseOrderSku = new PurchaseOrderSku() { Id = idGenerator.NewLong(), ShopId = request.ShopId, PurchaseOrderId = createOrderResponse.PurchaseOrderId, ProductId = firstProductParam.BelongProductId, SkuId = firstProductParam.BelongSkuId, Price = firstProductParam.BelongPrice, SkuTitle = firstProductParam.BelongSkuTitle, Logo = firstProductParam.BelongLogo, Quantity = firstProductParam.BelongQuantity, PurchaseSchemeId = firstProductParam.BelongPurchaseSchemeId, PurchaseSkuIds = string.Join(",", productParamList.Select(p => p.PurchaseSkuId).ToList()), PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount, ProductAmount = purchaseOrderSimpleInfo.ProductAmount, PurchaseFreight = purchaseOrderSimpleInfo.FreightAmount, CreateTime = DateTime.Now }; fsql.Transaction(() => { fsql.Insert(purchaseOrderV2).ExecuteAffrows(); fsql.Insert(purchaseOrderSku).ExecuteAffrows(); }); successSkuIdList.Add(skuGroup.Key); } catch (Exception ex) { //var errorBuilder = new StringBuilder(); //errorBuilder.AppendLine($"采购商:{productParamList.FirstOrDefault().PurchaserName}"); //errorBuilder.AppendLine($"店铺SkuId:{skuGroup.Key}"); //errorBuilder.AppendLine(ex.Message); failSkuList.Add(new BatchCreareOrderFailDetail() { SkuId = skuGroup.Key, ErrorMsg = ex.Message }); //throw new BusinessException(errorBuilder.ToString()); } } return new BatchCreareOrderResponse() { FailSkuList = failSkuList, SuccessSkuIdList = successSkuIdList }; } public PurchaseOrderV2ListResponse GetPurchaseOrderList(SearchPurchaseOrderV2Request request) { if (request.EndDate != null) request.EndDate = request.EndDate.Value.Date.AddDays(1).AddSeconds(-1); var select = fsql.Select().Where(p => p.ShopId == request.ShopId); if (!string.IsNullOrEmpty(request.PurchaseOrderId)) { select = select.Where(p => p.Id == request.PurchaseOrderId); } else { if (!string.IsNullOrEmpty(request.Spu) || !string.IsNullOrEmpty(request.Sku)) { var childSelect = fsql.Select().As("posku") .WhereIf(!string.IsNullOrEmpty(request.Sku), posku => posku.SkuId == request.Sku) .WhereIf(!string.IsNullOrEmpty(request.Spu), posku => posku.ProductId == request.Spu); select = select.Where(p => childSelect.Where(posku => posku.PurchaseOrderId == p.Id).Any()); } select = select.WhereIf(request.PurchaserName != null, p => p.PurchaserName == request.PurchaserName) .WhereIf(request.PurchaseOrderState != null, p => p.OrderState == request.PurchaseOrderState) .WhereIf(request.StartDate != null, p => p.CreateTime >= request.StartDate) .WhereIf(request.EndDate != null, p => p.CreateTime <= request.EndDate); } var purchaseOrderList = select.OrderByDescending(p => p.CreateTime) .Count(out var total) .Page(request.PageIndex, request.PageSize) .ToList(); var purchaseOrderIdList = purchaseOrderList.Select(p => p.Id).ToList(); var purchaseOrderSkuList = fsql.Select().Where(posku => purchaseOrderIdList.Contains(posku.PurchaseOrderId)).ToList(); foreach (var purchaseOrder in purchaseOrderList) purchaseOrder.ItemList = purchaseOrderSkuList.Where(posku => posku.PurchaseOrderId == purchaseOrder.Id).ToList(); return new PurchaseOrderV2ListResponse() { Count = total, ItemList = purchaseOrderList }; } } }