/* *设备管理扩展 — 区域树 + 点位设备列表 *所有改动在 Partial 目录,不破坏框架可升级性 */ using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.Http; using VolPro.Entity.DomainModels; using Warehouse.IServices; using System.Linq; using Microsoft.EntityFrameworkCore; namespace Warehouse.Controllers { public partial class base_deviceController { private readonly Ibase_deviceService _service;//访问业务代码 private readonly Iwarehouse_regionsService _regionsService; private readonly Iwarehouse_devicepointService _pointService; private readonly IHttpContextAccessor _httpContextAccessor; [ActivatorUtilitiesConstructor] public base_deviceController( Ibase_deviceService service, Iwarehouse_regionsService regionsService, Iwarehouse_devicepointService pointService, IHttpContextAccessor httpContextAccessor ) : base(service) { _service = service; _regionsService = regionsService; _pointService = pointService; _httpContextAccessor = httpContextAccessor; } /// /// 获取区域→点位→设备树。 /// 用于管理端左侧树形控件展示层级结构。 /// 格式: [{ id, label, type:"region", children: [{ id, label, type:"point", deviceCount }] }] /// [HttpGet] [Route("/api/DeviceManager/GetRegionTree")] public async Task GetRegionTree() { // 查所有区域 var regions = await _regionsService.FindAsIQueryable(x => true).ToListAsync(); // 查所有点位 var points = await _pointService.FindAsIQueryable(x => true).ToListAsync(); // 统计每个点位下的设备数量 //var deviceCounts = new Dictionary(); //var allDevices = await _service.FindAsIQueryable(x => true) // .Where(x => x.PointId != null) // .GroupBy(x => x.PointId!.Value) // .Select(g => new { PointId = g.Key, Count = g.Count() }) // .ToListAsync(); var deviceCounts = new Dictionary(); var devices = await _service.FindAsIQueryable(x => x.PointId != null) .Select(x => new { x.PointId }) .ToListAsync(); deviceCounts = devices .Where(x => x.PointId.HasValue) .GroupBy(x => x.PointId!.Value) .ToDictionary(g => g.Key, g => g.Count()); // 构建树形结构 var tree = new List(); foreach (var region in regions) { var regionChildren = points .Where(p => p.RegionId == region.Id) .Select(p => new { id = $"p_{p.PointID}", label = p.PointName ?? $"点位{p.PointID}", type = "point", deviceCount = deviceCounts.TryGetValue(p.PointID, out var c) ? c : 0 }) .ToList(); tree.Add(new { id = $"r_{region.Id}", label = region.RegionName ?? $"区域{region.Id}", type = "region", deviceCount = regionChildren.Count, children = regionChildren }); } return Ok(tree); } /// /// 获取指定点位下的设备列表(含子设备)。 /// 支持分页参数 page 和 size。 /// [HttpGet] [Route("/api/DeviceManager/GetDevicesByPoint")] public async Task GetDevicesByPoint(int pointId, int page = 1, int size = 20) { var query = _service.FindAsIQueryable(x => x.PointId == pointId); var total = await query.CountAsync(); var items = await query .Skip((page - 1) * size) .Take(size) .OrderBy(x => x.DeviceId) .Select(x => new { x.DeviceId, x.DeviceName, x.AdapterCode, x.SourceId, x.DeviceCategory, x.DeviceGroup, x.IsParent, x.ParentDeviceId, x.IsOnline, x.IpAddress, x.Port, x.Location, x.ExtraData, x.LastSyncTime, x.MapModelId, x.MapModelScale, x.MapModelRotation, x.Enable }) .ToListAsync(); return Ok(new { items, total }); } } }