public StockOutViewModel GetIndexListStockItemForSold(IOwinContext owinContext,
                                                              ExtendedIdentityDbContext db, ContractListCondition condition)
        {
            var saleItemQuery = db.SaleProductItems.Include("SaleContract").Include("StockItem")
                                .Include("OrderProductItem").Where(si => si.StockItem != null &&
                                                                   si.StockItem.StockStatus == StockStatus.InStock)
                                .Select(SaleItem => new
            {
                SaleItem,
                SaleItem.SaleContract.SaleContractKey,
                SaleItem.SaleContract.SaleCreateTime,
                SaleItem.StockItem
            });

            StockOutViewModel resultViewModel = new StockOutViewModel();

            AggregationsViewModel aggregation = new AggregationsViewModel();

            if (condition != null && condition.IsEnable.GetValueOrDefault())
            {
                if (condition.OrderType.HasValue)
                {
                    saleItemQuery = saleItemQuery.Where(m => condition.OrderType.Value
                                                        == m.SaleItem.SaleContract.OrderType);
                }

                if (ContractListInclude.WithAggregations ==
                    (condition.ListInclude & ContractListInclude.WithAggregations))
                {
                    aggregation.IsEnable         = true;
                    aggregation.Count            = saleItemQuery.Count();
                    resultViewModel.Aggregations = aggregation;
                }

                if (condition.OrderField == ContractOrderField.CONTRACT_KEY_ASC)
                {
                    saleItemQuery = saleItemQuery.OrderBy(m => m.SaleContractKey);
                }
                else if (condition.OrderField == ContractOrderField.CONTRACT_KEY_DESC)
                {
                    saleItemQuery = saleItemQuery.OrderByDescending(m => m.SaleContractKey);
                }
                else if (condition.OrderField == ContractOrderField.CTIME_DESC)
                {
                    saleItemQuery = saleItemQuery.OrderByDescending(
                        m => m.SaleCreateTime);
                }
                else
                {
                    saleItemQuery = saleItemQuery.OrderBy(
                        m => m.SaleCreateTime);
                }

                if (condition.Page.HasValue && condition.Rows.HasValue)
                {
                    saleItemQuery = saleItemQuery.Skip(
                        (condition.Page.Value - 1) * condition.Rows.Value)
                                    .Take(condition.Rows.Value);
                }

                resultViewModel.IsEnable = true;

                List <SaleProductItemInfo> saleItemInfos = new List <SaleProductItemInfo>();
                List <StockItemInfo>       stockInfos    = new List <StockItemInfo>();
                resultViewModel.StockViewModel = new StockViewModel()
                {
                    IsEnable = true
                };



                var list = saleItemQuery.ToList();
                foreach (var one in list)
                {
                    SaleProductItemInfo info = new SaleProductItemInfo(one.SaleItem);
                    saleItemInfos.Add(info);
                    StockItemInfo stInfo = new StockItemInfo(one.StockItem);
                    stockInfos.Add(stInfo);
                }

                resultViewModel.SaleProductItems          = saleItemInfos;
                resultViewModel.StockViewModel.StockItems = stockInfos;
            }

            return(resultViewModel);
        }
        public ProductItemViewModel GetIndexListProductItemsForShipment(IOwinContext owinContext,
                                                                        ExtendedIdentityDbContext db, ContractListCondition condition)
        {
            if (db == null || owinContext == null)
            {
                throw new ArgumentNullException("DbContext或IOwinContext对象为空。",
                                                new Exception("DbContext或IOwinContext对象为空。"));
            }

            if (condition == null)
            {
                UtilityFramework.LogHelper.Warn("获取待发货列表不可以不带条件参数。");
                condition = new ContractListCondition()
                {
                    UserName    = owinContext.Authentication.User.Identity.Name,
                    Page        = 1,
                    Rows        = 10,
                    IsEnable    = true,
                    ListInclude = ContractListInclude.SaleContractOnly,
                };
            }

            int userEntityPriv = PrivilegeManager.Instance.GetEntityPrivilegeLevel(condition.UserName);
            DbQuery <SaleProductItem> dbQuery = db.SaleProductItems;

            if (condition != null && condition.OrderType.HasValue == false)//期货 and 现货
            {
                dbQuery = dbQuery.Include("SaleContract.StockItem.ProductItem.Product");
                dbQuery = dbQuery.Include("SaleContract.ProductItem.Product");
            }
            else if (condition != null && condition.OrderType.GetValueOrDefault() == 0)
            {//期货 only
                dbQuery = dbQuery.Include("SaleContract.ProductItem.Product");
            }
            else if (condition != null && condition.OrderType.GetValueOrDefault() == 1)
            {//现货 only
                dbQuery = dbQuery.Include("SaleContract.StockItem.ProductItem.Product");
            }
            else
            {
                dbQuery = dbQuery.Include("SaleContract");
            }

            var productItemQueryable = dbQuery.Include(
                "SaleContract").Where(pEntity => (
                                          (pEntity.SaleContract.EntityPrivLevRequired < userEntityPriv ||
                                           (pEntity.SaleContract.EntityPrivLevRequired == userEntityPriv &&
                                            pEntity.SaleContract.OperatorSysUser == condition.UserName)) && //根据SaleContract进行数据权限控制
                                          (pEntity.ShipmentStatus == SaleShipmentStatus.NonShipment)))
                                       .Select(SaleItem => new
            {
                SaleItem,
                SaleItem.SaleContract,
                SaleItem.SaleContract.SaleContractKey,
                SaleItem.SaleContract.EntityPrivLevRequired,
            });

            AggregationsViewModel aggr = new AggregationsViewModel();

            if (ContractListInclude.WithAggregations ==
                (condition.ListInclude & ContractListInclude.WithAggregations))
            {
                aggr.IsEnable = true;
                aggr.Count    = productItemQueryable.Count();
            }

            if (condition.OrderField == ContractOrderField.CONTRACT_KEY_ASC)
            {
                productItemQueryable = productItemQueryable.OrderBy(m => m.SaleContractKey);
            }
            else if (condition.OrderField == ContractOrderField.CONTRACT_KEY_DESC)
            {
                productItemQueryable = productItemQueryable
                                       .OrderByDescending(m => m.SaleContractKey);
            }
            else if (condition.OrderField == ContractOrderField.CTIME_DESC)
            {
                productItemQueryable = productItemQueryable
                                       .OrderByDescending(m => m.SaleContract.SaleCreateTime);
            }
            else
            {
                productItemQueryable = productItemQueryable
                                       .OrderBy(m => m.SaleContract.SaleCreateTime);
            }

            if (condition.Page.HasValue && condition.Rows.HasValue)
            {
                productItemQueryable = productItemQueryable.Skip(
                    (condition.Page.Value - 1) * condition.Rows.Value)
                                       .Take(condition.Rows.Value);
            }

            var list = productItemQueryable.ToList();
            List <SaleProductItemInfo> result = new List <SaleProductItemInfo>();

            foreach (var item in list)
            {
                SaleProductItemInfo info = new SaleProductItemInfo(item.SaleItem);

                result.Add(info);
            }

            return(new ProductItemViewModel()
            {
                IsEnable = true,
                Aggregations = aggr,
                SaleProductItems = result,
            });
        }
        private ProductItemViewModel GetIndexListProductItemsNonStock(ExtendedIdentityDbContext db,
                                                                      IOwinContext owinContext, ContractListCondition condition, ProductItemStatus?productItemStatus)
        {
            int userEntityPriv = PrivilegeManager.Instance.GetEntityPrivilegeLevel(condition.UserName);

            //IQueryable<ProductItem>
            var productItemQueryable = db.ProductItems.Include(
                "OrderContract").Where(pEntity => (
                                           (pEntity.OrderContract.EntityPrivLevRequired < userEntityPriv ||
                                            (pEntity.OrderContract.EntityPrivLevRequired == userEntityPriv &&
                                             pEntity.OrderContract.OrderSysUserKey == condition.UserName)) && //根据OrderContract进行数据权限控制
                                           !db.StockItems.Any(
                                               stEntity => stEntity.ProductItemId == pEntity.ProductItemId))
                                       )
                                       .Select(ProductItem => new
            {
                ProductItem,
                ProductItem.OrderContract,
                ProductItem.OrderContract.OrderContractKey,
                ProductItem.OrderContract.EntityPrivLevRequired,
            });

            //.Join(db.StockItems, pi => pi.ProductItemId,
            //si => si.ProductItemId, (pi, si) => new {pi,si}).Where(
            //entity =>( entity.si !=null && entity.si.)
            if (condition.OrderType.HasValue)
            {
                productItemQueryable = productItemQueryable.Where(
                    item => item.OrderContract != null &&
                    item.OrderContract.OrderType == condition.OrderType.Value);
            }

            AggregationsViewModel aggr = new AggregationsViewModel();

            if (ContractListInclude.WithAggregations ==
                (condition.ListInclude & ContractListInclude.WithAggregations))
            {
                aggr.IsEnable = true;
                aggr.Count    = productItemQueryable.Count();
            }

            if (condition.OrderField == ContractOrderField.CONTRACT_KEY_ASC)
            {
                productItemQueryable = productItemQueryable.OrderBy(m => m.OrderContractKey);
            }
            else if (condition.OrderField == ContractOrderField.CONTRACT_KEY_DESC)
            {
                productItemQueryable = productItemQueryable
                                       .OrderByDescending(m => m.OrderContractKey);
            }
            else if (condition.OrderField == ContractOrderField.CTIME_DESC)
            {
                productItemQueryable = productItemQueryable
                                       .OrderByDescending(m => m.OrderContract.OrderCreateTime);
            }
            else
            {
                productItemQueryable = productItemQueryable
                                       .OrderBy(m => m.OrderContract.OrderCreateTime);
            }

            if (condition.Page.HasValue && condition.Rows.HasValue)
            {
                productItemQueryable = productItemQueryable.Skip(
                    (condition.Page.Value - 1) * condition.Rows.Value)
                                       .Take(condition.Rows.Value);
            }

            var list = productItemQueryable.ToList();
            List <ProductItemInfo> result = new List <ProductItemInfo>();

            foreach (var item in list)
            {
                ProductItemInfo info = new ProductItemInfo(item.ProductItem);
                result.Add(info);
            }

            return(new ProductItemViewModel()
            {
                IsEnable = true,
                Aggregations = aggr,
                ContractItems = result
            });
        }