#region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEA_TaskInfoService * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using AutoMapper; using Microsoft.Extensions.Logging; using Org.BouncyCastle.Math.EC; using SqlSugar; using System.ComponentModel; using System.Net; using System.Reflection; using System.Reflection.Emit; using System.Threading.Tasks; using WIDESEA_Common.LocationEnum; using WIDESEA_Common.OtherEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO.Inbound; using WIDESEA_DTO.Task; using WIDESEA_IBasicService; using WIDESEA_IInboundService; using WIDESEA_IOutboundService; using WIDESEA_IRecordService; using WIDESEA_IStockService; using WIDESEA_ITaskInfoService; using WIDESEA_Model.Models; namespace WIDESEA_TaskInfoService { public partial class TaskService : ServiceBase>, ITaskService { private readonly ILogger _logger; private readonly IMapper _mapper; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IStockInfoService _stockInfoService; private readonly ILocationInfoService _locationInfoService; private readonly IWarehouseService _warehouseService; private readonly IRoadWayinfoService _roadWayinfoService; private Timer _timer; public IRepository Repository => BaseDal; private Dictionary _taskOrderBy = new() { {nameof(Dt_Task.Grade),OrderByType.Desc }, {nameof(Dt_Task.CreateDate),OrderByType.Asc}, }; public List TaskTypes => typeof(TaskTypeEnum).GetEnumIndexList(); public List TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList(); public TaskService(ILogger logger, IRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, ILocationInfoService locationInfoService, IWarehouseService warehouseService, IRoadWayinfoService roadWayinfoService) : base(BaseDal) { _logger = logger; _mapper = mapper; _unitOfWorkManage = unitOfWorkManage; _stockInfoService = stockInfoService; _locationInfoService = locationInfoService; _warehouseService = warehouseService; _roadWayinfoService=roadWayinfoService; } public string MES_InReporttask = WIDESEA_Core.Helper.AppSettings.Configuration["MES_InReporttask"]; //入库反馈信息 public string MES_OutReporttask = WIDESEA_Core.Helper.AppSettings.Configuration["MES_OutReporttask"]; //出库反馈信息 public string MES_InventoryUpdateApply = WIDESEA_Core.Helper.AppSettings.Configuration["MES_InventoryUpdateApply"]; //储位异动申请 public string MES_InventoryUpdateCallback = WIDESEA_Core.Helper.AppSettings.Configuration["MES_InventoryUpdateCallback"]; //储位异动申请 public string MES_TaskErrorInfoCallback = WIDESEA_Core.Helper.AppSettings.Configuration["MES_TaskErrorInfoCallback"]; //任务异常上报 public string WCS_SendConveyorTask = WIDESEA_Core.Helper.AppSettings.Configuration["WCS_SendConveyorTask"]; //输送线任务下发 public string WCS_SendStackerTask = WIDESEA_Core.Helper.AppSettings.Configuration["WCS_SendStackerTask"]; //堆垛机任务下发 /// /// 任务完成接口 /// /// /// public WebResponseContent TaskCompleted(WCSTaskDTO wCSTask) { WebResponseContent webResponse= new WebResponseContent(); try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == wCSTask.TaskNum && x.PalletCode == wCSTask.PalletCode); if (task == null) return webResponse.Error("未找到任务信息"); switch ((TaskTypeEnum)task.TaskType) { case TaskTypeEnum.Inbound: return HandleInboundTask(task, wCSTask.TaskType); case TaskTypeEnum.Outbound: return HandleOutboundTask(task, wCSTask.TaskType); case TaskTypeEnum.Relocation: return HandleRelocationTask(task, wCSTask.TaskType); default: return webResponse.Error($"任务类型错误,任务号:{task.TaskId},托盘编号:{task.PalletCode},类型:{task.TaskType}"); } } catch (Exception ex) { return webResponse.Error($"WMS任务完成错误:{ex.Message}"); } } private WebResponseContent HandleInboundTask(Dt_Task task, int wcsTaskType) { WebResponseContent content = new WebResponseContent(); try { switch (wcsTaskType) { case 1: if(task.TargetAddress == "") { int loctype = 0; if (task.Roadway == "1" || task.Roadway == "2") { if (task.PalletType == "1") loctype = (int)LocationTypeEnum.SmallPallet; else if (task.PalletType == "2") loctype = (int)LocationTypeEnum.MediumPallet; } else { loctype = (int)LocationTypeEnum.LargePallet; } //查找货位,更新任务 Dt_LocationInfo dt_Location = _locationInfoService.GetLocation(task.Roadway, loctype); Dt_LocationInfo ShallowCargoHold = _locationInfoService.ShallowGetLocation(dt_Location.RoadwayNo, dt_Location.LocationType, dt_Location.Row, dt_Location.Layer, dt_Location.Column); if (ShallowCargoHold == null) return content.Error($"未找到该货位信息,货位编号:{dt_Location.LocationCode}的浅货位"); if (ShallowCargoHold.LocationStatus != (int)LocationStatusEnum.Free) return content.Error($"任务号:{task.TaskId},托盘编号:{task.PalletCode},查找的货位浅货位有货,货位编号:{ShallowCargoHold.LocationCode}"); task.TargetAddress = dt_Location.LocationCode; task.CurrentAddress = task.NextAddress; task.NextAddress = dt_Location.LocationCode; task.TaskStatus = (int)InTaskStatusEnum.PLC_InFinish; dt_Location.LocationStatus = (int)LocationStatusEnum.Lock; Dt_StockInfo dt_StockInfo = new Dt_StockInfo(); dt_StockInfo.PalletCode = task.PalletCode; dt_StockInfo.PalletType = task.PalletType; dt_StockInfo.WarehouseId = task.WarehouseId; dt_StockInfo.LocationCode = dt_Location.LocationCode; dt_StockInfo.StockStatus = (int)StockStatusEmun.入库中; dt_StockInfo.Creater = "MWS"; dt_StockInfo.CreateDate = DateTime.Now; _unitOfWorkManage.BeginTran(); _stockInfoService.AddData(dt_StockInfo); _locationInfoService.UpdateData(dt_Location); BaseDal.UpdateData(task); _unitOfWorkManage.CommitTran(); return content.OK($"已接收入库输送线完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } else { string Resultplc = MesInTaskStatusEnum.入库完成.GetDescription(); MES_parameter mES_PCLParameter = InStoreDocCallback(task.TaskNum, Resultplc, "操作成功", task.PalletCode, task.TargetAddress); if (mES_PCLParameter.Result == "Y") { task.TaskStatus = (int)InTaskStatusEnum.PLC_InFinish; _unitOfWorkManage.BeginTran(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成); _unitOfWorkManage.CommitTran(); return content.OK($"输送线任务已反馈至上游,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } else { return content.Error("上传MES失败,原因:" + mES_PCLParameter.ResultMsg); } } case 2: string Resultsc = MesInTaskStatusEnum.入库完成.GetDescription(); //上报MES任务完成 MES_parameter mES_Parameter = InStoreDocCallback(task.TaskNum, Resultsc, "操作成功", task.PalletCode, task.TargetAddress); if (mES_Parameter.Result == "Y") { Dt_StockInfo dt_Stockowc = _stockInfoService.Repository.QueryData(x => x.PalletCode == task.PalletCode).FirstOrDefault(); Dt_LocationInfo dt_LocationInfo=_locationInfoService.Repository.QueryData(x => x.LocationCode == dt_Stockowc.LocationCode).FirstOrDefault(); dt_Stockowc.StockStatus = (int)StockStatusEmun.已入库; dt_LocationInfo.LocationStatus = (int)LocationStatusEnum.InStock; task.TaskStatus = (int)InTaskStatusEnum.InFinish; _unitOfWorkManage.BeginTran(); _stockInfoService.UpdateData(dt_Stockowc); _locationInfoService.UpdateData(dt_LocationInfo); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成); _unitOfWorkManage.CommitTran(); return content.OK($"已接收入库堆垛机完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } else { return content.Error("上传MES失败,原因:" + mES_Parameter.ResultMsg); } default: return content.Error($"WCS上报类型错误:{wcsTaskType}"); } } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return content.Error($"WCS任务完成接口故障,原因:{ex.Message}"); } } private WebResponseContent HandleOutboundTask(Dt_Task task, int wcsTaskType) { WebResponseContent content = new WebResponseContent(); try { switch (wcsTaskType) { case 1: string Resultplc = MesOutTaskStatusEnum.到达目的地.GetDescription(); //上报MES任务完成 MES_parameter mES_Parameter = OutStoreDocCallback(task.TaskNum, Resultplc, "操作成功"); if (mES_Parameter.Result == "Y") { task.TaskStatus = (int)OutTaskStatusEnum.PLC_OutFinish; BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成); return content.OK($"已接收出库输送线完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } else { return content.Error("上传MES失败,原因:" + mES_Parameter.ResultMsg); } case 2: //获取对应PLC站台信息 Dt_roadwayinfo _Roadwayinfo = _roadWayinfoService.QbtainPlatform(task.Roadway); task.CurrentAddress = _Roadwayinfo.OutStationCode; task.NextAddress = task.TargetAddress; task.TaskStatus = (int)OutTaskStatusEnum.SC_OutFinish; Dt_StockInfo dt_Stockowc = _stockInfoService.Repository.QueryData(x => x.PalletCode == task.PalletCode).FirstOrDefault(); Dt_LocationInfo dt_LocationInfo = _locationInfoService.Repository.QueryData(x => x.LocationCode == dt_Stockowc.LocationCode).FirstOrDefault(); _unitOfWorkManage.BeginTran(); _stockInfoService.DeleteData(dt_Stockowc); _locationInfoService.DeleteData(dt_LocationInfo); BaseDal.UpdateData(task); _unitOfWorkManage.CommitTran(); return content.OK($"已接收出库堆垛机完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); default: return content.Error($"WCS上报类型错误:{wcsTaskType}"); } } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return content.Error($"WCS任务完成接口故障,原因:{ex.Message}"); } } private WebResponseContent HandleRelocationTask(Dt_Task task, int wcsTaskType) { WebResponseContent responseContent = new WebResponseContent(); if (wcsTaskType == 2) { //上报MES堆垛机移库任务 string Resultplc = MesOutTaskStatusEnum.到达目的地.GetDescription(); //上报MES任务完成 MES_parameter mES_Parameter = AbnormalStorageLocation(task.PalletCode, task.SourceAddress, task.TargetAddress); if (mES_Parameter.Result == "Y") { task.TaskStatus = (int)RelocationTaskStatusEnum.RelocationFinish; BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成); return WebResponseContent.Instance.OK($"已接收移库堆垛机完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } else { return responseContent.Error("上传MES失败,原因:" + mES_Parameter.ResultMsg); } } return WebResponseContent.Instance.Error($"WCS上报类型错误:{wcsTaskType}"); } } }