using Microsoft.AspNetCore.Mvc;
using System.Net;
using System.Net.Http.Headers;
using Microsoft.Extensions.Hosting.Internal;
using Microsoft.AspNetCore.Http.Extensions;
using IStation.Untity;
using Furion.DynamicApiController;
using System.ComponentModel.DataAnnotations;
using Mapster;
using IStation.Calculation;
using IStation.Model;
using System.Reflection.Metadata.Ecma335;
namespace IStation.Application
{
///
/// EnergyFlow
///
[Route("Run/Energy/Flow")]
[ApiDescriptionSettings("Run", Name = "能流", Order = 299)]
public class EngineFlow_Controller : IDynamicApiController
{
///
/// 通过 LogicTreeID 获取某月的能流记录
///
[Route("GetByLogicTreeIDOfMonth@V1.0")]
[HttpGet]
public EnergyFlowLogicalTreeItemDto GetByLogicTreeIDOfMonth
(
long CorpID,
long LogicTreeID,
int Year,
int Month
)
{
var currentTime= DateTime.Now;
var currentYear = currentTime.Year;
var currentMonth = currentTime.Month;
if (currentYear == Year && currentMonth == Month)
return new EnergyFlowLogicalTreeItemDto();
var cacheKey = $"Run_Energy_Flow_GetByLogicTreeIDOfMonth_{CorpID}_{LogicTreeID}_{Year}_{Month}";
var vm_list = MemoryCacheHelper.GetSet(cacheKey, () =>
{
var logicTreeList = new Service.LogicTree().GetExChildAndSelfByID(CorpID, LogicTreeID);
if (logicTreeList == null || logicTreeList.Count < 1)
return default;
#region 统计
var bllMonitor = new Service.MonitorPoint();
var bllMonitorMappings = new Service.MonitorPointMapping();
var bllMonitorMonthRecord = new Service.MonitorMonthRecord();
var vmList = new List();
foreach (var logicTree in logicTreeList)
{
var vm = new EnergyFlowLogicalTreeItemDto();
vm.ID = $"{IStation.ObjectType.LogicTree}_{logicTree.ID}";
vm.ParentID = $"{IStation.ObjectType.LogicTree}_{TreeParentIdsHelper.GetLastParentID(logicTree.ParentIds)}";
vm.LogicalName = logicTree.LogicName;
vm.LogicalType = logicTree.LogicType;
vm.LogicalID = logicTree.LogicID;
vm.StatisticValue = null;
vm.Children = new List();
vmList.Add(vm);
if (vm.LogicalType == IStation.ObjectType.Station)
{
var enginePumpPipeList = new Service.PipeLine().GetEnginePumpListByBelongTypeAndBelongID(CorpID, logicTree.LogicType, logicTree.LogicID);
if (enginePumpPipeList != null && enginePumpPipeList.Count > 0)
{
foreach (var enginePumpPipe in enginePumpPipeList)
{
var vmEnginePump = new EnergyFlowLogicalTreeItemDto();
vmEnginePump.ID = $"{IStation.ObjectType.PipeLine}_{enginePumpPipe.ID}";
vmEnginePump.ParentID = vm.ID;
vmEnginePump.LogicalName = enginePumpPipe.Name;
vmEnginePump.LogicalType = IStation.ObjectType.PipeLine;
vmEnginePump.LogicalID = enginePumpPipe.ID;
vmEnginePump.Children = new List();
var enginePumpPipeMonitorMappings = bllMonitorMappings.GetByObjectTypeAndObjectID(CorpID, vmEnginePump.LogicalType, vmEnginePump.LogicalID);
if (enginePumpPipeMonitorMappings != null && enginePumpPipeMonitorMappings.Count > 0)
{
var mappingIds = enginePumpPipeMonitorMappings.Select(x => x.MonitorPointID).ToList();
var enginePumpPipeMonitorList = bllMonitor.GetExSignalWithSignalTypeByIds(CorpID, mappingIds);
enginePumpPipeMonitorList = enginePumpPipeMonitorList?.Where(x => x.MonitorType == eMonitorType.General && x.SourceType == Model.Monitor.eSourceType.Analyse && x.CronType == Model.Monitor.eCronType.EachMonth).ToList();
enginePumpPipeMonitorList = enginePumpPipeMonitorList?.Where(x => x.SignalList != null && x.SignalList.Count > 0).ToList();
if (enginePumpPipeMonitorList != null && enginePumpPipeMonitorList.Count > 0)
{
var enginePumpPipeElMonitorList = enginePumpPipeMonitorList.Where(x => x.SignalList.Exists(x => x.SignalType.Identifier == IStation.SignalType.有功电度)).ToList();
if (enginePumpPipeElMonitorList != null && enginePumpPipeElMonitorList.Count > 0)
{
var enginePumpPipeElMonitor = enginePumpPipeElMonitorList.Find(x => x.Flags != null && x.Flags.Contains(IStation.LogicFlags.默认));
if (enginePumpPipeElMonitor == null)
enginePumpPipeElMonitor = enginePumpPipeElMonitorList.First();
var enginePumpPipeElValues = bllMonitorMonthRecord.GetByMonitorPointIDOfMonth(CorpID, enginePumpPipeElMonitor.ID, Year, Month);
vmEnginePump.StatisticValue = enginePumpPipeElValues?.Sum(x =>
{
if (double.TryParse(x.DataValue, out double enginePumpPipeElValue))
{
return enginePumpPipeElValue;
}
return 0;
});
}
}
}
vm.Children.Add(vmEnginePump);
}
}
var vmMonitorList = bllMonitor.GetExSignalWithSignalTypeByBelongTypeAndBelongID(CorpID, vm.LogicalType, vm.LogicalID);
vmMonitorList = vmMonitorList?.Where(x => x.MonitorType == eMonitorType.General && x.SourceType == Model.Monitor.eSourceType.Analyse && x.CronType == Model.Monitor.eCronType.EachMonth).ToList();
vmMonitorList = vmMonitorList?.Where(x => x.SignalList != null && x.SignalList.Count > 0).ToList();
if (vmMonitorList != null && vmMonitorList.Count > 0)
{
var vmElMonitorList = vmMonitorList.Where(x => x.SignalList.Exists(x => x.SignalType.Identifier == IStation.SignalType.有功电度)).ToList();
if (vmElMonitorList != null && vmElMonitorList.Count > 0)
{
var vmElMonitor = vmElMonitorList.Find(x => x.Flags != null && x.Flags.Contains(IStation.LogicFlags.总站));
if (vmElMonitor != null)
{
var vmElValues = bllMonitorMonthRecord.GetByMonitorPointIDOfMonth(CorpID, vmElMonitor.ID, Year, Month);
vm.StatisticValue = vmElValues?.Sum(x =>
{
if (double.TryParse(x.DataValue, out double vmElValue))
{
return vmElValue;
}
return 0;
});
}
}
}
}
var vmParent = vmList.Find(x => x.ID == vm.ParentID);
if (vmParent != null)
{
vmParent.Children.Add(vm);
}
}
logicTreeList.Reverse();
foreach (var logicTree in logicTreeList)
{
var vm = vmList.Find(x => x.ID == $"{IStation.ObjectType.LogicTree}_{logicTree.ID}");
if (vm.Children.Count > 0)
{
var validChildren = vm.Children.Where(x => x.StatisticValue.HasValue).ToList();
if (validChildren.Count > 0)
{
var validChildrenStatisticValue = validChildren.Sum(x => x.StatisticValue.Value);
/*if (vm.LogicalType == IStation.ObjectType.Station)
{
if (vm.StatisticValue > validChildrenStatisticValue)
continue;
}*/
vm.StatisticValue = validChildrenStatisticValue;
}
}
}
#endregion
return vmList.Find(x => x.ID == $"{IStation.ObjectType.LogicTree}_{LogicTreeID}");
}, CacheHelper.CacheLevel2);
return vm_list;
}
}
}