From c020f31a67fc5aa5644511bddff075f7ecc85234 Mon Sep 17 00:00:00 2001
From: qinchulong <qinchulong@hnkhzn.com>
Date: 星期二, 27 五月 2025 15:35:27 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/HuaYiZhongHeng/ZhongHeLiTiKu

---
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs |  185 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 185 insertions(+), 0 deletions(-)

diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs"
new file mode 100644
index 0000000..37e75a2
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs"
@@ -0,0 +1,185 @@
+锘縰sing AutoMapper;
+using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEA_Core;
+using WIDESEA_Core.BaseServices;
+using WIDESEA_Core.Enums;
+using WIDESEA_Core.Helper;
+using WIDESEA_DTO.Stock;
+using WIDESEA_IBasicRepository;
+using WIDESEA_IRecordRepository;
+using WIDESEA_IRecordService;
+using WIDESEA_IStockRepository;
+using WIDESEA_IStockService;
+using WIDESEA_Model.Models;
+
+namespace WIDESEA_StockService
+{
+    public partial class StockInfoService : ServiceBase<Dt_StockInfo, IStockInfoRepository>, IStockInfoService
+    {
+        /// <summary>
+        /// 鏍规嵁鎵樼洏鍙锋煡璇㈠簱瀛�
+        /// </summary>
+        /// <param name="palletCode"></param>
+        /// <returns></returns>
+        public Dt_StockInfo? GetStockByPalletCode(string palletCode)
+        {
+            Dt_StockInfo stockInfo = BaseDal.QueryFirst(x => x.PalletCode == palletCode);
+            if (stockInfo != null)
+            {
+                stockInfo.Details = _stockRepository.StockInfoDetailRepository.QueryData(x => x.StockId == stockInfo.Id);
+            }
+            return stockInfo;
+        }
+
+        public void AddMaterielGroup(Dt_StockInfo stockInfo)
+        {
+            decimal beforeQuantity = 0;
+            List<Dt_StockInfoDetail> details = new List<Dt_StockInfoDetail>();
+            if (stockInfo.Id == 0)
+            {
+                BaseDal.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
+                details = stockInfo.Details;
+            }
+            else
+            {
+                beforeQuantity = stockInfo.Details.Where(x => x.Id != 0).Sum(x => x.StockQuantity);
+
+                for (int i = 0; i < stockInfo.Details.Count; i++)
+                {
+                    if (stockInfo.Details[i].Id == 0)
+                    {
+                        details.Add(_stockRepository.StockInfoDetailRepository.Db.Insertable(stockInfo.Details[i]).ExecuteReturnEntity());
+                    }
+
+                }
+
+            }
+            stockInfo.Details = details;
+            _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, StockChangeType.MaterielGroup,0);
+        }
+
+        public List<Dt_StockInfo> GetUseableStocks(string materielCode)
+        {
+            List<string> roadways = _basicRepository.RoadwayInfoRepository.CanOutRoadwayNos;
+
+            List<int> warehouseIds = _basicRepository.WarehouseRepository.EnableWarehouseIds;
+
+            List<int> areaIds = _basicRepository.AreaInfoRepository.GetEnableAreaIds(warehouseIds);
+
+            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(roadways, areaIds);
+
+            return BaseDal.GetStockInfos(materielCode, locationCodes);
+        }
+        public List<StockSelectViewDTO> GetStockSelectViews(string materielCode)
+        {
+            List<string> roadways = _basicRepository.RoadwayInfoRepository.CanOutRoadwayNos;
+
+            List<int> warehouseIds = _basicRepository.WarehouseRepository.EnableWarehouseIds;
+
+            List<int> areaIds = _basicRepository.AreaInfoRepository.GetEnableAreaIds(warehouseIds);
+
+            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(roadways, areaIds);
+
+
+            return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, StockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new StockSelectViewDTO
+            {
+                LocationCode = a.LocationCode,
+                MaterielCode = b.MaterielCode,
+                MaterielName = b.MaterielName,
+                PalletCode = a.PalletCode,
+                UseableQuantity = b.StockQuantity - b.OutboundQuantity
+            }, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new StockSelectViewDTO
+            {
+                LocationCode = x.FirstOrDefault()?.LocationCode ?? "",
+                MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "",
+                MaterielName = x.FirstOrDefault()?.MaterielName ?? "",
+                PalletCode = x.Key,
+                UseableQuantity = x.Sum(x => x.UseableQuantity)
+            }).ToList();
+        }
+
+        public List<Dt_StockInfo> GetOutboundStocks(List<Dt_StockInfo> stockInfos, string materielCode, decimal needQuantity, out decimal residueQuantity)
+        {
+            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
+            decimal stockTotalQuantity = stockInfos.Select(x => x.Details.Sum(v => v.StockQuantity - v.OutboundQuantity)).Sum(x => x);
+            stockInfos = stockInfos.OrderBy(x => x.Id).ToList();
+            if (stockTotalQuantity >= needQuantity)//搴撳瓨澶�
+            {
+                int index = 0;
+                while (needQuantity > 0)
+                {
+
+                    Dt_StockInfo stockInfo = stockInfos[index];
+                    decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity);
+                    if (useableStockQuantity < needQuantity)
+                    {
+                        stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity);
+                        needQuantity -= useableStockQuantity;
+                    }
+                    else
+                    {
+                        stockInfo.Details.ForEach(x =>
+                        {
+                            if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode)
+                            {
+                                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 = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity);
+                    if (useableStockQuantity < needQuantity)
+                    {
+                        stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity);
+                        needQuantity -= useableStockQuantity;
+                    }
+                    else
+                    {
+                        stockInfo.Details.ForEach(x =>
+                        {
+                            if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode)
+                            {
+                                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;
+        }
+    }
+}

--
Gitblit v1.9.3