using Autofac.Core;
|
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Mvc;
|
using System.Text;
|
using System.Text.RegularExpressions;
|
using WIDESEA_DTO.Agv;
|
using WIDESEA_External.Model;
|
using WIDESEAWCS_Common;
|
using WIDESEAWCS_Common.APIEnum;
|
using WIDESEAWCS_Common.TaskEnum;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_Core.Enums;
|
using WIDESEAWCS_Core.Helper;
|
using WIDESEAWCS_Core.LogHelper;
|
using WIDESEAWCS_DTO;
|
using WIDESEAWCS_DTO.Agv;
|
using WIDESEAWCS_DTO.TaskInfo;
|
using WIDESEAWCS_IBasicInfoRepository;
|
using WIDESEAWCS_ITaskInfoRepository;
|
using WIDESEAWCS_ITaskInfoService;
|
using WIDESEAWCS_Model.Models;
|
using WIDESEAWCS_QuartzJob;
|
using WIDESEAWCS_QuartzJob.DTO;
|
using WIDESEAWCS_QuartzJob.Models;
|
using WIDESEAWCS_QuartzJob.Repository;
|
using WIDESEAWCS_Tasks;
|
using WIDESEAWCS_Tasks.DBNames;
|
using static Dm.net.buffer.ByteArrayBuffer;
|
|
namespace WIDESEAWCS_Server.Controllers
|
{
|
[Route("api/[controller]")]
|
[ApiController]
|
public class AGVController : ControllerBase
|
{
|
private readonly IStationMangerRepository _stationMangerRepository;
|
private readonly ITaskService _taskService;
|
private readonly ITaskRepository _taskRepository;
|
private readonly IRouterRepository _routerRepository;
|
|
public AGVController(IStationMangerRepository stationMangerRepository, ITaskService taskService, ITaskRepository taskRepository,IRouterRepository routerRepository)
|
{
|
_stationMangerRepository = stationMangerRepository;
|
_taskService = taskService;
|
_taskRepository = taskRepository;
|
_routerRepository = routerRepository;
|
}
|
/// <summary>
|
/// AGV任务更新
|
/// </summary>
|
/// <returns></returns>
|
[HttpPost, HttpGet, Route("Callback"), AllowAnonymous]
|
public WebResponseContent? Callback([FromBody]AgvUpdateDTO agvUpdateDTO)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
var task = _taskRepository.QueryFirst(x => (agvUpdateDTO.ContainerCode ?? "")==x.PalletCode);
|
switch (agvUpdateDTO.MissionStatus)
|
{
|
case nameof(AGVStatusEnum.PICKER_RECEIVE):
|
if (task == null) throw new Exception($"未找到料箱【{agvUpdateDTO.ContainerCode}】任务");
|
_taskService.UpdateTask(task, TaskStatusEnum.AGV_TakeFinish);
|
break;
|
case nameof(AGVStatusEnum.PICKER_SEND):
|
if (task == null) throw new Exception($"未找到料箱【{agvUpdateDTO.ContainerCode}】任务");
|
_taskService.TaskCompleted(task.TaskNum);
|
break;
|
case nameof(AGVStatusEnum.WAITFEEDBACK):
|
//AGV放行
|
List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x=>x.StationType==StationTypeEnum.StationType_OnlyInbound.ObjToInt());
|
if (!stationMangers.Select(x=>x.StationCode).Contains(agvUpdateDTO.CurrentPosition))
|
{
|
WebResponseContent responseContent = _taskService.AgvTaskFlow(agvUpdateDTO.MissionCode);
|
if (!responseContent.Status) throw new Exception($"{responseContent.Message}");
|
}
|
break;
|
default:
|
break;
|
}
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// AGV任务请求
|
/// </summary>
|
/// <returns></returns>
|
[HttpPost, HttpGet, Route("WorkRequest"), AllowAnonymous]
|
public AgvTaskReqContent WorkRequest([FromBody] AgvTaskRequestDTO agvTaskRequestDTO)
|
{
|
AgvTaskReqContent content = new AgvTaskReqContent();
|
try
|
{
|
//获取任务
|
Dt_Task? taskExist = _taskRepository.QueryFirst(x=>x.PalletCode==agvTaskRequestDTO.ContainerCode) ?? throw new Exception($"未找到料箱{agvTaskRequestDTO.ContainerCode}任务");
|
//获取站台
|
Dt_StationManger? stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == agvTaskRequestDTO.PositionId) ?? throw new Exception($"未找到{agvTaskRequestDTO.PositionId}站台位置");
|
IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode) ?? throw new Exception($"未找到对应设备{stationManger.StationDeviceCode}");
|
|
OtherDevice commonConveyorLine = (OtherDevice)device;
|
|
if (stationManger.StationType==StationTypeEnum.StationType_OnlyOutbound.ObjToInt())
|
{
|
short IsPut = commonConveyorLine.Communicator.Read<short>("0");
|
if (IsPut != 256) throw new Exception($"{agvTaskRequestDTO.PositionId}禁止放箱");
|
}
|
else
|
{
|
short IsTake = commonConveyorLine.Communicator.Read<short>("11");
|
if (IsTake != 256) throw new Exception($"{agvTaskRequestDTO.PositionId}禁止取箱");
|
}
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// AGV作业完成
|
/// </summary>
|
/// <returns></returns>
|
[HttpPost, HttpGet, Route("WorkFinish"), AllowAnonymous]
|
public AgvTaskReqContent WorkFinish([FromBody] AgvTaskRequestDTO agvTaskRequestDTO)
|
{
|
AgvTaskReqContent content = new AgvTaskReqContent();
|
try
|
{
|
//获取站台
|
Dt_StationManger? stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == agvTaskRequestDTO.PositionId) ?? throw new Exception($"未找到{agvTaskRequestDTO.PositionId}站台位置");
|
IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode) ?? throw new Exception($"未找到对应设备{stationManger.StationDeviceCode}");
|
|
OtherDevice commonConveyorLine = (OtherDevice)device;
|
|
if (stationManger.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt())
|
{
|
commonConveyorLine.Communicator.Write("21", (short)256);
|
}
|
else
|
{
|
commonConveyorLine.Communicator.Write("23", (short)256);
|
}
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
if (ex.Message.Contains("数据写入,地址:【23】,写入的数据:【256】") || ex.Message.Contains("数据写入,地址:【21】,写入的数据:【256】"))
|
{
|
content.OK();
|
}
|
else
|
{
|
content.Error(ex.Message);
|
}
|
}
|
return content;
|
}
|
}
|
}
|