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