/// <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); }
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); }
/// <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)]; }
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); } } }