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("Dispatch/Analy/Std")] [NonUnify] [ApiDescriptionSettings("Eta", Name = "调度分析", Order = 595)] public class DispatchAnaly_StdController : IDynamicApiController { /// /// 获取实时调度信息 /// [Route("GetCurrentInfo@V1.0")] [HttpGet] public IStation.Dto.ApiResult GetCurrentInfo([FromQuery][Required] StationIDUnderCorpInput input) { var pipeLineList = new Service.PipeLine().GetByBelongTypeAndBelongID(input.CorpID, IStation.ObjectType.Station, input.StationID); if (pipeLineList == null || pipeLineList.Count < 1) { throw new Exception("未检索到管路信息"); } pipeLineList = pipeLineList.Where(x => x.Catalog == IStation.PipeLine.EnginePump && x.SerialNO != null).OrderBy(x => x.SerialNO).ToList(); if (pipeLineList.Count < 1) { throw new Exception("未检索到机泵管路信息"); } var record_station = new Service.EtaMultiRealRecord().GetLastNormalRecord(input.CorpID, IStation.ObjectType.Station, input.StationID); if (record_station == null) { throw new Exception("获取失败"); } if (record_station.RunningCount < 1) { throw new Exception("未开机"); } var vm_ana_result = new IStation.Dto.DispatchAna.StationEtaAnaRecord(record_station); var serice_product = new IStation.Service.Product(); var name_list = new List(); for (int i = 0; i < pipeLineList.Count; i++) { var pipeLine = pipeLineList[i]; if (record_station.RunningFlag[i] == RunStatus.Run) { name_list.Add(pipeLine.Name); var record_pipe = new Service.EtaSingleRealRecord().GetLastNormalRecord(pipeLine.CorpID, IStation.ObjectType.PipeLine, pipeLine.ID); if (record_pipe != null) { var pipeBindingList = new Service.PipeLineBinding().GetUseByPipeLineID(pipeLine.CorpID,pipeLine.ID); var pipeEnginePumpBinding = pipeBindingList?.Find(x=>x.BindingType==ObjectType.Product); var enginePump = serice_product.GetEnginePumpByProductID(pipeEnginePumpBinding.CorpID,pipeEnginePumpBinding.BindingID); var pump = serice_product.GetChildPumpByEnginePumpID(pipeEnginePumpBinding.CorpID, pipeEnginePumpBinding.BindingID); var vm_item = new IStation.Dto.DispatchAna.PumpEtaAnaRecord(record_pipe); if(pump != null) { vm_item.MachineID = enginePump.ID; vm_item.PumpID = pump.ID; } vm_item.Name = pipeLine.Name; vm_ana_result.Items.Add(vm_item); } } } vm_ana_result.Name = string.Join(",", name_list); IStation.Calculation.DispatchAna.IGetCurrentRecord calc_helper = IStation.Calculation.DispatchAnalyCalculatorFactory.CreateGetCurrentRecord( input.CorpID, IStation.ObjectType.Station, input.StationID); if (calc_helper == null) { return new Dto.ApiResult(new IStation.Dto.DispatchAna.StationCurrentInfo(vm_ana_result)); } string error_info = null; var current_dispatch_info = calc_helper.GetCurrentRecord(input.CorpID, input.StationID, out error_info); if (current_dispatch_info == null) { return new Dto.ApiResult( new IStation.Dto.DispatchAna.StationCurrentInfo(vm_ana_result)); } else { return new Dto.ApiResult( new IStation.Dto.DispatchAna.StationCurrentInfo( vm_ana_result, current_dispatch_info) ); } } /// /// 简易计算 /// /// /// [Route("SimpleCalcScheme@V1.0")] [HttpPost] public IStation.Dto.ApiResult SimpleCalcScheme( IStation.Dto.DispatchAna.CalcBySimple_Request request) { if (request == null) { return IStation.Dto.ApiResult.Error("request为空"); } if (request.CorpID <= 0) { return IStation.Dto.ApiResult.Error("CorpID为空"); } if (request.StationID <= 0) { return IStation.Dto.ApiResult.Error("StationID为空"); } //获取辅助类 IStation.Calculation.DispatchAna.IOptAnaCalc calc_helper = IStation.Calculation.DispatchAnalyCalculatorFactory.CreateOptAnaCalculator( request.CorpID, IStation.ObjectType.Station, request.StationID,null); if (calc_helper == null) { return IStation.Dto.ApiResult.Error("Calculator 还未构建"); } //构建参数 string error_info = null; var complex_request_paras = request.BuildRequestComplex(out error_info); var machine_run_status = request.BuildMachineRunPara(out error_info); var eta_ana_records = request.BuildEtaAnaRecord(out error_info); //计算 var items = calc_helper.CalcSchemes( complex_request_paras, eta_ana_records, machine_run_status, out error_info); if (items == null || items.Count() == 0) { return IStation.Dto.ApiResult.Alert(error_info); } else { return new IStation.Dto.ApiResult>(items); } } /// /// 修改频率后,重新计算(简易计算) /// /// 公司ID /// /// /// /// /// [Route("ReSimpleCalcByItemFrequency@V1.0")] [HttpGet] public IStation.Dto.ApiResult ReSimpleCalcByItemFrequency( long CorpID, long StationID, double TargetQ, double TargetH, string ItemsParas) { if (CorpID <= 0) { return IStation.Dto.ApiResult.Error("CorpID为空"); } if (StationID <= 0) { return IStation.Dto.ApiResult.Error("StationID为空"); } if (string.IsNullOrEmpty(ItemsParas)) { return IStation.Dto.ApiResult.Error("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.Calculation.DispatchAna.Model.AnaScheme project = new IStation.Calculation.DispatchAna.Model.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.GetWorkingByPumpID(CorpID, pumpID); if (pump_curve == null) continue; if (pump_curve.CurveInfo == null) continue; IStation.Calculation.DispatchAna.Model.AnaCurveItem anaData = new IStation.Calculation.DispatchAna.Model.AnaCurveItem(); int ret = IStation.Calculation.DispatchAna.Common.DispatchAnaGeneralHelper压力.CalcAnaCurve( pump_curve.CurveInfo.CurveQH, pump_curve.CurveInfo.CurveQP, 0, TargetH / 102, 0, 0, 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.Calculation.DispatchAna.Model.AnaSchemeItem item = new IStation.Calculation.DispatchAna.Model.AnaSchemeItem(new IStation.Calculation.DispatchAna.Model.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.Calculation.DispatchAna.Common.DispatchAnaGeneralHelper压力.Calcu_UWP(project.TotalWrkP, project.TotalWrkQ, TargetH), 3); project.WP = Math.Round(IStation.Calculation.DispatchAna.Common.DispatchAnaGeneralHelper压力.Calcu_UWP(project.TotalWrkP, project.TotalWrkQ, TargetH), 3); project.SpanQ = Math.Round(project.TotalWrkQ - TargetQ, 0); return new IStation.Dto.ApiResult(project); } /// /// /// /// 公司ID /// /// /// [Route("GetAnaItemDetail@V1.0")] [HttpGet] public IStation.Dto.ApiResult GetAnaItemDetail(long CorpID, string StationID, string ItemsParas) { if (CorpID <= 0) { return new IStation.Dto.ApiResult(IStation.Dto.ApiResultCode.Error, "CorpID为空"); } if (string.IsNullOrEmpty(StationID)) { return new IStation.Dto.ApiResult(IStation.Dto.ApiResultCode.Alert, "StationID 参数未输入"); } if (string.IsNullOrEmpty(ItemsParas)) { return new IStation.Dto.ApiResult(IStation.Dto.ApiResultCode.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.GetDefaultWorkingByPumpID(CorpID, pumpID); //.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.Calculation.DispatchAna.Common.DispatchAnaGeneralHelper压力.ExtendMaxRatio; curveListQH.Add(curve_qh); var curve_qp = curve_default.CurveInfo.CurveQP; curve_qp.Max = curve_qp.Max * IStation.Calculation.DispatchAna.Common.DispatchAnaGeneralHelper压力.ExtendMaxRatio; curveListQP.Add(curve_qp); } else { var ration = frequence / 50.0; var maxCurveQH = IStation.Model.FitCurveHelper.GetFitPointsByExtend(curve_default.CurveInfo.CurveQH, IStation.Calculation.DispatchAna.Common.DispatchAnaGeneralHelper压力.ExtendMaxRatio, 20); var maxCurveQP = IStation.Model.FitCurveHelper.GetFitPointsByExtend(curve_default.CurveInfo.CurveQP, IStation.Calculation.DispatchAna.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 IStation.Dto.ApiResult (IStation.Dto.ApiResultCode.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 IStation.Dto.ApiResult>(ParallelCurve); } //if (curveListQH.Count < 2) //{ // return Json(new Result(IStation.Model.Api.Code.Alert, "NULL1"), JsonRequestBehavior.AllowGet); //} if (r_maxH < r_minH) { return new IStation.Dto.ApiResult(IStation.Dto.ApiResultCode.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 IStation.Dto.ApiResult>(ParallelCurve); } } }