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.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)
{
RequestOutNextAddress(conveyorLine, command, childDeviceCode);
}
}
}
///
/// 映射任务命令
///
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);
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);
}
}
}
}