コード例 #1
0
ファイル: OrderManager.cs プロジェクト: zyhbill/YummyOnline
        /// <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;
                }
            }
        }
コード例 #2
0
ファイル: OrderManager.cs プロジェクト: zyhbill/YummyOnline
        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);
        }
コード例 #3
0
ファイル: OrderManager.cs プロジェクト: zyhbill/YummyOnline
        /// <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());
        }
コード例 #4
0
ファイル: OrderManager.cs プロジェクト: zyhbill/YummyOnline
        public async Task PrintCompleted(string dineId)
        {
            Dine dine = await ctx.Dines.FirstOrDefaultAsync(p => p.Id == dineId);

            dine.Status = DineStatus.Printed;
            await ctx.SaveChangesAsync();
        }
コード例 #5
0
        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
            }));
        }
コード例 #6
0
        /// <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
            }));
        }
コード例 #7
0
ファイル: OrderManager.cs プロジェクト: zyhbill/YummyOnline
        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();
        }
コード例 #8
0
ファイル: OrderManager.cs プロジェクト: zyhbill/YummyOnline
        /// <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;
        }
コード例 #9
0
ファイル: OrderManager.cs プロジェクト: zyhbill/YummyOnline
        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();
        }
コード例 #10
0
        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
            }));
        }
コード例 #11
0
ファイル: OrderManager.cs プロジェクト: zyhbill/YummyOnline
        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));
        }
コード例 #12
0
ファイル: OrderManager.cs プロジェクト: zyhbill/YummyOnline
        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;
            });
        }
コード例 #13
0
ファイル: OrderManager.cs プロジェクト: zyhbill/YummyOnline
        /// <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());
        }
コード例 #14
0
        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;
            }));
        }
コード例 #15
0
        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)));
        }
コード例 #16
0
ファイル: OrderManager.cs プロジェクト: zyhbill/YummyOnline
        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));
        }
コード例 #17
0
ファイル: OrderManager.cs プロジェクト: zyhbill/YummyOnline
        /// <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));
        }