feat 电子围栏数据配置

This commit is contained in:
2025-09-29 14:56:58 +08:00
parent f8705e7137
commit 0b66033b25
14 changed files with 462 additions and 0 deletions

View File

@@ -0,0 +1,95 @@
using Dlhis.Basic.WorkGrids.Request;
using Dlhis.Basic.WorkGrids.Response;
using Dlhis.Basic.WorkGrids.Services;
using Kurisu.AspNetCore.DataAccess.Dto;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Dlhis.Basic.WorkGrids.Controllers;
/// <summary>
/// 电子围栏操作
/// </summary>
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class EFenceController : ControllerBase
{
private readonly IEFenceService _eFenceService;
public EFenceController(IEFenceService eFenceService)
{
_eFenceService = eFenceService;
}
/// <summary>
/// 保存电子围栏(新增或更新)
/// </summary>
[HttpPost("save")]
public async Task SaveAsync([FromBody] EFenceSaveRequest request)
{
await _eFenceService.SaveAsync(request);
}
/// <summary>
/// 获取电子围栏分页
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpGet("page")]
public async Task<Pagination<EFencePageResponse>> GetEFencePageAsync([FromQuery] EFencePageRequest request)
{
return await _eFenceService.GetEFencePageAsync(request);
}
/// <summary>
/// 获取围栏下的房间
/// </summary>
/// <param name="eFenceCode"></param>
/// <returns></returns>
[HttpGet("rooms")]
public async Task<List<EFenceDormitoryRoomResponse>> GetRoomsAsync(Guid eFenceCode)
{
return await _eFenceService.GetRoomsAsync(eFenceCode);
}
/// <summary>
/// 获取房间人员
/// </summary>
/// <param name="roomId"></param>
/// <returns></returns>
[HttpGet("room-persons")]
public async Task<List<EFenceDormitoryRoomPersonResponse>> GetRoomPersonsAsync(string roomId)
{
return await _eFenceService.GetRoomPersonsAsync(roomId);
}
/// <summary>
/// 向围栏添加设备
/// </summary>
[HttpPost("devices/add")]
public async Task AddDevicesAsync(EFenceDevicesRequest request)
{
await _eFenceService.AddDevicesAsync(request.FenceId, request.DeviceCodes);
}
/// <summary>
/// 从围栏移除设备
/// </summary>
[HttpPost("devices/remove")]
public async Task RemoveDevicesAsync(EFenceDevicesRequest request)
{
await _eFenceService.RemoveDevicesAsync(request.FenceId, request.DeviceCodes);
}
/// <summary>
/// 获取设备列表
/// </summary>
/// <param name="fenceId"></param>
/// <returns></returns>
[HttpGet("devices")]
public async Task<List<EFenceDevicePageResponse>> GetDevicesByFenceIdAsync(long fenceId)
{
return await _eFenceService.GetDevicesByFenceIdAsync(fenceId);
}
}

View File

@@ -0,0 +1,12 @@
using System.ComponentModel.DataAnnotations;
namespace Dlhis.Basic.WorkGrids.Request;
public class EFenceDevicesRequest
{
[Range(1, long.MaxValue)]
public long FenceId { get; set; }
[MinLength(1)]
public List<Guid> DeviceCodes { get; set; }
}

View File

@@ -0,0 +1,8 @@
using Kurisu.AspNetCore.DataAccess.Dto;
namespace Dlhis.Basic.WorkGrids.Request;
public class EFencePageRequest : PageDto
{
}

View File

@@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations;
namespace Dlhis.Basic.WorkGrids.Request;
public class EFenceSaveRequest
{
public long? Id { get; set; }
[Required]
public string Name { get; set; }
public string Description { get; set; }
}

View File

@@ -0,0 +1,43 @@
using Dlhis.Entity.Device.Enums;
namespace Dlhis.Basic.WorkGrids.Response;
public class EFenceDevicePageResponse
{
public long Id { get; set; }
/// <summary>
/// 设备code
/// </summary>
public Guid Code { get; set; }
/// <summary>
/// 设备唯一码,IP/MAC/SNO
/// </summary>
public string UniqueNo { get; set; }
/// <summary>
/// 部署点
/// </summary>
public string DeployPlace { get; set; }
/// <summary>
/// 部署坐标
/// </summary>
public string DeployPosition { get; set; }
/// <summary>
/// 部署方向
/// </summary>
public DeviceDeployDirectionEnumType? DeployDirection { get; set; }
/// <summary>
/// 是否启用
/// </summary>
public bool Enable { get; set; }
/// <summary>
/// 厂区
/// </summary>
public string Factory { get; set; }
}

View File

@@ -0,0 +1,9 @@
namespace Dlhis.Basic.WorkGrids.Response;
public class EFenceDormitoryRoomPersonResponse
{
public string RoomId { get; set; }
public string UserCode { get; set; }
public string UserName { get; set; }
public bool? In { get; set; }
}

View File

@@ -0,0 +1,10 @@
namespace Dlhis.Basic.WorkGrids.Response;
public class EFenceDormitoryRoomResponse
{
public Guid EFenceCode { get; set; }
public string RoomId { get; set; }
public string RoomNo { get; set; }
public string HotelId { get; set; }
public bool PowerSwitch { get; set; }
}

View File

@@ -0,0 +1,23 @@
namespace Dlhis.Basic.WorkGrids.Response;
public class EFencePageResponse
{
public long Id { get; set; }
public Guid Code { get; set; }
/// <summary>
/// 围栏名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 描述/备注
/// </summary>
public string Description { get; set; }
/// <summary>
/// 设备数量
/// </summary>
public int DeviceCount { get; set; }
}

View File

@@ -0,0 +1,22 @@
using Dlhis.Basic.WorkGrids.Request;
using Dlhis.Basic.WorkGrids.Response;
using Kurisu.AspNetCore.DataAccess.Dto;
namespace Dlhis.Basic.WorkGrids.Services;
public interface IEFenceService : IScopeDependency
{
Task SaveAsync(EFenceSaveRequest request);
Task<Pagination<EFencePageResponse>> GetEFencePageAsync(EFencePageRequest request);
Task<List<EFenceDormitoryRoomResponse>> GetRoomsAsync(Guid eFenceCode);
Task<List<EFenceDormitoryRoomPersonResponse>> GetRoomPersonsAsync(string roomId);
Task AddDevicesAsync(long fenceId, List<Guid> deviceCodes);
Task RemoveDevicesAsync(long fenceId, List<Guid> deviceCodes);
Task<List<EFenceDevicePageResponse>> GetDevicesByFenceIdAsync(long fenceId);
}

View File

@@ -0,0 +1,143 @@
using Dlhis.Basic.WorkGrids.Request;
using Dlhis.Basic.WorkGrids.Response;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Entities;
using Dlhis.Entity.Dormitory.Entity;
using Kurisu.AspNetCore.DataAccess.Dto;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
using Kurisu.AspNetCore.Utils.Extensions;
using Mapster;
using SqlSugar;
namespace Dlhis.Basic.WorkGrids.Services.Implements;
public class EFenceService : IEFenceService
{
private readonly IDbContext _dbContext;
public EFenceService(IDbContext dbContext)
{
_dbContext = dbContext;
}
public async Task SaveAsync(EFenceSaveRequest request)
{
if (!request.Id.HasValue)
{
var entity = request.Adapt<EFenceEntity>();
entity.Code = Guid.NewGuid();
await _dbContext.InsertAsync(entity);
}
else
{
var entity = await _dbContext.Queryable<EFenceEntity>().SingleAsync(x => x.Id == request.Id.Value);
request.Adapt(entity);
await _dbContext.UpdateAsync(entity);
}
}
public async Task<Pagination<EFencePageResponse>> GetEFencePageAsync(EFencePageRequest request)
{
var page = await _dbContext.Queryable<EFenceEntity>()
.WhereIF(request.Search.IsPresent(), x => x.Name.Contains(request.Search))
.OrderBy(x => x.Id, OrderByType.Desc)
.Select(x => new EFencePageResponse
{
Id = x.Id,
Code = x.Code,
Name = x.Name,
Description = x.Description,
DeviceCount = SqlFunc.Subqueryable<EFenceDeviceRelationEntity>().Where(p => p.EFenceCode == x.Code).Count(),
})
.ToPageListAsync(request);
return page;
}
public async Task<List<EFenceDormitoryRoomResponse>> GetRoomsAsync(Guid eFenceCode)
{
return await _dbContext.Queryable<DormitoryRoomEntity>()
.Where(x => x.EFenceCode == eFenceCode)
.Select<EFenceDormitoryRoomResponse>()
.ToListAsync();
}
public async Task<List<EFenceDormitoryRoomPersonResponse>> GetRoomPersonsAsync(string roomId)
{
return await _dbContext.Queryable<DormitoryRoomPersonEntity>()
.Where(x => x.RoomId == roomId)
.Select<EFenceDormitoryRoomPersonResponse>()
.ToListAsync();
}
public async Task AddDevicesAsync(long fenceId, List<Guid> deviceCodes)
{
//查询电子围栏
var fence = await _dbContext.Queryable<EFenceEntity>().SingleAsync(f => f.Id == fenceId);
fence.ThrowIfNull("未找到电子围栏");
//查询设备
var devices = await _dbContext.Queryable<DeviceEntity>()
.Where(d => deviceCodes.Contains(d.Code))
.Where(d => d.DeployDirection.HasValue)
.Where(d => SqlFunc.Subqueryable<EFenceDeviceRelationEntity>()
.Where(p => p.EFenceCode == fence.Code && p.DeviceCode == d.Code)
.NotAny() //不可重复分配
)
.ToListAsync();
if (devices.Any())
{
var eFenceDeviceRelationEntities = devices.Select(x => new EFenceDeviceRelationEntity
{
DeviceCode = x.Code,
EFenceCode = fence.Code
}).ToList();
await _dbContext.InsertAsync(eFenceDeviceRelationEntities);
}
}
public async Task RemoveDevicesAsync(long fenceId, List<Guid> deviceCodes)
{
//查询电子围栏
var fence = await _dbContext.Queryable<EFenceEntity>().SingleAsync(f => f.Id == fenceId);
fence.ThrowIfNull("未找到电子围栏");
//查询EFenceDeviceRelationEntity的设备
var relations = await _dbContext.Queryable<EFenceDeviceRelationEntity>()
.Where(r => r.EFenceCode == fence.Code && deviceCodes.Contains(r.DeviceCode))
.ToListAsync();
if (relations.Any())
{
await _dbContext.DeleteAsync(relations);
}
}
public async Task<List<EFenceDevicePageResponse>> GetDevicesByFenceIdAsync(long fenceId)
{
//查询电子围栏
var fence = await _dbContext.Queryable<EFenceEntity>().SingleAsync(f => f.Id == fenceId);
fence.ThrowIfNull("未找到电子围栏");
var deviceCodes = await _dbContext.Queryable<EFenceDeviceRelationEntity>()
.Where(x => x.EFenceCode == fence.Code)
.Select(x => x.DeviceCode)
.ToListAsync();
var list = await _dbContext.Queryable<DeviceEntity>()
.LeftJoin<DeviceTemplateEntity>((d, dt) => d.TemplateCode == dt.Code)
.Where((d, dt) => deviceCodes.Contains(d.Code))
.Select((d, dt) => new EFenceDevicePageResponse
{
Factory = d.TenantId
}, true)
.ToListAsync();
return list;
}
}