using HslCommunication; using Newtonsoft.Json; using Quartz.Util; using System; using System.Collections.Generic; using System.Linq; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using WIDESEA_Common; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Helper; using WIDESEA_IWMsInfoServices; using WIDESEA_Model.Models; using static WIDESEA_DTO.SquareCabin.AlarmDto; using static WIDESEA_DTO.SquareCabin.TowcsDto; namespace WIDESEA_WMsInfoServices { public class EquipmentAlarmInforService : ServiceBase>, IEquipmentAlarmInforService { private readonly IMessageInfoService _messageInfoService; private readonly IUnitOfWorkManage _unitOfWorkManage; public EquipmentAlarmInforService(IRepository BaseDal, IMessageInfoService messageInfoService, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal) { _messageInfoService = messageInfoService; _unitOfWorkManage = unitOfWorkManage; } public WebResponseContent getDeviceStatus() { WebResponseContent content = new WebResponseContent(); try { var url = "http://172.16.1.2:8080/cube/taskInfo/getDeviceStatus?token=wH5zdAUCv2BEHJIinmowyki8cdc5ge8fAwFDcYZs0bVldNgmORt0O0l4GJTDv1dglRdMxb9xDK5Qb3NJAqL1Li2GkfdVa3KnIkfrQZtsP7UXhMmUz6xEuztG6d5svAJO9HENLb8JWVqCfpO2EWV6ebo/g5tJ9x7kbwwAxvCBrWdiEJv09FvaRQ== "; var result = HttpHelper.Get(url); var response = JsonConvert.DeserializeObject>(result); if (response == null || response.code != "0" || response.data == null) return content.Error($"获取设备信息失败: {response?.msg}"); List codes = new List(); if (response.data.robot.Count < 1 || response.data.sorters.Count < 0) return content.Error($"获取设备信息为空: {response?.msg}"); // 处理机器人设备数据 codes.AddRange(response.data.robot.Select(x => x.robotCode).ToList()); // 处理分拣台设备数据 codes.AddRange(response.data.sorters.Select(x => x.sorterCode).ToList()); if (codes.Count < 1) return content; List equipmentAlarmInfors = BaseDal.QueryData(x => codes.Contains(x.RobotCode)); List equipmentAlarmInforsAdd = new List(); List equipmentAlarmInforsUp = new List(); foreach (var item in response.data.robot) { Dt_EquipmentAlarmInfor? equipmentAlarmInfor = equipmentAlarmInfors.Where(x => x.RobotCode == item.robotCode).FirstOrDefault(); if (equipmentAlarmInfor == null) { equipmentAlarmInfor = new Dt_EquipmentAlarmInfor() { RobotCode = item.robotCode, RobotName = item.robotName, Status = item.status, SyncTime = DateTime.Now, CreateDate = DateTime.Now, }; equipmentAlarmInforsAdd.Add(equipmentAlarmInfor); } else { equipmentAlarmInfor.RobotName = item.robotName; equipmentAlarmInfor.Status = item.status; equipmentAlarmInfor.SyncTime = DateTime.Now; equipmentAlarmInforsUp.Add(equipmentAlarmInfor); } if (string.Equals(item.status, nameof(DeviceStatus.Error), StringComparison.OrdinalIgnoreCase)) { _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, item.robotName, item.status); } } foreach (var item in response.data.sorters) { Dt_EquipmentAlarmInfor? equipmentAlarmInfor = equipmentAlarmInfors.Where(x => x.RobotCode == item.sorterCode).FirstOrDefault(); if (equipmentAlarmInfor == null) { equipmentAlarmInfor = new Dt_EquipmentAlarmInfor() { RobotCode = item.sorterCode, RobotName = item.sorterName, Status = item.status, SyncTime = DateTime.Now, CreateDate = DateTime.Now, }; equipmentAlarmInforsAdd.Add(equipmentAlarmInfor); } else { equipmentAlarmInfor.RobotName = item.sorterCode; equipmentAlarmInfor.Status = item.status; equipmentAlarmInfor.SyncTime = DateTime.Now; equipmentAlarmInforsUp.Add(equipmentAlarmInfor); } if (string.Equals(item.status, nameof(DeviceStatus.Error), StringComparison.OrdinalIgnoreCase)) { _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, item.sorterCode, item.status); } } if (equipmentAlarmInforsAdd.Count > 0) BaseDal.AddData(equipmentAlarmInforsAdd); if (equipmentAlarmInforsUp.Count > 0) BaseDal.UpdateData(equipmentAlarmInforsUp); } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// 查看立库小车报警信息 /// /// public WebResponseContent getDeviceStatus1() { try { var url = "http://172.16.1.2:8080/cube/taskInfo/getDeviceStatus?token=wH5zdAUCv2BEHJIinmowyki8cdc5ge8fAwFDcYZs0bVldNgmORt0O0l4GJTDv1dglRdMxb9xDK5Qb3NJAqL1Li2GkfdVa3KnIkfrQZtsP7UXhMmUz6xEuztG6d5svAJO9HENLb8JWVqCfpO2EWV6ebo/g5tJ9x7kbwwAxvCBrWdiEJv09FvaRQ== "; var result = HttpHelper.Get(url); var response = JsonConvert.DeserializeObject>(result); // 检查接口响应是否成功 if (response == null || response.code != "0") { return new WebResponseContent { Status = false, Message = $"WCS接口调用失败: {response?.msg}" }; } var syncTime = DateTime.Now; var AddEquipList = new List(); var UpdateEquipList = new List(); var alarmList = new List<(string deviceType, string deviceName, string deviceCode)>(); // 收集所有设备编码,一次性查询 var allDeviceCodes = new List(); if (response.data?.robot != null && response.data.robot.Count > 0) { allDeviceCodes.AddRange(response.data.robot.Select(x => x.robotCode)); } if (response.data?.sorters != null && response.data.sorters.Count > 0) { allDeviceCodes.AddRange(response.data.sorters.Select(x => x.sorterCode)); } // 一次性查询所有已存在的设备记录 var existingRecords = allDeviceCodes.Any() ? BaseDal.QueryData(x => allDeviceCodes.Contains(x.RobotCode)) .ToDictionary(x => x.RobotCode, x => x) : new Dictionary(); // 处理机器人设备数据 if (response.data?.robot != null && response.data.robot.Count > 0) { foreach (var robot in response.data.robot) { ProcessDevice(robot.robotCode, robot.robotName, robot.status, "机器人", existingRecords, AddEquipList, UpdateEquipList, alarmList, syncTime); } } // 处理分拣台设备数据 if (response.data?.sorters != null && response.data.sorters.Count > 0) { foreach (var sorter in response.data.sorters) { ProcessDevice(sorter.sorterCode, sorter.sorterName, sorter.status, "分拣台", existingRecords, AddEquipList, UpdateEquipList, alarmList, syncTime); } } // 开启事务 //_unitOfWorkManage.BeginTran(); try { // 批量操作 if (AddEquipList.Count > 0) { BaseDal.AddData(AddEquipList); } if (UpdateEquipList.Count > 0) { BaseDal.UpdateData(UpdateEquipList); } // 提交事务 //_unitOfWorkManage.CommitTran(); // 处理报警信息 ProcessAlarmMessages(alarmList); var totalCount = AddEquipList.Count + UpdateEquipList.Count; return new WebResponseContent { Status = true, Message = $"同步成功,新增 {AddEquipList.Count} 条,更新 {UpdateEquipList.Count} 条,共处理 {totalCount} 条设备记录。" }; } catch (Exception ex) { //_unitOfWorkManage.RollbackTran(); return new WebResponseContent { Status = false, Message = $"数据保存失败: {ex.Message}" }; } } catch (Exception ex) { return new WebResponseContent { Status = false, Message = $"获取设备状态失败: {ex.Message}" }; } } /// /// 处理单个设备记录 /// private void ProcessDevice(string deviceCode, string deviceName, string status, string deviceType, Dictionary existingRecords, List addList, List updateList, List<(string deviceType, string deviceName, string deviceCode)> alarmList, DateTime syncTime) { if (existingRecords.TryGetValue(deviceCode, out var existingRecord)) { // 检查状态是否发生变化,避免不必要的更新和重复报警 bool statusChanged = existingRecord.Status != status; // 更新现有记录 existingRecord.RobotName = deviceName; existingRecord.Status = status; existingRecord.SyncTime = syncTime; existingRecord.ModifyDate = syncTime; existingRecord.Modifier = "System"; updateList.Add(existingRecord); // 只有状态变为error时才报警 if (statusChanged && status == "error") { alarmList.Add((deviceType, deviceName, deviceCode)); } } else { // 创建新记录 var newRecord = new Dt_EquipmentAlarmInfor { RobotName = deviceName, RobotCode = deviceCode, Status = status, SyncTime = syncTime, CreateDate = syncTime, Creater = "System" }; addList.Add(newRecord); // 新设备状态为error时报警 if (status == "error") { alarmList.Add((deviceType, deviceName, deviceCode)); } } } /// /// 处理报警信息 /// private void ProcessAlarmMessages(List<(string deviceType, string deviceName, string deviceCode)> alarmList) { foreach (var alarm in alarmList) { string alarmTitle = alarm.deviceType == "机器人" ? "小车名称:" + alarm.deviceName : "分拣台名称:" + alarm.deviceName; string alarmMessage = alarm.deviceType == "机器人" ? $"小车编号【{alarm.deviceCode}】发生错误" : $"编号【{alarm.deviceCode}】发生错误"; _messageInfoService.AddMessageInfo(MessageGroupByEnum.EquipmentAlarm, alarmTitle, alarmMessage, MessageStatusEnum.Emergency); } } } }