<add>[important]添加注册口逻辑
This commit is contained in:
parent
1cf596f729
commit
a3b103a279
|
|
@ -0,0 +1,33 @@
|
|||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using WcsMain.ApiServe.ControllerFilter.ExceptionFilter;
|
||||
using WcsMain.ApiServe.Controllers.Dto;
|
||||
using WcsMain.ApiServe.Factory;
|
||||
using WcsMain.DataBase.TableEntity;
|
||||
|
||||
namespace WcsMain.ApiServe.Controllers.WcsController;
|
||||
|
||||
|
||||
|
||||
[Route("api/wcs/conveyTask")]
|
||||
[ApiController]
|
||||
[WcsExceptionFilter]
|
||||
public class ConveyTaskController : ControllerBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 分页查询箱式线任务
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost("queryConveyTaskWithPage")]
|
||||
public WcsApiResponse<int, List<AppConveyTask>> QueryConveyTaskWithPage()
|
||||
{
|
||||
// TODO
|
||||
return WcsApiResponseFactory.Fail<int, List<AppConveyTask>>();
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
66
WcsMain/Business/CirculationTask/Convey/ReadScanCode.cs
Normal file
66
WcsMain/Business/CirculationTask/Convey/ReadScanCode.cs
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
using CirculateTool;
|
||||
using WcsMain.Business.Convey.HistoryDataHandler;
|
||||
using WcsMain.DataBase.Dao;
|
||||
using WcsMain.DataBase.TableEntity;
|
||||
using WcsMain.Enum.General;
|
||||
using WcsMain.EquipOperation.Convey;
|
||||
|
||||
namespace WcsMain.Business.CirculationTask.Convey;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 箱式线读取扫码信息
|
||||
/// </summary>
|
||||
[Circulation]
|
||||
public class ReadScanCode(AppRouterMethodDao routerMethodDao, ConveyOperation conveyOperation, HistoryConveyDataHander historyConveyDataHander)
|
||||
{
|
||||
private readonly ConveyOperation _conveyOperation = conveyOperation;
|
||||
private readonly AppRouterMethodDao _routerMethodDao = routerMethodDao;
|
||||
private readonly HistoryConveyDataHander _historyConveyDataHander = historyConveyDataHander;
|
||||
|
||||
|
||||
private static List<AppRouterMethod>? routers;
|
||||
|
||||
/// <summary>
|
||||
/// 读取扫码数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[Circulation("读取扫码数据", 300)]
|
||||
public bool ReadData()
|
||||
{
|
||||
if(routers == default)
|
||||
{
|
||||
routers = _routerMethodDao.Query(new AppRouterMethod() { RouterStatus = (int)TrueFalseEnum.TRUE });
|
||||
return true;
|
||||
}
|
||||
List<Task> tasks = [];
|
||||
foreach(AppRouterMethod router in routers)
|
||||
{
|
||||
(var readErrText, var scanOk, var code) = _conveyOperation.ReadScanInfo(router.Area);
|
||||
if(!string.IsNullOrEmpty(readErrText))
|
||||
{
|
||||
ConsoleLog.Exception($"【异常】读取扫码:{router.Area} 数据异常,信息:{readErrText}");
|
||||
Thread.Sleep(5000);
|
||||
return true; // 不读了,估计网断了
|
||||
}
|
||||
if(scanOk != (int)TrueFalseEnum.TRUE) { continue; }
|
||||
tasks.Add(Task.Factory.StartNew(() =>
|
||||
{
|
||||
_historyConveyDataHander.GetData("-", code, router.Area ?? "");
|
||||
string clearErrText = _conveyOperation.ClearScanStatus(router.Area);
|
||||
if(!string.IsNullOrEmpty(clearErrText))
|
||||
{
|
||||
ConsoleLog.Exception($"【异常】扫码:{router.Area} 清理读码信号异常,信息:{clearErrText}");
|
||||
}
|
||||
}));
|
||||
}
|
||||
Task.WaitAll([.. tasks]);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
using System.Reflection;
|
||||
using WcsMain.Business.Convey.DataHandler.GetRouter;
|
||||
using Autofac;
|
||||
using System.Reflection;
|
||||
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
|
||||
using WcsMain.DataBase.Dao;
|
||||
using WcsMain.DataBase.TableEntity;
|
||||
using WcsMain.Tcp.Entity.Convey;
|
||||
|
|
@ -11,11 +12,12 @@ namespace WcsMain.Business.Convey.DataHandler;
|
|||
/// 输送线收到的数据处理基础类
|
||||
/// </summary>
|
||||
[Component]
|
||||
public class BaseConveyDataHandler(AppRouterMethodDao routerMethodDao)
|
||||
public class BaseConveyDataHandler(AppRouterMethodDao routerMethodDao, IComponentContext componentContext)
|
||||
{
|
||||
private readonly IComponentContext _componentContext = componentContext;
|
||||
private readonly AppRouterMethodDao _routerMethodDao = routerMethodDao;
|
||||
|
||||
private Dictionary<string, BaseGetRouter?>? methodConfig;
|
||||
private Dictionary<string, IBaseGetRouter?>? methodConfig;
|
||||
|
||||
/// <summary>
|
||||
/// 处理 PLC 请求分拣路向逻辑
|
||||
|
|
@ -44,7 +46,7 @@ public class BaseConveyDataHandler(AppRouterMethodDao routerMethodDao)
|
|||
}
|
||||
if(routerData.Code == "NoRead")
|
||||
{
|
||||
instance.NoRead(routerData, displayName, msg);
|
||||
instance.ReadFail(routerData, displayName, msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -64,7 +66,7 @@ public class BaseConveyDataHandler(AppRouterMethodDao routerMethodDao)
|
|||
if (appRouters == default) return;
|
||||
methodConfig = [];
|
||||
// 扫描创建继承 BaseGetRouter 的类的实例
|
||||
Dictionary<string, BaseGetRouter> classInstances = [];
|
||||
Dictionary<string, IBaseGetRouter> classInstances = [];
|
||||
var assembly = Assembly.GetExecutingAssembly();
|
||||
var assTypes = assembly.GetTypes();
|
||||
foreach (var assType in assTypes)
|
||||
|
|
@ -72,10 +74,10 @@ public class BaseConveyDataHandler(AppRouterMethodDao routerMethodDao)
|
|||
var interfaces = assType.GetInterfaces();
|
||||
foreach (var inteface in interfaces)
|
||||
{
|
||||
if (inteface.GetType() != typeof(BaseGetRouter)) continue;
|
||||
if (inteface.GetType() != typeof(IBaseGetRouter)) continue;
|
||||
var instance = Activator.CreateInstance(inteface.GetType());
|
||||
if (instance == default) continue;
|
||||
classInstances.Add(assType.Name, (BaseGetRouter)instance);
|
||||
classInstances.Add(assType.Name, (IBaseGetRouter)instance);
|
||||
}
|
||||
}
|
||||
// 将实例和请求点位绑定
|
||||
|
|
|
|||
|
|
@ -1,8 +1,20 @@
|
|||
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
|
||||
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
|
||||
using WcsMain.Tcp.Entity.Convey;
|
||||
|
||||
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
|
||||
|
||||
/// <summary>
|
||||
/// 发货获取路向
|
||||
/// </summary>
|
||||
public class DeliverGetRouter : BaseGetRouter
|
||||
public class DeliverGetRouter : IBaseGetRouter
|
||||
{
|
||||
public void ReadFail(GetRouterData routerData, string? disPlayName, string msg)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
using WcsMain.Tcp.Entity.Convey;
|
||||
|
||||
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
|
||||
namespace WcsMain.Business.Convey.DataHandler.GetRouter.I;
|
||||
|
||||
public class BaseGetRouter
|
||||
public interface IBaseGetRouter
|
||||
{
|
||||
/// <summary>
|
||||
/// 读码失败
|
||||
|
|
@ -11,10 +11,7 @@ public class BaseGetRouter
|
|||
/// <param name="disPlayName"></param>
|
||||
/// <param name="msg"></param>
|
||||
/// <exception cref="NotImplementedException"></exception>
|
||||
public virtual void NoRead(GetRouterData routerData, string? disPlayName, string msg)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
void ReadFail(GetRouterData routerData, string? disPlayName, string msg);
|
||||
|
||||
/// <summary>
|
||||
/// 不是读码失败
|
||||
|
|
@ -23,8 +20,5 @@ public class BaseGetRouter
|
|||
/// <param name="disPlayName"></param>
|
||||
/// <param name="msg"></param>
|
||||
/// <exception cref="NotImplementedException"></exception>
|
||||
public virtual void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg);
|
||||
}
|
||||
|
|
@ -1,9 +1,20 @@
|
|||
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
|
||||
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
|
||||
using WcsMain.Tcp.Entity.Convey;
|
||||
|
||||
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
|
||||
|
||||
/// <summary>
|
||||
/// 注册口获取路向
|
||||
/// </summary>
|
||||
public class LoginGetRouter : BaseGetRouter
|
||||
public class LoginGetRouter : IBaseGetRouter
|
||||
{
|
||||
|
||||
public void ReadFail(GetRouterData routerData, string? disPlayName, string msg)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,20 @@
|
|||
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
|
||||
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
|
||||
using WcsMain.Tcp.Entity.Convey;
|
||||
|
||||
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
|
||||
|
||||
/// <summary>
|
||||
/// 拣选请求获取路向
|
||||
/// </summary>
|
||||
public class PickGetRouter : BaseGetRouter
|
||||
public class PickGetRouter : IBaseGetRouter
|
||||
{
|
||||
public void ReadFail(GetRouterData routerData, string? disPlayName, string msg)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,20 @@
|
|||
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
|
||||
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
|
||||
using WcsMain.Tcp.Entity.Convey;
|
||||
|
||||
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
|
||||
|
||||
/// <summary>
|
||||
/// 复核获取路向
|
||||
/// </summary>
|
||||
public class RecheckGetRouter : BaseGetRouter
|
||||
public class RecheckGetRouter : IBaseGetRouter
|
||||
{
|
||||
public void ReadFail(GetRouterData routerData, string? disPlayName, string msg)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,20 @@
|
|||
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
|
||||
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
|
||||
using WcsMain.Tcp.Entity.Convey;
|
||||
|
||||
namespace WcsMain.Business.Convey.DataHandler.GetRouter;
|
||||
|
||||
/// <summary>
|
||||
/// 补货获取路向
|
||||
/// </summary>
|
||||
public class ReplenishGetRouter : BaseGetRouter
|
||||
public class ReplenishGetRouter : IBaseGetRouter
|
||||
{
|
||||
public void ReadFail(GetRouterData routerData, string? disPlayName, string msg)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void ReadSuccess(GetRouterData routerData, string? disPlayName, string msg)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
3
WcsMain/Business/Convey/DataHandler/Readme.txt
Normal file
3
WcsMain/Business/Convey/DataHandler/Readme.txt
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
|
||||
该文件夹是给 TCP 通讯的 PLC 预留的功能
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
using WcsMain.DataBase.TableEntity;
|
||||
using WcsMain.Tcp.Entity.Convey;
|
||||
|
||||
namespace WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
|
||||
|
||||
/// <summary>
|
||||
/// 传统读码方式
|
||||
/// </summary>
|
||||
public interface IBaseGetData
|
||||
{
|
||||
/// <summary>
|
||||
/// 读码失败
|
||||
/// </summary>
|
||||
/// <param name="area"></param>
|
||||
/// <param name="disPlayName"></param>
|
||||
/// <param name="msg"></param>
|
||||
/// <param name="routerMethodData"></param>
|
||||
void ReadFail(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData );
|
||||
|
||||
/// <summary>
|
||||
/// 读码成功
|
||||
/// </summary>
|
||||
/// <param name="area"></param>
|
||||
/// <param name="disPlayName"></param>
|
||||
/// <param name="msg"></param>
|
||||
/// <param name="routerMethodData"></param>
|
||||
void ReadSuccess(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData);
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
using WcsMain.ApiClient.DataEntity.WmsEntity;
|
||||
using WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
|
||||
using WcsMain.Common;
|
||||
using WcsMain.DataBase.TableEntity;
|
||||
using WcsMain.ExtendMethod;
|
||||
using WcsMain.Plugins;
|
||||
|
||||
namespace WcsMain.Business.Convey.HistoryDataHandler.HisGetData;
|
||||
|
||||
/// <summary>
|
||||
/// 注册口逻辑
|
||||
/// </summary>
|
||||
public class LoginGetData(WmsWebApiPost wmsWebApiPost) : IBaseGetData
|
||||
{
|
||||
|
||||
private readonly WmsWebApiPost _wmsWebApiPost = wmsWebApiPost;
|
||||
|
||||
/// <summary>
|
||||
/// 读码失败
|
||||
/// </summary>
|
||||
/// <param name="disPlayName"></param>
|
||||
/// <param name="msg"></param>
|
||||
/// <param name="area"></param>
|
||||
/// <param name="routerMethodData"></param>
|
||||
public void ReadFail(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
|
||||
{
|
||||
ConsoleLog.Warning($"【警告】注册口:{area} 读码失败");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 读码成功
|
||||
/// </summary>
|
||||
/// <param name="disPlayName"></param>
|
||||
/// <param name="msg"></param>
|
||||
/// <param name="area"></param>
|
||||
/// <param name="routerMethodData"></param>
|
||||
public void ReadSuccess(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
|
||||
{
|
||||
(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} 箱码:{code} 方向:{direction} 方向不正确,允许的方向为:{routerDirection}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* 发送 WMS 请求入库 */
|
||||
ApplyInRequest applyInRequest = new()
|
||||
{
|
||||
Point = area,
|
||||
VehicleNo = code,
|
||||
CodeMessage = msg
|
||||
};
|
||||
var postResult = _wmsWebApiPost.HttpPost<ApplyInRequest, WmsResponse>(applyInRequest, CommonData.AppConfig.ApplyEnterApiAddress ?? "");
|
||||
if(!postResult.IsSend || postResult.ResponseEntity == default)
|
||||
{
|
||||
ConsoleLog.Exception($"【异常】注册口:{area} 箱码:{msg} 请求入库发生异常,异常信息:{postResult.RequestException}");
|
||||
return;
|
||||
}
|
||||
if( postResult.ResponseEntity.Code == 0)
|
||||
{
|
||||
ConsoleLog.Success($"注册口:{area} 箱码:{msg} 请求入库成功 {postResult.ResponseEntity.Message}");
|
||||
return;
|
||||
}
|
||||
ConsoleLog.Warning($"【警告】注册口:{area} 箱码:{msg} 请求入库失败,信息:{postResult.ResponseEntity.Message}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
using WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
|
||||
using WcsMain.DataBase.TableEntity;
|
||||
|
||||
namespace WcsMain.Business.Convey.HistoryDataHandler.HisGetData;
|
||||
|
||||
/// <summary>
|
||||
/// 拣选站台的逻辑
|
||||
/// </summary>
|
||||
public class PickStandGetData : IBaseGetData
|
||||
{
|
||||
public void ReadFail(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void ReadSuccess(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
using WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
|
||||
using WcsMain.DataBase.TableEntity;
|
||||
|
||||
namespace WcsMain.Business.Convey.HistoryDataHandler.HisGetData;
|
||||
|
||||
/// <summary>
|
||||
/// 入库异常异常口判定 ---- 卡特专用 ---- 苏州卡特
|
||||
/// </summary>
|
||||
public class StackerInErr : IBaseGetData
|
||||
{
|
||||
public void ReadFail(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void ReadSuccess(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
using WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
|
||||
using WcsMain.DataBase.TableEntity;
|
||||
|
||||
namespace WcsMain.Business.Convey.HistoryDataHandler.HisGetData;
|
||||
|
||||
/// <summary>
|
||||
/// 入库分流 ---- 卡特专用 ---- 苏州卡特
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// R2
|
||||
/// </remarks>
|
||||
public class StackerInSpliter : IBaseGetData
|
||||
{
|
||||
public void ReadFail(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void ReadSuccess(string? disPlayName, string msg, string? area, AppRouterMethod routerMethodData)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,132 @@
|
|||
using Autofac;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
|
||||
using WcsMain.DataBase.Dao;
|
||||
using WcsMain.DataBase.TableEntity;
|
||||
using WcsMain.Tcp.Entity.Convey;
|
||||
using WcsMain.WcsAttribute.AutoFacAttribute;
|
||||
|
||||
namespace WcsMain.Business.Convey.HistoryDataHandler;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 传统版本的箱式线数据处理
|
||||
/// </summary>
|
||||
/// <param name="routerMethodDao"></param>
|
||||
[Component]
|
||||
public class HistoryConveyDataHander(AppRouterMethodDao routerMethodDao, IComponentContext componentContext)
|
||||
{
|
||||
private readonly IComponentContext _componentContext = componentContext;
|
||||
private readonly AppRouterMethodDao _routerMethodDao = routerMethodDao;
|
||||
|
||||
private Dictionary<string, IBaseGetData?>? methodConfig;
|
||||
private Dictionary<string, AppRouterMethod?>? areaBaseData;
|
||||
|
||||
/// <summary>
|
||||
/// 处理 PLC 请求分拣路向逻辑
|
||||
/// </summary>
|
||||
/// <param name="displayName"></param>
|
||||
/// <param name="msg"></param>
|
||||
/// <param name="area"></param>
|
||||
public void GetData(string? displayName, string msg, string area)
|
||||
{
|
||||
LoadingMethodConfig(); // 加载配置信息,仅第一次加载
|
||||
if (methodConfig == default || areaBaseData == default)
|
||||
{
|
||||
ConsoleLog.Warning("路由处理参数尚未加载,可能是和数据库服务连接存在异常");
|
||||
return;
|
||||
}
|
||||
var getInstance = methodConfig.TryGetValue(area ?? "", out var instance);
|
||||
if (!getInstance || instance == default)
|
||||
{
|
||||
ConsoleLog.Warning($"点位:{area} 未配置处理逻辑或者处理逻辑不可用");
|
||||
return;
|
||||
}
|
||||
var areaInfo = areaBaseData.TryGetValue(area ?? "", out AppRouterMethod? routerMethodData);
|
||||
if(!areaInfo || routerMethodData == default)
|
||||
{
|
||||
ConsoleLog.Warning($"点位:{area} 无可用配置信息");
|
||||
return;
|
||||
}
|
||||
if (msg == "NoRead")
|
||||
{
|
||||
instance.ReadFail(displayName, msg, area, routerMethodData);
|
||||
}
|
||||
else
|
||||
{
|
||||
instance.ReadSuccess(displayName, msg, area, routerMethodData);
|
||||
}
|
||||
}
|
||||
|
||||
/*************************/
|
||||
|
||||
private static readonly object loadLock = new();
|
||||
/// <summary>
|
||||
/// 加载获取路由的参数
|
||||
/// </summary>
|
||||
private void LoadingMethodConfig()
|
||||
{
|
||||
lock (loadLock)
|
||||
{
|
||||
if (methodConfig != default && areaBaseData != default) return;
|
||||
List<AppRouterMethod>? appRouters = _routerMethodDao.Query();
|
||||
if (appRouters == default) return;
|
||||
methodConfig = [];
|
||||
areaBaseData = [];
|
||||
// 扫描创建继承 BaseGetRouter 的类的实例
|
||||
Dictionary<string, IBaseGetData> classInstances = [];
|
||||
var assembly = Assembly.GetExecutingAssembly();
|
||||
var assTypes = assembly.GetTypes();
|
||||
foreach (var assType in assTypes)
|
||||
{
|
||||
var interfaces = assType.GetInterfaces();
|
||||
foreach (var inteface in interfaces)
|
||||
{
|
||||
var type = inteface.GetType();
|
||||
if (type != typeof(IBaseGetData)) continue;
|
||||
var instance = CreateInstance(type);
|
||||
if (instance == default) continue;
|
||||
classInstances.Add(assType.Name, (IBaseGetData)instance);
|
||||
}
|
||||
}
|
||||
// 将实例和请求点位绑定
|
||||
foreach (var appRouter in appRouters)
|
||||
{
|
||||
if (string.IsNullOrEmpty(appRouter.ClassName)) continue;
|
||||
bool isGetInstance = classInstances.TryGetValue(appRouter.ClassName, out var inst);
|
||||
if (!isGetInstance) continue;
|
||||
methodConfig.TryAdd(appRouter.Area ?? "", inst);
|
||||
areaBaseData.TryAdd(appRouter.Area ?? "", appRouter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 创建实例。自动注入参数
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
private object? CreateInstance(Type type)
|
||||
{
|
||||
var constructors = type.GetConstructors();
|
||||
var constructorList = constructors.ToList();
|
||||
constructorList = [.. constructorList.OrderByDescending(s => s.GetParameters().Length)];
|
||||
foreach (var constructor in constructorList)
|
||||
{
|
||||
var parameters = constructor.GetParameters();
|
||||
if (parameters.Length == 0) return Activator.CreateInstance(type);
|
||||
List<object> arguments = [];
|
||||
foreach (var parameter in parameters)
|
||||
{
|
||||
object par = _componentContext.Resolve(parameter.ParameterType);
|
||||
arguments.Add(par);
|
||||
}
|
||||
return Activator.CreateInstance(type, [.. arguments]);
|
||||
}
|
||||
return Activator.CreateInstance(type);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
3
WcsMain/Business/Convey/HistoryDataHandler/Readme.txt
Normal file
3
WcsMain/Business/Convey/HistoryDataHandler/Readme.txt
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
|
||||
该文件夹是传统扫码方式的处理逻辑 (0001)NoRead
|
||||
|
|
@ -18,9 +18,13 @@ public class AppRouterMethodDao
|
|||
try
|
||||
{
|
||||
var sqlFuc = CommonTool.DbServe.Queryable<AppRouterMethod>()
|
||||
.WhereIF(routerMethod.Area == default, w => w.Area == routerMethod.Area)
|
||||
.WhereIF(routerMethod.ClassName == default, w => w.ClassName == routerMethod.ClassName)
|
||||
.WhereIF(routerMethod.Remark == default, w => w.Remark == routerMethod.Remark);
|
||||
.WhereIF(routerMethod.Area != default, w => w.Area == routerMethod.Area)
|
||||
.WhereIF(routerMethod.ClassName != default, w => w.ClassName == routerMethod.ClassName)
|
||||
.WhereIF(routerMethod.RouterStatus != default, w => w.RouterStatus == routerMethod.RouterStatus)
|
||||
.WhereIF(routerMethod.ReadFailRouter != default, w => w.ReadFailRouter == routerMethod.ReadFailRouter)
|
||||
.WhereIF(routerMethod.ErrRouter != default, w => w.ErrRouter == routerMethod.ErrRouter)
|
||||
.WhereIF(routerMethod.AllowDirection != default, w => w.AllowDirection == routerMethod.AllowDirection)
|
||||
.WhereIF(routerMethod.Remark != default, w => w.Remark == routerMethod.Remark);
|
||||
return sqlFuc.ToList();
|
||||
}
|
||||
catch(Exception ex)
|
||||
|
|
|
|||
|
|
@ -75,6 +75,12 @@ public class AppConveyTask
|
|||
[SugarColumn(ColumnName = "complete_time")]
|
||||
public DateTime? CompleteTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注信息
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "remark")]
|
||||
public string? Remark { get; set; }
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,10 @@ namespace WcsMain.DataBase.TableEntity;
|
|||
/// <summary>
|
||||
/// tbl_app_router_method
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
///
|
||||
/// 箱式线每个请求点位的处理逻辑
|
||||
/// </remarks>
|
||||
[SugarTable("tbl_app_router_method")]
|
||||
public class AppRouterMethod
|
||||
{
|
||||
|
|
@ -20,6 +24,30 @@ public class AppRouterMethod
|
|||
[SugarColumn(ColumnName = "class_name")]
|
||||
public string? ClassName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 路由状态
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "router_status")]
|
||||
public int? RouterStatus { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 读码失败时的路向
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "read_fail_router")]
|
||||
public int? ReadFailRouter { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 异常时的路向
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "err_router")]
|
||||
public int? ErrRouter { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 允许的方向
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "allow_direction")]
|
||||
public string? AllowDirection { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -63,6 +63,48 @@ public class ConveyOperation
|
|||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 读取扫码点信息
|
||||
/// </summary>
|
||||
/// <param name="scanId"></param>
|
||||
/// <returns></returns>
|
||||
public (string? errText, short scanOk, string code) ReadScanInfo(string? scanId)
|
||||
{
|
||||
if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) return ("PLC尚未连接。", 0, "");
|
||||
var readResult = CommonTool.Siemens.ReadByteWithName($"扫码读取{scanId}", 22);
|
||||
if (!readResult.Success || readResult.Value == default) return (readResult.Message, 0, "");// 读取失败
|
||||
try
|
||||
{
|
||||
var readData = readResult.Value;
|
||||
short status = Convert.ToInt16(CommonTool.Siemens.Trans<short>(readData, 0)); // PLC 返回任务状态
|
||||
string code = Regex.Replace(Encoding.ASCII.GetString(readData, 2, 20), "\\W", "");
|
||||
return (string.Empty, status, code);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return (ex.Message, 0, "");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清除扫码状态
|
||||
/// </summary>
|
||||
/// <param name="scanId"></param>
|
||||
/// <returns></returns>
|
||||
public string ClearScanStatus(string? scanId)
|
||||
{
|
||||
if (!CommonData.IsConnectPlc || CommonTool.Siemens == default) return "PLC尚未连接。";
|
||||
var (writeResult, _) = CommonTool.Siemens.WritePlcWhithName($"扫码读取{scanId}", (short)0);
|
||||
if (!writeResult.Success) return writeResult.Message ?? "写入失败";
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -207,61 +249,5 @@ public class ConveyOperation
|
|||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 读取扫码点信息
|
||||
/// </summary>
|
||||
/// <param name="scanId"></param>
|
||||
/// <returns></returns>
|
||||
public (string? errText, short scanOk, string code) ReadScanInfo(string scanId)
|
||||
{
|
||||
if (!CommonData.IsConnectPlc || CommonTool.Siemens == default)
|
||||
{
|
||||
// 未连接PLC
|
||||
return ("PLC尚未连接。", 0, "");
|
||||
}
|
||||
var readResult = CommonTool.Siemens.ReadByteWithName($"扫码读取{scanId}", 22);
|
||||
if (!readResult.Success || readResult.Value == default) // 读取失败
|
||||
{
|
||||
return (readResult.Message, 0, "");
|
||||
}
|
||||
try
|
||||
{
|
||||
var readData = readResult.Value;
|
||||
short status = Convert.ToInt16(CommonTool.Siemens.Trans<short>(readData, 0)); // PLC 返回任务状态
|
||||
string code = Regex.Replace(Encoding.ASCII.GetString(readData, 2, 20), "\\W", "");
|
||||
return (string.Empty, status, code);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return (ex.Message, 0, "");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清除扫码状态
|
||||
/// </summary>
|
||||
/// <param name="scanId"></param>
|
||||
/// <returns></returns>
|
||||
public string ClearScanStatus(string scanId)
|
||||
{
|
||||
if (!CommonData.IsConnectPlc || CommonTool.Siemens == default)
|
||||
{
|
||||
// 未连接PLC
|
||||
return "PLC尚未连接。";
|
||||
}
|
||||
var (writeResult, _) = CommonTool.Siemens.WritePlcWhithName($"扫码读取{scanId}", (short)0);
|
||||
if (!writeResult.Success) // 读取失败
|
||||
{
|
||||
return writeResult.Message ?? "写入失败";
|
||||
}
|
||||
try
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return ex.Message;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
using System.Text.RegularExpressions;
|
||||
using HslCommunication;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace WcsMain.ExtendMethod;
|
||||
|
||||
|
|
@ -58,6 +59,21 @@ public static partial class StringExtendMethod
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 格式化条码,返回条码和方位码
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public static (string code, string direction) FormatDir(this string? value)
|
||||
{
|
||||
if (string.IsNullOrEmpty(value)) return (string.Empty, string.Empty);
|
||||
string[] vals = value.Split('-');
|
||||
if (vals.Length < 2) return (value, string.Empty);
|
||||
string direction = vals[^1];
|
||||
string code = value.RemoveLast(direction.Length + 1);
|
||||
return (code, direction);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
|
|
|
|||
|
|
@ -40,7 +40,6 @@
|
|||
<Folder Include="ApiServe\Controllers\Dto\CommonEntity\" />
|
||||
<Folder Include="ApiServe\Service\TestService\" />
|
||||
<Folder Include="Business\CirculationTask\Container\" />
|
||||
<Folder Include="Business\CirculationTask\Convey\" />
|
||||
<Folder Include="Business\CirculationTask\Shuttle\" />
|
||||
<Folder Include="Business\Stacker\" />
|
||||
<Folder Include="Business\StackerConvey\" />
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user