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));
                    }
                }
            }
Ejemplo n.º 2
0
            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);
        }