using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using IStation.Model.Api;
using IStation.ViewModel;
using AutoMapper;
using Microsoft.Web.Http;
namespace IStation.WebApi.Controllers.DispatchAna
{
///
///
///
[RoutePrefix("v1/Standard/DispatchAna")]
[ApiVersion("v1")]
public class DispatchAna_StandardController : ApiController
{
///
/// 根据流量扬程计算[FromUri]
///
///
///
[Route("CalcByFlowHead")]
[HttpPost]
public Result CalcByFlowHead(IStation.Dto.DispatchAna.CalcByFlowHead_Request request)
{
if (request == null)
{
return new Result(IStation.Model.Api.Code.Error, "request为空");
}
if (request.CorpID <= 0)
{
return new Result(IStation.Model.Api.Code.Error, "CorpID为空");
}
if (request.StationID <= 0)
{
return new Result(IStation.Model.Api.Code.Error, "StationID为空");
}
string min_q = "", max_q = "";
if (request.Range != null)
{
min_q = request.Range.MinQ;
max_q = request.Range.MaxQ;
}
List RunStatusDict = null;
if (request.RunStatusList == null)
{
// IStation.LogHelper.Info("RunStatusList none");
}
else if (request.RunStatusList.Count() == 0)
{
// IStation.LogHelper.Info("RunStatusList Count==0");
}
else //if (request.Setting.OpenStatus != null && request.Setting.OpenStatus.Count > 0)
{
RunStatusDict = new List();
foreach (var d in request.RunStatusList)
{
var binding_list = new Service.PipeLineBinding().GetByPipeLineID(request.CorpID, d.MachineID);
RunStatusDict.Add(new IStation.Model.Calc.DispatchAna.MachineRunFilter()
{
MachineID = binding_list.First().ObjectID,
RunStatus = d.Status,
MaxFlow = -1
});
}
}
IStation.Calculation.IDispatchAnalyCalculator calc_helper = IStation.Calculation.DispatchAnalyCalculatorFactory.CreateCalculator(request.CorpID,
IStation.ObjectType.Station_泵站,
request.StationID, null);
if (calc_helper == null)
{
return new Result(IStation.Model.Api.Code.Error, "Calculator 还未构建!");
}
IStation.Model.Calc.DispatchAna.RequestParas requestParas = new Model.Calc.DispatchAna.RequestParas();
requestParas.InitialParas(request.CorpID, request.StationID, request.TargetQ, 0, request.TargetH / 102, min_q, max_q);
requestParas.SchemeSortType = (IStation.Model.Calc.DispatchAna.eAnaSchemeSortType)request.SortType;
var MachineRunPara = new IStation.Model.Calc.DispatchAna.MachineRunPara() { MachineRunFilter = RunStatusDict };
string error_info;
var items = calc_helper.CalcOptList(requestParas, MachineRunPara, out error_info);
if (items == null || items.Count() == 0)
{
return new Result(IStation.Model.Api.Code.Alert, error_info);
}
else
{
return new Result>(items);
}
}
///
/// 根据流量扬程计算
///
///
///
[Route("CalcByFlowPress")]
[HttpGet]
public Result CalcByFlowPress([FromUri] IStation.Dto.DispatchAna.CalcByFlowPress_Request request)
{
if (request == null)
{
return new Result(IStation.Model.Api.Code.Error, "request为空");
}
if (request.CorpID <= 0)
{
return new Result(IStation.Model.Api.Code.Error, "CorpID为空");
}
if (request.StationID <= 0)
{
return new Result(IStation.Model.Api.Code.Error, "StationID为空");
}
string min_q = "", max_q = "";
if (request.Range != null)
{
min_q = request.Range.MinQ;
max_q = request.Range.MaxQ;
}
List RunStatusDict = null;
if (request.RunStatusList == null)
{
// IStation.LogHelper.Info("RunStatusList none");
}
else if (request.RunStatusList.Count() == 0)
{
// IStation.LogHelper.Info("RunStatusList Count==0");
}
else //if (request.Setting.OpenStatus != null && request.Setting.OpenStatus.Count > 0)
{
RunStatusDict = new List();
foreach (var d in request.RunStatusList)
{
RunStatusDict.Add(new IStation.Model.Calc.DispatchAna.MachineRunFilter()
{
MachineID = d.MachineID,
RunStatus = d.Status,
MaxFlow = -1
});
// RunStatusDict[d.MachineID] = d.Status;
}
//IStation.LogHelper.Info(request.RunStatusList.FirstOrDefault().MachineID + " : " +
// request.RunStatusList.FirstOrDefault().Status);
}
IStation.Calculation.IDispatchAnalyCalculator calc_helper = IStation.Calculation.DispatchAnalyCalculatorFactory.CreateCalculator(request.CorpID,
IStation.ObjectType.Station_泵站,
request.StationID, null);
if(calc_helper == null)
{
return new Result(IStation.Model.Api.Code.Error, "Calculator 还未构建!");
}
IStation.Model.Calc.DispatchAna.RequestParas requestParas = new Model.Calc.DispatchAna.RequestParas();
requestParas.SchemeSortType = (IStation.Model.Calc.DispatchAna.eAnaSchemeSortType)request.SortType;
requestParas.InitialParas(request.CorpID,request.StationID, request.TargetQ, request.WaterLevel,request.OutletPress, min_q, max_q);
var MachineRunPara = new IStation.Model.Calc.DispatchAna.MachineRunPara() { MachineRunFilter = RunStatusDict };
string error_info;
var items = calc_helper.CalcOptList (requestParas, MachineRunPara, out error_info);
if (items == null || items.Count() == 0)
{
return new Result(IStation.Model.Api.Code.Alert, error_info);
}
else
{
return new Result>(items);
}
}
///
/// 固定开停机方案, 计算最优参数
///
/// 公司ID
/// 泵站ID
///
///
/// 运行的机泵ID
///
/* [Route("CalcOptParas4Project")]
[HttpGet]
public Result CalcOptParas4Project(long CorpID, long StationID, double TargetQ, double TargetH, string RunMachineID)
{
if (string.IsNullOrEmpty(RunMachineID))
{
return new Result(Code.Alert, "RunMachineID 参数未输入");
}
if (CorpID <= 0)
{
return new Result(IStation.Model.Api.Code.Error, "CorpID为空");
}
if (StationID <= 0)
{
return new Result(IStation.Model.Api.Code.Error, "StationID为空");
}
var service_curve = new IStation.Service.PumpCurve();
var service_product = new IStation.Service.Product();
var all_machines = service_product.GetEnginePumpListByBelongTypeAndBelongID(CorpID, IStation.ObjectType.Station_泵站, StationID); //获取机泵列表
if (all_machines == null || all_machines.Count() == 0)
{
return new Result(Code.Alert, "此StationID未找到任何机泵");
}
var sssRunMachineID = RunMachineID.Split(',');
IStation.Model.Calc.DispatchAna.AnaScheme project = new IStation.Model.Calc.DispatchAna.AnaScheme();
project.Items = new List();
//获取并预算一下
List fixPumpDataList = new List();//固频泵
List frequPumpItems = new List();//变频泵
IStation.Calculation.DispatchAnaHelper泵站4常规_根据扬程 helper = new IStation.Calculation.DispatchAnaHelper泵站4常规_根据扬程();
helper.InitialParas(CorpID, StationID, TargetQ, TargetH, null, null);
foreach (var s in sssRunMachineID)
{
if (string.IsNullOrEmpty(s) || s == "null")
continue;
long machineID = 0;
if (!long.TryParse(s, out machineID))
continue;
var machine = (from x in all_machines where x.ID == machineID select x).FirstOrDefault();
if (machine == null)
continue;
var pump = service_product.GetChildPumpByEnginePumpID(CorpID, machineID);
if (pump == null)
continue;
var pump_curve = service_curve.GetDefaultCurveByPumpID(CorpID, pump.ID);
if (pump_curve == null)
continue;
IStation.Model.Calc.DispatchAna.MachineDetail Machine = new IStation.Model.Calc.DispatchAna.MachineDetail(machine, pump, pump_curve);
if (pump.RatedParas != null && pump.RatedParas.IsFrequency)
{
var anaData = helper.GetFrePumpAnaData(Machine);
if (anaData != null)
frequPumpItems.Add(anaData);
}
else
{//算出是否符合的固频泵
var anaData = helper.GetFixPumpAnaData(Machine);
if (anaData != null)
fixPumpDataList.Add(anaData);
}
}
return new Result>(frequPumpItems);
}*/
///
/// 修改频率后,重新计算
///
/// 公司ID
///
///
///
///
///
[Route("ReCalcProjectByItemFrequency")]
[HttpGet]
public Result ReCalcProjectByItemFrequency(long CorpID, long StationID, double TargetQ, double TargetH, string ItemsParas)
{
if (CorpID <= 0)
{
return new Result(IStation.Model.Api.Code.Error, "CorpID为空");
}
if (StationID <= 0)
{
return new Result(Code.Alert, "StationID 参数未输入");
}
if (string.IsNullOrEmpty(ItemsParas))
{
return new Result(Code.Alert, "ItemsParas 参数未输入");
}
IStation.Service.Product service_product = new IStation.Service.Product();
IStation.Service.PumpCurve service_curve = new IStation.Service.PumpCurve();
string strItemsParas = ItemsParas;
var sss = strItemsParas.Split(',');
IStation.Model.Calc.DispatchAna.AnaScheme project = new IStation.Model.Calc.DispatchAna.AnaScheme();
project.Items = new List();
foreach (var s in sss)
{
if (string.IsNullOrEmpty(s) || s == "null")
continue;
var bbb = s.Split('F');
if (bbb.Count() < 2)
continue;
var frequence = Convert.ToDouble(bbb[1]);
var aaa = bbb[0].Split('P');
var pumpID = Convert.ToInt64(aaa[1].Replace("P", ""));
var machineID = Convert.ToInt64(aaa[0].Replace("M", ""));
var engin = service_product.GetEnginePumpByProductID(CorpID, machineID);
if (engin == null)
continue;
var pump = service_product.GetChildPumpByEnginePumpID(CorpID, engin.ID);
if (pump == null)
continue;
var pump_curve = service_curve.GetDefaultCurveByPumpID(CorpID, pumpID);
if (pump_curve == null)
continue;
if(pump_curve.CurveInfo == null)
continue;
IStation.Model.Calc.DispatchAna.AnaCurveItem anaData = new IStation.Model.Calc.DispatchAna.AnaCurveItem();
int ret = IStation.Common.DispatchAnaGeneralHelper.CalcAnaCurve(
pump_curve.CurveInfo.CurveQH,
pump_curve.CurveInfo.CurveQP,
0,TargetH/102, frequence, ref anaData);
if (ret == -1)
break;//-1 表示最大扬程都已经低于目标扬程了, 没必要再迭代了
if (ret == 0)
continue;
////效率延长不稳定
//var maxCurveQP = pump_curve.GetRatedCurveInfoQP();
//var exPointsQP = IStation.Common.FitCurveHelper.GetFitPointsByExtend(, DispatchAnaHelper.ExtendMaxRatio, 50);//延长
//double power = Math.Round(IStation.Common.FitCurveHelper.GetFitPointY(exPointsQP, curve.WorkPointQ), 1);
IStation.Model.Calc.DispatchAna.AnaSchemeItem item = new IStation.Model.Calc.DispatchAna.AnaSchemeItem( new IStation.Model.Calc.DispatchAna.MachineDetail(engin, pump, pump_curve), anaData);
item.WorkPointP = anaData.WorkPointP;
item.WorkPointE = IStation.Common.PumpParaHelper.CalculateE(anaData.WorkPointQ, anaData.WorkPointH, anaData.WorkPointP);
project.Items.Add(item);
}
project.TotalWrkQ = (from x in project.Items where x.WorkPointQ > 0 select x.WorkPointQ).Sum();
project.TotalWrkP = (from x in project.Items where x.WorkPointP > 0 select x.WorkPointP).Sum();
project.UWP = Math.Round(IStation.Common.DispatchAnaGeneralHelper.Calcu_UWP(project.TotalWrkP, project.TotalWrkQ, TargetH),3);
project.WP = Math.Round(IStation.Common.DispatchAnaGeneralHelper.Calcu_UWP(project.TotalWrkP, project.TotalWrkQ, TargetH), 3);
project.SpanQ = Math.Round(project.TotalWrkQ - TargetQ, 0) ;
return new Result(project);
}
///
///
///
/// 公司ID
///
///
///
[Route("GetAnaItemDetail")]
[HttpGet]
public Result GetAnaItemDetail(long CorpID, string StationID, string ItemsParas)
{
if (CorpID <= 0)
{
return new Result(IStation.Model.Api.Code.Error, "CorpID为空");
}
if (string.IsNullOrEmpty(StationID))
{
return new Result(Code.Alert, "StationID 参数未输入");
}
if (string.IsNullOrEmpty(ItemsParas))
{
return new Result(Code.Alert, "ItemsParas 参数未输入");
}
IStation.Service.PumpCurve bllCurve = new IStation.Service.PumpCurve();
string strItemsParas = ItemsParas;
var sss = strItemsParas.Split(',');
List curveListQH = new List();
List curveListQP = new List();
double r_maxH = double.MaxValue, r_minH = double.MinValue;
List ParallelCurve = new List();
foreach (var s in sss)
{
if (string.IsNullOrEmpty(s) || s == "null")
continue;
var bbb = s.Split('F');
if (bbb.Count() < 2)
continue;
var frequence = Convert.ToDouble(bbb[1]);
var aaa = bbb[0].Split('P');
var pumpID = Convert.ToInt64(aaa[1].Replace("P", ""));
var machineID = Convert.ToInt64(aaa[0].Replace("M", ""));
var curve_default = bllCurve.GetDefaultCurveByPumpID(CorpID, pumpID);
if (curve_default == null)
continue;
if (curve_default.CurveInfo == null)
continue;
if (frequence > 49.5)
{
var curve_qh = curve_default.CurveInfo.CurveQH ;
curve_qh.Max = curve_qh.Max * IStation.Common.DispatchAnaGeneralHelper.ExtendMaxRatio;
curveListQH.Add(curve_qh);
var curve_qp = curve_default.CurveInfo.CurveQP;
curve_qp.Max = curve_qp.Max * IStation.Common.DispatchAnaGeneralHelper.ExtendMaxRatio;
curveListQP.Add(curve_qp);
}
else
{
var ration = frequence / 50.0;
var maxCurveQH = IStation.Model.FitCurveHelper.GetFitPointsByExtend(curve_default.CurveInfo.CurveQH , IStation.Common.DispatchAnaGeneralHelper.ExtendMaxRatio, 20);
var maxCurveQP = IStation.Model.FitCurveHelper.GetFitPointsByExtend(curve_default.CurveInfo.CurveQP, IStation.Common.DispatchAnaGeneralHelper.ExtendMaxRatio, 20);
List simuPointsQH = new List();
foreach (var pt in maxCurveQH)
{
simuPointsQH.Add(new IStation.Model.CurvePoint(pt.X * ration, pt.Y * ration * ration));
}
List simuPointsQP = new List();
foreach (var pt in maxCurveQP)
{
simuPointsQP.Add(new IStation.Model.CurvePoint(pt.X * ration, pt.Y * ration * ration * ration));
}
curveListQH.Add(new IStation.Model.CurveExpress(simuPointsQH));
curveListQP.Add(new IStation.Model.CurveExpress(simuPointsQP));
}
double maxH, minH;
IStation.Model.FitCurveHelper.GetMinMaxPointY(curveListQH.Last(), out maxH, out minH);
r_maxH = Math.Min(r_maxH, maxH);
r_minH = Math.Max(r_minH, minH);
var product = new IStation.Service.Product().GetByID(CorpID, machineID);
IStation.Dto.DispatchAna.CurveItem item = new IStation.Dto.DispatchAna.CurveItem();
item.Type = 0;
item.Name = product==null?"": product.Name;
item.PointQH = IStation.Model.PumpCurve.GetEChartPoint(new IStation.Model.CurveExpress(curveListQH.Last()), 20);
item.PointQP = IStation.Model.PumpCurve.GetEChartPoint(new IStation.Model.CurveExpress(curveListQP.Last()), 20);
ParallelCurve.Add(item);
}
if (curveListQH.Count < 1)
{
return new Result(IStation.Model.Api.Code.Alert, "NULL1");
}
else if (curveListQH.Count == 1)
{
IStation.Dto.DispatchAna.CurveItem item_bl_Same = new IStation.Dto.DispatchAna.CurveItem();
item_bl_Same.Type = 1;
item_bl_Same.Name = "并联曲线";
item_bl_Same.PointQH = ParallelCurve.FirstOrDefault().PointQH;
item_bl_Same.PointQP = ParallelCurve.FirstOrDefault().PointQP;
ParallelCurve.Add(item_bl_Same);
return new Result>(ParallelCurve);
}
//if (curveListQH.Count < 2)
//{
// return Json(new Result(IStation.Model.Api.Code.Alert, "NULL1"), JsonRequestBehavior.AllowGet);
//}
if (r_maxH < r_minH)
{
return new Result(IStation.Model.Api.Code.Alert, "NULL2");
}
double space_h = (r_maxH - r_minH) / 19;
List conne_curve_qp = new List();
List conne_curve_qh = new List();
for (var h = r_minH; h <= r_maxH; h = h + space_h)
{
double total_flow = 0;
double total_power = 0;
for (int j = 0; j < curveListQH.Count; j++)
{
var curveQH = curveListQH[j];
var curveQP = curveListQP[j];
var pts = IStation.Model.FitCurveHelper.GetInterPointX(curveQH, h);
if (pts != null && pts.Count > 0)
{
var q = pts.Last().X;
total_flow += q;
total_power += IStation.Model.FitCurveHelper.GetFitPointY(curveQP, q);
}
}
conne_curve_qh.Add(new IStation.Model.CurvePoint(total_flow, h));
conne_curve_qp.Add(new IStation.Model.CurvePoint(total_flow, total_power));
}
IStation.Dto.DispatchAna.CurveItem item_bl = new IStation.Dto.DispatchAna.CurveItem();
item_bl.Type = 1;
item_bl.Name = "并联曲线";
item_bl.PointQH = IStation.Model.PumpCurve.GetEChartPoint(new IStation.Model.CurveExpress(conne_curve_qh), 20);
item_bl.PointQP = IStation.Model.PumpCurve.GetEChartPoint(new IStation.Model.CurveExpress(conne_curve_qp), 20);
ParallelCurve.Insert(0,item_bl);//放在第一个
return new Result>(ParallelCurve);
}
///
/// 获取实时调度运行数据
///
/// 公司ID
///
///
[Route("GetCurrentDispatchScheme")]
[HttpGet]
public Result GetCurrentDispatchScheme(long CorpID, long StationID)
{
if (CorpID <= 0)
{
return new Result(IStation.Model.Api.Code.Error, "CorpID为空");
}
if (StationID <= 0)
{
return new Result(Code.Alert, "StationID 参数未输入");
}
//获取当前运行流量扬程()
// var redisStationRun = new Service.PumpRun().GetRunRealStatus(StationID);
//if (redisStationRun == null)
// return new Result(null);
/* var realData = new StationRunRealData();
//realData.RealTime = redisStationRun.RealTime.ToString("yyyy-MM-dd HH:mm:ss");
var stationRun = new StationRunRealTime();
var eta_station = new Service.EtaPipeLine().GetDefaultByObjectTypeAndObjectID(ObjectType.Station_泵站, StationID);
if (eta_station != null)
{
var run_station = new Service.EtaPipeLineRun().GetLastTrunkRecord(eta_station.ID);
stationRun.H = Math.Round(run_station.Ha, 2);
stationRun.P = run_station.Pa;
//stationRun.P1 = run_station.p;
//stationRun.P2 = redisStationRun.P2;
stationRun.Q = run_station.Qa;
stationRun.UWP = Math.Round( run_station.UWPa, 2).ToString();
realData.StationRumReal = stationRun;
}
var server_product = new Service.Product();
var all_machines = server_product.GetEnginePumpByStationID(StationID);
if (all_machines == null || all_machines.Count < 1)
{
return new Result(IStation.Model.Api.Code.Error, " 当前泵站未设置机泵信息");
}
all_machines = all_machines.OrderBy(t => t.SortCode).ToList();
foreach (var machine in all_machines)
{
var eta = new Service.EtaPipeLine().GetDefaultByObjectTypeAndObjectID(ObjectType.Product_设备, machine.ID);
if (eta != null)
{
var redisPumpRun = new Service.EtaPipeLineRun().GetLastBranchRecord(eta.ID);
if (redisPumpRun == null)
continue;
if (redisPumpRun != null && redisPumpRun.RSa == Model.eEtaRunStatus.开机)
{
var pumpRun = new PumpRunRealTime();
pumpRun.Name = machine.Name;
pumpRun.MachineID = machine.ID;
var pump = server_product.GetChildPumpByID(machine.ID);
if (pump != null)
pumpRun.PumpID = pump.ID;
pumpRun.E = redisPumpRun.Ea;
pumpRun.H = Math.Round(redisPumpRun.Ha, 2);
pumpRun.HZ = redisPumpRun.HZa;
pumpRun.P = redisPumpRun.Pa;
// pumpRun.P1 = redisPumpRun.P1m == null ? 0 : redisPumpRun.P1m.Value;
// pumpRun.P2 = redisPumpRun.P2m == null ? 0 : redisPumpRun.P2m.Value;
pumpRun.Q = redisPumpRun.Qa;
if (realData.PumpRunReals == null)
realData.PumpRunReals = new List();
realData.PumpRunReals.Add(pumpRun);
}
}
}
List sss = new List();
foreach (var item in realData.PumpRunReals)
{
sss.Add(string.Format("M{0}P{1}F{2}", item.MachineID, item.PumpID, item.HZ));
}
realData.ItemsParas = string.Join(",", sss);
return new Result(realData);*/
return new Result("123456");
}
//泵站实时运行数据
internal class StationRunRealData
{
///
/// 时间
///
public string RealTime { get; set; }
///
///
///
public string ItemsParas { get; set; }
///
/// 泵站
///
public StationRunRealTime StationRumReal { get; set; }
///
/// 机泵
///
public List PumpRunReals { get; set; }
}
//泵站
internal class StationRunRealTime
{
//流量
public double Q { get; set; }
//功率
public double P { get; set; }
//出口压力
public double P1 { get; set; }
//进口压力
public double P2 { get; set; }
//扬程
public double H { get; set; }
//效率
public double E { get; set; }
//
public string UWP { get; set; }
}
//单泵
internal class PumpRunRealTime
{
//
public long MachineID { get; set; }
//
public long PumpID { get; set; }
//名称
public string Name { get; set; }
//功率
public double P { get; set; }
//流量
public double Q { get; set; }
//出口压力
public double P1 { get; set; }
//进口压力
public double P2 { get; set; }
//扬程
public double H { get; set; }
//效率
public double E { get; set; }
//频率
public double HZ { get; set; }
}
}
}