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(@"D:\WorkData\IStation\result_1021.json");//(测试用的)
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 sg_factoryIds = planDataList.SelectMany(x => x.datas).Select(x => x.factory).Distinct().ToList();
var vmList = new List();
foreach (var sg_factoryId in sg_factoryIds)
{
//找到相关泵站,并进行计算
var stationInfo = ShysPlanHelper.GetStationInfo(sg_factoryId);
if (stationInfo == null)
{
// LogHelper.Error("未找到id:{factoryId},对应的泵站");
continue;
}
var stationId = stationInfo.ID;
var station = new Service.Station().GetByID(_corpId, stationId);
if (station == null)
{
LogHelper.Error($"上海原水能耗计划分析计算中, 泵站id:{stationId}, 数据库中未找到此泵站");
continue;
}
var calculator = stationInfo.Calculator;
if (calculator == null)
{
LogHelper.Error($"上海原水能耗计划分析计算中, 泵站id:{stationId}, 未构建计算器");
continue;
}
calculator.SetStationID(4, stationInfo.ID);//设置ID
//构造计算入参
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 == sg_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)
{
if (calculator.Is液位Monitor(scadaItem.tagname))
{
scadaRecord.RecordValue = 0;
}
else
{
LogHelper.Error($"上海原水能耗计划分析计算中, 泵站id:{stationId}, {scadaItem.tagname} 时间点{i}, 未找到数据");
return default;
}
}
else
{
scadaRecord.RecordValue = ff.value;
}
hourSumRecord.Records.Add(scadaRecord);
}
}
if (factoryData.result != null && factoryData.result.Count > 0)
{
foreach (var resultItem in factoryData.result)
{
var resultRecord = new Dto.MonitorRecord4SG();
resultRecord.MonitorTag = resultItem.tagname;// PlanAnaConstant.MonitorDict[resultItem.tagname];
resultRecord.RecordValue = resultItem.values.Find(t => t.GetHour() == i).value;
hourSumRecord.Records.Add(resultRecord);
}
}
sumRecord.HourRecords.Add(hourSumRecord);
}
sumRecordList.Add(sumRecord);
}
string error_info="";
var resultList = calculator.Calc(station, sg_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 = sg_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;
}
}
}