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
|
{
|
/// <summary>
|
/// 处理出库任务
|
/// </summary>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 处理新任务
|
/// </summary>
|
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);
|
//}
|
}
|
|
/// <summary>
|
/// 映射任务命令
|
/// </summary>
|
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<ConveyorLineTaskCommand>(task);
|
comm.InteractiveSignal = command.InteractiveSignal;
|
return comm;
|
}
|
|
/// <summary>
|
/// 完成WMS任务
|
/// </summary>
|
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<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 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;
|
}
|
|
/// <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 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<TaskInStatusEnum>();
|
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);
|
}
|
}
|
}
|