using Abp.Application.Services; using Abp.Authorization; using Abp.Domain.Repositories; using Abp.Domain.Uow; using Abp.EntityFrameworkCore.Repositories; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; using YunDa.ISAS.Application.Core.SwaggerHelper; using YunDa.ISAS.DataTransferObject; using YunDa.ISAS.DataTransferObject.SecondaryElectricalEquipmentInfoDto.ProtectDeviceDto; using YunDa.ISAS.Entities.DataMonitoring; using YunDa.ISAS.Entities.GeneralInformation; using YunDa.ISAS.Entities.MySQL.DataMonitoring; using YunDa.ISMS.BASE.Entities.Models; namespace YunDa.ISAS.Application.GeneralInformation { /// /// 二次设备信息 /// [Description("二次设备信息")] public class SecondaryElectricalEquipmentInfoAppService : ApplicationService { private readonly IRepository _imDeviceDatumRepository; private readonly IRepository _imProtectDeviceRepository; private readonly IRepository _imDeviceYcRepository; private readonly IRepository _imDeviceYxRepository; private readonly IRepository _dmalarmCategoryRepository; private readonly IRepository _equipmentInfoRepository; private readonly IRepository _telemeteringConfigurationRepository; private readonly IRepository _telesignalisationConfigurationRepository; private readonly IUnitOfWorkManager _unitOfWorkManager; public SecondaryElectricalEquipmentInfoAppService( IRepository imDeviceDatumRepository, IRepository imProtectDeviceRepository, IRepository equipmentInfoRepository, IRepository telemeteringConfigurationRepository, IRepository telesignalisationConfigurationRepository, IRepository dmalarmCategoryRepository, IRepository imDeviceYcRepository, IRepository imDeviceYxRepository, IUnitOfWorkManager unitOfWorkManager ) { _imDeviceDatumRepository = imDeviceDatumRepository; _imProtectDeviceRepository = imProtectDeviceRepository; _equipmentInfoRepository = equipmentInfoRepository; _telemeteringConfigurationRepository = telemeteringConfigurationRepository; _telesignalisationConfigurationRepository = telesignalisationConfigurationRepository; _unitOfWorkManager = unitOfWorkManager; _imDeviceYcRepository = imDeviceYcRepository; _imDeviceYxRepository = imDeviceYxRepository; _dmalarmCategoryRepository = dmalarmCategoryRepository; } [HttpGet] [AbpAllowAnonymous] [ShowApi] public RequestEasyResult Test() { RequestEasyResult rst = new RequestEasyResult(); try { var repo = _imProtectDeviceRepository.GetAllIncluding(t=>t.StatCodeNavigation); foreach (var item in repo) { Debug.WriteLine(item.DeviceName+" " + item.Id); } rst.Flag = true; } catch (Exception ex) { rst.Message = ex.Message; } return rst; } /// /// 迁移综自的数据到运维系统中 三遥信息 /// static int index = 0; [HttpGet] [AbpAllowAnonymous] [ShowApi] [UnitOfWork(isTransactional: false)] public async Task MergerDeviceData() { RequestEasyResult rst = new RequestEasyResult(); try { // 初始化数据 List deviceDatas; List ImDeviceYcs; List ImDeviceYxs; List dmalarmCategories; List equipments; using (var unitOfWork = _unitOfWorkManager.Begin()) { deviceDatas = _imDeviceDatumRepository.GetAllIncluding(t => t.Device).ToList(); ImDeviceYcs = _imDeviceYcRepository.GetAll().ToList(); ImDeviceYxs = _imDeviceYxRepository.GetAll().ToList(); unitOfWork.Complete(); } using (var unitOfWork = _unitOfWorkManager.Begin()) { equipments = _equipmentInfoRepository.GetAll().ToList(); dmalarmCategories = _dmalarmCategoryRepository.GetAll().ToList(); unitOfWork.Complete(); } // 将设备数据和设备映射到字典中 var equipmentDict = equipments.ToDictionary(e => e.Name); var telemeteringConfigIds = new HashSet(_telemeteringConfigurationRepository.GetAll().Select(t => t.ismsbaseYCId)); var telesignalisationConfigIds = new HashSet(_telesignalisationConfigurationRepository.GetAll().Select(t => t.ismsbaseYXId)); List telemeteringConfigurations = new List(); List telesignalisationConfigurations = new List(); foreach (var deviceData in deviceDatas) { if (!equipmentDict.TryGetValue(deviceData.Device.DeviceName, out var equipment)) { continue; // 未匹配到设备,跳过 } if (deviceData.DataType == "YC") { var yc = ImDeviceYcs.FirstOrDefault(t => t.Id == deviceData.Id); if (telemeteringConfigIds.Contains(deviceData.Id)) { // 更新已有的 Telemetering 配置 var existingTelemeteringConfig = _telemeteringConfigurationRepository .FirstOrDefault(t => t.ismsbaseYCId == deviceData.Id); if (existingTelemeteringConfig != null) { existingTelemeteringConfig.Coefficient = (float)yc.Cof; existingTelemeteringConfig.DecimalDigits = (int)yc.Precise; existingTelemeteringConfig.Name = deviceData.DataName; existingTelemeteringConfig.Unit = yc.Unit; existingTelemeteringConfig.IsSelfCheckingValue = false; // 假设这是需要更新的字段 existingTelemeteringConfig.EquipmentInfoId = equipment.Id; // 更新设备信息ID existingTelemeteringConfig.EquipmentTypeId = equipment.EquipmentTypeId; // 更新设备类型ID existingTelemeteringConfig.TransformerSubstationId = equipment.TransformerSubstationId; // 更新变电站ID existingTelemeteringConfig.IsVirtualDevice = false; // 假设这是需要更新的字段 existingTelemeteringConfig.IsEnvironmentTemp = false; // 假设这是需要更新的字段 existingTelemeteringConfig.InfoAddress = deviceData.InfoAddr; // 更新信息地址 existingTelemeteringConfig.DispatcherAddress = deviceData.InfoAddr; // 更新调度器地址 existingTelemeteringConfig.IsActive = true; // 更新是否激活 existingTelemeteringConfig.IsSave = true; // 更新是否保存 existingTelemeteringConfig.IsVisible = true; // 更新是否可见 existingTelemeteringConfig.SeqNo = 0; // 假设这是需要更新的字段 existingTelemeteringConfig.CPUSector = 0; ; // 更新CPU扇区 existingTelemeteringConfig.InfoCPUSector = deviceData.CpuIndex; ; // 更新信息CPU扇区 existingTelemeteringConfig.CreatorUserId = default; // 更新创建用户ID(如果需要) existingTelemeteringConfig.LastModificationTime = DateTime.Now; // 更新创建时间 // 这里可以添加更多的更新字段 // 保存到数据库 _telemeteringConfigurationRepository.Update(existingTelemeteringConfig); } } else { if (yc != null) { telemeteringConfigurations.Add(new TelemeteringConfiguration { DataSourceCategory = DataSourceCategoryEnum.Zongzi, Coefficient = (float)yc.Cof, CPUSector = 0, CreationTime = DateTime.Now, CreatorUserId = default, DeviceAddress = 1, DecimalDigits = (int)yc.Precise, DispatcherAddress = deviceData.InfoAddr, InfoAddress = deviceData.InfoAddr, InfoCPUSector = 0, IsSelfCheckingValue = false, EquipmentInfoId = equipment.Id, EquipmentTypeId = equipment.EquipmentTypeId, IsActive = true, IsSave = true, Name = deviceData.DataName, IsVisible = true, SeqNo = 0, TransformerSubstationId = equipment.TransformerSubstationId, Unit = yc.Unit, IsVirtualDevice = false, IsEnvironmentTemp = false, ismsbaseYCId = deviceData.Id }); telemeteringConfigIds.Add(deviceData.Id); // 添加到已存在集合中 } } } else if (deviceData.DataType == "YX") { var yx = ImDeviceYxs.FirstOrDefault(t => t.Id == deviceData.Id); if (telesignalisationConfigIds.Contains(deviceData.Id)) { // 更新已有的 Telesignalisation 配置 var existingTelesignalisationConfig = _telesignalisationConfigurationRepository .FirstOrDefault(t => t.ismsbaseYXId == deviceData.Id); if (existingTelesignalisationConfig != null) { // 处理 AlertLevel 字段 string levelStr = Regex.Match(yx.AlertLevel, @"\d+")?.Value; if (string.IsNullOrWhiteSpace(levelStr)) { levelStr = "4"; // 默认值 } var defaultDma = dmalarmCategories.FirstOrDefault(t => t.Level == int.Parse(levelStr)); // 更新 Telesignalisation 配置的各个字段 existingTelesignalisationConfig.YesContent = yx.SwOnStr ?? ""; // 如果为空,设置为默认值 existingTelesignalisationConfig.NoContent = yx.SwOffStr ?? ""; // 如果为空,设置为默认值 existingTelesignalisationConfig.UnsurenessContent = yx.SwUncertStr ?? "不定"; // 如果为空,设置为默认值 existingTelesignalisationConfig.DMAlarmCategoryId = defaultDma?.Id; // 更新报警分类ID existingTelesignalisationConfig.Name = deviceData.DataName; // 更新名称 existingTelesignalisationConfig.InfoAddress = deviceData.InfoAddr; // 更新信息地址 existingTelesignalisationConfig.DispatcherAddress = deviceData.InfoAddr; // 更新调度器地址 existingTelesignalisationConfig.EquipmentInfoId = equipment.Id; // 更新设备信息ID existingTelesignalisationConfig.EquipmentTypeId = equipment.EquipmentTypeId; // 更新设备类型ID existingTelesignalisationConfig.TransformerSubstationId = equipment.TransformerSubstationId; // 更新变电站ID existingTelesignalisationConfig.IsActive = true; // 更新是否激活 existingTelesignalisationConfig.IsSave = true; // 更新是否保存 existingTelesignalisationConfig.IsVisible = true; // 更新是否可见 existingTelesignalisationConfig.SeqNo = 0; // 假设需要设置序号 existingTelesignalisationConfig.CPUSector = 0; // 更新CPU扇区 existingTelesignalisationConfig.InfoCPUSector = deviceData.CpuIndex; // 更新信息CPU扇区 existingTelesignalisationConfig.IsVirtualDevice = false; // 更新虚拟设备标志 existingTelesignalisationConfig.CreatorUserId = default; // 更新创建用户ID existingTelesignalisationConfig.LastModificationTime = DateTime.Now; // 更新创建时间 // 这里可以继续添加其他字段更新的代码 // 保存到数据库 _telesignalisationConfigurationRepository.Update(existingTelesignalisationConfig); } } else { if (yx != null) { string levelStr = Regex.Match(yx.AlertLevel, @"\d+")?.Value; if (string.IsNullOrWhiteSpace(levelStr)) { levelStr = "4"; } var defaultDma = dmalarmCategories.FirstOrDefault(t => t.Level == int.Parse(levelStr)); telesignalisationConfigurations.Add(new TelesignalisationConfiguration { DataSourceCategory = DataSourceCategoryEnum.Zongzi, CPUSector = 0, CreationTime = DateTime.Now, CreatorUserId = default, DispatcherAddress = deviceData.InfoAddr, InfoAddress = deviceData.InfoAddr, DeviceAddress = 1, InfoCPUSector = 0, IsSelfCheckingValue = false, EquipmentInfoId = equipment.Id, EquipmentTypeId = equipment.EquipmentTypeId, YesContent = yx.SwOnStr ?? "", NoContent = yx.SwOffStr ?? "", UnsurenessContent = yx.SwUncertStr ?? "", DMAlarmCategoryId = defaultDma?.Id, IsActive = true, IsSave = true, Name = deviceData.DataName, IsVisible = true, SeqNo = 0, TransformerSubstationId = equipment.TransformerSubstationId, IsVirtualDevice = false, ismsbaseYXId = deviceData.Id }); telesignalisationConfigIds.Add(deviceData.Id); // 添加到已存在集合中 } } } } // 批量插入或更新数据库 using (var unitOfWork = _unitOfWorkManager.Begin()) { if (telemeteringConfigurations.Any()) await _telemeteringConfigurationRepository.InsertRangeAsync(telemeteringConfigurations); if (telesignalisationConfigurations.Any()) await _telesignalisationConfigurationRepository.InsertRangeAsync(telesignalisationConfigurations); // 完成数据库操作 await unitOfWork.CompleteAsync(); } rst.Flag = true; } catch (Exception ex) { rst.Flag = false; rst.Message = ex.Message; } return rst; } //[HttpGet] //[AbpAllowAnonymous] //[ShowApi] //public RequestResult> FindProtectDevicesData(string stationName) //{ // RequestResult> rst = new(); // try // { // var repo = _imProtectDeviceRepository.GetAllIncluding(); // rst.ResultData =ObjectMapper.Map>(repo); // rst.Flag = true; // } // catch (Exception ex) // { // rst.Flag = false; // } // return rst; //} [HttpGet] [AbpAllowAnonymous] [ShowApi] public RequestResult> FindDevicesData(string devName) { RequestResult> rst = new(); try { //var repo = _imDeviceDatumRepository.GetAllIncluding(t=>t.Device).Where(t=>t.Device.DeviceName == protectDevName); rst.Flag = true; } catch (Exception ex) { rst.Flag = false; } return rst; } } }