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; } } } }