From 16d2162a833cebeae72c363962917bb9da8145ef Mon Sep 17 00:00:00 2001
From: 杨前锦 <1010338399@qq.com>
Date: 星期五, 06 六月 2025 17:34:47 +0800
Subject: [PATCH] 福建佳通优化

---
 HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WMSHelper.cs |  245 ++++++++++++++++++++++++++++++++----------------
 1 files changed, 164 insertions(+), 81 deletions(-)

diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WMSHelper.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WMSHelper.cs
index cefdf93..b6d7694 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WMSHelper.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WMSHelper.cs
@@ -1,4 +1,5 @@
 锘縰sing HH.WCS.Mobox3.YNJT_BZP.api;
+using HH.WCS.Mobox3.YNJT_BZP.dispatch;
 using HH.WCS.Mobox3.YNJT_BZP.models;
 using HH.WCS.Mobox3.YNJT_BZP.models.other;
 using HH.WCS.Mobox3.YNJT_BZP.util;
@@ -6,6 +7,7 @@
 using NLog.Fluent;
 using SqlSugar;
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using System.Reflection;
@@ -419,25 +421,37 @@
             return result;
         }
 
-       /// <summary>
-       /// 鑾峰彇绌烘墭寮�璐т綅
-       /// </summary>
-       /// <param name="trayType"></param>
-       /// <returns></returns>
-        public static Location GetEmptyTrayStartLoc(int trayType)
+        /// <summary>
+        /// 鑾峰彇绌烘墭寮�璐т綅
+        /// </summary>
+        /// <param name="trayType"></param>
+        /// <param name="exclude">鏄惁鎺掗櫎姣嶆嫋缂撳瓨浣�0.涓嶆帓闄�1.鎺掗櫎</param>
+        /// <returns></returns>
+        public static Location GetEmptyTrayStartLoc(int trayType ,int exclude = 1)
         {
             Location result = null;
             try
             {
                 // 1銆佹煡璇㈠綋鍓嶅簱鍖�鎺�鐗╂枡 鏈夋墭鐩樼殑璐т綅
                 var db = new SqlHelper<object>().GetInstance();
-                result = db.Queryable<Location>()
+                var query = db.Queryable<Location>()
                      .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE)
                      .LeftJoin<Container>((a, b, c) => b.S_CNTR_CODE == c.S_CODE)
-                     .LeftJoin<CntrItemRel>((a,b,c,d) => c.S_CODE == d.S_CNTR_CODE)
-                     .Where((a, b, c, d) => a.S_AREA_CODE == Settings.storeAreaCode && (trayType == 0 && a.N_CURRENT_NUM == 1 || trayType > 0 && a.N_CURRENT_NUM > 0) && a.N_LOCK_STATE == 0 && (a.C_ENABLE != "绂佺敤" && a.C_ENABLE != "N") && c.N_TYPE == trayType && d.S_ITEM_CODE == null)
-                     .OrderByDescending((a, b, c, d) => a.N_LAYER)
-                     .First();
+                     .LeftJoin<CntrItemRel>((a, b, c, d) => c.S_CODE == d.S_CNTR_CODE)
+                     .Where((a, b, c, d) => a.S_AREA_CODE == Settings.storeAreaCode && (trayType == 0 && a.N_CURRENT_NUM == 1 || trayType > 0 && a.N_CURRENT_NUM > 0) && a.N_LOCK_STATE == 0 && (a.C_ENABLE != "绂佺敤" && a.C_ENABLE != "N") && c.N_TYPE == trayType && d.S_ITEM_CODE == null);
+
+                if (exclude == 1)
+                {
+                    List<string> bufferInLocs = Settings.baseTrayBufferLocList.Select(a => a.bufferInLoc).ToList();
+                    query = query.Where((a, b, c, d) =>  !bufferInLocs.Contains(a.S_CODE));
+                }
+                else
+                {
+                    List<string> bufferInLocs = Settings.baseTrayBufferLocList.Select(a => a.bufferInLoc).ToList();
+                    query = query.OrderByDescending((a, b, c, d) => bufferInLocs.Contains(a.S_CODE));
+                }
+
+                result = query.OrderByDescending((a, b, c, d) => a.N_LAYER).First();
             }
             catch (Exception ex)
             {
@@ -488,8 +502,9 @@
         /// </summary>
         /// <param name="itemCode"></param>
         /// <param name="jbLoc"></param>
+        /// <param name="trayCode"></param>
         /// <returns></returns>
-        public static Location GetoutStockStartLoc(string itemCode ,string jbLoc = null)
+        public static Location GetoutStockStartLoc(string itemCode ,string trayCode = null ,string jbLoc = null)
         {
             LogHelper.Info("銆愯幏鍙栧嚭搴撳紑濮嬭揣浣嶃�", "WMS");
             var db = new SqlHelper<object>().GetInstance();
@@ -510,6 +525,11 @@
                                     && c.S_EFFECTIVE_TIME != null
                                     && c.S_EXPIRATION_TIME != null
                                     );
+
+                if (trayCode != null) 
+                {
+                    query = query.Where((a, b, c) => c.S_CNTR_CODE == trayCode);
+                }
 
                 if (jbLoc != null) 
                 {
@@ -534,12 +554,15 @@
 
         /// <summary>
         /// 鑾峰彇鍏ュ簱缁堢偣璐т綅
+        /// 鍏ュ簱绛栫暐
+        /// 1.宸烽亾鍧囪 
+        /// 2.鐗╂枡鍧囪 
         /// </summary>
         /// <param name="locCode"></param>
         /// <param name="trayType"></param>
         /// <param name="inWay">鍏ュ簱鏂瑰紡 1.鑷姩鍏ュ簱 2.浜哄伐鍏ュ簱</param>
         /// <returns></returns>
-        public static Location GetInstockEndLoc(int trayType , string locCode = null , int inWay = 1)
+        public static Location GetInstockEndLoc(int trayType , string locCode = null , int inWay = 1 ,string itemCode = null)
         {
             LogHelper.Info("銆愯幏鍙栧叆搴撶粓鐐硅揣浣嶃�寮�鑾峰彇鍏ュ簱缁堢偣璐т綅", "WMS");
             var db = new SqlHelper<object>().GetInstance();
@@ -604,7 +627,6 @@
                     LogHelper.Info($"銆愯幏鍙栧叆搴撶粓鐐硅揣浣嶃�婊¤冻鏉′欢鐨勭┖璐т綅鏁伴噺锛歿locList.Count}", "WMS");
                 }
 
-
                 LogHelper.Info($"銆愯幏鍙栧叆搴撶粓鐐硅揣浣嶃�寮�鏌ヨ宸烽亾鐨勫绉巼", "WMS");
                 var roadwayVolumeList = db.Queryable<Location>()
                     .Where(a =>  a.N_CURRENT_NUM == 0 && a.S_AREA_CODE == Settings.storeAreaCode && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && roadwayList.Contains(a.N_ROADWAY) && layerList.Contains(a.N_LAYER))
@@ -612,21 +634,39 @@
                     .Select(a => new { roadway = a.N_ROADWAY , num = SqlFunc.AggregateDistinctCount(a.S_CODE)})
                     .OrderBy(a => a.num)
                     .ToList();
-                LogHelper.Info($"銆愯幏鍙栧叆搴撶粓鐐硅揣浣嶃�鏌ヨ宸烽亾鐨勫绉巼锛屽苟鎸変粠澶у埌灏忔帓搴忥細{JsonConvert.SerializeObject(roadwayVolumeList)}", "WMS");
+                LogHelper.Info($"銆愯幏鍙栧叆搴撶粓鐐硅揣浣嶃�鏌ヨ宸烽亾鐨勫绉巼锛屽苟鎸変粠灏忓埌澶ф帓搴忥細{JsonConvert.SerializeObject(roadwayVolumeList)}", "WMS");
 
+                Dictionary<int,int> roadwayDic = new Dictionary<int,int>();
+                foreach (var item in roadwayVolumeList)
+                {
+                    roadwayDic.Add(item.roadway, item.num);
+                }
+
+                LogHelper.Info($"銆愯幏鍙栧叆搴撶粓鐐硅揣浣嶃�寮�鏌ヨ宸烽亾鐨勫悓鐗╂枡鏁伴噺", "WMS");
+                var roadwayItemNumList = db.Queryable<Location>()
+                    .LeftJoin<LocCntrRel>((a,b) => a.S_CODE == b.S_LOC_CODE)
+                    .LeftJoin<CntrItemRel>((a,b,c) => b.S_CNTR_CODE == c.S_CNTR_CODE )
+                    .Where((a, b, c) => a.S_AREA_CODE == Settings.storeAreaCode && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && roadwayList.Contains(a.N_ROADWAY) && layerList.Contains(a.N_LAYER))
+                    .GroupBy((a, b, c) => a.N_ROADWAY)
+                    .Select((a, b, c) => new { roadway = a.N_ROADWAY, volumNum = SqlFunc.AggregateDistinctCount(c.S_ITEM_CODE == itemCode) })
+                    .ToList();
+                LogHelper.Info($"銆愯幏鍙栧叆搴撶粓鐐硅揣浣嶃�鏌ヨ宸烽亾鐨勫悓鐗╂枡鏁伴噺锛屽苟鎸変粠灏忓埌鍒版帓搴忥細{JsonConvert.SerializeObject(roadwayItemNumList)}", "WMS");
+
+                roadwayItemNumList = roadwayItemNumList.OrderBy(a => a.volumNum).ThenBy(a => roadwayDic[a.roadway]).ToList();
 
                 if (inWay == 1)
                 {
                     LogHelper.Info($"銆愯幏鍙栧叆搴撶粓鐐硅揣浣嶃�寮�寰幆鏌ヨ宸烽亾瀵瑰簲鎺ラ┏浣嶇殑鐘舵�", "WMS");
-                    foreach (var roadwayVolume in roadwayVolumeList)
+                    foreach (var roadwayVolume in roadwayItemNumList)
                     {
-                        int roadway = 0;
-                        if (roadwayVolume != null)
-                        {
-                            roadway = roadwayVolume.roadway;
-                        }
+                        int roadway = roadwayVolume.roadway;
+                        LogHelper.Info($"銆愯幏鍙栧叆搴撶粓鐐硅揣浣嶃�鏌ヨ宸烽亾鍐呭爢鍨涙満鐨勮澶囩姸鎬�, "WMS");
 
-                        var agvJbLocList = Settings.getAgvJBLocList(inWay, roadway, 1);
+                        List<string> deviceNos = new List<string>() { roadway.ToString()};
+                        LogHelper.Info($"璋冪敤WCS鐨勮澶囩姸鎬佹煡璇㈡帴鍙o紝鍙傛暟锛歿deviceNos}", "WMS");
+                        var deviceStatuses = WCSDispatch.getDeviceStatus(deviceNos);
+
+                        var agvJbLocList = Settings.getAgvJBLocList( roadway, 1);
                         if (agvJbLocList.Count > 0)
                         {
                             foreach (var agvLocCode in agvJbLocList)
@@ -691,6 +731,12 @@
             return db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.errorBufferArea && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
         }
 
+        /// <summary>
+        /// 鑾峰彇搴撳尯鎺掔殑璐т綅鍒楄〃
+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="row"></param>
+        /// <returns></returns>
         public static List<Location> GetLocationList(string area , int row) { 
             List<Location> result = new List<Location> ();
             try {
@@ -702,8 +748,6 @@
             }
             return result;
         }
-
-       
 
         public static bool updateShiftOrderDetail(TN_YiKuDetail detail) {
             bool result = false;
@@ -727,6 +771,42 @@
         }
 
         /// <summary>
+        ///鑾峰彇绌烘墭缂撳瓨淇″彿鍒楄〃
+        /// </summary>
+        /// <returns></returns>
+        public static List<EmptyTrayBuffer> getEmptyTrayBufferList()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<EmptyTrayBuffer>().Where(a => a.IS_CREATED == "N").ToList();
+        }
+
+        /// <summary>
+        /// 娣诲姞绌烘墭缂撳瓨淇″彿
+        /// </summary>
+        /// <param name="emptyTrayBuffer"></param>
+        /// <returns></returns>
+        public static bool addEmptyTrayBuffer(EmptyTrayBuffer emptyTrayBuffer) 
+        {
+            bool result = true;
+            var db = new SqlHelper<object>().GetInstance();
+            result = db.Insertable<EmptyTrayBuffer>(emptyTrayBuffer).ExecuteCommand() > 0;
+            return result;
+        }
+
+        /// <summary>
+        /// 鏇存柊绌烘墭缂撳瓨淇″彿
+        /// </summary>
+        /// <param name="emptyTrayBuffer"></param>
+        /// <returns></returns>
+        public static bool updateEmptyTrayBuffer(EmptyTrayBuffer emptyTrayBuffer)
+        {
+            bool result = true;
+            var db = new SqlHelper<object>().GetInstance();
+            result = db.Updateable<EmptyTrayBuffer>(emptyTrayBuffer).ExecuteCommand() > 0;
+            return result;
+        }
+
+        /// <summary>
         /// 鎵归噺娣诲姞鐗╂枡鏉$爜淇℃伅
         /// </summary>
         /// <returns></returns>
@@ -737,12 +817,16 @@
             try
             {
                 db.BeginTran();
-                itemBarcodeInfos.ForEach(a => {
-                    var bo = db.Insertable<ItemBarcodeInfo>(a).ExecuteCommand() > 0;
-                    if (!bo)
+                itemBarcodeInfos.ForEach(item => {
+                    var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == item.S_BC_ENTRIED).First();
+                    if (itemBarcodeInfo == null) 
                     {
-                        result = false;
-                        LogHelper.Info($"娣诲姞鐗╂枡鏉$爜淇℃伅澶辫触锛岀墿鏂欐潯鐮佷俊鎭細{JsonConvert.SerializeObject(a)}", "GT");
+                        var bo = db.Insertable<ItemBarcodeInfo>(item).ExecuteCommand() > 0;
+                        if (!bo)
+                        {
+                            result = false;
+                            LogHelper.Info($"娣诲姞鐗╂枡鏉$爜淇℃伅澶辫触锛岀墿鏂欐潯鐮佷俊鎭細{JsonConvert.SerializeObject(item)}", "GT");
+                        }
                     }
                 });
                 if (result)
@@ -774,26 +858,34 @@
             {
                 db.BeginTran();
                 updateMatlStatuses.ForEach(update => {
-                    var bo = db.Updateable<CntrItemRel>().SetColumns(a => new CntrItemRel() { S_ITEM_STATE = update.jdge }).Where(a => a.S_CG_ID == update.bc_entried).ExecuteCommand() > 0;
-                    if (!bo)
+                    var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == update.bc_entried).First();
+                    if (itemBarcodeInfo != null) 
                     {
-                        result = false;
-                        LogHelper.Info($"鎵归噺鏇存柊鐗╂枡鐘舵�澶辫触锛岀墿鏂欐潯鐮佷俊鎭細{JsonConvert.SerializeObject(update)}", "GT");
+                        itemBarcodeInfo.S_JDGE = update.jdge;
+                        db.Updateable(itemBarcodeInfo).ExecuteCommand();
+                        var cntrItemRel = db.Queryable<CntrItemRel>().Where(a => a.S_CG_ID == update.bc_entried).First();
+                        if (cntrItemRel != null) 
+                        {
+                            // 灏哅ES鐨勭墿鏂欑姸鎬佽浆鍖栨垚WMS鍙瘑鍒殑鐗╂枡鐘舵�
+                            if (update.jdge == "" || update.jdge == null)
+                            {
+                                update.jdge = "OK";
+                            }
+                            else if (update.jdge != "OK")
+                            {
+                                update.jdge = "HOLD";
+                            }
+                            db.Updateable<CntrItemRel>().SetColumns(a => new CntrItemRel() { S_ITEM_STATE = update.jdge }).Where(a => a.S_CG_ID == update.bc_entried).ExecuteCommand();
+                        }
                     }
                 });
-                if (result)
-                {
-                    db.CommitTran();
-                }
-                else
-                {
-                    db.RollbackTran();
-                }
+                db.CommitTran();
             }
             catch (Exception ex)
             {
                 LogHelper.Info($"鎵归噺鏇存柊鐗╂枡鐘舵�閿欒锛岄敊璇俊鎭細{ex.Message}", "GT");
                 db.RollbackTran();
+                result = false;
             }
             return result;
         }
@@ -811,48 +903,28 @@
                 db.BeginTran();
                 foreach (Overage overage in overages) 
                 {
-                    bool bo = false;
-                    var overage1 = db.Queryable<Overage>().Where(a => a.MCNGRP == overage.MCNGRP && a.ITEMPATT == overage.ITEMPATT).First();
+                    var overage1 = db.Queryable<Overage>().Where(a => a.RECID == overage.RECID).First();
                     if (overage1 != null)
                     {
+                        overage1.MCNGRP = overage.MCNGRP;
+                        overage1.ITEMPATT = overage.ITEMPATT;
                         overage1.OVERAGE = overage.OVERAGE;
                         overage1.MINHOUR = overage.MINHOUR;
                         overage1.FLAG_STS = overage.FLAG_STS;
-                        bo = db.Updateable(overage1).ExecuteCommand() > 0;
+                        db.Updateable(overage1).ExecuteCommand();
                     }
                     else 
                     {
-                        overage1 = new Overage()
-                        {
-                            MCNGRP = overage.MCNGRP,
-                            ITEMPATT = overage.ITEMPATT,
-                            OVERAGE = overage.OVERAGE,
-                            MINHOUR = overage.MINHOUR,
-                            FLAG_STS = overage.FLAG_STS
-                        };
-                        bo = db.Insertable(overage1).ExecuteCommand() > 0;
-                    }
-                    if (!bo)
-                    {
-                        result = false;
-                        LogHelper.Info($"鎵归噺鏇存柊鐗╂枡瀛樻斁鏃堕棿閰嶇疆淇℃伅澶辫触锛岄厤缃俊鎭細{JsonConvert.SerializeObject(overage)}", "GT");
-                        break;
+                        db.Insertable(overage).ExecuteCommand();
                     }
                 }
-               
-                if (result)
-                {
-                    db.CommitTran();
-                }
-                else
-                {
-                    db.RollbackTran();
-                }
+                db.CommitTran();
             }
             catch (Exception ex)
             {
                 LogHelper.Info($"鎵归噺鏇存柊鐗╂枡瀛樻斁鏃堕棿閰嶇疆淇℃伅閿欒锛岄敊璇俊鎭細{ex.Message}", "GT");
                 db.RollbackTran();
+                result = false;
             }
             return result;
         }
@@ -863,21 +935,21 @@
         /// <returns></returns>
         public static Overage getOverage(string bc_entried)
         {
-            Overage overage = null;
+           
             var db = new SqlHelper<object>().GetInstance();
-            overage = db.Queryable<Overage>().Where(a => a.ITEMPATT == bc_entried && a.MCNGRP == "1").First();
 
-            if (overage == null)
-            {
-                string sub = bc_entried.Substring(0, 3);
-                overage = db.Queryable<Overage>().Where(a => a.ITEMPATT.Contains(sub) && a.MCNGRP == "1").First();
-            }
+            // 鐩存帴鎵ц SQL锛堝弬鏁板寲鏌ヨ锛�+            var sql = "SELECT get_ovg_bar(@barcode, @mcngrp) AS overage_value";
+            var sql1 = "SELECT get_minhour_bar(@barcode, @mcngrp) AS overage_value";
 
-            if (overage == null)
+            // 浣跨敤鍖垮悕瀵硅薄浼犻�鍙傛暟
+            var ovg_bar = db.Ado.SqlQuery<int>(sql, new { barcode = bc_entried, mcngrp = "1"}).First();
+            var minhour_bar = db.Ado.SqlQuery<float>(sql1, new { barcode = bc_entried, mcngrp = "1"}).First();
+            Overage overage = new Overage()
             {
-                string sub = bc_entried.Substring(0, 7);
-                overage = db.Queryable<Overage>().Where(a => a.ITEMPATT.Contains(sub) && a.MCNGRP == "1").First();
-            }
+                MINHOUR = minhour_bar,
+                OVERAGE = ovg_bar
+            };
             return overage;
         }
 
@@ -893,7 +965,18 @@
             try
             {
                 db.BeginTran();
-                result = db.Insertable(record).ExecuteCommand()> 0;
+                var synDataTimeRecord = db.Queryable<SynDataTimeRecord>().Where(a => a.S_SYN_TIME == record.S_SYN_TIME && a.RECORD_TABLE == record.RECORD_TABLE).First();
+                if (synDataTimeRecord == null)
+                {
+                    result = db.Insertable(record).ExecuteCommand() > 0;
+                }
+                else 
+                {
+                    synDataTimeRecord.N_SYN_NUM = record.N_SYN_NUM;
+                    synDataTimeRecord.S_SYN_TIME = record.S_SYN_TIME;
+                    result = db.Updateable(synDataTimeRecord).ExecuteCommand() > 0;
+                }
+                
                 if (result)
                 {
                     db.CommitTran();
@@ -905,7 +988,7 @@
             }
             catch (Exception ex)
             {
-                LogHelper.Info($"娣诲姞鍚屾鏁版嵁鏃堕棿璁板綍閿欒锛岄敊璇俊鎭細{ex.Message}", "GT");
+                LogHelper.Info($"娣诲姞鏁版嵁鍚屾鏃堕棿璁板綍閿欒锛岄敊璇俊鎭細{ex.Message}", "GT");
                 db.RollbackTran();
             }
             return result;

--
Gitblit v1.9.1