tangxu
2022-10-08 6b437da7145139fda9cbff0acaa5b8e2295d11cd
Application/IStation.Application.OpenApi/shys/plan/PlanAna_ShysController.cs
@@ -6,10 +6,9 @@
using IStation.Untity;
using Furion.DynamicApiController;
using System.ComponentModel.DataAnnotations;
using Mapster;
using Microsoft.AspNetCore.Authorization;
using IStation.Calculation;
using IStation.Calculation.PlanAna;
using IStation.Dto;
namespace IStation.Application
{
@@ -45,7 +44,31 @@
            LogHelper.Debug(responseText);
            var planDataList = JsonHelper.Json2Object<List<PlanAnaData>>(responseText);
            if (planDataList == null||planDataList.Count<1)
            return CalculateCore(planDataList);
        }
        /// <summary>
        /// 计算-调试
        /// </summary>
        [AllowAnonymous]
        [NonUnify]
        [Route("Calculate@Debug")]
        [HttpGet]
        public List<PlanAnaDto> Calculate_debug()
        {
            var responseText = System.IO.File.ReadAllText(@"E:\WorkData\IStation\result.txt");//(测试用的)
            var planDataList = JsonHelper.Json2Object<List<PlanAnaData>>(responseText);
            return CalculateCore(planDataList);
        }
        /// <summary>
        /// 分析核心
        /// </summary>
        /// <param name="planDataList"></param>
        /// <returns></returns>
        private List<PlanAnaDto> CalculateCore(List<PlanAnaData> planDataList)
        {
            if (planDataList == null || planDataList.Count < 1)
            {
                LogHelper.Error("上海原水能耗计划分析计算三高返回接口出参为空");
                return default;
@@ -56,97 +79,29 @@
                return default;
            }
            var factoryIds = planDataList.SelectMany(x=>x.datas).Select(x => x.factory).Distinct().ToList();
            var vmList = new List<PlanAnaDto>();
            foreach (var factoryId in factoryIds)
            {
                //构造计算入参
                var sumRecordList = new List<MonthSumRecord>();
                foreach (var planData in planDataList)
                {
                    var sumRecord = new MonthSumRecord();
                    sumRecord.Month = planData.timeflag;
                    sumRecord.HourRecords = new List<HourSumRecord>();
                    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<Calculation.PlanAna.MonitorRecord>();
                        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<List<double>>();
                for (int i = 1; i <= 12; i++)
                {
                    var result = resultList.Find(t => t.Month == i);
                    if (result == null)
                    {
                        vmItem.values.Add(new List<double>() { 0, 0, 0 });
                    }
                    else
                    {
                        vmItem.values.Add(new List<double>() {result.Qt,result.Dt,result.WP});
                    }
                }
                vmList.Add(vmItem);
            }
            return vmList;
        }
        /// <summary>
        /// 计算-调试
        /// </summary>
        [AllowAnonymous]
        [NonUnify]
        [Route("Calculate@Debug")]
        [HttpPost]
        public List<PlanAnaDto> Calculate_debug()
        {
            var responseText = System.IO.File.ReadAllText(@"D:\result.txt");//(测试用的)
            var planDataList = JsonHelper.Json2Object<List<PlanAnaData>>(responseText);
            var factoryIds = planDataList.SelectMany(x => x.datas).Select(x => x.factory).Distinct().ToList();
            var vmList = new List<PlanAnaDto>();
            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<MonthSumRecord>();
                foreach (var planData in planDataList)
@@ -159,14 +114,20 @@
                    {
                        var hourSumRecord = new HourSumRecord();
                        hourSumRecord.Hour = i;
                        hourSumRecord.Records = new List<Calculation.PlanAna.MonitorRecord>();
                        hourSumRecord.Records = new List<Dto.MonitorRecord4SG>();
                        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;
                                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);
                            }
                        }
@@ -174,9 +135,9 @@
                        {
                            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;
                                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);
                            }
                        }
@@ -185,14 +146,11 @@
                    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)
                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},计算错误");
                    LogHelper.Error($"上海原水能耗计划分析计算中,泵站名称:{station.Name} 泵站id:{stationId},计算错误,原因是:{error_info}"  );
                    continue;
                }