From f9a9a948cd138ad0877c54319857c327c0c0c402 Mon Sep 17 00:00:00 2001
From: chengsc <11752@DESKTOP-DS49RCP>
Date: 星期五, 28 二月 2025 16:50:50 +0800
Subject: [PATCH] 修改问题

---
 Wms/WMS.BLL/Logic/AllotLocation.cs |  209 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 208 insertions(+), 1 deletions(-)

diff --git a/Wms/WMS.BLL/Logic/AllotLocation.cs b/Wms/WMS.BLL/Logic/AllotLocation.cs
index 9462f76..e21b168 100644
--- a/Wms/WMS.BLL/Logic/AllotLocation.cs
+++ b/Wms/WMS.BLL/Logic/AllotLocation.cs
@@ -1,5 +1,6 @@
 锘縰sing System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using Model.ModelDto.SysDto;
 using SqlSugar;
@@ -7,6 +8,7 @@
 using WMS.Entity.BllAsnEntity;
 using WMS.Entity.Context;
 using WMS.Entity.DataEntity;
+using WMS.Entity.LogEntity;
 using WMS.Entity.SysEntity;
 
 namespace WMS.BLL.Logic
@@ -16,6 +18,178 @@
     /// </summary>
     public class AllotLocation
     {
+
+
+        /// <summary>
+        /// 鑾峰彇瀵嗛泦搴撳悎閫傜殑宸烽亾锛堥�傜敤椤圭洰锛欽C34锛�
+        /// </summary>
+        /// <param name="roadways">宸烽亾闆嗗悎</param>
+        /// <param name="areaList">鍖哄煙闆嗗悎</param>
+        /// <param name="lotNo">鎵规鍙�</param>
+        /// <returns></returns>
+        public string GetMiJiSuiTableRoad(string house, List<string> roadways, List<string> areaList, string sku, string lotNo = "")
+        {
+
+            var db = DataContext.Db;
+
+            var dataStock = db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.WareHouseNo == house && m.SkuNo == sku);
+            if (!string.IsNullOrWhiteSpace(lotNo))
+            {
+                dataStock = dataStock.Where(m => m.LotNo == lotNo);
+            }
+            //搴撳瓨鏌ユ壘鐩稿悓鐗╂枡/鎵规鐨勫贩閬�
+            var yiYouRoad = dataStock.GroupBy(m => m.RoadwayNo).Select(m => m.RoadwayNo).OrderBy(m => m).ToList();
+            foreach (var l in yiYouRoad)
+            {
+                // 鍒ゆ柇褰撳墠宸烽亾(缁�)鏄惁鏈夌┖浣欏偍浣�
+                 
+                var locateCount = db.Queryable<SysStorageLocat>().Count(m => m.Status == "0" && m.Flag == "0" && areaList.Contains(m.AreaNo) && m.RoadwayNo == l);
+                
+                var bindNum = db.Queryable<LogTask>().Where(m => m.IsDel == "0" && (m.Status == "0" || m.Status == "1") && m.EndRoadway == l)
+                            .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count();
+                if (locateCount - bindNum > 0)
+                {
+                    return l;
+                }
+                
+            }
+            //鑾峰彇搴撳瓨鍐呭凡鏈夌墿鏂欑殑宸烽亾
+            var dataStockRoad = db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.WareHouseNo == house).GroupBy(m => m.RoadwayNo).OrderBy(m => m.RoadwayNo).Select(m => m.RoadwayNo).ToList();
+            //鎺掗櫎鎺夊凡鏈夌墿鏂欑殑宸烽亾
+            
+            roadways = roadways.Where(m => !dataStockRoad.Contains(m)).ToList();
+            foreach (var l in roadways)
+            {
+                var bl = true;
+                //鍒ゆ柇褰撳墠宸烽亾(缁�)鏄惁鏈変换鍔�
+                var taskList = db.Queryable<LogTask>().Where(m => m.IsDel == "0" && m.EndRoadway == l && (m.Status == "0" || m.Status == "1")).ToList();
+                if (taskList.Count > 0) 
+                {
+                    //鍒ゆ柇鐗╂枡鎵规鏄惁鍜屽綋鍓嶄竴鑷�
+                    foreach (var item in taskList)
+                    {
+                        var palletBind = db.Queryable<BllPalletUpShelf>().First(m => m.IsDel == "0" && m.TaskNo == item.TaskNo);
+                        if (palletBind != null)
+                        {
+                            if (palletBind.SkuNo !=sku || palletBind.LotNo != lotNo)
+                            {
+                                bl = false;
+                                continue;
+                            }
+                            
+                        }
+                    }
+                    if (bl)
+                    {
+                        // 鍒ゆ柇褰撳墠宸烽亾(缁�)鏄惁鏈夌┖浣欏偍浣�
+
+                        var locateCount = db.Queryable<SysStorageLocat>().Count(m => m.Status == "0" && m.Flag == "0" && areaList.Contains(m.AreaNo) && m.RoadwayNo == l);
+
+                        var bindNum = db.Queryable<LogTask>().Where(m => m.IsDel == "0" && (m.Status == "0" || m.Status == "1") && m.EndRoadway == l)
+                                    .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count();
+                        if (locateCount - bindNum > 0)
+                        {
+                            return l;
+                        }
+                    }
+                }
+            }
+            return "";
+
+        }
+
+        /// <summary>
+        /// 鑾峰彇瀵嗛泦搴撳悎閫傜殑鍌ㄤ綅锛堥�傜敤椤圭洰锛欽C34锛�
+        /// </summary>
+        /// <param name="roadways">宸烽亾闆嗗悎</param>
+        /// <param name="areaList">鍖哄煙闆嗗悎</param>
+        /// <param name="lotNo">鎵规鍙�</param>
+        /// <returns></returns>
+        public SysStorageLocat GetMiJiSuiTableLocate(SysStorageRoadway roadway, List<string> areaList, string sku, string lotNo = "")
+        {
+
+            var db = DataContext.Db;
+            
+            // 鍒ゆ柇褰撳墠宸烽亾(缁�)鏄惁鏈夌┖浣欏偍浣�
+            var locateList = db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.RoadwayNo == roadway.RoadwayNo && areaList.Contains(m.AreaNo)).ToList();
+            if (locateList.Count(m => m.Status == "0") > 0)
+            {
+                var bl = GetLocateASCOrDesc(roadway.RoadwayNo);
+
+                var locate = locateList.OrderBy(m => m.LocatNo).First();
+
+                if (bl)
+                {
+                    locate = locateList.OrderByDescending(m => m.LocatNo).First();
+                }
+                var bl2 = MiJiLocateIsOk(locate, bl); //楠岃瘉鍌ㄤ綅鏄惁鍙叆搴撴柟娉�
+                if (bl2)
+                {
+                    return locate;
+                }
+            }
+
+            
+            return null;
+
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍌ㄤ綅鐨勬帓鍒楅『搴�
+        /// </summary>
+        /// <param name="roadStr"></param>
+        /// <returns>true锛歞esc鍊掑簭 false锛歛sc姝e簭</returns>
+        public bool GetLocateASCOrDesc(string roadStr)
+        {
+            var db = DataContext.Db;
+
+            var locate = db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.RoadwayNo == roadStr);
+            var a = locate.LocatNo.Substring(2,2);//鍌ㄤ綅鍒�
+            var b = locate.AisleOne.Substring(2, 2);//閫氶亾鍙e垪
+            return int.Parse(a) < int.Parse(b);  
+        }
+
+        /// <summary>
+        /// 楠岃瘉鍌ㄤ綅鏄惁鍙叆搴�
+        /// </summary>
+        /// <param name="locate"></param>
+        /// <returns></returns>
+        private bool MiJiLocateIsOk(SysStorageLocat locate,bool bl)
+        {
+             
+            var db = DataContext.Db;
+            var a = int.Parse(locate.LocatNo.Substring(2, 2));//鍌ㄤ綅鍒�
+            var b = int.Parse(locate.AisleOne.Substring(2, 2));//閫氶亾鍙e垪
+            var str1 = new List<string>() { "0", "3", "5" };
+            var str2 = new List<string>() { "1", "2", "4" };
+            var locatList1 = db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.RoadwayNo == locate.RoadwayNo && m.Column < a).ToList();
+            var locatList2 = db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.RoadwayNo == locate.RoadwayNo && m.Column > a).ToList();
+            if (bl)
+            {
+                if (locatList1.Count(m => str1.Contains(m.Status)) > 0)
+                {
+                    return false;
+                }
+                if (locatList2.Count(m => str2.Contains(m.Status)) > 0)
+                {
+                    return false;
+                }
+            }
+            else
+            {
+                if (locatList1.Count(m => str2.Contains(m.Status)) > 0)
+                {
+                    return false;
+                }
+                if (locatList2.Count(m => str1.Contains(m.Status)) > 0)
+                {
+                    return false;
+                } 
+            }
+            return true;
+                
+        }
+
         /// <summary>
         /// 鑾峰彇鍚堥�傜殑搴撲綅
         /// </summary>
@@ -44,7 +218,7 @@
                 var dic = db.Queryable<SysDictionary>().First(m => m.Id.ToString() == house.Type);
                 switch (dic.DictName)
                 {
-                    //鏄惁鎸囧畾宸烽亾
+                    //鎸囧畾宸烽亾
                     case "绔嬩綋搴�" when !string.IsNullOrWhiteSpace(roadwayNo):
                         {
                             var roadwayList = new List<SysStorageRoadway>();
@@ -81,6 +255,34 @@
                             if (locate == null)
                             {
                                 throw new Exception($"{houseNo}浠撳簱宸插惎鐢ㄧ殑宸烽亾涓病鏈夊悎閫傜殑绌哄偍浣�");
+                            }
+                            return locate;
+                        }
+                    //鎸囧畾宸烽亾
+                    case "瀵嗛泦搴�" when !string.IsNullOrWhiteSpace(roadwayNo):
+                        {
+                            var roadwayList = new List<SysStorageRoadway>();
+                            var roadway = db.Queryable<SysStorageRoadway>().First(m => m.RoadwayNo == roadwayNo);
+                            if (roadway == null)
+                            {
+                                throw new Exception($"鏈煡璇㈠埌{roadwayNo}宸烽亾淇℃伅");
+                            }
+
+                            if (!roadList.Contains(roadwayNo))
+                            {
+                                throw new Exception("褰撳墠鐗╂枡瀛樻斁鍖哄煙鏈湪鎸囧畾宸烽亾涓�");
+                            }
+                            if (roadway.Status == "1")
+                            {
+                                throw new Exception($"{roadwayNo}宸烽亾宸插仠鐢�");
+                            }
+
+                            //鏌ヨ璇ュ贩閬撳苟涓旀爣蹇椾负姝e父鐨勭殑鍌ㄤ綅
+                            roadwayList.Add(roadway);
+                            var locate = GetLocateByRoadways(roadwayList, areaList, true);
+                            if (locate == null)
+                            {
+                                throw new Exception($"{roadwayNo}宸烽亾娌℃湁鍚堥�傜殑绌哄偍浣�");
                             }
                             return locate;
                         }
@@ -340,6 +542,11 @@
 
         }
 
+        /// <summary>
+        /// 楠岃瘉鍌ㄤ綅鏄惁鍙叆搴�
+        /// </summary>
+        /// <param name="locate"></param>
+        /// <returns></returns>
         private bool LocateIsOk(SysStorageLocat locate)
         {
             try

--
Gitblit v1.8.0