public void OrderCreateMaintenanceFlashSaleDbDataAsync() { var request = new FlashSaleOrderRequest() { DeviceId = "123456", OrderId = 7788, UserId = new Guid("21fa116e-5aaf-4dd8-9ee0-c2d93cb026c7"), UseTel = "13671714523", Products = new List <OrderItems> { new OrderItems() { Num = 1, PID = "LG-FT-503|11", ActivityId = new Guid("dde07654-f666-4648-9a26-bdfadb0166e5") } } }; using (var client = new FlashSaleClient()) { var result = client.OrderCreateMaintenanceFlashSaleDbData(request); result.ThrowIfException(); Assert.IsNotNull(result.Result); } }
public static async Task DecrementAllFlashCount(FlashSaleOrderRequest requset, List <CheckFlashSaleResponseModel> flashSale) { foreach (var orderItem in flashSale) { await DecrementHashCount(orderItem, orderItem.PID); var request = new GenerateKeyRequest { DeviceId = requset.DeviceId, UserId = requset.UserId.ToString(), UserTel = requset.UseTel, ActivityId = orderItem.ActivityId.ToString(), Pid = orderItem.PID }; var countKey = new GenerateFlashSaleKey(request); if (orderItem.HasQuantityLimit) { await DecrementCountCount(orderItem, countKey.PersonalkeyUserId); await DecrementCountCount(orderItem, countKey.PersonalkeyDeviceId); await DecrementCountCount(orderItem, countKey.PersonalkeyUseTel); } if (orderItem.HasPlaceLimit) { await DecrementCountCount(orderItem, countKey.PlacekeyUserId); await DecrementCountCount(orderItem, countKey.PlacekeyDeviceId); await DecrementCountCount(orderItem, countKey.PlacekeyUseTel); } Logger.Info($"全局会场限购2id是{orderItem.AllPlaceLimitId}"); if (!string.IsNullOrEmpty(orderItem.AllPlaceLimitId)) { var request1 = new GenerateKeyRequest { DeviceId = requset.DeviceId, UserId = requset.UserId.ToString(), UserTel = requset.UseTel, ActivityId = orderItem.AllPlaceLimitId, Pid = orderItem.PID, IsAllPlaceLimit = true }; var countKeyAllLimit = new GenerateFlashSaleKey(request1); await DecrementCountCount(orderItem, countKeyAllLimit.PlacekeyUserId); await DecrementCountCount(orderItem, countKeyAllLimit.PlacekeyDeviceId); await DecrementCountCount(orderItem, countKeyAllLimit.PlacekeyUseTel); Logger.Info($"全局会场限购3id是{orderItem.AllPlaceLimitId}"); } } }
/// <summary> /// 验证抢购活动商品是否通过普通商品验证 /// </summary> /// <param name="flashSaleResult"></param> /// <param name="fsRequest"></param> /// <param name="normalProducts">需要验证普通商品限购的</param> /// <returns></returns> public static async Task <Tuple <bool, string> > CheckNormalProductAsync(List <CheckFlashSaleResponseModel> flashSaleResult, FlashSaleOrderRequest fsRequest, List <Order.Request.OrderItem> normalProducts) { var returnResult = true; var returnMessage = ""; try { //抢购活动商品中 未配置限购的商品 var noLimits = flashSaleResult?.Where(x => !x.HasPlaceLimit && !x.HasTotalQuantityLimit && !x.HasQuantityLimit)?.ToList(); if (noLimits?.Count > 0) { var normalCheckRequest = noLimits.Select(x => new Order.Request.OrderItem() { Pid = x.PID, Num = x.Num, Name = fsRequest.Products.FirstOrDefault(p => p.PID.Equals(x.PID, StringComparison.CurrentCultureIgnoreCase)).ProductName }); normalProducts.AddRange(normalCheckRequest); } //验证普通商品每单限购 if (normalProducts.Count > 0) { var normalCheckResult = await CheckNormalProductOrderLimit(normalProducts); if (!normalCheckResult.Item1) { //没通过验证 限时抢购所有商品减掉计数器 (限时抢购验证中 加了限购计数器) await FlashSaleCounter.DecrementAllFlashCount(fsRequest, flashSaleResult); returnResult = false; returnMessage = normalCheckResult.Item2; } } } catch (Exception ex) { Logger.Error($"CheckFlashSaleNormalProductAsync异常,flashSaleResult:{JsonConvert.SerializeObject(flashSaleResult)}," + $"fsRequest:{JsonConvert.SerializeObject(fsRequest)}", ex); } return(new Tuple <bool, string>(returnResult, returnMessage)); }
public async Task <OperationResult <FlashSaleOrderResponse> > CheckCanBuyFlashSaleOrderAsync(FlashSaleOrderRequest request) { if (request == null || request.UserId == Guid.Empty || string.IsNullOrWhiteSpace(request.UseTel) || request.Products == null || !request.Products.Any()) { return(OperationResult.FromError <FlashSaleOrderResponse>("-1", "参数错误")); } else { return(OperationResult.FromResult(await FlashSaleManager.CheckCanBuyFlashSaleOrderAsync(request))); } }
public async Task <OperationResult <bool> > OrderCreateMaintenanceFlashSaleDbDataAsync(FlashSaleOrderRequest flashSale) { return(OperationResult.FromResult(await FlashSaleManager.OrderCreateMaintenanceFlashSaleDbDataAsync(flashSale))); }
public async Task <OperationResult <CreateOrderResult> > FlashSaleCreateOrderAsync(CreateOrderRequest request, int type, FlashSaleOrderRequest flashrequest) { return(OperationResult.FromResult(await FlashSaleCreateOrderManager.FlashSaleCreateOrder(request))); }
public static async Task <List <CheckFlashSaleResponseModel> > CheckFlashSaleAsync(FlashSaleOrderRequest request) { var result = new CheckFlashSaleResponseModel() { Code = CheckFlashSaleStatus.CreateOrderFailed }; var orderItems = new List <CheckFlashSaleResponseModel>(); foreach (var item in request.Products) { result = await CheckFlashSaleByPidAsync(item, request.UserId, request.DeviceId, request.UseTel); if (item.ActivityId != null) { orderItems.Add(new CheckFlashSaleResponseModel() { HasPlaceLimit = result.HasPlaceLimit, HasQuantityLimit = result.HasQuantityLimit, AllPlaceLimitId = result.AllPlaceLimitId, Code = result.Code, Num = item.Num, PID = item.PID, ActivityId = item.ActivityId.Value }); } if (result.Code < 0) { break; } } var items = orderItems.Where(r => r.Code != CheckFlashSaleStatus.CreateOrderFailed && r.Code != CheckFlashSaleStatus.NoExist).ToList(); if (!orderItems.Any() || result.Code > 0) { return(items); } await FlashSaleCounter.DecrementAllFlashCount(request, items); return(orderItems); }
public static List <Order.Request.OrderItem> ModelConvert(List <OrderItem> items, ref FlashSaleOrderRequest flash) { var orderItems = new List <Order.Request.OrderItem>(); foreach (var item in items) { var orderItem = new Order.Request.OrderItem(); { orderItem.Category = item.Category; orderItem.Cost = item.Cost; orderItem.Fupid = item.Fupid; orderItem.MarkedPrice = item.MarkedPrice; orderItem.Name = item.Name; orderItem.Num = item.Num; orderItem.Pid = item.Pid; orderItem.Price = item.Price; switch (item.ProductType) { case OrderProductTypes.None: orderItem.ProductType = Order.Request.OrderProductTypes.None; break; case OrderProductTypes.Tire: orderItem.ProductType = Order.Request.OrderProductTypes.Tire; break; case OrderProductTypes.BaoYang: orderItem.ProductType = Order.Request.OrderProductTypes.BaoYang; break; case OrderProductTypes.AutoProduct: orderItem.ProductType = Order.Request.OrderProductTypes.AutoProduct; break; case OrderProductTypes.Beauty: orderItem.ProductType = Order.Request.OrderProductTypes.Beauty; break; case OrderProductTypes.Gifts: orderItem.ProductType = Order.Request.OrderProductTypes.Gifts; break; case OrderProductTypes.Package: orderItem.ProductType = Order.Request.OrderProductTypes.Package; break; case OrderProductTypes.Promotion: orderItem.ProductType = Order.Request.OrderProductTypes.Promotion; break; } orderItem.Remark = item.Remark; orderItem.Size = item.Size; orderItem.UsePromotionCode = item.UsePromotionCode; orderItem.ActivityId = item.ActivityId; if (item.ActivityId.HasValue) { var activityTypeModel = ActivityManager.SelectActivityTypeByActivityIds(new List <Guid> { item.ActivityId.Value }).FirstOrDefault(); if (activityTypeModel != null) { var temp = flash.Products.ToList(); temp.Add( new OrderItems { ActivityId = item.ActivityId, Num = item.Num, PID = item.Pid, Type = activityTypeModel.Type }); flash.Products = temp; if (activityTypeModel.Type == 1) { //用来控制下单是否走老逻辑 orderItem.IsVerifyActivity = GlobalConstant.VerifyActivityNew == 0; } if (activityTypeModel.Type == 5) { orderItem.IsVerifyActivity = false; } } } if (item.ExtInfo != null) { orderItem.ExtInfo = new Order.Models.OrderListExtModel { InstallShopId = item.ExtInfo.InstallShopId, InstallShop = item.ExtInfo.InstallShop }; if (item.ExtInfo.Car != null) { orderItem.ExtInfo.Car = new Order.Models.OrderCarModel { VehicleId = item.ExtInfo.Car.VehicleId, Vehicle = item.ExtInfo.Car.Vehicle, Brand = item.ExtInfo.Car.Brand, PaiLiang = item.ExtInfo.Car.PaiLiang, Nian = item.ExtInfo.Car.Nian, SalesName = item.ExtInfo.Car.SalesName, LiYangId = item.ExtInfo.Car.LiYangId, Tid = item.ExtInfo.Car.Tid, VinCode = item.ExtInfo.Car.VinCode, PlateNumber = item.ExtInfo.Car.PlateNumber, ExtCol = item.ExtInfo.Car.ExtCol, Distance = item.ExtInfo.Car.Distance, OnRoadMonth = item.ExtInfo.Car.OnRoadMonth, OnRoadYear = item.ExtInfo.Car.OnRoadYear, Remark = item.ExtInfo.Car.Remark, CarTypeDescription = item.ExtInfo.Car.CarTypeDescription, }; } ; } orderItem.ServiceGroupId = item.ServiceGroupId; orderItem.PackageItems = item.PackageItems != null?ModelConvert(item.PackageItems.ToList(), ref flash) : null; } orderItems.Add(orderItem); } return(orderItems); }
public static async Task <CreateOrderResult> FlashSaleCreateOrder(Order.Request.CreateOrderRequest request) { var flashrequest = new FlashSaleOrderRequest() { Products = new List <OrderItems>() }; var pintuanFlag = false; var pintuanProductGroupId = ""; var pintuanPid = ""; var pintuanCount = 0; try { if (request.Items != null && request.Items.Any()) { foreach (var item in request.Items) { if (item.ActivityId.HasValue) { var activityTypeModel = new ActivityTypeModel(); // 增加拼团校验逻辑 if (item.ActivityId != null && await GroupBuyingManager.CheckProductGroupId(item.ActivityId.Value)) { activityTypeModel = new ActivityTypeModel { ActivityId = item.ActivityId.Value, Type = 7 }; } else { // 不是拼团ActivityId activityTypeModel = ActivityManager.SelectActivityTypeByActivityIds(new List <Guid> { item.ActivityId.Value }).FirstOrDefault(); } if (activityTypeModel != null) { var temp = flashrequest.Products.ToList(); temp.Add( new OrderItems { ActivityId = item.ActivityId, Num = item.Num, PID = item.Pid, Type = activityTypeModel.Type }); flashrequest.Products = temp; if (activityTypeModel.Type == 1) { //用来控制下单是否走老逻辑 item.IsVerifyActivity = false; } if (activityTypeModel.Type == 5) { item.IsVerifyActivity = false; } //砍价 if (activityTypeModel.Type == 9) { item.IsVerifyActivity = false; } //拼团 if (activityTypeModel.Type == 7) { request.Status = "0NewPingTuan"; item.IsVerifyActivity = false; var buyLimitInfo = await GroupBuyingManager.GetBuyLimitInfo(item.ActivityId.Value, item.Pid, request.Customer.UserId); if (string.IsNullOrWhiteSpace(buyLimitInfo?.PID)) { return(new CreateOrderResult { ErrorCode = -1000, ErrorMessage = "未找到该拼团产品!" }); } if (buyLimitInfo.BuyLimitCount > 0 && buyLimitInfo.BuyLimitCount <= buyLimitInfo.CurrentOrderCount) { return(new CreateOrderResult { ErrorCode = -1000, ErrorMessage = "已达到限购单数!" }); } if (item.Num > buyLimitInfo.UpperLimitPerOrder && buyLimitInfo.UpperLimitPerOrder != 0) { return(new CreateOrderResult { ErrorCode = -1000, ErrorMessage = "购买数量不符合要求!" }); } using (var client = new PinTuanClient()) { var result = await client.IncreaseSoldCountAsync(buyLimitInfo.ProductGroupId, buyLimitInfo.PID, item.Num); if (!(result.Success && result.Result.Code == 1)) { return(new CreateOrderResult { ErrorCode = -1000, ErrorMessage = result.Result?.Info ?? "出现异常" }); } pintuanFlag = true; pintuanPid = buyLimitInfo.PID; pintuanProductGroupId = buyLimitInfo.ProductGroupId; pintuanCount = item.Num; } } } } } } flashrequest.DeviceId = request.DeviceID; flashrequest.UseTel = request.Customer.UserTel; flashrequest.UserId = request.Customer.UserId; ICounter counter = null; #region 限时抢购校验 var fsRequest = new FlashSaleOrderRequest(); var isCheckFlash = false; var flashSaleResult = new List <CheckFlashSaleResponseModel>(); if (flashrequest.Products != null && flashrequest.Products.Any()) { var fsItems = flashrequest.Products.Where(r => r.Type == 1); var orderItemses = fsItems as OrderItems[] ?? fsItems.ToArray(); if (orderItemses.Any()) { isCheckFlash = true; fsRequest.DeviceId = flashrequest.DeviceId; fsRequest.UseTel = flashrequest.UseTel; fsRequest.UserId = flashrequest.UserId; fsRequest.Products = orderItemses; flashSaleResult = await ActivityValidator.CheckFlashSaleAsync(fsRequest); if (flashSaleResult.Any(r => r.Code != Model.CheckFlashSaleStatus.Succeed)) { return(new CreateOrderResult { ErrorCode = (int)flashSaleResult.Where(r => r.Code != Model.CheckFlashSaleStatus.Succeed).Select(c => c.Code).FirstOrDefault(), ErrorMessage = flashSaleResult.Where(r => r.Code != Model.CheckFlashSaleStatus.Succeed).Select(c => c.Code).FirstOrDefault().GetRemark() }); } flashrequest.Products = orderItemses.Select(r => { r.AllPlaceLimitId = flashSaleResult.Where(p => p.PID == r.PID) .Select(_ => _.AllPlaceLimitId) .FirstOrDefault(); return(r); }); } } #endregion #region 保养校验 if (flashrequest.Products != null && flashrequest.Products.Any()) { var byRequest = flashrequest.Products.Where(r => r.Type == 5); var activityId = byRequest.FirstOrDefault(o => o.ActivityId != Guid.Empty)?.ActivityId; if (activityId != null) { List <BaoYang.Models.BaoYangVehicleFivePropertyModel> propertiesList = null; if (request.Car != null && request.Car.ExtCol != null && request.Car.ExtCol.ContainsKey("Properties") && request.Car.ExtCol["Properties"] != null) { string properties = request.Car.ExtCol["Properties"].ToString(); List <dynamic> list = JsonConvert.DeserializeObject <List <dynamic> >(properties); propertiesList = list.Select(o => new BaoYang.Models.BaoYangVehicleFivePropertyModel() { Property = o.propertyKey, PropertyValue = o.propertyValue }).ToList(); } ValidateOrderRequest validateRequest = new ValidateOrderRequest() { ActivityId = activityId.Value, UserId = flashrequest.UserId, Products = request.Items.Where( o => o.ActivityId != null && o.ActivityId.HasValue && !o.Pid.StartsWith("FU-") && !o.Pid.StartsWith("TR-")) .Select(o => new OrderProduct() { ProductId = o.Pid, Count = o.Num, ActivityId = o.ActivityId.Value, Price = o.Price, ProductType = "Product" }).ToList(), ShopId = request.Delivery.InstallShopId ?? 0, Channel = request.OrderChannel, InstallType = request.Delivery.InstallType, Vehicle = new BaoYang.Models.VehicleRequestModel() { VehicleId = request.Car.VehicleId, PaiLiang = request.Car.PaiLiang, Nian = request.Car.Nian, Tid = request.Car.Tid, Properties = propertiesList }, RegionId = 1 }; using (var client = new BaoYangClient()) { var baoyangResult = await client.ValidateFixedPriceActivityOrderAsync(validateRequest); if (!baoyangResult.Success || !baoyangResult.Result) { return(new CreateOrderResult() { ErrorCode = (int)CreateOrderErrorCode.ProductValidateFailed, ErrorMessage = CreateOrderMessageDic.GetMessage(CreateOrderErrorCode.ProductValidateFailed) }); } } // 验证活动状态 var validateResult = await ActivityValidator.ValidateBaoyang(activityId.Value); if (validateResult.Item1 == Model.CreateOrderErrorCode.ActivitySatisfied) { // 验证限购数量 counter = new BaoYangCounter(activityId.Value, validateResult.Item2, validateResult.Item3, validateResult.Item4); var countResult = await counter.CanPurchaseAndIncreaseCount(flashrequest.UserId, flashrequest.DeviceId, flashrequest.UseTel); if (countResult.Code != Model.CreateOrderErrorCode.ActivitySatisfied) { return(new CreateOrderResult() { ErrorCode = (int)countResult.Code, ErrorMessage = CreateOrderMessageDic.GetMessage(countResult.Code) }); } } else { return(new CreateOrderResult() { ErrorCode = (int)validateResult.Item1, ErrorMessage = CreateOrderMessageDic.GetMessage(validateResult.Item1) }); } } } #endregion #region 分享砍价活动 bool bargainflag = false; Guid ownerId = new Guid(); string pid = ""; var parameters = new List <BuyLimitDetailModel>(); if (flashrequest.Products != null && flashrequest.Products.Any()) { var item = flashrequest.Products.FirstOrDefault(g => g.Type == 9); if (item != null) { ownerId = flashrequest.UserId; pid = item.PID; parameters.Add(new BuyLimitDetailModel { ModuleName = "sharebargain", LimitObjectId = ownerId.ToString("D"), ObjectType = LimitObjectTypeEnum.UserId.ToString(), Remark = "砍价实物商品下单" }); if (!string.IsNullOrWhiteSpace(flashrequest.DeviceId)) { parameters.Add(new BuyLimitDetailModel { ModuleName = "sharebargain", LimitObjectId = flashrequest.DeviceId, ObjectType = LimitObjectTypeEnum.DeviceId.ToString(), Remark = "砍价实物商品下单" }); } var val = await DalBargain.CheckBargainProductStatusByPID(ownerId, pid); if (!val) { return(new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = "您当前没有资格享受该优惠!" }); } bargainflag = true; } } #endregion try { using (var client = new CreateOrderClient()) { var result = await client.CreateOrderAsync(request); result.ThrowIfException(); if (result.Success) { if (counter != null) { await counter.AddOrderRecord(result.Result.OrderId, flashrequest.UserId, flashrequest.DeviceId, flashrequest.UseTel); } if (bargainflag) { var tal = await DalBargain.BuyBargainProductAsync(ownerId, pid, result.Result.OrderId); if (tal > 0) { parameters.ForEach(g => { g.ModuleProductId = tal.ToString(); g.Reference = result.Result.OrderId.ToString(); }); await LimitBuyManager.AddBuyLimitInfo(parameters); Logger.Info($"UserId为{ownerId}的用户享受砍价优惠,已购买pid为{pid}的商品"); } else { Logger.Error($"UserId为{ownerId}的用户享受砍价优惠,购买pid为{pid}的商品,修改购买状态时出错"); } } flashrequest.OrderId = result.Result.OrderId; if (isCheckFlash) { Logger.Info($"下单成功订单号=>{flashrequest.OrderId}发送消息"); try { TuhuNotification.SendNotification(".FlashSaleCreateOrder.", flashrequest); } catch (Exception ex) { var str = ""; try { str = JsonConvert.SerializeObject(flashrequest); } catch (Exception) { str = result.Result.OrderId.ToString(); } Logger.Error($"request-->{str}-->mq发送失败", ex); } } return(new CreateOrderResult { OrderId = result.Result.OrderId, OrderNo = result.Result.OrderNo }); } else { // 拼团下单失败,修改虚拟库存 if (pintuanFlag) { using (var client2 = new PinTuanClient()) { var result2 = await client2.DecrementSoldCountAsync(pintuanProductGroupId, pintuanPid, pintuanCount); if (!(result2.Success && result2.Result.Code == 1)) { Logger.Error($"拼团产品下单失败,虚拟库存修改失败-->{pintuanProductGroupId}/{pintuanPid}/{pintuanCount}"); } } } if (counter != null) { await counter.DecreasePurchaseCount(flashrequest.UserId, flashrequest.DeviceId, flashrequest.UseTel); } Logger.Info("调用下单接口失败" + result.ErrorCode + result.ErrorMessage); if (isCheckFlash) { await FlashSaleCounter.DecrementAllFlashCount(fsRequest, flashSaleResult); } if (result.ErrorCode == "Order_FlashSale_Error") { return(new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = CreateOrderMessageDic.GetFlashSaleErrorMessage(result.ErrorMessage) }); } if (result.ErrorCode == "Invalid_PromotionCode") { return new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = "优惠券无效!" } } ; else { return(new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = "下单失败!" }); } } } } catch (Exception ex) { if (counter != null) { await counter.DecreasePurchaseCount(flashrequest.UserId, flashrequest.DeviceId, flashrequest.UseTel); } if (isCheckFlash) { await FlashSaleCounter.DecrementAllFlashCount(fsRequest, flashSaleResult); } Logger.Error("调用下单接口失败" + ex.Message + ex.InnerException); return(new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = "下单失败" }); } } catch (Exception ex) { Logger.Error(ex); return(new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = "下单失败" }); } }
public static async Task <CreateOrderResult> FlashSaleCreateOrder(Order.Request.CreateOrderRequest request) { var flashrequest = new FlashSaleOrderRequest() { Products = new List <OrderItems>() }; var pintuanFlag = false; var pintuanProductGroupId = ""; var pintuanPid = ""; var pintuanCount = 0; try { if (request.Items != null && request.Items.Any()) { foreach (var item in request.Items) { if (item.ActivityId.HasValue) { var activityTypeModel = new ActivityTypeModel(); // 增加拼团校验逻辑 if (item.ActivityId != null && await GroupBuyingManager.CheckProductGroupId(item.ActivityId.Value)) { activityTypeModel = new ActivityTypeModel { ActivityId = item.ActivityId.Value, Type = 7 }; } else if ((await DalSalePromotion.CheckActivityIsEffictive(item.ActivityId.Value.ToString())))///黎先攀的打折活动 { activityTypeModel = new ActivityTypeModel { ActivityId = item.ActivityId.Value, Type = 11 }; } else { // 不是拼团ActivityId activityTypeModel = ActivityManager.SelectActivityTypeByActivityIds(new List <Guid> { item.ActivityId.Value }).FirstOrDefault(); } if (activityTypeModel != null) { var temp = flashrequest.Products.ToList(); temp.Add( new OrderItems { ActivityId = item.ActivityId, Num = item.Num, PID = item.Pid, Type = activityTypeModel.Type, Price = item.Price, ListPrice = item.ListPrice }); flashrequest.Products = temp; if (activityTypeModel.Type == 1) { //用来控制下单是否走老逻辑 item.IsVerifyActivity = false; } if (activityTypeModel.Type == 5) { item.IsVerifyActivity = false; } //砍价 if (activityTypeModel.Type == 9) { item.IsVerifyActivity = false; } if (activityTypeModel.Type == 11) { item.IsVerifyActivity = false; } //拼团 if (activityTypeModel.Type == 7) { request.Status = "0NewPingTuan"; item.IsVerifyActivity = false; var buyLimitInfo = await GroupBuyingManager.GetBuyLimitInfo(item.ActivityId.Value, item.Pid, request.Customer.UserId); if (string.IsNullOrWhiteSpace(buyLimitInfo?.PID)) { return(new CreateOrderResult { ErrorCode = -1000, ErrorMessage = "未找到该拼团产品!" }); } if (buyLimitInfo.BuyLimitCount > 0 && buyLimitInfo.BuyLimitCount <= buyLimitInfo.CurrentOrderCount) { return(new CreateOrderResult { ErrorCode = -1000, ErrorMessage = "已达到限购单数!" }); } if (item.Num > buyLimitInfo.UpperLimitPerOrder && buyLimitInfo.UpperLimitPerOrder != 0) { return(new CreateOrderResult { ErrorCode = -1000, ErrorMessage = "购买数量不符合要求!" }); } using (var client = new PinTuanClient()) { var result = await client.IncreaseSoldCountAsync(buyLimitInfo.ProductGroupId, buyLimitInfo.PID, item.Num); if (!(result.Success && result.Result.Code == 1)) { return(new CreateOrderResult { ErrorCode = -1000, ErrorMessage = result.Result?.Info ?? "出现异常" }); } pintuanFlag = true; pintuanPid = buyLimitInfo.PID; pintuanProductGroupId = buyLimitInfo.ProductGroupId; pintuanCount = item.Num; } } //锦湖轮胎 if (item.Pid.StartsWith("TR-", StringComparison.OrdinalIgnoreCase) && !await CheckIsPassKumhoTireFlashSale(item.ActivityId?.ToString(), request.Customer.UserId)) { return(new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = "此价格为企业客户专享,无法生成订单" }); } } } } } flashrequest.DeviceId = request.DeviceID; flashrequest.UseTel = request.Customer.UserTel; flashrequest.UserId = request.Customer.UserId; ICounter counter = null; #region 限时抢购校验 var fsRequest = new FlashSaleOrderRequest(); var isCheckFlash = false; var flashSaleResult = new List <CheckFlashSaleResponseModel>(); if (flashrequest.Products != null && flashrequest.Products.Any()) { var fsItems = flashrequest.Products.Where(r => r.Type == 1); var orderItemses = fsItems as OrderItems[] ?? fsItems.ToArray(); if (orderItemses.Any()) { isCheckFlash = true; fsRequest.DeviceId = flashrequest.DeviceId; fsRequest.UseTel = flashrequest.UseTel; fsRequest.UserId = flashrequest.UserId; fsRequest.Products = orderItemses; flashSaleResult = await ActivityValidator.CheckFlashSaleAsync(fsRequest); if (flashSaleResult.Any(r => r.Code != Model.CheckFlashSaleStatus.Succeed)) { return(new CreateOrderResult { ErrorCode = (int)flashSaleResult.Where(r => r.Code != Model.CheckFlashSaleStatus.Succeed).Select(c => c.Code).FirstOrDefault(), ErrorMessage = flashSaleResult.Where(r => r.Code != Model.CheckFlashSaleStatus.Succeed).Select(c => c.Code).FirstOrDefault().GetRemark() }); } flashrequest.Products = orderItemses.Select(r => { r.AllPlaceLimitId = flashSaleResult.Where(p => p.PID == r.PID) .Select(_ => _.AllPlaceLimitId) .FirstOrDefault(); return(r); }); } } #endregion #region 保养校验 if (flashrequest.Products != null && flashrequest.Products.Any()) { var byRequest = flashrequest.Products.Where(r => r.Type == 5); var activityId = byRequest.FirstOrDefault(o => o.ActivityId != Guid.Empty)?.ActivityId; if (activityId != null) { ValidateOrderRequest validateRequest = new ValidateOrderRequest() { ActivityId = activityId.Value, UserId = flashrequest.UserId, Products = request.Items.Where( o => o.ActivityId != null && o.ActivityId.HasValue && !o.Pid.StartsWith("FU-") && !o.Pid.StartsWith("TR-")) .Select(o => new OrderProduct() { ProductId = o.Pid, Count = o.Num, ActivityId = o.ActivityId.Value, Price = o.Price, ProductType = "Product" }).ToList(), ShopId = request.Delivery.InstallShopId ?? 0, Channel = request.OrderChannel, InstallType = request.Delivery.InstallType, Vehicle = Converter.Convert(request.Car), RegionId = 1 }; using (var client = new BaoYangClient()) { var baoyangResult = await client.ValidateFixedPriceActivityOrderAsync(validateRequest); if (!baoyangResult.Success || !baoyangResult.Result) { return(new CreateOrderResult() { ErrorCode = (int)CreateOrderErrorCode.ProductValidateFailed, ErrorMessage = CreateOrderMessageDic.GetMessage(CreateOrderErrorCode.ProductValidateFailed) }); } } // 验证活动状态 var validateResult = await ActivityValidator.ValidateBaoyang(activityId.Value); if (validateResult.Item1 == Model.CreateOrderErrorCode.ActivitySatisfied) { // 验证限购数量 counter = new BaoYangCounter(activityId.Value, validateResult.Item2, validateResult.Item3, validateResult.Item4); var countResult = await counter.CanPurchaseAndIncreaseCount(flashrequest.UserId, flashrequest.DeviceId, flashrequest.UseTel); if (countResult.Code != Model.CreateOrderErrorCode.ActivitySatisfied) { return(new CreateOrderResult() { ErrorCode = (int)countResult.Code, ErrorMessage = CreateOrderMessageDic.GetMessage(countResult.Code) }); } } else { return(new CreateOrderResult() { ErrorCode = (int)validateResult.Item1, ErrorMessage = CreateOrderMessageDic.GetMessage(validateResult.Item1) }); } } } #endregion #region 分享砍价活动 bool bargainflag = false; Guid ownerId = new Guid(); string pid = ""; var parameters = new List <BuyLimitDetailModel>(); if (flashrequest.Products != null && flashrequest.Products.Any()) { var item = flashrequest.Products.FirstOrDefault(g => g.Type == 9); if (item != null) { ownerId = flashrequest.UserId; pid = item.PID; parameters.Add(new BuyLimitDetailModel { ModuleName = "sharebargain", LimitObjectId = ownerId.ToString("D"), ObjectType = LimitObjectTypeEnum.UserId.ToString(), Remark = "砍价实物商品下单" }); if (!string.IsNullOrWhiteSpace(flashrequest.DeviceId)) { parameters.Add(new BuyLimitDetailModel { ModuleName = "sharebargain", LimitObjectId = flashrequest.DeviceId, ObjectType = LimitObjectTypeEnum.DeviceId.ToString(), Remark = "砍价实物商品下单" }); } var val = await DalBargain.CheckBargainProductStatusByPID(ownerId, pid); if (!val) { return(new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = "您当前没有资格享受该优惠!" }); } bargainflag = true; } } #endregion IEnumerable <OrderItems> discountProducts = null; #region 黎先攀的打折活动 if (flashrequest.Products != null && flashrequest.Products.Any()) { discountProducts = flashrequest.Products.Where(r => r.Type == 11);///打折活动商品 if (discountProducts.Any()) { var productHitDiscountManager = new ProductHitDiscountManager(discountProducts.Select(s => new DiscountActivityRequest() { Pid = s.PID, Num = s.Num, Price = s.ListPrice }).ToList(), request.Customer.UserId.ToString(), false, true); var realProductDiscounts = (await productHitDiscountManager.GetProductHitDiscountInfo()).ToList();//实时产品折扣信息 var effictiveDiscountNum = discountProducts.Join(realProductDiscounts, x => x.PID, y => y.Pid, (x, y) => { return(y.IsHit && string.Equals(y.DiscountRule?.ActivityId, x.ActivityId.ToString()) && Convert.ToInt32(y.DiscountPrice) == Convert.ToInt32(x.Price)); }).Where(s => s).Count(); if (effictiveDiscountNum != discountProducts.Count()) { var firtNotHitProduct = realProductDiscounts.FirstOrDefault(s => !s.IsHit); foreach (var item in discountProducts) { if (item.ActivityId != null && item.ActivityId != Guid.Empty) { TuhuNotification.SendNotification("DiscountActivityCreateOrder", new DiscountCreateOrderRequest() { ActivityId = item.ActivityId.ToString(), Num = item.Num, Pid = item.PID, UserId = request.Customer.UserId.ToString() }); } } var errorMsg = firtNotHitProduct != null ? firtNotHitProduct.FailMessage : "打折规则已变更"; Logger.Info($"打折活动下单失败:{errorMsg},discountProducts:{JsonConvert.SerializeObject(discountProducts)}," + $"realProductDiscounts:{JsonConvert.SerializeObject(realProductDiscounts)}"); return(new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = errorMsg }); } } } #endregion try { using (var client = new CreateOrderClient()) { var result = await client.CreateOrderAsync(request); result.ThrowIfException(); if (result.Success) { if (counter != null) { await counter.AddOrderRecord(result.Result.OrderId, flashrequest.UserId, flashrequest.DeviceId, flashrequest.UseTel); } if (bargainflag) { var tal = await DalBargain.BuyBargainProductAsync(ownerId, pid, result.Result.OrderId); if (tal > 0) { parameters.ForEach(g => { g.ModuleProductId = tal.ToString(); g.Reference = result.Result.OrderId.ToString(); }); await LimitBuyManager.AddBuyLimitInfo(parameters); Logger.Info($"UserId为{ownerId}的用户享受砍价优惠,已购买pid为{pid}的商品"); } else { Logger.Error($"UserId为{ownerId}的用户享受砍价优惠,购买pid为{pid}的商品,修改购买状态时出错"); } } flashrequest.OrderId = result.Result.OrderId; if (isCheckFlash) { Logger.Info($"下单成功订单号=>{flashrequest.OrderId}发送消息"); try { TuhuNotification.SendNotification(".FlashSaleCreateOrder.", flashrequest); } catch (Exception ex) { var str = ""; try { str = JsonConvert.SerializeObject(flashrequest); } catch (Exception) { str = result.Result.OrderId.ToString(); } Logger.Error($"request-->{str}-->mq发送失败", ex); } } if (discountProducts != null && discountProducts.Any())//如果是黎先攀的打折活动 { foreach (var item in discountProducts) { if (item.ActivityId != null && item.ActivityId != Guid.Empty) { TuhuNotification.SendNotification("DiscountActivityCreateOrder", new DiscountCreateOrderRequest() { ActivityId = item.ActivityId.ToString(), Num = item.Num, OrderId = result.Result.OrderId, Pid = item.PID, UserId = request.Customer.UserId.ToString() }); } } } return(new CreateOrderResult { OrderId = result.Result.OrderId, OrderNo = result.Result.OrderNo }); } else { // 拼团下单失败,修改虚拟库存 if (pintuanFlag) { using (var client2 = new PinTuanClient()) { var result2 = await client2.DecrementSoldCountAsync(pintuanProductGroupId, pintuanPid, pintuanCount); if (!(result2.Success && result2.Result.Code == 1)) { Logger.Error($"拼团产品下单失败,虚拟库存修改失败-->{pintuanProductGroupId}/{pintuanPid}/{pintuanCount}"); } } } if (counter != null) { await counter.DecreasePurchaseCount(flashrequest.UserId, flashrequest.DeviceId, flashrequest.UseTel); } Logger.Info("调用下单接口失败" + result.ErrorCode + result.ErrorMessage); if (isCheckFlash) { await FlashSaleCounter.DecrementAllFlashCount(fsRequest, flashSaleResult); } if (result.ErrorCode == "Order_FlashSale_Error") { return(new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = CreateOrderMessageDic.GetFlashSaleErrorMessage(result.ErrorMessage) }); } if (result.ErrorCode == "Invalid_PromotionCode") { return new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = "优惠券无效!" } } ; else { return(new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = "下单失败!" }); } } } } catch (Exception ex) { if (counter != null) { await counter.DecreasePurchaseCount(flashrequest.UserId, flashrequest.DeviceId, flashrequest.UseTel); } if (isCheckFlash) { await FlashSaleCounter.DecrementAllFlashCount(fsRequest, flashSaleResult); } Logger.Error("调用下单接口失败" + ex.Message + ex.InnerException); return(new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = "下单失败" }); } } catch (Exception ex) { Logger.Error(ex); return(new CreateOrderResult() { ErrorCode = -1000, ErrorMessage = "下单失败" }); } }