/// <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; } } }
public async Task <bool> OfflinePayCompleted(WaiterPaidDetails paidDetails) { Dine dine = await ctx.Dines.FirstOrDefaultAsync(p => p.Id == paidDetails.DineId); List <DinePaidDetail> exisedPaidDetails = await ctx.DinePaidDetails.Where(p => p.Dine.Id == paidDetails.DineId).ToListAsync(); decimal price = 0; foreach (var p in exisedPaidDetails) { price += p.Price; } foreach (var p in paidDetails.PaidDetails) { price += p.Price; ctx.DinePaidDetails.Add(new DinePaidDetail { DineId = paidDetails.DineId, PayKindId = p.PayKindId, Price = p.Price, RecordId = p.RecordId }); } if (Math.Abs(dine.Price - price) > 0.01m) { return(false); } dine.IsPaid = true; await changeCustomerPoints(dine); await ctx.SaveChangesAsync(); return(true); }
/// <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()); }
public async Task PrintCompleted(string dineId) { Dine dine = await ctx.Dines.FirstOrDefaultAsync(p => p.Id == dineId); dine.Status = DineStatus.Printed; await ctx.SaveChangesAsync(); }
public async Task <JsonResult> WaiterPayWithPaidDetails(Cart cart, WaiterCartAddition cartAddition, WaiterPaidDetails paidDetails) { FunctionResult result = await waiterPay(cart, cartAddition, "WaiterWithPaidDetails"); if (!result.Succeeded) { return(Json(new JsonError(result.Message))); } Dine dine = ((Dine)result.Data); await newDineInform(dine, "WaiterWithPaidDetail"); await requestPrintDine(dine.Id); paidDetails.DineId = dine.Id; bool succeeded = await OrderManager.OfflinePayCompleted(paidDetails); if (!succeeded) { return(Json(new JsonError("支付金额与应付金额不匹配"))); } NewDineInformTcpClient.SendNewDineInfrom(CurrHotel.Id, paidDetails.DineId, true); return(Json(new JsonSuccess { Data = paidDetails.DineId })); }
/// <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 async Task OfflinePayCompleted(string dineId) { Dine dine = await ctx.Dines.FirstOrDefaultAsync(p => p.Id == dineId); dine.IsPaid = true; await changeCustomerPoints(dine); await ctx.SaveChangesAsync(); }
/// <summary> /// 整单打折处理 /// </summary> /// <param name="payKind"></param> /// <param name="dine"></param> /// <returns></returns> private async Task handleDiscount(PayKind payKind, Dine dine) { double minDiscount = 1; string minDiscountName = null; DiscountType minDiscountType = DiscountType.None; if (payKind.Discount < minDiscount) { minDiscount = payKind.Discount; minDiscountName = payKind.Name + "折扣"; minDiscountType = DiscountType.PayKind; } DayOfWeek week = DateTime.Now.DayOfWeek; List <TimeDiscount> timeDicsounts = await ctx.TimeDiscounts.Where(p => p.Week == week).ToListAsync(); TimeSpan now = DateTime.Now.TimeOfDay; foreach (TimeDiscount timeDiscount in timeDicsounts) { if (now >= timeDiscount.From && now <= timeDiscount.To) { if (timeDiscount.Discount < minDiscount) { minDiscount = timeDiscount.Discount; minDiscountName = timeDiscount.Name; minDiscountType = DiscountType.Time; } break; } } Customer customer = await ctx.Customers.FirstOrDefaultAsync(p => p.Id == dine.UserId); if (customer != null) { VipDiscount vipDiscounts = await ctx.VipDiscounts.FirstOrDefaultAsync(p => p.Level.Id == customer.VipLevelId); if (vipDiscounts != null) { if (vipDiscounts.Discount < minDiscount) { minDiscount = vipDiscounts.Discount; minDiscountName = vipDiscounts.Name; minDiscountType = DiscountType.Vip; } } } dine.Discount = minDiscount; dine.DiscountName = minDiscountName; dine.DiscountType = minDiscountType; }
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(); }
public async Task <JsonResult> WaiterPay(Cart cart, WaiterCartAddition cartAddition) { FunctionResult result = await waiterPay(cart, cartAddition, "Waiter"); if (!result.Succeeded) { return(Json(new JsonError(result.Message))); } Dine dine = ((Dine)result.Data); await newDineInform(dine, "Waiter"); await requestPrintDine(dine.Id); return(Json(new JsonSuccess { Data = dine.Id })); }
public async Task <FunctionResult> AddMenus(string dineId, List <MenuExtension> orderedMenus, decimal price) { Dine dine = await ctx.Dines.Include(p => p.DineMenus).FirstOrDefaultAsync(p => p.Id == dineId); if (dine == null) { return(new FunctionResult(false, "订单号不存在", $"No DineId {dineId}")); } List <MenuExtensionWithGift> menuExtensionWithGifts = new List <MenuExtensionWithGift>(); foreach (MenuExtension menuExtension in orderedMenus) { menuExtensionWithGifts.Add(new MenuExtensionWithGift { MenuExtension = menuExtension, IsGift = false }); } // 处理每个点过的菜品 FunctionResult result = await handleDineMenu(menuExtensionWithGifts, dine); if (!result.Succeeded) { return(result); } List <DineMenu> addedDineMenus = result.Data as List <DineMenu>; // 处理最后生成的价格并比较前端传输的价格数据 result = await handleDinePrice(dine, price); if (!result.Succeeded) { return(result); } await ctx.SaveChangesAsync(); return(new FunctionResult(true, addedDineMenus)); }
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; }); }
/// <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()); }
private async Task <Dine> generateTestDine() { return(await Task <Dine> .Run(() => { var Dine = new Dine { Id = "00000000000000", Status = HotelDAO.Models.DineStatus.Untreated, Type = HotelDAO.Models.DineType.ToStay, HeadCount = 10, Price = 123.56m, OriPrice = 987.65m, Change = 123.456m, Discount = 0.5, DiscountName = "测试折扣名", DiscountType = HotelDAO.Models.DiscountType.PayKind, BeginTime = DateTime.Now, IsPaid = true, IsOnline = true, UserId = "0000000000", Waiter = new Staff { Id = "00000000", Name = "测试服务员名" }, Clerk = new Staff { Id = "00000000", Name = "测试收银员名" }, Remarks = new List <Remark> { new Remark { Id = 1, Name = "测试备注1", Price = 12.34m }, new Remark { Id = 2, Name = "测试备注2", Price = 56.78m }, new Remark { Id = 3, Name = "测试备注3", Price = 90.12m }, new Remark { Id = 4, Name = "测试备注4", Price = 34.56m } }, Desk = new Desk { Id = "000", QrCode = "111", Name = "测试桌名", Description = "测试桌子备注信息", AreaType = HotelDAO.Models.AreaType.Normal, ReciptPrinter = new Printer { Id = 0, Name = "Microsoft XPS Document Writer", IpAddress = "127.0.0.1", Usable = true }, ServePrinter = new Printer { Id = 1, Name = "Microsoft XPS Document Writer", IpAddress = "127.0.0.2", Usable = true } }, DineMenus = new List <DineMenu> { new DineMenu { Status = HotelDAO.Models.DineMenuStatus.Normal, Count = 10, OriPrice = 56.78m, Price = 12.34m, RemarkPrice = 12.34m, Remarks = new List <Remark> { new Remark { Id = 0, Name = "测试备注1", Price = 12.34m }, new Remark { Id = 1, Name = "测试备注2", Price = 56.78m }, new Remark { Id = 2, Name = "测试备注3", Price = 90.12m }, new Remark { Id = 3, Name = "测试备注4", Price = 34.56m } }, Menu = new Menu { Id = $"00000", Code = "test", Name = $"测试套餐", NameAbbr = $"测试0", Unit = "份", IsSetMeal = true, SetMealMenus = new List <SetMealMenu> { new SetMealMenu { Id = "10000", Name = "测试套餐菜品1", Count = 10 }, new SetMealMenu { Id = "10001", Name = "测试套餐菜品2", Count = 10 }, new SetMealMenu { Id = "10002", Name = "测试套餐菜品3", Count = 10 } }, Printer = new Printer { Id = 2, Name = "Microsoft XPS Document Writer", IpAddress = "127.0.0.1", Usable = true }, } } }, DinePaidDetails = new List <DinePaidDetail> { new DinePaidDetail { Price = 12.34m, RecordId = "1234567890abcdeABCDE", PayKind = new PayKind { Id = 0, Name = "测试支付1", Type = HotelDAO.Models.PayKindType.Online } }, new DinePaidDetail { Price = 12.34m, RecordId = "1234567890abcdeABCDE", PayKind = new PayKind { Id = 0, Name = "测试支付2", Type = HotelDAO.Models.PayKindType.Offline } }, new DinePaidDetail { Price = 12.34m, RecordId = "1234567890abcdeABCDE", PayKind = new PayKind { Id = 0, Name = "测试支付3", Type = HotelDAO.Models.PayKindType.Points } } } }; for (int i = 1; i <= 5; i++) { Dine.DineMenus.Add(new DineMenu { Status = HotelDAO.Models.DineMenuStatus.Normal, Count = 10, OriPrice = 56.78m, Price = 12.34m, RemarkPrice = 12.34m, Remarks = new List <Remark> { new Remark { Id = 0, Name = "测试备注1", Price = 12.34m }, new Remark { Id = 1, Name = "测试备注2", Price = 56.78m }, new Remark { Id = 2, Name = "测试备注3", Price = 90.12m }, new Remark { Id = 3, Name = "测试备注4", Price = 34.56m } }, Menu = new Menu { Id = $"0000{i}", Code = "test", Name = $"测试菜品名{i}", NameAbbr = $"测试{i}", Unit = "份", IsSetMeal = false, Printer = new Printer { Id = 2, Name = "Microsoft XPS Document Writer", IpAddress = "127.0.0.1", Usable = true }, DepartmentName = $"测试部门名{i}" } }); } return 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))); }
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)); }
/// <summary> /// 处理每个菜品 /// </summary> private async Task <FunctionResult> handleDineMenu(List <MenuExtensionWithGift> menuExtensionWithGifts, Dine dine) { List <DineMenu> addedDineMenus = new List <DineMenu>(); foreach (MenuExtensionWithGift menuExtensionWithGift in menuExtensionWithGifts) { MenuExtension menuExtension = menuExtensionWithGift.MenuExtension; Menu menu = await ctx.Menus .Include(p => p.MenuPrice) .FirstOrDefaultAsync(p => p.Id == menuExtension.Id); // 菜品判断 if (menu == null) { return(new FunctionResult(false, "未找到菜品", $"No Menu {menuExtension.Id}")); } if (!menu.Usable) { return(new FunctionResult(false, $"{menu.Name} 不可用", $"Menu Disabled {menu.Id}: {menu.Name}")); } if (menu.Status == MenuStatus.SellOut) { return(new FunctionResult(false, $"{menu.Name} 已售完", $"Menu SellOut {menu.Id}: {menu.Name}")); } DineMenu dineMenu = new DineMenu { Count = menuExtension.Ordered, OriPrice = menu.MenuPrice.Price, Price = menuExtensionWithGift.IsGift ? 0 : menu.MenuPrice.Price, RemarkPrice = 0, Menu = menu, Remarks = new List <Remark>(), Type = menuExtensionWithGift.IsGift ? DineMenuType.Gift : DineMenuType.None }; if (!menuExtensionWithGift.IsGift) { // 是否排除在总单打折之外 bool excludePayDiscount = menu.MenuPrice.ExcludePayDiscount; // 是否打折 if (menu.MenuPrice.Discount < 1) { excludePayDiscount = true; dineMenu.Price = menu.MenuPrice.Price * (decimal)menu.MenuPrice.Discount; dineMenu.Type = DineMenuType.MenuDiscount; } // 是否为特价菜 DayOfWeek week = DateTime.Now.DayOfWeek; MenuOnSale menuOnSales = await ctx.MenuOnSales.FirstOrDefaultAsync(p => p.Id == menu.Id && p.OnSaleWeek == week); if (menuOnSales != null) { excludePayDiscount = true; dineMenu.Price = menuOnSales.Price; dineMenu.Type = DineMenuType.OnSale; } // 是否为套餐 var menuSetMeals = await ctx.MenuSetMeals.FirstOrDefaultAsync(p => p.MenuSetId == menu.Id && p.Menu.IsSetMeal); if (menuSetMeals != null) { excludePayDiscount = true; dineMenu.Type = DineMenuType.SetMeal; } if (!excludePayDiscount) { dineMenu.Price = menu.MenuPrice.Price * (decimal)dine.Discount; switch (dine.DiscountType) { case DiscountType.PayKind: dineMenu.Type = DineMenuType.PayKindDiscount; break; case DiscountType.Vip: dineMenu.Type = DineMenuType.VipDiscount; break; case DiscountType.Time: dineMenu.Type = DineMenuType.TimeDiscount; break; case DiscountType.Custom: dineMenu.Type = DineMenuType.CustomDiscount; break; } } } // 菜品备注处理 foreach (int remarkId in menuExtension.Remarks) { Remark remark = await ctx.Remarks.FirstOrDefaultAsync(p => p.Id == remarkId); if (remark == null) { return(new FunctionResult(false, "未找到备注信息", $"No Remark {remarkId}")); } if (!menuExtensionWithGift.IsGift) { dineMenu.RemarkPrice += remark.Price; } dineMenu.Remarks.Add(remark); } dine.Price += dineMenu.Price * dineMenu.Count + dineMenu.RemarkPrice; dine.OriPrice += dineMenu.OriPrice * dineMenu.Count + dineMenu.RemarkPrice; addedDineMenus.Add(dineMenu); dine.DineMenus.Add(dineMenu); } return(new FunctionResult(true, addedDineMenus)); }