From fc25dda9baf3b5f4df23d35914f3dd343cf492e3 Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期一, 28 七月 2025 17:30:21 +0800
Subject: [PATCH] 优化WCSHelper / 序列号生成逻辑 , 添加强制任务处理模块

---
 wms/WCSHelper.cs |  246 +++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 216 insertions(+), 30 deletions(-)

diff --git a/wms/WCSHelper.cs b/wms/WCSHelper.cs
index 06549ea..0e73985 100644
--- a/wms/WCSHelper.cs
+++ b/wms/WCSHelper.cs
@@ -11,20 +11,68 @@
 using System.Threading.Tasks;
 
 namespace HH.WCS.Mobox3.DSZSH.wms {
-    internal class WCSHelper {
-        internal static string GenerateTaskNo() {
-            var id = SYSHelper.GetSerialNumber("浠诲姟鍙�, "TN");
-            var date = DateTime.Now.ToString("yyMMdd");
-            return $"TN{date}{id.ToString().PadLeft(4, '0')}";
+    /// <summary>
+    /// [ 閫氱敤涓氬姟 ] 甯姪绫�+    /// </summary>
+    public class WCSHelper {
+        #region LocationHelper
+        private static Dictionary<string, TN_Location> _locationDict = null;
+
+        static WCSHelper() {
+            var db = new SqlHelper<object>().GetInstance();
+
+            try {
+                //鍒濆鍖朙ocation鍔犲叆鍒板瓧鍏哥紦瀛�+                _locationDict = new Dictionary<string, TN_Location>();
+                var locList = db.Queryable<TN_Location>().ToList();
+                foreach (var loc in locList) {
+                    if (!_locationDict.ContainsKey(loc.S_CODE)) {
+                        _locationDict.Add(loc.S_CODE, loc);
+                    }
+                }
+            }
+            catch (Exception ex) {
+                LogHelper.InfoEx(ex, "WCSHelper:鍒濆鍖朙ocation鍒板瓧鍏哥紦瀛�);
+            }
         }
-        internal static bool UpdateStatus(TN_Task task, string status) {
+
+        public static TN_Location GetLocation(string locCode, bool useDict = true) {
+            if (useDict && _locationDict.Keys.Contains(locCode)) {
+                return _locationDict[locCode.Trim()];
+            }
+
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<TN_Location>().Where(l => l.S_CODE == locCode).First();
+        }
+
+        public static string GetAgvSite(string locCode, bool useDict = true) {
+            if (useDict && _locationDict.Keys.Contains(locCode)) {
+                return _locationDict[locCode.Trim()].S_AGV_SITE;
+            }
+
+            var db = new SqlHelper<object>().GetInstance();
+            var loc = db.Queryable<TN_Location>().Where(l => l.S_CODE == locCode).First();
+            return loc == null ? "0" : loc.S_AGV_SITE;
+        }
+        #endregion
+
+        #region 浠诲姟鍒涘缓 / 涓嬪彂 / 鏌ヨ
+        internal static string GenerateTaskNo() {
+            //var id = SYSHelper.GetSerialNumberResetByDay("浠诲姟鍙�, "TN");
+            //var date = DateTime.Now.ToString("yyMMdd");
+            //return $"TN{date}{id.ToString().PadLeft(4, '0')}";
+            return SYSHelper.GenerateSN("浠诲姟鍙�, "TN", "yyMMdd");
+        }
+
+        internal static bool UpdateTaskState(TN_Task task, string state) {
             var res = false;
             var db = new SqlHelper<TN_Task>().GetInstance();
-            task.S_B_STATE = status;
+            task.S_B_STATE = state;
             res = db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand() > 0;
             return res;
         }
-        internal static bool UpdateStatus(TN_Task task) {
+
+        internal static bool UpdateTaskState(TN_Task task) {
             var res = false;
             var db = new SqlHelper<TN_Task>().GetInstance();
             task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
@@ -32,67 +80,195 @@
             res = db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_MODIFY }).ExecuteCommand() > 0;
             return res;
         }
-        internal static bool UpdateEQNo(TN_Task task) {
+
+        internal static bool UpdateEqTaskNo(TN_Task task) {
             var res = false;
             var db = new SqlHelper<TN_Task>().GetInstance();
             task.T_MODIFY = DateTime.Now;
-            db.Updateable(task).UpdateColumns(it => new { it.S_EQ_TASK_CODE, it.T_MODIFY }).ExecuteCommand();
+            res = db.Updateable(task).UpdateColumns(it => new { it.S_EQ_TASK_CODE, it.T_MODIFY }).ExecuteCommand() > 0;
             return res;
         }
 
-        internal static TN_Task GetTask(string no) {
+        internal static TN_Task GetTask(string taskNo) {
             var db = new SqlHelper<TN_Task>().GetInstance();
-            var task = db.Queryable<TN_Task>().Where(a => a.S_CODE == no).First();
+            var task = db.Queryable<TN_Task>().Where(a => a.S_CODE == taskNo).First();
             return task;
-        }
+        } 
+        #endregion
 
-        public static string GetAgvSite(string locCode) {
+        #region 瀹瑰櫒鐩稿叧淇℃伅 鏌ヨ / 缁戝畾
+        /// <summary>
+        /// 鏍规嵁 [ 瀹瑰櫒鍙�] , 鏌ヨ褰撳墠瀹瑰櫒鍏宠仈鐨�[ 璐т綅 ] [ 璐т綅瀹瑰櫒 ] [ 瀹瑰櫒璐у搧 ] 淇℃伅 ( 鍙煡璇�1 鏉�)
+        /// </summary>
+        /// <param name="cntrCode">瀹瑰櫒鍙�/param>
+        /// <param name="skipCgDetail">鏄惁璺宠繃 [ 瀹瑰櫒璐у搧 ] 鐨勬煡璇�( 褰撳鍣ㄥ彿鏉ヨ嚜 [ 瀹瑰櫒璐у搧 ] 鏃�)</param>
+        /// <returns></returns>
+        public static LocCntrCg GetLocCntrCg(string cntrCode, bool skipCgDetail = false) {
             var db = new SqlHelper<object>().GetInstance();
-            var loc = db.Queryable<TN_Location>().Where(l => l.S_CODE == locCode).First();
-            return loc == null ? "0" : loc.S_AGV_SITE;
+
+            TN_CG_Detail cgDetail = null;
+            if (!skipCgDetail) {
+                cgDetail = db.Queryable<TN_CG_Detail>().Where(d => d.S_CNTR_CODE == cntrCode).First();
+            }
+
+            var locCntrRel = db.Queryable<TN_Loc_Container>().Where(c => c.S_CNTR_CODE == cntrCode).First();
+
+            TN_Location location = null;
+            if (locCntrRel != null) {
+                location = db.Queryable<TN_Location>().Where(l => l.S_CODE == locCntrRel.S_LOC_CODE).First();
+                if (location == null) {
+                    LogHelper.Warn($"鑾峰彇瀹瑰櫒鍏宠仈淇℃伅:[璐т綅瀹瑰櫒鍏崇郴]瀛樺湪,浣哰璐т綅]涓嶅瓨鍦�瀹瑰櫒='{cntrCode}',璐т綅='{locCntrRel.S_LOC_CODE}'");
+                }
+            }
+            if (location != null) {
+                location.N_CURRENT_NUM = 0;
+                location.T_MODIFY = DateTime.Now;
+            }
+
+            return new LocCntrCg {
+                CgDetail = cgDetail,
+                LocCntrRel = locCntrRel,
+                Location = location
+            };
         }
 
         /// <summary>
-        /// 璧风偣鍑哄簱閿侊紙寮哄埗璧嬪�锛屼笉浼氭鏌oc!=null锛岄攣鐘舵�=鏃狅紝闇�浼犲弬鍓嶇‘璁わ級
+        /// 缁戝畾 [ 璐т綅瀹瑰櫒 ] 淇℃伅 ( 璁剧疆 [ 璐т綅鏁伴噺 ] = 1 )
+        /// </summary>
+        /// <remarks><b>[ 娉ㄦ剰 ]</b> 涓嶄細妫�煡 loc 鈮�null</remarks>
+        /// <param name="loc"></param>
+        /// <param name="cntrCode"></param>
+        /// <returns></returns>
+        public static TN_Loc_Container BindLocCntr(TN_Location loc, string cntrCode) {
+            var locCntrRel = new TN_Loc_Container {
+                S_LOC_CODE = loc.S_CODE,
+                S_CNTR_CODE = cntrCode,
+            };
+
+            if (loc.N_CURRENT_NUM != 0) {
+                LogHelper.Warn($"缁戝畾璐т綅瀹瑰櫒:绋嬪簭姝e湪灏濊瘯缁橻瀹瑰櫒鏁伴噺]涓嶆槸0鐨勮揣浣�璁剧疆[瀹瑰櫒鏁伴噺]涓�!!璐т綅='{loc.S_CODE}',瀹瑰櫒鏁伴噺={loc.N_CURRENT_NUM}");
+            }
+
+            loc.N_CURRENT_NUM = 1;
+            loc.T_MODIFY = DateTime.Now;
+
+            return locCntrRel;
+        }
+
+        /// <summary>
+        /// 缁戝畾 [ 璐т綅瀹瑰櫒 ] 淇℃伅 ( 璁剧疆 [ 璐т綅鏁伴噺 ] + list.Count )
         /// </summary>
         /// <param name="loc"></param>
+        /// <param name="cntrCodes"></param>
+        /// <returns></returns>
+        public static TN_Loc_Container BindLocCntrs(TN_Location loc, List<string> cntrCodes) {
+            var locCntrRel = new TN_Loc_Container {
+                S_LOC_CODE = loc.S_CODE,
+                S_CNTR_CODE = string.Join(",", cntrCodes)
+            };
+
+            if (loc.N_CURRENT_NUM != 0) {
+                LogHelper.Warn($"缁戝畾璐т綅瀹瑰櫒:绋嬪簭姝e湪灏濊瘯缁橻瀹瑰櫒鏁伴噺]涓嶆槸0鐨勮揣浣�璁剧疆[瀹瑰櫒鏁伴噺]涓�!!璐т綅='{loc.S_CODE}',瀹瑰櫒鏁伴噺={loc.N_CURRENT_NUM}");
+            }
+
+            loc.N_CURRENT_NUM = 1;
+            loc.T_MODIFY = DateTime.Now;
+
+            return locCntrRel;
+        } 
+        #endregion
+
+        #region 璧风偣 / 缁堢偣璐т綅閿�+ 鍒涘缓浠诲姟
+        /// <summary>
+        /// 璧风偣鍑哄簱閿�+        /// </summary>
+        /// <remarks><b>[ 瑕佹眰 ]</b> loc 鈮�null ; 閿佺姸鎬�'鏃� ;</remarks>
+        /// <param name="loc"></param>
         /// <param name="lockSource"></param>
-        public static void LockStartLoc(ref TN_Location loc, string lockSource = "") {
+        public static void LockStartLoc(TN_Location loc, string lockSource = "") {
+            if (loc.N_LOCK_STATE != 0 || loc.S_LOCK_STATE != "鏃�) {
+                LogHelper.Warn($"璧风偣鍑哄簱閿�绋嬪簭姝e湪灏濊瘯缁欏綋鍓峓閿佺姸鎬乚鈮�鏃�鐨勮揣浣嶄笂閿�璐т綅='{loc.S_CODE}',閿佺姸鎬�({loc.N_LOCK_STATE},{loc.S_LOCK_STATE})");
+            }
+
             loc.N_LOCK_STATE = 2; // 璧风偣鍑哄簱閿�             loc.S_LOCK_STATE = TN_Location.GetLockStateStr(2); // 璧风偣鍑哄簱閿�             loc.S_LOCK_OP = lockSource;
             loc.T_MODIFY = System.DateTime.Now;
+
+            LogHelper.Info($"璧风偣鍑哄簱閿�璧风偣璐т綅'{loc.S_CODE}'璁剧疆[鍑哄簱閿乚");
         }
 
         /// <summary>
-        /// 缁堢偣鍏ュ簱閿侊紙寮哄埗璧嬪�锛屼笉浼氭鏌oc!=null锛岄攣鐘舵�=鏃狅紝闇�浼犲弬鍓嶇‘璁わ級
+        /// 缁堢偣鍏ュ簱閿�         /// </summary>
+        /// <remarks><b>[ 瑕佹眰 ]</b> loc 鈮�null ; 閿佺姸鎬�'鏃� ;</remarks>
         /// <param name="loc"></param>
         /// <param name="lockSource"></param>
-        public static void LockEndLoc(ref TN_Location loc, string lockSource = "") {
-            loc.N_LOCK_STATE = 1; // 缁堢偣鍑哄簱閿�-            loc.S_LOCK_STATE = TN_Location.GetLockStateStr(1); // 缁堢偣鍑哄簱閿�+        public static void LockEndLoc(TN_Location loc, string lockSource = "") {
+            if (loc.N_LOCK_STATE != 0 || loc.S_LOCK_STATE != "鏃�) {
+                LogHelper.Warn($"缁堢偣鍏ュ簱閿�绋嬪簭姝e湪灏濊瘯缁欏綋鍓峓閿佺姸鎬乚鈮�鏃�鐨勮揣浣嶄笂閿�璐т綅='{loc.S_CODE}',閿佺姸鎬�({loc.N_LOCK_STATE},{loc.S_LOCK_STATE})");
+            }
+
+            loc.N_LOCK_STATE = 1; // 缁堢偣鍏ュ簱閿�+            loc.S_LOCK_STATE = TN_Location.GetLockStateStr(1); // 缁堢偣鍏ュ簱閿�             loc.S_LOCK_OP = lockSource;
             loc.T_MODIFY = System.DateTime.Now;
+
+            LogHelper.Info($"缁堢偣鍏ュ簱閿�缁堢偣璐т綅='{loc.S_CODE}',鏉ユ簮='{lockSource}'");
         }
 
-        public static TN_Task BuildTask(TN_Location startLoc, TN_Location endLoc, string cntId, string type, int pri = 3, int agvType = 1) {
-            TN_Task TN_Task = new TN_Task() {
+        /// <summary>
+        /// 鍒涘缓浠诲姟
+        /// </summary>
+        /// <remarks><b>[ 瑕佹眰 ]</b> startLoc / endLoc 鈮�null ; startLoc / endLoc 瀛樺湪 S_CODE , S_AREA_CODE 瀛楁</remarks>
+        /// <param name="startLoc">璧风偣璐т綅 : 鑷冲皯鎻愪緵:S_CODE , S_AREA_CODE</param>
+        /// <param name="endLoc">缁堢偣璐т綅 : 鑷冲皯鎻愪緵:S_CODE , S_AREA_CODE</param>
+        /// <param name="cntId">瀹瑰櫒鍙�/param>
+        /// <param name="type">浠诲姟绫诲瀷 ( 鍚嶇О )</param>
+        /// <param name="pri">浼樺厛绾�/param>
+        /// <param name="agv">AGV 绫诲瀷</param>
+        /// <returns></returns>
+        public static TN_Task BuildTask(TN_Location startLoc, TN_Location endLoc, string cntId, string type, int pri = 3, int agv = 1) {
+            TN_Task task = new TN_Task() {
                 S_CODE = GenerateTaskNo(),
                 S_START_AREA = startLoc.S_AREA_CODE,
                 S_END_AREA = endLoc.S_AREA_CODE,
                 S_START_LOC = startLoc.S_CODE,
                 S_END_LOC = endLoc.S_CODE,
+                S_CNTR_CODE = cntId,
                 S_TYPE = type,
                 N_PRIORITY = pri,
-                N_SCHEDULE_TYPE = agvType,
-                N_B_STATE = 0, // 浠诲姟鍒涘缓鏃讹紝榛樿绛夊緟
-                S_CNTR_CODE = cntId,
+                N_SCHEDULE_TYPE = agv,
+                N_B_STATE = 0, // 浠诲姟鍒涘缓鏃�榛樿绛夊緟
             };
 
-            return TN_Task;
+            LogHelper.Info($"鍒涘缓浠诲姟:浠诲姟鍙�'{task.S_CODE}',璧风偣璐т綅='',缁堢偣璐т綅='',瀹瑰櫒鍙�'',浠诲姟绫诲瀷");
+
+            return task;
         }
 
+        /// <summary>
+        /// 鍒涘缓浠诲姟 + 璐т綅閿�+        /// </summary>
+        /// <remarks><b>[ 瑕佹眰 ]</b> (1) startLoc / endLoc 鈮�null ; (2) startLoc / endLoc 瀛樺湪 S_CODE , S_AREA_CODE 瀛楁</remarks>
+        /// <param name="startLoc">璧风偣璐т綅 : 鑷冲皯鎻愪緵 : S_CODE , S_AREA_CODE</param>
+        /// <param name="endLoc">缁堢偣璐т綅 : 鑷冲皯鎻愪緵 : S_CODE , S_AREA_CODE</param>
+        /// <param name="cntId">瀹瑰櫒鍙�/param>
+        /// <param name="type">浠诲姟绫诲瀷 ( 鍚嶇О )</param>
+        /// <param name="pri">浼樺厛绾�/param>
+        /// <param name="agv">AGV 绫诲瀷</param>
+        /// <returns></returns>
+        public static TN_Task BuildTaskWithLocLock(TN_Location startLoc, TN_Location endLoc, string cntId, string type, 
+            int pri = 3, int agv = 1) {
+            var task = BuildTask(startLoc, endLoc, cntId, type, pri);
+            LockStartLoc(startLoc, task.S_CODE);
+            LockEndLoc(endLoc, task.S_CODE);
+
+            return task;
+        }
+        #endregion
+
+        #region 浠诲姟鍒嗗彂 / 鎵ц / 璁板綍
         internal static bool CheckActionRecordExist(string no, int code) {
             var db = new SqlHelper<TN_Task_Action>().GetInstance();
             return db.Queryable<TN_Task_Action>().Count(a => a.S_TASK_CODE == no && a.N_ACTION_CODE == code) > 0;
@@ -122,7 +298,7 @@
         internal static void Fail(TN_Task task) {
             var db = new SqlHelper<TN_Task>().GetInstance();
             if (task != null) {
-                //鍒ゆ柇鏈夋病鏈夊彇璐у畬鎴愶紝娌℃湁灏卞彉鎴愬け璐ャ�鏈夊彇璐у畬鎴愰粯璁ゅ畬鎴愪簡锛堣窡鎹」鐩�瀹氾紝鏈変簺椤圭洰浜哄伐鎷夎蛋浜嗕篃娌℃湁鏀惧埌缁堢偣锛夈�
+                //鍒ゆ柇鏈夋病鏈夊彇璐у畬鎴�娌℃湁灏卞彉鎴愬け璐ャ�鏈夊彇璐у畬鎴愰粯璁ゅ畬鎴愪簡 (璺熸嵁椤圭洰鑰屽畾,鏈変簺椤圭洰浜哄伐鎷夎蛋浜嗕篃娌℃湁鏀惧埌缁堢偣) 銆�                 task.N_B_STATE = 4;
                 task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
                 db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
@@ -144,6 +320,16 @@
         internal static List<TN_Task> GetWaitingTaskList() {
             var db = new SqlHelper<object>().GetInstance();
             return db.Queryable<TN_Task>().Where(a => a.N_B_STATE == 0 && (a.S_B_STATE == "绛夊緟" || a.S_B_STATE == "寰呮帹閫�)).ToList();
-        }
+        } 
+        #endregion
+    }
+
+    /// <summary>
+    /// [璐т綅/瀹瑰櫒/鐗╂枡]淇℃伅
+    /// </summary>
+    public class LocCntrCg {
+        public TN_CG_Detail CgDetail { get; set; } = null;
+        public TN_Loc_Container LocCntrRel { get; set; } = null;
+        public TN_Location Location { get; set; } = null;
     }
 }

--
Gitblit v1.9.1