using Abp;
using Abp.Authorization;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using Amazon.Runtime.Internal.Transform;
using Microsoft.AspNetCore.Mvc;
using MySqlX.XDevAPI.Common;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Text.Json;
using System.Threading.Tasks;
using ToolLibrary.LogHelper;
using YunDa.ISAS.Application.Core;
using YunDa.ISAS.Application.Core.Session;
using YunDa.ISAS.Application.Core.SwaggerHelper;
using YunDa.ISAS.DataTransferObject;
using YunDa.ISAS.DataTransferObject.Account;
using YunDa.ISAS.DataTransferObject.EquipmentLiveData;
using YunDa.ISAS.DataTransferObject.GeneralInformation.EquipmentInfoDto;
using YunDa.ISAS.DataTransferObject.GeneralInformation.EquipmentInfoDto.SearchCondition;
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.Redis.Repositories;
using YunDa.SOMS.DataTransferObject.EquipmentLiveData;
using YunDa.SOMS.DataTransferObject.ThirdPartyData.NJJW;
using JsonSerializer = System.Text.Json.JsonSerializer;
namespace YunDa.ISAS.Application.GeneralInformation
{
///
/// 设备信息
///
[Description("设备信息管理服务")]
public class EquipmentLiveDataAppService : ISASAppServiceBase, IEquipmentLiveDataAppService
{
private LoginUserOutput _currentUser;
private readonly IRepository _equipmentInfoRepository;
private readonly IRepository _videoDevRepository;
private readonly IRepository _linkageStrategyRepository;
private readonly IRepository _measureTemperaturePointRepository;
private readonly IRepository _equipmentTypeRepository;
private readonly IRepository _presetPointRepository;
private readonly IRepository _telemeteringConfigurationResitory;
private readonly IRepository _telesignalisationConfigurationResitory;
private readonly IRepository _telecommandConfigurationResitory;
private readonly IRepository _telemeteringAlarmStrategyResitory;
private readonly IRepository _telemeteringTemplateResitory;
private readonly IRedisRepository _redisRepository;
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IRedisRepository _equipmentDataModelDicRedis;
private readonly IRepository _threeDimensionResitory;
private readonly string _telemeteringModelListRediskey = "telemeteringModelList";
///
/// 遥测数据实时库
///
private readonly IRedisRepository _telemeteringModelListRedis;
private readonly string _telesignalisationModelListRediskey = "telesignalisationModelList";
///
/// 遥信数据实时库
///
private readonly IRedisRepository _telesignalisationModelListRedis;
private readonly RedisRepository _equipmentInfoDiagnoseResult;
private readonly RedisRepository _equipmentInfoDetailRedis;
private readonly string _equipmentInfoDetailRedisChannel = "equipmentInfoDetailRedisChannel";
private readonly string _equipmentInfoDiagnoseResultChanel = "equipmentInfoDiagnoseResultChanel";
private readonly EquipmentInfoExAppService _equipmentInfoExAppService;
public EquipmentLiveDataAppService(
IRepository repositoryEquipmentInfo
, IRepository repositoryEquipmentType
, IRepository telemeteringConfigurationResitory
, IRepository telesignalisationConfigurationResitory
, IRepository telecommandConfigurationResitory
, IRepository presetPointRepository
, IRepository telemeteringAlarmStrategyResitory
, IRepository telemeteringTemplateResitory
, IRepository videoDevRepository
, IRepository linkageStrategyRepository
, IRepository measureTemperaturePointRepository
, IRedisRepository redisRepository
, IRedisRepository equipmentDataModelDicRedis
, IRepository threeDimensionResitory
, IUnitOfWorkManager unitOfWorkManager
, IRedisRepository telemeteringModelListRedis
, IRedisRepository telesignalisationModelListRedis
, RedisRepository equipmentInfoDiagnoseResult
, RedisRepository equipmentInfoDetailRedis
, EquipmentInfoExAppService equipmentInfoExAppService
, ISessionAppService sessionAppService) : base(sessionAppService)
{
_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;
}
#region 基础接口
public RequestPageResult FindDatas(PageSearchCondition searchCondition)
{
throw new NotImplementedException();
}
public Task> CreateOrUpdateAsync(EditEquipmentInfoInput input)
{
throw new NotImplementedException();
}
public Task DeleteByIdsAsync(List ids)
{
throw new NotImplementedException();
}
public Task DeleteByIdAsync(Guid id)
{
throw new NotImplementedException();
}
#endregion
///
/// 根据设备id获取设备实时运行数据
///
///
///
[HttpGet]
[AbpAllowAnonymous]
[ShowApi]
public async Task> GetEquipmentLiveStateByEquipmentId(Guid id)
{
RequestResult rst = new RequestResult();
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;
}
///
/// 根据模型id获取设备实时运行数据
///
///
///
[HttpGet]
[AbpAllowAnonymous]
[ShowApi]
public async Task> GetEquipmentLiveStateByModelId(int modelId)
{
RequestResult rst = new RequestResult();
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;
}
///
/// 设备总览信息
///
///
///
[HttpGet]
[AbpAllowAnonymous]
[ShowApi]
public async Task>> GetEquipmentOverviewAsync(Guid stationId)
{
RequestResult> rst = new();
try
{
if (stationId == default)
{
Log4Helper.Error(this.GetType(), "传入id为空");
}
List datas = new List();
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;
}
///
/// 根据设备id获取设备遥测实时数据
///
///
[HttpGet]
[AbpAllowAnonymous]
[ShowApi]
public async Task>> GetEquipmentTelemeteringByEquipmentId(Guid equipmentId,int dataSourceCategory)
{
RequestResult> rst = new ();
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();
}
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 TestTimeFormat()
{
return new RequestResult { ResultData = DateTime.Now };
}
///
/// 根据设备id获取设备遥信实时数据
///
///
///
///
[HttpGet]
[AbpAllowAnonymous]
[ShowApi]
public async Task>> GetEquipmentTelesignalisationByEquipmentId(Guid equipmentId, int dataSourceCategory)
{
RequestResult> rst = new();
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();
}
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;
}
[HttpPost]
[AbpAllowAnonymous]
[ShowApi]
[DisableRequestSizeLimit]
[Route("/soms/api/uploadEquipmentDiagnosis")] // 指定完整路径
public async Task UploadEquipmentDiagnosisAsync(object input)
{
RequestEasyResult rst = new RequestEasyResult();
try
{
Log4Helper.Info(this.GetType(), $"九维数据:{input.ToString()}");
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
var diagnostic = JsonSerializer.Deserialize(input.ToString(), options);
Console.WriteLine($"SaveTime: {diagnostic.SaveTime}");
List nJJWPPs = GetNJJWPP();
var equipmentDic = _equipmentInfoRepository.GetAll().ToList();
//Join DiagnoseResult with Device by UID
var joinedResults = from dr in diagnostic.DiagnoseResult
join d in nJJWPPs on dr.Uid equals d.UID.ToString() into gj
from subDevice in gj.DefaultIfEmpty()
select new DiagnoseResult
{
EquipmentInfoName = subDevice != null ? subDevice.DeviceName : null,
Uid = dr.Uid,
Station = dr.Station,
Device = dr.Device,
Name = dr.Name,
Score = dr.Score,
DiaStatus = dr.DiaStatus,
ErrorCode = dr.ErrorCode,
ErrorType = dr.ErrorType,
SuggestCode = dr.SuggestCode,
Suggest = dr.Suggest
};
// Group by EquipmentInfoId and fill EquipmentInfoDiagnoseContents
var groupedResults = joinedResults
.GroupBy(jr => jr.EquipmentInfoName)
.Select(g => new EquipmentInfoDiagnoseResult
{
EquipmentInfoId = equipmentDic.FirstOrDefault(ei => ei.Name == g.Key)?.Id,
EquipmentInfoName = g.Key,
EquipmentInfoDiagnoseContents = g.Select(jr => new EquipmentInfoDiagnoseContent
{
Name = jr.Name,
Score = jr.Score,
DiaStatus = jr.DiaStatus,
ErrorCode = jr.ErrorCode,
ErrorType = jr.ErrorType,
SuggestCode = jr.SuggestCode,
Suggest = jr.Suggest
}).ToList()
});
foreach (var result in groupedResults)
{
if (result != null) {
if (result.EquipmentInfoId.HasValue)
{
await _equipmentInfoDiagnoseResult.PublishAsync(_equipmentInfoDiagnoseResultChanel, result);
}
}
}
// 保存或处理 jsonString
rst.Flag = true;
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "获取实时环境数据出错", ex);
}
return rst;
}
///
/// 导航到客户端详细页面
///
///
///
[HttpPost]
[AbpAllowAnonymous]
[ShowApi]
[DisableRequestSizeLimit]
public async Task 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));
await _equipmentInfoDetailRedis.PublishAsync(_equipmentInfoDetailRedisChannel, equipmentInfo);
rst.Flag = true;
}
else
{
Log4Helper.Error(this.GetType(), "导航到客户端详细页面:设备ID为空");
}
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "导航到客户端详细页面", ex);
}
return rst;
}
private List GetNJJWPP()
{
try
{
string jsonFilePath = ".\\Resources\\Data\\NJJWPZ.json"; // JSON file path
if (!File.Exists(jsonFilePath))
{
Debug.WriteLine("JSON file not found!");
return null;
}
// Read JSON data from file
string jsonData = File.ReadAllText(jsonFilePath);
return JsonConvert.DeserializeObject>(jsonData);
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "读取配置文件", ex);
return null;
}
}
}
}