From 5999e9c77ee30a7090ed7f6cdd07d82fe9a4015b Mon Sep 17 00:00:00 2001
From: bklLiudl <673013083@qq.com>
Date: 星期三, 11 九月 2024 08:44:06 +0800
Subject: [PATCH] Merge branch 'master' into liudl

---
 Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs |  206 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 206 insertions(+), 0 deletions(-)

diff --git a/Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs b/Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs
new file mode 100644
index 0000000..7a8ff9c
--- /dev/null
+++ b/Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs
@@ -0,0 +1,206 @@
+锘縰sing Admin.NET.Core.Service;
+using DocumentFormat.OpenXml.Office2010.ExcelAc;
+using Furion.InstantMessaging;
+using Microsoft.AspNetCore.SignalR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WCS.Application;
+
+/// <summary>
+/// 浠诲姟鏃ュ織闆嗙嚎鍣�
+/// </summary>
+[MapHub("/hubs/PlcDevice")]
+public class PlcDeviceHub : Hub<IPlcDeviceHub>
+{
+    private static readonly IHubContext<PlcDeviceHub, IPlcDeviceHub> _plcDeviceHubContext = App.GetService<IHubContext<PlcDeviceHub, IPlcDeviceHub>>();
+    private static readonly SysCacheService _sysCacheService = App.GetRequiredService<SysCacheService>();
+    private static bool boRunningState = false;
+    private static CancellationTokenSource cts;//鍙栨秷绾跨▼鏍囪瘑
+    private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
+    public PlcDeviceHub()
+    {
+    }
+
+    /// <summary>
+    /// 杩炴帴
+    /// </summary>
+    /// <returns></returns>
+    public override async Task OnConnectedAsync()
+    {
+        var httpContext = Context.GetHttpContext();
+        var userId = (httpContext.User.FindFirst(ClaimConst.UserId)?.Value).ToLong();
+        _sysCacheService.Set("PlcDeviceHub:" + Context.ConnectionId, userId);
+        if (!boRunningState)
+        {
+            //寮�鍚鍙栨湇鍔$嚎绋�
+            boRunningState = true;
+            cts = new CancellationTokenSource();//鍙栨秷绾跨▼鏍囪瘑
+            StartRead();
+        }
+        await base.OnConnectedAsync();
+    }
+
+    /// <summary>
+    /// 鏂紑
+    /// </summary>
+    /// <param name="exception"></param>
+    /// <returns></returns>
+    public override async Task OnDisconnectedAsync(Exception exception)
+    {
+        _sysCacheService.Remove("PlcDeviceHub:" + Context.ConnectionId);
+        //濡傛灉娌℃湁杩炴帴浜� 灏卞叧闂嚎绋嬩笉璇讳簡
+        if (_sysCacheService.GetKeysByPrefixKey("PlcDeviceHub").Count == 0)
+        {
+            cts.Cancel();
+            boRunningState = false;
+        }
+        await base.OnDisconnectedAsync(exception);
+    }
+
+    /// <summary>
+    /// 寮�鍚鍙杙lc绾跨▼
+    /// </summary>
+    public static void StartRead()
+    {
+        Task.Run(() =>
+        {
+            // 鐢ㄤ簬淇濆瓨姣忎釜璁惧鐨勫垵濮嬬姸鎬�
+            var initialStates = new Dictionary<long, WcsDeviceOutput>();
+
+            var listPlc = _db.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.StackingMachine || s.Type == PLCTypeEnum.ConveyorLine).ToList();
+            var listPlcId = listPlc.Select(s => s.Id).ToList();
+            var listPlcDevice = _db.Queryable<WcsDevice>().Where(s => s.DeviceType == DeviceTypeEnum.Business && listPlcId.Contains(s.PlcId)).Select<WcsDeviceOutput>().ToList();
+            var listPlcDeviceId = listPlcDevice.Select(s => s.Id).ToList();
+            var listPlcStation = _db.Queryable<WcsPosition>().Where(s => listPlcDeviceId.Contains(s.DeviceId)).ToList();
+            while (true)
+            {
+                try
+                {
+                    //鑾峰彇璺烘満鐨勭姸鎬�
+                    foreach (var modDevice in listPlcDevice)
+                    {
+                        //鍙栨秷绾跨▼
+                        if (cts.Token.IsCancellationRequested)
+                        {
+                            throw new OperationCanceledException();
+                        }
+                        var modPlc = listPlc.Where(s => s.Id == modDevice.PlcId).FirstOrDefault();
+                        modDevice.Type = modPlc.Type;
+                        //璇诲彇plc鐨勫��
+                        var modConn = PLCTaskAction.listPlcConn.FirstOrDefault(s => s != null && s.PlcId == modDevice.PlcId);
+                        if (modConn == null)
+                        {
+                            modDevice.Status = false;
+                            continue;
+                        }
+                        else
+                        {
+                            modDevice.Status = modConn.Connected;
+                        }
+                        if (modConn.Connected)
+                        {
+                            var listPosition = listPlcStation.Where(s => s.DeviceId == modDevice.Id).ToList();
+                            (var result, var plc) = modConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos);
+                            modDevice.Plc = Convert.ToString(plc);
+                            (result, var wcs) = modConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos);
+                            modDevice.Wcs = Convert.ToString(wcs);
+                            //浠诲姟鍙�
+                            var modPositionTask = listPosition.FirstOrDefault(s => s.Text == "浠诲姟鍙�");
+                            (result, var taskNo) = modConn.GetPlcDBValue(modPositionTask.PosType, modDevice.DbNumber, modPositionTask.PlcPos, modPositionTask.StringLength);
+                            modDevice.TaskNo = Convert.ToString(taskNo);
+                            //浠诲姟绫诲瀷
+                            var modPositionTaskType = listPosition.FirstOrDefault(s => s.Text == "浠诲姟绫诲瀷");
+                            (result, var taskType) = modConn.GetPlcDBValue(modPositionTaskType.PosType, modDevice.DbNumber, modPositionTaskType.PlcPos);
+                            modDevice.TaskType = (TaskTypeEnum)Convert.ToInt32(taskType);
+                            //璧峰宸ヤ綅
+                            var modPositionStartLocatNo = listPosition.FirstOrDefault(s => s.Text == "璧峰宸ヤ綅");
+                            (result, var startLocatNo) = modConn.GetPlcDBValue(modPositionStartLocatNo.PosType, modDevice.DbNumber, modPositionStartLocatNo.PlcPos);
+                            modDevice.StartLocatNo = Convert.ToString(startLocatNo);
+                            //鐩殑宸ヤ綅
+                            var modPositionEndLocatNo = listPosition.FirstOrDefault(s => s.Text == "鐩殑宸ヤ綅");
+                            (result, var endLocatNo) = modConn.GetPlcDBValue(modPositionEndLocatNo.PosType, modDevice.DbNumber, modPositionEndLocatNo.PlcPos);
+                            modDevice.EndLocatNo = Convert.ToString(endLocatNo);
+                            //鎵樼洏鐮�
+                            var modPositionPalletNo = listPosition.FirstOrDefault(s => s.Text == "鎵樼洏鐮�");
+                            (result, var palletNo) = modConn.GetPlcDBValue(modPositionPalletNo.PosType, modDevice.DbNumber, modPositionPalletNo.PlcPos, modPositionPalletNo.StringLength);
+                            modDevice.PalletNo = Convert.ToString(palletNo);
+                            if (modPlc.Type == PLCTypeEnum.ConveyorLine)
+                            {
+                                //鏀捐揣鎺�
+                                var modPositionReleaseRow = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣鎺�");
+                                (result, var releaseRow) = modConn.GetPlcDBValue(modPositionReleaseRow.PosType, modDevice.DbNumber, modPositionReleaseRow.PlcPos);
+                                modDevice.ReleaseRow = Convert.ToInt32(releaseRow);
+                                //鏀捐揣鍒�
+                                var modPositionReleaseCol = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣鍒�");
+                                (result, var releaseCol) = modConn.GetPlcDBValue(modPositionReleaseCol.PosType, modDevice.DbNumber, modPositionReleaseCol.PlcPos);
+                                modDevice.ReleaseCol = Convert.ToInt32(releaseCol);
+                                //鏀捐揣灞�
+                                var modPositionReleaseStorey = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣灞�");
+                                (result, var releaseStorey) = modConn.GetPlcDBValue(modPositionReleaseStorey.PosType, modDevice.DbNumber, modPositionReleaseStorey.PlcPos);
+                                modDevice.ReleaseStorey = Convert.ToInt32(releaseStorey);
+                                //鍙栬揣鎺�
+                                var modPositionPickRow = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣鎺�");
+                                (result, var pickRow) = modConn.GetPlcDBValue(modPositionPickRow.PosType, modDevice.DbNumber, modPositionPickRow.PlcPos);
+                                modDevice.PickRow = Convert.ToInt32(pickRow);
+                                //鍙栬揣鍒�
+                                var modPositionPickCol = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣鍒�");
+                                (result, var pickCol) = modConn.GetPlcDBValue(modPositionPickCol.PosType, modDevice.DbNumber, modPositionPickCol.PlcPos);
+                                modDevice.PickCol = Convert.ToInt32(pickCol);
+                                //鍙栬揣灞�
+                                var modPositionPickStorey = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣灞�");
+                                (result, var pickStorey) = modConn.GetPlcDBValue(modPositionPickStorey.PosType, modDevice.DbNumber, modPositionPickStorey.PlcPos);
+                                modDevice.PickStorey = Convert.ToInt32(pickStorey);
+                            }
+                        }
+                        //else
+                        //{
+                        //    //娴嬭瘯
+                        //    modDevice.TaskNo = "TK00001";
+                        //    modDevice.TaskType = TaskTypeEnum.In;
+                        //    modDevice.Wcs = new Random().Next(1000).ToString();
+                        //    modDevice.Plc = new Random().Next(1000).ToString();
+                        //    modDevice.Status = true;
+                        //}
+                        // 姣旇緝涔嬪墠鐨勭姸鎬�
+                        if (initialStates.TryGetValue(modDevice.Id, out var initialState))
+                        {
+                            if (modDevice.Status != initialState.Status ||
+                                modDevice.Plc != initialState.Plc ||
+                                modDevice.Wcs != initialState.Wcs ||
+                                modDevice.TaskNo != initialState.TaskNo ||
+                                modDevice.TaskType != initialState.TaskType ||
+                                modDevice.StartLocatNo != initialState.StartLocatNo ||
+                                modDevice.EndLocatNo != initialState.EndLocatNo ||
+                                modDevice.PalletNo != initialState.PalletNo ||
+                                (modPlc.Type == PLCTypeEnum.ConveyorLine &&
+                                    (modDevice.ReleaseRow != initialState.ReleaseRow ||
+                                     modDevice.ReleaseCol != initialState.ReleaseCol ||
+                                     modDevice.ReleaseStorey != initialState.ReleaseStorey ||
+                                     modDevice.PickRow != initialState.PickRow ||
+                                     modDevice.PickCol != initialState.PickCol ||
+                                     modDevice.PickStorey != initialState.PickStorey)))
+                            {
+                                // 閫氱煡鐢ㄦ埛鍙樻洿
+                                _plcDeviceHubContext.Clients.All.PublicPlcDevice(modDevice);
+                            }
+                        }
+                        initialStates[modDevice.Id] = modDevice.Adapt<WcsDeviceOutput>();
+                    }
+                    Thread.Sleep(2000);
+                }
+                catch (OperationCanceledException)
+                {
+                    break;
+                }
+                catch (Exception)
+                {
+
+                }
+            }
+        }, cts.Token);
+    }
+}

--
Gitblit v1.8.0