/// <summary> /// 将流水保存到数据库。 /// </summary> /// <param name="flow">要保存的流水。</param> /// <param name="updateStock">指示是否更新库存数据。</param> /// <returns></returns> async Task SaveAsync <TStockKey>(Flow flow, bool updateStock) where TStockKey : StockKeyBase { if (flow.FlowId != 0) { throw new InvalidOperationException("不能保存重复的流水。"); } await _session.SaveAsync(flow); if (updateStock) { var key = flow.GetStockKey <TStockKey>(); Stock stock = await _session.Query <Stock>().OfStockKey(key).SingleOrDefaultAsync().ConfigureAwait(false); if (stock == null) { stock = _stockFactory.CreateStock(); stock.SetStockKey(key); stock.OutOrdering = _outOrderingProvider.GetOutOrdering(key); // TODO 暂取记录的创建时间作为库龄基线 stock.AgeBaseline = DateTime.Now; stock.Quantity = (flow.Quantity * (int)flow.Direction); await _session.SaveAsync(stock).ConfigureAwait(false); } else { stock.Quantity += (flow.Quantity * (int)flow.Direction); await _session.UpdateAsync(stock).ConfigureAwait(false); } flow.Balance = stock.Quantity; } }
public async Task <Unitload> PalletizeAsync <TStockKey>(string palletCode, IEnumerable <PalletizationItemInfo <TStockKey> > items, string opType, string bizType, string orderCode = Cst.None, string bizOrder = Cst.None, bool updateStock = true) where TStockKey : StockKeyBase { if (palletCode == null) { throw new ArgumentNullException(nameof(palletCode)); } if (bizType == null) { throw new ArgumentNullException(nameof(bizType)); } if (opType == null) { throw new ArgumentNullException(nameof(opType)); } _logger.Information($"正在组盘,托盘号:{palletCode}", palletCode); // 验证托盘编码是否已占用 bool used = await _session.Query <Unitload>() .IsPalletCodeInUseAsync(palletCode) .ConfigureAwait(false); if (used) { throw new InvalidOperationException($"托盘号已被占用:【{palletCode}】"); } // 验证托盘编码是否符合合法 if (_palletCodeValidator.IsWellFormed(palletCode, out string err) == false) { throw new InvalidOperationException($"托盘号无效:{err}"); } // 生成货载和流水 Unitload unitload = _unitloadFactory.CreateUnitload(); unitload.PalletCode = palletCode; foreach (var item in items) { UnitloadItem unitloadItem = _unitloadFactory.CreateUnitloadItem(); unitloadItem.SetStockKey(item.StockKey); unitloadItem.Quantity = item.Quantity; unitloadItem.OutOrdering = _outOrderingProvider.GetOutOrdering(item.StockKey); unitload.AddItem(unitloadItem); await _flowHelper .CreateAndSaveAsync(item.StockKey, item.Quantity, FlowDirection.Inbound, bizType, opType, palletCode, orderCode, bizOrder, Cst.None, updateStock) .ConfigureAwait(false); } var loc = await _session.Query <Location>().GetNAsync().ConfigureAwait(false); unitload.Enter(loc); unitload.StorageInfo = new UnitloadStorageInfo { StorageGroup = _storageInfoProvider.GetStorageGroup(unitload), OutFlag = _storageInfoProvider.GetOutFlag(unitload), ContainerSpecification = _storageInfoProvider.GetContainerSpecification(unitload) }; // 将货载保存到数据库 await _session.SaveAsync(unitload).ConfigureAwait(false); _logger.Information($"组盘成功"); return(unitload); }