/// <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 <JsonResult> AddMenus(string dineId, List <MenuExtension> orderedMenus, decimal price) { orderedMenus = orderedMenus ?? new List <MenuExtension>(); FunctionResult result = await OrderManager.AddMenus(dineId, orderedMenus, price); if (!result.Succeeded) { return(Json(new JsonError(result.Message))); } List <DineMenu> addedDineMenus = result.Data as List <DineMenu>; HotelConfig config = await new HotelManager(CurrHotel.ConnectionString).GetHotelConfig(); if (config.HasAutoPrinter) { NewDineInformTcpClient.SendRequestAddedMenus(CurrHotel.Id, dineId, addedDineMenus.Select(p => p.Id).ToList(), new List <PrintType> { PrintType.Recipt, PrintType.ServeOrder, PrintType.KitchenOrder }); } return(Json(new JsonSuccess())); }
/// <summary> /// 处理订单的价格并验证是否与前端的价格相同 /// </summary> private async Task <FunctionResult> handleDinePrice(Dine dine, decimal?cartPrice) { HotelConfig hotelConfig = await ctx.HotelConfigs.FirstOrDefaultAsync(); int trim = 100; switch (hotelConfig.TrimZero) { case TrimZero.Jiao: trim = 10; break; case TrimZero.Yuan: trim = 1; break; } dine.Price = Math.Floor(dine.Price * trim) / trim; cartPrice = cartPrice ?? 0; cartPrice = Math.Floor(cartPrice.Value * trim) / trim; // 检测前端计算的金额与后台计算的金额是否相同,如果前端金额为null则检测 if (Math.Abs(dine.Price - cartPrice.Value) > 0.01m) { return(new FunctionResult(false, "金额有误", $"Price Error, Cart Price: {cartPrice.Value}, Cal Price: {dine.Price}")); } return(new FunctionResult()); }
private void StartServerConnection(HotelConfig hotelConfig) { if (Config != null) { throw new ApplicationException("ServerConnection was already configured."); } Config = hotelConfig; // Setup packet modifier. _packetModifier.ServerRelease = Config.Release; // Setup server stuff. Server = new HabboConnection( new SocketListener(new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp), 1024), new PacketProcessor(this, PacketType.Outgoing, Config.Release), new HabboEncryption(Config.Exponent, Config.Modulus) ); Server.Listener.Listening += ServerListenerOnListening; Server.Listener.Aborting += ServerListenerOnAborting; Server.Listener.ReceivedBytes += ServerListenerOnReceivedBytes; Server.PacketProcessor.PacketReceived += ServerPacketProcessorOnPacketReceived; // Open connection. Server.Listener.Socket.Connect(Config.ServerIp, Config.ServerPort); // TODO: Handle exception? if (!Server.Listener.Socket.Connected) { Shutdown("Unable to connect to target server."); } // Start listening. Task.Run(Server.Listener.StartListeningAsync).ConfigureAwait(false); }
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))); }