2025-07-26 13:35:53 +08:00
|
|
|
|
using DMS.Core.Enums;
|
2025-07-24 15:07:03 +08:00
|
|
|
|
using DMS.Core.Interfaces.Repositories;
|
2025-07-21 22:02:42 +08:00
|
|
|
|
using DMS.Core.Models;
|
2025-07-21 23:04:28 +08:00
|
|
|
|
using DMS.Infrastructure.Configurations;
|
2025-07-21 22:02:42 +08:00
|
|
|
|
using DMS.Infrastructure.Data;
|
|
|
|
|
|
using DMS.Infrastructure.Entities;
|
2025-09-04 17:29:24 +08:00
|
|
|
|
using Microsoft.Extensions.Logging;
|
2025-07-21 22:02:42 +08:00
|
|
|
|
using SqlSugar;
|
|
|
|
|
|
|
2025-07-24 15:07:03 +08:00
|
|
|
|
namespace DMS.Infrastructure.Repositories;
|
2025-07-21 22:02:42 +08:00
|
|
|
|
|
2025-07-24 19:58:34 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 初始化仓储实现类,负责数据库表和索引的初始化以及默认菜单的创建。
|
|
|
|
|
|
/// 实现 <see cref="IInitializeRepository"/> 接口。
|
|
|
|
|
|
/// </summary>
|
2025-07-24 15:07:03 +08:00
|
|
|
|
public class InitializeRepository : IInitializeRepository
|
2025-07-21 22:02:42 +08:00
|
|
|
|
{
|
|
|
|
|
|
private readonly SqlSugarDbContext _dbContext;
|
|
|
|
|
|
private readonly SqlSugarClient _db;
|
2025-09-04 17:29:24 +08:00
|
|
|
|
private readonly ILogger<InitializeRepository> _logger;
|
2025-07-21 22:02:42 +08:00
|
|
|
|
|
2025-07-24 19:58:34 +08:00
|
|
|
|
/// <summary>
|
2025-09-04 17:29:24 +08:00
|
|
|
|
/// 构造函数,注入 SqlSugarDbContext 和 ILogger。
|
2025-07-24 19:58:34 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="dbContext">SqlSugar 数据库上下文,用于数据库操作。</param>
|
2025-09-04 17:29:24 +08:00
|
|
|
|
/// <param name="logger">日志记录器实例。</param>
|
|
|
|
|
|
public InitializeRepository(SqlSugarDbContext dbContext, ILogger<InitializeRepository> logger)
|
2025-07-21 22:02:42 +08:00
|
|
|
|
{
|
|
|
|
|
|
_dbContext = dbContext;
|
2025-07-26 16:32:01 +08:00
|
|
|
|
_db = _dbContext.GetInstance();
|
2025-09-04 17:29:24 +08:00
|
|
|
|
_logger = logger;
|
2025-07-21 22:02:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-24 19:58:34 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 初始化所有数据库表。
|
|
|
|
|
|
/// 如果表不存在,则会创建。
|
|
|
|
|
|
/// </summary>
|
2025-07-21 22:02:42 +08:00
|
|
|
|
public void InitializeTables()
|
|
|
|
|
|
{
|
2025-07-24 19:58:34 +08:00
|
|
|
|
_db.DbMaintenance.CreateDatabase(); // 创建数据库(如果不存在)
|
2025-07-21 22:02:42 +08:00
|
|
|
|
_db.CodeFirst.InitTables<DbDevice>();
|
|
|
|
|
|
_db.CodeFirst.InitTables<DbVariableTable>();
|
|
|
|
|
|
_db.CodeFirst.InitTables<DbVariable>();
|
|
|
|
|
|
_db.CodeFirst.InitTables<DbVariableHistory>();
|
|
|
|
|
|
_db.CodeFirst.InitTables<DbUser>();
|
|
|
|
|
|
_db.CodeFirst.InitTables<DbMqttServer>();
|
|
|
|
|
|
_db.CodeFirst.InitTables<DbVariableMqttAlias>();
|
|
|
|
|
|
_db.CodeFirst.InitTables<DbMenu>();
|
|
|
|
|
|
}
|
2025-07-26 16:32:01 +08:00
|
|
|
|
|
2025-07-24 19:58:34 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 初始化数据库表索引。
|
|
|
|
|
|
/// 为特定表的列创建唯一索引,以提高查询效率和数据完整性。
|
|
|
|
|
|
/// </summary>
|
2025-07-21 22:02:42 +08:00
|
|
|
|
public void InitializeTableIndex()
|
|
|
|
|
|
{
|
2025-07-24 19:58:34 +08:00
|
|
|
|
// 为 DbDevice 表创建索引
|
2025-07-26 16:32:01 +08:00
|
|
|
|
_db.DbMaintenance.CreateIndex(nameof(DbDevice), new[]
|
|
|
|
|
|
{
|
|
|
|
|
|
nameof(DbDevice.Name),
|
|
|
|
|
|
nameof(DbDevice.OpcUaServerUrl),
|
|
|
|
|
|
}, true);
|
|
|
|
|
|
|
2025-07-24 19:58:34 +08:00
|
|
|
|
// 为 DbVariable 表创建索引
|
2025-07-26 16:32:01 +08:00
|
|
|
|
_db.DbMaintenance.CreateIndex(nameof(DbVariable), new[]
|
|
|
|
|
|
{
|
|
|
|
|
|
nameof(DbVariable.OpcUaNodeId)
|
|
|
|
|
|
}, true);
|
2025-07-24 19:58:34 +08:00
|
|
|
|
// 为 DbMqttServer 表创建索引
|
2025-07-26 16:32:01 +08:00
|
|
|
|
_db.DbMaintenance.CreateIndex(nameof(DbMqttServer), new[]
|
|
|
|
|
|
{
|
|
|
|
|
|
nameof(DbMqttServer.ServerName)
|
|
|
|
|
|
}, true);
|
2025-07-21 22:02:42 +08:00
|
|
|
|
}
|
2025-07-21 23:04:28 +08:00
|
|
|
|
|
2025-07-24 19:58:34 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 检查数据库中是否存在指定的表。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="tableName">要检查的表名。</param>
|
|
|
|
|
|
/// <returns>如果表存在则为 true,否则为 false。</returns>
|
2025-07-21 23:04:28 +08:00
|
|
|
|
public bool IsAnyTable(string tableName)
|
|
|
|
|
|
{
|
2025-07-26 16:32:01 +08:00
|
|
|
|
return _db.DbMaintenance.IsAnyTable(tableName, false);
|
2025-07-21 23:04:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-24 19:58:34 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 检查数据库中是否存在指定的索引。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="indexName">要检查的索引名。</param>
|
|
|
|
|
|
/// <returns>如果索引存在则为 true,否则为 false。</returns>
|
2025-07-21 23:04:28 +08:00
|
|
|
|
public bool IsAnyIndex(string indexName)
|
|
|
|
|
|
{
|
2025-07-26 16:32:01 +08:00
|
|
|
|
return _db.DbMaintenance.IsAnyIndex(indexName);
|
2025-07-21 23:04:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-24 19:58:34 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 初始化默认菜单。
|
2025-07-26 13:35:53 +08:00
|
|
|
|
/// 如果数据库中没有菜单,则添加一组默认菜单项。
|
2025-07-24 19:58:34 +08:00
|
|
|
|
/// </summary>
|
2025-07-21 22:02:42 +08:00
|
|
|
|
public void InitializeMenus()
|
|
|
|
|
|
{
|
2025-07-26 13:35:53 +08:00
|
|
|
|
// 检查数据库中是否已存在菜单数据
|
2025-07-26 16:32:01 +08:00
|
|
|
|
if (_db.Queryable<DbMenu>()
|
|
|
|
|
|
.Any())
|
2025-07-21 22:02:42 +08:00
|
|
|
|
{
|
2025-07-26 13:35:53 +08:00
|
|
|
|
return; // 如果数据库中已经有菜单,则不进行初始化
|
2025-07-21 22:02:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-26 13:35:53 +08:00
|
|
|
|
// 创建默认菜单项的 DbMenu 实体列表
|
|
|
|
|
|
var defaultMenus = new List<DbMenu>
|
2025-07-26 16:32:01 +08:00
|
|
|
|
{
|
|
|
|
|
|
new DbMenu
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = 1, Header = "主页", Icon = "\uE80F", ParentId = 0,
|
|
|
|
|
|
MenuType = MenuType.MainMenu, TargetViewKey = "HomeView", DisplayOrder = 1
|
|
|
|
|
|
},
|
|
|
|
|
|
new DbMenu
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = 2, Header = "设备", Icon = "\uE975", ParentId = 0,
|
|
|
|
|
|
MenuType = MenuType.MainMenu, TargetViewKey = "DevicesView",
|
|
|
|
|
|
DisplayOrder = 2
|
|
|
|
|
|
},
|
|
|
|
|
|
new DbMenu
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = 3, Header = "数据转换", Icon = "\uF1CB", ParentId = 0,
|
|
|
|
|
|
MenuType = MenuType.MainMenu, TargetViewKey = "DataTransformView",
|
|
|
|
|
|
DisplayOrder = 3
|
|
|
|
|
|
},
|
|
|
|
|
|
new DbMenu
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = 4, Header = "Mqtt服务器", Icon = "\uE753", ParentId = 0,
|
|
|
|
|
|
MenuType = MenuType.MainMenu, TargetViewKey = "MqttsView",
|
|
|
|
|
|
DisplayOrder = 4
|
|
|
|
|
|
},
|
|
|
|
|
|
new DbMenu
|
|
|
|
|
|
{
|
2025-09-07 19:48:48 +08:00
|
|
|
|
Id = 5, Header = "日志历史", Icon = "\uE7BA", ParentId = 0,
|
|
|
|
|
|
MenuType = MenuType.MainMenu, TargetViewKey = "LogHistoryView",
|
2025-07-26 16:32:01 +08:00
|
|
|
|
DisplayOrder = 5
|
|
|
|
|
|
},
|
|
|
|
|
|
new DbMenu
|
|
|
|
|
|
{
|
2025-09-07 19:48:48 +08:00
|
|
|
|
Id = 6, Header = "设置", Icon = "\uE713", ParentId = 0,
|
|
|
|
|
|
MenuType = MenuType.MainMenu, TargetViewKey = "SettingView",
|
|
|
|
|
|
DisplayOrder = 6
|
|
|
|
|
|
},
|
|
|
|
|
|
new DbMenu
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = 7, Header = "关于", Icon = "\uE946", ParentId = 0,
|
|
|
|
|
|
MenuType = MenuType.MainMenu, TargetViewKey = "", DisplayOrder = 7
|
2025-07-26 16:32:01 +08:00
|
|
|
|
} // 假设有一个AboutView
|
|
|
|
|
|
};
|
2025-07-21 22:02:42 +08:00
|
|
|
|
|
2025-07-26 13:35:53 +08:00
|
|
|
|
// 批量插入菜单到数据库
|
2025-07-26 16:32:01 +08:00
|
|
|
|
_db.Insertable(defaultMenus)
|
|
|
|
|
|
.ExecuteCommand();
|
2025-07-21 22:02:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|