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
|
{
|
/// <summary>
|
/// 处理出库任务
|
/// </summary>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 处理新任务
|
/// </summary>
|
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.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, 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);
|
break;
|
}
|
}
|
|
/// <summary>
|
/// 映射任务命令
|
/// </summary>
|
private ConveyorLineTaskCommand_After MapTaskCommand(Dt_Task task, ConveyorLineTaskCommand_After command)
|
{
|
var comm = _mapper.Map<ConveyorLineTaskCommand_After>(task);
|
comm.InteractiveSignal = command.InteractiveSignal;
|
return comm;
|
}
|
|
/// <summary>
|
/// 完成WMS任务
|
/// </summary>
|
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<string, object>()
|
{
|
{"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<WebResponseContent>(result);
|
if (content.Status)
|
{
|
//ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
|
_taskService.UpdateTaskStatusToNext(taskOut);
|
}
|
}
|
|
/// <summary>
|
/// 创建并发送空托盘任务
|
/// </summary>
|
public void CreateAndSendEmptyTrayTask(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
|
{
|
if (command.ConveyorLineBarcode != "NoRead")
|
{
|
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);
|
if (task != null)
|
{
|
var taskCommand = MapTaskCommand(task, command);
|
conveyorLine.SendCommand(taskCommand, childDeviceCode);
|
//ConveyorLineSendFinish(conveyorLine, childDeviceCode, true);
|
_taskService.UpdateTaskStatusToNext(task);
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 创建空托盘任务DTO
|
/// </summary>
|
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<WebResponseContent>(result);
|
if (!content.Status)
|
return new WMSTaskDTO();
|
|
return JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString());
|
}
|
|
/// <summary>
|
/// 请求WMS任务
|
/// </summary>
|
private async void RequestWmsTask(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
|
{
|
//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);
|
ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task);
|
conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 1, childDeviceCode);
|
conveyorLine.SendCommand(taskCommand, childDeviceCode);
|
//ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
|
_taskService.UpdateTaskStatusToNext(task);
|
}
|
}
|
else
|
{
|
WriteInfo(conveyorLine.DeviceName, content.Message);
|
ConsoleHelper.WriteErrorLine($"【{conveyorLine.DeviceName}】托盘号:【{command.ConveyorLineBarcode}】请求点位:【{childDeviceCode}】异常信息【{content.Message}】");
|
//_taskRepository.AddData(taskGW);
|
}
|
}
|
|
/// <summary>
|
/// 高温出库后任务完成 如果任务标识NG则将任务改为异常排出任务
|
/// </summary>
|
/// <param name="conveyorLine"></param>
|
/// <param name="command"></param>
|
/// <param name="childDeviceCode"></param>
|
/// <param name="task"></param>
|
/// <exception cref="Exception"></exception>
|
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()
|
}
|
|
/// <summary>
|
/// 包装异常排出口逻辑
|
/// </summary>
|
/// <param name="conveyorLine"></param>
|
/// <param name="command"></param>
|
/// <param name="childDeviceCode"></param>
|
private void AbNormalStationBZTask(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
|
{
|
Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode && x.stationPLC == conveyorLine.DeviceCode);
|
|
|
}
|
|
}
|
}
|