using WCS.Framework.DataTypes;
using WCS.Framework.DataTypes.ExtensionMethods;
using WCS.Framework.Log;
using WCS.HikRobot.SDK;
using WCS.HikRobot.SDK.ApiName;
using WCS.HikRobot.SDK.Model;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
namespace Git.HikAgv.App.Server
{
public partial class AgvCallbackServiceController : ApiController
{
private Log log = Log.Instance(typeof(AgvCallbackServiceController));
/// <summary>
/// 测试连接
/// </summary>
/// <returns></returns>
[HttpGet]
public HikDataResult TestAgv()
{
HikDataResult HikDataResult = new HikDataResult();
HikDataResult.code = (int)EHikResponseCode.Success;
HikDataResult.message = "测试连接成功";
return HikDataResult;
}
/// <summary>
/// AGV 执行回调的方法,包含任务开始,走出储位,任务完成及任务取消。取消通知为任务单,其他通知为单个任务组或子任务。
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public HikDataResult<string> AgvCallback([FromBody] TaskCallbackDTO entity)
{
HikDataResult<string> HikDataResult = new HikDataResult<string>();
log.Info("AGV 执行回调的方法: " + HikJsonHelper.SerializeObject(entity));
string reqCode = entity.reqCode; //请求唯一编号
string currentPositionCode = entity.currentPositionCode; //当前所在的地图坐标
string podCode = entity.podCode; //AGV搬运的货架编号
string method = entity.method; //参数方法,用于各个模板回传的参数判断
string robotCode = entity.robotCode; //AGV编号
string taskCode=entity.taskCode;
log.Info(string.Format("reqCode:{0} ; taskCode:{1} ; method:{2} ;podCode:{3} ;currentPositionCode:{4} ;", reqCode,taskCode, method,podCode, currentPositionCode));
//坐标转换
List<PositionEntity> ListMap = DomainContext.ListMap;
ListMap = ListMap.IsNull() ? new List<PositionEntity>() : ListMap;
if (currentPositionCode.IsNotEmpty())
{
PositionEntity Position = ListMap.FirstOrDefault(item => item.PositionCode == currentPositionCode);
if (Position == null)
{
HikDataResult.code = (int)EHikResponseCode.Exception;
HikDataResult.message = string.Format("{0}:对应的坐标点数据配置不正确, 请核对", currentPositionCode);
log.Info("坐标异常:->" + HikDataResult.message);
return HikDataResult;
}
}
log.Info("判断回传的参数:-->" + method);
/**路线一:开始任务和结束任务监控**/
if (method == "btnStartOne")
{
AgvTaskEntity TaskModel = new AgvTaskEntity();
TaskModel.reqCode = reqCode;
TaskModel.currentPositionCode = currentPositionCode;
TaskModel.podCode = podCode;
TaskModel.method = method;
TaskModel.robotCode = robotCode;
TaskModel.TaskType = "T01";
TaskModel.taskCode = taskCode;
log.Info("[btnStartOne]请求号1:{"+taskCode+"}的搬运任务" + HikJsonHelper.SerializeObject(TaskModel));
TaskModel.EndPositionName = "Apply_A-1";
PositionEntity PositionModel = ListMap.FirstOrDefault(item => item.PositionName == TaskModel.EndPositionName);
if (PositionModel != null)
{
TaskModel.EndPositionCode = PositionModel.PositionCode;
}
log.Info("[btnStartOne]请求号2:{" + taskCode + "}的搬运任务" + HikJsonHelper.SerializeObject(TaskModel));
DomainContext.AgvTask = TaskModel;
}
else if (method == "btnEndOne")
{
AgvTaskEntity TaskModel = DomainContext.AgvTask;
if (TaskModel == null)
{
HikDataResult.code = (int)EHikResponseCode.Exception;
HikDataResult.message = string.Format("[btnEndOne]请求号:{0}的搬运任务,在P1暂停点任务与系统记录不一致", taskCode);
log.Info("坐标异常:->" + HikDataResult.message);
return HikDataResult;
}
if (podCode.IsEmpty())
{
HikDataResult.code = (int)EHikResponseCode.Exception;
HikDataResult.message = string.Format("[btnEndOne]请求号:{0}的搬运任务,在P1暂停点没有货架,不能继续搬运", taskCode);
log.Info("坐标异常:->" + HikDataResult.message);
return HikDataResult;
}
TaskModel.currentPositionCode = currentPositionCode;
TaskModel.podCode = podCode;
TaskModel.method = method;
TaskModel.robotCode = robotCode;
TaskModel.TaskType = "T01";
TaskModel.taskCode = taskCode;
if (TaskModel.currentPositionCode.IsNotEmpty())
{
GenTaskRequestDTO StartModel = new GenTaskRequestDTO();
StartModel.reqCode = ConvertHelper.NewGuid().SubString(25);
StartModel.reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
StartModel.clientCode = "WMS";
StartModel.agvCode = TaskModel.robotCode;
StartModel.podCode = TaskModel.podCode;
StartModel.taskCode = ConvertHelper.NewGuid().SubString(25);
StartModel.positionCodePath = new List<PositionDTO>();
//目标点坐标
PositionEntity EndBin = ListMap.Where(item => item.PositionName == "A-1" || item.PositionName == "A-2")
.Where(item => item.HasCon == (int)EHikBool.No && item.PodCode.IsEmpty())
.FirstOrDefault();
//PositionEntity EndBin = ListMap.Where(item => item.PositionName == "A-2")
// .Where(item => item.HasCon == (int)EHikBool.No && item.PodCode.IsEmpty())
// .FirstOrDefault();
if (EndBin == null)
{
HikDataResult.code = (int)EHikResponseCode.Exception;
HikDataResult.message = string.Format("[btnEndOne]请求号:{0}的搬运任务,在A-1,A-2中无可搬运的目标点", reqCode);
log.Info("坐标异常:->" + HikDataResult.message);
return HikDataResult;
}
//起始点坐标
PositionEntity BeginBin = ListMap.FirstOrDefault(item => item.PositionCode == currentPositionCode);
//StartModel.positionCodePath.Add(new PositionDTO() { positionCode = BeginBin.PositionCode, type = "00" });
PositionEntity HalfwayBin = null;
//确定目标坐标点以及中途停顿点
if (EndBin.PositionName == "A-2")
{
StartModel.taskTyp = "T03";
HalfwayBin = ListMap.Where(item => item.PositionName == "Apply_A-2").FirstOrDefault();
if (HalfwayBin != null)
{
StartModel.positionCodePath.Add(new PositionDTO() { positionCode = HalfwayBin.PositionCode, type = "00" });
}
}
else if (EndBin.PositionName == "A-1")
{
StartModel.taskTyp = "T04";
HalfwayBin = ListMap.Where(item => item.PositionName == "Apply_A-3").FirstOrDefault();
if (HalfwayBin != null)
{
StartModel.positionCodePath.Add(new PositionDTO() { positionCode = HalfwayBin.PositionCode, type = "00" });
}
}
StartModel.positionCodePath.Add(new PositionDTO() { positionCode = EndBin.PositionCode, type = "00" });
if (HalfwayBin != null)
{
StartModel.positionCodePath.Add(new PositionDTO() { positionCode = HalfwayBin.PositionCode, type = "00" });
}
//搬运任务状态的变更
TaskModel = new AgvTaskEntity();
TaskModel.reqCode = StartModel.reqCode;
TaskModel.currentPositionCode = currentPositionCode;
TaskModel.podCode = podCode;
TaskModel.method = "";
TaskModel.robotCode = robotCode;
TaskModel.TaskType = StartModel.taskTyp;
TaskModel.taskCode = StartModel.taskCode;
if (BeginBin != null)
{
TaskModel.StartPositionCode = BeginBin.PositionCode;
TaskModel.StartPositionName = BeginBin.PositionName;
}
if (HalfwayBin != null)
{
TaskModel.HalfwayPositionCode = HalfwayBin.PositionCode;
TaskModel.HalfwayPositionName = HalfwayBin.PositionName;
}
if (EndBin != null)
{
TaskModel.EndPositionCode = EndBin.PositionCode;
TaskModel.EndPositionName = EndBin.PositionName;
}
DomainContext.AgvTask = TaskModel;
log.Info("[btnEndOne]第一条生产线搬运控制权转移: " + HikJsonHelper.SerializeObject(StartModel));
IHikTopClient client = new HikTopClientDefault();
JObject param = JObject.Parse(HikJsonHelper.SerializeObject(StartModel));
string Content = client.Execute(TaskApiName.TaskApiName_genAgvSchedulingTask, param);
log.Info("[btnEndOne]第一条生产线搬运控制权转移下发任务结果:" + Content);
}
}
/**路线二:开始任务和结束任务监控**/
else if (method == "btnStartTwo")
{
AgvTaskEntity TaskModel = new AgvTaskEntity();
TaskModel.reqCode = reqCode;
TaskModel.currentPositionCode = currentPositionCode;
TaskModel.podCode = podCode;
TaskModel.method = method;
TaskModel.robotCode = robotCode;
TaskModel.taskCode = taskCode;
TaskModel.TaskType = "T02";
TaskModel.EndPositionName = "Apply_A-1";
log.Info("[btnStartTwo]请求号1:{"+taskCode+"}的搬运任务" + HikJsonHelper.SerializeObject(TaskModel));
PositionEntity PositionModel = ListMap.FirstOrDefault(item => item.PositionName == TaskModel.EndPositionName);
if (PositionModel != null)
{
TaskModel.EndPositionCode = PositionModel.PositionCode;
}
log.Info("[btnStartTwo]请求号2:{" + taskCode + "}的搬运任务" + HikJsonHelper.SerializeObject(TaskModel));
DomainContext.AgvTask = TaskModel;
}
else if (method == "btnEndTwo")
{
AgvTaskEntity TaskModel = DomainContext.AgvTask;
if (TaskModel == null)
{
HikDataResult.code = (int)EHikResponseCode.Exception;
HikDataResult.message = string.Format("[btnEndTwo]请求号:{0}的搬运任务,在P1暂停点任务与系统记录不一致", taskCode);
log.Info("坐标异常:->" + HikDataResult.message);
return HikDataResult;
}
if (podCode.IsEmpty())
{
HikDataResult.code = (int)EHikResponseCode.Exception;
HikDataResult.message = string.Format("[btnEndTwo]请求号:{0}的搬运任务,在P1暂停点没有货架,不能继续搬运", taskCode);
log.Info("坐标异常:->" + HikDataResult.message);
return HikDataResult;
}
TaskModel.currentPositionCode = currentPositionCode;
TaskModel.podCode = podCode;
TaskModel.method = method;
TaskModel.robotCode = robotCode;
TaskModel.taskCode = taskCode;
TaskModel.TaskType = "T02";
if (TaskModel.currentPositionCode.IsNotEmpty())
{
GenTaskRequestDTO StartModel = new GenTaskRequestDTO();
StartModel.reqCode = ConvertHelper.NewGuid().SubString(25);
StartModel.reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
StartModel.clientCode = "WMS";
StartModel.agvCode = TaskModel.robotCode;
StartModel.podCode = TaskModel.podCode;
StartModel.taskCode = ConvertHelper.NewGuid().SubString(25);
StartModel.positionCodePath = new List<PositionDTO>();
//目标点坐标
PositionEntity EndBin = ListMap.Where(item => item.PositionName == "C-1" || item.PositionName == "C-2")
.Where(item => item.HasCon == (int)EHikBool.No && item.PodCode.IsEmpty())
.FirstOrDefault();
//PositionEntity EndBin = ListMap.Where(item => item.PositionName == "C-2")
// .Where(item => item.HasCon == (int)EHikBool.No && item.PodCode.IsEmpty())
// .FirstOrDefault();
if (EndBin == null)
{
HikDataResult.code = (int)EHikResponseCode.Exception;
HikDataResult.message = string.Format("[btnEndTwo]请求号:{0}的搬运任务,在C-1,C-2中无可搬运的目标点", reqCode);
log.Info("坐标异常:->" + HikDataResult.message);
return HikDataResult;
}
//起始点坐标
PositionEntity BeginBin = ListMap.FirstOrDefault(item => item.PositionCode == currentPositionCode);
//StartModel.positionCodePath.Add(new PositionDTO() { positionCode = BeginBin.PositionCode, type = "00" });
PositionEntity HalfwayBin = null;
//确定目标坐标点以及中途停顿点
if (EndBin.PositionName == "C-2")
{
StartModel.taskTyp = "T05";
HalfwayBin = ListMap.Where(item => item.PositionName == "Apply_A-2").FirstOrDefault();
if (HalfwayBin != null)
{
StartModel.positionCodePath.Add(new PositionDTO() { positionCode = HalfwayBin.PositionCode, type = "00" });
}
}
else if (EndBin.PositionName == "C-1")
{
StartModel.taskTyp = "T06";
HalfwayBin = ListMap.Where(item => item.PositionName == "Apply_A-3&