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 OfficeOpenXml.ConditionalFormatting;
|
using WIDESEAWCS_DTO.WMS;
|
|
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;
|
|
// 映射任务命令
|
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.Outbound && taskOut.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting)
|
{
|
// 完成WMS任务
|
CompleteWmsTask(taskOut, command, conveyorLine, childDeviceCode, ProtocalDetailValue);
|
}
|
}
|
|
/// <summary>
|
/// 处理新任务
|
/// </summary>
|
private void HandleNewTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue)
|
{
|
// 特定条件下创建并发送空托盘入库任务
|
if ((conveyorLine.DeviceCode == "1003" && childDeviceCode == "1016") || (conveyorLine.DeviceCode == "1005" && childDeviceCode == "1048"))
|
{
|
// 请求WMS空托盘任务
|
CreateAndSendEmptyTrayTask(conveyorLine, command, childDeviceCode, ProtocalDetailValue);
|
}
|
else if ((conveyorLine.DeviceCode == "1001" && childDeviceCode == "1088")||(conveyorLine.DeviceCode == "1004" && childDeviceCode == "1339"))
|
{
|
// 请求WMS入库任务
|
RequestWmsTask(conveyorLine, command, childDeviceCode, ProtocalDetailValue);
|
}
|
else if ((conveyorLine.DeviceCode == "1001" && childDeviceCode == "1073") || (conveyorLine.DeviceCode == "1003" && childDeviceCode == "1002"))
|
{
|
//TODO 发送直接去NG口任务
|
}
|
}
|
|
/// <summary>
|
/// 映射任务命令
|
/// </summary>
|
private ConveyorLineTaskCommand MapTaskCommand(Dt_Task task, ConveyorLineTaskCommand command)
|
{
|
// 使用mapper映射任务命令
|
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)
|
{
|
// 如果没有条码信息,则设置目标地址为NG地址
|
if (command.Barcode == "NoRead")
|
{
|
var NGAddress = _platFormRepository.QueryFirst(x => x.PlatCode == taskOut.TargetAddress).Capacity;
|
taskOut.TargetAddress = NGAddress.ToString();
|
}
|
|
// TODO调用WMS任务完成接口
|
var result = HttpHelper.GetAsync("http://127.0.0.1:8098/api/Task/CompleteTaskAsync", new { taskNum = taskOut.TaskNum }.ToJsonString()).Result;
|
WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result);
|
if (content.Status)
|
{
|
// 标记发送完成
|
ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
|
// 更新任务状态
|
_taskService.UpdateTaskStatusToNext(taskOut);
|
}
|
}
|
|
/// <summary>
|
/// 创建并发送空托盘任务
|
/// </summary>
|
public void CreateAndSendEmptyTrayTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue)
|
{
|
if (command.Barcode != "NoRead")
|
{
|
// 创建空托盘任务DTO
|
WMSTaskDTO taskDTO = CreateEmptyTrayTaskDto(command.Barcode, childDeviceCode);
|
// 创建并发送任务
|
WebResponseContent content = CreateAndSendTask(taskDTO);
|
if (content.Status)
|
{
|
// 查询任务
|
Dt_Task task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode);
|
if (task != null)
|
{
|
// 映射任务命令
|
ConveyorLineTaskCommand taskCommand = MapTaskCommand(task, command);
|
// 发送命令到输送线
|
conveyorLine.SendCommand(taskCommand, childDeviceCode);
|
// 标记发送完成
|
ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
|
// 更新任务状态
|
_taskService.UpdateTaskStatusToNext(task);
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 创建空托盘任务DTO
|
/// </summary>
|
private WMSTaskDTO CreateEmptyTrayTaskDto(string barcode, string childDeviceCode)
|
{
|
// 创建并返回空托盘任务DTO
|
//return new WMSTaskDTO
|
//{
|
// TaskNum = Convert.ToInt32(DateTime.Now.ToString("HHmmss")),
|
// Grade = 1,
|
// PalletCode = barcode,
|
// RoadWay = "JZSC01",
|
// SourceAddress = childDeviceCode,
|
// TargetAddress = "JZSC01",
|
// TaskState = (int)TaskInStatusEnum.InNew,
|
// Id = 0,
|
// TaskType = (int)TaskInboundTypeEnum.InTray,
|
//};
|
|
#region 向WMS请求空托盘任务
|
|
WMSTaskDTO wMSTaskDTO = new WMSTaskDTO();
|
RequestTaskDto request = new RequestTaskDto()
|
{
|
Position = childDeviceCode,
|
PalletCode = barcode,
|
};
|
var result = HttpHelper.PostAsync("http:127.0.0.1:8098/api/Task/RequestTaskAsync", request.ToJsonString()).Result;
|
|
WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result);
|
|
// 检查状态并返回
|
if (!content.Status)
|
return wMSTaskDTO;
|
|
return JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString());
|
|
#endregion 向WMS请求空托盘任务
|
}
|
|
/// <summary>
|
/// 请求WMS任务
|
/// </summary>
|
private void RequestWmsTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue)
|
{
|
// 请求WMS任务
|
if (_taskService.RequestWMSTask(command.Barcode, childDeviceCode).Status)
|
{
|
// 查询任务
|
Dt_Task task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode);
|
if (task != null)
|
{
|
// 映射任务命令
|
ConveyorLineTaskCommand taskCommand = MapTaskCommand(task, command);
|
// 发送命令到输送线
|
conveyorLine.SendCommand(taskCommand, childDeviceCode);
|
// 标记发送完成
|
ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
|
// 更新任务状态
|
_taskService.UpdateTaskStatusToNext(task);
|
}
|
}
|
}
|
}
|
}
|