1255 lines
57 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Abp.Authorization;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using Abp.Web.Mvc.Alerts;
using Google.Protobuf;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Driver;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using ToolLibrary.LogHelper;
using YunDa.ISAS.Application.Core;
using YunDa.ISAS.Application.Core.Configuration;
using YunDa.ISAS.Application.Core.Session;
using YunDa.ISAS.Application.Core.SwaggerHelper;
using YunDa.ISAS.Core.Helper;
using YunDa.ISAS.DataTransferObject;
using YunDa.ISAS.DataTransferObject.Account;
using YunDa.ISAS.DataTransferObject.GeneralInformation.EquipmentInfoDto;
using YunDa.ISAS.DataTransferObject.GeneralInformation.EquipmentInfoDto.SearchCondition;
using YunDa.ISAS.DataTransferObject.VideoSurveillance.VideoDevDto;
using YunDa.ISAS.Entities.ClientConfiguration.ThreeDimension;
using YunDa.ISAS.Entities.DataMonitoring;
using YunDa.ISAS.Entities.GeneralInformation;
using YunDa.ISAS.Entities.MySQL.DataMonitoring;
using YunDa.ISAS.Entities.VideoSurveillance;
using YunDa.ISAS.MongoDB.Repositories;
using YunDa.ISAS.Redis.Entities.AlarmCategory;
using YunDa.ISAS.Redis.Repositories;
using YunDa.SOMS.DataTransferObject.AlarmDataDto;
using YunDa.SOMS.DataTransferObject.GeneralInformation.EquipmentLiveDataDto;
using YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.OperationReport;
using YunDa.SOMS.DataTransferObject.ThirdPartyData.NJJW;
using YunDa.SOMS.Entities.GeneralInformation;
using ZstdSharp.Unsafe;
using JsonSerializer = System.Text.Json.JsonSerializer;
namespace YunDa.ISAS.Application.GeneralInformation
{
/// <summary>
/// 设备信息
/// </summary>
[Description("设备信息管理服务")]
public class EquipmentLiveDataAppService : ISASAppServiceBase, IEquipmentLiveDataAppService
{
private LoginUserOutput _currentUser;
private readonly IRepository<EquipmentInfo, Guid> _equipmentInfoRepository;
private readonly IRepository<VideoDev, Guid> _videoDevRepository;
private readonly IRepository<LinkageStrategy, Guid> _linkageStrategyRepository;
private readonly IRepository<MeasureTemperaturePoint, Guid> _measureTemperaturePointRepository;
private readonly IRepository<EquipmentType, Guid> _equipmentTypeRepository;
private readonly IRepository<PresetPoint, Guid> _presetPointRepository;
private readonly IRepository<TelemeteringConfiguration, Guid> _telemeteringConfigurationResitory;
private readonly IRepository<TelesignalisationConfiguration, Guid> _telesignalisationConfigurationResitory;
private readonly IRepository<TelecommandConfiguration, Guid> _telecommandConfigurationResitory;
private readonly IRepository<TelemeteringAlarmStrategy, Guid> _telemeteringAlarmStrategyResitory;
private readonly IRepository<TelemeteringTemplate, Guid> _telemeteringTemplateResitory;
private readonly IRedisRepository<object, string> _redisRepository;
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IRedisRepository<EquipmentDataModel, string> _equipmentDataModelDicRedis;
private readonly IRepository<CCThreeDimension, Guid> _threeDimensionResitory;
private readonly string _telemeteringModelListRediskey = "telemeteringModelList";
/// <summary>
/// 遥测数据实时库
/// </summary>
private readonly IRedisRepository<TelemeteringModel, string> _telemeteringModelListRedis;
private readonly string _telesignalisationModelListRediskey = "telesignalisationModelList";
/// <summary>
/// 遥信数据实时库
/// </summary>
private readonly IRedisRepository<TelesignalisationModel, string> _telesignalisationModelListRedis;
private readonly IRedisRepository<EquipmentInfoDiagnoseResult, string> _equipmentInfoDiagnoseResult;
private readonly IRedisRepository<DiagnoseResultOutPut, string> _diagnoseResultOutPutRedis;
private readonly IMongoDbRepository<BsonDocument, Guid> _bsonDocumentResultRepository;
public readonly IRedisRepository<AlarmMessage, string> _alarmMessageRedis;
private readonly IRedisRepository<AlarmListRedis, string> _redisDataRepository;
private readonly IRedisRepository<EquipmentInfoSearchRecord, string> _equipmentInfoDetailRedis;
private readonly IRedisRepository<VideoDevProperty, string> _videoDevPropertyRedis;
private readonly string _equipmentInfoDetailRedisChannel = "equipmentInfoDetailRedisChannel";
private readonly string _equipmentInfoDiagnoseResultChanel = "equipmentInfoDiagnoseResultChanel";
private readonly EquipmentInfoExAppService _equipmentInfoExAppService;
private readonly IRedisRepository<CheckDefect, string> _checkDefectRedis;
private readonly IRedisRepository<DiagnosisImageResult, string> _diagnosisImageResult;
public EquipmentLiveDataAppService(
IRepository<EquipmentInfo, Guid> repositoryEquipmentInfo
, IRepository<EquipmentType, Guid> repositoryEquipmentType
, IRepository<TelemeteringConfiguration, Guid> telemeteringConfigurationResitory
, IRepository<TelesignalisationConfiguration, Guid> telesignalisationConfigurationResitory
, IRepository<TelecommandConfiguration, Guid> telecommandConfigurationResitory
, IRepository<PresetPoint, Guid> presetPointRepository
, IRepository<TelemeteringAlarmStrategy, Guid> telemeteringAlarmStrategyResitory
, IRepository<TelemeteringTemplate, Guid> telemeteringTemplateResitory
, IRepository<VideoDev, Guid> videoDevRepository
, IRepository<LinkageStrategy, Guid> linkageStrategyRepository
, IRepository<MeasureTemperaturePoint, Guid> measureTemperaturePointRepository
, IRedisRepository<object, string> redisRepository
, IRedisRepository<EquipmentDataModel, string> equipmentDataModelDicRedis
, IRepository<CCThreeDimension, Guid> threeDimensionResitory
, IUnitOfWorkManager unitOfWorkManager
, IRedisRepository<TelemeteringModel, string> telemeteringModelListRedis
, IRedisRepository<TelesignalisationModel, string> telesignalisationModelListRedis
, IRedisRepository<EquipmentInfoDiagnoseResult, string> equipmentInfoDiagnoseResult
, IRedisRepository<EquipmentInfoSearchRecord, string> equipmentInfoDetailRedis
, EquipmentInfoExAppService equipmentInfoExAppService
, IAppServiceConfiguration appServiceConfiguration
, IRedisRepository<DiagnoseResultOutPut, string> diagnoseResultOutPutRedis
, IMongoDbRepository<BsonDocument, Guid> bsonDocumentResultRepository
, IRedisRepository<AlarmMessage, string> alarmMessageRedis
, IRedisRepository<AlarmListRedis, string> redisDataRepository
, IRedisRepository<CheckDefect, string> checkDefectRedis
, IRedisRepository<DiagnosisImageResult, string> diagnosisImageResult
, IRedisRepository<VideoDevProperty, string> videoDevPropertyRedis
, ISessionAppService sessionAppService) : base(sessionAppService, appServiceConfiguration)
{
_equipmentInfoRepository = repositoryEquipmentInfo;
_equipmentTypeRepository = repositoryEquipmentType;
_telemeteringConfigurationResitory = telemeteringConfigurationResitory;
_telesignalisationConfigurationResitory = telesignalisationConfigurationResitory;
_telecommandConfigurationResitory = telecommandConfigurationResitory;
_telemeteringAlarmStrategyResitory = telemeteringAlarmStrategyResitory;
_presetPointRepository = presetPointRepository;
_telemeteringTemplateResitory = telemeteringTemplateResitory;
_currentUser = base.GetCurrentUser();
_unitOfWorkManager = unitOfWorkManager;
_redisRepository = redisRepository;
_equipmentDataModelDicRedis = equipmentDataModelDicRedis;
_threeDimensionResitory = threeDimensionResitory;
_videoDevRepository = videoDevRepository;
_linkageStrategyRepository = linkageStrategyRepository;
_measureTemperaturePointRepository = measureTemperaturePointRepository;
_telemeteringModelListRedis = telemeteringModelListRedis;
_telesignalisationModelListRedis = telesignalisationModelListRedis;
_equipmentInfoDiagnoseResult = equipmentInfoDiagnoseResult;
_equipmentInfoDetailRedis = equipmentInfoDetailRedis;
_equipmentInfoExAppService = equipmentInfoExAppService;
_diagnoseResultOutPutRedis = diagnoseResultOutPutRedis;
_bsonDocumentResultRepository = bsonDocumentResultRepository;
_alarmMessageRedis = alarmMessageRedis;
_redisDataRepository = redisDataRepository;
_checkDefectRedis = checkDefectRedis;
_diagnosisImageResult = diagnosisImageResult;
_videoDevPropertyRedis = videoDevPropertyRedis;
}
#region
public RequestPageResult<EquipmentInfoOutput> FindDatas(PageSearchCondition<EquipmentInfoSearchConditionInput> searchCondition)
{
throw new NotImplementedException();
}
public Task<RequestResult<EquipmentInfoOutput>> CreateOrUpdateAsync(EditEquipmentInfoInput input)
{
throw new NotImplementedException();
}
public Task<RequestEasyResult> DeleteByIdsAsync(List<Guid> ids)
{
throw new NotImplementedException();
}
public Task<RequestEasyResult> DeleteByIdAsync(Guid id)
{
throw new NotImplementedException();
}
#endregion
/// <summary>
/// 根据设备id获取设备实时运行数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
[AbpAllowAnonymous]
[ShowApi]
public async Task<RequestResult<EquipmentDataModel>> GetEquipmentLiveStateByEquipmentId(Guid id)
{
RequestResult<EquipmentDataModel> rst = new RequestResult<EquipmentDataModel>();
if (id == default)
{
rst.Message = "设备id为空";
return rst;
}
try
{
var dic = await _equipmentDataModelDicRedis.HashSetGetAllAsync(ConstantModel.EquipmentDataModelDicRedisKey);
if (dic.Any(t=>t.EquipmentInfoId == id))
{
var equipmentdata = dic.FirstOrDefault(t=> t.EquipmentInfoId == id);
var cfgs = _threeDimensionResitory.GetAll().Where(t => t.EquipmentInfoId == id);
equipmentdata.Telemeterings = equipmentdata.Telemeterings.Where(t => cfgs.Any(x => x.TelemeteringConfigurationId == t.Id)).ToList();
equipmentdata.Telesignalisations = equipmentdata.Telesignalisations.Where(t => cfgs.Any(x => x.TelesignalisationConfigurationId == t.Id)).ToList();
rst.Flag = true;
rst.ResultData = equipmentdata;
}
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "根据设备id获取设备实时运行数据出错", ex);
}
return rst;
}
/// <summary>
/// 根据模型id获取设备实时运行数据
/// </summary>
/// <param name="modelId"></param>
/// <returns></returns>
[HttpGet]
[AbpAllowAnonymous]
[ShowApi]
public async Task<RequestResult<EquipmentDataModel>> GetEquipmentLiveStateByModelId(int modelId)
{
RequestResult<EquipmentDataModel> rst = new RequestResult<EquipmentDataModel>();
if (modelId == 0)
{
rst.Message = "模型id为0";
return rst;
}
try
{
var ccDatas = _threeDimensionResitory.GetAll().ToList();
var dic = await _equipmentDataModelDicRedis.HashSetGetAllAsync(ConstantModel.EquipmentDataModelDicRedisKey);
var cc = ccDatas.FirstOrDefault(t => t.ModelId == modelId);
if (dic!=null&&cc != null&& cc.EquipmentInfoId.HasValue)
{
Guid id = cc.EquipmentInfoId.Value;
if (dic.Any(t => t.EquipmentInfoId == id))
{
var equipmentdata = dic.FirstOrDefault(t => t.EquipmentInfoId == id);
var cfgs = ccDatas.Where(t => t.EquipmentInfoId == id);
equipmentdata.Telemeterings = equipmentdata.Telemeterings.Where(t => cfgs.Any(x => x.TelemeteringConfigurationId == t.Id)).ToList();
equipmentdata.Telesignalisations = equipmentdata.Telesignalisations.Where(t => cfgs.Any(x => x.TelesignalisationConfigurationId == t.Id)).ToList();
rst.Flag = true;
rst.ResultData = equipmentdata;
}
}
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "根据设备id获取设备实时运行数据出错", ex);
}
return rst;
}
/// <summary>
/// 设备总览信息
/// </summary>
/// <param name="stationId"></param>
/// <returns></returns>
[HttpGet]
[AbpAllowAnonymous]
[ShowApi]
public async Task<RequestResult<List<EquimentOverviewOutput>>> GetEquipmentOverviewAsync(Guid stationId)
{
RequestResult<List<EquimentOverviewOutput>> rst = new RequestResult<List<EquimentOverviewOutput>>();
try
{
if (stationId == default)
{
Log4Helper.Error(this.GetType(), "传入id为空");
}
List<EquimentOverviewOutput> datas = new List<EquimentOverviewOutput>();
var equipmentTypesRepo = _equipmentTypeRepository.GetAllIncluding(t=>t.EquipmentInfos).OrderBy(t=>t.SeqNo).ToList();
var typesRepo = equipmentTypesRepo.Where(x => x.EquipmentTypeLevel == EquipmentTypeLevelEnum.Type);
var equipmentTypeRepo = equipmentTypesRepo.Where(x => x.EquipmentTypeLevel == EquipmentTypeLevelEnum.Equipment);
var dic = await _equipmentDataModelDicRedis.HashSetGetAllAsync(ConstantModel.EquipmentDataModelDicRedisKey);
foreach (var item in typesRepo)
{
var equipments = equipmentTypeRepo.Where(t => t.EquipmentTypeId == item.Id).SelectMany(t => t.EquipmentInfos);
var query = from equip in equipments
join dataModel in dic on equip.Id equals dataModel.EquipmentInfoId
where dataModel.Telemeterings!=null
from telemetry in dataModel.Telemeterings
where telemetry.ResultValue != -99999
select new
{
EquipmentId = equip.Id,
// Include other properties as needed
};
var query1 = from equip in equipments
join dataModel in dic on equip.Id equals dataModel.EquipmentInfoId
where dataModel.Telesignalisations != null
from telemetry in dataModel.Telesignalisations
where telemetry.ResultValue != -99999
select new
{
EquipmentId = equip.Id,
// Include other properties as needed
};
int lineCount = query.Concat(query1).Distinct().Count();
datas.Add(new EquimentOverviewOutput
{
Id = item.Id,
SeqNo = datas.Count + 1,
Count = equipments.Count(),
LineCount = lineCount,
IsVisable = true,
TypeName = item.Name
});
}
var video = _videoDevRepository.GetAllIncluding(t=>t.PresetPoints).OrderBy(t=>t.SeqNo).ToList();
var nvr = video.Where(t => t.VideoDevId == null);
int nvrOnlineCount = 0;
//CameraOnlineInfo.GetDeviceConnected( nvr.Select(t=>t.IP).ToList()).Where(t=>t.Value).Count();
datas.Add(new EquimentOverviewOutput
{
Id = default,
SeqNo = datas.Count + 1,
Count = nvr.Count(),
LineCount = nvrOnlineCount,
IsVisable = true,
TypeName = "NVR",
Description = ""
});
var camera = video.Where(t => t.VideoDevId != null);
int cameraOnlineCount = 0;//
//CameraOnlineInfo.GetDeviceConnected(camera.Where(x=> !string.IsNullOrWhiteSpace(x.IP)).Select(t => t.IP).ToList()).Where(t => t.Value).Count();
datas.Add(new EquimentOverviewOutput
{
Id = default,
SeqNo = datas.Count + 1,
Count = camera.Count(),
LineCount = cameraOnlineCount,
IsVisable = true,
TypeName = "摄像头",
Description = ""
});
var presetsCount = _presetPointRepository.Count();
datas.Add(new EquimentOverviewOutput
{
Id = default,
SeqNo = datas.Count + 1,
Count = presetsCount,
LineCount = -1,
IsVisable = true,
TypeName = "预置位"
});
var linkageCount = _linkageStrategyRepository.Count();
datas.Add(new EquimentOverviewOutput
{
Id = default,
SeqNo = datas.Count+1,
Count = linkageCount,
LineCount = -1,
IsVisable = true,
TypeName = "联动"
});
var measureTempCount = _measureTemperaturePointRepository.Count();
datas.Add(new EquimentOverviewOutput
{
Id = default,
SeqNo = datas.Count + 1,
Count = measureTempCount,
LineCount = -1,
IsVisable = true,
TypeName = "测温点"
});
rst.ResultData = datas;
rst.Flag = true;
//_equipmentInfoRepository.GetAllIncluding(t => t.EquipmentType);
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "根据设备id获取设备实时运行数据出错", ex);
}
return rst;
}
/// <summary>
/// 根据设备id获取设备遥测实时数据
/// </summary>
/// <returns></returns>
[HttpGet]
[AbpAllowAnonymous]
[ShowApi]
public async Task<RequestResult<List<TelemeteringModel>>> GetEquipmentTelemeteringByEquipmentId(Guid equipmentId,int dataSourceCategory)
{
RequestResult<List<TelemeteringModel>> rst = new RequestResult<List<TelemeteringModel>> ();
if (equipmentId == default)
{
rst.Message = "设备id为空";
return rst;
}
try
{
var telemeterings = await _telemeteringModelListRedis.HashSetGetAllAsync(_telemeteringModelListRediskey + "_" + ((DataSourceCategoryEnum)dataSourceCategory).ToString());
if (telemeterings == null || telemeterings.Count == 0)
{
rst.ResultData = new List<TelemeteringModel>();
}
else
{
var datas = telemeterings
.Where(t => t.EquipmentInfoId == equipmentId && t.DataSourceCategory == (DataSourceCategoryEnum)dataSourceCategory)
.Where(t => t.Name != "未用" || !t.Name.Contains("预留"))
.OrderBy(t => t.DispatcherAddress)
.ToList();
rst.ResultData = datas;
}
rst.Flag = true;
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "根据设备id获取设备遥测实时数据", ex);
}
return rst;
}
[HttpGet]
[AbpAllowAnonymous]
[ShowApi]
public RequestResult<DateTime> TestTimeFormat()
{
return new RequestResult<DateTime> { ResultData = DateTime.Now };
}
/// <summary>
/// 根据设备id获取设备遥信实时数据
/// </summary>
/// <param name="equipmentId"></param>
/// <param name="dataSourceCategory"></param>
/// <returns></returns>
[HttpGet]
[AbpAllowAnonymous]
[ShowApi]
public async Task<RequestResult<List<TelesignalisationModel>>> GetEquipmentTelesignalisationByEquipmentId(Guid equipmentId, int dataSourceCategory)
{
RequestResult<List<TelesignalisationModel>> rst = new RequestResult<List<TelesignalisationModel>>();
if (equipmentId == default)
{
rst.Message = "设备id为空";
return rst;
}
try
{
var telemeterings = await _telesignalisationModelListRedis.HashSetGetAllAsync(_telesignalisationModelListRediskey + "_" + ((DataSourceCategoryEnum)dataSourceCategory).ToString());
if (telemeterings == null|| telemeterings.Count==0)
{
rst.ResultData = new List<TelesignalisationModel>();
}
else
{
var datas = telemeterings
.Where(t => t.EquipmentInfoId == equipmentId && t.DataSourceCategory == (DataSourceCategoryEnum)dataSourceCategory)
.Where(t => t.Name != "未用" || !t.Name.Contains("预留"))
.OrderBy(t => t.DispatcherAddress)
.ToList();
rst.ResultData = datas;
}
rst.Flag = true;
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "根据设备id获取设备遥测实时数据", ex);
}
return rst;
}
/// <summary>
/// 九维发送设备诊断信息到后台
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
[AbpAllowAnonymous]
[ShowApi]
[DisableRequestSizeLimit]
[Route("/soms/api/uploadEquipmentDiagnosis")] // 指定完整路径
public async Task<RequestEasyResult> UploadEquipmentDiagnosisAsync(object input)
{
RequestEasyResult rst = new RequestEasyResult();
try
{
//Log4Helper.Info(this.GetType(), $"九维数据:{input.ToString()}");
string filePath = $"..\\logs\\九维数据—{Guid.NewGuid()}.txt";
Directory.CreateDirectory(Path.GetDirectoryName(filePath));
File.WriteAllText(filePath, input.ToString());
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
var diagnostic = JsonSerializer.Deserialize<IntelligentDiagnostic>(input.ToString(), options);
List<DiagnoseResultOutPut> diagnoseResultOutPuts = new List<DiagnoseResultOutPut>();
DateTime time = DateTime.Now;
string format = "yyyy-MM-dd HH-mm-ss.fff";
if (DateTime.TryParseExact(
diagnostic?.SaveTime,
format,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out time
))
{
Log4Helper.Info(this.GetType(), time.ToString("yyyy-MM-dd HH:mm:ss.fff"));
}
else
{
Log4Helper.Info(this.GetType(), $"时间解析失败:{diagnostic.SaveTime}");
}
//电站 运检
if (diagnostic != null)
{
Log4Helper.Info(this.GetType(), $"SaveTime: {diagnostic.SaveTime}");
var equipmentDic = _equipmentInfoRepository.GetAllIncluding(t => t.TransformerSubstation)
.Where(t => t.TransformerSubstation.SubstationName.Contains("神池南"))
.ToDictionary(t => t.Name);
foreach (var item in diagnostic.DiagnoseResult)
{
if (item.Name.Contains("整体"))
{
if (item.Device == "电站" || item.Device == "电站诊断")
{
var diagnoseResultOutPut = diagnoseResultOutPuts.FirstOrDefault(t => t.EquipmentInfoName == "变电所");
if (diagnoseResultOutPut == null)
{
diagnoseResultOutPuts.Add(new DiagnoseResultOutPut
{
DiagnoseResultName = item.Name,
DiaStatus = item.DiaStatus,
Score = float.Parse(string.IsNullOrEmpty(item.Score) ? "0" : item.Score),
EquipmentInfoName = "变电所",
Suggest = item.Suggest,
Errortype = item.ErrorType,
Time = time,
});
}
}
else if (item.Device == "运检" || item.Device == "运检诊断")
{
var diagnoseResultOutPut = diagnoseResultOutPuts.FirstOrDefault(t => t.EquipmentInfoName == "运检");
if (diagnoseResultOutPut == null)
{
diagnoseResultOutPuts.Add(new DiagnoseResultOutPut
{
DiagnoseResultName = item.Name,
DiaStatus = item.DiaStatus,
Score = float.Parse(string.IsNullOrEmpty(item.Score) ? "0" : item.Score),
EquipmentInfoName = "运检",
Suggest = item.Suggest,
Errortype = item.ErrorType,
Time = time,
});
}
}
else
{
item.Device = item.Device.Replace("诊断", "");
item.Name = item.Name.Replace(item.Device, "");
var equipmentObjName = equipmentDic.Keys.FirstOrDefault(t => StringHelper.HasMinimumSequentialMatch(t, item.Device));
if (!string.IsNullOrWhiteSpace(equipmentObjName))
{
if (equipmentDic.ContainsKey(equipmentObjName))
{
diagnoseResultOutPuts.Add(new DiagnoseResultOutPut
{
DiagnoseResultName = item.Name,
DiaStatus = item.DiaStatus,
Score = float.Parse(string.IsNullOrEmpty(item.Score) ? "0" : item.Score),
EquipmentInfoName = equipmentObjName,
Suggest = item.Suggest,
Errortype = item.ErrorType,
EquipmentInfoId = equipmentDic[equipmentObjName].Id,
Time = time,
});
}
}
}
}
}
foreach (var item in diagnostic.DiagnoseResult)
{
if (!item.Name.Contains("整体"))
{
if (item.Device == "电站" || item.Device == "电站诊断")
{
var diagnoseResultOutPut = diagnoseResultOutPuts.FirstOrDefault(t => t.EquipmentInfoName == "变电所");
if (diagnoseResultOutPut != null)
{
diagnoseResultOutPut.DiagnoseContentItems.Add(new DiagnoseContent
{
DiagnoseResultName = item.Name,
DiaStatus = item.DiaStatus,
Score = float.Parse(string.IsNullOrEmpty(item.Score) ? "0" : item.Score),
Errortype = item.ErrorType,
Suggest = item.Suggest,
Time = time,
});
}
}
else if (item.Device == "运检" || item.Device == "运检诊断")
{
var diagnoseResultOutPut = diagnoseResultOutPuts.FirstOrDefault(t => t.EquipmentInfoName == "运检");
if (diagnoseResultOutPut != null)
{
diagnoseResultOutPut.DiagnoseContentItems.Add(new DiagnoseContent
{
DiagnoseResultName = item.Name,
DiaStatus = item.DiaStatus,
Score = float.Parse(string.IsNullOrEmpty(item.Score) ? "0" : item.Score),
Errortype = item.ErrorType,
Time = time,
Suggest = item.Suggest
});
}
}
else
{
item.Device = item.Device.Replace("诊断", "");
item.Name = item.Name.Replace(item.Device, "");
var equipmentObjName = equipmentDic.Keys.FirstOrDefault(t => StringHelper.HasMinimumSequentialMatch(t, item.Device));
if (!string.IsNullOrWhiteSpace(equipmentObjName))
{
if (equipmentDic.ContainsKey(equipmentObjName))
{
var diagnoseResultOutPut = diagnoseResultOutPuts.FirstOrDefault(t => t.EquipmentInfoName == equipmentObjName);
if (diagnoseResultOutPut != null)
{
diagnoseResultOutPut.DiagnoseContentItems.Add(new DiagnoseResultOutPut
{
DiagnoseResultName = item.Name,
DiaStatus = item.DiaStatus,
Score = float.Parse(string.IsNullOrEmpty(item.Score) ? "0" : item.Score),
EquipmentInfoName = equipmentObjName,
Suggest = item.Suggest,
Errortype = item.ErrorType,
Time = time,
EquipmentInfoId = equipmentDic[equipmentObjName].Id
});
}
}
}
}
}
}
foreach (var item in diagnoseResultOutPuts)
{
var dataItems = diagnostic.Data.Where(t => t.Name.Contains(item.EquipmentInfoName));
item.DataItems = dataItems.ToList();
}
}
var rediskeys = diagnoseResultOutPuts.Select(t => t.EquipmentInfoName).ToList();
_diagnoseResultOutPutRedis.HashSetUpdateManyAsync(nameof(DiagnoseResultOutPut), rediskeys, diagnoseResultOutPuts);
foreach (var diagnoseResultOutPut in diagnoseResultOutPuts)
{
if (diagnoseResultOutPut.DiaStatus != "正常")
{
var alarmId = $"{diagnoseResultOutPut.EquipmentInfoName}:{diagnoseResultOutPut.DiagnoseResultName}";
var alarmMessage = new AlarmMessage
{
HandlingMeasures = diagnoseResultOutPut.Suggest,
AlarmContent = diagnoseResultOutPut.Errortype,
AlarmDateTime = time.ToString("yyyy-MM-dd HH:mm:ss"),
Id = alarmId,
AlarmObject = $"{diagnoseResultOutPut.EquipmentInfoName}|{diagnoseResultOutPut.DiagnoseResultName}",
AlarmLevel = GetAlarmLevelStr(diagnoseResultOutPut.DiaStatus),
EquipmentInfoId = diagnoseResultOutPut.EquipmentInfoId,
DataSourceCategory = "在线监测",
IsConfirm = false,
AlarmType = "健康诊断",
};
if (!string.IsNullOrEmpty(diagnoseResultOutPut.Errortype))
{
if (IsTrueAlarm(diagnoseResultOutPut.Suggest))
{
_alarmMessageRedis.PublishAsync("alarmMessageChannel", alarmMessage);
_alarmMessageRedis.HashSetUpdateOneAsync(nameof(AlarmMessage), alarmId, alarmMessage);
ChecKAlarm(alarmMessage, diagnoseResultOutPut.Suggest);
}
}
}
foreach (var diaItem in diagnoseResultOutPut.DiagnoseContentItems)
{
if (diaItem.DiaStatus != "正常")
{
var alarmId = $"{diagnoseResultOutPut.EquipmentInfoName}:{diaItem.DiagnoseResultName}";
var alarmMessage = new AlarmMessage
{
HandlingMeasures = diaItem.Suggest,
AlarmContent = diaItem.Errortype,
AlarmDateTime = time.ToString("yyyy-MM-dd HH:mm:ss"),
Id = alarmId,
AlarmObject = $"{diagnoseResultOutPut.EquipmentInfoName}|{diagnoseResultOutPut.DiagnoseResultName}",
AlarmLevel = GetAlarmLevelStr(diagnoseResultOutPut.DiaStatus),
EquipmentInfoId = diagnoseResultOutPut.EquipmentInfoId,
EquipmentInfoName = diagnoseResultOutPut.EquipmentInfoName,
DataSourceCategory = "在线监测",
IsConfirm = false,
AlarmType = "健康诊断",
};
if (!string.IsNullOrEmpty(diaItem.Errortype))
{
if (IsTrueAlarm(diaItem.Suggest))
{
_alarmMessageRedis.PublishAsync("alarmMessageChannel", alarmMessage);
_alarmMessageRedis.HashSetUpdateOneAsync(nameof(AlarmMessage), alarmId, alarmMessage);
ChecKAlarm(alarmMessage, diaItem.Suggest);
}
else
{
ChecKAlarm(alarmMessage, diaItem.Suggest,"在线监测设备");
}
}
}
await _diagnoseResultOutPutRedis.PublishAsync(_equipmentInfoDiagnoseResultChanel, diagnoseResultOutPut);
await Task.Delay(10);
}
_bsonDocumentResultRepository.CollectionName = nameof(DiagnoseResultOutPut);
await _bsonDocumentResultRepository.InsertManyAsync(diagnoseResultOutPuts.Select(t => t.ToBsonDocument()));
var yuanjian = diagnoseResultOutPuts.FirstOrDefault(t => t.EquipmentInfoName == "运检");
// 保存或处理 jsonString
rst.Flag = true;
}
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "获取实时环境数据出错", ex);
}
return rst;
}
/// <summary>
/// 是否为可信报警
/// </summary>
/// <param name="suggest"></param>
/// <returns></returns>
private bool IsTrueAlarm(string suggest)
{
return !suggest.Contains("输入数据异常");
}
/// <summary>
/// 获取报警级别
/// </summary>
/// <param name="status"></param>
/// <returns></returns>
private string GetAlarmLevelStr(string status)
{
string resStr = "告知";
if (status.Contains("异常"))
{
resStr = "异常";
}
else if (status.Contains("报警"))
{
resStr = "告知";
}
return resStr;
}
private void ChecKAlarm(AlarmMessage alarm, string suggest, string category ="一次设备")
{
var checkDefect = new CheckDefect
{
Content = alarm.AlarmContent,
DateTime = alarm.AlarmDateTime,
Id = alarm.Id,
DataSourceCategory = category,
IsConfirm = false,
EquipmentInfoId = alarm.EquipmentInfoId,
HandlingMeasures = suggest,
Level = alarm.AlarmLevel,
Object = alarm.AlarmObject,
Type = alarm.AlarmType,
Analysis = "",
};
_checkDefectRedis.HashSetUpdateOneAsync(nameof(CheckDefect), checkDefect.Id, checkDefect);
}
/// <summary>
/// 导航到客户端详细页面
/// </summary>
/// <param name="equipemntInfoId"></param>
/// <returns></returns>
[HttpPost]
[AbpAllowAnonymous]
[ShowApi]
[DisableRequestSizeLimit]
public async Task<RequestEasyResult> NavigateToClientEquipmentDetailAsync(string equipemntInfoId)
{
RequestEasyResult rst = new RequestEasyResult();
try
{
if (equipemntInfoId!=default)
{
var tempData = await _equipmentInfoExAppService.FindEquipmentSearchRecordAsync(default);
var equipmentInfo = tempData.ResultData.FirstOrDefault(t => t.Id == Guid.Parse( equipemntInfoId));
if (equipmentInfo == null)
{
await NavigateToClientCameraAsync(equipemntInfoId);
}
else
{
await _equipmentInfoDetailRedis.PublishAsync(_equipmentInfoDetailRedisChannel, equipmentInfo);
}
rst.Flag = true;
}
else
{
Log4Helper.Error(this.GetType(), "导航到客户端详细页面设备ID为空");
}
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "导航到客户端详细页面", ex);
}
return rst;
}
/// <summary>
/// 导航到客户端视频页面
/// </summary>
/// <param name="equipemntInfoId"></param>
/// <returns></returns>
[HttpPost]
[AbpAllowAnonymous]
[ShowApi]
[DisableRequestSizeLimit]
public async Task<RequestEasyResult> NavigateToClientCameraAsync(string cameraId)
{
RequestEasyResult rst = new RequestEasyResult();
try
{
if (cameraId != default)
{
var tempData = _videoDevRepository.GetAllIncluding(t => t.Parent,t=>t.ManufacturerInfo).FirstOrDefault(t => t.Id == Guid.Parse(cameraId));
if (tempData!=null)
{
var resData = ObjectMapper.Map<VideoDevProperty>(tempData);
await _videoDevPropertyRedis.PublishAsync("CameraInfo", resData);
rst.Flag = true;
}
}
else
{
Log4Helper.Error(this.GetType(), "导航到客户端详细页面设备ID为空");
}
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "导航到客户端详细页面", ex);
}
return rst;
}
[HttpPost, AbpAllowAnonymous]
[ShowApi]
[UnitOfWork(false)]
[DisableRequestSizeLimit]
[RequestFormLimits(ValueLengthLimit = int.MaxValue, MultipartBodyLengthLimit = int.MaxValue)]
public async Task<RequestEasyResult> UploadEquipmentDiagnosisImageAsync(
[FromQuery] string deviceName,
string description,
[FromForm] IFormFile file = null,
IFormFile datafile = null)
{
RequestEasyResult rst = new RequestEasyResult();
try
{
// 检查设备是否存在
var equipments = _equipmentInfoRepository.GetAll().ToList()
.GroupBy(t => t.Name)
.ToDictionary(g => g.Key, g => g.First());
if (!equipments.ContainsKey(deviceName))
{
rst.Message = $"设备名称不存在:{deviceName}";
Log4Helper.Info(GetType(), rst.Message);
return rst;
}
// 验证至少上传一个文件
if (file == null && datafile == null)
{
rst.Message = "必须上传至少一个文件";
return rst;
}
// 处理图片文件
string imagePath = null, imageUrl = null;
//if (file != null)
//{
// var imgResult = await ProcessFileAsync(file, deviceName, "Images",
// new[] { ".jpg", ".jpeg", ".png", ".svg", ".bmp" });
// if (!imgResult.Success)
// {
// rst.Message = imgResult.Message;
// return rst;
// }
// (imagePath, imageUrl) = (imgResult.FilePath, imgResult.Url);
//}
// 处理数据文件
string dataPath = null, dataUrl = null;
DateTime dataTimestamp = DateTime.Now;
int[] dataArray = null;
//#if DEBUG
// Random random = new Random();
// dataArray = new int[100];
// for (int i = 0; i < dataArray.Length; i++)
// {
// dataArray[i] = random.Next(10, 31); // 生成 10 到 30 之间的随机整数31 不包括)
// }
//#else
if (datafile != null)
{
var dataResult = await ProcessFileAsync(datafile, deviceName, "DataFiles",
new[] { ".csv", ".txt", ".xlsx", ".json", ".dat", "" });
if (!dataResult.Success)
{
rst.Message = dataResult.Message;
return rst;
}
(dataPath, dataUrl) = (dataResult.FilePath, dataResult.Url);
// 解析数据文件中的时间和数据
using (var reader = new StreamReader(datafile.OpenReadStream(), Encoding.Default))
{
string line = await reader.ReadLineAsync(); // 读取第一行时间戳
if (!string.IsNullOrEmpty(line) && DateTime.TryParse(line.Trim('[', ']', ' '), out var timestamp))
{
dataTimestamp = timestamp;
}
// 解析数据部分
line = await reader.ReadLineAsync(); // 读取第二行数据
if (!string.IsNullOrEmpty(line))
{
dataArray = line.Split(',')
.Select(x => int.TryParse(x, out var num) ? num : 0)
.ToArray();
}
}
}
//#endif
// 保存记录到数据库
var diagnosisRecord = new DiagnosisImageResult
{
EquipmentInfoId = equipments[deviceName].Id,
EquipmentInfoName = deviceName,
Time = dataTimestamp,
ImagePath = imagePath,
ImageUrl = imageUrl,
DataFilePath = dataPath,
DataFileUrl = dataUrl,
Description = description,
DataArray = dataArray,
DataType = 1
};
_bsonDocumentResultRepository.CollectionName = nameof(DiagnosisImageResult);
await _bsonDocumentResultRepository.InsertOneAsync(diagnosisRecord.ToBsonDocument());
rst.Flag = true;
Log4Helper.Info(GetType(), $"上传成功 - 设备:{deviceName},描述:{description}");
}
catch (Exception ex)
{
rst.Message = ex.Message;
Log4Helper.Error(GetType(), "上传设备诊断文件失败", ex);
}
return rst;
}
private async Task<(bool Success, string Message, string FilePath, string Url)>
ProcessFileAsync(IFormFile file, string deviceName, string fileType, string[] allowedExtensions)
{
try
{
// 验证文件类型
var extension = Path.GetExtension(file.FileName).ToLowerInvariant();
if (!allowedExtensions.Contains(extension))
{
return (false, $"不支持的文件类型:{extension}", null, null);
}
// 创建存储目录
var uploadDir = Path.Combine(
base.GetAttachmentDirectory(),
"Uploads",
deviceName,
DateTime.Now.ToString("yyyy-MM-dd"),
fileType);
Directory.CreateDirectory(uploadDir); // 自动存在检查
// 生成唯一文件名
var fileName = $"{Guid.NewGuid():N}_{DateTime.Now:HHmmss}{extension}";
var fullPath = Path.Combine(uploadDir, fileName);
// 保存文件
using (var stream = new FileStream(fullPath, FileMode.Create))
{
await file.CopyToAsync(stream);
}
return (true, null, fullPath, fullPath.Replace(base.GetAttachmentDirectory(), ""));
}
catch (Exception ex)
{
Log4Helper.Error(GetType(), $"处理{fileType}文件失败", ex);
return (false, ex.Message, null, null);
}
}
[HttpGet]
[AbpAllowAnonymous]
[ShowApi]
[DisableRequestSizeLimit]
public async Task<RequestResult<List<DiagnosisImageResult>>> GetEquipmentDiagnoseResultAsync(Guid equipmentId,
int dataType,
DateTime? startTime = null,
DateTime? endTime = null
)
{
RequestResult<List<DiagnosisImageResult>> rst = new RequestResult<List<DiagnosisImageResult>>();
try
{
_bsonDocumentResultRepository.CollectionName = nameof(DiagnosisImageResult);
// 计算时间范围默认查询最近1小时的数据
DateTime defaultStartTime = DateTime.Now.AddHours(-1);
DateTime defaultEndTime = DateTime.Now;
DateTime queryStartTime = startTime ?? defaultStartTime;
DateTime queryEndTime = endTime ?? defaultEndTime;
// 构建查询条件
var filterBuilder = Builders<BsonDocument>.Filter;
var filter = filterBuilder.Eq("EquipmentInfoId", equipmentId) &
filterBuilder.Eq("DataType", dataType) &
filterBuilder.Gte("Time", queryStartTime) &
filterBuilder.Lte("Time", queryEndTime);
// 按时间降序排序
SortDefinition<BsonDocument> sortDefinition = Builders<BsonDocument>.Sort.Descending("Time");
// 查询数据
var bsonDocuments = _bsonDocumentResultRepository
.GetAllIncludeToFindFluent(filter, sort: sortDefinition)
.Limit(15*60*24); // 新增限制查询结果数量;
if (bsonDocuments != null && bsonDocuments.Any())
{
var diagnosisImageResults = bsonDocuments.ToList().Select(doc => BsonSerializer.Deserialize<DiagnosisImageResult>(doc)).ToList();
rst.ResultData = diagnosisImageResults;
}
else
{
rst.Message = "未找到符合条件的设备诊断结果";
}
rst.Flag = true;
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "获取设备诊断结果", ex);
rst.Message = "查询设备诊断结果时发生异常";
}
return rst;
}
[HttpPost]
[AbpAllowAnonymous]
[ShowApi]
[DisableRequestSizeLimit]
[RequestFormLimits(ValueLengthLimit = int.MaxValue, MultipartBodyLengthLimit = int.MaxValue)]
[Route("/soms/api/voiceprint/upload")]
public async Task<RequestResult<VoiceprintData>> UploadVoiceprintAsync(
[FromForm] IFormFile voiceprint_data,
[FromForm] string image_data,
[FromForm] string analysis_result)
{
var result = new RequestResult<VoiceprintData>();
try
{
// Validate required parameters
if (voiceprint_data == null)
{
result.Message = "缺少必要参数: voiceprint_data";
return result;
}
if (string.IsNullOrEmpty(image_data))
{
result.Message = "缺少必要参数: image_data";
return result;
}
if (string.IsNullOrEmpty(analysis_result))
{
result.Message = "缺少必要参数: analysis_result";
return result;
}
// Validate file type
var extension = Path.GetExtension(voiceprint_data.FileName).ToLowerInvariant();
if (!new[] { ".wav", ".pcm" }.Contains(extension))
{
result.Message = "不支持的文件类型,仅支持.wav和.pcm格式";
return result;
}
// Validate file size (100MB limit)
if (voiceprint_data.Length > 100 * 1024 * 1024)
{
result.Message = "文件大小超过限制(100MB)";
return result;
}
// Parse analysis result
VoiceprintData voiceprintData;
try
{
voiceprintData = JsonSerializer.Deserialize<VoiceprintData>(analysis_result);
}
catch (JsonException)
{
result.Message = "JSON解析失败";
return result;
}
// Generate unique ID if not provided
if (string.IsNullOrEmpty(voiceprintData.VoiceprintId))
{
voiceprintData.VoiceprintId = $"VP_{DateTime.Now:yyyyMMdd_HHmmss}";
}
// Create storage directory
var uploadDir = Path.Combine(
base.GetAttachmentDirectory(),
"Uploads",
"Voiceprints",
DateTime.Now.ToString("yyyy-MM-dd"));
Directory.CreateDirectory(uploadDir);
// Save voiceprint file
var fileName = $"{voiceprintData.VoiceprintId}{extension}";
var fullPath = Path.Combine(uploadDir, fileName);
using (var stream = new FileStream(fullPath, FileMode.Create))
{
await voiceprint_data.CopyToAsync(stream);
}
// Save image if provided
if (image_data.StartsWith("data:image/"))
{
try
{
var base64Data = image_data.Split(',')[1];
var imageBytes = Convert.FromBase64String(base64Data);
var imagePath = Path.Combine(uploadDir, $"{voiceprintData.VoiceprintId}.png");
await File.WriteAllBytesAsync(imagePath, imageBytes);
voiceprintData.ImageSaved = true;
}
catch
{
result.Message = "Base64解码失败";
return result;
}
}
// Update paths
voiceprintData.SavedPath = fullPath.Replace(base.GetAttachmentDirectory(), "");
voiceprintData.Timestamp = DateTime.Now;
// Save to MongoDB
_bsonDocumentResultRepository.CollectionName = nameof(VoiceprintData);
await _bsonDocumentResultRepository.InsertOneAsync(voiceprintData.ToBsonDocument());
result.ResultData = voiceprintData;
result.Flag = true;
result.Message = "操作成功";
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "上传声纹数据失败", ex);
result.Message = "服务器存储失败";
}
return result;
}
}
}