diff --git a/.gitci/release-config.yml b/.gitci/release-config.yml index a0817eb..366a57f 100644 --- a/.gitci/release-config.yml +++ b/.gitci/release-config.yml @@ -8,7 +8,7 @@ minor: commits: - "[feat]" - - "feat" + - "feat:" - "⬆️" - ":arrow_up:" - "🚀" @@ -18,7 +18,7 @@ patch: commits: - "[fix]" - - "fix" + - "fix:" - ":bug:" - "🐛" labels: diff --git a/app/src/Passingwind.WorkflowApp.EntityFrameworkCore/Migrations/20230615080044_Update_Elsa_6.Designer.cs b/app/src/Passingwind.WorkflowApp.EntityFrameworkCore/Migrations/20230615080044_Update_Elsa_6.Designer.cs new file mode 100644 index 0000000..f6a76e0 --- /dev/null +++ b/app/src/Passingwind.WorkflowApp.EntityFrameworkCore/Migrations/20230615080044_Update_Elsa_6.Designer.cs @@ -0,0 +1,2509 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Passingwind.WorkflowApp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace Demo.Migrations +{ + [DbContext(typeof(WorkflowAppDbContext))] + [Migration("20230615080044_Update_Elsa_6")] + partial class Update_Elsa_6 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "7.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.Activity", b => + { + b.Property("WorkflowDefinitionVersionId") + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityId") + .HasColumnType("uniqueidentifier"); + + b.Property("Attributes") + .HasColumnType("nvarchar(max)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LoadWorkflowContext") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("PersistWorkflow") + .HasColumnType("bit"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("PropertyStorageProviders") + .HasColumnType("nvarchar(max)"); + + b.Property("SaveWorkflowContext") + .HasColumnType("bit"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.HasKey("WorkflowDefinitionVersionId", "ActivityId"); + + b.ToTable("ElsaActivities", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.ActivityConnection", b => + { + b.Property("WorkflowDefinitionVersionId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetId") + .HasColumnType("uniqueidentifier"); + + b.Property("Outcome") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Attributes") + .HasColumnType("nvarchar(max)"); + + b.HasKey("WorkflowDefinitionVersionId", "SourceId", "TargetId", "Outcome"); + + b.ToTable("ElsaActivityConnections", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.Bookmark", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityId") + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityType") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Hash") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Model") + .HasColumnType("nvarchar(max)"); + + b.Property("ModelType") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("WorkflowInstanceId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.ToTable("ElsaBookmarks", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.GlobalVariable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsSecret") + .HasColumnType("bit"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Type") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("Key"); + + b.ToTable("ElsaGlobalVariables", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.Trigger", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityId") + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityType") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Hash") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Model") + .HasColumnType("nvarchar(max)"); + + b.Property("ModelType") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("WorkflowDefinitionId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.ToTable("ElsaTriggers", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowDefinition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Channel") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContextOptions") + .HasColumnType("nvarchar(max)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("CustomAttributes") + .HasColumnType("nvarchar(max)"); + + b.Property("DeleteCompletedInstances") + .HasColumnType("bit"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsSingleton") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LatestVersion") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("PersistenceBehavior") + .HasColumnType("int"); + + b.Property("PublishedVersion") + .HasColumnType("int"); + + b.Property("Tag") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Variables") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("ElsaWorkflowDefinitions", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowDefinitionVersion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DefinitionId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsLatest") + .HasColumnType("bit"); + + b.Property("IsPublished") + .HasColumnType("bit"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("DefinitionId", "Version"); + + b.ToTable("ElsaWorkflowDefinitionVersions", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowExecutionLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityId") + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityType") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("Data") + .HasColumnType("nvarchar(max)"); + + b.Property("EventName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Message") + .HasColumnType("nvarchar(max)"); + + b.Property("Source") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Timestamp") + .HasColumnType("datetime2"); + + b.Property("WorkflowInstanceId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("WorkflowInstanceId"); + + b.ToTable("ElsaWorkflowExecutionLogs", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CancelledTime") + .HasColumnType("datetime2"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ContextId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ContextType") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CorrelationId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("CurrentActivity") + .HasColumnType("nvarchar(max)"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Fault") + .HasColumnType("nvarchar(max)"); + + b.Property("FaultedTime") + .HasColumnType("datetime2"); + + b.Property("FinishedDuration") + .HasColumnType("time"); + + b.Property("FinishedTime") + .HasColumnType("datetime2"); + + b.Property("Input") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastExecutedActivityId") + .HasColumnType("uniqueidentifier"); + + b.Property("LastExecutedTime") + .HasColumnType("datetime2"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Output") + .HasColumnType("nvarchar(max)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Version") + .HasColumnType("int"); + + b.Property("WorkflowDefinitionId") + .HasColumnType("uniqueidentifier"); + + b.Property("WorkflowDefinitionVersionId") + .HasColumnType("uniqueidentifier"); + + b.Property("WorkflowStatus") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("WorkflowDefinitionId"); + + b.HasIndex("WorkflowStatus"); + + b.HasIndex("WorkflowDefinitionId", "WorkflowDefinitionVersionId"); + + b.ToTable("ElsaWorkflowInstances", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceActivityData", b => + { + b.Property("WorkflowInstanceId") + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityId") + .HasColumnType("uniqueidentifier"); + + b.Property("Data") + .HasColumnType("nvarchar(max)"); + + b.HasKey("WorkflowInstanceId", "ActivityId"); + + b.ToTable("ElsaWorkflowInstanceActivityData", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceActivityScope", b => + { + b.Property("WorkflowInstanceId") + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityId") + .HasColumnType("uniqueidentifier"); + + b.Property("Variables") + .HasColumnType("nvarchar(max)"); + + b.HasKey("WorkflowInstanceId", "ActivityId"); + + b.ToTable("ElsaWorkflowInstanceScopes", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceBlockingActivity", b => + { + b.Property("WorkflowInstanceId") + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityId") + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Tag") + .HasColumnType("nvarchar(max)"); + + b.HasKey("WorkflowInstanceId", "ActivityId"); + + b.ToTable("ElsaWorkflowInstanceBlockingActivities", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceFault", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("WorkflowInstanceId") + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityInput") + .HasColumnType("nvarchar(max)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("Exception") + .HasColumnType("nvarchar(max)"); + + b.Property("FaultedActivityId") + .HasColumnType("uniqueidentifier"); + + b.Property("Message") + .HasColumnType("nvarchar(max)"); + + b.Property("Resuming") + .HasColumnType("bit"); + + b.HasKey("Id", "WorkflowInstanceId"); + + b.HasIndex("WorkflowInstanceId"); + + b.ToTable("ElsaWorkflowInstanceFaults", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceMetadata", b => + { + b.Property("WorkflowInstanceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("WorkflowInstanceId", "Key"); + + b.ToTable("ElsaWorkflowInstanceMetadata", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceScheduledActivity", b => + { + b.Property("WorkflowInstanceId") + .HasColumnType("uniqueidentifier"); + + b.Property("ActivityId") + .HasColumnType("uniqueidentifier"); + + b.Property("Input") + .HasColumnType("nvarchar(max)"); + + b.HasKey("WorkflowInstanceId", "ActivityId"); + + b.ToTable("ElsaWorkflowInstanceScheduledActivities", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceVariable", b => + { + b.Property("WorkflowInstanceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("WorkflowInstanceId", "Key"); + + b.HasIndex("Key"); + + b.ToTable("ElsaWorkflowInstanceVariables", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.WorkflowGroups.WorkflowGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("RoleName"); + + b.ToTable("ElsaWorkflowGroups", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.WorkflowGroups.WorkflowGroupUser", b => + { + b.Property("WorkflowGroupId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("WorkflowGroupId", "UserId"); + + b.ToTable("ElsaWorkflowGroupUsers", (string)null); + }); + + modelBuilder.Entity("Passingwind.WorkflowApp.ApiKeys.ApiKey", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExpirationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Secret") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.ToTable("AppApiKeys", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("nvarchar(max)"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EntityChangeId") + .HasColumnType("uniqueidentifier"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("nvarchar(max)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastTryTime") + .HasColumnType("datetime2"); + + b.Property("NextTryTime") + .HasColumnType("datetime2"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatures", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatureGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("bit") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AbpTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.Activity", b => + { + b.HasOne("Passingwind.Abp.ElsaModule.Common.WorkflowDefinitionVersion", null) + .WithMany("Activities") + .HasForeignKey("WorkflowDefinitionVersionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.ActivityConnection", b => + { + b.HasOne("Passingwind.Abp.ElsaModule.Common.WorkflowDefinitionVersion", null) + .WithMany("Connections") + .HasForeignKey("WorkflowDefinitionVersionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceActivityData", b => + { + b.HasOne("Passingwind.Abp.ElsaModule.Common.WorkflowInstance", null) + .WithMany("ActivityData") + .HasForeignKey("WorkflowInstanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceActivityScope", b => + { + b.HasOne("Passingwind.Abp.ElsaModule.Common.WorkflowInstance", null) + .WithMany("ActivityScopes") + .HasForeignKey("WorkflowInstanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceBlockingActivity", b => + { + b.HasOne("Passingwind.Abp.ElsaModule.Common.WorkflowInstance", null) + .WithMany("BlockingActivities") + .HasForeignKey("WorkflowInstanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceFault", b => + { + b.HasOne("Passingwind.Abp.ElsaModule.Common.WorkflowInstance", null) + .WithMany("Faults") + .HasForeignKey("WorkflowInstanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceMetadata", b => + { + b.HasOne("Passingwind.Abp.ElsaModule.Common.WorkflowInstance", null) + .WithMany("Metadata") + .HasForeignKey("WorkflowInstanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceScheduledActivity", b => + { + b.HasOne("Passingwind.Abp.ElsaModule.Common.WorkflowInstance", null) + .WithMany("ScheduledActivities") + .HasForeignKey("WorkflowInstanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstanceVariable", b => + { + b.HasOne("Passingwind.Abp.ElsaModule.Common.WorkflowInstance", null) + .WithMany("Variables") + .HasForeignKey("WorkflowInstanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.WorkflowGroups.WorkflowGroupUser", b => + { + b.HasOne("Passingwind.Abp.ElsaModule.WorkflowGroups.WorkflowGroup", null) + .WithMany("Users") + .HasForeignKey("WorkflowGroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowDefinitionVersion", b => + { + b.Navigation("Activities"); + + b.Navigation("Connections"); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.Common.WorkflowInstance", b => + { + b.Navigation("ActivityData"); + + b.Navigation("ActivityScopes"); + + b.Navigation("BlockingActivities"); + + b.Navigation("Faults"); + + b.Navigation("Metadata"); + + b.Navigation("ScheduledActivities"); + + b.Navigation("Variables"); + }); + + modelBuilder.Entity("Passingwind.Abp.ElsaModule.WorkflowGroups.WorkflowGroup", b => + { + b.Navigation("Users"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/app/src/Passingwind.WorkflowApp.EntityFrameworkCore/Migrations/20230615080044_Update_Elsa_6.cs b/app/src/Passingwind.WorkflowApp.EntityFrameworkCore/Migrations/20230615080044_Update_Elsa_6.cs new file mode 100644 index 0000000..c109895 --- /dev/null +++ b/app/src/Passingwind.WorkflowApp.EntityFrameworkCore/Migrations/20230615080044_Update_Elsa_6.cs @@ -0,0 +1,29 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Demo.Migrations +{ + /// + public partial class Update_Elsa_6 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "FinishedDuration", + table: "ElsaWorkflowInstances", + type: "time", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "FinishedDuration", + table: "ElsaWorkflowInstances"); + } + } +} diff --git a/app/src/Passingwind.WorkflowApp.EntityFrameworkCore/Migrations/DemoDbContextModelSnapshot.cs b/app/src/Passingwind.WorkflowApp.EntityFrameworkCore/Migrations/DemoDbContextModelSnapshot.cs index 3443e92..8c5b584 100644 --- a/app/src/Passingwind.WorkflowApp.EntityFrameworkCore/Migrations/DemoDbContextModelSnapshot.cs +++ b/app/src/Passingwind.WorkflowApp.EntityFrameworkCore/Migrations/DemoDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "7.0.3") + .HasAnnotation("ProductVersion", "7.0.5") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -584,6 +584,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("FaultedTime") .HasColumnType("datetime2"); + b.Property("FinishedDuration") + .HasColumnType("time"); + b.Property("FinishedTime") .HasColumnType("datetime2"); diff --git a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/IWorkflowInstanceAppService.cs b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/IWorkflowInstanceAppService.cs index f81471a..207d752 100644 --- a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/IWorkflowInstanceAppService.cs +++ b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/IWorkflowInstanceAppService.cs @@ -12,13 +12,13 @@ public interface IWorkflowInstanceAppService : IApplicationService Task GetAsync(Guid id); Task DeleteAsync(Guid id); - Task BatchDeleteAsync(WorkflowInstancesBatchActionRequestDto input); + Task BatchDeleteAsync(WorkflowInstanceBatchActionRequestDto input); Task CancelAsync(Guid id); - Task BatchCancelAsync(WorkflowInstancesBatchActionRequestDto input); + Task BatchCancelAsync(WorkflowInstanceBatchActionRequestDto input); Task RetryAsync(Guid id, WorkflowInstanceRetryRequestDto input); - Task BatchRetryAsync(WorkflowInstancesBatchActionRequestDto input); + Task BatchRetryAsync(WorkflowInstanceBatchActionRequestDto input); Task DispatchAsync(Guid id, WorkflowInstanceDispatchRequestDto input); Task ExecuteAsync(Guid id, WorkflowInstanceExecuteRequestDto input); @@ -29,8 +29,11 @@ public interface IWorkflowInstanceAppService : IApplicationService Task GetLogSummaryAsync(Guid id); - Task GetStatusDateCountStatisticsAsync(WorkflowInstanceGetStatusDateCountStatisticsRequestDto input); + Task> GetFaultsAsync(Guid id); + Task> GetFaultsByWorkflowDefinitionAsync(Guid id, WorkflowInstanceFaultRequestDto input); - Task GetStatusCountStatisticsAsync(); + Task GetStatusDateCountStatisticsAsync(WorkflowInstanceDateCountStatisticsRequestDto input); + + Task GetStatusCountStatisticsAsync(WorkflowInstanceStatusCountStatisticsRequestDto input); } diff --git a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceBasicDto.cs b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceBasicDto.cs index 63d19b0..8388f1a 100644 --- a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceBasicDto.cs +++ b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceBasicDto.cs @@ -1,4 +1,4 @@ -using System; +using System; using Passingwind.Abp.ElsaModule.Common; using Volo.Abp.Application.Dtos; @@ -22,4 +22,5 @@ public class WorkflowInstanceBasicDto : AuditedEntityDto public DateTime? FinishedTime { get; set; } public DateTime? CancelledTime { get; set; } public DateTime? FaultedTime { get; set; } + public TimeSpan? FinishedDuration { get; set; } } \ No newline at end of file diff --git a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstancesBatchActionRequestDto.cs b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceBatchActionRequestDto.cs similarity index 58% rename from src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstancesBatchActionRequestDto.cs rename to src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceBatchActionRequestDto.cs index d7ef9a8..8ca7810 100644 --- a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstancesBatchActionRequestDto.cs +++ b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceBatchActionRequestDto.cs @@ -1,8 +1,8 @@ -using System; +using System; namespace Passingwind.Abp.ElsaModule.WorkflowInstances; -public class WorkflowInstancesBatchActionRequestDto +public class WorkflowInstanceBatchActionRequestDto { public Guid[] Ids { get; set; } } diff --git a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceDateCountStatisticsRequestDto.cs b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceDateCountStatisticsRequestDto.cs new file mode 100644 index 0000000..f6b1ede --- /dev/null +++ b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceDateCountStatisticsRequestDto.cs @@ -0,0 +1,10 @@ +using System; + +namespace Passingwind.Abp.ElsaModule.WorkflowInstances; + +public class WorkflowInstanceDateCountStatisticsRequestDto +{ + public int? DatePeriod { get; set; } = 30; + public double Tz { get; set; } + public Guid? WorkflowDefinitionId { get; set; } +} diff --git a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceDto.cs b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceDto.cs index 15b5fc1..7fa065c 100644 --- a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceDto.cs +++ b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceDto.cs @@ -26,11 +26,13 @@ public class WorkflowInstanceDto : AuditedEntityDto public DateTime? CancelledTime { get; set; } public DateTime? FaultedTime { get; set; } + public TimeSpan? FinishedDuration { get; set; } // => FinishedTime - CreationTime; + public Guid? LastExecutedActivityId { get; set; } public WorkflowInputReference Input { get; set; } public WorkflowOutputReference Output { get; set; } public WorkflowInstanceScheduledActivityDto CurrentActivity { get; set; } - public List Faults { get; set; } + public List Faults { get; set; } public Dictionary Variables { get; set; } public Dictionary Metadata { get; set; } diff --git a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceFaultDto.cs b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceFaultDto.cs index 5f35fae..b6b72fd 100644 --- a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceFaultDto.cs +++ b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceFaultDto.cs @@ -1,9 +1,10 @@ -using System; +using System; using Passingwind.Abp.ElsaModule.Common; +using Volo.Abp.Application.Dtos; namespace Passingwind.Abp.ElsaModule.WorkflowInstances; -public class WorkflowInstanceFaultDto +public class WorkflowInstanceFaultBasicDto { public Guid? FaultedActivityId { get; set; } public bool Resuming { get; set; } @@ -11,3 +12,13 @@ public class WorkflowInstanceFaultDto public string Message { get; set; } public SimpleExceptionModel Exception { get; set; } } + +public class WorkflowInstanceFaultDto : CreationAuditedEntityDto +{ + public Guid WorkflowInstanceId { get; set; } + public Guid? FaultedActivityId { get; set; } + public bool Resuming { get; set; } + public object ActivityInput { get; set; } + public string Message { get; set; } + public SimpleExceptionModel Exception { get; set; } +} \ No newline at end of file diff --git a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceFaultRequestDto.cs b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceFaultRequestDto.cs new file mode 100644 index 0000000..14ed79d --- /dev/null +++ b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceFaultRequestDto.cs @@ -0,0 +1,8 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Passingwind.Abp.ElsaModule.WorkflowInstances; + +public class WorkflowInstanceFaultRequestDto: PagedResultRequestDto +{ +} diff --git a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceGetStatusDateCountStatisticsRequestDto.cs b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceGetStatusDateCountStatisticsRequestDto.cs deleted file mode 100644 index 435ec30..0000000 --- a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceGetStatusDateCountStatisticsRequestDto.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Passingwind.Abp.ElsaModule.WorkflowInstances; - -public class WorkflowInstanceGetStatusDateCountStatisticsRequestDto -{ - public int? DatePeriod { get; set; } = 30; - public double Tz { get; set; } -} diff --git a/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceStatusCountStatisticsRequestDto.cs b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceStatusCountStatisticsRequestDto.cs new file mode 100644 index 0000000..2776338 --- /dev/null +++ b/src/Passingwind.Abp.ElsaModule.Application.Contracts/WorkflowInstances/WorkflowInstanceStatusCountStatisticsRequestDto.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Passingwind.Abp.ElsaModule.WorkflowInstances; + +public class WorkflowInstanceStatusCountStatisticsRequestDto +{ + public Guid? WorkflowDefinitionId { get; set; } +} diff --git a/src/Passingwind.Abp.ElsaModule.Application/ElsaModuleApplicationAutoMapperProfile.cs b/src/Passingwind.Abp.ElsaModule.Application/ElsaModuleApplicationAutoMapperProfile.cs index 3e1102e..e185def 100644 --- a/src/Passingwind.Abp.ElsaModule.Application/ElsaModuleApplicationAutoMapperProfile.cs +++ b/src/Passingwind.Abp.ElsaModule.Application/ElsaModuleApplicationAutoMapperProfile.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using AutoMapper; using Elsa.Metadata; using Passingwind.Abp.ElsaModule.Common; @@ -73,6 +73,7 @@ public ElsaModuleApplicationAutoMapperProfile() CreateMap(); CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); diff --git a/src/Passingwind.Abp.ElsaModule.Application/WorkflowInstances/WorkflowInstanceAppService.cs b/src/Passingwind.Abp.ElsaModule.Application/WorkflowInstances/WorkflowInstanceAppService.cs index 1e0c9af..11c82ae 100644 --- a/src/Passingwind.Abp.ElsaModule.Application/WorkflowInstances/WorkflowInstanceAppService.cs +++ b/src/Passingwind.Abp.ElsaModule.Application/WorkflowInstances/WorkflowInstanceAppService.cs @@ -217,7 +217,7 @@ public async Task DeleteAsync(Guid id) } [Authorize(Policy = ElsaModulePermissions.Instances.Delete)] - public async Task BatchDeleteAsync(WorkflowInstancesBatchActionRequestDto input) + public async Task BatchDeleteAsync(WorkflowInstanceBatchActionRequestDto input) { if (input?.Ids?.Any() == true) { @@ -280,7 +280,7 @@ public async Task GetLogSummaryAsync(Gui } [Authorize(Policy = ElsaModulePermissions.Instances.Statistic)] - public async Task GetStatusDateCountStatisticsAsync(WorkflowInstanceGetStatusDateCountStatisticsRequestDto input) + public async Task GetStatusDateCountStatisticsAsync(WorkflowInstanceDateCountStatisticsRequestDto input) { var datePeriod = input.DatePeriod ?? 30; if (datePeriod <= 0) @@ -291,10 +291,24 @@ public async Task GetStatusDateCou var endDate = Clock.Now; var startDate = Clock.Now.Date.AddDays(-datePeriod); - var dto = await _workflowInstanceDateCountStatisticsDistributedCache.GetOrAddAsync($"workflow:instance:status:datecount:statistics:{datePeriod}:tz:{tz}", async () => + string cacheKey = $"workflow:instance:all:statistics:datecount:dateperiod:{datePeriod}:tz:{tz}"; + if (input.WorkflowDefinitionId.HasValue) + cacheKey = $"workflow:instance:{input.WorkflowDefinitionId}:statistics:datecount:dateperiod:{datePeriod}:tz:{tz}"; + + var dto = await _workflowInstanceDateCountStatisticsDistributedCache.GetOrAddAsync(cacheKey, async () => { - var finished = await _workflowInstanceRepository.GetStatusDateCountStatisticsAsync(WorkflowInstanceStatus.Finished, startDate, endDate, timeZone: tz); - var faulted = await _workflowInstanceRepository.GetStatusDateCountStatisticsAsync(WorkflowInstanceStatus.Faulted, startDate, endDate, timeZone: tz); + var finished = await _workflowInstanceRepository.GetStatusDateCountStatisticsAsync( + WorkflowInstanceStatus.Finished, + startDate, + endDate, + timeZone: tz, + definitionId: input.WorkflowDefinitionId); + var faulted = await _workflowInstanceRepository.GetStatusDateCountStatisticsAsync( + WorkflowInstanceStatus.Faulted, + startDate, + endDate, + timeZone: tz, + definitionId: input.WorkflowDefinitionId); var dto = new WorkflowInstanceDateCountStatisticsResultDto(); @@ -312,39 +326,51 @@ public async Task GetStatusDateCou return dto; }, () => new Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions { - AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(10), + AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(5), }); return dto; } [Authorize(Policy = ElsaModulePermissions.Instances.Statistic)] - public async Task GetStatusCountStatisticsAsync() + public async Task GetStatusCountStatisticsAsync(WorkflowInstanceStatusCountStatisticsRequestDto input) { - return await _workflowInstanceStatusCountStatisticsDistributedCache.GetOrAddAsync("workflow:instance:status:count:statistic", async () => - { - var allCount = await _workflowInstanceRepository.LongCountAsync(); - var runningCount = await _workflowInstanceRepository.LongCountAsync(status: WorkflowInstanceStatus.Running); - var faultedCount = await _workflowInstanceRepository.LongCountAsync(status: WorkflowInstanceStatus.Faulted); - var suspendedCount = await _workflowInstanceRepository.LongCountAsync(status: WorkflowInstanceStatus.Suspended); - var finishedCount = await _workflowInstanceRepository.LongCountAsync(status: WorkflowInstanceStatus.Finished); - - return new WorkflowInstanceStatusCountStatisticsResultDto - { - All = allCount, - Faulted = faultedCount, - Finished = finishedCount, - Suspended = suspendedCount, - Running = runningCount, - }; - }, () => new Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions - { - AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(2), - }); + string cacheKey = "workflow:instance:all:statistic:statuscount"; + if (input.WorkflowDefinitionId.HasValue) + cacheKey = $"workflow:instance:{input.WorkflowDefinitionId}:statistic:statuscount"; + + return await _workflowInstanceStatusCountStatisticsDistributedCache.GetOrAddAsync(cacheKey, async () => + { + var allCount = await _workflowInstanceRepository.LongCountAsync(definitionIds: input.WorkflowDefinitionId.HasValue ? new[] { input.WorkflowDefinitionId.Value } : null); + var runningCount = await _workflowInstanceRepository.LongCountAsync( + status: WorkflowInstanceStatus.Running, + definitionIds: input.WorkflowDefinitionId.HasValue ? new[] { input.WorkflowDefinitionId.Value } : null); + var faultedCount = await _workflowInstanceRepository.LongCountAsync( + status: WorkflowInstanceStatus.Faulted, + definitionIds: input.WorkflowDefinitionId.HasValue ? new[] { input.WorkflowDefinitionId.Value } : null); + var suspendedCount = await _workflowInstanceRepository.LongCountAsync( + status: WorkflowInstanceStatus.Suspended, + definitionIds: input.WorkflowDefinitionId.HasValue ? new[] { input.WorkflowDefinitionId.Value } : null); + var finishedCount = await _workflowInstanceRepository.LongCountAsync( + status: WorkflowInstanceStatus.Finished, + definitionIds: input.WorkflowDefinitionId.HasValue ? new[] { input.WorkflowDefinitionId.Value } : null); + + return new WorkflowInstanceStatusCountStatisticsResultDto + { + All = allCount, + Faulted = faultedCount, + Finished = finishedCount, + Suspended = suspendedCount, + Running = runningCount, + }; + }, () => new Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions + { + AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(2), + }); } [Authorize(Policy = ElsaModulePermissions.Instances.Action)] - public async Task BatchCancelAsync(WorkflowInstancesBatchActionRequestDto input) + public async Task BatchCancelAsync(WorkflowInstanceBatchActionRequestDto input) { // TODO check permissions @@ -358,7 +384,7 @@ public async Task BatchCancelAsync(WorkflowInstancesBatchActionRequestDto input) } [Authorize(Policy = ElsaModulePermissions.Instances.Action)] - public async Task BatchRetryAsync(WorkflowInstancesBatchActionRequestDto input) + public async Task BatchRetryAsync(WorkflowInstanceBatchActionRequestDto input) { // TODO check permissions @@ -371,4 +397,18 @@ public async Task BatchRetryAsync(WorkflowInstancesBatchActionRequestDto input) } } + public async Task> GetFaultsAsync(Guid id) + { + var list = await _workflowInstanceRepository.GetFaultsAsync(id); + + return new ListResultDto(ObjectMapper.Map, List>(list)); + } + + public async Task> GetFaultsByWorkflowDefinitionAsync(Guid id, WorkflowInstanceFaultRequestDto input) + { + var count = await _workflowInstanceRepository.GetFaultsCountByWorkflowDefinitionAsync(id); + var list = await _workflowInstanceRepository.GetFaultsByWorkflowDefinitionAsync(id, input.SkipCount, input.MaxResultCount); + + return new PagedResultDto(count, ObjectMapper.Map, List>(list)); + } } diff --git a/src/Passingwind.Abp.ElsaModule.Domain/Common/IWorkflowInstanceRepository.cs b/src/Passingwind.Abp.ElsaModule.Domain/Common/IWorkflowInstanceRepository.cs index 45391ee..b6f4e01 100644 --- a/src/Passingwind.Abp.ElsaModule.Domain/Common/IWorkflowInstanceRepository.cs +++ b/src/Passingwind.Abp.ElsaModule.Domain/Common/IWorkflowInstanceRepository.cs @@ -69,6 +69,11 @@ public interface IWorkflowInstanceRepository : IRepository> GetFaultsAsync(Guid id, CancellationToken cancellationToken = default); + + Task> GetFaultsByWorkflowDefinitionAsync(Guid id, int skipCount, int maxResultCount, CancellationToken cancellationToken = default); + Task GetFaultsCountByWorkflowDefinitionAsync(Guid id, CancellationToken cancellationToken = default); } diff --git a/src/Passingwind.Abp.ElsaModule.Domain/Common/WorkflowInstance.cs b/src/Passingwind.Abp.ElsaModule.Domain/Common/WorkflowInstance.cs index 14b5561..2daee96 100644 --- a/src/Passingwind.Abp.ElsaModule.Domain/Common/WorkflowInstance.cs +++ b/src/Passingwind.Abp.ElsaModule.Domain/Common/WorkflowInstance.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Elsa.Models; using Elsa.Services.Models; @@ -41,6 +41,8 @@ public WorkflowInstance(Guid id) : base(id) public DateTime? FaultedTime { get; set; } public Guid? LastExecutedActivityId { get; set; } + public TimeSpan? FinishedDuration { get; set; } + public WorkflowInputReference Input { get; set; } public WorkflowOutputReference Output { get; set; } diff --git a/src/Passingwind.Abp.ElsaModule.Domain/Common/WorkflowInstanceFault.cs b/src/Passingwind.Abp.ElsaModule.Domain/Common/WorkflowInstanceFault.cs index 73fdf42..ade1730 100644 --- a/src/Passingwind.Abp.ElsaModule.Domain/Common/WorkflowInstanceFault.cs +++ b/src/Passingwind.Abp.ElsaModule.Domain/Common/WorkflowInstanceFault.cs @@ -1,4 +1,4 @@ -using System; +using System; using Volo.Abp.Domain.Entities.Auditing; namespace Passingwind.Abp.ElsaModule.Common; diff --git a/src/Passingwind.Abp.ElsaModule.Domain/Stores/StoreMapper.cs b/src/Passingwind.Abp.ElsaModule.Domain/Stores/StoreMapper.cs index b180900..9893ccf 100644 --- a/src/Passingwind.Abp.ElsaModule.Domain/Stores/StoreMapper.cs +++ b/src/Passingwind.Abp.ElsaModule.Domain/Stores/StoreMapper.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Newtonsoft.Json.Linq; @@ -27,6 +27,21 @@ public StoreMapper(Volo.Abp.Timing.IClock clock, IGuidGenerator guidGenerator) _guidGenerator = guidGenerator; } + protected virtual DateTime? ToDateTime(Instant? instant) + { + if (instant == null) + return null; + + if (_clock.Kind == DateTimeKind.Utc) + { + return instant.Value.ToDateTimeUtc(); + } + else + { + return instant.Value.ToDateTimeUtc().ToLocalTime(); + } + } + protected virtual DateTime ToDateTime(Instant instant) { if (_clock.Kind == DateTimeKind.Utc) @@ -336,17 +351,17 @@ public virtual WorkflowExecutionLogRecordModel MapToModel(WorkflowExecutionLog e public virtual WorkflowInstance MapToEntity(WorkflowInstanceModel model) { - return new WorkflowInstance(model.Id.ToGuid().Value) + var entity = new WorkflowInstance(model.Id.ToGuid().Value) { Name = model.Name, Version = model.Version, WorkflowStatus = (WorkflowInstanceStatus)(int)model.WorkflowStatus, - CancelledTime = model.CancelledAt.HasValue ? ToDateTime(model.CancelledAt.Value) : null, - FaultedTime = model.FaultedAt.HasValue ? ToDateTime(model.FaultedAt.Value) : null, - FinishedTime = model.FinishedAt.HasValue ? ToDateTime(model.FinishedAt.Value) : null, - LastExecutedTime = model.LastExecutedAt.HasValue ? ToDateTime(model.LastExecutedAt.Value) : null, + CancelledTime = ToDateTime(model.CancelledAt), + FaultedTime = ToDateTime(model.FaultedAt), + FinishedTime = ToDateTime(model.FinishedAt), + LastExecutedTime = ToDateTime(model.LastExecutedAt), ContextId = model.ContextId, ContextType = model.ContextType, @@ -376,6 +391,13 @@ public virtual WorkflowInstance MapToEntity(WorkflowInstanceModel model) ActivityScopes = model.Scopes.Select(x => new WorkflowInstanceActivityScope { ActivityId = Guid.Parse(x.ActivityId), Variables = (Dictionary)x.Variables.Data, }).ToList(), }; + + // update + if (entity.FinishedTime.HasValue) + entity.FinishedDuration = entity.FinishedTime - entity.CreationTime; + else if (entity.FaultedTime.HasValue) + entity.FinishedDuration = entity.FaultedTime - entity.CreationTime; + return entity; } public virtual WorkflowInstance MapToEntity(WorkflowInstanceModel model, WorkflowInstance entity) @@ -391,6 +413,11 @@ public virtual WorkflowInstance MapToEntity(WorkflowInstanceModel model, Workflo entity.FinishedTime = model.FinishedAt.HasValue ? ToDateTime(model.FinishedAt.Value) : null; entity.LastExecutedTime = model.LastExecutedAt.HasValue ? ToDateTime(model.LastExecutedAt.Value) : null; + if (entity.FinishedTime.HasValue) + entity.FinishedDuration = entity.FinishedTime - entity.CreationTime; + else if (entity.FaultedTime.HasValue) + entity.FinishedDuration = entity.FaultedTime - entity.CreationTime; + entity.ContextId = model.ContextId; entity.ContextType = model.ContextType; entity.CorrelationId = model.CorrelationId; diff --git a/src/Passingwind.Abp.ElsaModule.EntityFrameworkCore/EntityFrameworkCore/Repositories/WorkflowInstanceRepository.cs b/src/Passingwind.Abp.ElsaModule.EntityFrameworkCore/EntityFrameworkCore/Repositories/WorkflowInstanceRepository.cs index 3c932ae..8e8f874 100644 --- a/src/Passingwind.Abp.ElsaModule.EntityFrameworkCore/EntityFrameworkCore/Repositories/WorkflowInstanceRepository.cs +++ b/src/Passingwind.Abp.ElsaModule.EntityFrameworkCore/EntityFrameworkCore/Repositories/WorkflowInstanceRepository.cs @@ -33,7 +33,7 @@ public WorkflowInstanceRepository(IDbContextProvider dbCont { var dbset = await GetDbSetAsync(); return await dbset - .WhereIf(definitionIds?.Any()==true, x => definitionIds.Contains( x.WorkflowDefinitionId)) + .WhereIf(definitionIds?.Any() == true, x => definitionIds.Contains(x.WorkflowDefinitionId)) .WhereIf(definitionVersionIds?.Any() == true, x => definitionVersionIds.Contains(x.WorkflowDefinitionVersionId)) .WhereIf(version.HasValue, x => x.Version == version) .WhereIf(status.HasValue, x => x.WorkflowStatus == status) @@ -114,12 +114,19 @@ public WorkflowInstanceRepository(IDbContextProvider dbCont .ToListAsync(cancellationToken); } - public async Task> GetStatusDateCountStatisticsAsync(WorkflowInstanceStatus workflowStatus, DateTime startDate, DateTime endDate, double timeZone = 0, CancellationToken cancellationToken = default) + public async Task> GetStatusDateCountStatisticsAsync( + WorkflowInstanceStatus workflowStatus, + DateTime startDate, + DateTime endDate, + double timeZone = 0, + Guid? definitionId = null, + CancellationToken cancellationToken = default) { var dbset = await GetDbSetAsync(); var list = await dbset .Where(x => x.WorkflowStatus == workflowStatus && x.CreationTime >= startDate && x.CreationTime <= endDate) + .WhereIf(definitionId.HasValue, x => x.WorkflowDefinitionId == definitionId) .Select(x => new { x.Id, x.CreationTime }) .ToListAsync(cancellationToken); @@ -154,4 +161,30 @@ public WorkflowInstanceRepository(IDbContextProvider dbCont .GroupBy(x => x.WorkflowStatus) .ToDictionary(x => x.Key, x => x.Count()); } + + public async Task> GetFaultsAsync(Guid id, CancellationToken cancellationToken = default) + { + var dbset = await GetDbSetAsync(); + return await dbset.Where(x => x.Id == id).SelectMany(x => x.Faults).ToListAsync(cancellationToken); + } + + public async Task> GetFaultsByWorkflowDefinitionAsync(Guid id, int skipCount, int maxResultCount, CancellationToken cancellationToken = default) + { + var dbset = await GetDbSetAsync(); + return await dbset + .Where(x => x.WorkflowDefinitionId == id) + .SelectMany(x => x.Faults) + .OrderByDescending(x => x.CreationTime) + .PageBy(skipCount, maxResultCount) + .ToListAsync(cancellationToken); + } + + public async Task GetFaultsCountByWorkflowDefinitionAsync(Guid id, CancellationToken cancellationToken = default) + { + var dbset = await GetDbSetAsync(); + return await dbset + .Where(x => x.WorkflowDefinitionId == id) + .SelectMany(x => x.Faults) + .LongCountAsync(cancellationToken); + } } diff --git a/src/Passingwind.Abp.ElsaModule.HttpApi/WorkflowInstances/WorkflowInstanceController.cs b/src/Passingwind.Abp.ElsaModule.HttpApi/WorkflowInstances/WorkflowInstanceController.cs index 05e339e..ed9869c 100644 --- a/src/Passingwind.Abp.ElsaModule.HttpApi/WorkflowInstances/WorkflowInstanceController.cs +++ b/src/Passingwind.Abp.ElsaModule.HttpApi/WorkflowInstances/WorkflowInstanceController.cs @@ -19,19 +19,19 @@ public WorkflowInstanceController(IWorkflowInstanceAppService service) } [HttpPost("cancel")] - public Task BatchCancelAsync(WorkflowInstancesBatchActionRequestDto input) + public Task BatchCancelAsync(WorkflowInstanceBatchActionRequestDto input) { return _service.BatchCancelAsync(input); } [HttpDelete] - public Task BatchDeleteAsync([FromBody] WorkflowInstancesBatchActionRequestDto input) + public Task BatchDeleteAsync([FromBody] WorkflowInstanceBatchActionRequestDto input) { return _service.BatchDeleteAsync(input); } [HttpPost("retry")] - public Task BatchRetryAsync(WorkflowInstancesBatchActionRequestDto input) + public Task BatchRetryAsync(WorkflowInstanceBatchActionRequestDto input) { return _service.BatchRetryAsync(input); } @@ -78,6 +78,18 @@ public Task> GetExecutionLogsAsync(Guid i return _service.GetExecutionLogsAsync(id); } + [HttpGet("{id}/faults")] + public Task> GetFaultsAsync(Guid id) + { + return _service.GetFaultsAsync(id); + } + + [HttpGet("faults/by-definition/{id}")] + public Task> GetFaultsByWorkflowDefinitionAsync(Guid id, WorkflowInstanceFaultRequestDto input) + { + return _service.GetFaultsByWorkflowDefinitionAsync(id, input); + } + [HttpGet()] public virtual Task> GetListAsync(WorkflowInstanceListRequestDto input) { @@ -91,13 +103,13 @@ public Task GetLogSummaryAsync(Guid id) } [HttpGet("statistics/status")] - public Task GetStatusCountStatisticsAsync() + public Task GetStatusCountStatisticsAsync(WorkflowInstanceStatusCountStatisticsRequestDto input) { - return _service.GetStatusCountStatisticsAsync(); + return _service.GetStatusCountStatisticsAsync(input); } [HttpGet("statistics/count-date")] - public Task GetStatusDateCountStatisticsAsync(WorkflowInstanceGetStatusDateCountStatisticsRequestDto input) + public Task GetStatusDateCountStatisticsAsync(WorkflowInstanceDateCountStatisticsRequestDto input) { return _service.GetStatusDateCountStatisticsAsync(input); } @@ -107,5 +119,4 @@ public Task RetryAsync(Guid id, WorkflowInstanceRetryRequestDto input) { return _service.RetryAsync(id, input); } - } diff --git a/src/Passingwind.Abp.ElsaModule.MongoDB/MongoDB/Repositories/WorkflowInstanceRepository.cs b/src/Passingwind.Abp.ElsaModule.MongoDB/MongoDB/Repositories/WorkflowInstanceRepository.cs index 3a2a361..c6b50cd 100644 --- a/src/Passingwind.Abp.ElsaModule.MongoDB/MongoDB/Repositories/WorkflowInstanceRepository.cs +++ b/src/Passingwind.Abp.ElsaModule.MongoDB/MongoDB/Repositories/WorkflowInstanceRepository.cs @@ -118,7 +118,13 @@ public WorkflowInstanceRepository(IMongoDbContextProvider> GetStatusDateCountStatisticsAsync(WorkflowInstanceStatus workflowStatus, DateTime startDate, DateTime endDate, double timeZone = 0, CancellationToken cancellationToken = default) + public async Task> GetStatusDateCountStatisticsAsync( + WorkflowInstanceStatus workflowStatus, + DateTime startDate, + DateTime endDate, + double timeZone = 0, + Guid? definitionId = null, + CancellationToken cancellationToken = default) { var query = await GetMongoQueryableAsync(cancellationToken); @@ -127,6 +133,8 @@ public WorkflowInstanceRepository(IMongoDbContextProvider x.WorkflowStatus == workflowStatus && x.CreationTime >= startDate2 && x.CreationTime <= endDate2) + .WhereIf(definitionId.HasValue, x => x.WorkflowDefinitionId == definitionId) + .As>() .Select(x => new { x.Id, x.CreationTime }) .ToListAsync(cancellationToken); @@ -157,4 +165,31 @@ public WorkflowInstanceRepository(IMongoDbContextProvider x.WorkflowStatus) .ToDictionary(x => x.Key, x => x.Count()); } + + public async Task> GetFaultsAsync(Guid id, CancellationToken cancellationToken = default) + { + var dbset = await GetMongoQueryableAsync(cancellationToken); + return await dbset.Where(x => x.Id == id).SelectMany(x => x.Faults).ToListAsync(cancellationToken); + } + + public async Task> GetFaultsByWorkflowDefinitionAsync(Guid id, int skipCount, int maxResultCount, CancellationToken cancellationToken = default) + { + var dbset = await GetMongoQueryableAsync(cancellationToken); + return await dbset + .Where(x => x.WorkflowDefinitionId == id) + .SelectMany(x => x.Faults) + .OrderByDescending(x => x.CreationTime) + .PageBy(skipCount, maxResultCount) + .As>() + .ToListAsync(cancellationToken); + } + + public async Task GetFaultsCountByWorkflowDefinitionAsync(Guid id, CancellationToken cancellationToken = default) + { + var dbset = await GetMongoQueryableAsync(cancellationToken); + return await dbset + .Where(x => x.WorkflowDefinitionId == id) + .SelectMany(x => x.Faults) + .LongCountAsync(cancellationToken); + } } diff --git a/src/Passingwind.ElsaDesigner/src/locales/en-US.ts b/src/Passingwind.ElsaDesigner/src/locales/en-US.ts index e47ddd1..72946a6 100644 --- a/src/Passingwind.ElsaDesigner/src/locales/en-US.ts +++ b/src/Passingwind.ElsaDesigner/src/locales/en-US.ts @@ -46,6 +46,8 @@ export default { 'common.dict.info.tips': 'Notice', 'common.dict.error.tips': 'Error', 'common.dict.success.tips': 'Notice', + 'common.dict.general': 'General', + 'common.dict.common': 'Common', 'common.http.response.error.requestFailed': 'Request failed', 'common.http.response.error.networkError1': 'Network Error', 'common.http.response.error.networkError2': diff --git a/src/Passingwind.ElsaDesigner/src/locales/en-US/pages.ts b/src/Passingwind.ElsaDesigner/src/locales/en-US/pages.ts index 5274904..688f988 100644 --- a/src/Passingwind.ElsaDesigner/src/locales/en-US/pages.ts +++ b/src/Passingwind.ElsaDesigner/src/locales/en-US/pages.ts @@ -107,6 +107,8 @@ export default { 'page.definition.iam': 'Access control', 'page.definition.iam.owners': 'Owners', 'page.definition.iam.groups': 'Groups', + 'page.definition.graph': 'Graph', + 'page.definition.goInstanceDetail': 'View Instance', // 'page.definition.field.name': 'Name', 'page.definition.field.name.tips': 'A unique technical name for the workflow', @@ -142,6 +144,8 @@ export default { 'page.instance.field.lastExecutedTime': 'Last Executed Time', 'page.instance.field.faultedTime': 'Faulted Time', 'page.instance.field.correlationId': 'Correlation ID', + 'page.instance.field.fault.message': 'Message', + 'page.instance.field.finishedDuration': 'Duration', // 'page.instance.view': 'View', 'page.instance.cancel': 'Cancel', @@ -178,6 +182,17 @@ export default { 'page.instance.notFound': 'The workflow instance does not exist', 'page.instance.reload': 'Reload', 'page.instance.toDefinition': 'Go to definition', + 'page.instance.statistics.dateCount': 'Statistics(By Date)', + 'page.instance.statistics.statusCount': 'Statistics(By Status)', + 'page.instance.faults': 'Faults', + 'page.instance.faults.latest': 'Latest faults', + 'page.instance.list.latestOfCount': 'Top {number}', + 'page.instance.list.groupBy': 'Group By:', + 'page.instance.list.groupBy.time': 'Time', + 'page.instance.list.groupBy.duration': 'Duration', + 'page.instance.list.groupBy.error': 'Error', + 'page.instance.list.groupBy.running': 'Running', + 'page.instance.list.groupBy.suspended': 'Suspended', // 'page.workflowgroup.field.name': 'Name', 'page.workflowgroup.field.description': 'Description', diff --git a/src/Passingwind.ElsaDesigner/src/locales/zh-CN.ts b/src/Passingwind.ElsaDesigner/src/locales/zh-CN.ts index 3989961..3db0c40 100644 --- a/src/Passingwind.ElsaDesigner/src/locales/zh-CN.ts +++ b/src/Passingwind.ElsaDesigner/src/locales/zh-CN.ts @@ -46,6 +46,8 @@ export default { 'common.dict.info.tips': '信息提示', 'common.dict.error.tips': '错误提示', 'common.dict.success.tips': '成功提示', + 'common.dict.general': '基本', + 'common.dict.common': '通用', 'common.http.response.error.requestFailed': '请求失败', 'common.http.response.error.networkError1': '网络异常', 'common.http.response.error.networkError2': '您的网络发生异常,无法连接服务器', diff --git a/src/Passingwind.ElsaDesigner/src/locales/zh-CN/pages.ts b/src/Passingwind.ElsaDesigner/src/locales/zh-CN/pages.ts index 0b226e6..eca15a4 100644 --- a/src/Passingwind.ElsaDesigner/src/locales/zh-CN/pages.ts +++ b/src/Passingwind.ElsaDesigner/src/locales/zh-CN/pages.ts @@ -105,6 +105,8 @@ export default { 'page.definition.iam': '访问控制', 'page.definition.iam.owners': '拥有者', 'page.definition.iam.groups': '分组', + 'page.definition.graph': '视图', + 'page.definition.goInstanceDetail': '查看实例', // 'page.definition.field.name': '名称', 'page.definition.field.name.tips': '工作流的唯一技术性名称', @@ -138,6 +140,8 @@ export default { 'page.instance.field.lastExecutedTime': '最后执行时间', 'page.instance.field.faultedTime': '失败时间', 'page.instance.field.correlationId': '相关ID', + 'page.instance.field.fault.message': '消息', + 'page.instance.field.finishedDuration': '耗时', // 'page.instance.view': '查看', 'page.instance.cancel': '取消', @@ -173,6 +177,17 @@ export default { 'page.instance.notFound': '工作流程实例不存在', 'page.instance.reload': '刷新', 'page.instance.toDefinition': '转到定义', + 'page.instance.statistics.dateCount': '统计(日数量)', + 'page.instance.statistics.statusCount': '统计(状态数量)', + 'page.instance.faults': '错误', + 'page.instance.faults.latest': '最新错误', + 'page.instance.list.latestOfCount': '最新{number}条', + 'page.instance.list.groupBy': '分组:', + 'page.instance.list.groupBy.time': '时间', + 'page.instance.list.groupBy.duration': '耗时', + 'page.instance.list.groupBy.error': '错误', + 'page.instance.list.groupBy.running': '运行中', + 'page.instance.list.groupBy.suspended': '挂起', // 'page.workflowgroup.field.name': '名称', 'page.workflowgroup.field.description': '描述', diff --git a/src/Passingwind.ElsaDesigner/src/pages/dashboard/index.tsx b/src/Passingwind.ElsaDesigner/src/pages/dashboard/index.tsx index d36a5b5..1e7caff 100644 --- a/src/Passingwind.ElsaDesigner/src/pages/dashboard/index.tsx +++ b/src/Passingwind.ElsaDesigner/src/pages/dashboard/index.tsx @@ -25,7 +25,7 @@ const Index: React.FC = () => { useEffect(() => { const load = async () => { - const result = await getWorkflowInstanceStatusCountStatistics(); + const result = await getWorkflowInstanceStatusCountStatistics({}); setAllStatusStatisticsCount(result); }; diff --git a/src/Passingwind.ElsaDesigner/src/pages/definition/detail.tsx b/src/Passingwind.ElsaDesigner/src/pages/definition/detail.tsx index fa5e4ae..9d09623 100644 --- a/src/Passingwind.ElsaDesigner/src/pages/definition/detail.tsx +++ b/src/Passingwind.ElsaDesigner/src/pages/definition/detail.tsx @@ -1,4 +1,3 @@ -import type { API } from '@/services/typings'; import { getWorkflowDefinition, getWorkflowDefinitionDefinition, @@ -7,15 +6,27 @@ import { getWorkflowDefinitionVersions, updateWorkflowDefinitionVariables, } from '@/services/WorkflowDefinition'; +import { + getWorkflowInstanceFaultsByWorkflowDefinition, + getWorkflowInstanceList, + getWorkflowInstanceStatusCountStatistics, + getWorkflowInstanceStatusDateCountStatistics, +} from '@/services/WorkflowInstance'; +import { WorkflowInstanceStatus, WorkflowPersistenceBehavior } from '@/services/enums'; +import type { API } from '@/services/typings'; +import { Line, Pie } from '@ant-design/charts'; import { DownOutlined } from '@ant-design/icons'; +import { ProDescriptions, ProTable } from '@ant-design/pro-components'; import { PageContainer } from '@ant-design/pro-layout'; -import { Button, Card, Dropdown, Modal, Space, Tag, message } from 'antd'; +import { Alert, Button, Card, Col, Dropdown, Modal, Row, Space, Tag, message } from 'antd'; +import moment from 'moment'; import React, { useEffect, useRef } from 'react'; -import { useAccess, useHistory, useIntl, useParams } from 'umi'; +import { Access, Link, useAccess, useHistory, useIntl, useParams } from 'umi'; import type { FlowActionType } from '../designer/flow'; import Flow from '../designer/flow'; import { conventToGraphData } from '../designer/service'; import type { IGraphData } from '../designer/type'; +import { workflowStatusEnum } from '../instance/status'; import './detail.less'; import VariableForm from './variableForm'; @@ -33,11 +44,22 @@ const Index: React.FC = () => { const [versionData, setVersionData] = React.useState(); const [loading, setLoading] = React.useState(false); const [graphData, setGraphData] = React.useState(); - const [versionList, setVersionList] = React.useState( [], ); + const [topListLoading, setTopListLoading] = React.useState(false); + const [topList, setTopList] = React.useState(); + const [topListGroup, setTopListGroup] = React.useState('time'); + + const [statisticsLoading, setStatisticsLoading] = React.useState(false); + const [statisticsDateCountData, setStatisticsDateCountData] = React.useState([]); + const [statisticsStatusCountData, setStatisticsStatusCountData] = + React.useState(); + + const [errorListLoading, setErrorListLoading] = React.useState(false); + const [errorList, setErrorList] = React.useState(); + const [variableEditModalVisible, setVariableEditModalVisible] = React.useState(); const [variableData, setVariableData] = React.useState(); @@ -116,7 +138,84 @@ const Index: React.FC = () => { return result != null; }; + const loadTopList = async (category: string) => { + setTopListLoading(true); + setTopListGroup(category); + let status = null; + let sorting: string = 'id desc'; + if (category == 'error') status = WorkflowInstanceStatus.Faulted; + else if (category == 'running') status = WorkflowInstanceStatus.Running; + else if (category == 'suspended') status = WorkflowInstanceStatus.Suspended; + else if (category == 'duration') { + sorting = 'finishedDuration desc'; + } + + const list = await getWorkflowInstanceList({ + workflowDefinitionId: id, + workflowStatus: status, + sorting: sorting, + skipCount: 0, + maxResultCount: 10, + }); + + setTopListLoading(false); + setTopList(list?.items ?? []); + }; + + const loadStatistics = async () => { + setStatisticsLoading(true); + const tz = moment().utcOffset() / 60; + const dateCountList = await getWorkflowInstanceStatusDateCountStatistics({ + workflowDefinitionId: id, + tz: tz, + datePeriod: 7, + }); + const list = (dateCountList?.items ?? []).map((x) => { + return { + date: moment(x.date).format('MM-DD'), + count: x.finishedCount, + type: 'Finished', + }; + }); + list.push( + ...(dateCountList?.items ?? []).map((x) => { + return { + date: moment(x.date).format('MM-DD'), + count: x.failedCount, + type: 'Failed', + }; + }), + ); + + setStatisticsDateCountData(list); + + const statusCountList = await getWorkflowInstanceStatusCountStatistics({ + workflowDefinitionId: id, + }); + setStatisticsStatusCountData(statusCountList); + setStatisticsLoading(false); + }; + + const loadErrors = async () => { + setErrorListLoading(true); + const list = await getWorkflowInstanceFaultsByWorkflowDefinition(id!, { + maxResultCount: 5, + }); + setErrorList(list?.items ?? []); + setErrorListLoading(false); + }; + + useEffect(() => { + if (!id) return; + if (access['ElsaWorkflow.Instances.Statistics']) { + loadTopList('time'); + loadStatistics(); + loadErrors(); + } + }, [id]); + useEffect(() => { + // @ts-ignore const sid = params.id ?? ''; if (!sid) { history.goBack(); @@ -142,9 +241,22 @@ const Index: React.FC = () => { > {intl.formatMessage({ id: 'page.definition.designer' })} + + ) : ( + <> + )} + + } + > +