tangxu
2022-11-02 05f522e321a742f03bf1e3e26edaeb5147da42f4
Application/IStation.Application.OpenApi/shys/plan/PlanAna_ShysController.cs
@@ -9,6 +9,8 @@
using Microsoft.AspNetCore.Authorization;
using IStation.Calculation;
using IStation.Dto;
using System.Collections.Generic;
using Mapster;
namespace IStation.Application
{
@@ -56,117 +58,159 @@
        [HttpGet]
        public List<PlanAnaDto> Calculate_debug()
        {
            var responseText = System.IO.File.ReadAllText(@"E:\WorkData\IStation\result.txt");//(测试用的)
            var path = @"D:\WorkData\IStation\result_1102.json";
            if (!System.IO.File.Exists(path))
                return null;
            var responseText = System.IO.File.ReadAllText(path);//(测试用的)
            var planDataList = JsonHelper.Json2Object<List<PlanAnaData>>(responseText);
            return CalculateCore(planDataList);
            var ret = CalculateCore(planDataList );
            return ret;
        }
        /// <summary>
        /// 分析核心
        /// </summary>
        /// <param name="planDataList"></param>
        /// <returns></returns>
        private List<PlanAnaDto> CalculateCore(List<PlanAnaData> planDataList)
        private List<PlanAnaDto> CalculateCore(List<PlanAnaData> 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 sg_factoryIds = planDataList.SelectMany(x => x.datas).Select(x => x.factory).Distinct().ToList();
            var vmList = new List<PlanAnaDto>();
            foreach (var factoryId in factoryIds)
            foreach (var sg_factoryId in sg_factoryIds)
            {
                //找到相关泵站,并进行计算
                if (!PlanAnaConstant.FactoryDict.ContainsKey(factoryId))
                string error_info;
                var vmItem = Ana(planDataList, sg_factoryId,out error_info);
                if (vmItem != null)
                {
                    LogHelper.Error("未找到id:{factoryId},对应的泵站");
                    return default;
                }
                var stationId = PlanAnaConstant.FactoryDict[factoryId];
                var station = new Service.Station().GetByID(_corpId, stationId);
                if (station == null)
                    vmList.Add(vmItem);
                }
                else
                {
                    LogHelper.Error($"上海原水能耗计划分析计算中, 泵站id:{stationId}, 数据库中未找到此泵站");
                    continue;
                    vmList.Add(new PlanAnaDto() { factory=sg_factoryId, name="", Error = error_info });
                }
                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)
                {
                    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<Dto.MonitorRecord4SG>();
                        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<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;
        }
        private PlanAnaDto Ana(List<PlanAnaData> 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<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 == sg_factoryId);
                for (int i = 0; i <= 23; i++)
                {
                    var hourSumRecord = new HourSumRecord();
                    hourSumRecord.Hour = i;
                    hourSumRecord.Records = new List<Dto.MonitorRecord4SG>();
                    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<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 });
                }
            }
            error_info = null;
            return vmItem;
        }