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