using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using VolPro.Core.Filters; using Warehouse.IServices; namespace Warehouse.Controllers; /// /// 定时任务 API 端点。 /// Vol.Pro 框架通过 Sys_QuartzOptions 表配置 URL+Cron 定时调用。 /// 每个方法加 [ApiTask] 属性以允许框架匿名调用。 /// /// 不在 Controller 层注入具体业务类——通过 HttpContext.RequestServices 按需解析, /// 避免 Controller 构造函数的 DI 依赖链过长。 /// [Route("api/task")] public class TaskController : Controller { /// T1: 设备同步 — 遍历在线网关触发全量设备同步(每5分钟) [ApiTask] [HttpGet, HttpPost, Route("syncDevices")] public async Task SyncDevices() { var sp = HttpContext.RequestServices; if (sp.GetService() == null) return StatusCode(500, new { error = "服务未注册: gateway_nodesService" }); // 复用 SyncDevicesJob 的核心流程(Job 内部自行创建 GatewayClient) var job = new VolPro.Warehouse.Services.SyncDevicesJob(sp); await job.Execute(null!); return Ok(new { time = DateTime.Now, status = "ok" }); } /// T2: 心跳监控 — 扫描超时网关标记离线(每15秒) [ApiTask] [HttpGet, HttpPost, Route("heartbeatMonitor")] public async Task HeartbeatMonitor() { var sp = HttpContext.RequestServices; var gwSvc = sp.GetService(); if (gwSvc == null) return StatusCode(500, new { error = "服务未注册: gateway_nodesService" }); var job = new VolPro.Warehouse.Services.HeartbeatMonitorJob(sp); await job.Execute(null!); return Ok(new { time = DateTime.Now, status = "ok" }); } /// T3: 实时轮询 — 拉取 MC4 IoT 实时值(每10秒) [ApiTask] [HttpGet, HttpPost, Route("realtimePoll")] public async Task RealtimePoll() { var sp = HttpContext.RequestServices; var gwSvc = sp.GetService(); if (gwSvc == null) return StatusCode(500, new { error = "服务未注册: gateway_nodesService" }); var job = new VolPro.Warehouse.Services.RealtimePollJob(sp); await job.Execute(null!); return Ok(new { time = DateTime.Now, status = "ok" }); } /// T4: 规则引擎 — 评估规则+执行动作(每10秒) [ApiTask] [HttpGet, HttpPost, Route("ruleEngine")] public async Task RuleEngine() { var sp = HttpContext.RequestServices; var ruleRepo = sp.GetService(); if (ruleRepo == null) return StatusCode(500, new { error = "服务未注册: Iwarehouse_ruleRepository" }); var engine = new Warehouse.Services.RuleEngineService(ruleRepo); await engine.EvaluateAllAsync(); return Ok(new { time = DateTime.Now, status = "ok" }); } }