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 Microsoft.AspNetCore.Authorization;
using IStation.Calculation;
using IStation.Calculation.PlanAna;
namespace IStation.Application
{
///
/// ShysPlanAna
///
[Route("OpenApi/PlanAna/SHYS")]
[ApiDescriptionSettings("OpenApi", Name = "上海原水计划分析", Order = 1000)]
public class PlanAna_ShysController : IDynamicApiController
{
private const long _corpId = 4;
///
/// 计算
///
[AllowAnonymous]
[NonUnify]
[Route("Calculate")]
[HttpPost]
public List Calculate([Required] List inputList)
{
if (inputList == null || inputList.Count < 1)
{
LogHelper.Error("上海原水能耗计划分析计算接口入参为空");
return default;
}
//debug
LogHelper.Debug(JsonHelper.Object2Json(inputList));
var url_sg = Settings.WebApi.OpenApi.SanGaoPlanUrl;
var responseText = HttpRequestHelper.Post(url_sg, JsonHelper.Object2Json(inputList));
//debug
LogHelper.Debug(responseText);
var planDataList = JsonHelper.Json2Object>(responseText);
if (planDataList == null||planDataList.Count<1)
{
LogHelper.Error("上海原水能耗计划分析计算三高返回接口出参为空");
return default;
}
if (planDataList.Exists(x => x.datas == null || x.datas.Count < 1))
{
LogHelper.Error("上海原水能耗计划分析计算三高返回接口出参格式错误");
return default;
}
var factoryIds = planDataList.SelectMany(x=>x.datas).Select(x => x.factory).Distinct().ToList();
var vmList = new List();
foreach (var factoryId in factoryIds)
{
//构造计算入参
var sumRecordList = new List();
foreach (var planData in planDataList)
{
var sumRecord = new MonthSumRecord();
sumRecord.Month = planData.timeflag;
sumRecord.HourRecords = new List();
var factoryData = planData.datas.Find(t=>t.factory==factoryId);
for (int i = 0; i <= 23; i++)
{
var hourSumRecord = new HourSumRecord();
hourSumRecord.Hour = i;
hourSumRecord.Records = new List();
if (factoryData.scada != null && factoryData.scada.Count > 0)
{
foreach (var scadaItem in factoryData.scada)
{
var scadaRecord = new Calculation.PlanAna.MonitorRecord();
scadaRecord.MonitorId = PlanAnaConstant.MonitorDict[scadaItem.tagname];
scadaRecord.RecordValue = scadaItem.values.Find(t => t.datetime.Trim() == PlanAnaConstant.HourDict[i]).value;
hourSumRecord.Records.Add(scadaRecord);
}
}
if (factoryData.result != null && factoryData.result.Count > 0)
{
foreach (var resultItem in factoryData.result)
{
var resultRecord = new Calculation.PlanAna.MonitorRecord();
resultRecord.MonitorId = PlanAnaConstant.MonitorDict[resultItem.tagname];
resultRecord.RecordValue = resultItem.values.Find(t => t.datetime.Trim() == PlanAnaConstant.HourDict[i]).value;
hourSumRecord.Records.Add(resultRecord);
}
}
sumRecord.HourRecords.Add(hourSumRecord);
}
sumRecordList.Add(sumRecord);
}
//找到相关泵站,并进行计算
var stationId = PlanAnaConstant.FactoryDict[factoryId];
var station = new Service.Station().GetByID(_corpId, stationId);
var calculator = PlanAnaCalculatorFactory.CreateCalculator(_corpId, ObjectType.Station, stationId);
var resultList = calculator.Calculate(sumRecordList);
if (resultList == null || resultList.Count < 1)
{
LogHelper.Error($"上海原水能耗计划分析计算中,泵站名称:{station.Name} 泵站id:{stationId},计算错误");
continue;
}
//生成返回结果
var vmItem = new PlanAnaDto();
vmItem.factory = factoryId;
vmItem.name = station.Name;
vmItem.values = new List>();
for (int i = 1; i <= 12; i++)
{
var result = resultList.Find(t => t.Month == i);
if (result == null)
{
vmItem.values.Add(new List() { 0, 0, 0 });
}
else
{
vmItem.values.Add(new List() {result.Qt,result.Dt,result.WP});
}
}
vmList.Add(vmItem);
}
return vmList;
}
///
/// 计算-调试
///
[AllowAnonymous]
[NonUnify]
[Route("Calculate@Debug")]
[HttpPost]
public List Calculate_debug()
{
var responseText = System.IO.File.ReadAllText(@"D:\result.txt");//(测试用的)
var planDataList = JsonHelper.Json2Object>(responseText);
var factoryIds = planDataList.SelectMany(x => x.datas).Select(x => x.factory).Distinct().ToList();
var vmList = new List();
foreach (var factoryId in factoryIds)
{
//构造计算入参
var sumRecordList = new List();
foreach (var planData in planDataList)
{
var sumRecord = new MonthSumRecord();
sumRecord.Month = planData.timeflag;
sumRecord.HourRecords = new List();
var factoryData = planData.datas.Find(t => t.factory == factoryId);
for (int i = 0; i <= 23; i++)
{
var hourSumRecord = new HourSumRecord();
hourSumRecord.Hour = i;
hourSumRecord.Records = new List();
if (factoryData.scada != null && factoryData.scada.Count > 0)
{
foreach (var scadaItem in factoryData.scada)
{
var scadaRecord = new Calculation.PlanAna.MonitorRecord();
scadaRecord.MonitorId = PlanAnaConstant.MonitorDict[scadaItem.tagname];
scadaRecord.RecordValue = scadaItem.values.Find(t => t.datetime.Trim() == PlanAnaConstant.HourDict[i]).value;
hourSumRecord.Records.Add(scadaRecord);
}
}
if (factoryData.result != null && factoryData.result.Count > 0)
{
foreach (var resultItem in factoryData.result)
{
var resultRecord = new Calculation.PlanAna.MonitorRecord();
resultRecord.MonitorId = PlanAnaConstant.MonitorDict[resultItem.tagname];
resultRecord.RecordValue = resultItem.values.Find(t => t.datetime.Trim() == PlanAnaConstant.HourDict[i]).value;
hourSumRecord.Records.Add(resultRecord);
}
}
sumRecord.HourRecords.Add(hourSumRecord);
}
sumRecordList.Add(sumRecord);
}
//找到相关泵站,并进行计算
var stationId = PlanAnaConstant.FactoryDict[factoryId];
var station = new Service.Station().GetByID(_corpId, stationId);
var calculator = PlanAnaCalculatorFactory.CreateCalculator(_corpId, ObjectType.Station, stationId);
var resultList = calculator.Calculate(sumRecordList);
if (resultList == null || resultList.Count < 1)
{
LogHelper.Error($"上海原水能耗计划分析计算中,泵站名称:{station.Name} 泵站id:{stationId},计算错误");
continue;
}
//生成返回结果
var vmItem = new PlanAnaDto();
vmItem.factory = factoryId;
vmItem.name = station.Name;
vmItem.values = new List>();
for (int i = 1; i <= 12; i++)
{
var result = resultList.Find(t => t.Month == i);
if (result == null)
{
vmItem.values.Add(new List() { 0, 0, 0 });
}
else
{
vmItem.values.Add(new List() { result.Qt, result.Dt, result.WP });
}
}
vmList.Add(vmItem);
}
return vmList;
}
}
}