using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IStation.IEtaCalculation;
using IStation.Model;
namespace IStation.EtaCalculation
{
///
///
///
public class AnalyCalculatorBase
{
///
/// 计算
///
/// 分析上下文
/// EtaMultiRealRecordPure 为基类 EtaLogicRealRecordPure、EtaMultiRealRecordPure、EtaSingleRealRecordPure都集成自此基类
///
///
public virtual bool Calculate(Model.EtaCorpAnalyContext context, Action<
List,
List,
List,
string> handler)
{
return false;
}
#region 所有泵站上下文
///
/// 所有泵站上下文
///
protected List _allStationContextList = null;
///
/// 获取泵站列表
///
///
/// 预计泵站数量,因为此类比较大,尽量初始化时给定数量,避免内存浪费
protected void InitialStationList(IStation.Model.EtaCorpAnalyContext context,int station_num)
{
_allStationContextList = new List(station_num);
foreach (var logicCatalogContextItem in context.LogicCatalogContextItems)
{
if (logicCatalogContextItem.UseStatus == eUseStatus.Enable)
{
foreach (var node in logicCatalogContextItem.LogicTreeContextItems)
{
ExtractStationFromContext(node,ref _allStationContextList);
}
}
}
}
///
/// 迭代
///
///
///
private void ExtractStationFromContext(EtaLogicTreeAnalyContextItem parent_context_item,ref List station_list)
{
if (parent_context_item.IsStation())
{
var station = parent_context_item.LogicContextItem as EtaStationAnalyContextItem;
if (station != null && station.UseStatus == eUseStatus.Enable && station.MonitorStatus == eMonitorStatus.Enable)
{
var find = station_list.Find(x => x.ID == station.ID);
if (find == null)//避免重复加入
station_list.Add(station);
}
}
else
{
foreach (var child in parent_context_item.Children)
{
ExtractStationFromContext(child,ref station_list);
}
}
}
///
///
///
///
///
///
private void ExtractChildIdFromContext(EtaLogicTreeAnalyContextItem context_item,ref List logic_Ids,ref List sation_ids)
{
if (context_item.IsStation())
{
var station = context_item.LogicContextItem as EtaStationAnalyContextItem;
if (station != null && station.UseStatus == eUseStatus.Enable && station.MonitorStatus == eMonitorStatus.Enable)
{
if (sation_ids.Contains(station.ID))//避免重复加入
sation_ids.Add(station.ID);
}
}
else
{
var logic = context_item.LogicContextItem as EtaLogicAreaAnalyContextItem;
if (!logic_Ids.Contains(logic.ID))//避免重复加入
logic_Ids.Add(logic.ID);
foreach (var child in context_item.Children)
{
ExtractChildIdFromContext(child,ref logic_Ids,ref sation_ids);
}
}
}
#endregion
}
}