using Microsoft.AspNetCore.Mvc;
using PlcSiemens.Core.Extension;
using ServiceCenter.SqlSugars;
using WCS.Core;
using WCS.Entity;
using WCS.Entity.Protocol.Station;
using WCS.WorkEngineering.Extensions;
using WCS.WorkEngineering.Systems;
using WCS.WorkEngineering.WebApi.Models.AGV;
using WCS.WorkEngineering.WebApi.Models.AGV.Request;
using WCS.WorkEngineering.WebApi.Models.AGV.Response;
namespace WCS.WorkEngineering.WebApi.Controllers
{
///
/// AGV相关接口控制器
///
[ApiController]
[Route("api/[controller]/[action]")]
public class AgvController : ControllerBase
{
///
/// AGV任务下发测试
///
/// 任务类型
/// RFID
/// 目标位置
///
[HttpPost]
public string AgvDebug(int type, string code, string pos)
{
try
{
switch (type)
{
case 1:
AgvApi.机台补空(pos, code, "1");
break;
case 2:
//AgvApi.机台补满();
break;
case 3:
AgvApi.满轮入库(code, pos, Guid.NewGuid().ToString().Replace("-", ""), "1");
break;
default:
break;
}
return "成功";
}
catch (Exception ex)
{
return $"Error-----" +
$"{ex.Message}------" +
$"{ex.StackTrace}";
}
}
///
/// 背负式agv请求出库任务
///
/// 请求参数
///
[HttpPost]
public ApplyEmptySpoolResponse ApplyEmptySpool([FromBody] AgvFillEmptySpaceRequest reqDto)
{
ApplyEmptySpoolResponse agvFill = new ApplyEmptySpoolResponse();
var obj = World.GetSystemInstance().Invoke("输送机") as List;
// 检测三个站台是否有货
obj = obj.Where(v => v.Entity.Code is "1012" or "1014" or "1016").Where(v => v.Data3.Status.HasFlag(StatusEunm.PH_Status)).ToList();
if (!obj.Any())
{
agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
agvFill.ResMsg = "无空轮";
return agvFill;
}
var res = WmsApi.GetTunnelEmptyConCount();
foreach (var item in res.ResDataList)
{
var station = Device.All.Where(v => v.Code == "TY" + item.Tunnel.ToString())
.Select(v => v.Targets).SelectMany(v => v)
.Where(v => v.HasProtocol(typeof(IStation520)))
.Where(v => v.Code is "1012" or "1014" or "1016")
.FirstOrDefault();
item.Tunnel = station.ToInt();
}
var stationNo = res.ResDataList.OrderBy(v => v.Count).Select(v => v.Tunnel.ToString()).ToList();
agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.Sucess;
agvFill.LocCode = obj.MinBy(v => stationNo.IndexOf(v.Entity.Code)).Entity.Code;
agvFill.SpoolType = "4";
agvFill.ResMsg = "";
return agvFill;
}
///
/// AGV执行回调
///
///
///
[HttpPost]
public AgvCallbackResponse AgvCallback([FromBody] AgvCallbackRequest reqDto)
{
var msg = "成功";
var code = AgvResponseCode.Success;
try
{
SqlSugarHelper.Do(db =>
{
//跟据AGVid找到对应的AGV任务
var agvTask = db.Default.Queryable().SplitTable(tabs => tabs.Take(1)).First(v => v.AgvID == reqDto.taskCode);
if (agvTask == null)
{
msg = "未找到对应的AGV任务";
code = AgvResponseCode.Fail;
}
switch (reqDto.method)
{
case "applyContinue": //表示请求巷道
agvTask.Status = AGVTaskStatus.RequestOrPermission1;
break;
case "applySecurity": //表示请求放货或取货
agvTask.Status = AGVTaskStatus.RequestOrPermission2;
break;
case "hjend_2": //补空任务完成
agvTask.Status = AGVTaskStatus.MissionCompleted;
break;
case "endhjBM": //取满任务完成
agvTask.Status = AGVTaskStatus.MissionCompleted;
break;
case "tcEnd": //机台补空任务完成
agvTask.Status = AGVTaskStatus.MissionCompleted;
break;
case "applyEmpty": //申请补空任务
db.Default.Insertable(new WCS_AgvTaskInfo()
{
AgvID = reqDto.taskCode,
TaskType = AGVTaskType.CallForMaterial,
Status = AGVTaskStatus.NewBuild,
}).AddQueue();
AgvApi.缓存架补空(reqDto.taskCode, "1016");
break;
case "exc_end": //异常信息上抛-值不匹配
agvTask.Status = AGVTaskStatus.MissionCompleted;
break;
default:
break;
}
db.Default.Updateable(agvTask).SplitTable().ExecuteCommand();
});
}
catch (Exception ex)
{
code = AgvResponseCode.Error;
msg = ex.Message;
}
var res = new AgvCallbackResponse() { code = code, message = msg };
return res;
}
}
}