using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Model.InterFaceModel; using Newtonsoft.Json; using System; using System.IO; using System.Security.Claims; using Utility.Tools; using WMS.BLL.LogServer; using WMS.IBLL.IBllAsnServer; using WMS.IBLL.IBllCheckServer; using WMS.IBLL.IBllSoServer; using WMS.IBLL.ILogServer; using Wms.Tools; using System.Collections.Generic; using Model.ModelVm.PdaVm; using WMS.IBLL.IPdaServer; using Model.ModelVm; using WMS.IBLL.IDataServer; namespace Wms.Controllers { /// /// 下游系统交互 /// [Route("api/[controller]/[action]")] [ApiController] public class DownApiController : ControllerBase { private readonly ApiUrlConfig _config; //接口交互路径 private readonly IExportNoticeServer _exNoticeSvc;//出库单Svc private readonly IPalletBindServer _asnPalletBindSvc;//托盘绑定Svc private readonly IStockCheckServer _crCheckSvc;//托盘绑定Svc private readonly ITaskServer _taskSvc;//任务Svc private readonly IPdaSoServer _pdaSoSvc;//空托出库Svc private readonly IPdaAsnServer _paAsnSvc;//空托跺绑定 private readonly IStockServer _stockSvc;//AGV任务完成箅 private readonly IPdaCrServer _pdaCrServer; // PDA任务调度 private static readonly object OLock = new object(); public DownApiController(IOptions setting, IExportNoticeServer exNoticeSvc, IPalletBindServer asnPalletBindSvc, IStockCheckServer crCheckSvc, ITaskServer taskSvc, IPdaSoServer pdaSoSvc,IPdaAsnServer paAsnSvc,IStockServer stockSvc,IPdaCrServer pdaCrServer) { _config = setting.Value; _exNoticeSvc = exNoticeSvc; _asnPalletBindSvc = asnPalletBindSvc; _crCheckSvc = crCheckSvc; _taskSvc = taskSvc; _pdaSoSvc = pdaSoSvc; _paAsnSvc = paAsnSvc; _stockSvc = stockSvc; _pdaCrServer = pdaCrServer; } #region WMS接口 调用下游系统接口 /// /// 指令下发(出库) /// /// 拆垛方式 /// 出库单号 /// 出库口 /// 装车口 /// [Authorize] [HttpGet] public IActionResult IssueOutHouse(string soNo, string unstackingMode, string outMode,string checkmode, string loadingAddre) { try { //获取当前登录的用户ID var claimsIdentity = this.User.Identity as ClaimsIdentity; if (claimsIdentity == null) { return Ok(new { code = 1, msg = "未获取到当前操作人信息" }); } var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value; if (string.IsNullOrWhiteSpace(userId)) { return Ok(new { code = 1, msg = "未获取到当前操作人信息" }); } //验证出库口 //if (string.IsNullOrWhiteSpace(outMode)) //{ // return Ok(new { code = 1, msg = "请选择出库口" }); //} var list = _exNoticeSvc.IssueOutHouse(soNo, unstackingMode, outMode, checkmode, loadingAddre, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str); return Ok(new { code = 0, msg = str, data = list }); } catch (Exception e) { return Ok(new { code = 1, msg = e.Message }); } } /// /// 重新下发出库任务 /// /// /// [HttpGet] public IActionResult AgainSendSoTask(string taskNo,string Receiver) { try { //获取当前登录的用户ID var claimsIdentity = this.User.Identity as ClaimsIdentity; if (claimsIdentity == null) { return Ok(new { code = 1, msg = "未获取到当前操作人信息" }); } var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value; if (string.IsNullOrWhiteSpace(userId)) { return Ok(new { code = 1, msg = "未获取到当前操作人信息" }); } //var list = _exNoticeSvc.AgainSendSoTask(taskNo, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl2); OutCommandDto list = new OutCommandDto(); if (Receiver == "WCS") { //需判断AGV或WCS的出库任务 //wcs list = _exNoticeSvc.AgainSendSoTask(taskNo, Receiver, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl2); } else if(Receiver == "AGV") { //agv list = _exNoticeSvc.AgainSendSoTask(taskNo, Receiver, int.Parse(userId), _config.WcsHost + _config.ContinueTask); } return Ok(new { code = 0, msg = "重新下发已完成", data = list }); } catch (Exception e) { return Ok(new { code = 1, msg = e.Message }); } } /// /// 指令下发(盘点出库) /// /// /// /// [Authorize] [HttpGet] public IActionResult CheckOutHouse(string crNo, string outMode) { try { //获取当前登录的用户ID var claimsIdentity = this.User.Identity as ClaimsIdentity; if (claimsIdentity == null) { return Ok(new { code = 1, msg = "未获取到当前操作人信息" }); } var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value; if (string.IsNullOrWhiteSpace(userId)) { return Ok(new { code = 1, msg = "未获取到当前操作人信息" }); } var list = _crCheckSvc.CheckOutHouse(crNo, outMode, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str); return Ok(new { code = 0, msg = str, data = list }); } catch (Exception e) { return Ok(new { code = 1, msg = e.Message }); } } /// /// 重新下发盘点任务 /// /// /// [HttpGet] public IActionResult AgainSendCheckTask(string taskNo) { try { //获取当前登录的用户ID var claimsIdentity = this.User.Identity as ClaimsIdentity; if (claimsIdentity == null) { return Ok(new { code = 1, msg = "未获取到当前操作人信息" }); } var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value; if (string.IsNullOrWhiteSpace(userId)) { return Ok(new { code = 1, msg = "未获取到当前操作人信息" }); } _crCheckSvc.AgainSendCheckTask(taskNo, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl2); return Ok(new { code = 0, msg = "重新下发已完成", data = "" }); } catch (Exception e) { return Ok(new { code = 1, msg = e.Message }); } } #endregion #region WMS接口 被下游系统接口调用 /// /// 申请巷道 /// /// 入库单信息 /// [AllowAnonymous] [HttpPost] public IActionResult RequestRoadWay(RequestLocate model) { lock (OLock) { var logStr = ""; logStr = $@".\log\WCS\WCS申请巷道" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; try { var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"WCS申请巷道:( {jsonData} ),", logStr); if (model.TaskModel == "1") { var list = _asnPalletBindSvc.RequestRoadWayModel(model.PalletNo, model.HouseNo); LogFile.SaveLogToFile($"WCS申请巷道返回:( {JsonConvert.SerializeObject(list)} ),", logStr); new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo, "申请巷道", $"申请巷道托盘号:{model.PalletNo}的成功信息", 2); return Ok(new { Success = 0, Message = "申请巷道成功", TaskList = list }); } else { var list = _asnPalletBindSvc.RequestRoadWay(model.PalletNo, model.HouseNo); LogFile.SaveLogToFile($"WCS申请巷道返回:( {JsonConvert.SerializeObject(list)} ),", logStr); new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8), "申请巷道", $"申请巷道托盘号:{model.PalletNo.Substring(0, 8)}的成功信息", 2); return Ok(new { Success = 0, Message = "申请巷道成功", TaskList = list }); } } catch (Exception e) { LogFile.SaveLogToFile($"WCS申请巷道返回:( {e.Message} ),", logStr); new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo, "申请巷道", $"申请巷道托盘号:{model.PalletNo}的失败信息", 2); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } } /// /// 申请储位 /// /// 入库单信息 /// [AllowAnonymous] [HttpPost] public IActionResult RequestLocation(RequestLocate model) { //获取当前登录的用户ID //var claimsIdentity = this.User.Identity as ClaimsIdentity; //if (claimsIdentity == null) //{ // return Ok(new { code = 1, msg = "未获取到当前操作人信息" }); //} //var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value; //if (string.IsNullOrWhiteSpace(userId)) //{ // return Ok(new { code = 1, msg = "未获取到当前操作人信息" }); //} //string palletno = model.PalletNo; lock (OLock) { var logStr = ""; if (model.PalletNo.Length == 9) { logStr = $@".\log\WCS\WMS申请储位" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; } else if (model.PalletNo.Length == 8) { logStr = $@".\log\WCS\WCS申请储位" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; } try { if (model.PalletNo.Length == 9) { var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"WMS申请储位:( {jsonData} ),", logStr); } else if (model.PalletNo.Length == 8) { var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"WCS申请储位:( {jsonData} ),", logStr); } string pallet = model.PalletNo.Substring(0, 8); OutCommandDto list; if (model.TaskModel == "1") { list = _asnPalletBindSvc.RequestLocationModel(pallet, model.HouseNo, model.RoadwayNo); } else { list = _asnPalletBindSvc.RequestLocation(pallet, model.HouseNo, model.RoadwayNo); } if (model.PalletNo.Length == 9) { new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8), "申请储位", $"申请储位托盘号:{model.PalletNo.Substring(0, 8)}的成功信息", 2);// int.Parse(userId) LogFile.SaveLogToFile($"WMS申请储位成功:( {JsonConvert.SerializeObject(list)} ),", logStr); } else if (model.PalletNo.Length == 8) { LogFile.SaveLogToFile($"WCS申请储位返回:( {JsonConvert.SerializeObject(list)} ),", logStr); } return Ok(new { Success = 0, Message = "申请储位成功", TaskList = list }); } catch (Exception e) { if (model.PalletNo.Length == 9) { new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo.Substring(0, 8), "申请储位", $"申请储位托盘号:{model.PalletNo.Substring(0, 8)}的失败信息", 2);//int.Parse(userId) LogFile.SaveLogToFile($"WMS申请储位失败返回:( {e.Message} ),", logStr); } else if (model.PalletNo.Length == 8) { LogFile.SaveLogToFile($"WCS申请储位返回:( {e.Message} ),", logStr); } return Ok(new ErpModel { Success = -1, Message = e.Message }); } } } /// /// 接受wcs返回的信号 //指令反馈(是否完成) /// /// [HttpPost] public IActionResult ReceiveWcsSignal(ReceiveWcsSignal model) { try { //记录log var logStr = $@".\log\WCS\任务反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"任务反馈:( {jsonData} ),", logStr); if (string.IsNullOrEmpty(model.TaskNo) || string.IsNullOrEmpty(model.TaskStatus) || string.IsNullOrEmpty(model.TaskType)) { return Ok(new WcsModel { StatusCode = -1, Msg = "接口数据不正确" }); } //接收时间 var time1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); var orderType = _taskSvc.GetTaskOrderType(model.TaskNo,model.TaskType);// 判断单据类型入出移 switch (orderType) { case "0"://入库完成任务 if (model.TaskType == "0")//0:入库 1:出库 2:移库 { _asnPalletBindSvc.ArrivalSuccess(model.TaskNo, 0); return Ok(new WcsModel { StatusCode = 0, Msg = "入库完成" }); } break; case "1"://出库完成任务 if (model.TaskType == "1")//0:入库 1:出库 2:移库 { _exNoticeSvc.ExportSuccess(model.TaskNo, 0, _config.AgvHost + _config.GenAgvSchedulingTask); return Ok(new WcsModel { StatusCode = 0, Msg = "出库完成" }); } else if (model.TaskType == "2") { _exNoticeSvc.RelocationSuccess(model.TaskNo, 0); return Ok(new WcsModel { StatusCode = 0, Msg = "移库完成" }); } break; case "2"://盘库完成任务 if (model.TaskType == "1")//0:入库 1:出库 3:移库 { _crCheckSvc.CheckSuccess(model.TaskNo, 0); return Ok(new WcsModel { StatusCode = 0, Msg = "盘点出库完成" }); } else if (model.TaskType == "0")// 盘点出库托盘回库完成 { _asnPalletBindSvc.ArrivalSuccess(model.TaskNo, 0); return Ok(new WcsModel { StatusCode = 0, Msg = "入库完成" }); } break; case "3"://移库完成任务、优化储位 if (model.TaskType == "3") //0:入库 1:出库 3:移库 { //填写移库完成代码 } break; default: return Ok(new WcsModel { StatusCode = -1, Msg = "传递的任务状态为失败状态" }); } return Ok(new WcsModel { StatusCode = -1, Msg = "传递的任务状态为失败状态" }); } catch (Exception ex) { return Ok(new WcsModel { StatusCode = -1, Msg = ex.Message }); } } /// /// 空取异常 /// /// [HttpPost] public IActionResult EmptyException(ReceiveWcsSignal model) { var logStr = $@".\log\WCS\异常反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; try { var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"空取异常:( {jsonData} ),", logStr); var bl = _exNoticeSvc.EmptyException(model); LogFile.SaveLogToFile($"空取异常:(执行结果成功),", logStr); return Ok(new { Success = 0,StatusCode = 0, Message = "" }); } catch (Exception e) { LogFile.SaveLogToFile($"空取异常:( {e.Message} ),", logStr); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } /// /// 满入异常 /// /// [HttpPost] public IActionResult FullException(ReceiveWcsSignal model) { var logStr = $@".\log\WCS\异常反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; try { var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"满入异常:( {jsonData} ),", logStr); var list = _asnPalletBindSvc.FullException(model); LogFile.SaveLogToFile($"满入异常:( {JsonConvert.SerializeObject(list)} ),", logStr); return Ok(new { Success = 0, StatusCode = 0, Message = "", TaskList = list }); } catch (Exception e) { LogFile.SaveLogToFile($"满入异常:( {e.Message} ),", logStr); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } //每日清空日志 [HttpPost] public IActionResult DeleteNlogFile() { try { string[] files = null; try { files = Directory.GetFiles(_config.GetLog1); } catch { try { files = Directory.GetFiles(_config.GetLog2); } catch (Exception ex) { throw new Exception(ex.Message); } } finally { foreach (string file in files) { FileInfo fi = new FileInfo(file); if (fi.LastWriteTime < DateTime.Now.AddMonths(-1)) { fi.Delete(); } } } return Ok(new { msg = "成功清除" }); } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 自动码垛绑定信息返回巷道口 /// /// 入库单信息 /// [AllowAnonymous] [HttpPost] public IActionResult BindRequestRoadWay(BoxPalletBindVm model) { var logStr = $@".\log\WCS\WCS托盘绑定-申请巷道" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; try { var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"WCS托盘绑定-申请巷道:( {jsonData} ),", logStr); _asnPalletBindSvc.BindPalletStock(model, 0); //申请巷道 var list = _asnPalletBindSvc.RequestRoadWay(model.PalletNo, "W01"); LogFile.SaveLogToFile($"WCS托盘绑定-申请巷道返回:( {JsonConvert.SerializeObject(list)} ),", logStr); return Ok(new { Success = 0, Message = "托盘绑定-申请巷道成功", TaskList = list }); } catch (Exception e) { LogFile.SaveLogToFile($"WCS托盘绑定-申请巷道返回:( {e.Message} ),", logStr); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } /// /// WCS申请空托跺绑定 /// /// /// [AllowAnonymous] [HttpPost] public IActionResult BindPlnInHouseWcs(PalletsBind model) { var logStr = $@".\log\WCS\WCS又叠托机申请空托入库" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"任务反馈:( {jsonData} ),", logStr); try { var strMsg = _paAsnSvc.BindNullPallets(model); return Ok(new { Success = 0, Message = "空托跺绑定成功"}); } catch (Exception e) { LogFile.SaveLogToFile($"WCS申请空托跺绑定异常返回:( {e.Message} ),", logStr); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } /// /// WCS申请空托出库 /// /// /// [AllowAnonymous] [HttpPost] public IActionResult IssuePlnOutHouseWcs(OutModePalletVm model) { var logStr = $@".\log\WCS\WCS申请空托出库" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"任务反馈:( {jsonData} ),", logStr); try { List _list = _pdaSoSvc.IssuePlnOutHouseWcs(model,0); return Ok(new { Success = 0, Message = "空托盘出库成功", TaskList = _list }); } catch (Exception e) { LogFile.SaveLogToFile($"WCS申请空托出库异常返回:( {e.Message} ),", logStr); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } /// /// WMS拣货申请空托出库 /// /// /// [AllowAnonymous] [HttpPost] public IActionResult IssuePlnCheckHouseWcs(CheckModePalletVm model) { var logStr = $@".\log\WCS\WMS拣货申请空托出库" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"任务反馈:( {jsonData} ),", logStr); try { string list = _pdaSoSvc.IssuePlnCehckHouseWcs(model, 0,_config.AgvHost+_config.GenAgvSchedulingTask); return Ok(new { Success = 0, Message = "拣货叫空托盘成功"}); } catch (Exception e) { LogFile.SaveLogToFile($"WMS拣货申请空托出库异常返回:( {e.Message} ),", logStr); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } /// /// WCS申请是否缠膜 /// /// /// [AllowAnonymous] [HttpPost] public IActionResult RequestPackWcs(RequesIsBale model) { var logStr = $@".\log\WCS\WCS申请缠膜拆膜" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"任务反馈:( {jsonData} ),", logStr); try { int t = _asnPalletBindSvc.RequestPackWcs(model.PalletNo); LogFile.SaveLogToFile($"WCS申请缠膜入库请求,请求托盘呈:( {model.PalletNo} ),", logStr); return Ok(new { Success = t, Message = "缠膜指令发送成功" }); } catch (Exception e) { LogFile.SaveLogToFile($"WCS申请缠膜入库异常返回:( {e.Message} ),", logStr); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } /// /// WCS申请是否拆膜 /// /// /// [AllowAnonymous] [HttpPost] public IActionResult RequestUnPackWcs(RequesIsBale model) { var logStr = $@".\log\WCS\WCS申请缠膜拆膜" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"任务反馈:( {jsonData} ),", logStr); try { int t = _asnPalletBindSvc.RequestUnPackWcs(model.PalletNo); return Ok(new { Success = t, Message = "拆膜指令发送成功" }); } catch (Exception e) { LogFile.SaveLogToFile($"WCS申请拆膜出库异常返回:( {e.Message} ),", logStr); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } /// /// WCS反馈缠膜完成 /// /// /// [AllowAnonymous] [HttpPost] public IActionResult RequestPackedWcs(RequesIsBale model) { var logStr = $@".\log\WCS\WCS申请缠膜拆膜" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"任务反馈:( {jsonData} ),", logStr); try { int t = _asnPalletBindSvc.RequestPackedWcs(model.PalletNo); return Ok(new { Success = t, Message = "缠膜完成指令发送成功" }); } catch (Exception e) { LogFile.SaveLogToFile($"WCS申请缠膜完成异常返回:( {e.Message} ),", logStr); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } ///// ///// 成品箱码拆垛拣货 ///// ///// 入库单信息 ///// //[AllowAnonymous] //[HttpPost] //public IActionResult BoxUnstackd(BoxPickList model) //{ // var logStr = $@".\log\WCS\WCS成品箱码拆垛" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; // try // { // var jsonData = JsonConvert.SerializeObject(model); // LogFile.SaveLogToFile($"WCS成品箱码拆垛:( {jsonData} ),", logStr); // _comeSvc.BoxUnstackd(model.PalletNo, model.BoxList); // var list = new { Success = 0, Message = "成品箱码拆垛" }; // LogFile.SaveLogToFile($"WCS成品箱码拆垛返回:( {JsonConvert.SerializeObject(list)} ),", logStr); // return Ok(list); // } // catch (Exception e) // { // LogFile.SaveLogToFile($"WCS成品箱码拆垛:( {e.Message} ),", logStr); // return Ok(new ErpModel { Success = -1, Message = e.Message }); // } //} //申请空托(自动码空托时用) //车间叫料 //WCS申请拆垛信息 /// /// 成品箱码拆垛拣货 /// /// 入库单信息 /// [AllowAnonymous] [HttpPost] public IActionResult ResultBoxInfoCheckWcs(BoxInfoCheck model) { var logStr = $@".\log\WCS\WCS申请拆垛托盘信息" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"任务反馈:( {jsonData} ),", logStr); try { RequestBoxInfoCheck list = _exNoticeSvc.BoxInfoCheckWcs(model); return Ok(new { Success = 1,Message = "拆垛信息获取成功",data = list}); } catch (Exception e) { LogFile.SaveLogToFile($"WCS申请托盘拆垛异常返回:( {e.Message} ),", logStr); return Ok(new ErpModel { Success = -1, Message = e.Message}); } } /// /// 成品箱码拆垛拣货 /// /// 入库单信息 /// [AllowAnonymous] [HttpPost] public IActionResult ResultBoxInfoExportWcs(BoxInfoCheck model) { var logStr = $@".\log\WCS\WCS申请成品箱码拆垛拣货信息" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"任务反馈:( {jsonData} ),", logStr); try { //返回出库分拣装车口 var list = _exNoticeSvc.BoxInfoExportWcs(model.BoxNo); return Ok(new { Success = "1", Message = "成品箱码拆垛拣货成功", loadingAddre = list }); } catch (Exception e) { LogFile.SaveLogToFile($"WCS申请成品箱码拆垛拣货异常返回:( {e.Message} ),", logStr); return Ok(new { Success = "-1", Message = e.Message, loadingAddre = "" }); } } #endregion #region AGV /// /// 任务执行通知接口 /// AGV 执行回调的方法,包含任务开始,走出储位,任务完成及任务取消。 /// 取消通知为任务单,其他通知为单个任务组或子任务。注意:是否通知需要在任务模板配置 /// /// 入库单信息 /// [HttpPost] public IActionResult AgvCallback(AgvTaskDto model) { try { //记录log var logStr = $@".\log\AGV\任务反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"AGV任务反馈执行通知:( {jsonData} ),", logStr); //接收时间 var time1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //测试接口用 var orderType = _taskSvc.GetTaskOrderType(model.TaskCode, "0");// 判断单据类型入出移 var taskType = _taskSvc.GetTaskType(model.TaskCode);//根据任务号获取任务类型 switch (orderType) { case "0"://入库任务执行 if (model.Method == "mid") //AGV到达入库口,请求放货 { //下发WCS放货请求 var ret = _taskSvc.GetWcsPuttype(model.TaskCode,_config.WcsHost + _config.HttpInRequest); if (ret.Contains("-1")) { logStr = $@".\log\WCS\任务反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; LogFile.SaveLogToFile($"放货请求WCS失败,反馈执行通知:( {model.CurrentCallCode} ),", logStr); return Ok(new OutCommanAgvDto { Code = "1", Message = "失败", ReqCode = model.ReqCode }); } } else if (model.Method == "end")//AGV放货到入库口完成 { _stockSvc.ArriveFinish(model.TaskCode,_config.WcsHost + _config.HttpInFinish); } break; case "1"://出库任务执行 _stockSvc.SoFinish(model.TaskCode,_config.MesHost + _config.MesBeiLiaoUrl); break; case "2"://盘库任务执行 case "3"://移库任务执行 _stockSvc.MoveFinish(model.TaskCode, _config.MesHost + _config.MesBeiLiaoUrl); break; // return Ok(new OutCommanAgvDto { Code = "0", Message = "成功", ReqCode = model.ReqCode }); default: return Ok(new OutCommanAgvDto { Code = "1", Message = "失败", ReqCode = model.ReqCode }); } return Ok(new OutCommanAgvDto { Code = "0", Message = "成功", ReqCode = model.ReqCode }); } catch (Exception ex) { return Ok(new OutCommanAgvDto { Code = "1", Message = ex.Message }); } } /// /// 任务继续执行接口 /// 调用AGV任务模板continueTask,WCS调用接口返回该工位可放信号 /// /// 入库口信息 /// [HttpPost] public IActionResult AgcontinueTask(PutModel model) { try { //记录log var logStr = $@".\log\WCS\任务反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"WCS任务反馈执行通知:( {jsonData} ),", logStr); //下发AGV继续执行 _pdaCrServer.AgvContinue(model.TaskNo,_config.AgvHost+_config.ContinueTask); return Ok(new HttpReturnModel { Success = "0", Message = "成功"}); } catch (Exception ex) { return Ok(new HttpReturnModel { Success = "1", Message = ex.ToString() }); throw ex; } } #endregion #region PDA //空托指令下发(出库) #endregion } }