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<Dt_EquipmentAlarmInfor, IRepository<Dt_EquipmentAlarmInfor>>, IEquipmentAlarmInforService
|
{
|
private readonly IMessageInfoService _messageInfoService;
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
|
public EquipmentAlarmInforService(IRepository<Dt_EquipmentAlarmInfor> 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<AGVResponse<DeviceStatusData>>(result);
|
if (response == null || response.code != "0" || response.data == null) return content.Error($"获取设备信息失败: {response?.msg}");
|
List<string> codes = new List<string>();
|
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<Dt_EquipmentAlarmInfor> equipmentAlarmInfors = BaseDal.QueryData(x => codes.Contains(x.RobotCode));
|
List<Dt_EquipmentAlarmInfor> equipmentAlarmInforsAdd = new List<Dt_EquipmentAlarmInfor>();
|
List<Dt_EquipmentAlarmInfor> equipmentAlarmInforsUp = new List<Dt_EquipmentAlarmInfor>();
|
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;
|
}
|
|
/// <summary>
|
/// 查看立库小车报警信息
|
/// </summary>
|
/// <returns></returns>
|
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<AGVResponse<DeviceStatusData>>(result);
|
|
// 检查接口响应是否成功
|
if (response == null || response.code != "0")
|
{
|
return new WebResponseContent { Status = false, Message = $"WCS接口调用失败: {response?.msg}" };
|
}
|
|
var syncTime = DateTime.Now;
|
var AddEquipList = new List<Dt_EquipmentAlarmInfor>();
|
var UpdateEquipList = new List<Dt_EquipmentAlarmInfor>();
|
var alarmList = new List<(string deviceType, string deviceName, string deviceCode)>();
|
|
// 收集所有设备编码,一次性查询
|
var allDeviceCodes = new List<string>();
|
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<string, Dt_EquipmentAlarmInfor>();
|
|
// 处理机器人设备数据
|
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}"
|
};
|
}
|
}
|
|
/// <summary>
|
/// 处理单个设备记录
|
/// </summary>
|
private void ProcessDevice(string deviceCode, string deviceName, string status, string deviceType,
|
Dictionary<string, Dt_EquipmentAlarmInfor> existingRecords,
|
List<Dt_EquipmentAlarmInfor> addList,
|
List<Dt_EquipmentAlarmInfor> 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));
|
}
|
}
|
}
|
|
/// <summary>
|
/// 处理报警信息
|
/// </summary>
|
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);
|
}
|
}
|
}
|
}
|