using System;
using System.Threading.Tasks;
using HH.WCS.Mobox3.DSZSH.Consts;
using HH.WCS.Mobox3.DSZSH.Devices;
using HH.WCS.Mobox3.DSZSH.Helpers;
using HH.WCS.Mobox3.DSZSH.Models;
using HH.WCS.Mobox3.DSZSH.ServiceCore;
using Newtonsoft.Json;
using static HH.WCS.Mobox3.DSZSH.Dtos.Request.AgvRequest;
using static HH.WCS.Mobox3.DSZSH.Dtos.Response.AgvResponse;
namespace HH.WCS.Mobox3.DSZSH.Services {
public class AgvService {
public static ReturnResult OperateAgvTaskStatus(AgvTaskState model) {
var result = new ReturnResult();
try {
switch (model.state) {
case 1023:
break;
case 1025:
break;
case 1012:
break;
case 1004:
break;
case 1103:
break;
default:
// AGV 执行任务的逻辑处理
if (!AgvTaskProcessOk(model)) {
// 执行不OK,说明没有找到任务
result.ResultCode = 1;
result.ResultMsg = $"根据Model.No未找到对应的任务,{model.task_no}";
LogHelper.Info(result.ResultMsg, "API");
return result;
}
break;
}
result.ResultCode = 0;
result.ResultMsg = "success";
LogHelper.Info(result.ResultMsg, "API");
return result;
}
catch (Exception ex) {
result.ResultCode = -1;
result.ResultMsg = $"发生了异常:+{ex.Message}";
LogHelper.Info(result.ResultMsg, "Error");
return result;
}
}
///
/// 执行 AGV 任务,查询不到任务返回
///
///
///
private static bool AgvTaskProcessOk(AgvTaskState model) {
var TN_Task = TaskHelper.GetTask(model.task_no); // 根据当前model编号查询任务
if (TN_Task == null) { return false; }
if (model.state > 7) {
//安全请求等
TaskHelper.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data);
return true;
}
// AGV 任务 134562(7) 状态处理
switch (model.state) {
case AgvStateCode.执行:
TaskHelper.Begin(TN_Task, model.forklift_no); // 已推送的任务的状态改成执行
break;
case AgvStateCode.开始取货:
TaskHelper.UpdateStatus(TN_Task, "开始取货"); // 任务状态改成开始取货
break;
case AgvStateCode.取货完成:
TaskHelper.UpdateStatus(TN_Task, "取货完成"); // 任务状态改成取货完成
TaskHelper.OperateStatus(TN_Task, 4); // 起点容器货位解绑,解锁起点
if (TN_Task.S_TYPE == TaskName.成品胶出库) {
var nextOutboundTask = Task.Run(() => {
OutboundCore.UpdateTaskState(SpotStateCode.任务执行完成);
});
}
break;
case AgvStateCode.开始卸货:
TaskHelper.UpdateStatus(TN_Task, "开始卸货"); // 任务状态改成开始卸货
break;
case AgvStateCode.卸货完成:
TaskHelper.UpdateStatus(TN_Task, "卸货完成"); // 任务状态改成卸货完成
TaskHelper.OperateStatus(TN_Task, 6); // 终点容器货位绑定,解锁终点
break;
case AgvStateCode.完成:
TaskHelper.End(TN_Task); // 任务状态改成结束
if (TN_Task.S_TYPE == TaskName.抽检_出库) {
var checkCompleteTask = Task.Run(() => {
CheckCore.UpdateTaskState(SpotStateCode.任务执行完成);
});
}
break;
case AgvStateCode.异常:
TaskHelper.OperateStatus(TN_Task, 7); // 异常处理
TaskHelper.Fail(TN_Task); // 任务状态改成错误
break;
}
// 将AGV执行状态,加入TN_Task_Action表中
TaskHelper.AddActionRecord(model.task_no, model.state, model.forklift_no, model.ext_data);
//调用第三方接口(如果有)TaskProcess.ReportStatus,添加任务动作关系表
return true;
}
public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) {
var gzResult = new ReturnResult();
var db = DbHelper.GetDbClient();
ModbusHelper.Relink();
try {
var prodLineInfo = AppStart.Settings.Config.ProductionLines[0];
var prodLineDevice = new ProductionLineDevice(prodLineInfo.PlcIp, prodLineInfo.PlcPort);
if (!prodLineDevice.LoadDeviceStateOk()) {
LogHelper.Info("加载设备信息失败");
}
var tn_task = db.Queryable().First(a => a.S_CODE == model.task_no);
if (tn_task == null) {
LogHelper.Info($"任务号 '{model.task_no}' 不存在");
}
// 待修改:补充不同分支AGV判断
if (prodLineDevice.SystemState == 1) {
if (prodLineDevice.FullOffline == 1 && tn_task.S_TYPE == TaskName.托盘_满托下线入库) {
prodLineDevice.AgvPicking = 1;
}
if (prodLineDevice.AllowAgvPlacePallet == 1 && tn_task.S_TYPE == TaskName.托盘_空托上线) {
prodLineDevice.AgvPlacingPallet = 1;
}
}
LogHelper.Info(JsonConvert.SerializeObject(prodLineDevice, Formatting.Indented));
return gzResult;
}
catch (Exception ex) {
LogHelper.Info($"发生了异常:{ex.Message}");
return gzResult;
}
}
}
}