wankeda
2026-01-19 e83c793bebdb1b9ecdcd79fab8d83fd167baa817
WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs
@@ -1,6 +1,7 @@
using AutoMapper;
using Magicodes.ExporterAndImporter.Core;
using Magicodes.ExporterAndImporter.Excel;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using SqlSugar;
using System;
@@ -79,6 +80,13 @@
            return BaseDal.GetStockInfos(materielCode, locationCodes);
        }
        //public List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, int warehoseId)
        //{
        //    List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId);
        //    return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes);
        //}
        public List<StockSelectViewDTO> GetStockSelectViews(string materielCode)
        {
@@ -185,6 +193,112 @@
            return outStocks;
        }
        //低温、药水分配库存
        public List<Dt_StockInfo> DWANDYSGetOutboundStocks(List<Dt_StockInfo> stockInfos, string materielCode,string batchNo ,decimal needQuantity, out decimal residueQuantity)
        {
            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
            decimal stockTotalQuantity = stockInfos.SelectMany(x => x.Details).Where(d => d.BatchNo == batchNo).Sum(v => v.StockQuantity - v.OutboundQuantity);
            stockInfos = stockInfos.Where(x => x.Details.Any(x => x.BatchNo == batchNo)).OrderBy(x => x.Id).ToList();
            if (stockTotalQuantity >= needQuantity)//库存够
            {
                int index = 0;
                while (needQuantity > 0)
                {
                    Dt_StockInfo stockInfo = stockInfos[index];
                    Dt_StockInfoDetail dt_StockInfoDetail = new Dt_StockInfoDetail();
                    foreach(var detail in stockInfo.Details)
                    {
                        if(detail.BatchNo == batchNo && detail.MaterielCode == materielCode)
                        {
                            dt_StockInfoDetail = detail;
                        }
                    }
                    decimal useableStockQuantity = dt_StockInfoDetail.StockQuantity - dt_StockInfoDetail.OutboundQuantity;
                    if (useableStockQuantity < needQuantity)
                    {
                        stockInfo.Details.ForEach(x =>
                        {
                            if(x.MaterielCode == materielCode && x.BatchNo == batchNo)
                            {
                                x.OutboundQuantity = x.StockQuantity;
                            }
                        });
                        needQuantity -= useableStockQuantity;
                    }
                    else
                    {
                        stockInfo.Details.ForEach(x =>
                        {
                            if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode && x.BatchNo == batchNo)
                            {
                                if (x.StockQuantity - x.OutboundQuantity >= needQuantity)
                                {
                                    x.OutboundQuantity += needQuantity;
                                    needQuantity = 0;
                                }
                                else
                                {
                                    needQuantity -= (x.StockQuantity - x.OutboundQuantity);
                                    x.OutboundQuantity = x.StockQuantity;
                                }
                            }
                        });
                    }
                    outStocks.Add(stockInfo);
                    index++;
                }
            }
            else
            {
                for (int i = 0; i < stockInfos.Count; i++)
                {
                    Dt_StockInfo stockInfo = stockInfos[i];
                    decimal useableStockQuantity = 0;
                    foreach (var detail in stockInfo.Details)
                    {
                        if(detail.MaterielCode == materielCode && detail.BatchNo == batchNo)
                        {
                            useableStockQuantity = detail.StockQuantity - detail.OutboundQuantity;
                        }
                    }
                    if (useableStockQuantity < needQuantity)
                    {
                        stockInfo.Details.ForEach(x => {
                            if(x.MaterielCode == materielCode && x.BatchNo == batchNo)
                            {
                                x.OutboundQuantity = x.StockQuantity;
                            }
                        });
                        needQuantity -= useableStockQuantity;
                    }
                    else
                    {
                        stockInfo.Details.ForEach(x =>
                        {
                            if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode && x.BatchNo == batchNo)
                            {
                                if (x.StockQuantity - x.OutboundQuantity >= needQuantity)
                                {
                                    x.OutboundQuantity += needQuantity;
                                    needQuantity = 0;
                                }
                                else
                                {
                                    needQuantity -= (x.StockQuantity - x.OutboundQuantity);
                                    x.OutboundQuantity = x.StockQuantity;
                                }
                            }
                        });
                    }
                    outStocks.Add(stockInfo);
                }
            }
            residueQuantity = needQuantity;
            return outStocks;
        }
        //导出
        public override WebResponseContent Export(PageDataOptions options)
        {
@@ -204,19 +318,19 @@
                List<Dt_StockInfodt> stolist= new List<Dt_StockInfodt>();
                for (int i = 0; i < entities.Count; i++)
                {
                    Dt_StockInfoDetail dt_StockIndet = detdata.Where(x => x.StockId == entities[i].Id).FirstOrDefault();
                    List<Dt_StockInfoDetail> dt_StockIndet = detdata.Where(x => x.StockId == entities[i].Id).ToList();
                    string MaterialTypet = "原材料";
                    if (entities[i].MaterialType == (int)InventoryMaterialType.成品)
                    {
                        MaterialTypet = "成品";
                    }
                    else if(entities[i].MaterialType == (int)InventoryMaterialType.空托)
                    else if (entities[i].MaterialType == (int)InventoryMaterialType.空托)
                    {
                        MaterialTypet = "空托";
                    }
                    string Wlstatust = "待检";
                    if (entities[i].Wlstatus== (int)InventoryMaterialStatus.合格)
                    if (entities[i].Wlstatus == (int)InventoryMaterialStatus.合格)
                    {
                        Wlstatust = "合格";
                    }
@@ -247,14 +361,14 @@
                        MaterialType = MaterialTypet,
                        LocationCode = entities[i].LocationCode,
                        Wlstatus = Wlstatust,
                        MaterielCode = dt_StockIndet?.MaterielCode ?? "", // 如果 dt_StockIndet 为 null,使用空字符串作为默认值
                        MaterielName = dt_StockIndet?.MaterielName ?? "",
                        OrderNo = dt_StockIndet?.OrderNo ?? "",
                        BatchNo = dt_StockIndet?.BatchNo ?? "",
                        SerialNumber = dt_StockIndet?.SerialNumber ?? "",
                        StockQuantity = dt_StockIndet?.StockQuantity ?? 0, // 假设 StockQuantity 是数值类型,使用 0 作为默认值
                        BatchNoName = dt_StockIndet?.BatchNoName ?? "",
                        CreateDate = dt_StockIndet?.CreateDate ?? DateTime.MinValue, // 假设 CreateDate 是日期类型,使用默认时间
                        MaterielCode = dt_StockIndet?.FirstOrDefault()?.MaterielCode ?? "",
                        MaterielName = dt_StockIndet?.FirstOrDefault()?.MaterielName ?? "",
                        OrderNo = dt_StockIndet?.FirstOrDefault()?.OrderNo ?? "",
                        BatchNo = dt_StockIndet?.FirstOrDefault()?.BatchNo ?? "",
                        SerialNumber = dt_StockIndet?.FirstOrDefault()?.SerialNumber ?? "",
                        StockQuantity = dt_StockIndet?.Sum(item => item.StockQuantity) ?? 0,
                        BatchNoName = dt_StockIndet?.FirstOrDefault()?.BatchNoName ?? "",
                        CreateDate = dt_StockIndet?.FirstOrDefault()?.CreateDate ?? DateTime.MinValue,
                        Remark = entities[i].Remark,
                    };
                    stolist.Add(dt_);
@@ -289,5 +403,13 @@
            [ExporterHeader(DisplayName = "物料状态")]
            public string Wlstatus { get; set; }
        }
        public List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, List<Dt_Warehouse> warehouse)
        {
            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehouse);
            return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes);
        }
    }
}