Пример #1
0
        public void CreateSyncMoveBillDetail(MoveBillMaster moveBillMaster)
        {
            Locker.LockKey = moveBillMaster.BillNo;

            IQueryable <Storage> storageQuery = StorageRepository.GetQueryable();
            IQueryable <Cell>    cellQuery    = CellRepository.GetQueryableIncludeStorages();

            var storages = storageQuery.Where(s => s.Cell.WarehouseCode == moveBillMaster.WarehouseCode &&
                                              s.Cell.IsActive == "1" &&
                                              s.Quantity - s.OutFrozenQuantity > 0 &&
                                              s.OutFrozenQuantity > 0);

            var cells = cellQuery.Where(c => c.WarehouseCode == moveBillMaster.WarehouseCode &&
                                        c.IsActive == "1");

            //1:主库区 1;2:件烟区 2;
            //3;条烟区 3;4:暂存区 4;
            //5:备货区 0;6:残烟区 0;
            //7:罚烟区 0;8:虚拟区 0;
            //9:其他区 0;

            //主库区未满盘件烟移到件烟区
            string[] areaTypes = new string[] { "1" };
            var      ss        = storages.Where(s => areaTypes.Any(a => a == s.Cell.Area.AreaType) &&
                                                ((s.Quantity - s.OutFrozenQuantity) / s.Product.Unit.Count) > 1)
                                 .ToArray();

            if (Locker.Lock(ss))
            {
                //件烟区 货位是单一存储的空货位;
                areaTypes = new string[] { "2" };
                var cc = cells.Where(c => areaTypes.Any(a => a == c.Area.AreaType) &&
                                     c.IsSingle == "1")
                         .ToArray();

                ss.AsParallel().ForAll(
                    (Action <Storage>) delegate(Storage s)
                {
                    MoveToPieceArea(moveBillMaster, s, cc);
                }
                    );

                Locker.UnLock(ss);
            }
            else
            {
                return;
            }

            MoveBillDetailRepository.SaveChanges();
            //主库区条烟移到件烟区,没有条烟区
            if (AreaRepository.GetQueryable().Where(a => a.AreaType == "3").Select(a => a.IsActive).ToArray()[0] == "0")
            {
                areaTypes = new string[] { "1" };
                ss        = storages.Where(s => areaTypes.Any(a => a == s.Cell.Area.AreaType) &&
                                           (s.Quantity - s.OutFrozenQuantity) % s.Product.Unit.Count > 0)
                            .ToArray();

                if (Locker.Lock(ss))
                {
                    areaTypes = new string[] { "2" };
                    var cc = cells.Where(c => areaTypes.Any(a => a == c.Area.AreaType) &&
                                         c.IsSingle == "1")
                             .ToArray();

                    ss.AsParallel().ForAll(
                        (Action <Storage>) delegate(Storage s)
                    {
                        MoveToBarArea(moveBillMaster, s, cc);
                    }
                        );

                    Locker.UnLock(ss);
                }
                else
                {
                    return;
                }
            }
            else
            {
                //主库区件烟库区条烟移到条烟区
                areaTypes = new string[] { "1", "2" };
                ss        = storages.Where(s => areaTypes.Any(a => a == s.Cell.Area.AreaType) &&
                                           (s.Quantity - s.OutFrozenQuantity) % s.Product.Unit.Count > 0)
                            .ToArray();

                if (Locker.Lock(ss))
                {
                    areaTypes = new string[] { "3" };
                    var cc = cells.Where(c => areaTypes.Any(a => a == c.Area.AreaType) &&
                                         c.IsSingle == "1")
                             .ToArray();

                    ss.AsParallel().ForAll(
                        (Action <Storage>) delegate(Storage s)
                    {
                        MoveToBarArea(moveBillMaster, s, cc);
                    }
                        );

                    Locker.UnLock(ss);
                }
                else
                {
                    return;
                }
            }
            MoveBillDetailRepository.SaveChanges();
        }