You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
4.4 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Reflection;
using Com.Ctrip.Framework.Apollo;
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);
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<IConfiguration>(localConfig);
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<IConfiguration>(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<SerilogHelper>();
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<HikRoBotDispatchHub>();
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
};
hub.ReciveTask(detail);
return Results.Ok(new { success = true });
});
// Hub 方法: GetTaskStatus
api.MapGet("/task/status", (string taskCode) =>
{
string taskStatus = hub.GetTaskStatus(taskCode);
return Results.Ok(new { time = DateTime.Now, status = "ok" , taskStatus = taskStatus });
});
//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);
/// <summary>
/// 请求参数
/// </summary>
/// <param name="TaskCode">WCS 下发的任务编号:同 submit 接口</param>
/// <param name="HoistCode">提升机编号15 栋入库-1#Hoist 15栋出库-2#Hoist14 栋提升机-3#Host13 栋提升机-4#Hoist</param>
record HikRoBotWaitRequest(string TaskCode, string HoistCode);