| | |
| | | public int StatusCode { get; set; } |
| | | public string Msg { get; set; } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 接收wcs可放信号model |
| | | /// </summary> |
| | | public class PutModel |
| | | { |
| | | public string TaskNo { get; set; } |
| | | |
| | | } |
| | | /// <summary> |
| | | /// Wms专用 下发指令Dto |
| | | /// </summary> |
| | |
| | | /// </summary> |
| | | public int MinLevelCount { get; set; } |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | |
| | | #region 数字孪生 |
| | | public class DigitalTwinModel |
| | | { |
| | | ///// <summary> |
| | | ///// 库区 |
| | | ///// </summary> |
| | | //public string WareHouse { get; set; } |
| | | |
| | | ///// <summary> |
| | | ///// 存储区域 |
| | | ///// </summary> |
| | | //public string AreaNo { get; set; } |
| | | |
| | | ///// <summary> |
| | | ///// 物料类型 |
| | | ///// </summary> |
| | | //public string Skytype { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 请求来源 |
| | | /// </summary> |
| | | public string Origin { get; set; } |
| | | } |
| | | |
| | | public class ReLocateData |
| | | { |
| | | /// <summary> |
| | | /// 库位 |
| | | /// </summary> |
| | | public string LocatNo { get; set; } |
| | | /// <summary> |
| | | /// 托盘号 |
| | | /// </summary> |
| | | public string PalletNo { get; set; } |
| | | /// <summary> |
| | | /// 物料名称 |
| | | /// </summary> |
| | | public string SkuName { get; set; } |
| | | /// <summary> |
| | | /// 规格 |
| | | /// </summary> |
| | | public string Stadard { get; set; } |
| | | /// <summary> |
| | | /// 批次 |
| | | /// </summary> |
| | | public string LotNo { get; set; } |
| | | /// <summary> |
| | | /// 质量状态 |
| | | /// </summary> |
| | | public string InspectStatus { get; set; } |
| | | /// <summary> |
| | | /// 库存数量 |
| | | /// </summary> |
| | | public string Qty { get; set; } |
| | | /// <summary> |
| | | /// 有效期 |
| | | /// </summary> |
| | | public string Warranty { get; set; } |
| | | } |
| | | #endregion |
| | | |
| | | } |
| | |
| | | continue; |
| | | } |
| | | } |
| | | if (model.Type != "7") |
| | | { |
| | | if (!TypeLot.Contains(model.Type)) |
| | | { |
| | | if (detailModel.LotNo.Length != 12 && detailModel.LotNo.Length != 11 && detailModel.LotNo.Length != 10) |
| | | { |
| | | strMessage = "-1:进厂编号位数长度有误;"; |
| | | continue; |
| | | } |
| | | } |
| | | //if (model.Type != "7") |
| | | //{ |
| | | // if (!TypeLot.Contains(model.Type)) |
| | | // { |
| | | // if (detailModel.LotNo.Length != 12 && detailModel.LotNo.Length != 11 && detailModel.LotNo.Length != 10) |
| | | // { |
| | | // strMessage = "-1:进厂编号位数长度有误;"; |
| | | // continue; |
| | | // } |
| | | // } |
| | | |
| | | } |
| | | //} |
| | | |
| | | if (model.Type == "1" && string.IsNullOrWhiteSpace(detailModel.SupplierLot)) //采购到货单原厂批号(供货批次)不能为空 |
| | | { |
| | |
| | | { |
| | | throw new Exception("未查询到单据明细信息"); |
| | | } |
| | | if (asnList.LotNo.Length != 10 && asnList.LotNo.Length != 11 && asnList.LotNo.Length != 12) |
| | | { |
| | | throw new Exception("单据进厂编号位数长度错误"); |
| | | } |
| | | //if (asnList.LotNo.Length != 10 && asnList.LotNo.Length != 11 && asnList.LotNo.Length != 12) |
| | | //{ |
| | | // throw new Exception("单据进厂编号位数长度错误"); |
| | | //} |
| | | var asn = Db.Queryable<BllArrivalNotice>().First(m => m.ASNNo == asnList.ASNNo && m.IsDel == "0"); |
| | | if (asn == null) |
| | | { |
| | |
| | | /// <param name="palletNo"></param> |
| | | /// <param name="areaNo"></param> |
| | | /// <param name="ruku"></param> |
| | | public void AgvTransport(string palletNo, string areaNo, string ruku, int userId, string url) |
| | | public void AgvTransport(string palletNo, string areaNo, string ruku, int userId, string url, string wcsurl) |
| | | { |
| | | if (string.IsNullOrEmpty(palletNo)) |
| | | { |
| | |
| | | try |
| | | { |
| | | string EndLocat = string.Empty,OrderTy = "";//目标位置 |
| | | |
| | | var tasktype = "D00"; //小车任务类型,默认为点到点任务 |
| | | |
| | | var log = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && w.PalletNo == palletNo && (w.Status == "0" || w.Status == "1")); |
| | | if (log != null) |
| | |
| | | //开启事务 |
| | | Db.BeginTran(); |
| | | |
| | | //请求WCS入库口放货确认 |
| | | try |
| | | { |
| | | var res = HttpHelper.DoPost(wcsurl, EndLocat, "请求WCS入库口是否可放货", "WCS"); |
| | | |
| | | //////解析返回数据 |
| | | var ret = JsonConvert.DeserializeObject<WcsModel>(res); |
| | | if (ret.StatusCode == -1) |
| | | { |
| | | throw new Exception(EndLocat + "入库口已有其他任务占用,请选择其他入库口"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | throw new Exception(ex.Message); |
| | | } |
| | | |
| | | |
| | | //添加出库任务 |
| | | var taskNo = new Common().GetMaxNo("TK"); |
| | | var exTask = new LogTask |
| | |
| | | #region 呼叫小车代码 |
| | | |
| | | var endlono = EndLocat; |
| | | var tasktype = "D00"; //默认为点到点任务 |
| | | |
| | | //根据目的地址库区获取小车任务类型 |
| | | switch (storageLocatEnd.AreaNo) |
| | | { |
| | |
| | | tasktype = "D01"; // 拆托任务(目的地址为拣货区) |
| | | break; |
| | | } |
| | | if (OrderTy == "0") |
| | | { |
| | | tasktype = "RK0"; //入库任务 |
| | | } |
| | | |
| | | //缓存库位转换 3楼原辅料Y003_001,Y003_002,Y003_003 1楼Y138_001到Y138_021外包缓存区 1楼Y128_001到Y128_015内包缓存区 |
| | | if (storageLocatEnd.AreaNo == "B12") |
| | |
| | | using System.Runtime.Intrinsics.X86; |
| | | using System.Security.Claims; |
| | | using System.Text; |
| | | using Model.InterFaceModel; |
| | | using Model.ModelDto; |
| | | using Model.ModelDto.DataDto; |
| | | using Model.ModelDto.SysDto; |
| | |
| | | } |
| | | #endregion |
| | | |
| | | #region AGV小车任务完成 |
| | | #region AGV小车任务完成更新库存 |
| | | |
| | | /// <summary> |
| | | /// AGV入库完成 |
| | |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region 数字孪生系统获取库存信息 |
| | | |
| | | /// <summary> |
| | | /// 反馈数字孪生系统库存信息 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public List<ReLocateData> GetLocateList() |
| | | { |
| | | try |
| | | { |
| | | List<ReLocateData> list = new List<ReLocateData>(); |
| | | |
| | | //库存信息 |
| | | var stockDetailsList = Db.Queryable<StockDetailDto>().ToList(); |
| | | |
| | | if (stockDetailsList.Count == 0) |
| | | { |
| | | return list; |
| | | } |
| | | for (int i = 0; i < stockDetailsList.Count; i++) |
| | | { |
| | | list[i].LocatNo = stockDetailsList[i].LocatNo; //库位 |
| | | list[i].PalletNo = stockDetailsList[i].PalletNo; //托盘号 |
| | | list[i].SkuName = stockDetailsList[i].SkuName; //物料名称 |
| | | list[i].Stadard = stockDetailsList[i].Standard; //规格 |
| | | list[i].LotNo = stockDetailsList[i].LotNo; //批次 |
| | | list[i].InspectStatus = stockDetailsList[i].InspectStatus; //质量状态 |
| | | list[i].Qty = stockDetailsList[i].Qty.ToString(); //库存数量 |
| | | list[i].Warranty = stockDetailsList[i].ExpirationTime.ToString(); //有效期 ??过期时间,是否要更改 |
| | | } |
| | | return list; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | throw new Exception("AGV返回入库完成信号处理错误,错误信息:" + ex); |
| | | } |
| | | } |
| | | #endregion |
| | | } |
| | | } |
| | |
| | | using System.Linq; |
| | | using System.Linq.Expressions; |
| | | using System.Text; |
| | | using Model.InterFaceModel; |
| | | using Model.ModelDto.BllSoDto; |
| | | using Model.ModelDto.LogDto; |
| | | using Newtonsoft.Json; |
| | | using SqlSugar; |
| | | using Utility.Tools; |
| | | using WMS.DAL; |
| | | using WMS.Entity.Context; |
| | | using WMS.Entity.LogEntity; |
| | |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// AGV入库放货请求下发至WCS |
| | | /// </summary> |
| | | /// <param name="port"></param> 入库口 |
| | | /// <param name="url"></param> 请求地址 |
| | | /// <returns></returns> |
| | | public string GetWcsPuttype(string port,string url) |
| | | { |
| | | try |
| | | { |
| | | var res = HttpHelper.DoPost(url, port, "请求WCS"+ port+"入库口放货", "WCS"); |
| | | |
| | | //////解析返回数据 |
| | | var ret = JsonConvert.DeserializeObject<WcsModel>(res); |
| | | return ret.Msg.ToString(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | throw ex; |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | using Model.ModelDto.DataDto; |
| | | using Model.InterFaceModel; |
| | | using Model.ModelDto.DataDto; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Text; |
| | |
| | | /// <returns></returns> |
| | | public void MoveFinish(string TaskCode); |
| | | #endregion |
| | | |
| | | /// <summary> |
| | | /// 反馈数字孪生库存信息 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | List<ReLocateData> GetLocateList(); |
| | | } |
| | | } |
| | |
| | | /// <param name="taskNo">任务号</param> |
| | | /// <returns>0 入库任务 1 出库任务 2移库任务</returns> |
| | | public string GetTaskType(string taskNo); |
| | | |
| | | public string GetWcsPuttype(string port,string url); |
| | | } |
| | | } |
| | |
| | | /// <param name="palletNo"></param> |
| | | /// <param name="areaNo"></param> |
| | | /// <param name="ruku"></param> |
| | | void AgvTransport(string palletNo, string areaNo, string ruku, int userId,string url); |
| | | void AgvTransport(string palletNo, string areaNo, string ruku, int userId,string url,string wcsurl); |
| | | /// <summary> |
| | | /// agv转运呼叫小车取货 |
| | | /// </summary> |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | #endregion |
| | | |
| | | #region AGV |
| | | |
| | | /// <summary> |
| | |
| | | var time1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); |
| | | |
| | | //测试接口用 |
| | | var orderType = _taskSvc.GetTaskOrderType(model.TaskCode,"0");// 判断单据类型入出移 |
| | | var orderType = _taskSvc.GetTaskOrderType(model.TaskCode, "0");// 判断单据类型入出移 |
| | | |
| | | var taskType = _taskSvc.GetTaskType(model.TaskCode);//根据任务号获取任务类型 |
| | | switch (orderType) |
| | |
| | | if (model.TaskTyp == "mid") //AGV到达入库口,请求放货 |
| | | { |
| | | //下发WCS放货请求 |
| | | |
| | | var ret = _taskSvc.GetWcsPuttype(model.CurrentCallCode,_config.WcsHost + _config.MesBeiLiaoUrl); |
| | | 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.TaskTyp == "end")//AGV放货到入库口完成 |
| | | { |
| | | _stockSvc.ArriveFinish(model.TaskCode); |
| | | } |
| | | |
| | | |
| | | break; |
| | | |
| | | case "1"://出库任务执行 |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return Ok(new WcsModel |
| | | return Ok(new OutCommanAgvDto |
| | | { |
| | | StatusCode = -1, |
| | | Msg = ex.Message |
| | | Code = "1", |
| | | Message = ex.Message |
| | | }); |
| | | } |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 任务继续执行接口 |
| | | /// 调用AGV任务模板continueTask,WCS调用接口返回该工位可放信号 |
| | | /// </summary> |
| | | /// <param name="model">入库口信息</param> |
| | | /// <returns></returns> |
| | | 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入库任务 |
| | | var taskType = _taskSvc.GetTaskType(model.TaskNo); |
| | | |
| | | |
| | | return Ok(new OutCommanAgvDto { Code = "0", Message = "成功"}); |
| | | |
| | | } |
| | | catch (Exception) |
| | | { |
| | | |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | |
| | | #endregion |
| | | |
| | | |
| | | #region PDA |
| | | |
| | |
| | | } |
| | | |
| | | var uId = int.Parse(userId); |
| | | _pdaCrSvc.AgvTransport(model.PalletNo, model.AreaNo, model.Ruku, uId, _config.AgvHost + _config.GenAgvSchedulingTask); |
| | | _pdaCrSvc.AgvTransport(model.PalletNo, model.AreaNo, model.Ruku, uId, _config.AgvHost + _config.GenAgvSchedulingTask,_config.WcsHost + _config.BoxHost); |
| | | |
| | | return Ok(new { data = "", code = 0, msg = "成功" }); |
| | | } |
| | |
| | | using Model.ModelVm.BllCheckVm; |
| | | using Microsoft.Extensions.Logging; |
| | | using WMS.IBLL.IPdaServer; |
| | | using WMS.IBLL.IDataServer; |
| | | using Model.ModelDto.DataDto; |
| | | using System.Collections.Generic; |
| | | |
| | | namespace Wms.Controllers |
| | | { |
| | |
| | | private readonly IArrivalNoticeServer _arrivalNoticeSvc; |
| | | private readonly IStockCheckServer _stockCheckSvc;//盘点单Svc |
| | | private readonly IPdaCrServer _daCrSvc;//PDA |
| | | public UpApiController(IOptions<ApiUrlConfig> setting,IExportNoticeServer exNoticeSvc,IArrivalNoticeServer arrivalNoticeServer,IStockCheckServer stockCheckSvc,IPdaCrServer daCrSvc) |
| | | private readonly IStockServer _stock; //库存 |
| | | public UpApiController(IOptions<ApiUrlConfig> setting,IExportNoticeServer exNoticeSvc,IArrivalNoticeServer arrivalNoticeServer,IStockCheckServer stockCheckSvc,IPdaCrServer daCrSvc,IStockServer stock) |
| | | { |
| | | _config = setting.Value; |
| | | _exNoticeSvc = exNoticeSvc; |
| | | _arrivalNoticeSvc = arrivalNoticeServer; |
| | | _stockCheckSvc = stockCheckSvc; |
| | | _daCrSvc = daCrSvc; |
| | | _stock = stock; |
| | | } |
| | | #endregion |
| | | |
| | |
| | | //包装信息接口 |
| | | |
| | | |
| | | /// <summary> |
| | | /// 数字孪生系统库存质量状态反馈 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public IActionResult ReLocateData(DigitalTwinModel model) |
| | | { |
| | | //记录log |
| | | var logStr = ""; |
| | | logStr = $@".\log\数字孪生\库位信息及质量状态反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; |
| | | var jsonData = JsonConvert.SerializeObject(model); |
| | | LogFile.SaveLogToFile($"库位信息及质量状态反馈:( {jsonData} ),", logStr); |
| | | |
| | | //获取库存信息 |
| | | List<ReLocateData> stocks = _stock.GetLocateList(); |
| | | |
| | | if (stocks.Count == 0) |
| | | { |
| | | var data = new HttpReturnModel { Success = "0", Message = "当前无库存" }; |
| | | return Ok(data); |
| | | } |
| | | return Ok(stocks); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | } |
| | |
| | | //"ConnectionString": "Server=47.95.120.93;Database=WMS_JC09;User ID=sa;password=boxline!@#; Integrated Security=True;", |
| | | //"ConnectionString": "Server=47.95.120.53;Database=WMS_JC09;User ID=sa;Password=boxline!@#;Integrated Security=False;", |
| | | //"ConnectionString": "Server=192.168.62.106;Database=WMS_JC24;User ID=sa;Password=sql2019;Integrated Security=False;", |
| | | "ConnectionString": "Server=192.168.62.200;Database=WMS_JC24;User ID=sa;Password=sql2019;Integrated Security=False;" |
| | | // "ConnectionString": "Server=10.18.99.10;Database=WMS_JC24;User ID=sa;Password=sql2024;Integrated Security=False;" |
| | | //"ConnectionString": "Server=192.168.62.200;Database=WMS_JC24;User ID=sa;Password=sql2019;Integrated Security=False;" |
| | | "ConnectionString": "Server=10.18.99.10;Database=WMS_JC24;User ID=sa;Password=sql2024;Integrated Security=False;" |
| | | //"ConnectionString": "Server=.;Database=WMS_JC24;User ID=sa;Password=sql2022;Integrated Security=False;" |
| | | //"ConnectionString": "Data Source=DESKTOP-0EJDG95\\MSSQLSERVER1;Initial Catalog=WMS_V01;Integrated Security=True;" |
| | | }, |