using SHJX.Service.Control.Extends; namespace SHJX.Service.Control.Schedules { [EnableScheduling] public class StatusControlSchedule : IScheduler { private static TaskExtend _extend; private static IDataManager _dataManager; public StatusControlSchedule(IDataManager dataManager, TaskExtend extend) { _extend = extend; _dataManager = dataManager; } [Scheduled("ScanCache", 1000)] public void ScanCache() { if (_dataManager.Query().Where(it => it.RouteStep.Equals(PipeName.TITRATION) && it.Status.Equals(TaskState.New)).Exist(_dataManager.Query().Where(it => it.RouteID.Equals(3)).Or(it => it.RouteStep.Equals(PipeName.TITRATION_GOBACK) && it.Status.In(TaskState.New, TaskState.Waiting, TaskState.Doing), it => it.RouteStep.Equals(PipeName.TITRATION) && it.Status.In(TaskState.Waiting, TaskState.Doing)), ExistPattern.None).Any()) { return; } if (_dataManager.Query().Where(it => it.RouteStep.Equals(PipeName.TITRATION2) && it.Status.Equals(TaskState.New)).Exist(_dataManager.Query().Where(it => it.RouteID.Equals(4)).Or(it => it.RouteStep.Equals(PipeName.TITRATION2_GOBACK) && it.Status.In(TaskState.New, TaskState.Waiting, TaskState.Doing), it => it.RouteStep.Equals(PipeName.TITRATION2) && it.Status.In(TaskState.Waiting, TaskState.Doing)), ExistPattern.None).Any()) { return; } StateMachine status = _dataManager.Query().Where(item => item.Name.Equals(StateMachineName.MOTOR_LOCK)).First(); if (status is null || status.Status >= 1) { return; } List caches = _dataManager.Query().Where(it => it.Status.In(RouteCacheState.Waiting, RouteCacheState.Doing)).ToList(); if (!caches.Any() || caches.Where(item => item.Status.Equals(RouteCacheState.Doing)).Any()) { return; } RouteCache canExecute = FindWriteTask(); if (canExecute is null) { return; } canExecute.Status = RouteCacheState.Doing; _dataManager.Update(canExecute); UpdateWaitingTask(canExecute); status.Status = 1; _dataManager.Update(status); } private static void UpdateWaitingTask(RouteCache canExecute) { EquipmentTask task = _dataManager.Query().Where(it => it.SerialKey.Equals(canExecute.TaskKey) && it.Source.Equals(canExecute.Source)).First(); if (task is null) { return; } task.Status = TaskState.Doing; _dataManager.Update(task); } private static bool flag1 = false; private static RouteCache FindWriteTask() { bool aheadRes = _extend.ChangeMoveStateCheckAheadFinishDissolveTask(); if (!aheadRes) { flag1 = true; Thread.Sleep(2 * 1000); return null; } if (flag1) { flag1 = false; Thread.Sleep(1000); return null; } #region 弃用 /*List waitingCache = _dataManager.Query(@"SELECT * FROM ( SELECT RC.*,TP.Priority FROM ( SELECT OD.*,ROW_NUMBER() OVER(PARTITION BY OD.RouteType ORDER BY OD.indexId,OD.CreateTime ASC) AS orderId FROM (SELECT *,CASE RouteStep WHEN 'DissolveGoback' THEN 1 WHEN 'Goback' THEN 2 ELSE 3 END AS indexId FROM routecache) AS OD) AS RC LEFT JOIN task_priority AS TP ON RC.RouteType=TP.OperateType WHERE RC.Status='1' ORDER BY TP.Priority DESC ) AS RS WHERE RS.orderId='1'").ToList();*/ #endregion // List waitingCache = _dataManager.Query(@"SELECT * FROM ( //SELECT RC.*,TP.Priority FROM ( //SELECT *,ROW_NUMBER() OVER(PARTITION BY RouteStep ORDER BY CreateTime ASC) AS orderId FROM routecache //) RC //LEFT JOIN task_priority AS TP //ON RC.RouteStep=TP.Step //WHERE RC.Status=@Status //ORDER BY TP.Priority DESC //) AS RS //WHERE RS.orderId='1'", new { Status = RouteCacheState.Waiting }).ToList(); //List waitingCache = _dataManager.Query(@"SELECT * FROM routecache WHERE Status=@Status ORDER BY Priority DESC", new { Status = RouteCacheState.Waiting }).ToList(); //foreach (RouteCache item in from item in waitingCache let res = _extend.GetDissolveDateDifference(item) where res select item) //{ // return item; DissolveGoback //} RouteCache waitingCache = _dataManager.Query(@"SELECT * FROM routecache WHERE Status=@Status ORDER BY Priority DESC", new { Status = RouteCacheState.Waiting }).First(); if (waitingCache.RouteStep != "DissolveGoback") { if (waitingCache.RouteStep == "TitrationGoback") { EquipmentArea area = _dataManager.Query().Where(it => it.AreaName.Equals(AreaName.TITRATION_POSITION2) && it.Enable.Equals(true)).First(); if (area is null) { return waitingCache; } } if (waitingCache.RouteStep == "Titration2Goback") { EquipmentArea area2 = _dataManager.Query().Where(it => it.AreaName.Equals(AreaName.TITRATION_POSITION) && it.Enable.Equals(true)).First(); if (area2 is null) { return waitingCache; } } if (_extend.GetDissolveDateDifference(waitingCache)) { return waitingCache; } else return null; } else return waitingCache; //return null; } } }