using SKMC.Api.Common;
using SKMC.Api.Common.Tasks;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SKMC.Api.Process.Model
{
///
/// 流程站点管理器接口
///
public abstract class ProcessStationManager
{
protected static readonly ILogger log = LogFactory.Get();
///
/// 流程站点Id与站点对象的字典
///
public readonly Dictionary processStations = new Dictionary();
///
/// 已运行的流程站点
///
public readonly Dictionary runningStations = new Dictionary();
///
/// 运行中的流程步骤
///
public readonly ConcurrentDictionary runningSteps = new ConcurrentDictionary();
///
/// 获取流程站点
///
/// 流程站点Id
///
public virtual ProcessStation Get(int stationId) => processStations[stationId];
///
/// 添加流程站点
///
/// 流程站点
public virtual void Add(ProcessStation processStation) => processStations.Add(processStation.Id, processStation);
///
/// 所有站点是否空闲
/// 空闲是指自动运行状态下没有打料
///
///
public abstract bool IsIdle();
///
/// 判断多个Station的取消状态(中断点)
///
/// 如果其中一个是取消状态则返回true
public bool CheckStationsCancelled(int[] stationIds)
{
bool checkResult = false;
foreach(int stationId in stationIds)
{
checkResult |= TaskTokener.IsCancelled(stationId);
}
return checkResult;
}
///
/// 启动所有流程站点自动运行
///
public abstract void StartAll();
///
/// 启动特定的流程站点自动运行
///
///
public virtual void Start(int stationId)
{
if (!runningStations.ContainsKey(stationId))
{
ProcessStation processStation = Get(stationId);
runningStations.Add(stationId, processStation);
processStation.Start();
}
else
{
log.Warn($"Station[{stationId}] Is Actived, Start Failed");
}
}
///
/// 复位所有流程站点
///
public abstract void ResetAll();
///
/// 复位特定的流程站点
///
/// 流程站点Id
public virtual void Reset(int stationId)
{
// 如果复位异常往上抛出
Get(stationId).Reset();
Get(stationId).ResetResult = 0;
}
///
/// 停止所有站点自动运行
/// 是否有停止动作
///
public abstract void StopAll(bool hasAction = false);
///
/// 停止特定的站点自动运行
///
/// 流程站点Id
/// 是否有停止动作
public virtual void Stop(int stationId, bool hasAction = false)
{
log.Debug($"Ready Remove stationId: {stationId},Exist:{runningStations.ContainsKey(stationId)}");
runningStations.Remove(stationId);
log.Debug($"After Remove stationId: {stationId},Exist:{runningStations.ContainsKey(stationId)}");
Get(stationId).Stop(hasAction);
runningStations.Remove(stationId);
}
///
/// 暂停所有的流程站点
///
public abstract void PauseAll();
///
/// 暂停特定的流程站点
///
/// 流程站点Id
public virtual void Pause(int stationId) => Get(stationId).Pause();
///
/// 恢复所有的流程站点运行
///
public abstract void ResumeAll();
///
/// 恢复所有的流程站点状态(中断点)
///
public abstract void RestoreAll();
///
/// 恢复特定的流程站点
///
/// 流程站点Id
public virtual void Resume(int stationId) => Get(stationId).Resume();
///
/// 异常报警并暂停所有流程站点
///
/// 蜂鸣器是否开启
public abstract void AlarmPause(bool reqBuzzerOn = true);
///
/// 不暂停设备只变更状态与灯
///
/// 蜂鸣器是否开启
public abstract void AlarmOnly(bool reqBuzzerOn = true);
///
/// 关闭报警状态
///
public abstract void CloseAlarm();
}
}