add - 提升机调度逻辑

dev
WenJY 1 week ago
parent ddd28d81f2
commit 60b57128fa

@ -0,0 +1,95 @@
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2026 WenJY
* CLR4.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、等待提升机完成任务
}
}

@ -0,0 +1,123 @@
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2026 WenJY
* CLR4.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<GetHoistStatusResultDto> hoistStatusResult);
public static event RefreshHoistStatus RefreshHoistStatusEvent;
public HoistListener(IHoistService hoistAdapter)
{
_hoistAdapter = hoistAdapter;
}
public void Run(List<dynamic> paramInfo)
{
bool isflag = true;
do
{
List<GetHoistStatusResultDto> result = new List<GetHoistStatusResultDto>();
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<dynamic> GetPlcParams()
// {
// List<BaseDeviceInfo> deviceInfos = _deviceInfoService.GetDeviceInfos(x => x.isFlag == 1).ToList();
// List<dynamic> plcParams = new List<dynamic>();
//
// 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<string> transferStationStatus = item.deviceParams.Where(x => x.paramName .Contains("接驳位状态")).Select(x => x.paramAddress)
// .ToList();
// List<string> 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;
// }
}

@ -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["提升机控制地址"];
}
}

@ -104,5 +104,12 @@ namespace Sln.Wcs.Model.Domain
/// </summary>
[SugarColumn(IsIgnore = true)]
public int RowIndex { get; set; }
/// <summary>
/// 参数集合
/// </summary>x
[SugarColumn(IsIgnore = true)]
[Navigate(NavigateType.OneToMany, nameof(BaseDeviceParam.deviceCode), nameof(deviceCode))]
public List< BaseDeviceParam> deviceParams { get; set; }
}
}

@ -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<BaseDeviceInfo>
{
/// <summary>
/// 获取任务队列:关联任务明细
/// </summary>
/// <param name="taskWhere"></param>
/// <param name="detailWhere"></param>
/// <returns></returns>
List<BaseDeviceInfo> GetDeviceInfos(Expression<Func<BaseDeviceInfo, bool>> exp);
}
}

@ -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<BaseDeviceInfo> rep) : base(rep)
{
}
public List<BaseDeviceInfo> GetDeviceInfos(Expression<Func<BaseDeviceInfo, bool>> exp)
{
try
{
var res = _rep.Context.Queryable<BaseDeviceInfo>()
.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}");
}
}
}
}

@ -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

@ -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<HikRoBotService>();
var res = service.GbTaskSubmit(new GbTaskSubmitDto()
{
TaskType = "PF-FMR-COMMON",
TargetRoute = new List<TargetRoute>()
{
new TargetRoute(){Type = "STORAGE",Code = "R5001A02011"},
new TargetRoute(){Type = "STORAGE",Code = "R5001A01011"}
}
});
// var service = serviceProvider.GetService<HikRoBotService>();
// var res = service.GbTaskSubmit(new GbTaskSubmitDto()
// {
// TaskType = "PF-FMR-COMMON",
// TargetRoute = new List<TargetRoute>()
// {
// new TargetRoute(){Type = "STORAGE",Code = "R5001A02011"},
// new TargetRoute(){Type = "STORAGE",Code = "R5001A01011"}
// }
// });
var service = serviceProvider.GetService<IHoistSdk>();
service.GetHoistStatus(new GetHoistStatusDto());
Task.Delay(-1).Wait();
}
@ -98,6 +106,7 @@ namespace Sln.Wcs
{
CachePath = apolloConfiguration["cachePath"]
}));
}
/// <summary>
@ -108,8 +117,6 @@ namespace Sln.Wcs
/// <param name="apolloConfiguration"></param>
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<IConfiguration>(apolloConfiguration);
}
}
}
Loading…
Cancel
Save