From 2a978847c0dfef510349b097ef8202afe5647997 Mon Sep 17 00:00:00 2001
From: yangpeixing <yangpeixing@hnkhzn.com>
Date: 星期四, 22 一月 2026 15:47:27 +0800
Subject: [PATCH] 1

---
 WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs |  157 ++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 144 insertions(+), 13 deletions(-)

diff --git a/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs b/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs
index 59b3b84..b617a84 100644
--- a/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs
+++ b/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs
@@ -1,6 +1,7 @@
 锘縰sing 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;
@@ -20,6 +21,7 @@
 using WIDESEA_IStockRepository;
 using WIDESEA_IStockService;
 using WIDESEA_Model.Models;
+using static WIDESEA_IStockService.IStockInfoService;
 
 namespace WIDESEA_StockService
 {
@@ -192,6 +194,135 @@
             return outStocks;
         }
 
+        //浣庢俯銆佽嵂姘村垎閰嶅簱瀛�
+        public List<Dt_StockInfo> DWANDYSGetOutboundStocks(List<Dt_StockInfo> stockInfos,List<Dt_OutboundOrderDetail> dt_OutboundOrderDetails, out List<IStockInfoService.residueQuantity> residueQuantitys)
+        {
+            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
+            List<IStockInfoService.residueQuantity> newresidueQantity = new List<IStockInfoService.residueQuantity>();
+            List<Dt_StockInfo> notStocks = new List<Dt_StockInfo>(); ;
+            foreach(var dt_OutboundOrderDetail in dt_OutboundOrderDetails)
+            {
+                notStocks = stockInfos.Where(x => x.Details.Any(x => x.BatchNo == dt_OutboundOrderDetail.BatchNo && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode)).OrderBy(x => x.Id).ToList();
+                if(notStocks.Count > 0)
+                {
+                    decimal stockTotalQuantity = stockInfos.SelectMany(x => x.Details).Where(d => d.BatchNo == dt_OutboundOrderDetail.BatchNo).Sum(v => v.StockQuantity - v.OutboundQuantity);
+                    decimal needQuantity = dt_OutboundOrderDetail.OrderQuantity - dt_OutboundOrderDetail.LockQuantity;
+                    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 == dt_OutboundOrderDetail.BatchNo && detail.MaterielCode == dt_OutboundOrderDetail.MaterielCode)
+                                {
+                                    dt_StockInfoDetail = detail;
+                                }
+                            }
+                            decimal useableStockQuantity = dt_StockInfoDetail.StockQuantity - dt_StockInfoDetail.OutboundQuantity;
+                            if (useableStockQuantity < needQuantity)
+                            {
+                                stockInfo.Details.ForEach(x =>
+                                {
+                                    if (x.MaterielCode == dt_OutboundOrderDetail.MaterielCode && x.BatchNo == dt_OutboundOrderDetail.BatchNo)
+                                    {
+                                        x.OutboundQuantity = x.StockQuantity;
+                                    }
+                                });
+                                needQuantity -= useableStockQuantity;
+                            }
+                            else
+                            {
+
+                                stockInfo.Details.ForEach(x =>
+                                {
+                                    if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode && x.BatchNo == dt_OutboundOrderDetail.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 == dt_OutboundOrderDetail.MaterielCode && detail.BatchNo == dt_OutboundOrderDetail.BatchNo)
+                                {
+                                    useableStockQuantity = detail.StockQuantity - detail.OutboundQuantity;
+                                }
+                            }
+
+                            if (useableStockQuantity < needQuantity)
+                            {
+                                stockInfo.Details.ForEach(x => {
+                                    if (x.MaterielCode == dt_OutboundOrderDetail.MaterielCode && x.BatchNo == dt_OutboundOrderDetail.BatchNo)
+                                    {
+                                        x.OutboundQuantity = x.StockQuantity;
+                                    }
+                                });
+                                needQuantity -= useableStockQuantity;
+                            }
+                            else
+                            {
+                                stockInfo.Details.ForEach(x =>
+                                {
+                                    if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode && x.BatchNo == dt_OutboundOrderDetail.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);
+                        }
+                    }
+                    IStockInfoService.residueQuantity newResidueQuantity = new IStockInfoService.residueQuantity();
+                    newResidueQuantity.MaterielCode = dt_OutboundOrderDetail.MaterielCode;
+                    newResidueQuantity.BatchNo = dt_OutboundOrderDetail.BatchNo;
+                    newResidueQuantity.NewNeendQuantity = needQuantity;
+                    newresidueQantity.Add(newResidueQuantity);
+                }
+                else
+                {
+                    continue;
+                }
+                           
+            }
+            residueQuantitys = newresidueQantity;
+            if(outStocks.Count() > 1)
+            {
+                outStocks.RemoveRange(0, outStocks.Count - 1);
+            }
+            return outStocks;
+        }
         //瀵煎嚭
         public override WebResponseContent Export(PageDataOptions options)
         {
@@ -211,19 +342,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 = "鍚堟牸";
                     }
@@ -254,14 +385,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_);
@@ -298,9 +429,9 @@
         }
 
 
-        public List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, int warehoseId)
+        public List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, List<Dt_Warehouse> warehouse)
         {
-            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId);
+            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehouse);
 
             return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes);
         }

--
Gitblit v1.9.3