#region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEA_TaskInfoService * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using AutoMapper; using SqlSugar; using System.Net; using System.Reflection; 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.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 IMapper _mapper; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IStockInfoService _stockInfoService; private readonly ILocationInfoService _locationInfoService; private readonly IWarehouseService _warehouseService; private readonly IRoadWayinfoService _roadWayinfoService; 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(IRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, ILocationInfoService locationInfoService, IWarehouseService warehouseService, IRoadWayinfoService roadWayinfoService) : base(BaseDal) { _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(); switch (wcsTaskType) { case 1: task.TaskStatus = (int)InTaskStatusEnum.PLC_InFinish; 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; _locationInfoService.UpdateData(dt_Location); BaseDal.UpdateData(task); return content.OK($"已接收入库输送线完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); case 2: //上报MES任务完成 MES_parameter mES_Parameter = InStoreDocCallback(task.TaskNum, "Finish", "操作成功", task.PalletCode, task.TargetAddress); if (mES_Parameter.Result == "Y") { task.TaskStatus = (int)InTaskStatusEnum.SC_OutFinish; BaseDal.DeleteData(task); return content.OK($"已接收入库堆垛机完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } else { return content.Error("上传MES失败,原因:" + mES_Parameter.ResultMsg); } default: return WebResponseContent.Instance.Error($"WCS上报类型错误:{wcsTaskType}"); } } private WebResponseContent HandleOutboundTask(Dt_Task task, int wcsTaskType) { WebResponseContent content = new WebResponseContent(); switch (wcsTaskType) { case 1: //上报MES任务完成 MES_parameter mES_Parameter = OutStoreDocCallback(task.TaskNum, "Finish", "操作成功"); if (mES_Parameter.Result == "Y") { task.TaskStatus = (int)OutTaskStatusEnum.PLC_OutFinish; BaseDal.DeleteData(task); 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; BaseDal.UpdateData(task); return content.OK($"已接收出库堆垛机完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); default: return content.Error($"WCS上报类型错误:{wcsTaskType}"); } } private WebResponseContent HandleRelocationTask(Dt_Task task, int wcsTaskType) { if (wcsTaskType == 2) { task.TaskStatus = (int)RelocationTaskStatusEnum.RelocationFinish; BaseDal.UpdateData(task); return WebResponseContent.Instance.OK($"已接收移库堆垛机完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } return WebResponseContent.Instance.Error($"WCS上报类型错误:{wcsTaskType}"); } } }