You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
655 lines
30 KiB
C#
655 lines
30 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using Haoliang.Data.Entities;
|
|
using Haoliang.Models.System;
|
|
using Haoliang.Models.User;
|
|
|
|
namespace Haoliang.Data
|
|
{
|
|
public static class DataSeeder
|
|
{
|
|
public static async Task SeedDataAsync(IServiceProvider serviceProvider)
|
|
{
|
|
using (var scope = serviceProvider.CreateScope())
|
|
{
|
|
var context = scope.ServiceProvider.GetRequiredService<CNCBusinessDbContext>();
|
|
var logger = scope.ServiceProvider.GetService<Microsoft.Extensions.Logging.ILogger<DataSeeder>>();
|
|
|
|
try
|
|
{
|
|
logger.LogInformation("Starting database seed process...");
|
|
|
|
// Apply any pending migrations
|
|
await context.Database.MigrateAsync();
|
|
|
|
// Seed roles
|
|
await SeedRolesAsync(context);
|
|
|
|
// Seed users
|
|
await SeedUsersAsync(context);
|
|
|
|
// Seed permissions
|
|
await SeedPermissionsAsync(context);
|
|
|
|
// seed system configurations
|
|
await SeedSystemConfigsAsync(context);
|
|
|
|
// seed alarm rules
|
|
await SeedAlarmRulesAsync(context);
|
|
|
|
// seed device templates
|
|
await SeedDeviceTemplatesAsync(context);
|
|
|
|
logger.LogInformation("Database seed process completed successfully.");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.LogError(ex, "Error occurred during database seed process.");
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static async Task SeedRolesAsync(CNCBusinessDbContext context)
|
|
{
|
|
if (!await context.Roles.AnyAsync())
|
|
{
|
|
var roles = new List<Role>
|
|
{
|
|
new Role
|
|
{
|
|
RoleName = "Administrator",
|
|
Description = "System administrators with full access",
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new Role
|
|
{
|
|
RoleName = "Manager",
|
|
Description = "Department managers with access to reporting and device management",
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new Role
|
|
{
|
|
RoleName = "Operator",
|
|
Description = "Device operators with access to daily operations",
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new Role
|
|
{
|
|
RoleName = "Viewer",
|
|
Description = "Read-only access to system data",
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
}
|
|
};
|
|
|
|
await context.Roles.AddRangeAsync(roles);
|
|
await context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
private static async Task SeedUsersAsync(CNCBusinessDbContext context)
|
|
{
|
|
if (!await context.Users.AnyAsync())
|
|
{
|
|
// Create default admin user
|
|
var adminRole = await context.Roles.FirstOrDefaultAsync(r => r.RoleName == "Administrator");
|
|
if (adminRole != null)
|
|
{
|
|
var adminUser = new User
|
|
{
|
|
Username = "admin",
|
|
Email = "admin@cncsystem.com",
|
|
PasswordHash = BCrypt.Net.BCrypt.HashPassword("Admin@123"),
|
|
FirstName = "System",
|
|
LastName = "Administrator",
|
|
RoleId = adminRole.RoleId,
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
};
|
|
|
|
await context.Users.AddAsync(adminUser);
|
|
await context.SaveChangesAsync();
|
|
}
|
|
|
|
// Create default manager user
|
|
var managerRole = await context.Roles.FirstOrDefaultAsync(r => r.RoleName == "Manager");
|
|
if (managerRole != null)
|
|
{
|
|
var managerUser = new User
|
|
{
|
|
Username = "manager",
|
|
Email = "manager@cncsystem.com",
|
|
PasswordHash = BCrypt.Net.BCrypt.HashPassword("Manager@123"),
|
|
FirstName = "John",
|
|
LastName = "Doe",
|
|
Department = "Production",
|
|
RoleId = managerRole.RoleId,
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
};
|
|
|
|
await context.Users.AddAsync(managerUser);
|
|
await context.SaveChangesAsync();
|
|
}
|
|
|
|
// Create default operator user
|
|
var operatorRole = await context.Roles.FirstOrDefaultAsync(r => r.RoleName == "Operator");
|
|
if (operatorRole != null)
|
|
{
|
|
var operatorUser = new User
|
|
{
|
|
Username = "operator",
|
|
Email = "operator@cncsystem.com",
|
|
PasswordHash = BCrypt.Net.BCrypt.HashPassword("Operator@123"),
|
|
FirstName = "Jane",
|
|
LastName = "Smith",
|
|
Department = "Production",
|
|
RoleId = operatorRole.RoleId,
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
};
|
|
|
|
await context.Users.AddAsync(operatorUser);
|
|
await context.SaveChangesAsync();
|
|
}
|
|
}
|
|
}
|
|
|
|
private static async Task SeedPermissionsAsync(CNCBusinessDbContext context)
|
|
{
|
|
if (!await context.Permissions.AnyAsync())
|
|
{
|
|
var permissions = new List<Permission>
|
|
{
|
|
// Device Management
|
|
new Permission { PermissionName = "devices.create", Description = "Create new devices", Category = "Device" },
|
|
new Permission { PermissionName = "devices.read", Description = "View device information", Category = "Device" },
|
|
new Permission { PermissionName = "devices.update", Description = "Update device information", Category = "Device" },
|
|
new Permission { PermissionName = "devices.delete", Description = "Delete devices", Category = "Device" },
|
|
new Permission { PermissionName = "devices.control", Description = "Control device operations", Category = "Device" },
|
|
|
|
// Production Management
|
|
new Permission { PermissionName = "production.create", Description = "Create production records", Category = "Production" },
|
|
new Permission { PermissionName = "production.read", Description = "View production data", Category = "Production" },
|
|
new Permission { PermissionName = "production.update", Description = "Update production records", Category = "Production" },
|
|
new Permission { PermissionName = "production.delete", Description = "Delete production records", Category = "Production" },
|
|
new Permission { PermissionName = "production.analyze", Description = "Analyze production data", Category = "Production" },
|
|
|
|
// Alarm Management
|
|
new Permission { PermissionName = "alarms.create", Description = "Create alarms", Category = "Alarm" },
|
|
new Permission { PermissionName = "alarms.read", Description = "View alarms", Category = "Alarm" },
|
|
new Permission { PermissionName = "alarms.update", Description = "Update alarms", Category = "Alarm" },
|
|
new Permission { PermissionName = "alarms.delete", Description = "Delete alarms", Category = "Alarm" },
|
|
new Permission { PermissionName = "alarms.resolve", Description = "Resolve alarms", Category = "Alarm" },
|
|
|
|
// Template Management
|
|
new Permission { PermissionName = "templates.create", Description = "Create templates", Category = "Template" },
|
|
new Permission { PermissionName = "templates.read", Description = "View templates", Category = "Template" },
|
|
new Permission { PermissionName = "templates.update", Description = "Update templates", Category = "Template" },
|
|
new Permission { PermissionName = "templates.delete", Description = "Delete templates", Category = "Template" },
|
|
|
|
// System Management
|
|
new Permission { PermissionName = "system.config", Description = "Manage system configuration", Category = "System" },
|
|
new Permission { PermissionName = "system.logs", Description = "View system logs", Category = "System" },
|
|
new Permission { PermissionName = "system.users", Description = "Manage users", Category = "System" },
|
|
new Permission { PermissionName = "system.roles", Description = "Manage roles", Category = "System" },
|
|
new Permission { PermissionName = "system.backup", Description = "System backup operations", Category = "System" },
|
|
|
|
// Real-time Monitoring
|
|
new Permission { PermissionName = "monitoring.live", Description = "View real-time monitoring", Category = "Monitoring" },
|
|
new Permission { PermissionName = "monitoring.history", Description = "View monitoring history", Category = "Monitoring" },
|
|
new Permission { PermissionName = "monitoring.export", Description = "Export monitoring data", Category = "Monitoring" },
|
|
|
|
// Reports
|
|
new Permission { PermissionName = "reports.generate", Description = "Generate reports", Category = "Reporting" },
|
|
new Permission { PermissionName = "reports.view", Description = "View reports", Category = "Reporting" },
|
|
new Permission { PermissionName = "reports.export", Description = "Export reports", Category = "Reporting" },
|
|
|
|
// API Access
|
|
new Permission { PermissionName = "api.access", Description = "Access API endpoints", Category = "API" },
|
|
new Permission { PermissionName = "api.admin", Description = "Admin API access", Category = "API" }
|
|
};
|
|
|
|
await context.Permissions.AddRangeAsync(permissions);
|
|
await context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
private static async Task SeedSystemConfigsAsync(CNCBusinessDbContext context)
|
|
{
|
|
if (!await context.SystemConfigs.AnyAsync())
|
|
{
|
|
var configs = new List<SystemConfig>
|
|
{
|
|
// Application Settings
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "app.name",
|
|
ConfigValue = "CNC Machine Monitoring System",
|
|
Description = "Application name",
|
|
Category = "Application",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "app.version",
|
|
ConfigValue = "1.0.0",
|
|
Description = "Application version",
|
|
Category = "Application",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
|
|
// Collection Settings
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "collection.interval",
|
|
ConfigValue = "30",
|
|
Description = "Default collection interval in seconds",
|
|
Category = "Collection",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "collection.timeout",
|
|
ConfigValue = "10",
|
|
Description = "Collection timeout in seconds",
|
|
Category = "Collection",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "collection.retry.attempts",
|
|
ConfigValue = "3",
|
|
Description = "Number of retry attempts for failed collections",
|
|
Category = "Collection",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
|
|
// Alert Settings
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "alert.email.enabled",
|
|
ConfigValue = "true",
|
|
Description = "Enable email alerts",
|
|
Category = "Alert",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "alert.sms.enabled",
|
|
ConfigValue = "false",
|
|
Description = "Enable SMS alerts",
|
|
Category = "Alert",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "alert.wechat.enabled",
|
|
ConfigValue = "false",
|
|
Description = "Enable WeChat alerts",
|
|
Category = "Alert",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
|
|
// Data Retention
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "data.retention.days",
|
|
ConfigValue = "90",
|
|
Description = "Data retention period in days",
|
|
Category = "Data",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "log.retention.days",
|
|
ConfigValue = "30",
|
|
Description = "Log retention period in days",
|
|
Category = "Data",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
|
|
// Authentication
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "auth.session.timeout",
|
|
ConfigValue = "60",
|
|
Description = "Session timeout in minutes",
|
|
Category = "Authentication",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "auth.max.login.attempts",
|
|
ConfigValue = "5",
|
|
Description = "Maximum login attempts before lockout",
|
|
Category = "Authentication",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
|
|
// Performance
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "performance.cache.enabled",
|
|
ConfigValue = "true",
|
|
Description = "Enable caching",
|
|
Category = "Performance",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new SystemConfig
|
|
{
|
|
ConfigKey = "performance.cache.duration",
|
|
ConfigValue = "10",
|
|
Description = "Cache duration in minutes",
|
|
Category = "Performance",
|
|
IsActive = true,
|
|
IsDefault = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
}
|
|
};
|
|
|
|
await context.SystemConfigs.AddRangeAsync(configs);
|
|
await context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
private static async Task SeedAlarmRulesAsync(CNCBusinessDbContext context)
|
|
{
|
|
if (!await context.AlarmRules.AnyAsync())
|
|
{
|
|
var alarmRules = new List<AlarmRule>
|
|
{
|
|
new AlarmRule
|
|
{
|
|
RuleName = "Device Offline",
|
|
DeviceId = null, // Apply to all devices
|
|
AlarmType = "DeviceOffline",
|
|
Condition = "device_offline",
|
|
Threshold = "",
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new AlarmRule
|
|
{
|
|
RuleName = "High Temperature",
|
|
DeviceId = null, // Apply to all devices
|
|
AlarmType = "DeviceError",
|
|
Condition = "temperature > 100",
|
|
Threshold = "100",
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new AlarmRule
|
|
{
|
|
RuleName = "Low Production Rate",
|
|
DeviceId = null, // Apply to all devices
|
|
AlarmType = "ProductionError",
|
|
Condition = "production_rate < 10",
|
|
Threshold = "10",
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new AlarmRule
|
|
{
|
|
RuleName = "System Error",
|
|
DeviceId = null, // Apply to all devices
|
|
AlarmType = "SystemError",
|
|
Condition = "system_error > 0",
|
|
Threshold = "0",
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
}
|
|
};
|
|
|
|
await context.AlarmRules.AddRangeAsync(alarmRules);
|
|
await context.SaveChangesAsync();
|
|
}
|
|
}
|
|
|
|
private static async Task SeedDeviceTemplatesAsync(CNCBusinessDbContext context)
|
|
{
|
|
if (!await context.CNCTemplates.AnyAsync())
|
|
{
|
|
var templates = new List<CNCBrandTemplate>
|
|
{
|
|
new CNCBrandTemplate
|
|
{
|
|
TemplateName = "Fanuc Standard",
|
|
BrandName = "Fanuc",
|
|
Version = "1.0",
|
|
Description = "Standard template for Fanuc CNC machines",
|
|
TagsJson = @"[
|
|
{
|
|
""systemTagId"": ""_io_status"",
|
|
""deviceTagId"": ""_io_status"",
|
|
""dataType"": ""int"",
|
|
""isRequired"": true,
|
|
""validationRegex"": """",
|
|
""description"": ""Input/Output status""
|
|
},
|
|
{
|
|
""systemTagId"": ""Tag5"",
|
|
""deviceTagId"": ""Tag5"",
|
|
""dataType"": ""string"",
|
|
""isRequired"": true,
|
|
""validationRegex"": """",
|
|
""description"": ""NC program name""
|
|
},
|
|
{
|
|
""systemTagId"": ""Tag8"",
|
|
""deviceTagId"": ""Tag8"",
|
|
""dataType"": ""int"",
|
|
""isRequired"": true,
|
|
""validationRegex"": """",
|
|
""description"": ""Cumulative count""
|
|
},
|
|
{
|
|
""systemTagId"": ""Tag9"",
|
|
""deviceTagId"": ""Tag9"",
|
|
""dataType"": ""int"",
|
|
""isRequired"": true,
|
|
""validationRegex"": """",
|
|
""description"": ""Run status""
|
|
},
|
|
{
|
|
""systemTagId"": ""Tag11"",
|
|
""deviceTagId"": ""Tag11"",
|
|
""dataType"": ""string"",
|
|
""isRequired"": false,
|
|
""validationRegex"": """",
|
|
""description"": ""Operating mode""
|
|
},
|
|
{
|
|
""systemTagId"": ""Tag14"",
|
|
""deviceTagId"": ""Tag14"",
|
|
""dataType"": ""int"",
|
|
""isRequired"": false,
|
|
""validationRegex"": """",
|
|
""description"": ""Spindle override""
|
|
}
|
|
]",
|
|
DataProcessingRulesJson = @"[
|
|
{
|
|
""ruleName"": ""Production Calculation"",
|
|
""condition"": ""Tag9 == 1 && Tag8 > 0"",
|
|
""action"": ""calculate_production""
|
|
},
|
|
{
|
|
""ruleName"": ""Status Update"",
|
|
""condition"": ""_io_status == 1"",
|
|
""action"": ""set_running""
|
|
}
|
|
]",
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new CNCBrandTemplate
|
|
{
|
|
TemplateName = "Mitsubishi Standard",
|
|
BrandName = "Mitsubishi",
|
|
Version = "1.0",
|
|
Description = "Standard template for Mitsubishi CNC machines",
|
|
TagsJson = @"[
|
|
{
|
|
""systemTagId"": ""_io_status"",
|
|
""deviceTagId"": ""_io_status"",
|
|
""dataType"": ""int"",
|
|
""isRequired"": true,
|
|
""validationRegex"": """",
|
|
""description"": ""Input/Output status""
|
|
},
|
|
{
|
|
""systemTagId"": ""ProgramName"",
|
|
""deviceTagId"": ""ProgramName"",
|
|
""dataType"": ""string"",
|
|
""isRequired"": true,
|
|
""validationRegex"": """",
|
|
""description"": ""NC program name""
|
|
},
|
|
{
|
|
""systemTagId"": ""TotalCount"",
|
|
""deviceTagId"": ""TotalCount"",
|
|
""dataType"": ""int"",
|
|
""isRequired"": true,
|
|
""validationRegex"": """",
|
|
""description"": ""Total production count""
|
|
},
|
|
{
|
|
""systemTagId"": ""RunStatus"",
|
|
""deviceTagId"": ""RunStatus"",
|
|
""dataType"": ""int"",
|
|
""isRequired"": true,
|
|
""validationRegex"": """",
|
|
""description"": ""Running status""
|
|
}
|
|
]",
|
|
DataProcessingRulesJson = @"[
|
|
{
|
|
""ruleName"": ""Production Calculation"",
|
|
""condition"": ""RunStatus == 1 && TotalCount > 0"",
|
|
""action"": ""calculate_production""
|
|
}
|
|
]",
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
},
|
|
new CNCBrandTemplate
|
|
{
|
|
TemplateName = "Siemens Standard",
|
|
BrandName = "Siemens",
|
|
Version = "1.0",
|
|
Description = "Standard template for Siemens CNC machines",
|
|
TagsJson = @"[
|
|
{
|
|
""systemTagId"": ""ChannelState"",
|
|
""deviceTagId"": ""ChannelState"",
|
|
""dataType"": ""int"",
|
|
""isRequired"": true,
|
|
""validationRegex"": """",
|
|
""description"": ""Channel state""
|
|
},
|
|
{
|
|
""systemTagId"": ""ProgramName"",
|
|
""deviceTagId"": ""ProgramName"",
|
|
""dataType"": ""string"",
|
|
""isRequired"": true,
|
|
""validationRegex"": """",
|
|
""description"": ""Program name""
|
|
},
|
|
{
|
|
""systemTagId"": ""PartCount"",
|
|
""deviceTagId"": ""PartCount"",
|
|
""dataType"": ""int"",
|
|
""isRequired"": true,
|
|
""validationRegex"": """",
|
|
""description"": ""Part count""
|
|
},
|
|
{
|
|
""systemTagId"": ""MachineState"",
|
|
""deviceTagId"": ""MachineState"",
|
|
""dataType"": ""int"",
|
|
""isRequired"": true,
|
|
""validationRegex"": """",
|
|
""description"": ""Machine state""
|
|
}
|
|
]",
|
|
DataProcessingRulesJson = @"[
|
|
{
|
|
""ruleName"": ""Production Calculation"",
|
|
""condition"": ""MachineState == 4 && PartCount > 0"",
|
|
""action"": ""calculate_production""
|
|
}
|
|
]",
|
|
IsActive = true,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
}
|
|
};
|
|
|
|
await context.CNCTemplates.AddRangeAsync(templates);
|
|
await context.SaveChangesAsync();
|
|
}
|
|
}
|
|
}
|
|
} |