public IEnumerable <EntityWorkflowStageChange> GetStageChanges(EntityWorkflow workflow, Entity entity, IEnumerable <WorkflowStageChangeData> dataList) { if (HistoryConfiguration == null || !GetEntityStageId(entity, null, out _)) { yield break; } EntitySet historySet = entity.Connection.GetEntitySet(HistoryConfiguration.EntitySetGuid)?.CreateEntitySet(); if (historySet != null) { EntityLoadParameters loadParameters = new EntityLoadParameters(historySet); if (HistoryConfiguration.ResponsibleLinkGuid != Guid.Empty) { loadParameters.AddLink(HistoryConfiguration.ResponsibleLinkGuid); } loadParameters.Filter = new EntitySetFilter(historySet.GetInfo()); loadParameters.Filter.And(HistoryConfiguration.OwnerLinkGuid, "=", entity.Guid); if (HistoryConfiguration.EntityTypeGuid != Guid.Empty) { loadParameters.Filter.And(SystemPropertyItem.Type, "=", HistoryConfiguration.EntityTypeGuid); } IEntityCollection <Entity> historyItems = historySet.GetEntities(loadParameters); EntityCollection <LinkEntity> responsibleLinks = HistoryConfiguration.ResponsibleLinkGuid != Guid.Empty ? historyItems.GetLinks(HistoryConfiguration.ResponsibleLinkGuid) : null; foreach (Entity historyItem in historyItems) { EntityWorkflowStage stage = workflow.GetStage(historyItem[HistoryConfiguration.StagePropertyGuid]); Guid userGuid = responsibleLinks == null ? historyItem.CreatedBy : (responsibleLinks.FindOne <Entity>(historyItem.Guid)?.Guid ?? Guid.Empty); DateTime changeTime = HistoryConfiguration.DateTimePropertyGuid == Guid.Empty ? historyItem.Created.GetValueOrDefault() : (DateTime)historyItem[HistoryConfiguration.DateTimePropertyGuid]; string comment = HistoryConfiguration.CommentPropertyGuid == Guid.Empty ? string.Empty : (historyItem[HistoryConfiguration.CommentPropertyGuid]?.ToString() ?? string.Empty); yield return(new EntityWorkflowStageChange(workflow, stage, null, userGuid, changeTime, historyItem.Name, comment)); } } }
public EntityWorkflowTransition CreateTransition(EntityWorkflow workflow, WorkflowProvider workflowProvider, Dictionary <object, List <EntityWorkflowTransition> > transitionsTo, Dictionary <object, List <EntityWorkflowTransition> > transitionsFrom) { if (_toStage == null) { throw new ModelException(ErrorLevel.Warning, "Не указана стадия для перехода"); } TransitionProvider transitionProvider = new TransitionProvider { Workflow = workflowProvider, FromStageIds = new HashSet <object>(_fromStages.Select(s => s.StageId)), ToStage = (StageProvider)workflow.GetStage(_toStage.StageId).Provider, CommandText = _commandText, IconImageGuid = _iconImageGuid.GetValueOrDefault(), IconImageColor = _iconImageColor, CommandPlacement = _commandPlacement, MultipleSelectionEnabled = _multipleSelectionEnabled, Roles = _roles ?? new IEntityWorkflowRole[0], ConfirmationTextProvider = _confirmationTextProvider, InputFormGenerate = _inputFormGenerate, CanExecute = _canExecute, Validators = _validators, OnChanging = _onChanging, OnChangingAsync = _onChangingAsync, OnChanged = _onChanged, OnLog = _onLog }; EntityWorkflowTransition result = new EntityWorkflowTransition(workflow, transitionProvider); transitionsTo[_toStage.StageId].Add(result); foreach (IEntityWorkflowStage stage in _fromStages) { transitionsFrom[stage.StageId].Add(result); } return(result); }
public EntityWorkflow CreateWorkflow() { WorkflowProvider workflowProvider = new WorkflowProvider { Guid = _guid, Name = _name, PropertyName = _propertyName, EntitySet = _entitySet, StageListGuid = _stageListGuid, StagePropertyGuid = _stagePropertyGuid, Types = _types.ToArray(), ShowInLinks = new HashSet <Guid>(_showInLinks), HistoryConfiguration = _historyCofiguration }; EntityWorkflow result = new EntityWorkflow(workflowProvider); ValueList valueList; if (_stageListGuid == Guid.Empty) { EntitySetScheme scheme = _entitySet.GetScheme(); if (_types.Count == 0) { valueList = (scheme.Properties.Find(_stagePropertyGuid)?.Format as ValueListPropertyFormat)?.ValueList?.GetList(); } else { EntityType type = _types.SelectMany(t => t.GetTypes(scheme.Types)).FirstOrDefault(); valueList = (type?.Properties.Find(_stagePropertyGuid)?.Format as ValueListPropertyFormat)?.ValueList?.GetList(); } } else { valueList = ValueList.GetValueList(_entitySet.Connection, _stageListGuid); if (valueList == null) { throw new ModelException(ErrorLevel.Warning, "Не найден список значений {0}", _stageListGuid); } } ILookup <object, ValueListItem> items = valueList?.ToLookup(i => i.WorkflowValue); List <EntityWorkflowStage> stages = new List <EntityWorkflowStage>(); foreach (KeyValuePair <object, IEntityWorkflowStage> source in _stages) { StageProvider stageProvider = new StageProvider { Id = source.Key, Item = items?[source.Key].FirstOrDefault() }; stages.Add(new EntityWorkflowStage(result, stageProvider)); } result.Stages = stages; Dictionary <object, List <EntityWorkflowTransition> > transitionsTo = stages.ToDictionary(s => s.Id, s => new List <EntityWorkflowTransition>()); Dictionary <object, List <EntityWorkflowTransition> > transitionsFrom = stages.ToDictionary(s => s.Id, s => new List <EntityWorkflowTransition>()); result.Transitions = _transitions.OfType <TransitionInfo>().Select( t => t.CreateTransition(result, workflowProvider, transitionsTo, transitionsFrom)).ToList(); foreach (EntityWorkflowStage stage in stages) { stage.SetTransitionsTo(transitionsTo[stage.Id]); stage.SetTransitionsFrom(transitionsFrom[stage.Id]); } return(result); }