123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- 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;
- }
- }
- }
|