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