Esempio n. 1
0
        private IUserInfo GetUser(IExecutionEntity execution, string authenticatedUserId)
        {
            IUserInfo         starter;
            IUserServiceProxy userService = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();

            try
            {
                starter = userService.GetUser(authenticatedUserId)
                          .ConfigureAwait(false)
                          .GetAwaiter()
                          .GetResult();
                starter.TenantId = execution.TenantId;
            }
            catch (Exception ex)
            {
                logger.LogError(ex, ex.Message);
                starter = new UserInfo
                {
                    Id       = execution.StartUserId,
                    FullName = execution.StartUserId,
                    TenantId = execution.TenantId
                };
            }

            return(starter);
        }
Esempio n. 2
0
        /// <summary>
        /// Cache which has a hard limit: no more elements will be cached than the limit. </summary>
        public ProcessDefinitionInfoCache(ICommandExecutor commandExecutor, int limit)
        {
            this.commandExecutor = commandExecutor;
            sizeLimit            = limit;

            cache = ProcessEngineServiceProvider.Resolve <MemoryCacheProvider>().Create(limit);
        }
Esempio n. 3
0
        /// <summary>
        /// 侦听接收通知处理
        /// </summary>
        /// <param name="execution"></param>
        public void Notify(IExecutionEntity execution)
        {
            if (execution.CurrentFlowElement is UserTask userTask && userTask.HasMultiInstanceLoopCharacteristics())
            {
                var varName = userTask.LoopCharacteristics.GetCollectionVarName();

                if (execution.GetVariable(varName) == null)
                {
                    List <IUserInfo> users         = new List <IUserInfo>();
                    string           getUserPolicy = userTask.GetUsersPolicy();
                    if (string.IsNullOrWhiteSpace(getUserPolicy) == false)
                    {
                        QueryBookmark[] actors = JsonConvert.DeserializeObject <QueryBookmark[]>(getUserPolicy);

                        IGetBookmarkRuleProvider ruleProvider = ProcessEngineServiceProvider.Resolve <IGetBookmarkRuleProvider>();

                        foreach (QueryBookmark query in actors)
                        {
                            IGetBookmarkRule rule = ruleProvider.CreateBookmarkRule(query.RuleType.ToString());
                            rule.Execution = execution;
                            rule.Condition = query;
                            users.AddRange(Context.ProcessEngineConfiguration.CommandExecutor.Execute(rule));
                        }
                    }

                    //if (users.Count == 0)
                    //{
                    //    throw new NoneCountersignUsersException(execution.CurrentFlowElement.Name);
                    //}

                    execution.SetVariable(varName, users.Count == 0 ? new string[] { "" } : users.Select(x => x.Id).Distinct().ToArray());
                }
            }
        }
        public void Notify(IDelegateTask task)
        {
            string assignee = task.Assignee;

            if (string.IsNullOrWhiteSpace(assignee))
            {
                return;
            }

            IUserInfo user = task.GetVariableLocal <IUserInfo>($"{assignee}");

            if (!(user is null) && user.Id == assignee)
            {
                return;
            }

            IUserServiceProxy userService = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();

            user = AsyncHelper.RunSync(() => userService.GetUser(assignee));
            if (user == null)
            {
                logger.LogError($"找不到执行人{assignee}");
            }
            else
            {
                user.TenantId     = task.TenantId;
                task.AssigneeUser = user.FullName;
            }

            task.SetVariableLocal($"{assignee}", user);
        }
Esempio n. 5
0
        /// <inheritdoc />
        public override IList <IUserInfo> Execute(ICommandContext commandContext)
        {
            IUserServiceProxy proxy = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();

            string id = Condition.QueryCondition.FirstOrDefault().Id;

            string[] users      = null;
            var      hisService = commandContext.ProcessEngineConfiguration.HistoryService;

            if (string.IsNullOrWhiteSpace(id))
            {
                var uid = hisService.CreateHistoricProcessInstanceQuery()
                          .SetProcessInstanceId(this.Execution.ProcessInstanceId)
                          .SingleResult().StartUserId;
                users = new string[] { uid };
            }
            else
            {
                users = hisService.CreateHistoricTaskInstanceQuery()
                        .SetProcessInstanceId(this.Execution.ProcessInstanceId)
                        .SetTaskDefinitionKey(id)
                        .List()
                        .Select(x => x.Assignee)
                        .ToArray();
            }

            return(proxy.GetUsers(externalConnector.GetUserByDirectReporter, new RequestUserParameter
            {
                IdList = users,
                Category = RequestUserCategory.GETUSER_DIRECTREPOT
            }).ConfigureAwait(false).GetAwaiter().GetResult());
        }
        private object GetValue(ELContext context, IVariableScope variableScope)
        {
            string expstr = ExpressionString;

            if ((VariableScopeElResolver.EXECUTION_KEY.Equals(expstr) && variableScope is IExecutionEntity) || (VariableScopeElResolver.TASK_KEY.Equals(expstr) && variableScope is ITaskEntity))
            {
                context.IsPropertyResolved = true;
                return(variableScope);
            }
            else if (VariableScopeElResolver.EXECUTION_KEY.Equals(expstr) && variableScope is ITaskEntity entity)
            {
                context.IsPropertyResolved = true;
                return(entity.Execution);
            }
            else if (VariableScopeElResolver.LOGGED_IN_USER_KEY.Equals(expstr))
            {
                context.IsPropertyResolved = true;
                return(Authentication.AuthenticatedUser.Id);
            }

            IScriptingEnginesProvider scriptingEnginesProvider = ProcessEngineServiceProvider.Resolve <IScriptingEnginesProvider>();
            IScriptingEngines         scriptingEngines         = scriptingEnginesProvider.Create(language);

            var execution = variableScope is ITaskEntity te ? te.Execution : variableScope as IExecutionEntity;

            return(scriptingEngines.Evaluate(expstr, execution));
        }
        public static void WriteDebugLog(this IExecutionEntity execution)
        {
            string doc = execution.CurrentFlowElement.Documentation;

            if (string.IsNullOrWhiteSpace(doc) == false && Context.ProcessEngineConfiguration.EnableVerboseExecutionTreeLogging)
            {
                string root = AppDomain.CurrentDomain.BaseDirectory;
                string file = Path.Combine(new string[] { root, "task_logs", $"{DateTime.Now:yyyyMMdd}.txt" });
                Directory.CreateDirectory(Path.GetDirectoryName(file));

                IExpression expression = Context.ProcessEngineConfiguration.ExpressionManager.CreateExpression(doc);

                doc = expression.GetValue(execution)?.ToString();

                string log = $"{(File.Exists(file) ? "\r\n" : "")}Task '{execution.ActivityId}' debug_logger {DateTime.Now:yyyy-MM-dd HH:mm:ss}:{doc}";

                File.AppendAllText(file, log);

                ILogger logger = ProcessEngineServiceProvider.Resolve <ILoggerFactory>().CreateLogger(execution.GetType());

                if (logger.IsEnabled(LogLevel.Information))
                {
                    logger.LogInformation(log);
                }
            }
        }
Esempio n. 8
0
        /// <summary>
        /// Cache which has a hard limit: no more elements will be cached than the limit.
        /// </summary>
        public DefaultDeploymentCache(int limit)
        {
            this.sizeLimit = limit;

            memoryCacheProvider = ProcessEngineServiceProvider.Resolve <MemoryCacheProvider>();

            cache = memoryCacheProvider.Create(limit);
        }
Esempio n. 9
0
        public AddCountersignCmd(string taskId, string[] assignees, string tenantId)
        {
            this.taskId    = taskId;
            this.assignees = assignees;
            this.tenantId  = tenantId;

            userService = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();
        }
        /// <inheritdoc />
        public override IList <IUserInfo> Execute(ICommandContext commandContext)
        {
            IUserServiceProxy proxy = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();

            return(AsyncHelper.RunSync(() => proxy.GetUsers(externalConnector.GetUserByDeptLeader, new
            {
                idList = Condition.QueryCondition.Select(x => x.Id).ToArray()
            })));
        }
Esempio n. 11
0
 public AddIdentityLinkCmd(string taskId, string identityId, int identityIdType, string identityType) : base(taskId)
 {
     ValidateParams(taskId, identityId, identityIdType, identityType);
     this.taskId         = taskId;
     this.identityId     = identityId;
     this.identityIdType = identityIdType;
     this.identityType   = identityType;
     userService         = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();
 }
Esempio n. 12
0
        /// <inheritdoc />
        public override IList <IUserInfo> Execute(ICommandContext commandContext)
        {
            IUserServiceProxy proxy = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();

            return(proxy.GetUsers(externalConnector.GetUserByDuty, new RequestUserParameter
            {
                IdList = Condition.QueryCondition.Select(x => x.Id).ToArray(),
                Category = RequestUserCategory.GETUSERS_DUTY
            }).ConfigureAwait(false).GetAwaiter().GetResult());
        }
Esempio n. 13
0
 public CreateNewSubtaskCmd(string taskName, string description, DateTime?dueDate, int?priority, string parentTaskId, string assignee, string tenantId)
 {
     this.taskName     = taskName;
     this.description  = description;
     this.dueDate      = dueDate;
     this.parentTaskId = parentTaskId;
     this.priority     = priority;
     this.assignee     = assignee;
     this.tenantId     = tenantId;
     this.userService  = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();
 }
Esempio n. 14
0
        private async Task SendMessageAsync(IExecutionEntity execution, string msg, string msgServiceUrl)
        {
            var httpProxy = ProcessEngineServiceProvider.Resolve <IServiceWebApiHttpProxy>();

            HttpResponseMessage response = await httpProxy.PostAsync <HttpResponseMessage>(msgServiceUrl, new
            {
                MessageId = msg,
                execution.BusinessKey
            }, CancellationToken.None).ConfigureAwait(false);

            response.EnsureSuccessStatusCode();
        }
Esempio n. 15
0
        private IProcessEngine BuildProcessEngine()
        {
            try
            {
                ProcessEngineConfiguration engineConfig = ProcessEngineServiceProvider.Resolve <ProcessEngineConfiguration>();

                return(engineConfig.BuildProcessEngine());
            }
            catch (Exception ex)
            {
                log.LogError(ex, $"buld process engine failed.{ex.Message}");
                throw ex;
            }
        }
        /// <summary>
        /// 侦听接收通知处理
        /// </summary>
        /// <param name="execution"></param>
        public void Notify(IExecutionEntity execution)
        {
            if (execution.CurrentFlowElement is UserTask userTask && userTask.HasMultiInstanceLoopCharacteristics())
            {
                var varName = userTask.LoopCharacteristics.GetCollectionVarName();

                if (execution.GetVariable(varName) == null)
                {
                    List <IUserInfo> users         = new List <IUserInfo>();
                    string           getUserPolicy = userTask.GetUsersPolicy();
                    if (string.IsNullOrWhiteSpace(getUserPolicy) == false)
                    {
                        if (EXPR_PATTERN.IsMatch(getUserPolicy))
                        {
                            getUserPolicy = EXPR_PATTERN.Replace(getUserPolicy, (m) =>
                            {
                                var value     = m.Groups[1].Value;
                                var variables = execution.Variables;
                                object roles  = ExpressionManager.GetValue(variables, value, variables);
                                return(roles.ToString());
                            });
                        }

                        QueryBookmark[] actors = JsonConvert.DeserializeObject <QueryBookmark[]>(getUserPolicy);

                        IGetBookmarkRuleProvider ruleProvider = ProcessEngineServiceProvider.Resolve <IGetBookmarkRuleProvider>();

                        foreach (QueryBookmark query in actors)
                        {
                            IGetBookmarkRule rule = ruleProvider.CreateBookmarkRule(query.RuleType.ToString());
                            rule.Execution = execution;
                            rule.Condition = query;
                            var us = Context.ProcessEngineConfiguration.CommandExecutor.Execute(rule);
                            users.AddRange(us);
                        }
                    }

                    if (users.Count == 0)
                    {
                        users.Add(Authentication.AuthenticatedUser);
                        logger.LogWarning($"调用查询人员服务失败,分组没有人,重新指到当前提交人,Duty={getUserPolicy}");
                        //throw new NoneCountersignUsersException(execution.CurrentFlowElement.Name);
                    }

                    execution.SetVariable(varName, users.Count == 0 ? new string[] { "" } : users.Select(x => x.Id).Distinct().ToArray());
                }
            }
        }
Esempio n. 17
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sequenceFlowId"></param>
        /// <param name="execution"></param>
        /// <returns></returns>
        public virtual bool Evaluate(string sequenceFlowId, IExecutionEntity execution)
        {
            IScriptingEnginesProvider scriptingEnginesProvider = ProcessEngineServiceProvider.Resolve <IScriptingEnginesProvider>();
            IScriptingEngines         scriptingEngines         = scriptingEnginesProvider.Create(language);

            object result = scriptingEngines.Evaluate(expression, execution);

            if (result is null)
            {
                throw new ActivitiException("condition script returns null: " + expression);
            }
            if (!(result is bool))
            {
                throw new ActivitiException("condition script returns non-Boolean: " + result + " (" + result.GetType().FullName + ")");
            }
            return(Convert.ToBoolean(result));
        }
        public override void Execute(IExecutionEntity execution)
        {
            execution.CurrentFlowElement.ExtensionElements.TryGetValue(BpmnXMLConstants.ELEMENT_EXTENSIONS_PROPERTY,
                                                                       out IList <ExtensionElement> pElements);

            if (pElements != null)
            {
                try
                {
                    WebApiParameter parameter = new WebApiParameter(execution, pElements);
                    string          url       = parameter.Url;
                    string          dataObj   = parameter.VariableName;
                    string          method    = parameter.Method;

                    var httpProxy = ProcessEngineServiceProvider.Resolve <IServiceWebApiHttpProxy>();

                    HttpContext httpContext = ProcessEngineServiceProvider.Resolve <IHttpContextAccessor>()?.HttpContext;

                    if (httpContext == null)
                    {
                        IAccessTokenProvider accessTokenProvider = ProcessEngineServiceProvider.Resolve <IAccessTokenProvider>();

                        accessTokenProvider.SetHttpClientRequestAccessToken(httpProxy.HttpClient, null, execution.TenantId);
                    }

                    switch (method?.ToLower())
                    {
                    default:
                    case "get":
                        ExecuteGet(execution, url, parameter.Request, dataObj, httpProxy);
                        break;

                    case "post":
                        ExecutePost(execution, url, parameter.Request, dataObj, httpProxy);
                        break;
                    }

                    Leave(execution);
                }
                catch (Exception ex)
                {
                    throw new BpmnError(Context.CommandContext.ProcessEngineConfiguration.WebApiErrorCode, ex.Message);
                }
            }
        }
Esempio n. 19
0
        /// <summary>
        ///
        /// </summary>
        public void EnsureInitialized()
        {
            var ctx = Context.CommandContext;

            if (id != null && entity == null)
            {
                if (ctx == null)
                {
                    if (!(ProcessEngineServiceProvider.Resolve <IProcessEngine>().ProcessEngineConfiguration is ProcessEngineConfigurationImpl pi))
                    {
                        return;
                    }

                    ctx = pi.CommandContextFactory.CreateCommandContext(new ByteArrayRefCmd(id));
                    Context.CommandContext = ctx;
                }

                entity = ctx.ByteArrayEntityManager.FindById <IByteArrayEntity>(new KeyValuePair <string, object>("id", id));
                name   = entity.Name;
            }
        }
        public void Notify(IDelegateTask task)
        {
            string assignee = task.Assignee;

            if (string.IsNullOrWhiteSpace(assignee))
            {
                return;
            }

            IUserInfo user;

            if (task.HasVariableLocal(assignee))
            {
                user = task.GetVariableLocal <IUserInfo>(assignee);
                if (user is object && string.Equals(user.Id, assignee, StringComparison.OrdinalIgnoreCase))
                {
                    return;
                }
            }

            IUserServiceProxy userService = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();

            user = userService.GetUser(assignee)
                   .ConfigureAwait(false)
                   .GetAwaiter()
                   .GetResult();
            if (user == null)
            {
                logger.LogError($"找不到执行人{assignee}");
            }
            else
            {
                user.TenantId     = task.TenantId;
                task.AssigneeUser = user.FullName;
            }

            task.SetVariableLocal($"{assignee}", user);
        }
        /// <inheritdoc />
        public override IList <IUserInfo> Execute(ICommandContext commandContext)
        {
            IList <IHistoricTaskInstance> hisTasks = commandContext.ProcessEngineConfiguration.HistoryService
                                                     .CreateHistoricTaskInstanceQuery()
                                                     .SetExecutionId(this.Execution.Id)
                                                     .List();

            IList <IUserInfo> users = hisTasks.Where(x => Condition.QueryCondition.Any(y => y.Id == x.TaskDefinitionKey))
                                      .Select(x => new UserInfo
            {
                Id = x.Assignee
            })
                                      .ToList <IUserInfo>();

            if (Condition.QueryCondition.Any(x => string.Equals("", x.Id)))
            {
                var hisInst = commandContext.ProcessEngineConfiguration.HistoryService
                              .CreateHistoricProcessInstanceQuery()
                              .SetProcessInstanceId(this.Execution.ProcessInstanceId)
                              .SingleResult();

                string uid = hisInst == null ? this.Execution.Parent.StartUserId : hisInst.StartUserId;
                users.Add(new UserInfo
                {
                    Id = uid
                });
            }

            IUserServiceProxy proxy = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();

            return(proxy.GetUsers(externalConnector.GetUser, new RequestUserParameter
            {
                IdList = users.Select(x => x.Id).ToArray(),
                Category = RequestUserCategory.GETUSER_EXECUTOR
            }).ConfigureAwait(false).GetAwaiter().GetResult());
        }
Esempio n. 22
0
        public virtual TableMetaData GetTableMetaData(string tableName)
        {
            TableMetaData result = new TableMetaData();

            try
            {
                result.TableName = tableName;
                //DatabaseMetaData metaData = DbSqlSession.SqlSession.Connection.MetaData;

                if ("postgres".Equals(DbSqlSession.DbSqlSessionFactory.DatabaseType))
                {
                    tableName = tableName.ToLower();
                }

                string catalog = null;
                if (ProcessEngineConfiguration.DatabaseCatalog is object && ProcessEngineConfiguration.DatabaseCatalog.Length > 0)
                {
                    catalog = ProcessEngineConfiguration.DatabaseCatalog;
                }

                string schema = null;
                if (ProcessEngineConfiguration.DatabaseSchema is object && ProcessEngineConfiguration.DatabaseSchema.Length > 0)
                {
                    if ("oracle".Equals(DbSqlSession.DbSqlSessionFactory.DatabaseType))
                    {
                        schema = ProcessEngineConfiguration.DatabaseSchema.ToUpper();
                    }
                    else
                    {
                        schema = ProcessEngineConfiguration.DatabaseSchema;
                    }
                }

                var dbreader = ProcessEngineServiceProvider.Resolve <IDatabaseReader>();

                DatabaseTable table = dbreader.AllTables().FirstOrDefault(x => string.Compare(tableName, x.Name, true) == 0) ?? new DatabaseTable();

                foreach (var col in table.Columns)
                {
                    //bool wrongSchema = false;
                    //if (!string.ReferenceEquals(schema, null) && schema.Length > 0)
                    //{
                    //    string columnName = col.Name;
                    //    if ("TABLE_SCHEM".Equals(columnName, StringComparison.CurrentCultureIgnoreCase) || "TABLE_SCHEMA".Equals(columnName, StringComparison.CurrentCultureIgnoreCase))
                    //    {
                    //        if (!schema.Equals(resultSet.getString(resultSet.MetaData.getColumnName(i + 1)), StringComparison.CurrentCultureIgnoreCase))
                    //        {
                    //            wrongSchema = true;
                    //        }
                    //        break;
                    //    }
                    //}

                    //if (!wrongSchema)
                    //{
                    string name = col.Name.ToUpper();
                    string type = col.DbDataType.ToUpper();// resultSet.getString("TYPE_NAME").ToUpper();
                    result.addColumnMetaData(name, type);
                    //}
                }
            }
            catch (Exception e)
            {
                throw new ActivitiException("Could not retrieve database metadata: " + e.Message);
            }

            if (result.ColumnNames.Count == 0)
            {
                // According to API, when a table doesn't exist, null should be returned
                result = null;
            }
            return(result);
        }
Esempio n. 23
0
        public static string Url(string url)
        {
            ExternalConnectorProvider provider = ProcessEngineServiceProvider.Resolve <ExternalConnectorProvider>();

            return(provider.ResolveUrl(url));
        }
Esempio n. 24
0
 public SendTaskActivityBehavior()
 {
     externalConnector = ProcessEngineServiceProvider.Resolve <ExternalConnectorProvider>();
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="taskEntityManager"></param>
        /// <param name="assignee"></param>
        /// <param name="owner"></param>
        /// <param name="candidateUsers"></param>
        /// <param name="candidateGroups"></param>
        /// <param name="task"></param>
        /// <param name="expressionManager"></param>
        /// <param name="execution"></param>
        protected internal virtual void HandleAssignments(ITaskEntityManager taskEntityManager, string assignee, string owner, IList <string> candidateUsers, IList <string> candidateGroups, ITaskEntity task, ExpressionManager expressionManager, IExecutionEntity execution)
        {
            if (!string.IsNullOrWhiteSpace(assignee))
            {
                object assigneeExpressionValue = expressionManager.CreateExpression(assignee).GetValue(execution);
                string assigneeValue           = null;
                if (assigneeExpressionValue != null)
                {
                    assigneeValue = assigneeExpressionValue.ToString();
                }
                string assigneeUser = null;

                if (string.IsNullOrWhiteSpace(assigneeValue) == false)
                {
                    IUserServiceProxy userService = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();

                    var user = userService.GetUser(assigneeValue)
                               .ConfigureAwait(false)
                               .GetAwaiter()
                               .GetResult();

                    assigneeUser = user?.FullName;

                    task.SetVariableLocal(assigneeValue, user);
                }
                taskEntityManager.ChangeTaskAssigneeNoEvents(task, assigneeValue, assigneeUser);
            }

            if (!string.IsNullOrWhiteSpace(owner))
            {
                object ownerExpressionValue = expressionManager.CreateExpression(owner).GetValue(execution);
                string ownerValue           = null;
                if (ownerExpressionValue != null)
                {
                    ownerValue = ownerExpressionValue.ToString();
                }

                taskEntityManager.ChangeTaskOwner(task, ownerValue);
            }

            if (candidateGroups != null && candidateGroups.Count > 0)
            {
                foreach (string candidateGroup in candidateGroups)
                {
                    IExpression groupIdExpr = expressionManager.CreateExpression(candidateGroup);
                    object      value       = groupIdExpr.GetValue(execution);
                    if (value is string @string)
                    {
                        IList <string> candidates = ExtractCandidates(@string);
                        task.AddCandidateGroups(candidates);
                    }
                    else if (value is ICollection)
                    {
                        task.AddCandidateGroups((ICollection <string>)value);
                    }
                    else
                    {
                        throw new ActivitiIllegalArgumentException("Expression did not resolve to a string or collection of strings");
                    }
                }
            }

            if (candidateUsers != null && candidateUsers.Count > 0)
            {
                foreach (string candidateUser in candidateUsers)
                {
                    IExpression userIdExpr = expressionManager.CreateExpression(candidateUser);
                    object      value      = userIdExpr.GetValue(execution);
                    if (value is string @string)
                    {
                        IList <string> candidates = ExtractCandidates(@string);
                        task.AddCandidateUsers(candidates);
                    }
                    else if (value is ICollection)
                    {
                        task.AddCandidateUsers((ICollection <string>)value);
                    }
                    else
                    {
                        throw new ActivitiException("Expression did not resolve to a string or collection of strings");
                    }
                }
            }

            if (userTask.CustomUserIdentityLinks != null && userTask.CustomUserIdentityLinks.Count > 0)
            {
                foreach (string customUserIdentityLinkType in userTask.CustomUserIdentityLinks.Keys)
                {
                    foreach (string userIdentityLink in userTask.CustomUserIdentityLinks[customUserIdentityLinkType])
                    {
                        IExpression idExpression = expressionManager.CreateExpression(userIdentityLink);
                        object      value        = idExpression.GetValue(execution);
                        if (value is string @string)
                        {
                            IList <string> userIds = ExtractCandidates(@string);
                            foreach (string userId in userIds)
                            {
                                task.AddUserIdentityLink(userId, customUserIdentityLinkType);
                            }
                        }
                        else if (value is ICollection collection)
                        {
                            IEnumerator userIdSet = collection.GetEnumerator();
                            while (userIdSet.MoveNext())
                            {
                                task.AddUserIdentityLink((string)userIdSet.Current, customUserIdentityLinkType);
                            }
                        }
                        else
                        {
                            throw new ActivitiException("Expression did not resolve to a string or collection of strings");
                        }
                    }
                }
            }

            if (userTask.CustomGroupIdentityLinks != null && userTask.CustomGroupIdentityLinks.Count > 0)
            {
                foreach (string customGroupIdentityLinkType in userTask.CustomGroupIdentityLinks.Keys)
                {
                    foreach (string groupIdentityLink in userTask.CustomGroupIdentityLinks[customGroupIdentityLinkType])
                    {
                        IExpression idExpression = expressionManager.CreateExpression(groupIdentityLink);
                        object      value        = idExpression.GetValue(execution);
                        if (value is string @string)
                        {
                            IList <string> groupIds = ExtractCandidates(@string);
                            foreach (string groupId in groupIds)
                            {
                                task.AddGroupIdentityLink(groupId, customGroupIdentityLinkType);
                            }
                        }
                        else if (value is ICollection collection)
                        {
                            IEnumerator groupIdSet = collection.GetEnumerator();
                            while (groupIdSet.MoveNext())
                            {
                                task.AddGroupIdentityLink((string)groupIdSet.Current, customGroupIdentityLinkType);
                            }
                        }
                        else
                        {
                            throw new ActivitiException("Expression did not resolve to a string or collection of strings");
                        }
                    }
                }
            }
        }
 /// <inheritdoc />
 public GetDeptLeaderBookmarkRuleCmd()
 {
     externalConnector = ProcessEngineServiceProvider.Resolve <ExternalConnectorProvider>();
 }
Esempio n. 27
0
 public UpdateTaskCmd(IUpdateTaskCmd cmd)
 {
     this.updateTaskCmd = cmd;
     userService        = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();
 }
Esempio n. 28
0
        // CREATE METHODS

        public virtual IExecutionEntity CreateProcessInstanceExecution(IProcessDefinition processDefinition, string businessKey, string tenantId, string initiatorVariableName)
        {
            IExecutionEntity processInstanceExecution = executionDataManager.Create();

            if (ExecutionRelatedEntityCountEnabledGlobally)
            {
                ((ICountingExecutionEntity)processInstanceExecution).IsCountEnabled = true;
            }

            processInstanceExecution.ProcessDefinitionId      = processDefinition.Id;
            processInstanceExecution.ProcessDefinitionKey     = processDefinition.Key;
            processInstanceExecution.ProcessDefinitionName    = processDefinition.Name;
            processInstanceExecution.ProcessDefinitionVersion = processDefinition.Version;
            processInstanceExecution.BusinessKey = businessKey;
            processInstanceExecution.IsScope     = true; // process instance is always a scope for all child executions

            // Inherit tenant id (if any)
            if (tenantId is object)
            {
                processInstanceExecution.TenantId = tenantId;
            }

            string authenticatedUserId = Authentication.AuthenticatedUser.Id;

            processInstanceExecution.StartTime   = Context.ProcessEngineConfiguration.Clock.CurrentTime;
            processInstanceExecution.StartUserId = authenticatedUserId;
            processInstanceExecution.StartUser   = Authentication.AuthenticatedUser.FullName;

            // Store in database
            Insert(processInstanceExecution, false);

            if (string.IsNullOrWhiteSpace(processInstanceExecution.StartUserId) == false)
            {
                IUserInfo                 starter           = null;
                IUserServiceProxy         userService       = ProcessEngineServiceProvider.Resolve <IUserServiceProxy>();
                ExternalConnectorProvider externalConnector = ProcessEngineServiceProvider.Resolve <ExternalConnectorProvider>();

                starter = new UserInfo
                {
                    Id       = processInstanceExecution.StartUserId,
                    FullName = processInstanceExecution.StartUserId
                };
                //TODO: 考虑性能问题,暂时不要获取人员信息
                //try
                //{
                //    starter = AsyncHelper.RunSync<IUserInfo>(() => userService.GetUser(processInstanceExecution.StartUserId));
                //    starter.TenantId = processInstanceExecution.TenantId;
                //}
                //catch (Exception ex)
                //{
                //    logger.LogError(ex, ex.Message);
                //    starter = new UserInfo
                //    {
                //        Id = processInstanceExecution.StartUserId,
                //        FullName = processInstanceExecution.StartUserId
                //    };
                //}

                //保存调用用户变量
                processInstanceExecution.SetVariable(processInstanceExecution.StartUserId, starter);
            }

            if (initiatorVariableName is object)
            {
                processInstanceExecution.SetVariable(initiatorVariableName, authenticatedUserId);
            }

            // Need to be after insert, cause we need the id
            processInstanceExecution.ProcessInstanceId     = processInstanceExecution.Id;
            processInstanceExecution.RootProcessInstanceId = processInstanceExecution.Id;
            //TODO: 当没有用户任务的时候,添加identity会报错
            if (authenticatedUserId is object)
            {
                IdentityLinkEntityManager.AddIdentityLink(processInstanceExecution, authenticatedUserId, null, IdentityLinkType.STARTER);
            }

            // Fire events
            if (EventDispatcher.Enabled)
            {
                EventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateEntityEvent(ActivitiEventType.ENTITY_CREATED, processInstanceExecution));
            }

            return(processInstanceExecution);
        }
Esempio n. 29
0
        public override void Execute(IExecutionEntity execution)
        {
            execution.CurrentFlowElement.ExtensionElements.TryGetValue(BpmnXMLConstants.ELEMENT_EXTENSIONS_PROPERTY,
                                                                       out IList <ExtensionElement> pElements);

            if (pElements != null)
            {
                Exception exception = null;
                Stopwatch sw        = new Stopwatch();
                string    url       = null;
                string    dataObj   = null;
                object    request   = null;

                try
                {
                    sw.Start();

                    WebApiParameter parameter = new WebApiParameter(execution, pElements);
                    url     = parameter.Url;
                    dataObj = parameter.VariableName;
                    request = parameter.Request;
                    string method = parameter.Method;

                    var httpProxy = ProcessEngineServiceProvider.Resolve <IHttpClientProxy>();

                    HttpContext httpContext = ProcessEngineServiceProvider.Resolve <IHttpContextAccessor>()?.HttpContext;

                    if (httpContext == null)
                    {
                        httpProxy.SetHttpClientRequestAccessToken(execution.StartUserId, execution.TenantId);

                        //IAccessTokenProvider accessTokenProvider = ProcessEngineServiceProvider.Resolve<IAccessTokenProvider>();

                        //accessTokenProvider.SetHttpClientRequestAccessToken(httpProxy.HttpClient, execution.StartUserId, execution.TenantId);
                    }

                    switch (method?.ToLower())
                    {
                    default:
                    case "get":
                        ExecuteGet(execution, url, request, dataObj, httpProxy);
                        break;

                    case "post":
                        ExecutePost(execution, url, request, dataObj, httpProxy);
                        break;
                    }

                    sw.Stop();

                    logger.LogInformation($"调用外部服务共计({sw.ElapsedMilliseconds}ms) url={url} request={(request is null ? "" : JsonConvert.SerializeObject(request))}");

                    Leave(execution);
                }
                catch (Exception ex)
                {
                    sw.Stop();
                    logger.LogError($"调用外部服务失败({sw.ElapsedMilliseconds}ms) url={url} request={(request is null ? "" : JsonConvert.SerializeObject(request))}:\r\n" + ex.Message + ex.StackTrace);

                    throw new BpmnError(Context.CommandContext.ProcessEngineConfiguration.WebApiErrorCode, ex.Message);
                }
            }
        }
Esempio n. 30
0
 public virtual void Clear()
 {
     cache.Dispose();
     cache = ProcessEngineServiceProvider.Resolve <MemoryCacheProvider>().Create(sizeLimit);
 }