1
HuBingJie
2025-11-29 0df64f37379ce5c04e380f1c411dc52b01ac6b51
´úÂë¹ÜÀí/WCS/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RgvoperainformService.cs
@@ -62,12 +62,15 @@
        private readonly IServiceProvider _serviceProvider;
        private static bool _isMonitoring = false;
        //private static CancellationTokenSource _cancellationTokenSource;
        // åœ¨ç±»çº§åˆ«æ·»åŠ ç‹¬ç«‹çš„ç›‘æŽ§çŠ¶æ€
        private bool _isOutboundMonitoring = false;
        private bool _isInboundMonitoring = false;
        private bool _isSafetyDoorMonitoring = false;
        private bool _isPlatformMonitoring = false;
        // åœ¨ç±»çš„字段区
        private CancellationTokenSource? _platformCancellationTokenSource;
        private CancellationTokenSource _outboundCancellationTokenSource;
        private CancellationTokenSource _inboundCancellationTokenSource;
        private CancellationTokenSource _safetyDoorCancellationTokenSource;
@@ -80,21 +83,18 @@
        //=================================================读取设备信息==========================================================
        /// <summary>
        /// èŽ·å–è®¾å¤‡çŠ¶æ€ï¼ˆæ”¯æŒå‡ºåº“ã€å…¥åº“å’Œå®‰å…¨é—¨ç‹¬ç«‹ç›‘æŽ§ï¼‰
        /// èŽ·å–è®¾å¤‡çŠ¶æ€ï¼ˆæ”¯æŒå‡ºåº“ã€å…¥åº“ã€å®‰å…¨é—¨å’Œç«™å°ç‹¬ç«‹ç›‘æŽ§ï¼‰
        /// </summary>
        /// <param name="off">0:停止 1:启动 2:仅查询</param>
        /// <param name="monitorType">监控类型:outbound-出库 inbound-入库 safetydoor-安全门 all-全部</param>
        /// <param name="monitorType">监控类型:outbound-出库 inbound-入库 safetydoor-安全门 platform-站台 all-全部</param>
        /// <returns></returns>
        public WebResponseContent GetDeviceStatusDto(int off, string monitorType = "outbound")
        {
            bool isOutbound = monitorType == "outbound" || monitorType == "all";//出库
            bool isInbound = monitorType == "inbound" || monitorType == "all";//入库
            bool isSafetyDoor = monitorType == "safetydoor" || monitorType == "all";//安全门
            bool isPlatform = monitorType == "platform" || monitorType == "all";//站台
            if (off == 1)
            {
@@ -120,6 +120,13 @@
                    _ = Task.Run(async () => await StartDeviceMonitoring(_safetyDoorCancellationTokenSource.Token, "safetydoor"));
                }
                if (isPlatform && !_isPlatformMonitoring)
                {
                    _isPlatformMonitoring = true;
                    _platformCancellationTokenSource = new CancellationTokenSource();
                    _ = Task.Run(async () => await StartDeviceMonitoring(_platformCancellationTokenSource.Token, "platform"));
                }
                var immediateData = GetImmediateDeviceData(monitorType);
                string message = GetMonitorStatusMessage(monitorType);
                return WebResponseContent.Instance.OK($"设备状态监控已启动 - {message}", immediateData);
@@ -143,6 +150,12 @@
                {
                    _isSafetyDoorMonitoring = false;
                    _safetyDoorCancellationTokenSource?.Cancel();
                }
                if (isPlatform && _isPlatformMonitoring)
                {
                    _isPlatformMonitoring = false;
                    _platformCancellationTokenSource?.Cancel();
                }
                var finalData = GetImmediateDeviceData(monitorType);
@@ -212,6 +225,9 @@
                case "safetydoor":
                    _isSafetyDoorMonitoring = false;
                    break;
                case "platform":
                    _isPlatformMonitoring = false;
                    break;
            }
        }
@@ -236,7 +252,14 @@
                ["MaterialIn"] = new List<string> { "RGV101" },
                // å®‰å…¨é—¨è®¾å¤‡
                ["SafetyDoor"] = new List<string> { "HCJ2000" }, // å®‰å…¨é—¨
                ["SafetyDoor"] = new List<string> { "HCJ2000" },
                // ç«™å°è®¾å¤‡ - æ ¹æ®æ‚¨æä¾›çš„协议添加所有站台
                //        ["Platform"] = new List<string> {
                //    "1001", "1002", "2016", "2017", "2018", "2019", "1021", "1061", "1131", "1171"
                //}
                ["Platform"] = new List<string> { "HCJ2000" },
            };
            // è®¾å¤‡ç±»åž‹å¯¹åº”的参数配置
@@ -339,6 +362,13 @@
            ("ResetStatus", "ReadDeviceCommand", "安全门复位状态"),
            ("AlarmSummary", "DeviceCommand", "报警信息"),
            ("OpenDoor", "DeviceCommand", "开门信息")
        },
                // ç«™å°è®¾å¤‡å‚数配置 - æ ¹æ®æ‚¨æä¾›çš„协议添加
                ["Platform"] = new List<(string, string, string)>
        {
            ("HCJ_GoodsStatus", "ReadDeviceCommand", "光电信号"),
            ("DoorRequest", "DeviceCommand", "任务id")
        }
            };
@@ -352,13 +382,13 @@
                {
                    "outbound" => group.Key == "MotherCar" || group.Key == "TransferCar" || group.Key == "MaterialOut",
                    "inbound" => group.Key == "MaterialIn" || group.Key == "InboundMotherCar" || group.Key == "InboundTransferCar",
                    "safetydoor" => group.Key == "SafetyDoor", // å®‰å…¨é—¨ç›‘控类型
                    "safetydoor" => group.Key == "SafetyDoor",
                    "platform" => group.Key == "Platform", // ç«™å°ç›‘控类型
                    "all" => true,
                    _ => group.Key == "MotherCar" || group.Key == "TransferCar" || group.Key == "MaterialOut"
                };
            }).ToDictionary(x => x.Key, x => x.Value);
            int i = 0;
            // éåŽ†ç­›é€‰åŽçš„è®¾å¤‡ç»„
            foreach (var deviceGroup in filteredDeviceGroups)
            {
@@ -413,57 +443,83 @@
                    }
                    else if (device is CommonConveyorLine conveyorLine)
                    {
                        // å¤„理安全门设备(CommonConveyorLine ç±»åž‹ï¼‰
                        // åˆ›å»ºä¸‰ä¸ªå®‰å…¨é—¨è®¾å¤‡çš„æ•°æ®
                        List<string> safetyDoorList = new List<string> { "AQM001", "AQM002", "AQM003" };
                        // ä¸ºæ¯ä¸ªå®‰å…¨é—¨åˆ›å»ºæ•°æ®
                        foreach (string safetyDoorCode in safetyDoorList)
                        // å¤„理安全门设备和站台设备(CommonConveyorLine ç±»åž‹ï¼‰
                        if (deviceType == "SafetyDoor")
                        {
                            var deviceData = new Dictionary<string, int>();
                            // å®‰å…¨é—¨è®¾å¤‡å¤„理逻辑(保持不变)
                            List<string> safetyDoorList = new List<string> { "AQM001", "AQM002", "AQM003" };
                            // éåŽ†è¯¥è®¾å¤‡çš„æ‰€æœ‰å‚æ•°
                            foreach (var param in deviceParams)
                            foreach (string safetyDoorCode in safetyDoorList)
                            {
                                try
                                {
                                    // ä½¿ç”¨å®‰å…¨é—¨åç§°æŸ¥è¯¢å¯¹åº”的参数
                                    DeviceProDTO? devicePro = GetSafetyDoorDeviceProDTO(
                                        conveyorLine, safetyDoorCode, param.DeviceProParamName, param.DeviceProParamType);
                                var deviceData = new Dictionary<string, int>();
                                    if (devicePro != null)
                                    {
                                        // å¯¹äºŽ CommonConveyorLine ç±»åž‹ï¼Œä½¿ç”¨é€šç”¨çš„æ•°æ®è¯»å–方法
                                        int res = ReadCommonConveyorLineData(conveyorLine, devicePro.DeviceProAddress);
                                        deviceData[param.DeviceProRemark] = res;
                                    }
                                    else
                                    {
                                        deviceData[param.DeviceProRemark] = -1; // ä½¿ç”¨ -1 è¡¨ç¤ºæŸ¥è¯¢å¤±è´¥
                                    }
                                }
                                catch (Exception)
                                foreach (var param in deviceParams)
                                {
                                    deviceData[param.DeviceProRemark] = -1; // ä½¿ç”¨ -1 è¡¨ç¤ºæŸ¥è¯¢å¼‚常
                                    try
                                    {
                                        DeviceProDTO? devicePro = GetSafetyDoorDeviceProDTO(
                                            conveyorLine, safetyDoorCode, param.DeviceProParamName, param.DeviceProParamType);
                                        if (devicePro != null)
                                        {
                                            int res = ReadCommonConveyorLineData(conveyorLine, devicePro.DeviceProAddress);
                                            deviceData[param.DeviceProRemark] = res;
                                        }
                                        else
                                        {
                                            deviceData[param.DeviceProRemark] = -1;
                                        }
                                    }
                                    catch (Exception)
                                    {
                                        deviceData[param.DeviceProRemark] = -1;
                                    }
                                }
                                finalResult[safetyDoorCode] = deviceData;
                            }
                        }
                            // å°†å½“前安全门设备的数据添加到最终结果中,使用安全门名称作为key
                            finalResult[safetyDoorCode] = deviceData;
                        if (deviceType == "Platform")
                        {
                            // å®‰å…¨é—¨è®¾å¤‡å¤„理逻辑(保持不变)
                            List<string> PlatformList = new List<string> { "1001", "1002", "2016", "2017", "2018", "2019", "1021", "1061", "1131", "1171" };
                            foreach (string Platform in PlatformList)
                            {
                                var deviceData = new Dictionary<string, int>();
                                foreach (var param in deviceParams)
                                {
                                    try
                                    {
                                        DeviceProDTO? devicePro = GetSafetyDoorDeviceProDTO(
                                            conveyorLine, Platform, param.DeviceProParamName, param.DeviceProParamType);
                                        if (devicePro != null)
                                        {
                                            int res = ReadCommonConveyorLineData(conveyorLine, devicePro.DeviceProAddress);
                                            deviceData[param.DeviceProRemark] = res;
                                        }
                                        else
                                        {
                                            deviceData[param.DeviceProRemark] = -1;
                                        }
                                    }
                                    catch (Exception)
                                    {
                                        deviceData[param.DeviceProRemark] = -1;
                                    }
                                }
                                finalResult[Platform] = deviceData;
                            }
                        }
                    }
                    else
                    {
                        // å³ä½¿è®¾å¤‡ä¸å­˜åœ¨æˆ–不是支持的类型,也创建一个空字典
                        finalResult[deviceChildCode] = new Dictionary<string, int>();
                        if (device != null)
                        {
                            Console.WriteLine($"警告:设备 {deviceChildCode} ç±»åž‹ {device.GetType().Name} ä¸æ”¯æŒï¼Œæ— æ³•读取数据");
                        }
                        else
                        {
                            Console.WriteLine($"警告:设备 {deviceChildCode} ä¸å­˜åœ¨");
                        }
                    }
                }
            }
@@ -483,7 +539,8 @@
                "outbound" => $"出库监控: {(_isOutboundMonitoring ? "运行中" : "已停止")}",
                "inbound" => $"入库监控: {(_isInboundMonitoring ? "运行中" : "已停止")}",
                "safetydoor" => $"安全门监控: {(_isSafetyDoorMonitoring ? "运行中" : "已停止")}",
                "all" => $"出库监控: {(_isOutboundMonitoring ? "运行中" : "已停止")}, å…¥åº“监控: {(_isInboundMonitoring ? "运行中" : "已停止")}, å®‰å…¨é—¨ç›‘控: {(_isSafetyDoorMonitoring ? "运行中" : "已停止")}",
                "platform" => $"站台监控: {(_isPlatformMonitoring ? "运行中" : "已停止")}", // ç«™å°ç›‘控状态
                "all" => $"出库监控: {(_isOutboundMonitoring ? "运行中" : "已停止")}, å…¥åº“监控: {(_isInboundMonitoring ? "运行中" : "已停止")}, å®‰å…¨é—¨ç›‘控: {(_isSafetyDoorMonitoring ? "运行中" : "已停止")}, ç«™å°ç›‘控: {(_isPlatformMonitoring ? "运行中" : "已停止")}",
                _ => $"出库监控: {(_isOutboundMonitoring ? "运行中" : "已停止")}"
            };
        }
@@ -500,11 +557,11 @@
                "outbound" => "出库",
                "inbound" => "入库",
                "safetydoor" => "安全门",
                "platform" => "站台", // ç«™å°æ˜¾ç¤ºåç§°
                "all" => "全部",
                _ => "出库"
            };
        }
        /// <summary>
        /// è¯»å–设备信息
@@ -517,7 +574,6 @@
            return Commonstacker.Communicator.Read<short>(DeviceProDataBlock);
        }
        /// <summary>
        /// æŸ¥è¯¢å®‰å…¨é—¨è®¾å¤‡
        /// </summary>
@@ -530,6 +586,19 @@
            return Commonstacker.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == SCAddress && x.DeviceProParamName == DeviceProParamName && x.DeviceProParamType == DeviceProParamType);
        }
        /// <summary>
        /// æŸ¥è¯¢ç«™å°è®¾å¤‡
        /// </summary>
        /// <param name="Commonstacker"></param>
        /// <param name="PlatformCode">站台编号</param>
        /// <param name="DeviceProParamName">参数名称</param>
        /// <param name="DeviceProParamType">参数类型</param>
        /// <returns></returns>
        public static DeviceProDTO? GetPlatformDeviceProDTO(CommonConveyorLine Commonstacker, string PlatformCode, string DeviceProParamName, string DeviceProParamType)
        {
            return Commonstacker.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == PlatformCode && x.DeviceProParamName == DeviceProParamName && x.DeviceProParamType == DeviceProParamType);
        }
        //=================================================读取设备信息==========================================================