1
wangxinhui
13 小时以前 0023d3db5bd701864b73e57c0240c219c40c3a4e
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesRworkOutboundOrderService.cs
@@ -26,6 +26,8 @@
using WIDESEA_OutboundRepository;
using WIDESEA_Common.APIEnum;
using WIDESEA_Common.OrderEnum;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using System.Reflection.Metadata;
namespace WIDESEA_OutboundService
{
@@ -66,63 +68,50 @@
            Dt_MesRworkOutboundOrder assignOutOrder= new Dt_MesRworkOutboundOrder();
            List<Dt_OutProStockInfo> outProStockInfos=new List<Dt_OutProStockInfo>();
            List<Dt_LocationInfo> locationInfos=new List<Dt_LocationInfo>();
            float originalNeedQuantity = mesRworkOutboundOrder.RequiredQuantity;
            float needQuantity = originalNeedQuantity;
            float needQty = mesRworkOutboundOrder.RequiredQuantity;
            //查找可用库存
            List<Dt_ProStockInfo> stockInfoss = _stockService.ProStockInfoService.GetUseableStocks(mesRworkOutboundOrder);
            if (!stockInfoss.Any())
            {
                throw new Exception("未找到可分配库存");
            }
            List<Dt_ProStockInfo> autoAssignStocks = _stockService.ProStockInfoService.GetOutboundStocks(stockInfoss,mesRworkOutboundOrder, needQuantity,out float residueQuantity);
            mesRworkOutboundOrder.LockQuantity += needQuantity - residueQuantity;
            autoAssignStocks.OrderBy(x => x.proStockInfoDetails.FirstOrDefault()?.StockPcsQty).ToList();
            proStockInfos.AddRange(autoAssignStocks);
            float assignQuantity = needQuantity - residueQuantity;
            //获取出库库存
            List<Dt_ProStockInfo> assignOutStocks = _stockService.ProStockInfoService.GetOutboundStocks(stockInfoss, mesRworkOutboundOrder, needQty, out float residueQuantity);
            mesRworkOutboundOrder.LockQuantity += needQty - residueQuantity;
            if (mesRworkOutboundOrder.RequiredQuantity > mesRworkOutboundOrder.LockQuantity)
            {
                throw new Exception($"产品编码{mesRworkOutboundOrder.ProductCode},版本{mesRworkOutboundOrder.ProductVersion}可分配数量不足,可用数量{mesRworkOutboundOrder.LockQuantity}");
            }
            proStockInfos.AddRange(assignOutStocks);
            //分配出库的PCS数量
            float assignQuantity = needQty;
            //订单明细的出库PCS数量
            float orderQuantity = mesRworkOutboundOrder.RequiredQuantity;
            bool isCanDate = string.IsNullOrEmpty(mesRworkOutboundOrder.DateCode);
            for (int j = 0; j < autoAssignStocks.Count; j++)
            for (int j = 0; j < assignOutStocks.Count; j++)
            {
                //出库订单明细已分配数量
                float detailAssignQuantity = outProStockInfos
                    .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder
                    && x.PCode == mesRworkOutboundOrder.ProductCode
                    && x.PVer == mesRworkOutboundOrder.ProductVersion
                    && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode))
                    .Sum(x => x.AssignQuantity);
                float detailAssignQuantity = outProStockInfos.Where(x => x.OrderDetailId == mesRworkOutboundOrder.Id).Sum(x => x.AssignQuantity);
                //出库详情已分配数量
                float palletAssignQuantity = outProStockInfos
                    .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder
                    && x.PCode == mesRworkOutboundOrder.ProductCode
                    && x.PVer == mesRworkOutboundOrder.ProductVersion
                    && x.PalletCode == autoAssignStocks[j].PalletCode
                    && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode))
                    .Sum(x => x.AssignQuantity);
                float palletOutboundQuantity = autoAssignStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
                if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息
                //所剩数量
                float orderDetailNeedQuantity = mesRworkOutboundOrder.RequiredQuantity - detailAssignQuantity;
                //生成出库详情
                if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity))
                {
                    float orderDetailNeedQuantity = mesRworkOutboundOrder.RequiredQuantity - detailAssignQuantity;
                    if (orderDetailNeedQuantity > autoAssignStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
                    {
                        mesRworkOutboundOrder.LockQuantity += autoAssignStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
                        Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(mesRworkOutboundOrder, autoAssignStocks[j], autoAssignStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
                        outProStockInfos.Add(outStockLockInfo);
                    }
                    else
                    {
                        Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(mesRworkOutboundOrder, autoAssignStocks[j], mesRworkOutboundOrder.RequiredQuantity-mesRworkOutboundOrder.LockQuantity);
                        outProStockInfos.Add(outStockLockInfo);
                        mesRworkOutboundOrder.LockQuantity = mesRworkOutboundOrder.RequiredQuantity;
                        break;
                    }
                    mesRworkOutboundOrder.LockQuantity += assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
                    Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(mesRworkOutboundOrder, assignOutStocks[j], assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity));
                    outProStockInfos.Add(outStockLockInfo);
                }
                else
                {
                    Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(mesRworkOutboundOrder, assignOutStocks[j], mesRworkOutboundOrder.RequiredQuantity - detailAssignQuantity);
                    outProStockInfos.Add(outStockLockInfo);
                    mesRworkOutboundOrder.LockQuantity = mesRworkOutboundOrder.RequiredQuantity;
                    break;
                }
            }
            locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(proStockInfos.Select(x => x.LocationCode).ToList()));
            List<string> locationArr = proStockInfos.Select(x => x.LocationCode).ToList();
            locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(locationArr));
            return (proStockInfos, mesRworkOutboundOrder, outProStockInfos, locationInfos);
        }
@@ -311,6 +300,44 @@
            };
            return mesProductOutBound;
        }
        //库存板数据转换
        public MesProductOutBound MesProOutBound(Dt_MesRworkOutboundOrder mesRworkOutboundOrder, List<Dt_ProStockInfoDetail> proStockInfoDetails)
        {
            //获取仓库信息
            Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == mesRworkOutboundOrder.WarehouseId);
            List<MesInventoryInfo> inventoryInfos = new List<MesInventoryInfo>();
            foreach (var item in proStockInfoDetails.Where(x=>x.OutboundQuantity>0))
            {
                int setinterval = (int)item.StockPcsQty / (int)item.SETQty;
                if (setinterval == 0)
                {
                    throw new Exception($"{item.BagNo}获取SET数量转换失败");
                }
                item.OutSETQty = (int)item.OutboundQuantity / setinterval;
                if (item.OutSETQty == 0)
                {
                    throw new Exception($"{item.BagNo}获取SET数量转换失败");
                }
                MesInventoryInfo mesInventoryInfo = new MesInventoryInfo()
                {
                    Warhouseno = warehouse.WarehouseCode,
                    InternalPackageNumber = item.BagNo,
                    SetCount = (int)item.OutSETQty,
                    EligiblePcsCount = (int)item.OutboundQuantity
                };
                inventoryInfos.Add(mesInventoryInfo);
            }
            MesProductOutBound mesProductOutBound = new MesProductOutBound()
            {
                TaskNo = mesRworkOutboundOrder.TaskNo,
                ProductCode = mesRworkOutboundOrder.ProductCode,
                ProductVersion = mesRworkOutboundOrder.ProductVersion,
                DateCode = mesRworkOutboundOrder.DateCode,
                SaleOrder = mesRworkOutboundOrder.SaleOrder,
                InventoryInfo = inventoryInfos
            };
            return mesProductOutBound;
        }
        /// <summary>
        /// æˆå“åº“存板同步接口
        /// </summary>