using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HslCommunication.WebSocket;
using Quartz;
using WIDESEAWCS_Common;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
namespace WIDESEAWCS_Tasks
{
///
/// 通用传送带灯光控制任务
/// 从PLC读取站点状态和释放信号,更新灯光状态字典,并设置对应的PLC信号
/// 主要功能:
/// 1. 读取PLC中DB15.922.0和DB15.924.0的16位布尔数组作为站点状态和释放信号
/// 2. 根据设备子码分组更新LightStatusStorage中的状态字典
/// 3. 根据当前灯光状态设置PLC对应的完成/错误/工作中/语音信号
/// 异常处理:记录设备代码和名称相关的异常信息
///
[DisallowConcurrentExecution]
public class CommonConveyorLightJob : JobBase, IJob
{
private readonly ITaskRepository _taskRepository;
private readonly WebSocketServer _webSocketServer;
private readonly IContainerRepository _containerRepository;
public CommonConveyorLightJob(ITaskRepository taskRepository, WebSocketServer webSocketServer)
{
_taskRepository = taskRepository;
_webSocketServer = webSocketServer;
}
public Task Execute(IJobExecutionContext context)
{
bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
if (flag && value != null && value is OtherDevice otherDevice)
{
try
{
bool[] stationStatusArray = otherDevice.Communicator.Read("DB15.922.0", 16);
bool[] releaseArray = otherDevice.Communicator.Read("DB15.924.0", 16);
string? dbAddress = otherDevice.DeviceProDTOs.OrderBy(x => x.DeviceProOffset).Select(x => x.DeviceProAddress).FirstOrDefault();
if (!string.IsNullOrEmpty(dbAddress))
{
List deviceChildCodes = otherDevice.DeviceProDTOs.GroupBy(x => x.DeviceChildCode).Select(x => x.Key).ToList();
for (int i = 0; i < deviceChildCodes.Count; i++)
{
if (LightStatusStorage.StationStautsDic.ContainsKey(deviceChildCodes[i]))
{
LightStatusStorage.StationStautsDic[deviceChildCodes[i]] = stationStatusArray[i];
}
else
{
LightStatusStorage.StationStautsDic.Add(deviceChildCodes[i], stationStatusArray[i]);
}
if (LightStatusStorage.StationReleaseDic.ContainsKey(deviceChildCodes[i]))
{
LightStatusStorage.StationReleaseDic[deviceChildCodes[i]] = releaseArray[i];
}
else
{
LightStatusStorage.StationReleaseDic.Add(deviceChildCodes[i], releaseArray[i]);
}
if (!LightStatusStorage.LightStatusDic.ContainsKey(deviceChildCodes[i]))
{
LightStatusStorage.LightStatusDic.Add(deviceChildCodes[i], LightStatusEnum.None);
if (otherDevice.GetValue(LightStatusEnum.LightCompleted, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightCompleted, false, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightError, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightError, false, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightWorking, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightWorking, false, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightVoice, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightVoice, false, deviceChildCodes[i]);
}
else
{
if (LightStatusStorage.LightStatusDic[deviceChildCodes[i]] == LightStatusEnum.LightCompleted)
{
if (!otherDevice.GetValue(LightStatusEnum.LightCompleted, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightCompleted, true, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightError, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightError, false, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightWorking, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightWorking, false, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightVoice, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightVoice, false, deviceChildCodes[i]);
}
else if (LightStatusStorage.LightStatusDic[deviceChildCodes[i]] == LightStatusEnum.LightError)
{
if (otherDevice.GetValue(LightStatusEnum.LightCompleted, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightCompleted, false, deviceChildCodes[i]);
if (!otherDevice.GetValue(LightStatusEnum.LightError, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightError, true, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightWorking, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightWorking, false, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightVoice, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightVoice, false, deviceChildCodes[i]);
}
else if (LightStatusStorage.LightStatusDic[deviceChildCodes[i]] == LightStatusEnum.LightWorking)
{
if (otherDevice.GetValue(LightStatusEnum.LightCompleted, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightCompleted, false, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightError, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightError, false, deviceChildCodes[i]);
if (!otherDevice.GetValue(LightStatusEnum.LightWorking, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightWorking, true, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightVoice, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightVoice, false, deviceChildCodes[i]);
}
else if (LightStatusStorage.LightStatusDic[deviceChildCodes[i]] == LightStatusEnum.Ready)
{
if (otherDevice.GetValue(LightStatusEnum.LightCompleted, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightCompleted, false, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightError, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightError, false, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightWorking, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightWorking, false, deviceChildCodes[i]);
if (otherDevice.GetValue(LightStatusEnum.LightVoice, deviceChildCodes[i]))
otherDevice.SetValue(LightStatusEnum.LightVoice, false, deviceChildCodes[i]);
}
}
}
}
}
catch (Exception ex)
{
WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", ex.Message, ex);
}
}
else
{
WriteError(nameof(CommonConveyorLightJob), "参数错误,未传递设备参数或设备类型错误");
}
return Task.CompletedTask;
}
}
}