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; } } }