using SHJX.Service.Control.MoveTime;
namespace SHJX.Service.Control.Extends
{
public class TaskExtend
{
private static readonly ILogger logger = LogFactory.BuildLogger(typeof(TaskExtend));
private static IDataManager _dataManager;
private static ReadConfigUtil _readConfig;
public TaskExtend(IDataManager dataManager, ReadConfigUtil readConfig)
{
_readConfig = readConfig;
_dataManager = dataManager;
}
///
/// 计算消解时间的差值
///
///
///
public bool GetDissolveDateDifference(RouteCache cache)
{
return GetDissolveDateDifference(cache.RouteStep, cache.Source);
}
///
/// 计算消解时间的差值
///
///
///
///
/// 判断是否有已到时间的任务
public bool GetDissolveDateDifference(string step, string movePoint = null)
{
if (movePoint is null)
{
return true;
}
DissolveDate dissolveDates = _dataManager.Query().Where(it => it.Start.Equals(true)).OrderBy(it => it.LastTryTime).First();
if (dissolveDates is null)
{
return true;
}
ExecuteTime dissolveExecuteTime = _dataManager.Query().Where(it => it.TypeName.Equals(ExecuteTimeName.DISSOLVE_TIME)).First();
double taskMinDate = dissolveDates.LastTryTime.GetMinDifferenceValue();
return (dissolveExecuteTime.Value - taskMinDate) * 60 > CalculatorContent.Instance.Factory(step).Calculate(movePoint);
}
public bool SearchMoveCheckAheadFinishDissolveTask()
{
return AheadFinishDissolveTask();
}
public bool ChangeMoveStateCheckAheadFinishDissolveTask()
{
return AheadFinishDissolveTask((dissolveDates) =>
{
DataCache.Instance.Set(CacheState.Early, dissolveDates.SampleSource);
logger.LogInformation($"找到需提前结束的消解任务,任务地址 --> {dissolveDates.SampleSource},{dissolveDates.PositionName}");
});
}
public bool AheadFinishDissolveTask(Action action = null)
{
DissolveDate dissolveDates = _dataManager.Query().Where(it => it.Start.Equals(true)).OrderBy(it => it.LastTryTime).First();
if (dissolveDates is null)
{
return true;
}
ExecuteTime dissolveExecuteTime = _dataManager.Query().Where(it => it.TypeName.Equals(ExecuteTimeName.DISSOLVE_TIME)).First();
#region 判断优先级
int taskSecondDate = dissolveDates.LastTryTime.GetSecondDifferenceValue();
TaskRuntime.Calculate(dissolveDates.PositionName, out double xNeedTime, out double yNeedTime, out double zNeedTime, out double zfNeedTime);
double needTime = Math.Abs(xNeedTime) + Math.Abs(yNeedTime) + Math.Abs(zNeedTime) + Math.Abs(zfNeedTime);
if (dissolveExecuteTime.Value * 60 - taskSecondDate <= needTime)
{
if (CheckRegionPositionIsEnable(AreaName.TITRATION_POSITION) && CheckRegionPositionIsEnable(AreaName.TITRATION_POSITION2))
{
return false;
}
action?.Invoke(dissolveDates);
return false;
}
return true;
#endregion
}
private bool CheckRegionPositionIsEnable(string name)
{
EquipmentArea area = _dataManager.Query().Where(it => it.AreaName.Equals(name) && it.Enable.Equals(true)).First();
if (area is null)
{
return false;
}
return true;
}
///
/// 判断消解间隔
///
///
public bool EstimatedDissolveInterval()
{
double currentIntervalValue = _dataManager.Query().First().LastTryTime.GetMinDifferenceValue();
ExecuteTime executeTime = _dataManager.Query().Where(it => it.TypeName.Equals(ExecuteTimeName.DISSOLVE_INYERVAL)).First();
return currentIntervalValue >= (executeTime?.Value);//查找间隔时间是否已经达到两分钟
}
///
/// 路由更新
///
///
public async void UpdateRoute(EquipmentTask task)
{
List routes = _dataManager.Query().Where(it => it.TaskType.Equals(task.RouteType)).ToList();
Route currentRoute = routes.FirstOrDefault(it => it.RouteID.Equals(task.RouteID));
int nextId = currentRoute.RouteID + 1;
//if (currentRoute.RouteID == 2)
//{
// CheckRegionPositionIsEnable(AreaName.TITRATION_POSITION, out EquipmentArea area);
// CheckRegionPositionIsEnable(AreaName.ADD_LIQUID_POSITION, out EquipmentArea area2);
// if (area?.PointName == null && area2==null)
// {
// nextId = currentRoute.RouteID + 2;
// }
//}
Route nextRoute = routes.FirstOrDefault(it => it.RouteID.Equals(nextId));
if ((currentRoute.RouteID == 4 ) || (currentRoute.RouteID == 3))
{
task.Status = TaskState.Finished;
_dataManager.Update(task);
SampleDetail sampleDetail = _dataManager.Query().Where(it => it.NodeName.Equals(task.Source)).First();
if (sampleDetail is not null)
{
sampleDetail.TaskStatus = DetailState.Init;
_dataManager.Update(sampleDetail);
}
Messager.Send("TaskFinish", task.Source);
List residueTask = _dataManager.Query().Where(it => it.Status.In
(
TaskState.New, TaskState.Waiting, TaskState.Doing, TaskState.Hit,
TaskState.AddLiquid, TaskState.Dissolve, TaskState.Titration, TaskState.Titration2, TaskState.Execute
)).ToList();
if (!residueTask.Any())
{
var temp = _readConfig.TaskFinishTemperatureSetting;
bool tempRes = EquipmentNames.DissolveHeating.WriteTemperature(temp);
tempRes = tempRes && EquipmentNames.TitrationHeating.WriteTemperature(temp);
logger.LogDebug($"任务结束,自动设置降温{(tempRes ? "成功" : "失败")}");
bool res = true;
foreach (string item in new string[] { EquipmentNames.AxisZ, EquipmentNames.AxisX, EquipmentNames.AxisY, EquipmentNames.AxisD})
{
res = res && await Task.Run(() => ExecuteCommand.MotorGoBackExecute(item));
}
logger.LogDebug($"任务结束,没有后续任务,自动返回原点{(res ? "成功" : "失败")}");
Messager.Send("AllTaskFinish");
}
return;
}
RouteStep executeStep = _dataManager.Query().Where(it => it.RouteID.Equals(nextRoute.RouteID)).OrderBy(it => it.Order).First();
task.RouteID = nextRoute.RouteID;
task.Status = TaskState.New;
task.RouteStep = executeStep.Step;
_dataManager.Update(task);
}
///
/// 步骤更新
///
///
public void UpdateStep(EquipmentTask task)
{
try
{
List steps = _dataManager.Query().Where(it => it.RouteID.Equals(task.RouteID)).ToList();
RouteStep currentStep = steps.FirstOrDefault(it => it.Step.Equals(task.RouteStep));
int nextOrder = currentStep.Order + 1;
RouteStep nextStep = steps.FirstOrDefault(it => it.Order.Equals(nextOrder));
if (nextStep is null)
{
UpdateRoute(task);
return;
}
task.Status = TaskState.New;
task.RouteStep = nextStep.Step;
_dataManager.Update(task);
}
catch (Exception ex)
{
logger.LogError(ex.ToString());
}
}
}
}