using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using HslCommunication;
using WIDESEAWCS_DTO.WMS;
using WIDESEAWCS_Common;
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.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;
}
#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 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;
}
}
RequestWmsTask(conveyorLine, command, childDeviceCode);
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 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);
}
}
}
}
///
/// 创建空托盘任务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)
{
var taskGW = _taskRepository.QueryFirst(x => x.TargetAddress == childDeviceCode && (x.TaskState == (int)TaskOutStatusEnum.OutFinish || x.TaskState == (int)TaskOutStatusEnum.OutPending));
if (taskGW != null)
_taskRepository.DeleteData(taskGW);
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(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);
_taskRepository.AddData(taskGW);
}
}
}
}