tangxu
2022-10-24 1998c849be270159a086cf6d0448a0cdba4db53c
Application/IStation.Application.OpenApi/shys/plan/PlanAna_ShysController.cs
@@ -56,7 +56,11 @@
        [HttpGet]
        public List<PlanAnaDto> Calculate_debug()
        {
            var responseText = System.IO.File.ReadAllText(@"E:\WorkData\IStation\result.txt");//(测试用的)
            var path = @"D:\WorkData\IStation\result_1024b.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);
        }
@@ -79,104 +83,119 @@
                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))
                {
                    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)
                {
                    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);
                            }
                        }
                        if (factoryData.result != null && factoryData.result.Count > 0)
                        {
                            foreach (var resultItem in factoryData.result)
                            {
                                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);
                            }
                        }
                        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 });
                    }
                }
                var vmItem = Ana(planDataList, sg_factoryId);
                if(vmItem != null)
                vmList.Add(vmItem);
            }
            return vmList;
        }
        private PlanAnaDto Ana(List<PlanAnaData> planDataList, int sg_factoryId)
        {
            //找到相关泵站,并进行计算
            var stationInfo = ShysPlanHelper.GetStationInfo(sg_factoryId);
            if (stationInfo == null)
            {
                // LogHelper.Error("未找到id:{factoryId},对应的泵站");
                return null ;
            }
            var stationId = stationInfo.ID;
            var station = new Service.Station().GetByID(_corpId, stationId);
            if (station == null)
            {
                LogHelper.Error($"上海原水能耗计划分析计算中, 泵站id:{stationId}, 数据库中未找到此泵站");
                return null;
            }
            var calculator = stationInfo.Calculator;
            if (calculator == null)
            {
                LogHelper.Error($"上海原水能耗计划分析计算中, 泵站id:{stationId}, 未构建计算器");
                return null;
            }
            calculator.SetStationID(4, 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
                                {
                                    LogHelper.Error($"上海原水能耗计划分析计算中, 泵站id:{stationId}, {scadaItem.tagname} 时间点{i}, 未找到数据");
                                    return null;
                                }
                            }
                            else
                            {
                                scadaRecord.RecordValue = ff.value;
                            }
                            hourSumRecord.Records.Add(scadaRecord);
                        }
                    }
                    sumRecord.HourRecords.Add(hourSumRecord);
                }
                sumRecordList.Add(sumRecord);
            }
            string error_info = "";
            var resultList = calculator.Calc(station, sg_factoryId, sumRecordList, out error_info);
            if (resultList == null || resultList.Count() < 1)
            {
                LogHelper.Error($"上海原水能耗计划分析计算中,泵站名称:{station.Name} 泵站id:{stationId},计算错误,原因是:{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 });
                }
            }
            return vmItem;
        }