diff --git a/Sln.Wcs.HoistDispatcher/Dispatcher.cs b/Sln.Wcs.HoistDispatcher/Dispatcher.cs new file mode 100644 index 0000000..946aab6 --- /dev/null +++ b/Sln.Wcs.HoistDispatcher/Dispatcher.cs @@ -0,0 +1,95 @@ +#region << 版 本 注 释 >> + +/*-------------------------------------------------------------------- +* 版权所有 (c) 2026 WenJY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:Mr.Wen's MacBook Pro +* 命名空间:Sln.Wcs.HoistDispatcher +* 唯一标识:764B880E-8084-48A5-B773-95E8EA044319 +* +* 创建者:WenJY +* 电子邮箱: +* 创建时间:2026-06-01 13:24:25 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ + +#endregion << 版 本 注 释 >> + +using Sln.Wcs.HoistAdapter.Domain.Dto.GetHoistStatus; +using Sln.Wcs.HoistAdapter.Domain.Enum; +using Sln.Wcs.HoistAdapter.Service; +using Sln.Wcs.Model.Domain; +using Sln.Wcs.Plc.Service; +using Sln.Wcs.Repository.service; +using Sln.Wcs.Serilog; + +namespace Sln.Wcs.HoistDispatcher; + +public class Dispatcher +{ + private readonly SerilogHelper _logger; + private readonly IHoistService _hoistAdapter; + public Dispatcher(IHoistService hoistAdapter, SerilogHelper logger) + { + _hoistAdapter = hoistAdapter; + _logger = logger; + } + + public void Run() + { + _logger.Info("提升机调度就绪,输入 start 启动,stop 停止,quit 退出"); + + while (true) + { + var input = Console.ReadLine()?.Trim().ToLower(); + + switch (input) + { + case "start": + Start(); + break; + case "stop": + Stop(); + break; + case "quit": + Stop(); + return; + default: + _logger.Info("未知指令,可用: start | stop | quit"); + break; + } + } + } + + private void Start() + { + + } + + private void Stop() + { + + } + + + + public void Run(string hostCode,string tagCode,int startPoint,int endPoint) + { + //收到提升机调度任务 + + // 1、读取 RFID 条码 + // 2、下发提升机任务:起点、终点 + // 3、等待提升机完成任务 + + + } + +} \ No newline at end of file diff --git a/Sln.Wcs.HoistDispatcher/HoistListener.cs b/Sln.Wcs.HoistDispatcher/HoistListener.cs new file mode 100644 index 0000000..188e2d3 --- /dev/null +++ b/Sln.Wcs.HoistDispatcher/HoistListener.cs @@ -0,0 +1,123 @@ +#region << 版 本 注 释 >> + +/*-------------------------------------------------------------------- +* 版权所有 (c) 2026 WenJY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:Mr.Wen's MacBook Pro +* 命名空间:Sln.Wcs.HoistDispatcher +* 唯一标识:E94B669C-DB45-4891-B01E-43E80B790AFB +* +* 创建者:WenJY +* 电子邮箱: +* 创建时间:2026-06-01 17:50:44 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ + +#endregion << 版 本 注 释 >> + +using Sln.Wcs.HoistAdapter.Domain.Dto.GetHoistStatus; +using Sln.Wcs.HoistAdapter.Domain.Model.GetHoistStatus; +using Sln.Wcs.HoistAdapter.Service; +using Sln.Wcs.Model.Domain; +using Sln.Wcs.Repository.service; + +namespace Sln.Wcs.HoistDispatcher; + +public class HoistListener +{ + private readonly IHoistService _hoistAdapter; + + public delegate void RefreshHoistStatus(List hoistStatusResult); + public static event RefreshHoistStatus RefreshHoistStatusEvent; + + public HoistListener(IHoistService hoistAdapter) + { + _hoistAdapter = hoistAdapter; + } + + public void Run(List paramInfo) + { + bool isflag = true; + do + { + List result = new List(); + paramInfo.ForEach(x => + { + try + { + GetHoistStatusResultDto hoistStatus = _hoistAdapter.GetHoistStatus(new GetHoistStatusDto() + { + hoistCode = x.hoistCode, + canDispatchTask = x.canDispatchTask, + currentFloor = x.currentFloor, + transferStationStatus = x.transferStationStatus, + readerTriggerStatus = x.readerTriggerStatus, + isDispatchBlocked = x.isDispatchBlocked, + stateIndicator = x.stateIndicator, + }); + result.Add(hoistStatus); + } + catch (Exception e) + { + isflag = false; + } + }); + + RefreshHoistStatusEvent?.Invoke(result); + } while (isflag); + } + + // private List GetPlcParams() + // { + // List deviceInfos = _deviceInfoService.GetDeviceInfos(x => x.isFlag == 1).ToList(); + // List plcParams = new List(); + // + // foreach (var item in deviceInfos) + // { + // dynamic virtualEntity = new System.Dynamic.ExpandoObject(); + // virtualEntity.hoistCode = item.deviceCode; + // virtualEntity.hostCode = item.hostCode; + // virtualEntity.deviceNumber = item.deviceName.Contains("1#") ? 1 : 2; + // if (item.deviceParams != null) + // { + // string canDispatchTask = item.deviceParams.Where(x => x.paramName .Contains("提升机反馈任务状态")).Select(x => x.paramAddress) + // .FirstOrDefault(); + // string currentFloor = item.deviceParams.Where(x => x.paramName .Contains("提升机当前层")).Select(x => x.paramAddress) + // .FirstOrDefault(); + // List transferStationStatus = item.deviceParams.Where(x => x.paramName .Contains("接驳位状态")).Select(x => x.paramAddress) + // .ToList(); + // List readerTriggerStatus = item.deviceParams.Where(x => x.paramName .Contains("读写器读取触发")).Select(x => x.paramAddress) + // .ToList(); + // string isDispatchBlocked = item.deviceParams.Where(x => x.paramName .Contains("提升机屏蔽调度")).Select(x => x.paramAddress) + // .FirstOrDefault(); + // string stateIndicator = item.deviceParams.Where(x => x.paramName .Contains("提升机状态指示")).Select(x => x.paramAddress) + // .FirstOrDefault(); + // virtualEntity.canDispatchTask = canDispatchTask; + // virtualEntity.currentFloor = currentFloor; + // virtualEntity.transferStationStatus = transferStationStatus; + // virtualEntity.readerTriggerStatus = readerTriggerStatus; + // virtualEntity.isDispatchBlocked = isDispatchBlocked; + // virtualEntity.stateIndicator = stateIndicator; + // } + // else + // { + // virtualEntity.canDispatchTask = string.Empty; + // virtualEntity.currentFloor = string.Empty; + // virtualEntity.transferStationStatus = string.Empty; + // virtualEntity.readerTriggerStatus = string.Empty; + // virtualEntity.isDispatchBlocked = string.Empty; + // virtualEntity.stateIndicator = string.Empty; + // } + // plcParams.Add(virtualEntity); + // } + // return plcParams; + // } +} \ No newline at end of file diff --git a/Sln.Wcs.HoistSdk/Config/HoistConfig.cs b/Sln.Wcs.HoistSdk/Config/HoistConfig.cs index 0e82aed..2b78fa5 100644 --- a/Sln.Wcs.HoistSdk/Config/HoistConfig.cs +++ b/Sln.Wcs.HoistSdk/Config/HoistConfig.cs @@ -43,6 +43,11 @@ public class HoistConfig throw new Exception("提升机控制地址 配置不正确,请检查Apollo配置."); } + if (string.IsNullOrEmpty(configuration["PLC参数"])) + { + throw new Exception("PLC参数 配置不正确,请检查Apollo配置."); + } + hoist_control_addr = configuration["提升机控制地址"]; } } \ No newline at end of file diff --git a/Sln.Wcs.Model/Domain/BaseDeviceInfo.cs b/Sln.Wcs.Model/Domain/BaseDeviceInfo.cs index bb7ca6f..c786aca 100644 --- a/Sln.Wcs.Model/Domain/BaseDeviceInfo.cs +++ b/Sln.Wcs.Model/Domain/BaseDeviceInfo.cs @@ -104,5 +104,12 @@ namespace Sln.Wcs.Model.Domain /// [SugarColumn(IsIgnore = true)] public int RowIndex { get; set; } + + /// + /// 参数集合 + /// x + [SugarColumn(IsIgnore = true)] + [Navigate(NavigateType.OneToMany, nameof(BaseDeviceParam.deviceCode), nameof(deviceCode))] + public List< BaseDeviceParam> deviceParams { get; set; } } } diff --git a/Sln.Wcs.Repository/service/IBaseDeviceInfoService.cs b/Sln.Wcs.Repository/service/IBaseDeviceInfoService.cs index 5bbd2a7..deae8a3 100644 --- a/Sln.Wcs.Repository/service/IBaseDeviceInfoService.cs +++ b/Sln.Wcs.Repository/service/IBaseDeviceInfoService.cs @@ -3,6 +3,7 @@ using Sln.Wcs.Repository.service.@base; using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; @@ -10,5 +11,12 @@ namespace Sln.Wcs.Repository.service { public interface IBaseDeviceInfoService : IBaseService { + /// + /// 获取任务队列:关联任务明细 + /// + /// + /// + /// + List GetDeviceInfos(Expression> exp); } } diff --git a/Sln.Wcs.Repository/service/Impl/BaseDeviceInfoServiceImpl.cs b/Sln.Wcs.Repository/service/Impl/BaseDeviceInfoServiceImpl.cs index 85db392..60b1343 100644 --- a/Sln.Wcs.Repository/service/Impl/BaseDeviceInfoServiceImpl.cs +++ b/Sln.Wcs.Repository/service/Impl/BaseDeviceInfoServiceImpl.cs @@ -3,6 +3,7 @@ using Sln.Wcs.Repository.service.@base; using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; @@ -35,5 +36,37 @@ namespace Sln.Wcs.Repository.service.Impl public BaseDeviceInfoServiceImpl(Repository rep) : base(rep) { } + + public List GetDeviceInfos(Expression> exp) + { + try + { + var res = _rep.Context.Queryable() + .Includes(x => x.deviceParams) // 先加载所有 + .Where(exp) + .ToList() + .Select(device => new BaseDeviceInfo() + { + objId = device.objId, + deviceCode = device.deviceCode, + deviceName = device.deviceName, + deviceType = device.deviceType, + deviceStatus = device.deviceStatus, + hostCode = device.hostCode, + isFlag = device.isFlag, + remark = device.remark, + deviceParams = device.deviceParams.AsQueryable() + //.Where(detailWhere) // 应用子表查询条件 + .Where(p => p.isFlag == 1) + .ToList() + }).ToList(); + + return res; + } + catch (Exception ex) + { + throw new InvalidOperationException($"通过导航查询方式获取设备信息及下属参数执行异常:{ex.Message}"); + } + } } } diff --git a/Sln.Wcs.sln b/Sln.Wcs.sln index 343280e..ee27fcd 100644 --- a/Sln.Wcs.sln +++ b/Sln.Wcs.sln @@ -28,6 +28,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sln.Wcs.Business", "Sln.Wcs EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sln.Wcs.Strategy", "Sln.Wcs.Strategy\Sln.Wcs.Strategy.csproj", "{F7658F97-F78A-4612-A1A5-490F2CDE49DD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sln.Wcs.HoistDispatcher", "Sln.Wcs.HoistDispatcher\Sln.Wcs.HoistDispatcher.csproj", "{195D901D-6F87-4FC3-AD0D-ABEAC4D06338}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -86,6 +88,10 @@ Global {F7658F97-F78A-4612-A1A5-490F2CDE49DD}.Debug|Any CPU.Build.0 = Debug|Any CPU {F7658F97-F78A-4612-A1A5-490F2CDE49DD}.Release|Any CPU.ActiveCfg = Release|Any CPU {F7658F97-F78A-4612-A1A5-490F2CDE49DD}.Release|Any CPU.Build.0 = Release|Any CPU + {195D901D-6F87-4FC3-AD0D-ABEAC4D06338}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {195D901D-6F87-4FC3-AD0D-ABEAC4D06338}.Debug|Any CPU.Build.0 = Debug|Any CPU + {195D901D-6F87-4FC3-AD0D-ABEAC4D06338}.Release|Any CPU.ActiveCfg = Release|Any CPU + {195D901D-6F87-4FC3-AD0D-ABEAC4D06338}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Sln.Wcs/Program.cs b/Sln.Wcs/Program.cs index 82d40b1..d564359 100644 --- a/Sln.Wcs/Program.cs +++ b/Sln.Wcs/Program.cs @@ -5,13 +5,18 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NeoSmart.Caching.Sqlite; +using Newtonsoft.Json; using Sln.Wcs.HikRoBotAdapter.Domain.Dto.GbTaskSubmit; using Sln.Wcs.HikRoBotAdapter.Domain.Dto.GenAgvSchedulingTask; using Sln.Wcs.HikRoBotAdapter.Service; using Sln.Wcs.HikRoBotAdapter.Service.Impl; +using Sln.Wcs.HoistSdk; +using Sln.Wcs.HoistSdk.Dto.GetHoistStatus; +using Sln.Wcs.Model.Domain; using Sln.Wcs.Repository; using Sln.Wcs.Serilog; using Sln.Wcs.Plc; +using Sln.Wcs.Repository.service; using Sln.Wcs.Strategy; using ZiggyCreatures.Caching.Fusion; using ZiggyCreatures.Caching.Fusion.Serialization.NewtonsoftJson; @@ -43,16 +48,19 @@ namespace Sln.Wcs handler.ServerCertificateCustomValidationCallback = (_, _, _, _) => true; }); - var service = serviceProvider.GetService(); - var res = service.GbTaskSubmit(new GbTaskSubmitDto() - { - TaskType = "PF-FMR-COMMON", - TargetRoute = new List() - { - new TargetRoute(){Type = "STORAGE",Code = "R5001A02011"}, - new TargetRoute(){Type = "STORAGE",Code = "R5001A01011"} - } - }); + // var service = serviceProvider.GetService(); + // var res = service.GbTaskSubmit(new GbTaskSubmitDto() + // { + // TaskType = "PF-FMR-COMMON", + // TargetRoute = new List() + // { + // new TargetRoute(){Type = "STORAGE",Code = "R5001A02011"}, + // new TargetRoute(){Type = "STORAGE",Code = "R5001A01011"} + // } + // }); + + var service = serviceProvider.GetService(); + service.GetHoistStatus(new GetHoistStatusDto()); Task.Delay(-1).Wait(); } @@ -98,6 +106,7 @@ namespace Sln.Wcs { CachePath = apolloConfiguration["cachePath"] })); + } /// @@ -108,8 +117,6 @@ namespace Sln.Wcs /// private static void ApolloConfigureServices(IServiceCollection services, ref string basePath, out IConfiguration apolloConfiguration) { - - var localConfiguration = new ConfigurationBuilder() .SetBasePath(basePath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) @@ -128,8 +135,8 @@ namespace Sln.Wcs apolloConfiguration = configurationBuilder.Build(); services.Remove(new ServiceDescriptor(typeof(IConfiguration), localConfiguration)); + services.AddSingleton(apolloConfiguration); } - } } \ No newline at end of file