From dc3ec1d9e2b0f91e608c1b1923e9fa0a9e2a9ecd Mon Sep 17 00:00:00 2001 From: icewint Date: Thu, 13 Jun 2024 16:56:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WmsController/WmsTaskController.cs | 2 +- .../Service/WmsService/WmsTaskService.cs | 63 +++++-- .../HisGetData/Pick1StandOutC3.cs | 1 - .../HisGetData/Pick2StandOutC4.cs | 163 ++++++++++++++++++ .../HisGetData/StackerOutC1.cs | 2 +- WcsMain/Plugins/ObjectCopy.cs | 36 ++++ 6 files changed, 254 insertions(+), 13 deletions(-) create mode 100644 WcsMain/Business/Convey/HistoryDataHandler/HisGetData/Pick2StandOutC4.cs create mode 100644 WcsMain/Plugins/ObjectCopy.cs diff --git a/WcsMain/ApiServe/Controllers/WmsController/WmsTaskController.cs b/WcsMain/ApiServe/Controllers/WmsController/WmsTaskController.cs index e2325c1..c977e46 100644 --- a/WcsMain/ApiServe/Controllers/WmsController/WmsTaskController.cs +++ b/WcsMain/ApiServe/Controllers/WmsController/WmsTaskController.cs @@ -25,7 +25,7 @@ public class WmsTaskController(WmsTaskService wmsTaskService) : ControllerBase /// /// [HttpPost("setStackerTask")] - public WmsApiResponse GetStackerTask([FromBody] List request) + public WmsApiResponse> GetStackerTask([FromBody] List request) { return _wmsTaskService.GetStackerTask(request); } diff --git a/WcsMain/ApiServe/Service/WmsService/WmsTaskService.cs b/WcsMain/ApiServe/Service/WmsService/WmsTaskService.cs index 8954fa8..ce0bcbb 100644 --- a/WcsMain/ApiServe/Service/WmsService/WmsTaskService.cs +++ b/WcsMain/ApiServe/Service/WmsService/WmsTaskService.cs @@ -9,6 +9,7 @@ using WcsMain.DataBase.Dao; using WcsMain.DataBase.TableEntity; using WcsMain.Enum.Stacker; using WcsMain.ExtendMethod; +using WcsMain.Plugins; using WcsMain.StaticData; using WcsMain.WcsAttribute.AutoFacAttribute; @@ -29,20 +30,51 @@ public class WmsTaskService(WmsTaskAction wmsTaskAction, AppWmsTaskDao wmsTaskDa /// /// /// - public WmsApiResponse GetStackerTask(List request) + public WmsApiResponse> GetStackerTask(List request) { - if (request.Count < 1) return WmsApiResponseFactory.RequestErr("请求的任务数量为 0"); + if (request.Count < 1) return WmsApiResponseFactory.RequestErr>(null, "请求的任务数量为 0"); + List errRequest = []; // 存放错误的请求 /* 插入库存信息 */ // ---- 库存由WMS管理,数据库表也无需操作 List wmsTasks = []; foreach (var taskData in request) { /* 检验传入的数据格式 */ bool checkData = CheckData.CheckDataRules(taskData); - if (!checkData) return WmsApiResponseFactory.RequestErr("请求的任务数据部分存在格式问题,请检查数据格式"); + if (!checkData) + { + var errorRequest = ObjectCopy.CopyProperties(taskData); + errRequest.Add(errorRequest); + } /* 检验起点和终点是否正常 */ - var existOringin = CommonData.AppLocations.ExistWmsLocation(taskData.Origin); - var existDestination = CommonData.AppLocations.ExistWmsLocation(taskData.Destination); - if(!existOringin || !existDestination) return WmsApiResponseFactory.RequestErr($"任务号:{taskData.TaskId} 的起点或者终点不正确"); + if(taskData.TaskType == (int)WmsTaskTypeEnum.moveTask) + { + var existOringin = CommonData.AppLocations.ExistWmsLocation(taskData.Origin); + var existDestination = CommonData.AppLocations.ExistWmsLocation(taskData.Destination); + if (!existOringin || !existDestination) + { + var errorRequest = ObjectCopy.CopyProperties(taskData); + errRequest.Add(errorRequest); + } + } + else if(taskData.TaskType == (int)WmsTaskTypeEnum.inTask) + { + var existDestination = CommonData.AppLocations.ExistWmsLocation(taskData.Destination); + if (!existDestination) + { + var errorRequest = ObjectCopy.CopyProperties(taskData); + errRequest.Add(errorRequest); + } + } + else if(taskData.TaskType == (int)WmsTaskTypeEnum.outTask) + { + var existOringin = CommonData.AppLocations.ExistWmsLocation(taskData.Origin); + if (!existOringin) + { + var errorRequest = ObjectCopy.CopyProperties(taskData); + errRequest.Add(errorRequest); + } + } + /* 构造任务 */ wmsTasks.Add(new AppWmsTask() { @@ -61,27 +93,38 @@ public class WmsTaskService(WmsTaskAction wmsTaskAction, AppWmsTaskDao wmsTaskDa CreatePerson = StaticString.WMS, }); } + if(errRequest.Count > 0) // 如果有错误请求,则返回错误请求 + { + return WmsApiResponseFactory.RequestErr(errRequest, "请求的任务数据存在异常"); + } List taskIds = []; // 存放任务号 foreach (var checkEntity in wmsTasks) { /* 检查任务号是否重复 */ List? checkSame = _wmsTaskDao.Select(new AppWmsTask() { TaskId = checkEntity.TaskId }); - if (checkSame == default) return WmsApiResponseFactory.DataBaseErr(); + if (checkSame == default) return WmsApiResponseFactory.DataBaseErr(errRequest); if (checkSame.Count > 0 || taskIds.Exists(e => e == checkEntity.TaskId)) { - return WmsApiResponseFactory.RequestErr($"任务:{checkEntity.TaskId} 已存在,请勿重复"); + return WmsApiResponseFactory.RequestErr(errRequest, $"任务:{checkEntity.TaskId} 已存在,请勿重复"); } taskIds.Add(checkEntity.TaskId); } /* 插入任务数据 */ //int insertRows = _wmsTaskDao.Insert(wmsTasks.ToArray()); // ---- 直接插入任务数据 int insertRows = _wmsTaskDao.InsertTaskAndMarkErr([.. wmsTasks]); // ---- 先清除这个料箱之前未作的任务,然后插入新数据 - if (insertRows > 0) return WmsApiResponseFactory.Success($"任务创建成功,任务号:{string.Join(',', taskIds)}"); - return WmsApiResponseFactory.Fail("数据插入失败,请稍后重试或者联系我们"); + if (insertRows > 0) return WmsApiResponseFactory.Success(errRequest, $"任务创建成功,任务号:{string.Join(',', taskIds)}"); + return WmsApiResponseFactory.Fail(errRequest, "数据插入失败,请稍后重试或者联系我们"); } + + + + + + + /// /// 更新任务状态 /// diff --git a/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/Pick1StandOutC3.cs b/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/Pick1StandOutC3.cs index 3646cbc..cdd8a02 100644 --- a/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/Pick1StandOutC3.cs +++ b/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/Pick1StandOutC3.cs @@ -88,7 +88,6 @@ public class Pick1StandOutC3(ConveyOperation conveyOperation, DataBaseData dataB return; } /* 判断拣选任务中有没有 1 号台的任务,若有则给一号路向 */ - var pickStand1Task = conveyTasks.Find(f => f.Location == "P1"); if(pickStand1Task == default) // 不存在 1 号台任务 { diff --git a/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/Pick2StandOutC4.cs b/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/Pick2StandOutC4.cs new file mode 100644 index 0000000..2a707fe --- /dev/null +++ b/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/Pick2StandOutC4.cs @@ -0,0 +1,163 @@ +using WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I; +using WcsMain.Common; +using WcsMain.DataBase.Dao; +using WcsMain.DataBase.TableEntity; +using WcsMain.DataService; +using WcsMain.Enum.Convey; +using WcsMain.EquipOperation.Convey; +using WcsMain.EquipOperation.Entity; +using WcsMain.ExtendMethod; + +namespace WcsMain.Business.Convey.HistoryDataHandler.HisGetData; + +/// +/// 拣选 2 区出口扫码 +/// +/// +/// +/// +public class Pick2StandOutC4(ConveyOperation conveyOperation, DataBaseData dataBaseData, AppConveyTaskDao conveyTaskDao) : IBaseGetData +{ + private readonly ConveyOperation _conveyOperation = conveyOperation; + private readonly DataBaseData _dataBaseData = dataBaseData; + private readonly AppConveyTaskDao _conveyTaskDao = conveyTaskDao; + + /// + /// 扫码失败 + /// + /// + /// + /// + /// + public void ReadFail(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData) + { + int plcId = _dataBaseData.GetNewPlcTaskId() ?? StaticData.StaticInt.ErrPlcId; + ConveyPLCTask plcTask = new(plcId, (short)ConveyRouterEnum.Go); // 读码失败,大环线继续 + string errText = _conveyOperation.WriteTask(area, plcTask); + if (string.IsNullOrEmpty(errText)) + { + ConsoleLog.Success($"二区出口:{area} 读码失败,写入PLC成功,{plcTask}"); + return; + } + ConsoleLog.Warning($"【警告】二区出口:{area} 读码失败,写入PLC失败,{plcTask},信息:{errText}"); + return; + } + + /// + /// 扫码成功 + /// + /// + /// + /// + /// + public void ReadSuccess(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData) + { + int plcId = _dataBaseData.GetNewPlcTaskId() ?? StaticData.StaticInt.ErrPlcId; // 获取一个 plcId + (string code, string direction) = msg.FormatDir(); + /* 判断方向是否正确 */ + string? routerDirection = routerMethodData.AllowDirection; + if (!string.IsNullOrEmpty(routerDirection)) + { + string[] dirs = routerDirection.Split(','); + if (!dirs.Contains(direction)) + { + ConsoleLog.Warning($"【警告】二区出口:{area} 箱码:{msg} 方向:{direction} 方向不正确,允许的方向为:{routerDirection}"); + ConveyPLCTask plcTask = new(plcId, (short)ConveyRouterEnum.Go); + string errText = _conveyOperation.WriteTask(area, plcTask); + if (string.IsNullOrEmpty(errText)) + { + ConsoleLog.Success($"二区出口:{area} 箱码:{msg},写入PLC成功,{plcTask}"); + return; + } + ConsoleLog.Warning($"【警告】二区出口:{area} 箱码:{msg},写入PLC失败,{plcTask},信息:{errText}"); + return; + } + } + /* 判断条码有没有拣选任务 */ + List? conveyTasks = _conveyTaskDao.Query(new AppConveyTask { VehicleNo = code, TaskStatus = (int)ConveyTaskStatusEnum.create }); + if (conveyTasks == default) + { + ConsoleLog.Warning($"【警告】二区出口:{area} 箱码:{msg} 查询任务失败,和服务器连接中断"); + ConveyPLCTask plcTask = new(plcId, (short)ConveyRouterEnum.Go); // 连接中断去往拣选区 1 + string errText = _conveyOperation.WriteTask(area, plcTask); + if (string.IsNullOrEmpty(errText)) + { + ConsoleLog.Success($"二区出口:{area} 箱码:{msg},写入PLC成功,{plcTask}"); + return; + } + ConsoleLog.Warning($"【警告】二区出口:{area} 箱码:{msg},写入PLC失败,{plcTask},信息:{errText}"); + return; + } + if (conveyTasks.Count < 1) + { + ConsoleLog.Warning($"【警告】二区出口:{area} 箱码:{msg} 无拣选任务"); + ConveyPLCTask plcTask = new(plcId, (short)ConveyRouterEnum.Go); + string errText = _conveyOperation.WriteTask(area, plcTask); + if (string.IsNullOrEmpty(errText)) + { + ConsoleLog.Success($"二区出口:{area} 箱码:{msg},写入PLC成功,{plcTask}"); + return; + } + ConsoleLog.Warning($"【警告】二区出口:{area} 箱码:{msg},写入PLC失败,{plcTask},信息:{errText}"); + return; + } + /* 判断有没有 1~5 站台的任务,若有则直行前往 1 区 */ + List pick1Stand = CommonData.AppConveyStands.FindAll(f => f.StandType == (int)ConveyStandTypeEnum.pick && f.Area == "pick1"); + List pick1Stands = pick1Stand.Select(f => f.StandId).ToList(); + bool exists = false; // 默认不存在 1~5 站台(pick1 区域) 任务 + foreach (var conveyTask in conveyTasks) + { + if (pick1Stands.Contains(conveyTask.Location)) + { + exists = true; + break; + } + } + if (exists) // 存在该区域任务 1~5 站台(pick1 区域) + { + ConsoleLog.Info($"二区出口:{area} 箱码:{msg} 存在 1~5 站台任务"); + ConveyPLCTask plcTask = new(plcId, (short)ConveyRouterEnum.Go); + string errText = _conveyOperation.WriteTask(area, plcTask); + if (string.IsNullOrEmpty(errText)) + { + ConsoleLog.Success($"二区出口:{area} 箱码:{msg},写入PLC成功,{plcTask}"); + return; + } + ConsoleLog.Warning($"【警告】二区出口:{area} 箱码:{msg},写入PLC失败,{plcTask},信息:{errText}"); + return; + } + else // 6~9 站台(pick2 区域) + { + /* 检查有没有 6 站台的任务 */ + var pickStand6Task = conveyTasks.Find(f => f.Location == "P6"); + if (pickStand6Task == default) // 不存在 6 号台任务 + { + ConsoleLog.Warning($"【警告】二区出口:{area} 箱码:{msg} 不存在6号台任务,环线运行"); + ConveyPLCTask plcTask = new(plcId, (short)ConveyRouterEnum.Move); // 不存在6号台任务 + string errText = _conveyOperation.WriteTask(area, plcTask); + if (string.IsNullOrEmpty(errText)) + { + ConsoleLog.Success($"二区出口:{area} 箱码:{msg},写入PLC成功,{plcTask}"); + return; + } + ConsoleLog.Warning($"【警告】二区出口:{area} 箱码:{msg},写入PLC失败,{plcTask},信息:{errText}"); + return; + } + else + { + ConsoleLog.Info($"二区出口:{area} 箱码:{msg} 存在6号台任务,移栽 6 号站台"); + ConveyPLCTask plcTask = new(plcId, (short)ConveyRouterEnum.Router_1); // 存在6号台任务 + string errText = _conveyOperation.WriteTask(area, plcTask); + if (string.IsNullOrEmpty(errText)) + { + ConsoleLog.Success($"二区出口:{area} 箱码:{msg},写入PLC成功,{plcTask}"); + return; + } + ConsoleLog.Warning($"【警告】二区出口:{area} 箱码:{msg},写入PLC失败,{plcTask},信息:{errText}"); + return; + } + } + + + } +} diff --git a/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/StackerOutC1.cs b/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/StackerOutC1.cs index 68a872b..cf62950 100644 --- a/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/StackerOutC1.cs +++ b/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/StackerOutC1.cs @@ -117,7 +117,7 @@ public class StackerOutC1(ConveyOperation conveyOperation, DataBaseData dataBase if(exists) // 存在该区域任务 1~5 站台(pick1 区域) { ConsoleLog.Info($"出库分流:{area} 箱码:{msg} 存在 1~5 站台任务"); - ConveyPLCTask plcTask = new(plcId, (short)ConveyRouterEnum.Go); // 连接中断去往拣选站台 + ConveyPLCTask plcTask = new(plcId, (short)ConveyRouterEnum.Go); string errText = _conveyOperation.WriteTask(area, plcTask); if (string.IsNullOrEmpty(errText)) { diff --git a/WcsMain/Plugins/ObjectCopy.cs b/WcsMain/Plugins/ObjectCopy.cs new file mode 100644 index 0000000..ee221da --- /dev/null +++ b/WcsMain/Plugins/ObjectCopy.cs @@ -0,0 +1,36 @@ +namespace WcsMain.Plugins; + + +/// +/// object 拷贝 +/// +public class ObjectCopy +{ + + /// + /// 将一个类拷贝到另一个类 + /// + /// + /// + /// + /// + public static OUT CopyProperties(IN input) where OUT : class, new() where IN : class, new() + { + // 输出 + OUT newClass = Activator.CreateInstance(); + Type outType = newClass.GetType(); + var outProperties = outType.GetProperties(); + if (outProperties == default || outProperties.Length == 0) return newClass; + // 输入 + Type inType = typeof(IN); + var inProperties = inType.GetProperties(); + foreach ( var inProperty in inProperties) + { + var outPropertie = outProperties.FirstOrDefault(s => s.Name == inProperty.Name); + if(outPropertie == default) continue; + outPropertie.SetValue(newClass, inProperty.GetValue(input)); + } + return newClass; + } + +}