dengjunjie
2024-11-14 c827fe7b0c5b3b444d76ba0d96a2649c764630dd
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Service/OutboundOrderDetailService.cs
@@ -19,6 +19,7 @@
using WIDESEA_IStockRepository;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
using WIDESEA_OutboundRepository;
using WIDESEA_StockRepository;
namespace WIDESEA_OutboundService
@@ -130,7 +131,7 @@
        /// åˆ†é…å‡ºåº“库存
        /// </summary>
        /// <param name="outboundOrderDetail"></param>
        /// <param name="stockSelectViews"></param>
        /// <param name="stockSelectViews">指定库存</param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_OutboundOrderDetail outboundOrderDetail, List<StockSelectViewDTO> stockSelectViews)
@@ -142,16 +143,27 @@
            decimal originalNeedQuantity = outboundOrderDetail.OrderQuantity - outboundOrderDetail.LockQuantity;
            decimal needQuantity = originalNeedQuantity;
            #region æ ¹æ®æ‰˜ç›˜å·æŸ¥æ‰¾åº“å­˜
            //List<Dt_StockInfo> outStocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockSelectViews.Select(x => x.PalletCode).ToList());
            #endregion
            List<Dt_StockInfo> outStocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockSelectViews.Select(x => x.PalletCode).ToList());
            decimal assignQuantity = 0;
            outStocks.ForEach(x =>
            {
                x.Details.ForEach(v =>
                {
                    assignQuantity += v.StockQuantity - v.OutboundQuantity;
                });
            });
            List<Dt_StockInfoDetail> outStockDetails = _stockService.StockInfoDetailService.GetStockInfosByBatchNoCodes(stockSelectViews);
            List<Dt_StockInfo> outStocks = _stockService.StockInfoService.Repository.GetStockInfosByIds(outStockDetails.Select(x => x.StockId).ToList());
            decimal assignQuantity = outStocks.Count;
            #region MyRegion
            //decimal assignQuantity = 0;
            //outStocks.ForEach(x =>
            //{
            //    x.Details.ForEach(v =>
            //    {
            //        assignQuantity += v.StockQuantity - v.OutboundQuantity;
            //    });
            //});
            #endregion
            outboundOrderDetail.LockQuantity += assignQuantity;
            outStocks.ForEach(x =>
@@ -162,27 +174,55 @@
                });
            });
            needQuantity -= assignQuantity;
            #region æŒ‡å®šå‡ºåº“数量少于订单数量自动分配满足条件库存
            //if (outboundOrderDetail.OrderQuantity > outboundOrderDetail.LockQuantity)
            //{
            //    List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(outboundOrderDetail.MaterielCode);
            //    stockInfos = stockInfos.Where(x => !stockSelectViews.Select(v => v.PalletCode).Contains(x.PalletCode)).ToList();
            //    List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, outboundOrderDetail.MaterielCode, needQuantity, out decimal residueQuantity);
            //    outboundOrderDetail.LockQuantity += needQuantity - residueQuantity;
            //    outStocks.AddRange(autoAssignStocks);
            //    outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
            //    if (residueQuantity > 0)
            //    {
            //        outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOverPartial.ObjToInt();
            //    }
            //}
            #endregion
            #region æœªæŒ‡å®šåº“存,自动分配库存
            if (outboundOrderDetail.OrderQuantity > outboundOrderDetail.LockQuantity)
            {
                List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(outboundOrderDetail.MaterielCode);
                stockInfos = stockInfos.Where(x => !stockSelectViews.Select(v => v.PalletCode).Contains(x.PalletCode)).ToList();
                List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(outboundOrderDetail.MaterielCode);//获取所有库存
                stockInfos = stockInfos.Where(x => !outStocks.Select(v => v.Id).Contains(x.Id)).ToList();
                List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, outboundOrderDetail.MaterielCode, needQuantity, out decimal residueQuantity);
                outboundOrderDetail.LockQuantity += needQuantity - residueQuantity;
                outStocks.AddRange(autoAssignStocks);
                outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
                if (residueQuantity > 0)
                {
                    outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOverPartial.ObjToInt();
                }
                //outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
                //if (residueQuantity > 0)
                //{
                //    outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOverPartial.ObjToInt();
                //}
            }
            #endregion
            outboundOrderDetail.OrderDetailStatus = outboundOrderDetail.OrderQuantity > outboundOrderDetail.LockQuantity ? OrderDetailStatusEnum.AssignOverPartial.ObjToInt() : OrderDetailStatusEnum.AssignOver.ObjToInt();
            //添加出库分配详情
            List<Dt_OutStockLockInfo> outStockLockInfos = _outStockLockInfoService.GetOutStockLockInfos(outboundOrder, outboundOrderDetail, outStocks);
            List<Dt_LocationInfo> locationInfos = _basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList());
            return (outStocks, outboundOrderDetail, outStockLockInfos, locationInfos);
        }
        /// <summary>
        /// æŒ‡å®šåº“存锁定库存
        /// </summary>
        /// <param name="orderDetailId"></param>
        /// <param name="stockSelectViews"></param>
        /// <returns></returns>
        public WebResponseContent LockOutboundStock(int orderDetailId, List<StockSelectViewDTO> stockSelectViews)
        {
            try
@@ -190,7 +230,7 @@
                Dt_OutboundOrderDetail outboundOrderDetail = BaseDal.QueryFirst(x => x.Id == orderDetailId);
                (bool, string) checkResult = CheckSelectStockDeital(outboundOrderDetail, stockSelectViews);
                if (!checkResult.Item1) throw new Exception(checkResult.Item2);
                //分配出库库存
                (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = AssignStockOutbound(outboundOrderDetail, stockSelectViews);
                _unitOfWorkManage.BeginTran();
@@ -212,7 +252,7 @@
            }
        }
        /// <summary>
        /// é”å®šåº“å­˜
        /// é”å®šåº“å­˜//不指定库存锁定库存
        /// </summary>
        /// <param name="keys"></param>
        /// <returns></returns>
@@ -259,31 +299,85 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// é”å®šå‡ºåº“单库存数据修改
        /// </summary>
        /// <param name="stockInfos"></param>
        /// <param name="outboundOrderDetails"></param>
        /// <param name="outStockLockInfos"></param>
        /// <param name="locationInfos"></param>
        /// <param name="locationStatus"></param>
        /// <param name="tasks"></param>
        /// <returns></returns>
        public WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_OutboundOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null)
        {
            try
            {
                _stockService.StockInfoService.Repository.UpdateData(stockInfos);
                #region ä¿®æ”¹åº“存和库存详情
                List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
                foreach (var item in stockInfos)
                {
                    if (item.StockStatus != StockStatusEmun.移库中.ObjToInt())
                    {
                        item.StockStatus = locationStatus == LocationStatusEnum.InStock
                            ? StockStatusEmun.已入库.ObjToInt() : StockStatusEmun.出库锁定.ObjToInt();
                        item.Details.ForEach(x =>
                        {
                            x.Status = item.StockStatus;
                        });
                    }
                    stockInfoDetails.AddRange(item.Details);
                }
                _stockService.StockInfoService.Repository.UpdateData(stockInfos);
                _stockService.StockInfoDetailService.Repository.UpdateData(stockInfoDetails);
                BaseDal.UpdateData(outboundOrderDetails);
                #endregion
                #region ä¿®æ”¹å‡ºåº“单和出库单详情
                List<Dt_OutboundOrder> outboundOrders = _outboundRepository.OutboundOrderRepository.GetStockInfos(outboundOrderDetails.Select(x => x.OrderId).ToList());
                foreach (var item in outboundOrderDetails)
                {
                    var outboundOrder = outboundOrders.Where(x => x.Id == item.OrderId).FirstOrDefault();
                    outboundOrder.Details.RemoveAll(x => x.Id == item.Id);
                    outboundOrder.Details.Add(item);
                    outboundOrder.OrderStatus = outboundOrder.Details.FirstOrDefault
                                (x => x.OrderDetailStatus != OrderDetailStatusEnum.New.ObjToInt()) != null
                                ? OutboundStatusEnum.出库中.ObjToInt() : OutboundStatusEnum.未开始.ObjToInt();
                    //var outboundOrder = _outboundRepository.OutboundOrderRepository.QueryFirst(x => x.Id == item.OrderId);
                    //if (!outboundOrders.Any(x => x.Id == item.OrderId))
                    //{
                    //    var outboundOrder = _outboundRepository.OutboundOrderRepository.GetStockInfo(item.OrderId);
                    //    if (outboundOrder != null)
                    //    {
                    //        outboundOrder.Details.RemoveAll(x => x.Id == item.Id);
                    //        outboundOrder.Details.Add(item);
                    //        outboundOrder.OrderStatus = outboundOrder.Details.FirstOrDefault
                    //            (x => x.OrderDetailStatus != OrderDetailStatusEnum.New.ObjToInt()) != null
                    //            ? OutboundStatusEnum.出库中.ObjToInt() : OutboundStatusEnum.未开始.ObjToInt();
                    //        outboundOrders.Add(outboundOrder);
                    //    }
                    //}
                }
                _outboundRepository.OutboundOrderRepository.UpdateData(outboundOrders);
                BaseDal.UpdateData(outboundOrderDetails);
                #endregion
                #region æ·»åŠ å‡ºåº“è¯¦æƒ…
                List<Dt_OutStockLockInfo> addOutStockLockInfos = outStockLockInfos.Where(x => x.Id == 0).ToList();
                if (addOutStockLockInfos != null && addOutStockLockInfos.Any())
                {
                    _outStockLockInfoService.Repository.AddData(addOutStockLockInfos);
                }
                #endregion
                #region ä¿®æ”¹å‡ºåº“详情
                List<Dt_OutStockLockInfo> updateOutStockLockInfos = outStockLockInfos.Where(x => x.Id > 0).ToList();
                if (updateOutStockLockInfos != null && updateOutStockLockInfos.Any())
                {
                    _outStockLockInfoService.Repository.UpdateData(updateOutStockLockInfos);
                }
                #endregion
                //添加货位信息变更
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, locationStatus.ObjToInt(), StockChangeType.Outbound.ObjToInt(), "", tasks?.Select(x => x.TaskNum).ToList());
                _basicService.LocationInfoService.Repository.UpdateLocationStatus(locationInfos, locationStatus);
                return WebResponseContent.Instance.OK();
@@ -310,7 +404,11 @@
            }
            return (true, "成功");
        }
        /// <summary>
        /// æ’¤é”€åˆ†é…
        /// </summary>
        /// <param name="orderDetailId"></param>
        /// <returns></returns>
        public WebResponseContent RevokeLockOutboundStock(int orderDetailId)
        {
            Dt_OutboundOrderDetail outboundOrderDetail = BaseDal.QueryFirst(x => x.Id == orderDetailId);