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