From e2303b1125817cb7887e36d5905c8f1661d685a3 Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期四, 29 五月 2025 17:29:52 +0800
Subject: [PATCH] 完善ERP出库下发任务及来源单号、记录表的字段更新

---
 core/Monitor.cs |  279 +++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 239 insertions(+), 40 deletions(-)

diff --git a/core/Monitor.cs b/core/Monitor.cs
index 728acbe..50fd5a9 100644
--- a/core/Monitor.cs
+++ b/core/Monitor.cs
@@ -4,37 +4,200 @@
 using System.Text;
 using System.Threading.Tasks;
 
+using HH.WCS.Mobox3.DSZSH.device;
 using HH.WCS.Mobox3.DSZSH.models;
 using HH.WCS.Mobox3.DSZSH.util;
 using HH.WCS.Mobox3.DSZSH.wms;
+using Microsoft.Win32;
+
 using Newtonsoft.Json;
 
 namespace HH.WCS.Mobox3.DSZSH.core {
     public class Monitor {
+        public class ItemData {
+            public string item_code { get; set; }
+            public string batch_no { get; set;}
+            public string cntr_code { get; set; }
+        }
+
         public static void CheckInbound() {
-            var taskName = TaskName.鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱;
+            var taskName = TaskName.T鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱;
             var db = new SqlHelper<object>().GetInstance();
             var info = "";
             try {
                 // 鏌ヤ骇绾挎槸鍚︽湁鐗╂枡淇℃伅
+                foreach (var prod in Settings.ProductionLines) {
+                    if (int.Parse(prod.Id) > 1) break; // TEST
 
-                var itemCode = "";
-                var batchNo = "";
-                var cntrCode = "";
-                var startLocCode = "";
+                    //var prodDevice = new ProductionLineDevice(prod); // TODO 寰呴渶姹傜‘瀹氬悗鍐嶅鐞�+                    //TcpClientHelper.Link("127.0.0.1", 8550); // 鐢ㄤ簬娴嬭瘯
+                    TcpClientHelper.Link(prod.PlcIp, prod.PlcPort);
 
-                var cgDetail = new TN_CG_Detail {
-                    S_ITEM_CODE = itemCode,
-                    S_BATCH_NO = batchNo,
-                    S_CNTR_CODE = cntrCode,
-                };
+                    // TCPClient浼犻�淇℃伅鐨勬椂鍊欙紝涓嶈鐢ㄦ柇鐐归樆濉炵▼搴�+                    // {"item_code":"CG1001","batch_no":"BN1001","cntr_code":"CN2505111"}
+                    if (!TcpClientHelper.TryReadProductionLine(out byte[] read)) {
+                        info = $"娴嬭瘯{prod.Id}鍙蜂骇绾縶prod.PlcIp}:{prod.PlcPort}锛氳鍙栦骇绾夸俊鎭け璐�;
+                        LogHelper.Info(info);
+                        continue;
+                    }
 
-                var startLoc = db.Queryable<TN_Location>()
-                    .Where(l => l.S_CODE == startLocCode) // 鎸囧畾锛氳捣鐐硅揣浣嶅彿
-                    .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
-                    .First();
+                    // 3. 灏嗗瘎瀛樺櫒鍊艰浆鎹负瀛楄妭鏁扮粍
+                    //byte[] bytes = TcpClientHelper.ConvertRegistersToBytes(registers);
 
-                
+                    // 4. 灏嗗瓧鑺傛暟缁勮浆鎹负瀛楃涓�+                    string result = TcpClientHelper.ConvertBytesToString(read);
+
+                    //var itemData = BitConverter.ToString(read);
+                    LogHelper.Info($"璇诲彇鐨勪骇绾夸俊鎭瘂result}");
+                    var data = JsonConvert.DeserializeObject<ItemData>(result);
+
+                    LogHelper.Info(JsonConvert.SerializeObject(data));
+
+                    var itemCode = data.item_code;
+                    var batchNo = data.batch_no;
+                    var cntrCode = data.cntr_code;
+
+                    var startLocCode = prod.OffLoc[0]; // 鐢ㄤ簬娴嬭瘯
+                    //var startLocCode = "CX01"; // 鐢ㄤ簬娴嬭瘯
+
+                    var cgDetail = new TN_CG_Detail {
+                        S_ITEM_CODE = itemCode,
+                        S_BATCH_NO = batchNo,
+                        S_CNTR_CODE = cntrCode,
+                    };
+
+                    // BEG 姣忔杞閮芥鏌ュ搴斿鍣ㄦ槸鍚﹀凡鐧昏锛岀櫥璁板垯鏇存柊锛屾湭鐧昏鍒欐彃鍏�+                    var cntrItemRel = db.Queryable<TN_Container_ItemType>()
+                        .Where(i => i.S_CNTR_CODE == cntrCode).First();
+
+                    var insertTable = cntrItemRel == null;
+
+                    if (insertTable) {
+                        // 鏆傚畾鍦ㄦ弧鎵樹笅绾垮叆搴撶殑鏃跺�锛岀櫥璁版墭鐩樺鍣�鐗╂枡鍙峰叧绯伙紙鍚庨潰鍙兘浼氭敼鎴愮郴缁熺淮鎶わ級
+                        cntrItemRel = new TN_Container_ItemType {
+                            S_ITEM_CODE = itemCode,
+                            S_CNTR_CODE = cntrCode,
+                        };
+                    }
+                    // END
+
+                    var startLoc = db.Queryable<TN_Location>()
+                        .Where(l => l.S_CODE == startLocCode) // 鎸囧畾锛氳捣鐐硅揣浣嶅彿
+                        .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                        .Where(l => l.N_CURRENT_NUM == 0)
+                        .First();
+
+                    if (startLoc == null) {
+                        info = $"璧风偣浣嶇疆 '{startLocCode}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�;
+                        LogHelper.Info(info);
+                        continue;
+                        //return;
+                    }
+
+                    // 缁戝畾璐т綅鍜屽鍣ㄥ彿
+                    var locCntrRel = new TN_Loc_Container {
+                        S_LOC_CODE = startLocCode,
+                        S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+                        S_CNTR_TYPE = "鎵樼洏",
+                    };
+
+                    //if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
+                    //    info = $"鎻掑叆璐т綅瀹瑰櫒鍏崇郴澶辫触锛� + JsonConvert.SerializeObject(locCntrRel);
+                    //    LogHelper.Info(info);
+                    //    continue;
+                    //    //return;
+                    //}
+
+                    var endLoc = db.Queryable<TN_Location>()
+                        .Where(a => Settings.AreaMap[AreaName.K绌烘墭瀛樻斁鍖篯.Contains(a.S_AREA_CODE))
+                        .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                        .Where(a => a.N_CURRENT_NUM == 0) // 绛涢�锛氱┖璐т綅
+                        .OrderBy(l => l.N_LAYER)
+                        .First();
+
+                    if (endLoc == null) {
+                        info = "绌烘墭鍏ュ簱鏆傛椂娌℃湁鍚堥�鐨勮揣浣嶅彲浠ュ叆搴�;
+                        LogHelper.Info(info);
+                        continue;
+                    }
+
+                    var cntId = locCntrRel.S_CNTR_CODE;
+                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                    LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                    LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿�+
+                    using (var tran = db.Ado.UseTran()) {
+                        if (db.Insertable<TN_CG_Detail>(cgDetail).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鎻掑叆瀹瑰櫒璐у搧淇℃伅琛ㄥけ璐ワ細鐗╂枡缂栫爜{cgDetail.S_ITEM_CODE}锛屽鍣ㄧ紪鐮亄cgDetail.S_CNTR_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        // BEG 鎻掑叆鎴栨洿鏂板鍣ㄤ笌鐗╂枡绫诲瀷鐨勭粦瀹氳〃
+                        if (insertTable) {
+                            if (db.Insertable<TN_Container_ItemType>(cntrItemRel).ExecuteCommand() <= 0) {
+                                tran.RollbackTran();
+                                info = $"鐧昏瀹瑰櫒鐗╂枡绫诲瀷缁戝畾琛ㄥけ璐ワ細鐗╂枡缂栫爜{cntrItemRel.S_ITEM_CODE}锛屽鍣ㄧ紪鐮亄cntrItemRel.S_CNTR_CODE}";
+                                LogHelper.Info(info);
+                                continue;
+                            }
+                        }
+                        else {
+                            if (db.Updateable<TN_Container_ItemType>(cntrItemRel).ExecuteCommand() <= 0) {
+                                tran.RollbackTran();
+                                info = $"鐧昏瀹瑰櫒鐗╂枡绫诲瀷缁戝畾琛ㄥけ璐ワ細鐗╂枡缂栫爜{cntrItemRel.S_ITEM_CODE}锛屽鍣ㄧ紪鐮亄cntrItemRel.S_CNTR_CODE}";
+                                LogHelper.Info(info);
+                                continue;
+                            }
+                        }
+                        // END
+
+                        if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鎻掑叆璐т綅瀹瑰櫒鍏崇郴琛ㄥけ璐ワ細璐т綅缂栫爜{locCntrRel.S_LOC_CODE}锛屽鍣ㄧ紪鐮亄locCntrRel.S_CNTR_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                            it.N_LOCK_STATE,
+                            it.S_LOCK_STATE,
+                            it.S_LOCK_OP,
+                            it.T_MODIFY
+                        }).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂拌捣鐐硅揣浣峽startLoc.S_CODE}閿佺姸鎬佸け璐�;
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                            it.N_LOCK_STATE,
+                            it.S_LOCK_STATE,
+                            it.S_LOCK_OP,
+                            it.T_MODIFY
+                        }).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂扮粓鐐硅揣浣峽endLoc.S_CODE}閿佺姸鎬佸け璐�;
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        tran.CommitTran();
+                        info = $"鐢熸垚浠诲姟'{taskName}'鎴愬姛锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        continue;
+                    }
+                }
 
             }
             catch (Exception ex) {
@@ -44,7 +207,7 @@
         }
 
         public static void CheckOutboundOrder() {
-            var taskName = TaskName.鎴愬搧鑳跺嚭搴�
+            var taskName = TaskName.C鎴愬搧鑳跺嚭搴�
             var db = new SqlHelper<object>().GetInstance();
             var info = $"杞--{taskName}--";
 
@@ -76,7 +239,7 @@
                     }
 
                     var lastDetail = db.Queryable<TN_Outbound_Detail>()
-                        .Where(d => d.S_OO_NO == order.S_NO && d.N_B_STATE == 2) // TODO 鎴栬�鏀规垚鏌ask
+                        .Where(d => d.S_OO_NO == order.S_NO && d.N_B_STATE == 2) // [NOTE] 鎴栬�鏀规垚鏌ask
                         .First();
 
                     if (lastDetail != null) {
@@ -107,6 +270,8 @@
                     var startLoc = db.Queryable<TN_Location>()
                         .LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
                         .Where((l, c) => c.S_CNTR_CODE == detail.S_CNTR_CODE)
+                        .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                        .Where(l => l.N_CURRENT_NUM == 1)
                         .First();
 
                     if (startLoc == null) {
@@ -123,7 +288,7 @@
                         LogHelper.Info($"杞--{taskName}锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅锛佸崟鍙�{detail.S_OO_NO}'瑕佹眰缁堢偣搴撳尯涓�{detail.S_END_AREA}'");
                         continue;
                     }
-
+                    
                     detail.N_B_STATE = 2;
 
                     var cntId = detail.S_CNTR_CODE;
@@ -177,6 +342,38 @@
                         continue;
                     }
                 }
+
+
+                //// BEG 鏌ユ壘6涓湀浠ュ墠鐨勪换鍔¤〃鍜屼换鍔″姩浣滆〃
+                //var oldTaskList = db.Queryable<TN_Task>()
+                //    .Where(t => t.T_MODIFY < DateTime.Now.AddMonths(-6))
+                //    .Where(t => t.N_B_STATE == 3 && t.S_B_STATE == "瀹屾垚")
+                //    .ToList();
+
+                //var oldTaskActionList = db.Queryable<TN_Task, TN_Task_Action>((t, a) => t.S_CODE == a.S_TASK_CODE)
+                //    .Where(t => t.T_MODIFY < DateTime.Now.AddMonths(-6))
+                //    .Where(t => t.N_B_STATE == 3 && t.S_B_STATE == "瀹屾垚")
+                //    .Select((t, a) => a)
+                //    .ToList();
+                //// END
+
+                //using (var tran = db.Ado.UseTran()) {
+                //    // 鍦ㄥ嚭搴撹疆璇腑澶勭悊锛屾煡鎵句换鍔″崟鏄惁鏈夊崐骞村墠涓斿凡缁忓畬鎴愮殑浠诲姟锛屽鏋滄湁鍒欏垹闄�+                //    // 杩欎釜鎿嶄綔涓嶅奖鍝嶆甯告祦绋嬶紝濡傛灉澶辫触涔熶笉闇�鍥炴粴
+                //    //if (db.Deleteable<TN_Task>()
+                //    //    .Where(t => t.T_MODIFY < DateTime.Now.AddMonths(-6))
+                //    //    .Where(t => t.N_B_STATE == 3 && t.S_B_STATE == "瀹屾垚")
+                //    //    .ExecuteCommand() <= 0) {
+                //    //    info = $"杞{taskName}鍗曟椂灏濊瘯鍒犻櫎鍗婂勾鍓嶇殑浠诲姟澶辫触";
+                //    //    LogHelper.Info(info);
+                //    //}
+                //    if (db.Deleteable<TN_Task>(oldTaskList).ExecuteCommand() <= 0
+                //        && db.Deleteable<TN_Task_Action>(oldTaskActionList).ExecuteCommand() <= 0) {
+                //        info = $"杞{taskName}鍗曟椂灏濊瘯鍒犻櫎鍗婂勾鍓嶇殑浠诲姟澶辫触";
+                //        LogHelper.Info(info);
+                //    }
+                //}
+
             }
             catch (Exception ex) {
                 info += $"鍙戠敓浜嗗紓甯革細{ex.Message}";
@@ -185,12 +382,12 @@
         }
 
         public static void CheckCheckOrder() {
-            var taskName = TaskName.鎶芥_鍑哄簱;
+            var taskName = TaskName.C鎶芥_鍑哄簱;
             var db = new SqlHelper<object>().GetInstance();
             var info = "";
 
             try {
-                var orderList = db.Queryable<TN_Check_Order>()
+                var orderList = db.Queryable<TN_Spot_Check>()
                     .Where(c => c.N_B_STATE == 1)
                     .OrderBy(c => c.T_CREATE, SqlSugar.OrderByType.Asc)
                     .ToList();
@@ -200,22 +397,22 @@
                     return;
                 }
 
-                var detailList = new List<TN_Check_Detail>();
+                var detailList = new List<TN_SpotCheck_Detail>();
                 foreach (var order in orderList) {
-                    var doingCount = db.Queryable<TN_Check_Detail>()
-                        .Count(d => d.S_NO == order.S_NO && d.N_B_STATE >= 2); // 鎵ц涓�-                    var allCount = db.Queryable<TN_Check_Detail>()
-                        .Count(d => d.S_NO == order.S_NO);
+                    var doingCount = db.Queryable<TN_SpotCheck_Detail>()
+                        .Count(d => d.S_OO_NO == order.S_NO && d.N_B_STATE >= 2); // 鎵ц涓�+                    var allCount = db.Queryable<TN_SpotCheck_Detail>()
+                        .Count(d => d.S_OO_NO == order.S_NO);
                     LogHelper.Info($"杞--{taskName}--缁熻{taskName}鍗�{order.S_NO}'浠诲姟宸蹭笅鍙戯細{doingCount}/{allCount}");
 
                     if (doingCount == allCount) {
                         order.N_B_STATE = 2; // 鎵�湁浠诲姟閮藉凡鎵ц
-                        db.Updateable<TN_Check_Order>(order).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
+                        db.Updateable<TN_Spot_Check>(order).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
                         continue;
                     }
 
-                    var checkDetailList = db.Queryable<TN_Check_Detail>()
-                        .Where(a => a.S_NO == order.S_NO && a.N_B_STATE == 1) // 宸蹭笅鍙�+                    var checkDetailList = db.Queryable<TN_SpotCheck_Detail>()
+                        .Where(a => a.S_OO_NO == order.S_NO && a.N_B_STATE == 1) // 宸蹭笅鍙�                         .ToList();
 
                     if (checkDetailList.Count == 0) {
@@ -258,7 +455,7 @@
                     LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                     using (var tran = db.Ado.UseTran()) {
-                        if (db.Updateable<TN_Check_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
+                        if (db.Updateable<TN_SpotCheck_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
                             LogHelper.Info($"杞--{taskName}锛氫慨鏀箋taskName}鍗曟槑缁嗚〃鐘舵�涓哄畬鎴�-澶辫触锛�);
                             continue;
@@ -308,11 +505,11 @@
         }
 
         public static void CheckShiftOrder() {
-            var taskName = TaskName.绉诲簱;
+            var taskName = TaskName.Y绉诲簱;
             var db = new SqlHelper<object>().GetInstance();
             var info = "";
             try {
-                var orderList = db.Queryable<TN_Shift_Order>()
+                var orderList = db.Queryable<TN_Relocation_List>()
                     .Where(c => c.N_B_STATE == 1)
                     .OrderBy(c => c.T_CREATE, SqlSugar.OrderByType.Asc)
                     .ToList();
@@ -322,22 +519,22 @@
                     return;
                 }
 
-                var detailList = new List<TN_Shift_Detail>();
+                var detailList = new List<TN_RelocationList_Detail>();
                 foreach (var order in orderList) {
-                    var doingCount = db.Queryable<TN_Shift_Detail>()
-                        .Count(d => d.S_NO == order.S_NO && d.N_B_STATE >= 2); // 鎵ц涓�-                    var allCount = db.Queryable<TN_Shift_Detail>()
-                        .Count(d => d.S_NO == order.S_NO);
+                    var doingCount = db.Queryable<TN_RelocationList_Detail>()
+                        .Count(d => d.S_OO_NO == order.S_NO && d.N_B_STATE >= 2); // 鎵ц涓�+                    var allCount = db.Queryable<TN_RelocationList_Detail>()
+                        .Count(d => d.S_OO_NO == order.S_NO);
                     LogHelper.Info($"杞--{taskName}--缁熻{taskName}鍗�{order.S_NO}'浠诲姟宸蹭笅鍙戯細{doingCount}/{allCount}");
 
                     if (doingCount == allCount) {
                         order.N_B_STATE = 2; // 鎵�湁浠诲姟閮藉凡鎵ц
-                        db.Updateable<TN_Shift_Order>(order).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
+                        db.Updateable<TN_Relocation_List>(order).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
                         continue;
                     }
 
-                    var checkDetailList = db.Queryable<TN_Shift_Detail>()
-                        .Where(a => a.S_NO == order.S_NO && a.N_B_STATE == 1) // 宸蹭笅鍙�+                    var checkDetailList = db.Queryable<TN_RelocationList_Detail>()
+                        .Where(a => a.S_OO_NO == order.S_NO && a.N_B_STATE == 1) // 宸蹭笅鍙�                         .ToList();
 
                     if (checkDetailList.Count == 0) {
@@ -354,6 +551,8 @@
                     var startLoc = db.Queryable<TN_Location>()
                         .LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
                         .Where((l, c) => c.S_CNTR_CODE == detail.S_CNTR_CODE)
+                        .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                        .Where(l => l.N_CURRENT_NUM == 1)
                         .First();
 
                     if (startLoc == null) {
@@ -380,7 +579,7 @@
                     LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                     using (var tran = db.Ado.UseTran()) {
-                        if (db.Updateable<TN_Shift_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
+                        if (db.Updateable<TN_RelocationList_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
                             LogHelper.Info($"杞--{taskName}锛氫慨鏀箋taskName}鍗曟槑缁嗚〃鐘舵�涓哄畬鎴�-澶辫触锛�);
                             continue;

--
Gitblit v1.9.1