protected override async Task Execute(CancellationToken token) { try { var currentDateTime = DateTime.UtcNow; var humanTaskInstanceLst = await _humanTaskInstanceQueryRepository.GetPendingDeadLines(token, currentDateTime); foreach (var humanTaskInstance in humanTaskInstanceLst) { var deadLines = humanTaskInstance.DeadLines.Where(d => currentDateTime >= d.EndDateTime); var executionContext = new BaseExpressionContext(humanTaskInstance.InputParameters); var deadLineIds = deadLines.Select(_ => _.Id).ToList(); foreach (var id in deadLineIds) { var deadLine = deadLines.First(_ => _.Id == id); if (deadLine.Escalations != null && deadLine.Escalations.Any()) { foreach (var escalation in deadLine.Escalations) { if (!string.IsNullOrWhiteSpace(escalation.Condition) && !ExpressionParser.IsValid(escalation.Condition, executionContext)) { continue; } if (!string.IsNullOrWhiteSpace(escalation.NotificationId)) { var parameters = _parameterParser.ParseToPartParameters(escalation.ToParts, humanTaskInstance.InputParameters); await _mediator.Send(new CreateNotificationInstanceCommand { NotificationId = escalation.NotificationId, Parameters = parameters }, token); } } } humanTaskInstance.RemoveDeadLine(deadLine.Name, deadLine.Usage); } await _humanTaskInstanceCommandRepository.Update(humanTaskInstance, token); } await _humanTaskInstanceCommandRepository.SaveChanges(token); } catch (Exception) { } }
public virtual DateTime?Evaluate(HumanTaskDefinitionDeadLine deadLine, BaseExpressionContext expressionContext) { DateTime?nextUTC = null; if (!string.IsNullOrWhiteSpace(deadLine.Until)) { var interval = ISO8601Parser.ParseTimeInterval(deadLine.Until); if (interval != null) { nextUTC = interval.EndDateTime; } } if (nextUTC == null && !string.IsNullOrWhiteSpace(deadLine.For)) { nextUTC = ExpressionParser.GetDateTime(deadLine.For, expressionContext); } return(nextUTC); }
public virtual ICollection <HumanTaskInstanceDeadLine> Evaluate(ICollection <HumanTaskDefinitionDeadLine> deadLines, Dictionary <string, string> parameters) { var expressionContext = new BaseExpressionContext(parameters); var result = new List <HumanTaskInstanceDeadLine>(); foreach (var deadLine in deadLines) { var nextUTC = Evaluate(deadLine, expressionContext); if (nextUTC != null) { result.Add(new HumanTaskInstanceDeadLine { EndDateTime = nextUTC.Value, Name = deadLine.Name, Usage = deadLine.Usage, Escalations = deadLine.Escalations }); } } return(result); }