using SHJX.Service.Control.Extends; namespace SHJX.Service.Control.Pipeline.Nodes.InterceptorNodes { public class AddLiquidInterceptor : INode { #region Fields private static TaskExtend _taskExtend; private static IDataManager _dataManager; #endregion public AddLiquidInterceptor(TaskExtend taskExtend, IDataManager dataManager) { Name = nameof(AddLiquidInterceptor); _taskExtend = taskExtend; _dataManager = dataManager; } public override INode Invoke() { return this; } public override void Next() { bool vitriolEnable = true; bool sodiumHydroxideEnable = true; bool potassiumPermanganateEnable = true; LiquidVolume vitriolLiquid = _dataManager.Query().Where(it => it.LiquidName.Equals(EquipmentNames.AddLiquidVitriol)).First(); if (vitriolLiquid is not null) { vitriolEnable = vitriolLiquid.Enable;//加液位硫酸 } LiquidVolume sodiumHydroxideLiquid = _dataManager.Query().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium1Hydroxide)).First(); if (sodiumHydroxideLiquid is not null) { sodiumHydroxideEnable = sodiumHydroxideLiquid.Enable;//氢氧化钠 } LiquidVolume potassiumPermanganateLiquid = _dataManager.Query().Where(it => it.LiquidName.Equals(EquipmentNames.Titration2PotassiumPermanganate)).First(); if (potassiumPermanganateLiquid is not null) { potassiumPermanganateEnable = potassiumPermanganateLiquid.Enable;//加液位高锰酸钾 } if (!(vitriolEnable || sodiumHydroxideEnable || potassiumPermanganateEnable)) { ReleaseAxis(); ReleaseArea(); _taskExtend.UpdateRoute(CurrentTask); return; } NextNode?.SetTask(CurrentTask)?.Invoke()?.Record()?.Next(); } private void ReleaseArea() { List areas = _dataManager.Query().Where(it => it.PointName.In(CurrentTask.To, CurrentTask.From)).ToList(); areas.ForEach(area => { area.Enable = true; _dataManager.Update(area); }); List positions = _dataManager.Query().Where(it => it.PositionName.In(CurrentTask.To, CurrentTask.From)).ToList(); positions.ForEach(position => { position.CurrentOccupy = string.Empty; position.Enable = true; _dataManager.Update(position); }); } private void ReleaseAxis() { List caches = _dataManager.Query().Where(it => it.Source.Equals(CurrentTask.Source)).ToList(); if (caches.Any()) { if (caches.Count == 1) { _dataManager.Delete(caches.FirstOrDefault()); } else { foreach (RouteCache cache in caches) { if (cache.RouteStep != CurrentTask.RouteStep) { _dataManager.Delete(cache); } } } } _dataManager.Update().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.MOTOR_LOCK)); } } }