예제 #1
0
        /// <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;
            }
        }
예제 #2
0
        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);
        }