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 Mapster;
namespace IStation.Application
{
///
/// 节能改造
///
[Route("Eta/Analy/Reform")]
[ApiDescriptionSettings("Eta", Name = "节能改造", Order = 598)]
public class EtaAnalyReform_Controller : IDynamicApiController
{
///
/// 获取泵站下面机泵(含曲线信息):能效专用
///
///
///
///
[Route("GetMachineByStationID@V1.0")]
[HttpGet]
public List GetMachineByStationID(long CorpID,long StationID)
{
if (CorpID < 1)
{
throw new Exception("CorpID大于0");
}
if (StationID < 1)
{
throw new Exception("StationID大于0");
}
var cacheKey = $"MachineList4EnergyAna_{CorpID}_Station_{StationID}";
var vm_list = MemoryCacheHelper.GetSet>(cacheKey, () =>
{
List vm_cache_list = new List();
//获取机泵列表
var enginePumplist = new Service.Product().GetEnginePumpListByBelongTypeAndBelongID(CorpID,ObjectType.Station,StationID);
foreach (var enginePump in enginePumplist)
{
var pump = new Service.Product().GetChildPumpByEnginePumpID(CorpID,enginePump.ID);
if (pump == null)
continue;
var curve = new Service.PumpCurveExMapping().GetDefaultWorkingByPumpID(CorpID,pump.ID);
if (curve == null || curve.CurveInfo == null || curve.CurveInfo.CurveQH == null)
continue;
var vm_cache = new Dto.MachineBaseItem4Reform();
//pipe_engine_pump, pump, property_list, curve);
vm_cache.MachineID = enginePump.ID;
vm_cache.MachineName = enginePump.Name;
vm_cache.PumpID = pump.ID;
vm_cache.CurveID = curve.ID;
vm_cache.PointsQH = IStation.Model.FitCurveHelper.GetFitPoints(curve.CurveInfo.CurveQH, 12);
vm_cache.PointsQE = IStation.Model.FitCurveHelper.GetFitPoints(curve.CurveInfo.CurveQE, 12);
vm_cache.PointsQP = IStation.Model.FitCurveHelper.GetFitPoints(curve.CurveInfo.CurveQP, 12);
if (pump.RatedParas != null)
{
vm_cache.RatedQ = pump.RatedParas.Q;
vm_cache.RatedH = pump.RatedParas.H;
vm_cache.RatedE = pump.RatedParas.E;
vm_cache.RatedP = pump.RatedParas.P;
vm_cache.Ratedn = pump.RatedParas.N;
vm_cache.IsFrequency = pump.RatedParas.IsFrequency;
vm_cache.IsSxp = pump.RatedParas.IsSxp;
}
vm_cache.WorkDayInYear = 200;// 每年工作天数(以后来源数据库)
vm_cache.WorkHourInDay = 5;//每天平均工作小时(以后来源数据库)
vm_cache.ElectricityFees = 1;//电费 (来源配置)
vm_cache.CurrentWorkFr = 0; //来源数据库( 最近一次的开机频率)
vm_cache.CurrentWorkPtQ = 0; //来源数据库( 最近一次的单泵开机流量)
vm_cache.CurrentWorkPtH = 0; //来源数据库( 最近一次的单泵开机扬程)
vm_cache.CurrentWorkPtE = 0; //来源数据库( 最近一次的单泵开机效率)
vm_cache.CurrentWorkPtP = 0; //来源数据库( 最近一次的单泵开机功率)
vm_cache_list.Add(vm_cache);
}
return vm_cache_list;
}, 12);
return new List(vm_list);
}
///
///
///
///
///
[Route("GetAnaResult@V1.0")]
[HttpPost]
public List GetAnaResult(IStation.Dto.ReformAnaRequest AnaRequest)
{
if (AnaRequest == null || AnaRequest.CorpID < 1)
{
throw new Exception("CorpID大于0");
}
if (AnaRequest.PumpID < 1)
{
throw new Exception("MachineID大于0");
}
if (AnaRequest.CurveID < 1)
{
throw new Exception("CurveID大于0");
}
var service_curve = new Service.PumpCurveExMapping();
var curves = service_curve.GetByCurveID(AnaRequest.CorpID, AnaRequest.CurveID);
if (curves == null)
{
throw new Exception("曲线还未设置");
}
var curve = curves.Find(x => x.PumpID == AnaRequest.PumpID);
if (curve == null || curve.CurveInfo == null || curve.CurveInfo.CurveQH == null)
{
throw new Exception("曲线还未设置");
}
var fit_point_h = IStation.Model.FitCurveHelper.GetFitPointY(curve.CurveInfo.CurveQH, AnaRequest.TargetQ);
#region 切割
var result_cut = new Dto.ReformAnaResultItem();
result_cut.Name = "叶轮切割";
result_cut.Type = 1;
result_cut.WorkPointQ = AnaRequest.TargetQ;
result_cut.WorkPointH = AnaRequest.TargetH;
result_cut.IsAble = false;
if (fit_point_h < AnaRequest.TargetH * 1.05)
{//切割 变频都不行
result_cut.Note = "当前水泵,无法通过切割的方式,达到理想工况点";
result_cut.IsAble = false;
}
else
{
double OriginD2 = 100;//计算的是百分率
double wrk_d2 = IStation.Common.CutSimuCalculer.GetSimuValue(curve.CurveInfo.CurveQH,
new IStation.Model.CurvePoint(AnaRequest.TargetQ, AnaRequest.TargetH), OriginD2, 1.05);
if (wrk_d2 > 30)
{
var CurveExpressQH = IStation.Common.CutSimuCalculer.GetSimuPointQH(curve.CurveInfo.CurveQH, OriginD2, wrk_d2);
var CurveExpressQE = IStation.Common.CutSimuCalculer.GetSimuPointQE(curve.CurveInfo.CurveQE, OriginD2, wrk_d2);
var CurveExpressQP = IStation.Common.CutSimuCalculer.GetSimuPointQP(curve.CurveInfo.CurveQP, OriginD2, wrk_d2);
result_cut.PointsQH = IStation.Model.FitCurveHelper.GetFitPoints(CurveExpressQH, 12);
result_cut.PointsQE = IStation.Model.FitCurveHelper.GetFitPoints(CurveExpressQE, 12);
result_cut.PointsQP = IStation.Model.FitCurveHelper.GetFitPoints(CurveExpressQP, 12);
result_cut.Note = string.Format("切割率 {0:0.0}% ", (1 - wrk_d2 / OriginD2) * 100);
result_cut.WorkPointE = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(CurveExpressQE, result_cut.WorkPointQ), 2);
result_cut.WorkPointP = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(CurveExpressQP, result_cut.WorkPointQ), 1);
result_cut.IsAble = true;
result_cut.PerDayPower = Math.Round(result_cut.WorkPointP.Value * AnaRequest.WorkHourInDay, 0);
result_cut.PerYearPower = result_cut.PerDayPower * AnaRequest.WorkDayInYear;
result_cut.PerYearCost = result_cut.PerYearPower * AnaRequest.ElectricityFees;
}
else
{
result_cut.Note = "当前水泵,无法通过切割的方式,达到理想工况点";
result_cut.IsAble = false;
}
}
#endregion
#region 变频
var result_speed = new Dto.ReformAnaResultItem();
result_speed.Name = "电机变频";
result_speed.WorkPointQ = AnaRequest.TargetQ;
result_speed.WorkPointH = AnaRequest.TargetH;
result_speed.IsAble = false;
result_speed.Type = 2;
if (fit_point_h < AnaRequest.TargetH * 1.05)
{//切割 变频都不行
result_speed.Note = "当前水泵,无法通过变频的方式,达到理想工况点";
result_speed.IsAble = false;
}
else
{
double wrk_hz = IStation.Common.SpeedSimuCalculer.GetSimuValue(curve.CurveInfo.CurveQH,
new IStation.Model.CurvePoint(AnaRequest.TargetQ, AnaRequest.TargetH), 50, 1.05);
if (wrk_hz > 10)
{
var CurveExpressQH = IStation.Common.SpeedSimuCalculer.GetSimuPointQH(curve.CurveInfo.CurveQH, 50, wrk_hz);
var CurveExpressQE = IStation.Common.SpeedSimuCalculer.GetSimuPointQE(curve.CurveInfo.CurveQE, 50, wrk_hz);
var CurveExpressQP = IStation.Common.SpeedSimuCalculer.GetSimuPointQP(curve.CurveInfo.CurveQP, 50, wrk_hz);
result_speed.PointsQH = IStation.Model.FitCurveHelper.GetFitPoints(CurveExpressQH, 12);
result_speed.PointsQE = IStation.Model.FitCurveHelper.GetFitPoints(CurveExpressQE, 12);
result_speed.PointsQP = IStation.Model.FitCurveHelper.GetFitPoints(CurveExpressQP, 12);
result_speed.Note = string.Format("变频{0:0.0}HZ ", wrk_hz);
result_speed.WorkPointE = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(CurveExpressQE, result_speed.WorkPointQ), 2);
result_speed.WorkPointP = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(CurveExpressQP, result_speed.WorkPointQ), 1);
result_speed.IsAble = true;
result_speed.PerDayPower = Math.Round(result_speed.WorkPointP.Value * AnaRequest.WorkHourInDay, 0);
result_speed.PerYearPower = result_speed.PerDayPower * AnaRequest.WorkDayInYear;
result_speed.PerYearCost = result_speed.PerYearPower * AnaRequest.ElectricityFees;
}
else
{
result_speed.Note = "当前水泵,无法通过变频的方式,达到理想工况点";
result_speed.IsAble = false;
}
}
#endregion
#region 替换
var service_product = new Service.Product();
var pump = service_product.GetChildPumpByEnginePumpID(AnaRequest.CorpID, AnaRequest.MachineID);
if (pump == null)
{
throw new Exception("机泵未找到");
}
IStation.Model.GroupPoint theRepRatedParas = new IStation.Model.GroupPoint();
theRepRatedParas.Q = AnaRequest.TargetQ;
theRepRatedParas.H = AnaRequest.TargetH;
theRepRatedParas.E = 90;
if (pump.RatedParas.E > 0)
theRepRatedParas.E = pump.RatedParas.E;
theRepRatedParas.P = IStation.Common.PumpParaHelper.CalculateP(theRepRatedParas.Q, theRepRatedParas.H, theRepRatedParas.E);
List pointsQH_replace = null;
List pointsQE_replace = null;
List pointsQP_replace = null;
List pointsNPSH_replace = null;
double ratedn = 960;
if (pump.RatedParas.N > 0)
ratedn = pump.RatedParas.N;
else
{
var motor = service_product.GetChildMotorByEnginePumpID(AnaRequest.CorpID, AnaRequest.MachineID);
if (motor != null && motor.RatedParas != null && motor.RatedParas.N > 10)
{
ratedn = motor.RatedParas.N;
}
}
var RET = IStation.Common.DimensionlessCurvesHelper.CalcPoints(theRepRatedParas, ratedn,
ref pointsQH_replace, ref pointsQE_replace, ref pointsQP_replace, ref pointsNPSH_replace, pump.RatedParas.IsSxp, 1);
var result_replace = new Dto.ReformAnaResultItem();
result_replace.Name = "换叶轮/换泵";
result_replace.IsAble = true;
result_replace.Type = 3;
result_replace.WorkPointQ = AnaRequest.TargetQ;
result_replace.WorkPointH = AnaRequest.TargetH;
result_replace.PointsQH = pointsQH_replace;
result_replace.PointsQE = pointsQE_replace;
result_replace.PointsQP = pointsQP_replace;
result_replace.Note = "";
result_replace.WorkPointE = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(pointsQE_replace, result_replace.WorkPointQ), 2);
result_replace.WorkPointP = Math.Round(IStation.Model.FitCurveHelper.GetFitPointY(pointsQP_replace, result_replace.WorkPointQ), 1);
result_replace.PerDayPower = Math.Round(result_replace.WorkPointP.Value * AnaRequest.WorkHourInDay, 0);
result_replace.PerYearPower = result_replace.PerDayPower * AnaRequest.WorkDayInYear;
result_replace.PerYearCost = result_replace.PerYearPower * AnaRequest.ElectricityFees;
#endregion
var vm_list = new List();
vm_list.Add(result_cut);
vm_list.Add(result_speed);
vm_list.Add(result_replace);
foreach (var vm in vm_list)
{
if (vm.IsAble && vm.PerYearPower != null && vm.PerYearCost != null && AnaRequest.CurrentWorkPtP > 0)
{
var CurrentPerDayPower = Math.Round(AnaRequest.CurrentWorkPtP * AnaRequest.WorkHourInDay, 0);
var CurrentPerYearPower = CurrentPerDayPower * AnaRequest.WorkDayInYear;
var CurrentPerYearCost = CurrentPerYearPower * AnaRequest.ElectricityFees;
vm.SavePowerNumber = (CurrentPerYearPower - (double)vm.PerYearPower).ToString("N0");
vm.SavePowerCost = (CurrentPerYearCost - (double)vm.PerYearCost).ToString("N0");
vm.PerYearQ = Math.Round(vm.WorkPointQ * AnaRequest.WorkHourInDay * AnaRequest.WorkDayInYear, 0);
vm.CostPerM3 = Math.Round((double)vm.PerYearCost * 1000 / (double)vm.PerYearQ, 1).ToString();
}
else
{
vm.SavePowerNumber = "-";
vm.SavePowerCost = "-";
vm.PerYearQ = null;
vm.CostPerM3 = null;
}
}
return new List(vm_list);
}
}
}