From 9a7c4fea85f85824dddeac9e6ce6ebb75ccee679 Mon Sep 17 00:00:00 2001
From: chengsc <11752@DESKTOP-DS49RCP>
Date: 星期二, 29 四月 2025 15:26:15 +0800
Subject: [PATCH] 修改问题晚上充电逻辑

---
 Admin.NET/WCS.Application/PLC/PLCService.cs |  301 ++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 217 insertions(+), 84 deletions(-)

diff --git a/Admin.NET/WCS.Application/PLC/PLCService.cs b/Admin.NET/WCS.Application/PLC/PLCService.cs
index 670f1e5..e8a2fe2 100644
--- a/Admin.NET/WCS.Application/PLC/PLCService.cs
+++ b/Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -6,6 +6,7 @@
 using Furion.Logging;
 using IoTClient;
 using NewLife.Reflection;
+using SixLabors.ImageSharp.ColorSpaces;
 using WCS.Application.Entity;
 using WCS.Application.Util;
 
@@ -159,8 +160,8 @@
                     var (resultTaskStatus, valueTaskStatus) = plcConn.GetDBValue(modPosTaskStatus.PosType, modPosTaskStatus.PlcPos);
                     //鍒ゆ柇璇诲彇浠诲姟鐘舵�佹槸鍚︽垚鍔� 骞朵笖浠诲姟鐘舵�佹槸1 0:鏃犱换鍔�,1:浠诲姟瀹屾垚,2:浠诲姟鍙栨秷,3:浠诲姟鏆傚仠锛�4锛氫换鍔″紓甯� 5锛氫换鍔℃墽琛屼腑
 
-                    WcsCarTasks carTask2 = null;//null 鏂颁换鍔�  not null 璺緞2浠诲姟
-                    
+                    WcsCarTasks carTaskNext = null;//null 鏂颁换鍔�  not null 褰撳墠灏忚溅&&褰撳墠浠诲姟 涓嬩竴鑺備换鍔�
+
                     if (resultTaskStatus.IsSucceed && valueTaskStatus == 1)
                     {
                         var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "浠诲姟鍙�");
@@ -169,104 +170,220 @@
                         int valueTaskStr = Convert.ToInt32(valueTask);
                         //鑾峰彇浠诲姟淇℃伅 鏍规嵁  浠诲姟鍙枫�佸皬杞︾紪鍙�
                         var carTask = _db.Queryable<WcsCarTasks>().First(m=>m.IsDelete == false && m.Status == TaskStatusEnum.Doing && m.CarTaskNo == valueTaskStr && m.CarNo == modDevice.PlcIdIP);
-                        if (carTask == null)
+                        if (carTask != null)
                         {
-                            var modRests = modDevice.listStation.FirstOrDefault(s => s.Text == "澶嶄綅");
-                            plcConn.SetDBValue(modRests.PosType, modRests.PlcPos, "1");//娌℃湁鎵惧埌浠诲姟  澶嶄綅
-                            return;
-                        }
-                         
-                        var modFinshTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.TaskNo == carTask.TaskNo);
-                        if (modFinshTask == null)
-                        {
-                            break;//娌℃湁鏌ヨ鍒版�讳换鍔�
-                        }
-                        //鑾峰彇璺緞2鐨勪换鍔� 涓嬪彂
-                        carTask2 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == carTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.PreId.Contains(carTask.Id.ToString())).OrderBy(m=>m.CreateTime).First();
-                        
-                        if (carTask != null && carTask.Status != TaskStatusEnum.Complete)
-                        {
-                            carTask.Status = TaskStatusEnum.Complete;
-                            carTask.UpdateTime = DateTime.Now;
-                            _db.Updateable(carTask).ExecuteCommand();
-                            //娣诲姞浠诲姟鏄庣粏
-                            var taskMonitor = new WcsTaskMonitor()
+                            //var modRests = modDevice.listStation.FirstOrDefault(s => s.Text == "澶嶄綅");
+                            //plcConn.SetDBValue(modRests.PosType, modRests.PlcPos, "1");//娌℃湁鎵惧埌浠诲姟  澶嶄綅
+                            
+                            var modFinshTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.TaskNo == carTask.TaskNo);
+                            if (modFinshTask == null)
                             {
-                                TaskNo = carTask.TaskNo,
-                                PlcName = modDevice.Text,
-                                InteractiveMsg = $"绌挎杞﹀弽棣堜换鍔″畬鎴�"
-                            };
-                            _db.Insertable(taskMonitor).ExecuteCommand();
-                            //涓嬪彂浠诲姟鏃ュ織
+                                break;//娌℃湁鏌ヨ鍒版�讳换鍔�
+                            } 
+                            if (carTask != null && carTask.Status != TaskStatusEnum.Complete)
+                            {
+                                carTask.Status = TaskStatusEnum.Complete;
+                                carTask.UpdateTime = DateTime.Now;
+                                _db.Updateable(carTask).ExecuteCommand();
+                                //娣诲姞浠诲姟鏄庣粏
+                                var taskMonitor = new WcsTaskMonitor()
+                                {
+                                    TaskNo = carTask.TaskNo,
+                                    PlcName = modDevice.Text,
+                                    InteractiveMsg = $"绌挎杞﹀弽棣堜换鍔″畬鎴�"
+                                };
+                                _db.Insertable(taskMonitor).ExecuteCommand();
+                                //涓嬪彂浠诲姟鏃ュ織
                             
-                            HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>());
+                                HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>());
+                            }
+                            //鑾峰彇璺緞2鐨勪换鍔� 涓嬪彂
+                            carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == carTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status <= TaskStatusEnum.Doing).OrderBy(m => m.CreateTime).First();
+                            //鎬讳换鍔′笅娌℃湁鍏朵粬鏈墽琛屽皬杞︾殑浠诲姟 鍙樻洿鎬讳换鍔′俊鎭�
+                            if (carTaskNext == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete)
+                            {
+                                modFinshTask.Status = TaskStatusEnum.Complete;
+                                modFinshTask.FinishDate = DateTime.Now;
+                                _db.Updateable(modFinshTask).ExecuteCommand();
+                            
+                                //鍒ゆ柇浠诲姟鏄惁鍏呯數浠诲姟,涓嬪彂寮�濮嬪厖鐢靛懡浠�
+                                if (modFinshTask.Levels == 888)
+                                {
+                                    //鍐欏叆寮�濮嬪厖鐢�
+                                    var modCd = modDevice.listStation.FirstOrDefault(s => s.Text == "鍏呯數鍛戒护");
+                                    plcConn.SetDBValue(modCd.PosType, modCd.PlcPos.ToString(), "2");
+                                }
+
+                                //鍙嶉WMS绯荤粺 浠诲姟瀹屾垚
+                                //HttpService httpService = new HttpService();
+                                //var requestMode = new TaskRequestWMS()
+                                //{
+                                //    TaskNo = modFinshTask.TaskNo,
+                                //    PalletNo = modFinshTask.PalletNo,
+                                //    TaskType = ((int)modFinshTask.TaskType).ToString(),
+                                //    TaskStatus = ((int)TaskStatusEnum.Complete).ToString()
+                                //};
+                                //var modResponseTask = httpService.RequestTask(requestMode).Result;
+                                //modFinshTask.IsSuccess = TaskSuccessEnum.Success;
+                                //_db.Updateable(modFinshTask).ExecuteCommand();
+                                HubUtil.PublicTask(modFinshTask.Adapt<WcsTaskOutput>());
+                            
+                            }
                         }
-                        //娌℃湁璺緞2鐨勪换鍔� 鍙樻洿鎬讳换鍔′俊鎭�
-                        if (carTask2 == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete)
-                        {
-                            modFinshTask.Status = TaskStatusEnum.Complete;
-                            modFinshTask.FinishDate = DateTime.Now;
-                            _db.Updateable(modFinshTask).ExecuteCommand();
-                            
-                            //鍙嶉WMS绯荤粺 浠诲姟瀹屾垚
-                            //HttpService httpService = new HttpService();
-                            //var requestMode = new TaskRequestWMS()
-                            //{
-                            //    TaskNo = modFinshTask.TaskNo,
-                            //    PalletNo = modFinshTask.PalletNo,
-                            //    TaskType = ((int)modFinshTask.TaskType).ToString(),
-                            //    TaskStatus = ((int)TaskStatusEnum.Complete).ToString()
-                            //};
-                            //var modResponseTask = httpService.RequestTask(requestMode).Result;
-                            //modFinshTask.IsSuccess = TaskSuccessEnum.Success;
-                            //_db.Updateable(modFinshTask).ExecuteCommand();
-                            HubUtil.PublicTask(modFinshTask.Adapt<WcsTaskOutput>());
-                            
-                        }
-                        
                     }
                     
+                    WcsTask modTask;
+                    //瑕佷笅鍙戣矾寰�2浠诲姟
+                    if (carTaskNext != null)
+                    {
+                        modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.TaskNo == carTaskNext.TaskNo && s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.CarIp == modDevice.PlcIdIP);
+
+                        carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status == TaskStatusEnum.Wait).OrderBy(m => m.CreateTime).First();
+                    }
+                    else
+                    {
+                        // 鑾峰彇浠诲姟淇℃伅
+                        modTask = _db.Queryable<WcsTask>().Where(s => s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.CarIp == modDevice.PlcIdIP).OrderBy(m => m.Levels).OrderBy(m => m.CreateTime).First();
+                        if (modTask != null)
+                        {
+                            carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status == TaskStatusEnum.Wait).OrderBy(m => m.CreateTime).First();
+                        }
+                    }
+
+                    //璇诲彇灏忚溅浣嶇疆
                     var modStationX = modDevice.listStation.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(X)");
                     var (resultx, valuex) = plcConn.GetDBValue(modStationX.PosType, modStationX.PlcPos);
                     var modStationY = modDevice.listStation.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(Y)");
                     var (resulty, valuey) = plcConn.GetDBValue(modStationY.PosType, modStationY.PlcPos);
                     var modStationZ = modDevice.listStation.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(Z)");
                     var (resultz, valuez) = plcConn.GetDBValue(modStationZ.PosType, modStationZ.PlcPos);
-
-
-                    WcsTask modTask;
-                    //瑕佷笅鍙戣矾寰�2浠诲姟
-                    if (carTask2 != null)
+                    var carXYZ = valuex.ToString().PadLeft(2, '0') + valuey.ToString().PadLeft(2, '0') + valuez.ToString().PadLeft(2, '0');
+                    if (modTask == null)
                     {
-                        modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.TaskNo == carTask2.TaskNo && s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar);
-
-                        carTask2= _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP).OrderBy(m => m.CreateTime).First();
-                    }
-                    else
-                    {
-                        // 鑾峰彇浠诲姟淇℃伅
-                        modTask = _db.Queryable<WcsTask>().Where(s => s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar).OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime).First();
-                        if (modTask == null)
+                        //璇诲彇灏忚溅鐢甸噺
+                        var modPosCarDl = modDevice.listStation.FirstOrDefault(s => s.Text == "鐢垫睜鐢甸噺");
+                        var (resultDl, valueDl) = plcConn.GetDBValue(modPosCarDl.PosType, modPosCarDl.PlcPos);
+                        if (resultDl.IsSucceed && valueDl < (int)FourWayCarDLEnum.Dl)
                         {
-                            return;
+                            var endLocateCar = "";
+                            if (valuez == 1)
+                            {
+                                endLocateCar = "210401";
+                            }
+                            else if (valuez == 2)
+                            {
+                                endLocateCar = "210402"; //011202
+                            }
+                            else
+                            {
+                                return; // 灞傛暟閿欒
+                            }
+                            var getCdTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Levels == 888 && m.EndLocate == endLocateCar && m.Type == PLCTypeEnum.ShuttleCar && m.Status <= TaskStatusEnum.Doing);
+                            if (getCdTask == null)
+                            {
+                                //娣诲姞灏忚溅鍏呯數浣嶇疆
+                                WcsTask modCarTask = new WcsTask()
+                                {
+                                    TaskNo = _taskService.GetTaskCode(),
+                                    TaskType = TaskTypeEnum.Move,
+                                    Type = PLCTypeEnum.ShuttleCar,
+                                    StartLocate = carXYZ,
+                                    EndLocate = endLocateCar,
+                                    PalletNo = "",
+                                    Status = TaskStatusEnum.Wait,
+                                    Levels = 888, //鍏呯數绛夌骇浼樺厛浠诲姟绛夌骇
+                                    Origin = "WCS",
+                                    CarIp = modDevice.PlcIdIP
+                                };
+                                _db.Insertable(modCarTask).ExecuteCommand();
+                                HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>());
+                            }
+                            
                         }
-                        carTask2 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP).OrderBy(m => m.CreateTime).First();
-                    }
+                        else if(resultDl.IsSucceed && valueDl < (int)FourWayCarDLEnum.Dl2)
+                        {
+                            //鍒ゆ柇灏忚溅鏄惁鏈夌┖闂叉椂闂磋褰� 娌℃湁锛氭坊鍔�  鏈夛細鍒ゆ柇褰撳墠鏃堕棿涓庤褰曟椂闂存槸鍚︽弧瓒�5鍒嗛挓 婊¤冻锛氭坊鍔犺灏忚溅鍘诲厖鐢典换鍔�
+                            var carTime = _db.Queryable<WcsCarTime>().First(m => m.IsDelete == false && m.CarIp == modDevice.PlcIdIP);
+                            if (carTime == null)
+                            {
+                                var carTimeAdd = new WcsCarTime()
+                                {
+                                    CarIp = modDevice.PlcIdIP,
+                                    CarTime = DateTime.Now
+                                };
+                                _db.Insertable(carTimeAdd).ExecuteCommand();
+                            }
+                            else
+                            {
+                                if (carTime.CarTime == null)
+                                {
+                                    carTime.CarTime = DateTime.Now;
+                                    carTime.UpdateTime = DateTime.Now;
+                                    _db.Updateable(carTime).ExecuteCommand();
+                                }
+                                else
+                                {
+                                    var date1 = DateTime.Now;
+                                    var data2 = (DateTime)carTime.CarTime;
+                                    TimeSpan interval = date1 - data2;
+                                    if (interval.TotalMinutes >= 5)
+                                    {
+                                        var endLocateCar = "";
+                                        if (valuez == 1)
+                                        {
+                                            endLocateCar = "210401";
+                                        }
+                                        else if (valuez == 2)
+                                        {
+                                            endLocateCar = "210402";
+                                        }
+                                        else
+                                        {
+                                            return; // 灞傛暟閿欒
+                                        }
+                                        var getCdTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Levels == 888 && m.EndLocate == endLocateCar && m.Type == PLCTypeEnum.ShuttleCar && m.Status <= TaskStatusEnum.Doing);
+                                        if (getCdTask == null)
+                                        {
+                                            //娣诲姞灏忚溅鍏呯數浣嶇疆
+                                            WcsTask modCarTask = new WcsTask()
+                                            {
+                                                TaskNo = _taskService.GetTaskCode(),
+                                                TaskType = TaskTypeEnum.Move,
+                                                Type = PLCTypeEnum.ShuttleCar,
+                                                StartLocate = carXYZ,
+                                                EndLocate = endLocateCar,
+                                                PalletNo = "",
+                                                Status = TaskStatusEnum.Wait,
+                                                Levels = 888, //鍏呯數绛夌骇浼樺厛浠诲姟绛夌骇
+                                                Origin = "WCS",
+                                                CarIp = modDevice.PlcIdIP
+                                            };
+                                            _db.Insertable(modCarTask).ExecuteCommand();
+                                            HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>());
+                                        }
+                                       
+                                    }
+                                }
 
-                    //return;
-                    if (modTask == null || carTask2 == null)
-                    {
-                        //鍒ゆ柇灏忚溅鏄惁鏈夌┖闂叉椂闂磋褰� 娌℃湁锛氭坊鍔�  鏈夛細鍒ゆ柇褰撳墠鏃堕棿涓庤褰曟椂闂存槸鍚︽弧瓒�5鍒嗛挓 婊¤冻锛氭坊鍔犺灏忚溅鍘诲厖鐢典换鍔�
+
+                            }
+                        }
+                         
+                        
                         return;
                     }
-                    
-                    if (carTask2.Status == TaskStatusEnum.Doing)
+                    if (carTaskNext == null)
+                    {
+                        return;
+                    }
+                    if (carTaskNext.Status == TaskStatusEnum.Doing)
                     {
                         Thread.Sleep(3000);
                         return;
                     }
+                    
                     //鍒ゆ柇褰撳墠浠诲姟鏄惁杩樻湁鍓嶇疆浠诲姟鏈畬鎴�
-                    var preStrs = carTask2.PreId.Split(';');
+                    var preStrs = carTaskNext.PreId.Split(';');
                     foreach (var preStr in preStrs)
                     {
                         if (string.IsNullOrWhiteSpace(preStr))
@@ -280,6 +397,7 @@
                             return;//鍓嶇疆浠诲姟鏈畬鎴�
                         }
                     }
+
                     //鍏堝浣�
                     var modRest = modDevice.listStation.FirstOrDefault(s => s.Text == "澶嶄綅");
                     plcConn.SetDBValue(modRest.PosType, modRest.PlcPos, "1");
@@ -287,7 +405,15 @@
                     List<Result> listResult = new List<Result>();
                     //鑾峰彇灏忚溅浠诲姟鍙�
                     var carTaskNo = FourWayCarUtil.GetTaskNo();
-                    
+
+                    //鍒ゆ柇浠诲姟鏄惁鍏呯數浠诲姟
+                    if (modTask.Levels == 888)
+                    {
+                        //鍐欏叆鍏呯數鍛戒护
+                        var modCd = modDevice.listStation.FirstOrDefault(s => s.Text == "鍏呯數鍛戒护");
+                        listResult.Add(plcConn.SetDBValue(modCd.PosType, modCd.PlcPos.ToString(), "1"));
+                    }
+
                     var modWriteTask = modDevice.listStation.FirstOrDefault(s => s.Text == "鍐欏叆浠诲姟鍙�");
                     listResult.Add(plcConn.SetDBValue(modWriteTask.PosType, modWriteTask.PlcPos, carTaskNo.ToString()));
 
@@ -301,7 +427,7 @@
                     int posStatus = Convert.ToInt32(modNodeStatus.PlcPos);
 
                     //浜や簰璺緞
-                    var execuPath = carTask2.ExecutionPath.Split(';');
+                    var execuPath = carTaskNext.ExecutionPath.Split(';');
                     if (Convert.ToInt32(valuex) != Convert.ToInt32(execuPath[0].Substring(0, 2)) || Convert.ToInt32(valuey) != Convert.ToInt32(execuPath[0].Substring(2, 2)) || Convert.ToInt32(valuez) != Convert.ToInt32(execuPath[0].Substring(4, 2)))
                     {
                         return; //灏忚溅浣嶇疆涓庤矾寰勮捣濮嬩綅缃笉鍚�
@@ -343,15 +469,22 @@
                         var result = plcConn.SetDBValue(modStart.PosType, modStart.PlcPos, "1");
                         if (result.IsSucceed)
                         {
-                            carTask2.Status = TaskStatusEnum.Doing;
-                            carTask2.CarTaskNo = carTaskNo;
-                            _db.Updateable(carTask2).ExecuteCommand();
+                            carTaskNext.Status = TaskStatusEnum.Doing;
+                            carTaskNext.CarTaskNo = carTaskNo;
+                            _db.Updateable(carTaskNext).ExecuteCommand();
                             //娓呴櫎灏忚溅绌洪棽鏃堕棿
+                            var carTimeClear = _db.Queryable<WcsCarTime>().First(m=>m.IsDelete == false && m.CarIp == modDevice.PlcIdIP);
+                            if (carTimeClear!= null)
+                            {
+                                carTimeClear.CarTime = null;
+                                carTimeClear.UpdateTime = DateTime.Now;
+                                _db.Updateable(carTimeClear).ExecuteCommand();
+                            }
                             var taskMonitor = new WcsTaskMonitor()
                             {
-                                TaskNo = carTask2.TaskNo,
+                                TaskNo = carTaskNext.TaskNo,
                                 PlcName = modDevice.Text,
-                                InteractiveMsg = $"鍚戠┛姊溅涓嬪彂浠诲姟{carTask2.TaskNo}"
+                                InteractiveMsg = $"鍚戠┛姊溅涓嬪彂浠诲姟{carTaskNext.TaskNo}"
                             };
                             _db.Insertable(taskMonitor).ExecuteCommand();
                             //涓嬪彂浠诲姟鏃ュ織

--
Gitblit v1.8.0