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(); }