/// <summary>
        /// 根据请购买申请单重新初始化购物车
        /// </summary>
        /// <param name="ApplyID"></param>
        /// <returns></returns>
        public static ORD_OrderCartBLL InitByOrderApply(int OrderID)
        {
            ORD_OrderBLL Order = new ORD_OrderBLL(OrderID);

            if (Order.Model == null)
            {
                return(null);
            }

            ORD_PublishBLL publish = new ORD_PublishBLL(Order.Model.PublishID);

            if (publish.Model == null)
            {
                return(null);
            }

            ORD_OrderCartBLL cart = new ORD_OrderCartBLL(Order.Model.AccountMonth, Order.Model.PublishID, Order.Model.Client, Order.Model.Supplier,
                                                         Order.Model.Classify, Order.Model.PayMode, Order.Model.ReqWarehouse, Order.Model.ReqArrivalDate);

            int          quotaid = ORD_QuotaBLL.GetQuotaByClientAndMonth(cart.Client, cart.AccountMonth);
            ORD_QuotaBLL quota   = new ORD_QuotaBLL(quotaid);

            foreach (ORD_OrderDetail item in Order.Items)
            {
                ORD_PublishDetail _m = publish.Items.FirstOrDefault(m => m.Product == item.Product);
                if (_m == null)
                {
                    continue;
                }

                ORD_OrderCartItem cartitem = new ORD_OrderCartItem();
                cartitem.ID                = _m.ID;
                cartitem.Product           = _m.Product;
                cartitem.MinQuantity       = _m.MinQuantity;
                cartitem.MaxQuantity       = _m.MaxQuantity;
                cartitem.Price             = item.Price;
                cartitem.AvailableQuantity = _m.AvailableQuantity;
                cartitem.SubmitQuantity    = ORD_OrderBLL.GetSubmitQuantity(Order.Model.AccountMonth, Order.Model.Client, _m.Product, Order.Model.Classify == 1 ? 1 : 0);
                cartitem.BookQuantity      = item.BookQuantity;
                cartitem.Points            = item.Points;

                #region 获取配额数量
                if (quota.Model != null)
                {
                    ORD_QuotaDetail d = quota.Items.FirstOrDefault(p => p.Product == _m.Product);
                    if (d != null)
                    {
                        cartitem.QuotaQuantity = d.StdQuota + d.AdjQuota;
                    }
                }
                #endregion

                cart.Items.Add(cartitem);
            }

            return(cart);
        }
        /// <summary>
        /// 请购商提交订单
        /// </summary>
        /// <param name="User"></param>
        /// <returns>0:成功 -10:积分余额不足 </returns>
        public int Submit(Guid User)
        {
            ORD_Order neworder = new ORD_OrderBLL(_m.ID).Model;

            if (neworder == null || neworder.State != 1)
            {
                return(-1);
            }

            if (_m.PayMode == 8)
            {
                #region 扣减客户积分

                /*
                 * //判断积分是否足够
                 * MCSFramework.SQLDAL.RM.RM_AccountDAL accountdal = new MCSFramework.SQLDAL.RM.RM_AccountDAL();
                 * decimal totalbalance = 0;
                 * ORD_PublishBLL publish = new ORD_PublishBLL(_m.PublishID);
                 * foreach (ORD_PublishWithAccountType item in publish.GetAccountType())
                 * {
                 *  totalbalance += accountdal.GetBalance(_m.Client, item.AccountType);
                 * }
                 * decimal totalpoints = Items.Sum(p => p.BookQuantity * p.Points);
                 * if (totalpoints > totalbalance) return -10;
                 *
                 * //依次扣减积分
                 * decimal points = totalpoints;
                 * foreach (ORD_PublishWithAccountType item in publish.GetAccountType())
                 * {
                 *  decimal b = accountdal.GetBalance(_m.Client, item.AccountType);
                 *  if (b < 0) continue;    //某账户小于0分时,不处理
                 *
                 *  if (b >= points)
                 *  {
                 *      accountdal.ModifyPoints(_m.Client, item.AccountType, 0 - points, 0, 11, "提交积分兑换订单,订单号:" + _m.SheetCode);
                 *      AddSpentPoints(item.AccountType, 1, 0 - points);
                 *      break;
                 *  }
                 *  else
                 *  {
                 *      accountdal.ModifyPoints(_m.Client, item.AccountType, 0 - b, 0, 11, "提交积分兑换订单,订单号:" + _m.SheetCode);
                 *      AddSpentPoints(item.AccountType, 1, 0 - b);
                 *      points -= b;
                 *  }
                 * }
                 */
                #endregion
            }

            return(_dal.SetState(_m.ID, 2, User));
        }
        /// <summary>
        /// 供货商确认订单
        /// </summary>
        /// <param name="User"></param>
        /// <returns></returns>
        public int Confirm(Guid User)
        {
            //获取订单的最新状态
            ORD_Order neworder = new ORD_OrderBLL(_m.ID).Model;

            if (neworder == null || neworder.State != 2)
            {
                return(-1);
            }

            if (_m.PayMode == 8)
            {
                /*
                 * MCSFramework.SQLDAL.RM.RM_AccountDAL accountdal = new MCSFramework.SQLDAL.RM.RM_AccountDAL();
                 *
                 #region 向供货商增加积分
                 * foreach (ORD_OrderSpentPoints item in GetSpentPointsList())
                 * {
                 *  decimal p = 0 - item.Points;    //原订单提交时扣减的积分(取正值)
                 *  accountdal.ModifyPoints(_m.Supplier, item.AccountType, p, 0, 12, "确认积分兑换订单,订单号:" + _m.SheetCode);
                 * }
                 #endregion
                 *
                 #region 退还调整的积分余额
                 * decimal adjustpoints = Items.Sum(p => (p.BookQuantity - p.ConfirmQuantity) * p.Points);
                 * if (adjustpoints > 0)
                 * {
                 *  foreach (ORD_OrderSpentPoints item in GetSpentPointsList())
                 *  {
                 *      decimal p = 0 - item.Points;    //原订单提交时扣减的积分(取正值)
                 *      if (p > adjustpoints)
                 *      {
                 *          accountdal.ModifyPoints(_m.Client, item.AccountType, adjustpoints, 0, 11, "确认积分兑换订单,退还确认后的差额,订单号:" + _m.SheetCode);
                 *          AddSpentPoints(item.AccountType, 2, adjustpoints);
                 *          break;
                 *      }
                 *      else
                 *      {
                 *          accountdal.ModifyPoints(_m.Client, item.AccountType, p, 0, 11, "确认积分兑换订单,退还确认后的差额,订单号:" + _m.SheetCode);
                 *          AddSpentPoints(item.AccountType, 2, p);
                 *          adjustpoints -= p;
                 *      }
                 *  }
                 *
                 #endregion
                 * */
            }
            return(_dal.SetState(_m.ID, 3, User));
        }
        /// <summary>
        /// 修改请购买数量
        /// </summary>
        /// <param name="product"></param>
        /// <param name="quantity"></param>
        /// <returns>0:成功 -1:购物车中不包括此产品 -2:已超可请购数量 -3:小于最小单次请购数量 -4:大于最大单次请购数量 -5:超订货配额</returns>
        public int ModifyQuantity(int product, int quantity)
        {
            ORD_OrderCartItem cartitem = Items.FirstOrDefault(m => m.Product == product);

            if (cartitem == null)
            {
                return(-1);
            }

            cartitem.AvailableQuantity = cartitem.AvailableQuantity;
            cartitem.SubmitQuantity    = ORD_OrderBLL.GetSubmitQuantity(_accountmonth, _client, product, _classify == 1 ? 1 : 0);

            if (cartitem.MinQuantity > 0 && cartitem.MinQuantity > quantity || quantity < 0)
            {
                return(-3);
            }
            if (cartitem.MaxQuantity > 0 && cartitem.MaxQuantity < quantity)
            {
                return(-4);
            }

            #region 判断是否超过发布目录设定的可订货数量
            if (cartitem.AvailableQuantity > 0)
            {
                int totalquantity = ORD_PublishBLL.GetSubmitQuantity(_publish, product);
                if (cartitem.BookQuantity > cartitem.AvailableQuantity - totalquantity)
                {
                    return(-2);
                }
            }
            #endregion

            if (_classify == 1 && quantity > cartitem.QuotaQuantity - cartitem.SubmitQuantity)
            {
                return(-5);
            }

            cartitem.BookQuantity    = quantity;
            cartitem.ConfirmQuantity = quantity;
            return(0);
        }
        /// <summary>
        /// 取消订单
        /// </summary>
        /// <param name="User"></param>
        /// <returns></returns>
        public int Cancel(Guid User)
        {
            ORD_Order neworder = new ORD_OrderBLL(_m.ID).Model;

            if (neworder == null || neworder.State != 2)
            {
                return(-1);
            }

            if (_m.PayMode == 8)
            {
                //    #region 依次返还原扣除的积分
                //    MCSFramework.SQLDAL.RM.RM_AccountDAL accountdal = new MCSFramework.SQLDAL.RM.RM_AccountDAL();
                //    foreach (ORD_OrderSpentPoints item in GetSpentPointsList())
                //    {
                //        accountdal.ModifyPoints(_m.Client, item.AccountType, 0 - item.Points, 0, 11, "取消积分兑换订单,订单号:" + _m.SheetCode);
                //        AddSpentPoints(item.AccountType, 2, 0 - item.Points);
                //    }
                //    #endregion
            }
            return(_dal.SetState(_m.ID, 8, User));
        }
        /// <summary>
        /// 向购物车中新增产品
        /// </summary>
        /// <param name="product"></param>
        /// <returns>0:成功 -1:发布目录中不包括此产品 -2:已超可请购数量 -3:该产品已在购物车中 -4:超订货配额</returns>
        public int AddProduct(int product, int bookquantity)
        {
            if (Items.FirstOrDefault(p => p.Product == product) != null)
            {
                return(-3);
            }

            ORD_PublishDetail _m = new ORD_PublishBLL(_publish).Items.FirstOrDefault(m => m.Product == product);

            if (_m != null)
            {
                ORD_OrderCartItem cartitem = new ORD_OrderCartItem();
                cartitem.Product           = _m.Product;
                cartitem.MinQuantity       = _m.MinQuantity;
                cartitem.MaxQuantity       = _m.MaxQuantity;
                cartitem.Price             = _m.Price;
                cartitem.Points            = _m.Points;
                cartitem.AvailableQuantity = _m.AvailableQuantity;
                cartitem.SubmitQuantity    = ORD_OrderBLL.GetSubmitQuantity(_accountmonth, _client, product, _classify == 1 ? 1 : 0);

                if (bookquantity == 0)
                {
                    cartitem.BookQuantity = cartitem.MinQuantity > 0 ? cartitem.MinQuantity : new PDT_ProductBLL(product).Model.ConvertFactor;
                }
                else
                {
                    cartitem.BookQuantity = bookquantity;
                }
                cartitem.ConfirmQuantity = cartitem.BookQuantity;

                #region 判断是否超过发布目录设定的可订货数量
                if (cartitem.AvailableQuantity > 0)
                {
                    int totalquantity = ORD_PublishBLL.GetSubmitQuantity(_publish, product);
                    if (cartitem.BookQuantity > cartitem.AvailableQuantity - totalquantity)
                    {
                        return(-2);
                    }
                }
                #endregion

                #region 获取配额,判断是否超过配额
                if (_classify == 1)
                {
                    //常规订单,按配额订货
                    cartitem.QuotaQuantity = 0;
                    int          quotaid = ORD_QuotaBLL.GetQuotaByClientAndMonth(_client, _accountmonth);
                    ORD_QuotaBLL quota   = new ORD_QuotaBLL(quotaid);
                    if (quota != null)
                    {
                        ORD_QuotaDetail d = quota.Items.FirstOrDefault(p => p.Product == product);
                        if (d != null)
                        {
                            cartitem.QuotaQuantity = d.StdQuota + d.AdjQuota;
                        }
                    }

                    if (cartitem.BookQuantity > cartitem.QuotaQuantity - cartitem.SubmitQuantity)
                    {
                        return(-4);
                    }
                }
                #endregion

                _items.Add(cartitem);

                return(0);
            }
            return(-1);
        }