using Dlhis.Basic.Device.Request; using Dlhis.Basic.Device.Response; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Device.Enums; using Kurisu.AspNetCore.UnifyResultAndValidation; using Kurisu.AspNetCore.Utils.Extensions; using Kurisu.SqlSugar.Services; using Mapster; namespace Dlhis.Basic.Device.Services.Implements; public class DeviceConnectService : IDeviceConnectService { private readonly IDbContext _dbContext; public DeviceConnectService(IDbContext dbContext) { _dbContext = dbContext; } public async Task ResigterAsync(DeviceResigterRequest request) { var device = await GetEnableDeviceAsync(request.UniqueNo); var registry = await _dbContext.Queryable().Where(x => x.DeviceUniqueNo == request.UniqueNo).FirstAsync(); if (registry == null) { registry = new DeviceRegistryEntity() { DeviceUniqueNo = request.UniqueNo, LastHeartbeatTime = DateTime.Now, }; await _dbContext.InsertAsync(registry); return "设备注册成功"; } return "请勿重复注册设备"; } public async Task> GetNotSetBusinessPlaceDevicesAsync() { var devices = await _dbContext.Queryable().ToListAsync(); devices = devices.Where(x => x.Funcs.Any(item => item == DeviceFuncEnumType.Meal)).ToList(); return devices.Adapt>(); } public async Task SetResigterBusinessPlaceAsync(DeviceSetResigterBusinessPlaceRequest request) { var device = await GetEnableDeviceAsync(request.UniqueNo); if (device.Funcs?.Any(x => x == DeviceFuncEnumType.Meal) != true) { throw new UserFriendlyException("当前设备无用餐功能,无法设置"); } var registry = await _dbContext.Queryable().Where(x => x.DeviceUniqueNo == request.UniqueNo).FirstAsync(); registry.ThrowIfNull($"{request.UniqueNo}的设备注册信息不存在,无法设置营业点"); var businessPlace = await _dbContext.Queryable().Where(x => x.Code == request.BusinessPlaceCode).FirstAsync(); businessPlace.ThrowIfNull("营业点不存在,无法设置到设备注册信息中"); //更新营业点信息 registry.BusinessPlaceCode = businessPlace.Code; registry.BusinessPlaceCustomCode = businessPlace.CustomCode; await _dbContext.UpdateAsync(registry); //todo 通知设备重新获取 } public async Task HeartbeatAsync(DeviceHeartbeatRequest request) { var registry = await _dbContext.Queryable().Where(x => x.DeviceUniqueNo == request.UniqueNo).FirstAsync(); registry.ThrowIfNull($"{request.UniqueNo}的设备注册信息不存在,心跳无效"); registry.LastHeartbeatTime = DateTime.Now; await _dbContext.UpdateAsync(registry); } //******************************************************** help methods ********************************************************** /// /// 获取启用的设备 /// /// /// private async Task GetEnableDeviceAsync(string uniqueNo) { var device = await _dbContext.Queryable() .Where(x => x.UniqueNo == uniqueNo) .FirstAsync(); device.ThrowIfNull($"未知的设备唯一编码{uniqueNo}"); device.Enable.ThrowIfFalse("设备尚未启用"); return device; } }