Procházet zdrojové kódy

重构焊点处理逻辑,新增处理扩展类

在 `SXService.cs` 中引入 `SxServiceExtension` 类,重构焊点相关处理逻辑,简化焊点盘处理流程,并注释掉不再使用的代码。

在 `BillPboxrule.cs` 中更新 `PerSolderMaxCount` 属性的注释,明确其含义为“每箱允许最大焊点数量”。

新增 `SxServiceExtension.cs` 文件,提供 `ProcessWeldingPointsBoxing` 和 `GetWeldingPointsBoxing` 方法,以优化焊点盘处理和库存管理。
林豪 左 před 1 týdnem
rodič
revize
adb80d416c

+ 101 - 0
wms.service/Extensions/SxServiceExtension.cs

@@ -0,0 +1,101 @@
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using wms.dto.response.sx;
+using wms.sqlsugar.model.sx;
+
+namespace wms.service.Extensions
+{
+    /// <summary>
+    /// 时效服务扩展
+    /// </summary>
+    public static class SxServiceExtension
+    {
+        /// <summary>
+        /// 装箱时处理焊点盘
+        /// </summary>
+        /// <param name="rule">箱号对应的装箱规则</param>
+        /// <param name="invlist">库存信息</param>
+        /// <param name="outInvlist">后续可用的不带焊点盘信息</param>
+        /// <returns>填充后的焊点盘列表</returns>
+        public static List<StockTemp> ProcessWeldingPointsBoxing(BillPboxrule rule, IEnumerable<StockTemp>? invlist, out IEnumerable<StockTemp>? outInvlist)
+        {
+            var solderinvlist = new List<StockTemp>();
+            invlist ??= Enumerable.Empty<StockTemp>();
+
+            // 如果不控制焊点盘数,则直接按生产时间排序后返回
+            if (rule.SolderMaxCount <= 0)
+            {
+                outInvlist = invlist.OrderBy(p => p.ProductTime);
+                return solderinvlist;
+            }
+
+            // 计算需要获取的焊点盘数量
+            int itemsPerBox = (rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36;
+            int requiredSolderBoxes = Math.Max(0, rule.FullCountQty / itemsPerBox * rule.SolderMaxCount);
+
+            // 获取所有带焊点的盘并排序
+            var availableSolders = invlist.Where(p => p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).ToList();
+
+            // 根据是否管控总焊点数量来选择不同的策略
+            if (rule.PerSolderMaxCount <= 0)
+            {
+                // 不管控总焊点数量,直接取前 N 个
+                solderinvlist = availableSolders.Take(requiredSolderBoxes).ToList();
+            }
+            else
+            {
+                // 管控总焊点数量,使用 GetWeldingPointsBoxing 方法
+                solderinvlist = GetWeldingPointsBoxing(
+                    currentBoxes: solderinvlist,
+                    maxBoxCount: requiredSolderBoxes,
+                    maxTotalSolderCount: rule.PerSolderMaxCount,
+                    inventory: availableSolders
+                );
+            }
+
+            // 剩余可用库存为无焊点的
+            outInvlist = invlist.Where(p => p.SolderCount == 0);
+
+            return solderinvlist;
+        }
+
+        /// <summary>
+        /// 获取焊点盘(装箱处理)
+        /// </summary>
+        /// <param name="currentBoxes">已有的焊点盘</param>
+        /// <param name="maxBoxCount">最大焊点盘数</param>
+        /// <param name="maxTotalSolderCount">最大焊点总数</param>
+        /// <param name="inventory">库存信息</param>
+        /// <returns>填充后的焊点盘列表</returns>
+        public static List<StockTemp> GetWeldingPointsBoxing(List<StockTemp> currentBoxes, int maxBoxCount, int maxTotalSolderCount, IEnumerable<StockTemp>? inventory)
+        {
+            if (inventory == null || !inventory.Any()) return currentBoxes;
+
+            // 当前状态统计
+            var currentBoxCount = currentBoxes.Count;
+            var currentTotalSolderCount = currentBoxes.Sum(x => x.SolderCount);
+
+            // 如果已经满载,直接返回
+            if (currentBoxCount >= maxBoxCount || currentTotalSolderCount >= maxTotalSolderCount) return currentBoxes;
+
+            // 将库存转换为列表并排序,避免重复排序
+            var availableInventory = inventory.Where(p => p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).ToList();
+
+            foreach (var item in availableInventory)
+            {
+                // 判断是否还能继续添加
+                if (currentBoxCount >= maxBoxCount || currentTotalSolderCount >= maxTotalSolderCount) break;
+
+                // 添加当前项
+                currentBoxes.Add(item);
+                currentBoxCount++;
+                currentTotalSolderCount += item.SolderCount;
+            }
+
+            return currentBoxes;
+        }
+    }
+}

+ 44 - 38
wms.service/Service/SXService.cs

@@ -24,6 +24,7 @@ using wms.dto.response.cp;
 using wms.dto.response.hj;
 using wms.dto.response.share;
 using wms.dto.response.sx;
+using wms.service.Extensions;
 using wms.service.IService;
 using wms.sqlsugar;
 using wms.sqlsugar.model;
@@ -7871,27 +7872,32 @@ namespace wms.service.Service
                             invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
                         }
 
-                        //焊点属性筛选
+                        #region 焊点相关处理
+
                         var tempoutrecord = invlist2.ToList();
+                        var solderinvlist = SxServiceExtension.ProcessWeldingPointsBoxing(rule, invlist2, out invlist2);
+
+                        //var solderinvlist = new List<StockTemp>();
+                        //if (rule.PerSolderMaxCount > 0)  //允许焊点盘
+                        //{
+                        //    int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
+                        //    var solcount = rulemaxcount;
+                        //    if (solcount <= 0)
+                        //    {
+                        //        solcount = 0;
+                        //    }
+                        //    ;
+                        //    solderinvlist = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(solcount).ToList();
+                        //    invlist2 = invlist2.Where(p => p.SolderCount == 0);
+                        //}
+                        //else
+                        //{
+                        //    //不允许焊点盘
+                        //    invlist2 = invlist2.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
+                        //}
+
+                        #endregion 焊点相关处理
 
-                        var solderinvlist = new List<StockTemp>();
-                        if (rule.PerSolderMaxCount > 0)  //允许焊点盘
-                        {
-                            int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
-                            var solcount = rulemaxcount;
-                            if (solcount <= 0)
-                            {
-                                solcount = 0;
-                            }
-                            ;
-                            solderinvlist = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(solcount).ToList();
-                            invlist2 = invlist2.Where(p => p.SolderCount == 0);
-                        }
-                        else
-                        {
-                            //不允许焊点盘
-                            invlist2 = invlist2.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
-                        }
                         var returninvlist = new List<StockTemp>();
                         if (rule.ReturnCount > 0)
                         {
@@ -8208,25 +8214,25 @@ namespace wms.service.Service
                             #region 焊点相关处理
 
                             var tempoutrecord = invlist2.ToList();
-
-                            var solderinvlist = new List<StockTemp>();
-                            if (rule.PerSolderMaxCount > 0)  //允许焊点盘
-                            {
-                                int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
-                                var solcount = rulemaxcount;
-                                if (solcount <= 0)
-                                {
-                                    solcount = 0;
-                                }
-                                ;
-                                solderinvlist = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(solcount).ToList();
-                                invlist2 = invlist2.Where(p => p.SolderCount == 0);
-                            }
-                            else
-                            {
-                                //不允许焊点盘
-                                invlist2 = invlist2.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
-                            }
+                            var solderinvlist = SxServiceExtension.ProcessWeldingPointsBoxing(rule, invlist2, out invlist2);
+                            //var solderinvlist = new List<StockTemp>();
+                            //if (rule.PerSolderMaxCount > 0)  //允许焊点盘
+                            //{
+                            //    int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
+                            //    var solcount = rulemaxcount;
+                            //    if (solcount <= 0)
+                            //    {
+                            //        solcount = 0;
+                            //    }
+                            //    ;
+                            //    solderinvlist = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(solcount).ToList();
+                            //    invlist2 = invlist2.Where(p => p.SolderCount == 0);
+                            //}
+                            //else
+                            //{
+                            //    //不允许焊点盘
+                            //    invlist2 = invlist2.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
+                            //}
 
                             #endregion 焊点相关处理
 

+ 1 - 1
wms.sqlsugar/model/sx/BillPboxrule.cs

@@ -70,7 +70,7 @@ namespace wms.sqlsugar.model.sx
         public int SolderMaxCount { get; set; }
 
         /// <summary>
-        /// 每个工字轮允许最大焊点数量
+        /// 每允许最大焊点数量
         /// </summary>
         [SugarColumn(ColumnDataType = "int", IsNullable = false)]
         public int PerSolderMaxCount { get; set; }