// 取得編輯資料 - 餐點取消
        public OrderMD GetOrderMD(string OrderNo)
        {
            OrderMD result = new OrderMD();
            List <AccountingOrderViewModel> data = GetAccountingOrderViewModel(OrderNo);

            if (data == null)
            {
                return(null);
            }

            result.OrderNo     = data.First().OrderNo;
            result.PaymentType = data.First().PaymentType;
            result.Status      = data.First().Status;
            result.UpdateTime  = data.First().UpdateTime;
            result.Order       = data.Select(x => new OrderInfo
            {
                MealID      = Convert.ToInt64(x.OrderMealID),
                MealName    = x.OrderMealName,
                MealType    = x.OrderMealType,
                Quantity    = Convert.ToInt32(x.OrderQuantity),
                Integration = Convert.ToInt64(x.OrderUnitIntegration),
                Total       = Convert.ToInt64(x.OrderQuantity) * Convert.ToInt64(x.OrderUnitIntegration),
                Status      = x.OrderStatus
            }).ToList();
            result.MemberID = data.First().PaymentType == Accounting_PaymentType.Member ? Convert.ToInt64(data.First().MemberID) : -1;

            return(result);
        }
        // 取得編輯資料 - 餐點結帳
        public OrderMD GetOrderMD(OrderMD Data)
        {
            OrderMD              result   = new OrderMD();
            RepositoryMeal       repoMeal = new RepositoryMeal();
            List <MealViewModel> mealInfo = repoMeal.Query(Data.Order.Select(x => x.MealID).Distinct().ToList());

            // 設定付款方式
            switch (Data.PaymentType)
            {
            case "Cash":
                result.PaymentType = Accounting_PaymentType.Cash;
                break;

            case "Integration":
                result.PaymentType = Accounting_PaymentType.Integration;
                break;

            case "Member":
                result.PaymentType = Accounting_PaymentType.Member;
                break;

            case "Treat":
                result.PaymentType = Accounting_PaymentType.Treat;
                break;

            default:
                return(null);
            }

            // 設定餐點明細
            foreach (var meal in mealInfo)
            {
                OrderInfo info = new OrderInfo
                {
                    MealID      = meal.RecordID,
                    MealName    = meal.Name,
                    MealType    = meal.Type,
                    Quantity    = Data.Order.Where(x => x.MealID == meal.RecordID).Sum(x => x.Quantity),
                    Integration = meal.Integration,
                    Total       = meal.Integration * Data.Order.Where(x => x.MealID == meal.RecordID).Sum(x => x.Quantity),
                    Status      = Order_Status.Preparing
                };

                result.Order.Add(info);
            }

            return(result);
        }
        // 餐點取消
        public OperationResult <OrderViewModel> CancelOrder(OrderMD Data, AuthModel Operator)
        {
            OperationResult <OrderViewModel> result = new OperationResult <OrderViewModel>();
            AccountingViewModel accounting          = GetAccountingViewModel(Data.OrderNo);
            DateTime            processTime         = DateTime.Now;

            // 驗證帳務紀錄
            if (accounting == null)
            {
                result.Status  = false;
                result.Message = "取消失敗 : 系統錯誤,無法取得帳務紀錄";
                result.Data    = null;

                return(result);
            }

            // 驗證刪除狀態
            if (accounting.Status.Equals(Accounting_Status.Cancel))
            {
                result.Status  = false;
                result.Message = "取消失敗 : 帳務紀錄已取消";
                result.Data    = null;

                return(result);
            }

            // 驗證管理者密碼
            if (!Data.AdministratorPwd.Equals(ConfigurationManager.AppSettings["AdministratorPwd"].Trim()))
            {
                result.Status  = false;
                result.Message = "取消失敗 : 管理者密碼錯誤";
                result.Data    = null;

                return(result);
            }

            using (clsDBDapper db = new clsDBDapper())
            {
                try
                {
                    // 開啟交易
                    db.TransactionStart(string.Format("Accounting_CancelOrder_{0}", Operator.ID));

                    // 會員結帳 - 更新會員積分資訊 & 建立操作紀錄
                    if (accounting.PaymentType == Accounting_PaymentType.Member)
                    {
                        // 更新會員積分資訊
                        RepositoryMember repoMember   = new RepositoryMember();
                        OperationResult  resultMember = repoMember.UpdateBalance(db, new BalanceOperationInfo
                        {
                            MemberID              = Convert.ToInt64(accounting.MemberID),
                            MemberPwd             = null,
                            Integration           = accounting.Integration,
                            UpdateTime            = processTime,
                            OperatorID            = Operator.ID,
                            OperationType         = BalanceOperationInfo_OperationType.Import,
                            ValidationType        = BalanceOperationInfo_ValidationType.None,
                            UpdateConsumptionDate = true
                        });
                        if (!resultMember.Status)
                        {
                            throw new Exception(resultMember.Message);
                        }

                        // 建立積分操作紀錄
                        RepositoryOperationRecord repoOperationRecord   = new RepositoryOperationRecord();
                        OperationResult           resultOperationRecord = repoOperationRecord.Create(db, new OperationRecord
                        {
                            MemberID      = Convert.ToInt64(accounting.MemberID),
                            OperationType = OperationRecord_OperationType.CancelOrder,
                            Integration   = accounting.Integration,
                            Note          = null,
                            UpdateTime    = processTime,
                            OperatorID    = Operator.ID
                        });
                        if (!resultOperationRecord.Status)
                        {
                            throw new Exception(resultOperationRecord.Message);
                        }
                    }

                    // 積分結帳
                    if (accounting.PaymentType == Accounting_PaymentType.Member || accounting.PaymentType == Accounting_PaymentType.Integration)
                    {
                        // 建立積分發行紀錄
                        RepositoryIssueRecord repoIssueRecord   = new RepositoryIssueRecord();
                        OperationResult       resultIssueRecord = repoIssueRecord.Create(db, new IssueRecord
                        {
                            OperationType = IssueRecord_OperationType.Export,
                            Integration   = accounting.Integration,
                            Category      = IssueRecord_Category.CancelOrder,
                            UpdateTime    = processTime,
                            OperatorID    = Operator.ID
                        });
                        if (!resultIssueRecord.Status)
                        {
                            throw new Exception(resultIssueRecord.Message);
                        }
                    }

                    // 更新點餐紀錄
                    RepositoryOrder repoOrder   = new RepositoryOrder();
                    OperationResult resultOrder = repoOrder.Cancel(db, new Order
                    {
                        OrderNo    = accounting.OrderNo,
                        Status     = Order_Status.Canceled,
                        UpdateTime = processTime,
                        OperatorID = Operator.ID
                    });
                    if (!resultOrder.Status)
                    {
                        throw new Exception(resultOrder.Message);
                    }

                    // 更新帳務紀錄
                    OperationResult resultAccounting = Cancel(db, new Accounting
                    {
                        Status     = Accounting_Status.Cancel,
                        UpdateTime = processTime,
                        OperatorID = Operator.ID,
                        RecordID   = accounting.RecordID
                    });
                    if (!resultAccounting.Status)
                    {
                        throw new Exception(resultAccounting.Message);
                    }

                    // 確認及關閉交易
                    db.TransactionCommit();
                    db.TransactionDispose();

                    // 製作回傳結果
                    result.Type    = "CancelOrder";
                    result.Status  = true;
                    result.Message = "取消成功";
                    result.Data.AddRange(repoOrder.GetOrderViewModel(accounting.OrderNo));
                }
                catch (Exception ex)
                {
                    // 回復資料
                    db.TransactionRollBack();

                    result.Status  = false;
                    result.Message = "取消失敗 : " + ex.Message;
                }
            }

            return(result);
        }
        // 餐點結帳
        public OperationResult <AccountingViewModel> CheckOrder(OrderMD Data, AuthModel Operator)
        {
            OperationResult <AccountingViewModel> result = new OperationResult <AccountingViewModel>();
            DateTime processTime    = DateTime.Now;
            string   orderNo        = string.Format("{0}{1}", processTime.ToString("yyyyMMddHHmmss"), new Random().Next(100, 999));
            long?    integrationSum = Data.Order.Sum(x => x.Total);
            long?    memberID       = null;

            using (clsDBDapper db = new clsDBDapper())
            {
                try
                {
                    // 開啟交易
                    db.TransactionStart(string.Format("Accounting_CheckOrder_{0}", Operator.ID));

                    // 更新會員 & 操作紀錄
                    if (Data.PaymentType == Accounting_PaymentType.Member)
                    {
                        // 更新會員積分
                        RepositoryMember repoMember   = new RepositoryMember();
                        OperationResult  resultMember = repoMember.UpdateBalance(db, new BalanceOperationInfo
                        {
                            MemberID              = Convert.ToInt64(Data.MemberID),
                            MemberPwd             = Data.MemberPwd,
                            Integration           = Convert.ToInt64(integrationSum),
                            UpdateTime            = processTime,
                            OperatorID            = Operator.ID,
                            OperationType         = BalanceOperationInfo_OperationType.Export,
                            ValidationType        = BalanceOperationInfo_ValidationType.Force,
                            UpdateConsumptionDate = true
                        });
                        if (!resultMember.Status)
                        {
                            throw new Exception(resultMember.Message);
                        }

                        // 更新積分操作紀錄
                        RepositoryOperationRecord repoOperationRecord   = new RepositoryOperationRecord();
                        OperationResult           resultOperationRecord = repoOperationRecord.Create(db, new OperationRecord
                        {
                            MemberID      = Convert.ToInt64(Data.MemberID),
                            OperationType = OperationRecord_OperationType.CheckOrder,
                            Integration   = Convert.ToInt64(integrationSum),
                            Note          = null,
                            UpdateTime    = processTime,
                            OperatorID    = Operator.ID
                        });
                        if (!resultOperationRecord.Status)
                        {
                            throw new Exception(resultOperationRecord.Message);
                        }

                        memberID = Data.MemberID;
                    }

                    // 建立發行紀錄
                    if (Data.PaymentType == Accounting_PaymentType.Member || Data.PaymentType == Accounting_PaymentType.Integration)
                    {
                        RepositoryIssueRecord repoIssueRecord   = new RepositoryIssueRecord();
                        OperationResult       resultIssueRecord = repoIssueRecord.Create(db, new IssueRecord
                        {
                            OperationType = IssueRecord_OperationType.Import,
                            Integration   = Convert.ToInt64(integrationSum),
                            Category      = IssueRecord_Category.CheckOrder,
                            UpdateTime    = processTime,
                            OperatorID    = Operator.ID
                        });
                        if (!resultIssueRecord.Status)
                        {
                            throw new Exception(resultIssueRecord.Message);
                        }
                    }

                    // 建立點餐資訊
                    RepositoryOrder repoOrder = new RepositoryOrder();
                    List <Order>    dataOrder = Data.Order.Select(x => new Order
                    {
                        OrderNo    = orderNo,
                        MealID     = x.MealID,
                        Status     = Order_Status.Preparing,
                        Quantity   = x.Quantity,
                        UpdateTime = processTime,
                        OperatorID = Operator.ID
                    }).ToList();
                    OperationResult resultOrder = repoOrder.Create(db, dataOrder);
                    if (!resultOrder.Status)
                    {
                        throw new Exception(resultOrder.Message);
                    }

                    // 建立帳務資訊
                    Accounting dataAccounting = new Accounting
                    {
                        Type        = Accounting_Type.Order,
                        PaymentType = Data.PaymentType,
                        Integration = Convert.ToInt64(integrationSum),
                        Status      = Accounting_Status.Normal,
                        OrderNo     = orderNo,
                        MemberID    = memberID,
                        UpdateTime  = processTime,
                        OperatorID  = Operator.ID
                    };
                    OperationResult resultAccounting = Create(db, dataAccounting);
                    if (!resultAccounting.Status)
                    {
                        throw new Exception(resultAccounting.Message);
                    }

                    // 確認及關閉交易
                    db.TransactionCommit();
                    db.TransactionDispose();

                    // 製作回傳結果
                    result.Type    = "CheckOrder";
                    result.Status  = true;
                    result.Message = "結帳成功";
                    result.Data.Add(GetAccountingViewModel(dataAccounting));
                }
                catch (Exception ex)
                {
                    // 回復資料
                    db.TransactionRollBack();

                    result.Status  = false;
                    result.Message = "結帳失敗 : " + ex.Message;
                }
            }

            return(result);
        }