public async Task GetExecuteEntryUsers(CommonSignConfigurationRootAction rootAction, string entityKey, Func <string, Task> callback) { var entryGetExecuteUsersService = _commonSignConfigurationEntryGetExecuteUsersServiceSelector.Choose(rootAction.EntryGetExecuteUsersServiceName); await entryGetExecuteUsersService.Execute(rootAction, entityKey, async (userKey) => { await callback(userKey); }); }
/// <summary> /// 赋值通用审批配置节点数据操作 /// </summary> public static void SetCommonSignConfigurationRootActionSelectFields(CommonSignConfigurationRootAction data, DbDataReader reader, string prefix) { data.ID = (Guid)reader[string.Format("{0}id", prefix)]; data.ConfigurationId = (Guid)reader[string.Format("{0}configurationid", prefix)]; data.ActionName = reader[string.Format("{0}actionname", prefix)].ToString(); data.WorkflowResourceInitStatus = (int)reader[string.Format("{0}workflowresourceinitstatus", prefix)]; data.WorkflowResourceDefaultCompleteStatus = (int)reader[string.Format("{0}workflowresourcedefaultcompletestatus", prefix)]; if (reader[string.Format("{0}entrynodeid", prefix)] != DBNull.Value) { data.EntryNodeId = (Guid)reader[string.Format("{0}entrynodeid", prefix)]; } if (reader[string.Format("{0}entrynodefindserviceconfiguration", prefix)] != DBNull.Value) { data.EntryNodeFindServiceConfiguration = reader[string.Format("{0}entrynodefindserviceconfiguration", prefix)].ToString(); } if (reader[string.Format("{0}entrynodefindservicename", prefix)] != DBNull.Value) { data.EntryNodeFindServiceName = reader[string.Format("{0}entrynodefindservicename", prefix)].ToString(); } if (reader[string.Format("{0}entryserviceconfiguration", prefix)] != DBNull.Value) { data.EntryServiceConfiguration = reader[string.Format("{0}entryserviceconfiguration", prefix)].ToString(); } if (reader[string.Format("{0}entryservicename", prefix)] != DBNull.Value) { data.EntryServiceName = reader[string.Format("{0}entryservicename", prefix)].ToString(); } if (reader[string.Format("{0}entrygetexecuteusersserviceconfiguration", prefix)] != DBNull.Value) { data.EntryGetExecuteUsersServiceConfiguration = reader[string.Format("{0}entrygetexecuteusersserviceconfiguration", prefix)].ToString(); } if (reader[string.Format("{0}entrygetexecuteusersservicename", prefix)] != DBNull.Value) { data.EntryGetExecuteUsersServiceName = reader[string.Format("{0}entrygetexecuteusersservicename", prefix)].ToString(); } data.CreateTime = (DateTime)reader[string.Format("{0}createtime", prefix)]; data.ModifyTime = (DateTime)reader[string.Format("{0}modifytime", prefix)]; }
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); } } }
public async Task QueryAll(Guid configurationId, Func <CommonSignConfigurationRootAction, Task> callback) { var resultList = new List <CommonSignConfigurationRootAction>(); await DBTransactionHelper.SqlTransactionWorkAsync(DBTypes.SqlServer, true, false, _dbConnectionFactory.CreateReadForWorkflow(), async (conn, transaction) => { long?sequence = null; const int pageSize = 1000; while (true) { resultList.Clear(); SqlTransaction sqlTran = null; if (transaction != null) { sqlTran = (SqlTransaction)transaction; } await using (var command = new SqlCommand() { Connection = (SqlConnection)conn, CommandType = CommandType.Text, Transaction = sqlTran, }) { if (!sequence.HasValue) { command.CommandText = string.Format(@"SELECT TOP (@pagesize) {0},{1},{2},{3} FROM [CommonSignConfigurationRootAction] AS rootaction INNER JOIN [CommonSignConfiguration] AS config ON rootaction.configurationid = config.id LEFT JOIN [CommonSignConfigurationNode] AS node ON rootaction.entrynodeid = node.id LEFT JOIN [CommonSignConfiguration] AS nodeconfig ON nodeconfig.id = node.configurationid WHERE rootaction.configurationid = @configurationid ORDER BY rootaction.sequence;", StoreHelper.GetCommonSignConfigurationRootActionSelectFields("rootaction"), StoreHelper.GetCommonSignConfigurationSelectFields("config"), StoreHelper.GetCommonSignConfigurationNodeSelectFields("node"), StoreHelper.GetCommonSignConfigurationSelectFields("nodeconfig")); } else { command.CommandText = string.Format(@"SELECT TOP (@pagesize) {0},{1},{2},{3} FROM [CommonSignConfigurationRootAction] AS rootaction INNER JOIN [CommonSignConfiguration] AS config ON rootaction.configurationid = config.id LEFT JOIN [CommonSignConfigurationNode] AS node ON rootaction.entrynodeid = node.id LEFT JOIN [CommonSignConfiguration] AS nodeconfig ON nodeconfig.id = node.configurationid WHERE rootaction.configurationid = @configurationid AND rootaction.sequence > @sequence ORDER BY rootaction.sequence;", StoreHelper.GetCommonSignConfigurationRootActionSelectFields("rootaction"), StoreHelper.GetCommonSignConfigurationSelectFields("config"), StoreHelper.GetCommonSignConfigurationNodeSelectFields("node"), StoreHelper.GetCommonSignConfigurationSelectFields("nodeconfig")); } var parameter = new SqlParameter("@configurationid", SqlDbType.UniqueIdentifier) { Value = configurationId }; command.Parameters.Add(parameter); parameter = new SqlParameter("@pagesize", SqlDbType.Int) { Value = pageSize }; command.Parameters.Add(parameter); if (sequence.HasValue) { parameter = new SqlParameter("@sequence", SqlDbType.BigInt) { Value = sequence }; command.Parameters.Add(parameter); } await command.PrepareAsync(); SqlDataReader reader = null; await using (reader = await command.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { var data = new CommonSignConfigurationRootAction(); StoreHelper.SetCommonSignConfigurationRootActionSelectFields(data, reader, "rootaction"); data.Configuration = new CommonSignConfiguration(); StoreHelper.SetCommonSignConfigurationSelectFields(data.Configuration, reader, "config"); if (reader[string.Format("{0}id", "node")] != DBNull.Value) { data.EntryNode = new CommonSignConfigurationNode(); StoreHelper.SetCommonSignConfigurationNodeSelectFields(data.EntryNode, reader, "node"); } if (reader[string.Format("{0}id", "nodeconfig")] != DBNull.Value) { data.EntryNode.Configuration = new CommonSignConfiguration(); StoreHelper.SetCommonSignConfigurationSelectFields(data.EntryNode.Configuration, reader, "nodeconfig"); } sequence = (long)reader["rootactionsequence"]; resultList.Add(data); } await reader.CloseAsync(); } } foreach (var workflowStep in resultList) { await callback(workflowStep); } if (resultList.Count != pageSize) { break; } } }); }
public async Task <CommonSignConfigurationRootAction> QueryByActionName(Guid configurationId, string actionName) { CommonSignConfigurationRootAction 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},{2},{3} FROM [CommonSignConfigurationRootAction] AS rootaction INNER JOIN [CommonSignConfiguration] AS config ON rootaction.configurationid = config.id LEFT JOIN [CommonSignConfigurationNode] AS node ON rootaction.entrynodeid = node.id LEFT JOIN [CommonSignConfiguration] AS nodeconfig ON nodeconfig.id = node.configurationid WHERE rootaction.configurationid = @configurationid AND rootaction.actionname = @actionname ORDER BY rootaction.sequence DESC; ", StoreHelper.GetCommonSignConfigurationRootActionSelectFields("rootaction"), StoreHelper.GetCommonSignConfigurationSelectFields("config"), StoreHelper.GetCommonSignConfigurationNodeSelectFields("node"), StoreHelper.GetCommonSignConfigurationSelectFields("nodeconfig")) }) { var parameter = new SqlParameter("@configurationid", SqlDbType.UniqueIdentifier) { Value = configurationId }; command.Parameters.Add(parameter); parameter = new SqlParameter("@actionname", SqlDbType.NVarChar, 500) { Value = actionName }; command.Parameters.Add(parameter); await command.PrepareAsync(); SqlDataReader reader = null; await using (reader = await command.ExecuteReaderAsync()) { if (await reader.ReadAsync()) { result = new CommonSignConfigurationRootAction(); StoreHelper.SetCommonSignConfigurationRootActionSelectFields(result, reader, "rootaction"); result.Configuration = new CommonSignConfiguration(); StoreHelper.SetCommonSignConfigurationSelectFields(result.Configuration, reader, "config"); if (reader[string.Format("{0}id", "node")] != DBNull.Value) { result.EntryNode = new CommonSignConfigurationNode(); StoreHelper.SetCommonSignConfigurationNodeSelectFields(result.EntryNode, reader, "node"); } if (reader[string.Format("{0}id", "nodeconfig")] != DBNull.Value) { result.EntryNode.Configuration = new CommonSignConfiguration(); StoreHelper.SetCommonSignConfigurationSelectFields(result.EntryNode.Configuration, reader, "nodeconfig"); } } await reader.CloseAsync(); } } }); return(result); }