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 WMS.Entity.BllTaskEntity; using WMS.IBLL.IBllTaskServer; using Model.ModelVm.BllTaskVm; namespace Wms.Controllers { /// <summary> /// 下游系统交互 /// </summary> [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 IBllTaskSyncServer _taskSyncSvc;//ä»»åŠ¡åŒæ¥Svc private readonly IWaveMageServer _waveSvc;//ä»»åŠ¡åŒæ¥Svc public DownApiController(IOptions<ApiUrlConfig> setting, IExportNoticeServer exNoticeSvc, IPalletBindServer asnPalletBindSvc, IStockCheckServer crCheckSvc, ITaskServer taskSvc, IBllTaskSyncServer taskSyncSvc, IWaveMageServer waveSvc) { _config = setting.Value; _exNoticeSvc = exNoticeSvc; _asnPalletBindSvc = asnPalletBindSvc; _crCheckSvc = crCheckSvc; _taskSvc = taskSvc; _taskSyncSvc = taskSyncSvc; _waveSvc = waveSvc; } #region WMSæŽ¥å£ è°ƒç”¨ä¸‹æ¸¸ç³»ç»ŸæŽ¥å£ /// <summary> /// 指令下å‘(波次出库) /// </summary> /// <param name="unstackingMode">拆垛方å¼</param> /// <param name="waveNo">出库å•å·</param> /// <param name="outMode">出库å£</param> /// <param name="loadingAddre">装车å£</param> /// <returns></returns> [Authorize] [HttpGet] public IActionResult WaveIssueOutHouse(string waveNo, string unstackingMode, string outMode, 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 = _waveSvc.WaveIssueOutHouse(waveNo, unstackingMode, outMode, 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 }); } } /// <summary> /// 指令下å‘(出库) /// </summary> /// <param name="unstackingMode">拆垛方å¼</param> /// <param name="soNo">出库å•å·</param> /// <param name="outMode">出库å£</param> /// <param name="loadingAddre">装车å£</param> /// <returns></returns> [Authorize] [HttpGet] public IActionResult IssueOutHouse(string soNo,string unstackingMode, string outMode,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,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 }); } } /// <summary> /// 釿–°ä¸‹å‘出库任务 /// </summary> /// <param name="taskNo"></param> /// <returns></returns> [HttpGet] public IActionResult AgainSendSoTask(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 = "未获å–åˆ°å½“å‰æ“作人信æ¯" }); } var list = _exNoticeSvc.AgainSendSoTask(taskNo, int.Parse(userId),_config.WcsHost + _config.IssueComApiUrl2); return Ok(new { code = 0, msg = "釿–°ä¸‹å‘已完æˆ", data = list }); } catch (Exception e) { return Ok(new { code = 1, msg = e.Message }); } } /// <summary> /// 指令下å‘(盘点出库) /// </summary> /// <param name="crNo"></param> /// <param name="outMode"></param> /// <returns></returns> [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 }); } } /// <summary> /// 釿–°ä¸‹å‘盘点任务 /// </summary> /// <param name="taskNo"></param> /// <returns></returns> [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æŽ¥å£ è¢«ä¸‹æ¸¸ç³»ç»ŸæŽ¥å£è°ƒç”¨ /// <summary> /// 绑定信æ¯è¿”回巷é“å£ /// </summary> /// <param name="model">入库å•ä¿¡æ¯</param> /// <returns></returns> [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 }); } } /// <summary> /// ç”³è¯·å··é“ /// </summary> /// <param name="model">入库å•ä¿¡æ¯</param> /// <returns></returns> [AllowAnonymous] [HttpPost] public IActionResult RequestRoadWay(RequestLocate model) { var logStr = ""; logStr = $@".\log\WCS\WCS申请巷é“" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; try { var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"WCS申请巷é“:( {jsonData} ),", logStr); 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.Substring(0, 8), //"申请巷é“", $"ç”³è¯·å··é“æ‰˜ç›˜å·ï¼š{model.PalletNo.Substring(0, 8)}的失败信æ¯", 2); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } /// <summary> /// ç”³è¯·å‚¨ä½ /// </summary> /// <param name="model">入库å•ä¿¡æ¯</param> /// <returns></returns> [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; 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); var 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); } if (model.PalletNo.Length == 9) { } 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 }); } } /// <summary> /// 接å—wcsè¿”å›žçš„ä¿¡å· //指令å馈(是å¦å®Œæˆï¼‰ /// </summary> /// <returns></returns> [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);// 判æ–啿®ç±»åž‹å…¥å‡ºç§» 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); 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 }); } } /// <summary> /// 空å–异常 /// </summary> /// <returns></returns> [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, Message = ""}); } catch (Exception e) { LogFile.SaveLogToFile($"空å–异常:( {e.Message} ),", logStr); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } /// <summary> /// 满入异常 /// </summary> /// <returns></returns> [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, 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); } } //托盘箱ç ä¿¡æ¯ è‡ªåŠ¨ç åž› (wcsæä¾›) //申请空托(自动ç 空托时用) //agv返回信æ¯ï¼ˆä»»åŠ¡æ˜¯å¦å®Œæˆï¼‰ /// <summary> /// 接å—agvè¿”å›žçš„ä¿¡å· //指令å馈(是å¦å®Œæˆï¼‰ /// </summary> /// <returns></returns> [HttpPost] public IActionResult ReceiveAgvSignal(ReceiveWcsSignal model) { try { //记录log var logStr = $@".\log\AGV\任务å馈" + 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);// 判æ–啿®ç±»åž‹å…¥å‡ºç§» switch (orderType) { case "1"://出库完æˆä»»åŠ¡ if (model.TaskType == "1")//0:入库 1:出库 2:移库 { _exNoticeSvc.ExportSuccessAGV(model.TaskNo, 0); return Ok(new WcsModel { StatusCode = 0, Msg = "出库完æˆ" }); } else { return Ok(new WcsModel { StatusCode = -1, Msg = "ä¼ é€’çš„ä»»åŠ¡ç±»åž‹ä¸æ˜¯å‡ºåº“类型" }); } default: return Ok(new WcsModel { StatusCode = -1, Msg = "ä¼ é€’çš„ä»»åŠ¡çŠ¶æ€ä¸ºå¤±è´¥çжæ€" }); } } catch (Exception ex) { return Ok(new WcsModel { StatusCode = -1, Msg = ex.Message }); } } /// <summary> /// æŽ¥æ”¶åŒæ¥ä»»åŠ¡ä¿¡æ¯ /// </summary> /// <param name="model"></param> /// <returns></returns> [HttpPost] public IActionResult ReceiveWCSTaskSync(TaskSyncInfoVm 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.StartLocat) || string.IsNullOrEmpty(model.EndLocat) || string.IsNullOrEmpty(model.PalletNo)) { return Ok(new WcsModel { StatusCode = -1, Msg = "æŽ¥å£æ•°æ®ä¸æ£ç¡®" }); } _taskSyncSvc.ReceiveWCSTaskSync(model); return Ok(new WcsModel { StatusCode = 0, Msg = "åŒæ¥å®Œæˆ" }); } catch (Exception ex) { return Ok(new WcsModel { StatusCode = -1, Msg = ex.Message }); } } #endregion #region PDA //空托指令下å‘(出库) #endregion } }