/// <summary> /// 收银员台支付 /// </summary> public async Task <ActionResult> ManagerPay(Cart cart, ManagerCartAddition cartAddition) { SystemConfig system = await YummyOnlineManager.GetSystemConfig(); if (system.Token != cartAddition.Token) { return(Json(new JsonError("身份验证失败"))); } var hotel = await YummyOnlineManager.GetHotelById(cartAddition.HotelId); CurrHotel = new CurrHotelInfo(hotel.Id, hotel.ConnectionString); if (!hotel.Usable) { return(RedirectToAction("HotelUnavailable", "Error")); } cart.PayKindId = await new HotelManager(CurrHotel.ConnectionString).GetOtherPayKindId(); CartAddition addition = new CartAddition { WaiterId = cartAddition.WaiterId, DineType = cartAddition.DineType, Discount = cartAddition.Discount, DiscountName = cartAddition.DiscountName, GiftMenus = cartAddition.GiftMenus, From = DineFrom.Manager }; User user = await UserManager.FindByIdAsync(cartAddition.UserId); 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 Manager"); } 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, "Manager"); return(Json(new JsonSuccess { Data = dine.Id })); }
public ShoppingCart Post([FromBody] CartAddition item) { var userId = HttpContext.GetUserId(); if (!userId.HasValue) { throw new Exception("Please login first"); } return(shoppingCartService.AddItemToCart(item.ProductId, item.Quantity, userId.Value)); }
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))); }