using System.Reflection; using Com.Ctrip.Framework.Apollo; using Flurl.Http; using Sln.Wcs; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; using NeoSmart.Caching.Sqlite; using Newtonsoft.Json; using Sln.Wcs.HikRoBotAdapter.Domain.Dto.GbTaskSubmit; using Sln.Wcs.HikRoBotAdapter.Service; using Sln.Wcs.HikRoBotDispatcher; using Sln.Wcs.Model.Domain; using Sln.Wcs.Repository; using Sln.Wcs.Repository.service; using Sln.Wcs.Serilog; using ZiggyCreatures.Caching.Fusion; using ZiggyCreatures.Caching.Fusion.Serialization.NewtonsoftJson; var builder = WebApplication.CreateBuilder(args); builder.WebHost.ConfigureKestrel(o => o.ListenLocalhost(5200)); var basePath = AppContext.BaseDirectory; // ---- 配置 ---- var localConfig = new ConfigurationBuilder() .SetBasePath(basePath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); var apolloConfigSection = localConfig.GetSection("apollo"); builder.Services.AddSingleton(localConfig); FlurlHttp.ConfigureClientForUrl("https://172.16.12.11") .ConfigureInnerHandler(handler => { handler.ServerCertificateCustomValidationCallback = (_, _, _, _) => true; }); var configProvider = new UpdateableConfigProvider(); configProvider.Set("PLC参数", ""); var apolloConfig = new ConfigurationBuilder() .SetBasePath(basePath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddApollo(apolloConfigSection) .AddDefault() .Add(configProvider) .Build(); builder.Services.Remove(new ServiceDescriptor(typeof(IConfiguration), localConfig)); builder.Services.AddSingleton(apolloConfig); // ---- DI 扫描 ---- var assemblies = new[] { Assembly.LoadFrom(Path.Combine(basePath, "Sln.Wcs.Common.dll")), Assembly.LoadFrom(Path.Combine(basePath, "Sln.Wcs.Cache.dll")), Assembly.LoadFrom(Path.Combine(basePath, "Sln.Wcs.Repository.dll")), Assembly.LoadFrom(Path.Combine(basePath, "Sln.Wcs.HikRoBotSdk.dll")), Assembly.LoadFrom(Path.Combine(basePath, "Sln.Wcs.HikRoBotAdapter.dll")), Assembly.LoadFrom(Path.Combine(basePath, "Sln.Wcs.HikRoBotDispatcher.dll")), }; builder.Services.Scan(scan => scan.FromAssemblies(assemblies) .AddClasses().AsImplementedInterfaces().AsSelf().WithTransientLifetime()); builder.Services.AddSingleton(typeof(SerilogHelper)); builder.Services.AddSqlSugarSetup(); // builder.Services.AddFusionCache() // .WithSerializer(new FusionCacheNewtonsoftJsonSerializer()) // .WithDistributedCache(new SqliteCache(new SqliteCacheOptions { CachePath = apolloConfig["cachePath"]! })); // ---- Swagger ---- builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => c.SwaggerDoc("v1", new OpenApiInfo { Title = "HikRobot Engine API", Version = "v1" })); var app = builder.Build(); // ---- 启动初始化 ---- var sp = app.Services; sp.UseSerilogExtensions(); var log = sp.GetRequiredService(); log.Info($"HikRoBotServer 启动, 日志:{apolloConfig["logPath"]}"); app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "HikRobot Engine v1"); c.RoutePrefix = "swagger"; }); // ---- HikRoBotDispatchHub.ReciveTask ---- var hub = sp.GetRequiredService(); var api = app.MapGroup("/api"); // Hub 方法: ReciveTask api.MapPost("/task/receive", (ReceiveTaskRequest req) => { var detail = new LiveTaskDetail { taskCode = req.TaskCode, deviceType = 1, taskStatus = 1, startPoint = req.StartPoint, endPoint = req.EndPoint }; bool res = hub.ReciveTask(detail); return Results.Ok(new { success = true , isSuccess = res}); }); // Hub 方法: GetTaskStatus api.MapGet("/task/status", (string taskCode) => { string taskStatus = hub.GetTaskStatus(taskCode); return Results.Ok(new { time = DateTime.Now, status = "ok" , taskStatus = taskStatus }); }); // Hub 方法: ContinueTask api.MapPost("/task/continue", (ContinueTaskRequest req) => { var detail = new LiveTaskDetail { taskCode = req.TaskCode, deviceType = 1, taskStatus = 1, startPoint = req.StartPoint, endPoint = req.EndPoint, execDevice = req.ExecDevice }; bool res = hub.ContinueTask(detail); return Results.Ok(new { success = true, isSuccess = res }); }); //0524779AA0550094 // AGV 等待点 // api.MapPost("/robot/wait", (HikRoBotWaitRequest req) => // { // return Results.Ok(new { time = DateTime.Now, status = "ok" , agvPosition = "0524779AA0550094" }); // }); api.MapGet("/health", () => Results.Ok(new { time = DateTime.Now, status = "ok" })); log.Info("HikRoBotServer 就绪: http://localhost:5200/swagger"); app.Run(); record ReceiveTaskRequest(string TaskCode, string StartPoint, string EndPoint); record ContinueTaskRequest(string TaskCode, string StartPoint, string EndPoint, string ExecDevice); /// /// 请求参数 /// /// WCS 下发的任务编号:同 submit 接口 /// 提升机编号:15 栋入库-1#Hoist ;15栋出库-2#Hoist;14 栋提升机-3#Host;13 栋提升机-4#Hoist; //record HikRoBotWaitRequest(string TaskCode, string HoistCode);