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 Microsoft.AspNetCore.Authorization;
using IStation.Calculation;
using IStation.Dto;
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);
return CalculateCore(planDataList);
}
///
/// 计算-调试
///
[AllowAnonymous]
[NonUnify]
[Route("Calculate@Debug")]
[HttpGet]
public List Calculate_debug()
{
var responseText = System.IO.File.ReadAllText(@"E:\WorkData\IStation\result.txt");//(测试用的)
var planDataList = JsonHelper.Json2Object>(responseText);
return CalculateCore(planDataList);
}
///
/// 分析核心
///
///
///
private List CalculateCore(List planDataList)
{
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)
{
//找到相关泵站,并进行计算
if (!PlanAnaConstant.FactoryDict.ContainsKey(factoryId))
{
LogHelper.Error("未找到id:{factoryId},对应的泵站");
return default;
}
var stationId = PlanAnaConstant.FactoryDict[factoryId];
var station = new Service.Station().GetByID(_corpId, stationId);
if (station == null)
{
LogHelper.Error($"上海原水能耗计划分析计算中, 泵站id:{stationId}, 数据库中未找到此泵站");
continue;
}
var calculator = PlanAnaCalculatorFactory.CreateCalculator(_corpId, ObjectType.Station, stationId);
if (calculator == null)
{
LogHelper.Error($"上海原水能耗计划分析计算中, 泵站id:{stationId}, 未构建计算器");
continue;
}
//构造计算入参
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 Dto.MonitorRecord4SG();
scadaRecord.MonitorTag = scadaItem.tagname ;
var ff = scadaItem.values.Find(t => t.GetHour() == i );
if(ff == null)
{
LogHelper.Error($"上海原水能耗计划分析计算中, 泵站id:{stationId}, {scadaItem.tagname} 时间点{i}, 未找到数据" );
return default;
}
scadaRecord.RecordValue = ff.value;
hourSumRecord.Records.Add(scadaRecord);
}
}
sumRecord.HourRecords.Add(hourSumRecord);
}
sumRecordList.Add(sumRecord);
}
string error_info="";
var resultList = calculator.Calc(station, factoryId, sumRecordList, out error_info);
if (resultList == null || resultList.Count() < 1)
{
LogHelper.Error($"上海原水能耗计划分析计算中,泵站名称:{station.Name} 泵站id:{stationId},计算错误,原因是:{error_info}" );
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;
}
}
}