using HslCommunication;
|
using Newtonsoft.Json;
|
using Newtonsoft.Json.Linq;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
|
using Quartz;
|
using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Linq;
|
using System.Text;
|
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_ISystemServices;
|
using WIDESEAWCS_ITaskInfoRepository;
|
using WIDESEAWCS_ITaskInfoService;
|
using WIDESEAWCS_Model.Models;
|
using WIDESEAWCS_QuartzJob;
|
using WIDESEAWCS_Tasks.ConveyorLineJob;
|
using WIDESEAWCS_Tasks.ElevatorJob;
|
|
namespace WIDESEAWCS_Tasks
|
{
|
[DisallowConcurrentExecution]
|
public class CommonAGVJob : JobBase, IJob
|
{
|
private readonly ITaskRepository _taskRepository;
|
private readonly ITaskService _taskService;
|
private readonly ISys_ConfigService _sys_ConfigService;
|
public CommonAGVJob(ITaskRepository taskRepository,ITaskService taskService,ISys_ConfigService configService)
|
{
|
_taskRepository = taskRepository;
|
_taskService = taskService;
|
_sys_ConfigService = configService;
|
}
|
|
public Task Execute(IJobExecutionContext context)
|
{
|
var RelocationTask = _taskRepository.QueryData(x => _taskService.TaskAcrossFloorboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskAGVCarryStatusEnum.CarryNew);
|
if (RelocationTask.Count > 0)
|
{
|
foreach (var item in RelocationTask)
|
{
|
AGVSendTask(item);
|
}
|
}
|
|
#region AGV跨楼层任务
|
var AcrossFloorTask = _taskRepository.QueryFirst(x => x.TaskState == (int)TaskAcrossFloorStatusEnum.CarryNew);
|
if (AcrossFloorTask != null)
|
{
|
var task = _taskRepository.QueryFirst(x => x.TaskState > (int)TaskAcrossFloorStatusEnum.CarryNew && x.TaskState < (int)TaskAcrossFloorStatusEnum.EndAddressExecuting);
|
if(task == null)
|
{
|
CommonElevator? elevator = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "TSJ1") as CommonElevator;
|
if (elevator != null)
|
{
|
if (elevator.GetValue<ElevatorDBName, short>(ElevatorDBName.Model) == 1)
|
{
|
Relocation(AcrossFloorTask);
|
if (AcrossFloorTask.Floor == "1F")
|
{
|
elevator.SetValue(ElevatorDBName.FlagBit, Convert.ToInt16(1));
|
elevator.SetValue(ElevatorDBName.StartFloor, Convert.ToInt16(1));
|
elevator.SetValue(ElevatorDBName.EdnFloor, Convert.ToInt16(2));
|
Thread.Sleep(1000);
|
elevator.SetValue(ElevatorDBName.StartCommand, Convert.ToInt16(1));
|
|
_taskService.SendAgvTask("AAA", AcrossFloorTask.TaskNum);
|
AcrossFloorTask.TaskState = (int)TaskAcrossFloorStatusEnum.FirstCarry;
|
_taskRepository.UpdateData(AcrossFloorTask);
|
}
|
else
|
{
|
elevator.SetValue(ElevatorDBName.FlagBit, Convert.ToInt16(1));
|
elevator.SetValue(ElevatorDBName.StartFloor, Convert.ToInt16(2));
|
elevator.SetValue(ElevatorDBName.EdnFloor, Convert.ToInt16(1));
|
Thread.Sleep(1000);
|
elevator.SetValue(ElevatorDBName.StartCommand, Convert.ToInt16(1));
|
|
_taskService.SendAgvTask("DDD", AcrossFloorTask.TaskNum);
|
AcrossFloorTask.TaskState = (int)TaskAcrossFloorStatusEnum.FirstCarry;
|
_taskRepository.UpdateData(AcrossFloorTask);
|
}
|
}
|
}
|
}
|
}
|
#endregion
|
|
#region AGV同层搬运任务
|
|
|
Dt_Task Carry = _taskRepository.QueryFirst(x => _taskService.TaskAGVCarryboundStates.Contains(x.TaskState) && x.TaskState == (int)TaskAGVCarryStatusEnum.CarryNew);
|
if (Carry != null)
|
{
|
Relocation(Carry);
|
AGVSendTask(Carry);
|
}
|
|
#endregion
|
|
#region 1楼AGV入库任务
|
var InTask = _taskRepository.QueryFirst(x => x.TaskState == (int)TaskInStatusEnum.InNew);
|
if (InTask != null)
|
{
|
var OutTask = _taskRepository.QueryFirst(x => x.TaskState >= (int)TaskOutStatusEnum.OutNew && x.TaskState <(int)TaskOutStatusEnum.AGV_OutExecuting);
|
var task = _taskRepository.QueryFirst(x => x.TaskState > (int)TaskInStatusEnum.InNew && x.TaskState < (int)TaskInStatusEnum.SC_InExecuting);
|
if (OutTask == null && task == null)
|
{
|
CommonConveyorLine? conveyorLine = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "1001") as CommonConveyorLine;
|
if (conveyorLine != null)
|
{
|
bool IsWrite = false;
|
short InteractiveSignal = conveyorLine.GetValue<ConveyorLineDBName, short>(ConveyorLineDBName.InteractiveSignal, "LK001");
|
var structs = BitConverter.GetBytes(InteractiveSignal).Reverse().ToArray().ToBoolArray();
|
if (structs[0])
|
{
|
IsWrite = conveyorLine.Communicator.WriteNoRead("DB100.0", 0);
|
Thread.Sleep(1000);
|
IsWrite = conveyorLine.Communicator.WriteNoRead("DB100.0", 9999);
|
if (!IsWrite)
|
{
|
return Task.CompletedTask;
|
}
|
Relocation(InTask);
|
_taskService.SendAgvTask("LIFANG", InTask.TaskNum);
|
|
_taskService.UpdateTaskStatusToNext(InTask.TaskNum);
|
}
|
}
|
}
|
}
|
|
#endregion
|
|
return Task.CompletedTask;
|
}
|
|
public void AGVSendTask(Dt_Task task)
|
{
|
if (task.SourceAddress.Contains("XB001") || task.TargetAddress.Contains("XB001"))
|
{
|
_taskService.SendAgvTask("cattleCarry1", task.TaskNum);
|
task.TaskState = (int)TaskAGVCarryStatusEnum.AGV_CarryExecuting;
|
_taskRepository.UpdateData(task);
|
}
|
else if (task.Floor == "1F")
|
{
|
_taskService.SendAgvTask("forkAutoTemplate1", task.TaskNum);
|
task.TaskState = (int)TaskAGVCarryStatusEnum.AGV_CarryExecuting;
|
_taskRepository.UpdateData(task);
|
}
|
else
|
{
|
_taskService.SendAgvTask("cattleCarry1", task.TaskNum);
|
task.TaskState = (int)TaskAGVCarryStatusEnum.AGV_CarryExecuting;
|
_taskRepository.UpdateData(task);
|
}
|
}
|
|
|
public void Relocation(Dt_Task? task)
|
{
|
var taskDto = new RequestTaskDto()
|
{
|
Position = task.SourceAddress,
|
PalletCode = task.PalletCode,
|
TaskNum = task.TaskNum
|
};
|
|
// 获取WMSip地址
|
var configz = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
|
var wmsBasez = configz.Where(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE).FirstOrDefault()?.ConfigValue;
|
var requestLocation = configz.Where(x => x.ConfigKey == SysConfigKeyConst.AGVIsNeedRelocation).FirstOrDefault()?.ConfigValue;
|
if (wmsBasez == null || requestLocation == null)
|
{
|
throw new InvalidOperationException("WMS IP 未配置");
|
}
|
var wmsIpAddrss = wmsBasez + requestLocation;
|
|
var result = HttpHelper.PostAsync(wmsIpAddrss, taskDto.ToJsonString()).Result;
|
|
WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result);
|
|
if (!content.Status)
|
{
|
task.ExceptionMessage = content.Message;
|
_taskRepository.UpdateData(task);
|
return;
|
}
|
|
// 反序列化任务数据
|
var taskDTO = JsonConvert.DeserializeObject<List<WMSTaskDTO>>(content.Data.ToString());
|
bool IsAddTask = false;
|
foreach (var t in taskDTO)
|
{
|
if (t.TaskNum == task.TaskNum)
|
{
|
IsAddTask = false;
|
break;
|
}
|
else
|
{
|
IsAddTask = true;
|
}
|
}
|
if (IsAddTask)
|
_taskService.ReceiveWMSTask(taskDTO);
|
|
var taskNew = _taskRepository.QueryData(x => _taskService.TaskRelocationboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskAGVCarryStatusEnum.CarryNew);
|
if (taskNew.Count > 0)
|
{
|
if (taskNew[0].Floor == "2F")
|
{
|
foreach (var item in taskNew.OrderBy(x => x.Grade).ToList())
|
{
|
AGVSendTask(item);
|
}
|
}
|
else
|
{
|
foreach (var item in taskNew.OrderByDescending(x => x.Grade).ToList())
|
{
|
AGVSendTask(item);
|
}
|
}
|
}
|
}
|
}
|
}
|