using Masuit.Tools;
using Newtonsoft.Json;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_DTO.WMS;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
namespace WIDESEAWCS_Tasks
{
public partial class CommonConveyorLine_GWJob
{
///
/// 处理出库任务
///
private void HandleTaskOut(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, int ProtocalDetailValue, Dt_Task taskOut)
{
if (taskOut == null) return;
var taskCommand = MapTaskCommand(taskOut, command);
bool isOutTray = taskOut.TaskType == (int)TaskOutboundTypeEnum.OutTray;
bool isOutboundAndOutFinish = taskOut.TaskType == (int)TaskOutboundTypeEnum.Outbound && taskOut.TaskState == (int)TaskOutStatusEnum.SC_OutFinish;
bool isOutboundAndLineOutExecuting = taskOut.TaskType == (int)TaskOutboundTypeEnum.Outbound && taskOut.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting;
if (isOutTray || isOutboundAndOutFinish || !isOutboundAndLineOutExecuting)
{
conveyorLine.SendCommand(taskCommand, childDeviceCode);
//ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
_taskService.UpdateTaskStatusToNext(taskOut);
}
else if (taskOut.TaskType == (int)TaskOutboundTypeEnum.OutTray && taskOut.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting)
{
CompleteWmsTask(taskOut, command, conveyorLine, childDeviceCode, ProtocalDetailValue);
}
}
///
/// 处理新任务
///
private void HandleNewTask(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
{
Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode);
if (stationManager == null)
{
// Handle the case where stationManager is not found, if necessary
Console.WriteLine($"未找到{childDeviceCode}站台");
return;
}
// 根据站类型执行相应的方法
switch (stationManager.stationType)
{
case 8:
case 9:
case 11:
case 12:
var task = _taskService.QueryExecutingTaskByBarcode(command.ConveyorLineBarcode, childDeviceCode);
if (task != null)
{
ExecuteStationAction(stationManager, conveyorLine, command, childDeviceCode);
}
break;
case 1:
case 6:
case 10:
ExecuteStationAction(stationManager, conveyorLine, command, childDeviceCode);
break;
//case 16:
// ExecuteStationAction(stationManager, conveyorLine, command, childDeviceCode);
// break;
}
#region
//Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode);
//if (stationManager.stationType == 8)
//{
// var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode);
// if (task != null)
// {
// RequestInNextAddress(conveyorLine, command, childDeviceCode);
// }
//}
//else if (stationManager.stationType == 9)
//{
// var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode);
// if (task != null)
// {
// ConveyorLineInFinish(conveyorLine, command, childDeviceCode);
// }
//}
//else if (stationManager.stationType == 1)
//{
// if (stationManager.stationArea.Contains("GW"))
// {
// var taskGW = _taskRepository.QueryFirst(x => x.TargetAddress == childDeviceCode && x.TaskState == (int)TaskOutStatusEnum.OutFinish);
// if (taskGW != null)
// {
// command.ConveyorLineBarcode = taskGW.PalletCode;
// }
// }
// RequestWmsTask(conveyorLine, command, childDeviceCode);
//}
//else if (stationManager.stationType == 10)
//{
// var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode);
// if (task != null)
// {
// RequestOutbound(conveyorLine, command, childDeviceCode);
// }
//}
//else if (stationManager.stationType == 11)
//{
// var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode);
// if (task != null)
// {
// RequestOutNextAddress(conveyorLine, command, childDeviceCode);
// }
//}
//else if (stationManager.stationType == 12)
//{
// var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode);
// if (task != null)
// {
// ConveyorLineOutFinish(conveyorLine, command, childDeviceCode);
// }
//}
#endregion
}
private void ExecuteStationAction(Dt_StationManager stationManager, CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
{
switch (stationManager.stationType)
{
case 8:
RequestInNextAddress(conveyorLine, command, childDeviceCode);
break;
case 9:
ConveyorLineInFinish(conveyorLine, command, childDeviceCode);
break;
case 10:
RequestOutbound(conveyorLine, command, childDeviceCode);
break;
case 11:
RequestOutNextAddress(conveyorLine, command, childDeviceCode);
break;
case 12:
ConveyorLineOutFinish(conveyorLine, command, childDeviceCode);
break;
case 6:
CreateAndSendEmptyTrayTask(conveyorLine, command, childDeviceCode);
break;
case 16:
AbNormalStationBZTask(conveyorLine, command, childDeviceCode);
break;
case 1:
//if (stationManager.stationArea.Contains("GW"))
//{
//var taskGW = _taskRepository.QueryFirst(x => x.TargetAddress == childDeviceCode && (x.TaskState == (int)TaskOutStatusEnum.OutFinish || x.TaskState == (int)TaskOutStatusEnum.OutPending));
//if (taskGW != null)
//{
// command.ConveyorLineBarcode = taskGW.PalletCode;
//}
//}
//如高温出库后任务标记NG异常则将任务更新为异常排出任务 --冠宇取消超时检测后 托盘超时不在出库至异常口
//Dt_Task NGtask = _taskRepository.QueryFirst(x => x.Remark == "NG" && x.Roadway == stationManager.Roadway && x.Roadway.Contains("GW"));
//if (NGtask != null)
//{
// CreateAbNormalOutbound(conveyorLine, command, childDeviceCode, NGtask);
// break;
//}
RequestWmsTask(conveyorLine, command, childDeviceCode,stationManager);
break;
}
}
///
/// 映射任务命令
///
private ConveyorLineTaskCommand_After MapTaskCommand(Dt_Task task, ConveyorLineTaskCommand_After command)
{
var comm = _mapper.Map(task);
comm.InteractiveSignal = command.InteractiveSignal;
return comm;
}
///
/// 完成WMS任务
///
private void CompleteWmsTask(Dt_Task taskOut, ConveyorLineTaskCommand_After command, CommonConveyorLine_GW conveyorLine, string childDeviceCode, int ProtocalDetailValue)
{
if (command.ConveyorLineBarcode == "NoRead")
{
var NGAddress = _platFormRepository.QueryFirst(x => x.PlatCode == taskOut.TargetAddress).Capacity;
taskOut.TargetAddress = NGAddress.ToString();
}
var keys = new Dictionary()
{
{"taskNum", taskOut.TaskNum}
};
var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue;
var completeTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.CompleteTask)?.ConfigValue;
if (wmsBase == null || completeTask == null)
{
throw new InvalidOperationException("WMS IP 未配置");
}
var wmsIpAddress = wmsBase + completeTask;
var result = HttpHelper.GetAsync(wmsIpAddress, keys).Result;
WebResponseContent content = JsonConvert.DeserializeObject(result);
if (content.Status)
{
//ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
_taskService.UpdateTaskStatusToNext(taskOut);
}
}
///
/// 创建并发送空托盘任务
///
public void CreateAndSendEmptyTrayTask(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
{
if (command.ConveyorLineBarcode != "NoRead")
{
//var config = _sys_ConfigService.GetByConfigKey("SYS_BASE", "ISFRINTRAY");
//if (config.ConfigValue == "1")
//{
// Random random = new Random();
// var task = new Dt_Task()
// {
// CurrentAddress = childDeviceCode,
// Grade = 1,
// NextAddress = "2066",
// PalletCode = command.ConveyorLineBarcode,
// Roadway = "FR",
// SourceAddress = childDeviceCode,
// TargetAddress = "2066",
// TaskNum = random.Next(1,9999),
// TaskType = (int)TaskInboundTypeEnum.InTray,
// TaskState = (int)TaskInStatusEnum.Line_InExecuting,
// WMSId = 0
// };
// var taskCommand = MapTaskCommand(task, command);
// conveyorLine.SendCommand(taskCommand, childDeviceCode);
//}
//else
//{
var taskDTO = CreateEmptyTrayTaskDto(command.ConveyorLineBarcode, childDeviceCode);
if (_taskRepository.QueryFirst(x => x.PalletCode == taskDTO.PalletCode) != null)
{
WriteInfo(conveyorLine.DeviceName, "当前托盘存在任务");
return;
}
var content = CreateAndSendTask(taskDTO);
if (content.Status)
{
var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode, command.ConveyorLineBarcode);
if (task != null)
{
var taskCommand = MapTaskCommand(task, command);
conveyorLine.SendCommand(taskCommand, childDeviceCode);
//ConveyorLineSendFinish(conveyorLine, childDeviceCode, true);
_taskService.UpdateTaskStatusToNext(task);
}
}
//}
}
}
///
/// 创建空托盘任务DTO
///
private WMSTaskDTO CreateEmptyTrayTaskDto(string barcode, string childDeviceCode)
{
var request = new RequestTaskDto()
{
Position = childDeviceCode,
PalletCode = barcode,
};
var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue;
var requestTrayInTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.RequestTrayInTask)?.ConfigValue;
if (wmsBase == null || requestTrayInTask == null)
{
throw new InvalidOperationException("WMS IP 未配置");
}
var wmsIpAddrss = wmsBase + requestTrayInTask;
var result = HttpHelper.PostAsync(wmsIpAddrss, request.ToJsonString()).Result;
if (result == null)
return new WMSTaskDTO();
WebResponseContent content = JsonConvert.DeserializeObject(result);
if (!content.Status)
return new WMSTaskDTO();
return JsonConvert.DeserializeObject(content.Data.ToString());
}
///
/// 请求WMS任务
///
private async void RequestWmsTask(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, Dt_StationManager stationManager)
{
//var taskGW = _taskRepository.QueryFirst(x => x.TargetAddress == childDeviceCode && (x.TaskState == (int)TaskOutStatusEnum.OutFinish || x.TaskState == (int)TaskOutStatusEnum.OutPending));
//if (taskGW != null)
// _taskRepository.DeleteData(taskGW);
if (command.ConveyorLineBarcode.IsNullOrEmpty()) return;
var content = await _taskService.RequestWMSTask(command.ConveyorLineBarcode, childDeviceCode);
if (content.Status)
{
var task = _taskService.QueryBarCodeConveyorLineTask(command.ConveyorLineBarcode, childDeviceCode);
if (task != null)
{
//conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTaskNum, task.TaskNum, childDeviceCode);
//conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, task.NextAddress, childDeviceCode);
//conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineBarcode, command.ConveyorLineBarcode, childDeviceCode);
var GWTask = _taskRepository.QueryData(x => x.Roadway.Contains("GWSC2") && x.SourceAddress == "1039" && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskInStatusEnum.Line_InFinish)).ToList();
if (GWTask.Count >= 2 && childDeviceCode == "1039" && task.Roadway.Contains("GWSC2"))
{
ConsoleHelper.WriteErrorLine($"托盘号:【{command.ConveyorLineBarcode}】高温二已存在【{GWTask.Count}】个任务大于2个任务不可下发");
return;
}
ConveyorLineTaskCommand_After taskCommand = _mapper.Map(task);
conveyorLine.SendCommand(taskCommand, childDeviceCode);
conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 1, childDeviceCode);
_taskService.UpdateTaskStatusToNext(task);
}
}
else
{
if (content.Message != "请求过于频繁,请稍后再试")
{
WriteInfo(conveyorLine.DeviceName, content.Message);
conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, stationManager.stationNGChildCode, childDeviceCode);
conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 1, childDeviceCode);
ConsoleHelper.WriteErrorLine($"【{conveyorLine.DeviceName}】托盘号:【{command.ConveyorLineBarcode}】请求点位:【{childDeviceCode}】异常信息【{content.Message}】");
WriteInfo(conveyorLine.DeviceName, $"【{conveyorLine.DeviceName}】托盘号:【{command.ConveyorLineBarcode}】请求点位:【{childDeviceCode}】异常信息【{content.Message}】");
}
}
}
///
/// 高温出库后任务完成 如果任务标识NG则将任务改为异常排出任务
///
///
///
///
///
///
private void CreateAbNormalOutbound(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, Dt_Task task)
{
Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode);
if (stationManager == null || string.IsNullOrWhiteSpace(stationManager.stationNGChildCode) || string.IsNullOrWhiteSpace(stationManager.stationNGLocation))
{
throw new Exception("未配置站台的对应NG口信息");
}
task.SourceAddress = task.TargetAddress;
task.TargetAddress = stationManager.stationNGLocation;
task.TaskState = (int)TaskOutStatusEnum.OutNew;
task.TaskType = (int)TaskOutboundTypeEnum.InToOut;
task.Grade = 10; //此处 出库至异常排出口的任务应除火警外最优先执行
_taskRepository.UpdateData(task);
//Dt_Task task= _taskRepository.QueryFirst(x=>)
//_taskRepository.QueryFirst()
}
///
/// 包装异常排出口逻辑
///
///
///
///
private void AbNormalStationBZTask(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
{
Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode && x.stationPLC == conveyorLine.DeviceCode);
if (command.ConveyorLineBarcode.IsNullOrEmpty())
{
conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 2, childDeviceCode);
return;
}
if (conveyorLine.ReadValue(ConveyorLineDBName_After.InteractiveSignal, childDeviceCode).ObjToInt() == 0) //托盘正反信号
{
};
conveyorLine.ReadValue(ConveyorLineDBName_After.InteractiveSignal, childDeviceCode); //托盘有无电芯信号
}
}
}