#region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEA_TaskInfoService * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using Autofac.Core; using AutoMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Org.BouncyCastle.Math.EC; using SixLabors.ImageSharp; 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.Log; 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_Core.Utilities; 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 readonly ITask_HtyService _task_HtyService; 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, ITask_HtyService task_HtyService) : base(BaseDal) { _logger = logger; _mapper = mapper; _unitOfWorkManage = unitOfWorkManage; _stockInfoService = stockInfoService; _locationInfoService = locationInfoService; _warehouseService = warehouseService; _roadWayinfoService = roadWayinfoService; _task_HtyService = task_HtyService; } 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 CESTEXT() { return WebResponseContent.Instance.OK(); } //手动,任务上报 #region public WebResponseContent MESManualUpload(SaveModel saveModel) { WebResponseContent response = new WebResponseContent(); List stdata=new List(); try { foreach (var key in saveModel.DelKeys) { int taskId = int.Parse(key.ToString()); Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == taskId); WebResponseContent taskResult = ProcessTask(task); if (!taskResult.Status) { WriteLog.Write_Log("WMS_手动上报任务", $"任务上报", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode},", $"原因:{taskResult.Message}"); return taskResult; } stdata.Add(task); } WriteLog.Write_Log("WMS_手动上报任务", $"任务上报", $"成功", $"上报的数据:{stdata.ToJson()}"); return response.OK("所有任务处理成功"); } catch (Exception ex) { WriteLog.Write_Log("WMS_手动上报任务", $"任务上报", $"失败", $"WMS任务完成错误:{ex.Message}"); return response.Error($"WMS任务完成错误:{ex.Message}"); } } private WebResponseContent ProcessTask(Dt_Task task) { WebResponseContent response = new WebResponseContent(); switch ((TaskTypeEnum)task.TaskType) { case TaskTypeEnum.Inbound: if (task.TaskStatus != (int)InTaskStatusEnum.InPLCException && task.TaskStatus != (int)InTaskStatusEnum.InSCException) { return response.Error($"任务类型错误,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } return HandleInboundTask(task, GetWcsType(task.TaskStatus, (int)InTaskStatusEnum.InPLCException, (int)InTaskStatusEnum.InSCException) ); case TaskTypeEnum.Outbound: if (task.TaskStatus != (int)OutTaskStatusEnum.OutPLCException && task.TaskStatus != (int)OutTaskStatusEnum.OutSCException) { return response.Error($"任务类型错误,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } return HandleOutboundTask(task, GetWcsType(task.TaskStatus, (int)OutTaskStatusEnum.OutPLCException, (int)OutTaskStatusEnum.OutSCException)); case TaskTypeEnum.Relocation: return HandleRelocationTask(task, 2); default: return response.Error($"任务类型错误,任务号:{task.TaskId},托盘编号:{task.PalletCode},类型:{task.TaskType}"); } } private int GetWcsType(int taskStatus, int plcStatus, int scStatus) { if (taskStatus == plcStatus) return 1; if (taskStatus == scStatus) return 2; return 0; } #endregion /// /// 任务完成接口 /// /// /// #region 任务完成 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("未找到任务信息", 404); return TaskCompletedtask(task, wCSTask.TaskType); } catch (Exception ex) { return webResponse.Error($"WMS任务完成错误:{ex.Message}"); } } public WebResponseContent TaskCompletedtask(Dt_Task task, int wcstype) { WebResponseContent webResponse = new WebResponseContent(); try { switch ((TaskTypeEnum)task.TaskType) { case TaskTypeEnum.Inbound: return HandleInboundTask(task, wcstype); case TaskTypeEnum.Outbound: return HandleOutboundTask(task, wcstype); case TaskTypeEnum.Relocation: return HandleRelocationTask(task, wcstype); 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 (string.IsNullOrEmpty(task.TargetAddress)) { if (task.TaskStatus == (int)InTaskStatusEnum.PLC_InExecuting || task.TaskStatus == (int)InTaskStatusEnum.InPLCException) { 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); if (dt_Location == null) { WriteLog.Write_Log("WCS_入库_上报完成", $"输送线完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"未找到该货位信息,托盘编号:{task.PalletCode}"); return content.Error($"未找到该货位信息,托盘编号:{task.PalletCode}"); } Dt_LocationInfo ShallowCargoHold = _locationInfoService.ShallowGetLocation(dt_Location.RoadwayNo, dt_Location.LocationType, dt_Location.Row, dt_Location.Layer, dt_Location.Column); if (ShallowCargoHold == null) { WriteLog.Write_Log("WCS_入库_上报完成", $"输送线完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"未找到该货位信息,货位编号:{dt_Location.LocationCode}的浅货位"); return content.Error($"未找到该货位信息,货位编号:{dt_Location.LocationCode}的浅货位"); } if (ShallowCargoHold.LocationStatus != (int)LocationStatusEnum.Free) return content.Error($"任务号:{task.TaskId},托盘编号:{task.PalletCode},查找的货位浅货位有货,货位编号:{ShallowCargoHold.LocationCode}"); if (task.PalletCode[0] == 1 && (dt_Location.RoadwayNo == "1" || dt_Location.RoadwayNo == "2") && dt_Location.Column < 4) { WriteLog.Write_Log("WCS_入库_上报完成", $"输送线完成", $"失败,托盘条码:{task.PalletCode},货位编号:{dt_Location.LocationCode}", $"条码为高托盘,但是查找的货位要入在低托盘下"); return content.Error($"条码为高托盘,但是查找的货位要入在低托盘下,故障,托盘条码:{task.PalletCode},货位编号:{dt_Location.LocationCode}"); } Dt_roadwayinfo _Roadwayinfo = _roadWayinfoService.QbtainPlatform(task.Roadway); task.TargetAddress = dt_Location.LocationCode; task.CurrentAddress = _Roadwayinfo.InSCStationCode; 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; dt_StockInfo.Roadway = task.Roadway; _unitOfWorkManage.BeginTran(); _stockInfoService.AddData(dt_StockInfo); _locationInfoService.UpdateData(dt_Location); BaseDal.UpdateData(task); _unitOfWorkManage.CommitTran(); WriteLog.Write_Log("WCS_入库_上报完成", $"输送线完成", $"成功,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"已接收入库输送线完成信息,添加库存信息:{dt_StockInfo.ToJson()},修改货位:{dt_Location.ToJson()}"); return content.OK($"已接收入库输送线完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } else { WriteLog.Write_Log("WCS_入库_上报完成", $"输送线完成", $"成功,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"上报失败,当前任务不是输送线执行中,WCS上报完成失败"); return content.Error("上报失败,当前任务不是输送线执行中,WCS上报完成失败"); } } else { //判断是否有该站台 if (task.TaskStatus == (int)InTaskStatusEnum.PLC_InExecuting || task.TaskStatus == (int)InTaskStatusEnum.InPLCException) { string Resultplc = MesInTaskStatusEnum.Finish.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(); WriteLog.Write_Log("WCS_入库_上报完成", $"输送线点到点完成", $"成功,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"输送线任务已反馈至上游"); return content.OK($"输送线任务已反馈至上游,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } else { task.NumberSsuances = 3; task.TaskStatus = (int)InTaskStatusEnum.InPLCException; task.Remark = "输送线入库:上传MES失败,原因:" + mES_PCLParameter.ResultMsg; BaseDal.UpdateData(task); WriteLog.Write_Log("WCS_入库_上报完成", $"输送线点到点完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"输送线任务已反馈至上游"); return content.Error("上传MES失败,原因:" + mES_PCLParameter.ResultMsg); } } else { WriteLog.Write_Log("WCS_入库_上报完成", $"输送线点到点完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"上报失败,当前任务不是输送线执行中,WCS上报完成失败"); return content.Error($"上报失败,当前任务不是输送线执行中,WCS上报完成失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } } case 2: if (task.TaskStatus == (int)InTaskStatusEnum.SC_IntExecuting || task.TaskStatus == (int)InTaskStatusEnum.InSCException) { string Resultsc = MesInTaskStatusEnum.Finish.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(); WriteLog.Write_Log("WCS_入库_上报完成", $"堆垛机完成", $"成功,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"修改后的库存:{dt_Stockowc.ToJson()},修改后的库位信息:{dt_LocationInfo.ToJson()}"); return content.OK($"已接收入库堆垛机完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } else { task.NumberSsuances = 3; task.TaskStatus = (int)InTaskStatusEnum.InSCException; task.Remark = "堆垛机入库,上传MES失败,原因:" + mES_Parameter.ResultMsg; BaseDal.UpdateData(task); WriteLog.Write_Log("WCS_入库_上报完成", $"堆垛机完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"上传MES失败,原因:{mES_Parameter.ResultMsg}"); return content.Error("上传MES失败,原因:" + mES_Parameter.ResultMsg); } } else { WriteLog.Write_Log("WCS_入库_上报完成", $"堆垛机完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"上报失败,当前任务不是堆垛机执行中,WCS上报完成失败"); return content.Error($"上报失败,当前任务不是堆垛机执行中,WCS上报完成失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } default: WriteLog.Write_Log("WCS_入库_上报完成", $"堆垛机完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"WCS上报类型错误:{wcsTaskType}"); return content.Error($"WCS上报类型错误:{wcsTaskType}"); } } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); WriteLog.Write_Log("WCS_入库_上报完成", $"堆垛机完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"WCS任务完成接口故障,原因:{ex.Message}"); return content.Error($"WCS任务完成接口故障,原因:{ex.Message}"); } } private WebResponseContent HandleOutboundTask(Dt_Task task, int wcsTaskType) { WebResponseContent content = new WebResponseContent(); try { switch (wcsTaskType) { case 1: if (task.TaskStatus == (int)OutTaskStatusEnum.PLC_OutExecuting || task.TaskStatus == (int)OutTaskStatusEnum.OutPLCException) { string Resultplc = MesOutTaskStatusEnum.Finish.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.人工完成); WriteLog.Write_Log("WCS_出库_上报完成", $"输送线完成",$"成功,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"已接收出库输送线完成信息"); return content.OK($"已接收出库输送线完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } else { task.NumberSsuances =3; task.TaskStatus = (int)OutTaskStatusEnum.OutPLCException; task.Remark = "出库,输送线上传MES失败,原因:" + mES_Parameter.ResultMsg; BaseDal.UpdateData(task); WriteLog.Write_Log("WCS_出库_上报完成", $"输送线完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"上传MES失败,原因:{mES_Parameter.ResultMsg}"); return content.Error("上传MES失败,原因:" + mES_Parameter.ResultMsg); } } else { WriteLog.Write_Log("WCS_出库_上报完成", $"输送线完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"上报失败,WMS当前任务不是输送线执行中,WCS上报完成失败"); return content.Error($"上报失败,WMS当前任务不是输送线执行中,WCS上报完成失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } case 2: if (task.TaskStatus == (int)OutTaskStatusEnum.SC_OutExecuting || task.TaskStatus == (int)OutTaskStatusEnum.OutSCException) { //获取对应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(); dt_LocationInfo.LocationStatus = (int)LocationStatusEnum.Free; string Result = MesOutTaskStatusEnum.Outstore.GetDescription(); //调取上游系统反馈开始任务 MES_parameter mES_SCParameter = OutStoreDocCallback(task.TaskNum, Result, "操作成功"); if (mES_SCParameter.Result == "Y") { _unitOfWorkManage.BeginTran(); _stockInfoService.DeleteData(dt_Stockowc); _locationInfoService.UpdateData(dt_LocationInfo); BaseDal.UpdateData(task); _unitOfWorkManage.CommitTran(); WriteLog.Write_Log("WCS_出库_上报完成", $"堆垛机完成",$"成功,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"删除的库存:{dt_Stockowc.ToJson()},修改的货位:{dt_LocationInfo.ToJson()}"); return content.OK($"已接收出库堆垛机完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } else { task.NumberSsuances = 3; task.TaskStatus = (int)OutTaskStatusEnum.OutSCException; task.Remark = "堆垛机出库:上传MES失败,原因:" + mES_SCParameter.ResultMsg; BaseDal.UpdateData(task); WriteLog.Write_Log("WCS_出库_上报完成", $"堆垛机完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"上传MES失败,原因:{mES_SCParameter.ResultMsg}"); return content.Error("上传MES失败,原因:" + mES_SCParameter.ResultMsg); } } else { WriteLog.Write_Log("WCS_出库_上报完成", $"堆垛机完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"上报失败,WMS当前任务不是堆垛机执行中,WCS上报完成失败"); return content.Error($"上报失败,WMS当前任务不是堆垛机执行中,WCS上报完成失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } default: WriteLog.Write_Log("WCS_出库_上报完成", $"堆垛机完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"WCS上报类型错误:{wcsTaskType}"); return content.Error($"WCS上报类型错误:{wcsTaskType}"); } } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); WriteLog.Write_Log("WCS_出库_上报完成", $"堆垛机完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"WCS任务完成接口故障,原因:{ex.Message}"); return content.Error($"WCS任务完成接口故障,原因:{ex.Message}"); } } private WebResponseContent HandleRelocationTask(Dt_Task task, int wcsTaskType) { WebResponseContent responseContent = new WebResponseContent(); try { if (wcsTaskType == 2) { if (task.TaskStatus == (int)RelocationTaskStatusEnum.RelocationExecuting) { //上报MES任务完成 MES_parameter mES_Parameter = AbnormalStorageLocation(task.PalletCode, task.SourceAddress, task.TargetAddress); if (mES_Parameter.Result == "Y") { Dt_Task dtOutWit=BaseDal.QueryData(x=>x.PalletCode==task.PalletCode && x.TaskStatus== (int)OutTaskStatusEnum.OutWait).FirstOrDefault(); Dt_LocationInfo OriginalLocation = _locationInfoService.Repository.QueryData(x => x.LocationCode == task.SourceAddress).FirstOrDefault(); Dt_LocationInfo NewLocation = _locationInfoService.Repository.QueryData(x => x.LocationCode == task.TargetAddress).FirstOrDefault(); Dt_StockInfo dt_StockInfo = _stockInfoService.Repository.QueryData(x => x.LocationCode == task.SourceAddress).FirstOrDefault(); List dt_Locations = new List(); OriginalLocation.LocationStatus = (int)LocationStatusEnum.Free; NewLocation.LocationStatus = dtOutWit != null? (int)LocationStatusEnum.Lock:(int)LocationStatusEnum.InStock; dt_StockInfo.LocationCode = NewLocation.LocationCode; dt_StockInfo.StockStatus = dtOutWit != null? (int)StockStatusEmun.出库中:(int)StockStatusEmun.已入库; task.TaskStatus = (int)RelocationTaskStatusEnum.RelocationFinish; if(dtOutWit != null) { dtOutWit.TaskStatus = (int)OutTaskStatusEnum.OutNew; dtOutWit.SourceAddress = NewLocation.LocationCode; dtOutWit.CurrentAddress = NewLocation.LocationCode; } dt_Locations.Add(OriginalLocation); dt_Locations.Add(NewLocation); _unitOfWorkManage.BeginTran(); if(dtOutWit!=null) BaseDal.UpdateData(dtOutWit); _locationInfoService.UpdateData(dt_Locations); _stockInfoService.UpdateData(dt_StockInfo); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成); _unitOfWorkManage.CommitTran(); WriteLog.Write_Log("WCS_移库_上报完成", $"堆垛机完成", $"成功,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"修改的货位:{dt_Locations.ToJson()},修改的库存:{dt_StockInfo.ToJson()}"); return responseContent.OK($"已接收移库堆垛机完成信息,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } else { task.NumberSsuances = 3; task.TaskStatus = (int)RelocationTaskStatusEnum.RelocationException; task.Remark = "移库,上传MES失败,原因:" + mES_Parameter.ResultMsg; BaseDal.UpdateData(task); WriteLog.Write_Log("WCS_移库_上报完成", $"堆垛机完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"上传MES失败,原因:{mES_Parameter.ResultMsg}"); return responseContent.Error("上传MES失败,原因:" + mES_Parameter.ResultMsg); } } else { WriteLog.Write_Log("WCS_移库_上报完成", $"堆垛机完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"上报失败,WMS当前任务不是堆垛机执行中,WCS上报完成失败"); return responseContent.Error($"上报失败,WMS当前任务不是堆垛机执行中,WCS上报完成失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}"); } } else { WriteLog.Write_Log("WCS_移库_上报完成", $"堆垛机完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"WCS上报类型错误:{wcsTaskType}"); return responseContent.Error($"WCS上报类型错误:{wcsTaskType}"); } } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); WriteLog.Write_Log("WCS_移库_上报完成", $"堆垛机完成", $"失败,任务号:{task.TaskId},托盘编号:{task.PalletCode}", $"WCS任务完成接口故障,原因:{ex.Message}"); return responseContent.Error($"WMS系统错误,原因:{ex.Message}"); } } #endregion //任务任务恢复 public WebResponseContent WMSTaskRecovery(SaveModel saveModel) { WebResponseContent response = new WebResponseContent(); List dt_Task = new List(); try { foreach (var key in saveModel.DelKeys) { int taskId = int.Parse(key.ToString()); Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == taskId); if (task == null) return response.Error("未找到任务信息"); task.NumberSsuances = 0; task.Remark = ""; dt_Task.Add(task); } bool updatetask= BaseDal.UpdateData(dt_Task); if (updatetask) { WriteLog.Write_Log("WMS_任务恢复", $"WMS_任务恢复", "修改成功", $"修改的数据:{dt_Task.ToJson()}"); return response.OK("所有任务处理成功"); } else { WriteLog.Write_Log("WMS_任务恢复", $"WMS_任务恢复", "修改失败", $"修改的数据:{dt_Task.ToJson()}"); return response.Error("处理失败,修改任务失败"); } } catch (Exception ex) { WriteLog.Write_Log("WMS_任务恢复", $"WMS_任务恢复", "修改失败", $"修改的数据:{dt_Task.ToJson()},失败原因:{ex.Message}"); return response.Error($"WMS任务恢复错误:{ex.Message}"); } } public virtual WebResponseContent UpdateData(SaveModel saveModel) { try { List? list = UpdateIgnoreColOnExecute?.Invoke(saveModel); if (saveModel == null || saveModel.MainData == null || saveModel.MainData.Count == 0)//判断参数是否传入 { return WebResponseContent.Instance.Error("传参错误,参数不能为空"); } string validResult = typeof(Dt_Task).ValidateDicInEntity(saveModel.MainData, false, TProperties, list?.ToArray() ?? null); if (!string.IsNullOrEmpty(validResult)) { return WebResponseContent.Instance.Error(validResult); } PropertyInfo keyPro = typeof(Dt_Task).GetKeyProperty(); if (keyPro == null) { return WebResponseContent.Instance.Error("请先设置主键"); } Dt_Task entity = saveModel.MainData.DicToModel(); Dt_Task Dt_Custask= BaseDal.QueryFirst(x=>x.TaskId==entity.TaskId); List listCol = new List(); foreach (var item in saveModel.MainData) { PropertyInfo? propertyInfo = typeof(Dt_Task).GetProperty(item.Key); if (propertyInfo == null) { propertyInfo = typeof(Dt_Task).GetProperty(item.Key.FirstLetterToLower()); if (propertyInfo == null) { propertyInfo = typeof(Dt_Task).GetProperty(item.Key.FirstLetterToUpper()); } } listCol.Add(propertyInfo?.Name); } if (saveModel.DetailData == null || saveModel.DetailData.Count == 0) { if (list != null) listCol = listCol.Where(x => !list.Contains(x)).ToList(); bool result = BaseDal.UpdateData(entity, listCol, list); WriteLog.Write_Log("WMS_任务修改", $"任务修改", $"任务编号:{entity.TaskId},托盘条码:{entity.PalletCode},是否成功:{result}", $"原来数据:{Dt_Custask.ToJson()}======>>>>>>修改后的数据:{entity.ToJson()}"); return WebResponseContent.Instance.OK(); } if (typeof(Dt_Task).GetNavigatePro() == null) { return WebResponseContent.Instance.Error("未配置导航属性"); } Type detailType = typeof(Dt_Task).GetDetailType(); MethodInfo? methodInfo = GetType().GetMethod("UpdateDataInculdesDetail"); methodInfo = methodInfo?.MakeGenericMethod(new Type[] { detailType }); object? obj = methodInfo?.Invoke(this, new object[] { entity, detailType, saveModel.DetailData, saveModel.DelKeys }); return obj as WebResponseContent; } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } //任务获取 public List GetaskQueue(string deviceId) { return BaseDal.QueryData(x => x.Roadway == deviceId && (x.TaskStatus == (int)InTaskStatusEnum.PLC_InFinish || x.TaskStatus == (int)OutTaskStatusEnum.OutNew) && x.NumberSsuances == 0) .OrderBy(x => x.Remark == null ? 0 : 1) .ToList(); //return BaseDal.QueryData(x => x.Roadway == deviceId && (x.TaskStatus == (int)InTaskStatusEnum.PLC_InFinish || x.TaskStatus == (int)OutTaskStatusEnum.OutNew) && x.NumberSsuances==0); } //获取当前堆垛机执行的任务 public bool CurrentTaskProgress(string deviceId) { int taskcount=BaseDal.QueryData(x => x.Roadway == deviceId && (x.TaskStatus == (int)InTaskStatusEnum.SC_IntExecuting || x.TaskStatus == (int)OutTaskStatusEnum.SC_OutExecuting || x.TaskStatus == (int)RelocationTaskStatusEnum.RelocationExecuting)).Count(); if (taskcount == 0) return false; return true; } //获取堆垛机完成,下发输送线的任务 public static List OutSCList = new List() { "1109", "1105", "1210", "1212", "1214" }; public List GetaskQueuePLC() { return BaseDal.QueryData(x => x.TaskStatus == (int)OutTaskStatusEnum.SC_OutFinish && OutSCList.Contains(x.CurrentAddress)); } //获取是否有移库的任务 public Dt_Task GeRelocationTaskQueue(string LocationCode) { return BaseDal.QueryData(x => x.TaskStatus == (int)RelocationTaskStatusEnum.RelocationNew && x.CurrentAddress == LocationCode).FirstOrDefault(); } public Dt_Task GeOutCuTaskQueue(string LocationCode) { return BaseDal.QueryData(x => x.TaskStatus == (int)OutTaskStatusEnum.OutNew && x.SourceAddress == LocationCode).FirstOrDefault(); } public bool RelocationTaskProgress(string deviceId) { int taskcount = BaseDal.QueryData(x => x.Roadway == deviceId && (x.TaskStatus == (int)RelocationTaskStatusEnum.RelocationExecuting || x.TaskStatus == (int)RelocationTaskStatusEnum.RelocationNew) ).Count(); if (taskcount == 0) return false; return true; } //仓库容量状态 public WebResponseContent GetWarehouseCapacity() { return _locationInfoService.GetWarehouseCapacity(); } //出入库类型分布 public WebResponseContent GetInOutTypeStats() { return _task_HtyService.GetInOutTypeStats(); } //流量情况统计 public WebResponseContent GetTodayTrafficStats() { return _task_HtyService.GetTodayInOutStats(); } //当前进行的任务 public WebResponseContent GetCurrentTasks() { // 查询所以返回TaskNum,TaskType,CreateDate,TaskStatus, var tasks = BaseDal.QueryData() .Select(t => new { WarehouseId = t.Roadway == "1" || t.Roadway == "2" ? 1 : 2, PalletType = t.PalletType, TaskNum = t.TaskId, TaskType = t.TaskType, CreateDate = t.CreateDate, TaskStatus = t.TaskStatus, TargetAddress = t.TargetAddress }) .ToList(); return WebResponseContent.Instance.OK("成功", tasks); } //总体进度 public WebResponseContent GetWarehouseOperationStatistics() { /// /// 原料仓,总出入库任务数量,今日入库,今日出库,今日待完成,今日异常任务,成品仓,总出入库数量,今日入库,今日出库,今日待完成 /// return _task_HtyService.GetWarehouseOperationStatistics(); } public WebResponseContent GetTaskDestination(string targetAddress) { WebResponseContent content = new WebResponseContent(); // 参数校验 if (string.IsNullOrWhiteSpace(targetAddress)) { return content.Error("目标地址不能为空"); } try { // 查询数据 var queryResult = BaseDal.QueryData(x => x.TargetAddress == targetAddress); // 判断查询结果 if (queryResult == null || !queryResult.Any()) { return content.Error($"未找到目标地址为[{targetAddress}]的任务"); } return content.OK($"有目标地址为[{targetAddress}]的任务,请拦截"); } catch (Exception ex) { return content.Error($"获取任务目的地失败: {ex.Message}"); } } } }