using HslCommunication;
using Newtonsoft.Json;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
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;
namespace WIDESEAWCS_Tasks
{
public partial class CommonConveyorLineJob
{
///
/// 处理出库任务
///
private void HandleTaskOut(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue, Dt_Task taskOut)
{
if (taskOut == null) return;
//ConveyorLineTaskCommand? taskCommand = MapTaskCommand(taskOut, command);
var next = taskOut.NextAddress;
var taskCommand = MapTaskCommand(taskOut, command);
taskOut.NextAddress = next;
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);
ConsoleHelper.WriteWarningLine($"【{conveyorLine._deviceName}】任务号:【{command.TaskNum}】,托盘条码:【{command.Barcode}】已到达【{childDeviceCode}】请求扫码入库,下一目标地址【{taskCommand.TargetAddress}】");
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 async void HandleNewTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue)
{
var stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode && x.stationPLC == conveyorLine.DeviceCode);
switch (stationManager.stationType)
{
case 5:
case 1:
await RequestWmsTask(conveyorLine, command, childDeviceCode, ProtocalDetailValue);
break;
case 2:
case 3:
case 4:
case 6:
await CreateAndSendEmptyTrayTask(conveyorLine, command, childDeviceCode, ProtocalDetailValue);
break;
case 7:
RequestOutNextAddress(conveyorLine, command, childDeviceCode, ProtocalDetailValue);
break;
case 10:
ConveyorLineOutFinish(conveyorLine, command, childDeviceCode, ProtocalDetailValue);
break;
default:
break;
}
//if ((conveyorLine.DeviceCode == "1003" && childDeviceCode == "1016") || (conveyorLine.DeviceCode == "1005" && childDeviceCode == "1048"))
//{
// await CreateAndSendEmptyTrayTask(conveyorLine, command, childDeviceCode, ProtocalDetailValue);
//}
//else if ((conveyorLine.DeviceCode == "1001" && childDeviceCode == "1088") || (conveyorLine.DeviceCode == "1004" && childDeviceCode == "1339"))
//{
// await RequestWmsTask(conveyorLine, command, childDeviceCode, ProtocalDetailValue);
//}
//else if ((conveyorLine.DeviceCode == "1001" && childDeviceCode == "1068"))
//{
// ConveyorLineOutFinish(conveyorLine, command, childDeviceCode, ProtocalDetailValue);
//}
}
///
/// 映射任务命令
///
private ConveyorLineTaskCommand MapTaskCommand(Dt_Task task, ConveyorLineTaskCommand command)
{
// 使用正则表达式匹配类似 -数字 的模式,并替换为空字符串
task.NextAddress = Regex.Replace(task.NextAddress, @"-(\d+)", "");
if (Convert.ToInt32(task.NextAddress) > 1999)
{
task.NextAddress = (Convert.ToInt32(task.NextAddress) - 1000).ToString();
}
var comm = _mapper.Map(task);
comm.InteractiveSignal = command.InteractiveSignal;
return comm;
}
///
/// 完成WMS任务
///
private void CompleteWmsTask(Dt_Task taskOut, ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, string childDeviceCode, int ProtocalDetailValue)
{
if (command.Barcode == "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 Task CreateAndSendEmptyTrayTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue)
{
if (command.Barcode != "NoRead")
{
var taskDTO = CreateEmptyTrayTaskDto(command.Barcode, childDeviceCode);
if (_taskRepository.QueryFirst(x => x.PalletCode == taskDTO.PalletCode) != null)
{
WriteInfo(conveyorLine.DeviceName, "当前托盘存在任务");
}
var content = CreateAndSendTask(taskDTO);
if (content.Status)
{
var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode);
if (task != null)
{
//var taskCommand = MapTaskCommand(task, command);
var next = task.NextAddress;
var taskCommand = MapTaskCommand(task, command);
task.NextAddress = next;
ConsoleHelper.WriteWarningLine($"【{conveyorLine._deviceName}】任务号:【{command.TaskNum}】,托盘条码:【{command.Barcode}】已到达【{childDeviceCode}】请求扫码入库(空托盘),下一目标地址【{taskCommand.TargetAddress}】");
conveyorLine.SendCommand(taskCommand, childDeviceCode);
ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
_taskService.UpdateTaskStatusToNext(task);
}
}
}
return Task.CompletedTask;
}
///
/// 创建空托盘任务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 Task RequestWmsTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue)
{
var content = await _taskService.RequestWMSTask(command.Barcode, childDeviceCode);
if (content.Status)
{
var task = _taskService.QueryBarCodeConveyorLineTask(command.Barcode, childDeviceCode);
if (task != null)
{
if (task.NextAddress.Contains("JZ"))
{
int nextStatus = task.TaskState.GetNextNotCompletedStatus();
task.TaskState = nextStatus;
ConsoleHelper.WriteWarningLine($"【{conveyorLine._deviceName}】任务号:【{task.TaskNum}】,托盘条码:【{task.PalletCode}】已到达【{childDeviceCode}】请求扫码入库(实盘),下一目标地址【{task.TargetAddress}】");
_taskService.UpdateTaskStatusToNext(task);
ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
}
else
{
//var taskCommand = MapTaskCommand(task, command);
var next = task.NextAddress;
var taskCommand = MapTaskCommand(task, command);
task.NextAddress = next;
ConsoleHelper.WriteWarningLine($"【{conveyorLine._deviceName}】任务号:【{command.TaskNum}】,托盘条码:【{command.Barcode}】已到达【{childDeviceCode}】请求扫码入库(实盘),下一目标地址【{taskCommand.TargetAddress}】");
conveyorLine.SendCommand(taskCommand, childDeviceCode);
ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
_taskService.UpdateTaskStatusToNext(task);
}
}
}
else
WriteInfo(conveyorLine.DeviceName, content.Message);
}
}
}