Administrator
2024-03-26 952c07fee747bcdeff25323a456827fe2706c2c9
Wms/WMS.BLL/Logic/AllotSku.cs
@@ -2,6 +2,8 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model.ModelDto.DataDto;
using SqlSugar;
using WMS.Entity.Context;
using WMS.Entity.DataEntity;
using WMS.Entity.SysEntity;
@@ -14,14 +16,12 @@
        /// 分配货物
        /// </summary>
        /// <param name="palletList">库存明细集合</param>
        /// <param name="goodCode">物料编码</param>
        /// <param name="lotNo">批次</param>
        /// <param name="needQty">需要分配的数量</param>
        /// <param name="fullPalletQty">满托数量</param>
        /// <param name="fullBoxQty">满箱数量</param>
        /// <param name="stockQtyDic">托出库物品数 key:库存托盘表的ID、val:托盘上的数量</param>
        /// <returns></returns>
        public int AllotPallets(List<DataStockDetail> palletList, int needQty, int fullPalletQty, int fullBoxQty, Dictionary<int, int> stockQtyDic)
        public decimal AllotPallets(List<DataStockDetail> palletList, decimal needQty, int fullPalletQty, int fullBoxQty, Dictionary<int, decimal> stockQtyDic)
        {
            //优先先进先出(快过期的先出)
            //优先零箱、零托(出完零箱出整箱)
@@ -53,11 +53,13 @@
                    }
                }
                #endregion
                var qty = 0; //分配的总数量
                decimal qty = 0; //分配的总数量
                var ztNum = needQty / fullPalletQty;//需要整托数
                var zps = palletList.Where(s => s.Qty >= fullPalletQty).ToList();//整托
                var sps = palletList.Where(s => s.Qty < fullPalletQty).ToList();//散托(有可能是被锁定了数量的)
                var list = GetDataListOrderByDept(palletList);
                var zps = list.Where(s => s.Qty >= fullPalletQty).ToList();//整托
                var sps = list.Where(s => s.Qty < fullPalletQty).ToList();//散托(有可能是被锁定了数量的)
                if (allotSet == 0)//优先零箱(出完零箱出整箱)
                {
@@ -66,7 +68,7 @@
                    //散托
                    foreach (var s in st)
                    {
                        var detailQty = int.Parse((s.Qty - s.LockQty - s.FrozenQty).ToString());
                        var detailQty = decimal.Parse((s.Qty - s.LockQty - s.FrozenQty).ToString());
                        if (needQty - qty < detailQty)
                        {
                            var num = needQty - qty;
@@ -89,7 +91,7 @@
                        var zt = zps.OrderBy(s => s.ExpirationTime).ToList();//所有未使用的托盘(未被分配的)
                        foreach (var ss in zt)
                        {
                            var detailQty = int.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
                            var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
                            if (needQty - qty < detailQty)
                            {
                                var num = needQty - qty;
@@ -123,7 +125,7 @@
                        var zt = zps.OrderBy(s => s.ExpirationTime).ToList();//所有未使用的托盘(未被分配的)
                        foreach (var ss in zt)
                        {
                            var detailQty = int.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
                            var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
                            if (needQty - qty < detailQty)
                            {
                                break;
@@ -144,7 +146,7 @@
                        foreach (var ss in zt)
                        {
                            var detailQty = int.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
                            var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
                            if (needQty - qty < detailQty)
                            {
                                var num = needQty - qty;
@@ -167,7 +169,7 @@
                        var zt = zps.Where(s => !sIds.Contains(s.Id)).OrderBy(s => s.ExpirationTime).ThenBy(m => m.Qty - m.LockQty - m.FrozenQty).ToList();//所有未使用(未被分配的)
                        foreach (var ss in zt)
                        {
                            var detailQty = int.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
                            var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
                            if (needQty - qty < detailQty)
                            {
                                var num = needQty - qty;
@@ -206,7 +208,7 @@
        /// <param name="dic"></param>
        /// <param name="key"></param>
        /// <param name="v"></param>
        private void SaveDic(Dictionary<int, int> dic, int key, int v)
        private void SaveDic(Dictionary<int, decimal> dic, int key, decimal v)
        {
            if (dic.ContainsKey(key))
            {
@@ -220,6 +222,7 @@
        //--------------------------------------------------------------------------------------------------------------
        #region MyRegion
        ///// <summary>
        ///// 获得背包承重w,装货物o,从第k件向后考虑,得到的最大价值
@@ -262,5 +265,87 @@
        //    return a > b ? a : b;
        //}
        #endregion
        private List<StockDetailDto> GetDataListOrderByDept(List<DataStockDetail> palletList)
        {
            try
            {
                var Db = DataContext.Db;
                var data = new List<StockDetailDto>();
                var list = palletList.Select(m => new StockDetailDto()
                {
                    Id = m.Id,
                    LotNo = m.LotNo,
                    LotText = m.LotText,
                    SupplierLot = m.SupplierLot,
                    OwnerNo = m.OwnerNo,
                    OwnerName = m.OwnerName,
                    SupplierNo = m.SupplierNo,
                    SupplierName = m.SupplierName,
                    SkuNo = m.SkuNo,
                    SkuName = m.SkuName,
                    Standard = m.Standard,
                    Qty = m.Qty,
                    LockQty = m.LockQty,
                    FrozenQty = m.FrozenQty,
                    InspectQty = m.InspectQty,
                    ASNNo = m.ASNNo,
                    ASNDetailNo = m.ASNDetailNo,
                    WareHouseNo = m.WareHouseNo,
                    RoadwayNo = m.RoadwayNo,
                    AreaNo = m.AreaNo,
                    LocatNo = m.LocatNo,
                    PalletNo = m.PalletNo,
                    PalletNo2 = m.PalletNo2,
                    PalletNo3 = m.PalletNo3,
                    CompleteTime = m.CompleteTime,
                    ProductionTime = m.ProductionTime,
                    ExpirationTime = m.ExpirationTime,
                    Status = m.Status,
                    InspectMark = m.InspectMark,
                    BitPalletMark = m.BitPalletMark,
                    InspectStatus = m.InspectStatus,
                    InspectTime = m.InspectTime,
                    PackagNo = m.PackagNo,
                    IsBale = m.IsBale,
                    IsBelt = m.IsBelt,
                    Demo = m.Demo,
                }).ToList();
                //库外托盘
                var detail1 = list.Where(m => string.IsNullOrWhiteSpace(m.LocatNo)).ToList();
                //平库内托盘
                var detail2 = list.Where(m => m.WareHouseNo == "W02").ToList();
                //立库内托盘
                var detail3 = list.Where(m => m.WareHouseNo == "W01").ToList();
                foreach (var item in detail2)
                {
                    var dept = item.LocatNo.Substring(5,2);
                    item.Dept = int.Parse(dept);
                }
                foreach (var item in detail3)
                {
                    var dept = item.LocatNo.Substring(6, 2);
                    item.Dept = int.Parse(dept);
                }
                data.AddRange(detail1);
                data.AddRange(detail2.OrderBy(m => m.Dept).ToList());
                data.AddRange(detail3.OrderBy(m => m.Dept).ToList());
                return data;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
    }
}