using System; using System.Collections.Generic; using System.IO; using System.Security.Claims; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Model.InterFaceModel; using Newtonsoft.Json; using SqlSugar.Extensions; using Utility.Tools; using WMS.Entity.LogEntity; using WMS.IBLL.IBllAsnServer; using WMS.IBLL.IBllCheckServer; using WMS.IBLL.IBllSoServer; using WMS.IBLL.ILogServer; using WMS.IBLL.ISysServer; using WmsApi.Tools; namespace WmsApi.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 IFunSettingServer _funSvc;//任务Svc public DownApiController(IOptions setting, IExportNoticeServer exNoticeSvc, IPalletBindServer asnPalletBindSvc, IStockCheckServer crCheckSvc, ITaskServer taskSvc, IFunSettingServer funSvc) { _config = setting.Value; _exNoticeSvc = exNoticeSvc; _asnPalletBindSvc = asnPalletBindSvc; _crCheckSvc = crCheckSvc; _taskSvc = taskSvc; _funSvc = funSvc; } #region WMS接口 调用下游系统接口 /// /// 指令下发(出库) /// /// /// [Authorize] [HttpGet] public IActionResult IssueOutHouse(string soNo) { 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.IssueTwoOutHouse(soNo, 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 }); } } /// /// 重新下发出库任务 /// /// /// [HttpPost] public IActionResult AgainSendSoTask(LogTask task) { 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(task.TaskNo, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl); 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) { 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, 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 }); } } #endregion #region WMS接口 被下游系统接口调用 /// /// 申请储位 /// /// 入库单信息 /// [HttpPost] public IActionResult RequestLocation(RequestLocate model) { try { var logStr = $@".\log\WCS\WCS申请储位" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; //model.ManuFactureDate = DateTime.Now; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"WCS申请储位:( {jsonData} ),", logStr); var list = _asnPalletBindSvc.RequestLocation(model); return Ok(new { Success = 0, Message = "", TaskList = list }); } catch (Exception e) { var logStr = $@".\log\WCS\WCS申请储位" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; LogFile.SaveLogToFile($"WCS申请储位失败:( {e.Message} ),", logStr); return Ok(new { Success = -1, Message = e.Message }); } } /// /// 接受wcs返回的信号 //指令反馈(是否完成) /// /// [HttpPost] public IActionResult ReceiveWcsSignal(ReceiveWcsSignal model) { try { //记录log var logStr = $@".\log\WCS\接收WCS返回信号" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"接收WCS返回信号:( {jsonData} ),", logStr); if (string.IsNullOrEmpty(model.TaskNo) || string.IsNullOrEmpty(model.TaskStatus) || string.IsNullOrEmpty(model.TaskType)) { return Ok(new WcsReturnModel { 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 WcsReturnModel { StatusCode = 0, Msg = "入库完成" }); } break; case "1"://出库完成任务 if (model.TaskType == "1")//0:入库 1:出库 2:移库 { _exNoticeSvc.ExportSuccess(model.TaskNo, 0, ""); return Ok(new WcsReturnModel { StatusCode = 0, Msg = "出库完成" }); } else if (model.TaskType == "2") { //改原、目标储位状态,库存明细表位置信息,任务改为已完成 _exNoticeSvc.RelocationSuccess(model.TaskNo, 0, ""); return Ok(new WcsReturnModel { StatusCode = 0, Msg = "移库完成" }); } break; case "2"://盘库完成任务 if (model.TaskType == "1")//0:入库 1:出库 2:移库 { _crCheckSvc.CheckSuccess(model.TaskNo, 0, ""); return Ok(new WcsReturnModel { StatusCode = 0, Msg = "盘点出库完成" }); } else if (model.TaskType == "0")// 盘点出库托盘回库完成 { _asnPalletBindSvc.ArrivalSuccess(model.TaskNo, 0, ""); return Ok(new WcsReturnModel { StatusCode = 0, Msg = "入库完成" }); } else if (model.TaskType == "2")//0:入库 1:出库 2:移库 { _exNoticeSvc.RelocationSuccess(model.TaskNo, 0, ""); return Ok(new WcsReturnModel { StatusCode = 0, Msg = "盘点移库完成" }); } break; case "3"://移库完成任务、优化储位 if (model.TaskType == "3") //0:入库 1:出库 3:移库 { //填写移库完成代码 } break; default: return Ok(new WcsReturnModel { StatusCode = -1, Msg = "传递的任务状态为失败状态" }); } return Ok(new WcsReturnModel { StatusCode = -1, Msg = "传递的任务状态为失败状态" }); } catch (Exception ex) { return Ok(new WcsReturnModel { StatusCode = -1, Msg = ex.Message }); } } /// /// WCS申请空托出库 /// /// /// [HttpPost] public IActionResult PalletLocation(WcsPalletModel model) { try { //记录log var logStr = $@".\log\WCS\WCS申请空托盘" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"WCS申请空托盘物料号:( {jsonData} ),", logStr); //获取空托盘所在库位 var list = _asnPalletBindSvc.PalletLocation(model.SkuNo,model.EndLocat); return Ok(new { Success = "0", Message = list == null ? "任务已申请!" : "", TaskList = list }); } catch (Exception e) { //记录log var logStr = $@".\log\WCS\WCS申请空托盘" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; //var jsonData = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(skuNo.ToString())); LogFile.SaveLogToFile($"当前空托盘申请失败!,{e.Message}", logStr); return Ok(new { Success = -1, Message = e.Message }); } } /// /// WCS满放重新分配储位 /// /// /// [HttpPost] public IActionResult ReLocation(RequestLocate model) { try { var logStr = $@".\log\WCS\WCS满放" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; //model.ManuFactureDate = DateTime.Now; var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"WCS满放:( {jsonData} ),", logStr); var list = _asnPalletBindSvc.ReLocation(model); return Ok(new { Success = 0, Message = "", TaskList = list }); } catch (Exception e) { var logStr = $@".\log\WCS\WCS满放" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; LogFile.SaveLogToFile($"WCS满放:( {e.Message} ),", logStr); return Ok(new { Success = -1, Message = e.Message }); } } //托盘箱码信息 自动码垛 (wcs提供) //申请空托(自动码空托时用) //车间叫料 /// /// 每日清空日志 /// /// /// [HttpPost] public IActionResult DeleteNlogFile() { try { string[] files = null; try { files = Directory.GetFiles(_config.Get130log); } catch { try { files = Directory.GetFiles(_config.Get131log); } 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); } } [HttpPost] public IActionResult UptTaskYouxian() { var list = _funSvc.GetFunSettingList("", "On", "Fun020"); return Ok(new { msg = list[0].FunSetName }); } #endregion #region PDA //空托指令下发(出库) #endregion } }