/// <summary> /// 随机立减处理 /// </summary> /// <returns></returns> private async Task handleRandomPreference(int hotelId, Dine dine, DinePaidDetail mainPaidDetail) { PayKind randomPreferencePayKind = await ctx.PayKinds.FirstOrDefaultAsync(p => p.Type == PayKindType.RandomPreference && p.Usable == true); if (randomPreferencePayKind != null) { int top = (int)Math.Ceiling(mainPaidDetail.Price / 50); Random random = new Random(DateTime.Now.Millisecond); decimal randomPrice = (decimal)random.NextDouble(); randomPrice *= top; randomPrice = Math.Floor(randomPrice * 10) / 10; //if(randomPrice == 0) { // randomPrice = 0.1m; //} // 如果随机立减超过应付金额则全额支付 if (randomPrice > mainPaidDetail.Price) { randomPrice = mainPaidDetail.Price; } if (randomPrice != 0) { dine.DinePaidDetails.Add(new DinePaidDetail { PayKind = randomPreferencePayKind, Price = randomPrice }); mainPaidDetail.Price -= randomPrice; } } }
/// <summary> /// 积分处理 /// </summary> private async Task <FunctionResult> handlePoints(decimal priceInPoints, DinePaidDetail mainPaidDetail, Dine dine) { if (priceInPoints == 0) { return(new FunctionResult()); } HotelConfig hotelConfig = await ctx.HotelConfigs.FirstOrDefaultAsync(); DinePaidDetail pointsPaidDetail = new DinePaidDetail { PayKind = await ctx.PayKinds.FirstOrDefaultAsync(p => p.Type == PayKindType.Points), Price = priceInPoints }; Customer customer = await ctx.Customers.FirstOrDefaultAsync(p => p.Id == dine.UserId); int customerPoints = customer == null ? 0 : customer.Points; if (pointsPaidDetail.Price > customerPoints / hotelConfig.PointsRatio) { return(new FunctionResult(false, "积分不足", $"Points Error, Cart PointsPrice: {pointsPaidDetail.Price}, Real Points Price {customerPoints / hotelConfig.PointsRatio}")); } if (pointsPaidDetail.Price > dine.Price) { pointsPaidDetail.Price = dine.Price; } mainPaidDetail.Price -= pointsPaidDetail.Price; dine.DinePaidDetails.Add(pointsPaidDetail); return(new FunctionResult()); }
public async Task OnlinePayCompleted(string dineId, string recordId) { Dine dine = await ctx.Dines.FirstOrDefaultAsync(p => p.Id == dineId); dine.IsPaid = true; DinePaidDetail mainPaidDetail = await ctx.DinePaidDetails.FirstOrDefaultAsync(p => p.Dine.Id == dineId && p.PayKind.Type == PayKindType.Online); mainPaidDetail.RecordId = recordId; await changeCustomerPoints(dine); await ctx.SaveChangesAsync(); }
private async Task changeCustomerPoints(Dine dine) { // 用户总平台消费金额 var yummyonlineCtx = new YummyOnlineContext(); User user = await yummyonlineCtx.Users.FirstOrDefaultAsync(p => p.Id == dine.UserId); if (user == null) { return; } user.Price += dine.Price; await yummyonlineCtx.SaveChangesAsync(); Customer customer = await ctx.Customers.FirstOrDefaultAsync(p => p.Id == dine.UserId); // 如果用户不存在或者是匿名用户 if (customer == null || await new UserManager().IsInRoleAsync(dine.UserId, Role.Nemo)) { return; } // 如果使用的积分支付 DinePaidDetail pointsPaidDetail = await ctx.DinePaidDetails.FirstOrDefaultAsync(p => p.Dine.Id == dine.Id && p.PayKind.Type == PayKindType.Points); if (pointsPaidDetail != null) { HotelConfig config = await ctx.HotelConfigs.FirstOrDefaultAsync(); customer.Points -= Convert.ToInt32((double)pointsPaidDetail.Price / config.PointsRatio); } // 用户点过的菜品增加积分 List <DineMenu> dineMenus = await ctx.DineMenus.Include(p => p.Menu.MenuPrice).Where(p => p.Dine.Id == dine.Id).ToListAsync(); dineMenus?.ForEach(m => { customer.Points += m.Menu.MenuPrice.Points * m.Count; }); }
public async Task <FunctionResult> CreateDine(Cart cart, CartAddition addition) { // 主要支付方式判断 DinePaidDetail mainPaidDetail = new DinePaidDetail { PayKind = await ctx.PayKinds.FirstOrDefaultAsync(p => p.Id == cart.PayKindId), Price = 0, }; if (mainPaidDetail.PayKind == null) { return(new FunctionResult(false, "未找到该支付方式", $"No PayKind {cart.PayKindId}")); } if (addition.From == DineFrom.CustomerBrowser && !mainPaidDetail.PayKind.Usable) { return(new FunctionResult(false, $"{mainPaidDetail.PayKind.Name}不可用", $"PayKind Disabled {mainPaidDetail.PayKind.Id}")); } // 桌号判断 Desk Desk = await ctx.Desks.FirstOrDefaultAsync(p => p.Id == cart.DeskId); if (Desk == null) { return(new FunctionResult(false, "未找到当前桌号", $"No Desk {cart.DeskId}")); } if (!Desk.Usable) { return(new FunctionResult(false, $"{Desk.Name}不可用", $"Desk Disabled {Desk.Id}")); } Dine dine = new Dine { Type = addition.DineType, HeadCount = cart.HeadCount, IsOnline = mainPaidDetail.PayKind.Type == PayKindType.Online, IsPaid = false, Desk = Desk, UserId = addition.UserId, WaiterId = addition.WaiterId, DineMenus = new List <DineMenu>(), Remarks = new List <Remark>(), DinePaidDetails = new List <DinePaidDetail>(), BeginTime = addition.BeginTime ?? DateTime.Now, From = addition.From }; // 订单备注 foreach (int remarkId in cart.Remarks) { Remark remark = ctx.Remarks.FirstOrDefault(p => p.Id == remarkId); if (remark == null) { return(new FunctionResult(false, "未找到备注信息", $"No Remark {remarkId}")); } dine.Price += remark.Price; dine.OriPrice += remark.Price; dine.Remarks.Add(remark); } // 是否有自定义折扣方案 if (addition.Discount.HasValue) { dine.Discount = addition.Discount.Value; dine.DiscountName = addition.DiscountName; dine.DiscountType = DiscountType.Custom; } else { await handleDiscount(mainPaidDetail.PayKind, dine); } List <MenuExtensionWithGift> menuExtensionWithGifts = new List <MenuExtensionWithGift>(); foreach (MenuExtension menuExtension in addition.GiftMenus) { menuExtensionWithGifts.Add(new MenuExtensionWithGift { MenuExtension = menuExtension, IsGift = true }); } foreach (MenuExtension menuExtension in cart.OrderedMenus) { menuExtensionWithGifts.Add(new MenuExtensionWithGift { MenuExtension = menuExtension, IsGift = false }); } // 处理每个点过的菜品 FunctionResult result = await handleDineMenu(menuExtensionWithGifts, dine); if (!result.Succeeded) { return(result); } // 处理最后生成的价格并比较前端传输的价格数据 result = await handleDinePrice(dine, cart.Price); if (!result.Succeeded) { return(result); } mainPaidDetail.Price = dine.Price; // 如果是线上支付并且使用了积分抵扣 if (mainPaidDetail.PayKind.Type == PayKindType.Online && cart.PriceInPoints.HasValue) { result = await handlePoints(cart.PriceInPoints.Value, mainPaidDetail, dine); if (!result.Succeeded) { return(result); } } // 随机立减 if (mainPaidDetail.PayKind.Type == PayKindType.Online) { HotelConfig hotelConfig = await ctx.HotelConfigs.FirstOrDefaultAsync(); // 如果饭店支持随机立减 if (hotelConfig.NeedRandomPreference) { await handleRandomPreference(hotelConfig.Id, dine, mainPaidDetail); } } // 如果是线上支付,则添加DinePaidDetail信息,否则不添加,交给收银系统处理 if (mainPaidDetail.PayKind.Type == PayKindType.Online) { dine.DinePaidDetails.Add(mainPaidDetail); } // 订单发票 if (cart.Invoice != null) { dine.Invoices.Add(new Invoice { Price = dine.Price, Title = cart.Invoice }); } ctx.Dines.Add(dine); await ctx.SaveChangesAsync(); return(new FunctionResult(true, dine)); }
public async Task <JsonResult> Pay(Cart cart) { CartAddition addition = new CartAddition(); // 新建或获取用户Id User user = await createOrGetUser(User.Identity.GetUserId(), "OrderSystem"); if (user == null) { return(Json(new JsonError("创建匿名用户失败"))); } SigninManager.Signin(user, true); addition.UserId = user.Id; // 创建新订单 FunctionResult result = await OrderManager.CreateDine(cart, addition); if (!result.Succeeded) { if (await UserManager.IsInRoleAsync(user.Id, Role.Nemo)) { await UserManager.DeleteAsync(user); await YummyOnlineManager.RecordLog(YummyOnlineDAO.Models.Log.LogProgram.Identity, YummyOnlineDAO.Models.Log.LogLevel.Warning, $"Anonymous User Deleted {user.Id}, Via OrderSystem"); } await HotelManager.RecordLog(HotelDAO.Models.Log.LogLevel.Error, $"{result.Detail}, Host:{Request.UserHostAddress}", HttpPost.GetPostData(Request)); return(Json(new JsonError(result.Message))); } Dine dine = ((Dine)result.Data); await newDineInform(dine, "OrderSystem"); PayKind payKind = await HotelManager.GetPayKindById(cart.PayKindId); string redirectUrl = $"{payKind.CompleteUrl}?Succeeded={true}&DineId={dine.Id}"; if (payKind.Type == PayKindType.Online) { DinePaidDetail mainPaidDetail = await HotelManager.GetDineOnlinePaidDetail(dine.Id); // 如果实际需要支付的价格等于0则直接显示支付完成界面 if (mainPaidDetail.Price == 0) { await onlinePayCompleted(dine.Id, null); } else { redirectUrl = await getOnlineRedirectUrl(dine.Id); } } else { HotelConfig config = await HotelManager.GetHotelConfig(); if (config.IsPrintReciptAfterPayingOffline) { await requestPrintDine(dine.Id, new List <PrintType> { PrintType.Recipt }); } } return(Json(new JsonSuccess(redirectUrl))); }