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;
+ }
+
+}