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;
using System.Collections.Generic;
using Mapster;
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 path = @"D:\WorkData\IStation\result_1024lq.json";
if (!System.IO.File.Exists(path))
return null;
var responseText = System.IO.File.ReadAllText(path);//(测试用的)
var planDataList = JsonHelper.Json2Object>(responseText);
var ret = CalculateCore(planDataList );
return ret;
}
///
/// 分析核心
///
///
///
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)
{
string error_info;
var vmItem = Ana(planDataList, sg_factoryId,out error_info);
if (vmItem != null)
{
vmList.Add(vmItem);
}
else
{
vmList.Add(new PlanAnaDto() { factory=sg_factoryId, name="", Error = error_info });
}
}
return vmList;
}
private PlanAnaDto Ana(List planDataList, int sg_factoryId, out string error_info)
{
//找到相关泵站,并进行计算
var stationInfo = ShysPlanHelper.GetStationInfo(sg_factoryId);
if (stationInfo == null)
{
error_info = "未找到id:{factoryId},对应的泵站" ;
return null;
}
var stationId = stationInfo.ID;
var station = new Service.Station().GetByID(_corpId, stationId);
if (station == null)
{
error_info = $"泵站id:{stationId}, 数据库中未找到此泵站" ;
return null;
}
var calculator = stationInfo.Calculator;
if (calculator == null)
{
error_info = $"泵站id:{stationId}, 未构建计算器" ;
return null;
}
calculator.SetStationID(_corpId, 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.IsIgnoreAble(scadaItem.tagname))
{
scadaRecord.RecordValue = 0;
}
//else if (calculator.Is液位Monitor(scadaItem.tagname))
//{
// scadaRecord.RecordValue = 0;
//}
else
{
error_info = $"factoryId:{sg_factoryId}, 泵站id:{stationId}, 测试tag:{scadaItem.tagname} ,测点名称{calculator.GetMonitorNameByTag(scadaItem.tagname)},时间点{i}, 未找到对应数据" ;
return null;
}
}
else
{
scadaRecord.RecordValue = ff.value;
}
hourSumRecord.Records.Add(scadaRecord);
}
}
sumRecord.HourRecords.Add(hourSumRecord);
}
sumRecordList.Add(sumRecord);
}
string ana_error_info = "";
var resultList = calculator.Calc(station, sg_factoryId, sumRecordList, out ana_error_info);
if (resultList == null || resultList.Count() < 1)
{
error_info = $"泵站名称:{station.Name} 泵站id:{stationId},原因是:{ana_error_info}";
LogHelper.Error("上海原水能耗计划分析计算中 factoryId:{sg_factoryId},," + error_info);
return null;
}
//生成返回结果
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 });
}
}
error_info = null;
return vmItem;
}
}
}