Exemplo n.º 1
0
        /// <summary>
        /// 验证入口节点
        /// </summary>
        /// <param name="configuration"></param>
        /// <param name="node"></param>
        /// <returns></returns>
        private async Task ValidateEntryNode(CommonSignConfiguration configuration, CommonSignConfigurationNode node)
        {
            //检查节点的状态,如果状态为不可用,则抛出异常
            if (node.Status != CommonSignConfigurationNodeStatus.Enabled)
            {
                var fragment = new TextFragment()
                {
                    Code = TextCodes.CommonSignConfigurationEntryNodeStatusError,
                    DefaultFormatting = "工作流资源类型为{0}的通用审批配置入口节点{1}的状态为{2},但要求的状态为{3}",
                    ReplaceParameters = new List <object>()
                    {
                        configuration.WorkflowResourceType, node.Name, node.Status, CommonSignConfigurationNodeStatus.Enabled
                    }
                };

                throw new UtilityException((int)Errors.CommonSignConfigurationEntryNodeStatusError, fragment);
            }
            //检查入口节点的所属配置是否与当前配置相同
            if (node.Configuration.ID != configuration.ID)
            {
                var fragment = new TextFragment()
                {
                    Code = TextCodes.CommonSignConfigurationEntryNodeNotSameConfiguration,
                    DefaultFormatting = "工作流资源类型为{0}的通用审批配置的入口节点{1}的所属配置为工作流资源类型为{2}的通用审批配置,两者不一致",
                    ReplaceParameters = new List <object>()
                    {
                        configuration.WorkflowResourceType, node.Name, node.Configuration.WorkflowResourceType
                    }
                };

                throw new UtilityException((int)Errors.CommonSignConfigurationEntryNodeNotSameConfiguration, fragment);
            }

            await Task.FromResult(0);
        }
Exemplo n.º 2
0
        public async Task <CommonSignConfigurationNode> QueryByConfigurationName(Guid configurationId, string name)
        {
            CommonSignConfigurationNode result = null;
            await DBTransactionHelper.SqlTransactionWorkAsync(DBTypes.SqlServer, true, false, _dbConnectionFactory.CreateReadForWorkflow(), async (conn, transaction) =>
            {
                SqlTransaction sqlTran = null;
                if (transaction != null)
                {
                    sqlTran = (SqlTransaction)transaction;
                }

                await using (var command = new SqlCommand()
                {
                    Connection = (SqlConnection)conn,
                    CommandType = CommandType.Text,
                    Transaction = sqlTran,
                    CommandText = string.Format(@"SELECT {0},{1}
                                                    FROM [CommonSignConfigurationNode] AS cnode
                                                        INNER JOIN [CommonSignConfiguration] AS config
                                                            ON cnode.[configurationid] = config.[id]
                                                    WHERE cnode.[configurationid] = @configurationid
                                                          AND cnode.[name] = @name
                                                    ORDER BY cnode.sequence DESC; ",
                                                StoreHelper.GetCommonSignConfigurationNodeSelectFields("cnode"),
                                                StoreHelper.GetCommonSignConfigurationSelectFields("config"))
                })
                {
                    var parameter = new SqlParameter("@configurationid", SqlDbType.UniqueIdentifier)
                    {
                        Value = configurationId
                    };
                    command.Parameters.Add(parameter);
                    parameter = new SqlParameter("@name", SqlDbType.NVarChar, 500)
                    {
                        Value = name
                    };
                    command.Parameters.Add(parameter);
                    await command.PrepareAsync();

                    SqlDataReader reader = null;

                    await using (reader = await command.ExecuteReaderAsync())
                    {
                        if (await reader.ReadAsync())
                        {
                            result = new CommonSignConfigurationNode();
                            StoreHelper.SetCommonSignConfigurationNodeSelectFields(result, reader, "cnode");
                            result.Configuration = new CommonSignConfiguration();
                            StoreHelper.SetCommonSignConfigurationSelectFields(result.Configuration, reader, "config");
                        }
                        await reader.CloseAsync();
                    }
                }
            });

            return(result);
        }
Exemplo n.º 3
0
 /// <summary>
 /// 赋值通用审批配置起始动作数据操作
 /// </summary>
 public static void SetCommonSignConfigurationNodeSelectFields(CommonSignConfigurationNode data, DbDataReader reader, string prefix)
 {
     data.ID = (Guid)reader[string.Format("{0}id", prefix)];
     data.ConfigurationId = (Guid)reader[string.Format("{0}configurationid", prefix)];
     data.Name            = reader[string.Format("{0}name", prefix)].ToString();
     data.WorkflowStatus  = (int)reader[string.Format("{0}workflowstatus", prefix)];
     if (reader[string.Format("{0}directgoexecuteserviceconfiguration", prefix)] != DBNull.Value)
     {
         data.DirectGoExecuteServiceConfiguration = reader[string.Format("{0}directgoexecuteserviceconfiguration", prefix)].ToString();
     }
     if (reader[string.Format("{0}directgoexecuteservicename", prefix)] != DBNull.Value)
     {
         data.DirectGoExecuteServiceName = reader[string.Format("{0}directgoexecuteservicename", prefix)].ToString();
     }
     data.Status     = (int)reader[string.Format("{0}Status", prefix)];
     data.CreateTime = (DateTime)reader[string.Format("{0}createtime", prefix)];
     data.ModifyTime = (DateTime)reader[string.Format("{0}modifytime", prefix)];
 }
Exemplo n.º 4
0
        public async Task ExecuteEntry(CommonSignConfigurationRootAction rootAction, string entityKey, string executeUserKey, string executeUserExtensionInfo, List <WorkflowUserInfo> userInfos, string data)
        {
            //判断执行操作的用户是否可以操作
            bool          canExecute = false;
            var           entryGetExecuteUsersService = _commonSignConfigurationEntryGetExecuteUsersServiceSelector.Choose(rootAction.EntryGetExecuteUsersServiceName);
            List <string> userKeys = new List <string>();
            await entryGetExecuteUsersService.Execute(rootAction, entityKey, async (userKey) =>
            {
                userKeys.Add(userKey);
                if (executeUserKey.ToLower() == userKey.ToLower())
                {
                    canExecute = true;
                }
                await Task.FromResult(0);
            });

            if (!canExecute)
            {
                string strUserKey = string.Empty;
                foreach (var item in userKeys)
                {
                    strUserKey += $"{item},";
                }
                var fragment = new TextFragment()
                {
                    Code = TextCodes.CommonSignConfigurationRootActionUserCanNotEntry,
                    DefaultFormatting = "工作流资源类型为{0}的通用审批配置下动作名称为{1}的初始化动作,用户{2}不能执行,userkeys:{3}",
                    ReplaceParameters = new List <object>()
                    {
                        rootAction.Configuration.WorkflowResourceType, rootAction.ActionName, executeUserKey, strUserKey
                    }
                };

                throw new UtilityException((int)Errors.CommonSignConfigurationRootActionUserCanNotEntry, fragment);
            }



            //创建工作流资源
            var workflowResource = await WorkflowResourceHelper.GetWorkflowResource(_workflowResourceRepository, rootAction.Configuration.WorkflowResourceType, entityKey, rootAction.WorkflowResourceInitStatus);


            //执行入口服务
            var entryService = _commonSignConfigurationEntryServiceSelector.Choose(rootAction.EntryServiceName);
            var canEntryNode = await entryService.Execute(workflowResource, rootAction.Configuration.EntityType, entityKey, executeUserKey, executeUserExtensionInfo, rootAction.ActionName, userInfos, data, rootAction.EntryServiceConfiguration);



            if (canEntryNode)
            {
                //获取入口节点查找
                CommonSignConfigurationNode node = null;
                bool runComplete = true;
                if (!string.IsNullOrEmpty(rootAction.EntryNodeFindServiceName))
                {
                    var nodeFindService = _commonSignConfigurationEntryNodeFindServiceSelector.Choose(rootAction.EntryNodeFindServiceName);
                    node = await nodeFindService.Execute(rootAction, entityKey, userInfos, data, rootAction.EntryNodeFindServiceConfiguration);

                    if (node != null)
                    {
                        runComplete = false;
                    }
                }


                if (runComplete)
                {
                    //判断入口节点是否有值
                    if (rootAction.EntryNode != null)
                    {
                        node        = rootAction.EntryNode;
                        runComplete = false;
                    }
                }

                if (runComplete || node == null)
                {
                    //表示不需要再往下面的节点执行,直接执行完成服务
                    await rootAction.Configuration.ExecuteComplete(entityKey, executeUserKey, executeUserExtensionInfo, rootAction.WorkflowResourceDefaultCompleteStatus);

                    return;
                }
                else
                {
                    //验证入口节点
                    await ValidateEntryNode(rootAction.Configuration, node);

                    //需要执行入口节点的CreateFlow方法创建工作流相应的步骤
                    await node.CreateFlowExecute(entityKey, rootAction.ActionName, rootAction.WorkflowResourceInitStatus, executeUserKey, executeUserExtensionInfo, userInfos);
                }
            }
        }