From 8325717b95f8acb02fd0e32a26f7dbbbb3a26880 Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Fri, 4 Jul 2025 18:33:48 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=86=99=E4=BA=86=E5=A2=9E=E5=88=A0?= =?UTF-8?q?=E6=94=B9=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Data/Repositories/DeviceRepository.cs | 171 ++++++++++++++------- Data/Repositories/MenuRepository.cs | 163 +++++++++----------- Data/Repositories/VarDataRepository.cs | 196 ++++++++++++++++++++---- Data/Repositories/VarTableRepository.cs | 108 ++++++++++--- Helper/DataServicesHelper.cs | 31 ++-- ViewModels/DevicesViewModel.cs | 32 ++-- ViewModels/MainViewModel.cs | 22 +-- ViewModels/VariableTableViewModel.cs | 12 +- Views/DevicesView.xaml | 114 +++++++++++--- 9 files changed, 589 insertions(+), 260 deletions(-) diff --git a/Data/Repositories/DeviceRepository.cs b/Data/Repositories/DeviceRepository.cs index 739c601..749260f 100644 --- a/Data/Repositories/DeviceRepository.cs +++ b/Data/Repositories/DeviceRepository.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using iNKORE.UI.WPF.Modern.Common.IconKeys; using NLog; using PMSWPF.Data.Entities; using PMSWPF.Enums; @@ -33,14 +34,29 @@ public class DeviceRepository stopwatch.Start(); using (var db = DbContext.GetInstance()) { - var result = await db.Updateable(device.CopyTo()) - .ExecuteCommandAsync(); + var result = await Edit(device, db); stopwatch.Stop(); Logger.Info($"编辑设备 '{device.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } } + /// + /// 编辑设备信息。支持事务 + /// + /// 要编辑的设备对象。 + /// 受影响的行数。 + public async Task Edit(Device device, SqlSugarClient db) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + var result = await db.Updateable(device.CopyTo()) + .ExecuteCommandAsync(); + stopwatch.Stop(); + Logger.Info($"编辑设备 '{device.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; + } + /// /// 获取设备列表 @@ -54,7 +70,7 @@ public class DeviceRepository stopwatch.Start(); var dlist = await db.Queryable() .Includes(d => d.VariableTables, dv => dv.Device) - .Includes(d => d.VariableTables, dvd => dvd.DataVariables ,data=>data.VariableTable) + .Includes(d => d.VariableTables, dvd => dvd.DataVariables, data => data.VariableTable) .ToListAsync(); var devices = new List(); foreach (var dbDevice in dlist) @@ -62,6 +78,7 @@ public class DeviceRepository var device = dbDevice.CopyTo(); devices.Add(device); } + stopwatch.Stop(); Logger.Info($"加载设备列表总耗时:{stopwatch.ElapsedMilliseconds}ms"); @@ -81,37 +98,79 @@ public class DeviceRepository using (var db = DbContext.GetInstance()) { var result = await db.Queryable() - .FirstAsync(p => p.Id == id); + .FirstAsync(p => p.Id == id); stopwatch.Stop(); Logger.Info($"根据ID '{id}' 获取设备耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } } + /// - /// 根据ID删除设备。 + /// 删除设备。 /// /// 要删除的设备ID。 /// 受影响的行数。 - public async Task DeleteById(int id) + public async Task Delete(Device device, List menus) { - Stopwatch stopwatch = new Stopwatch(); - stopwatch.Start(); using (var db = DbContext.GetInstance()) { - var result = await db.Deleteable(new DbDevice { Id = id }) - .ExecuteCommandAsync(); - stopwatch.Stop(); - Logger.Info($"删除设备ID '{id}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); - return result; + await db.BeginTranAsync(); + try + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + var res = await Delete(device, menus, db); + + stopwatch.Stop(); + Logger.Info($"删除设备:{device.Name},耗时:{stopwatch.ElapsedMilliseconds}ms"); + await db.CommitTranAsync(); + return res; + } + catch (Exception e) + { + await db.RollbackTranAsync(); + throw; + } + + return 0; } } + /// - /// 添加设备,包括菜单 + /// 删除设备。 /// /// - public async Task AddDeviceAndMenu(Device device) + /// + /// + /// 要删除的设备ID。 + /// 受影响的行数。 + public async Task Delete(Device device, List menus, SqlSugarClient db) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + var result = await db.Deleteable(new DbDevice { Id = device.Id }) + .ExecuteCommandAsync(); + // 删除变量表 + await _varTableRepository.Delete(device.VariableTables, db); + + // 删除菜单 + var menu = DataServicesHelper.FindMenusForDevice(device, menus); + if (menu == null) + throw new NullReferenceException($"没有找到设备:{device.Name},的菜单对象。"); + await _menuRepository.DeleteMenu(menu, db); + stopwatch.Stop(); + Logger.Info($"删除设备:{device.Name},耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; + } + + + /// + /// 添加设备 + /// + /// + public async Task Add(Device device) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); @@ -120,33 +179,18 @@ public class DeviceRepository { // 开启事务 await db.BeginTranAsync(); + //查询设备的名字是否存在 + + var exist = await db.Queryable() + .Where(d => d.Name == device.Name) + .FirstAsync(); + if (exist != null) + throw new InvalidOperationException("设备名称已经存在。"); + // 2. 将设备添加到数据库 var addDevice = await Add(device, db); - // 如果数据库添加失败 - if (addDevice == null) - { - string addDeviceErrorMsg = $"添加设备失败:{device.Name}"; - Logger.Error(addDeviceErrorMsg); - NotificationHelper.ShowMessage(addDeviceErrorMsg, NotificationType.Error); - return; // 提前返回 - } - // 3. 设备成功添加到数据库,进行菜单添加 - // 这里立即发出成功的通知和日志 - string addDeviceSuccessMsg = $"添加设备成功:{device.Name}"; - Logger.Info(addDeviceSuccessMsg); - NotificationHelper.ShowMessage(addDeviceSuccessMsg, NotificationType.Success); - // 4. 为新设备添加菜单 - var addDeviceMenuId = await _menuRepository.AddDeviceMenu(addDevice, db); - if (device.IsAddDefVarTable) - { - var defVarTable = await _varTableRepository.AddDeviceDefVarTable(addDevice, db); - await _menuRepository.AddDeviceDefTableMenu(device, addDeviceMenuId, defVarTable.Id, db); - } - - // 添加添加变量表的菜单 - await _menuRepository.AddVarTableMenu(addDevice, addDeviceMenuId, db); await db.CommitTranAsync(); // 菜单也添加成功,通知 UI 更新 MessageHelper.SendLoadMessage(LoadTypes.Menu); @@ -175,22 +219,41 @@ public class DeviceRepository /// /// /// - private async Task Add(Device device, SqlSugarClient db) + private async Task Add(Device device, SqlSugarClient db) { - Stopwatch stopwatch = new Stopwatch(); - stopwatch.Start(); - var exist = await db.Queryable() - .Where(d => d.Name == device.Name) - .FirstAsync(); - if (exist != null) - throw new InvalidOperationException("设备名称已经存在。"); - var dbDevice = new DbDevice(); - device.CopyTo(dbDevice); - // 是否添加默认变量表 - var result = await db.Insertable(dbDevice) - .ExecuteReturnEntityAsync(); - stopwatch.Stop(); - Logger.Info($"单独添加设备 '{device.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); - return result; + ; + // 添加设备 + var addDevice = await db.Insertable(device.CopyTo()) + .ExecuteReturnEntityAsync(); + + // 4. 为新设备添加菜单 + var addDeviceMenuId = await _menuRepository.Add(addDevice, db); + + if (device.IsAddDefVarTable) + { + // 添加默认变量表 + var varTable = new VariableTable(); + device.VariableTables = new List(); + varTable.IsActive = true; + varTable.DeviceId = addDevice.Id; + varTable.Name = "默认变量表"; + varTable.Description = "默认变量表"; + varTable.ProtocolType = device.ProtocolType; + device.VariableTables.Add(varTable); + var addVarTable = await _varTableRepository.Add(varTable, db); + // 添加添加变量表的菜单 + var varTableMenu = new MenuBean() + { + Name = "默认变量表", + Icon = SegoeFluentIcons.Tablet.Glyph, + Type = MenuType.VariableTableMenu, + ParentId = addDeviceMenuId, + DataId = addVarTable.Id + }; + await _menuRepository.Add(varTableMenu, db); + } + + await _menuRepository.AddVarTableMenu(addDevice, addDeviceMenuId, db); + return addDevice.CopyTo(); } } \ No newline at end of file diff --git a/Data/Repositories/MenuRepository.cs b/Data/Repositories/MenuRepository.cs index 7faada6..1b258cb 100644 --- a/Data/Repositories/MenuRepository.cs +++ b/Data/Repositories/MenuRepository.cs @@ -12,6 +12,7 @@ namespace PMSWPF.Data.Repositories; public class MenuRepository { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + public MenuRepository() { } @@ -22,17 +23,23 @@ public class MenuRepository stopwatch.Start(); using (var db = DbContext.GetInstance()) { - var childList = await db.Queryable().ToChildListAsync(it => it.ParentId, menu.Id); - var result = await db.Deleteable(childList).ExecuteCommandAsync(); - stopwatch.Stop(); - // Assuming NLog is available and configured for MenuRepository - // If not, you might need to add a Logger field similar to DeviceRepository - // For now, I'll assume it's available or will be added. - Logger.Info($"删除菜单 '{menu.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); - return result; + return await DeleteMenu(menu, db); } } + public async Task DeleteMenu(MenuBean menu, SqlSugarClient db) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + var childList = await db.Queryable() + .ToChildListAsync(it => it.ParentId, menu.Id); + var result = await db.Deleteable(childList) + .ExecuteCommandAsync(); + stopwatch.Stop(); + Logger.Info($"删除菜单 '{menu.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; + } + public async Task> GetMenuTrees() { Stopwatch stopwatch = new Stopwatch(); @@ -40,7 +47,8 @@ public class MenuRepository using (var db = DbContext.GetInstance()) { List menuTree = new(); - var dbMenuTree = await db.Queryable().ToTreeAsync(dm => dm.Items, dm => dm.ParentId, 0); + var dbMenuTree = await db.Queryable() + .ToTreeAsync(dm => dm.Items, dm => dm.ParentId, 0); foreach (var dbMenu in dbMenuTree) menuTree.Add(dbMenu.CopyTo()); @@ -55,95 +63,52 @@ public class MenuRepository { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); - using (var db = DbContext.GetInstance()) - { - var result = await db.Insertable(menu.CopyTo()).ExecuteCommandAsync(); - stopwatch.Stop(); - Logger.Info($"添加菜单 '{menu.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); - return result; - } + using var db = DbContext.GetInstance(); + var result = await Add(menu, db); + stopwatch.Stop(); + Logger.Info($"添加菜单 '{menu.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; } - + + /// - /// 添加默认变量表的菜单 + /// 添加菜单,支持事务 /// - /// - /// + /// /// /// - /// - public async Task AddDeviceDefTableMenu(Device device, int parentMenuId,int varTableId, SqlSugarClient db) + public async Task Add(MenuBean menu, SqlSugarClient db) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); - var defVarTableMenu = new MenuBean() - { - Name = "默认变量表", - Icon = SegoeFluentIcons.Tablet.Glyph, - Type = MenuType.VariableTableMenu, - ParentId = parentMenuId, - DataId = varTableId - }; - var defTableRes = await db.Insertable(defVarTableMenu).ExecuteCommandAsync(); + var result = await db.Insertable(menu.CopyTo()) + .ExecuteCommandAsync(); stopwatch.Stop(); - Logger.Info($"添加默认变量表菜单 '{defVarTableMenu.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); - return defTableRes; + Logger.Info($"添加菜单 '{menu.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; } - /// - /// 给设备添加默认变量表菜单 - /// - /// - /// - /// - // public async Task AddDeviceDefVarTableMenu(Device device) - // { - // var db = DbContext.GetInstance(); - // try - // { - // await db.BeginTranAsync(); - // bool result = false; - // var parentMenuId = await AddDeviceMenu(device, db); - // var defTableRes = await AddDeviceDefTableMenu(device, parentMenuId, db); - // var addTableRes = await AddVarTableMenu(parentMenuId, db); - // // if ((addTableRes + defTableRes) != 2) - // // { - // // // 如果出错删除原来添加的设备菜单 - // // await db.Deleteable().Where(m => m.Id == parentMenuId).ExecuteCommandAsync(); - // // throw new InvalidOperationException("添加默认变量表时发生了错误!!"); - // // } - // - // await db.CommitTranAsync(); - // return true; - // } - // catch (Exception e) - // { - // await db.RollbackTranAsync(); - // } - // finally - // { - // } - // } public async Task AddVarTableMenu(DbDevice dbDevice, int parentMenuId, SqlSugarClient db) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); var addVarTable = new MenuBean() - { - Name = "添加变量表", - Icon = SegoeFluentIcons.Add.Glyph, - Type = MenuType.AddVariableTableMenu, - ParentId = parentMenuId, - DataId = dbDevice.Id - }; - var addTableRes = await db.Insertable(addVarTable).ExecuteCommandAsync(); + { + Name = "添加变量表", + Icon = SegoeFluentIcons.Add.Glyph, + Type = MenuType.AddVariableTableMenu, + ParentId = parentMenuId, + DataId = dbDevice.Id + }; + var addTableRes = await db.Insertable(addVarTable) + .ExecuteCommandAsync(); stopwatch.Stop(); // Logger.Info($"添加变量表菜单 '{addVarTable.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); return addTableRes; } - + /// /// 添加设备菜单 /// @@ -151,40 +116,62 @@ public class MenuRepository /// /// /// - public async Task AddDeviceMenu(DbDevice device, SqlSugarClient db) + public async Task Add(DbDevice device, SqlSugarClient db) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); - var deviceMainMenu = await db.Queryable().FirstAsync(m => m.Name == "设备"); + var deviceMainMenu = await db.Queryable() + .FirstAsync(m => m.Name == "设备"); if (deviceMainMenu == null) throw new InvalidOperationException("没有找到设备菜单!!"); // 添加菜单项 MenuBean menu = new MenuBean() - { - Name = device.Name, - Type = MenuType.DeviceMenu, - DataId = device.Id, - Icon = SegoeFluentIcons.Devices4.Glyph, - }; + { + Name = device.Name, + Type = MenuType.DeviceMenu, + DataId = device.Id, + Icon = SegoeFluentIcons.Devices4.Glyph, + }; menu.ParentId = deviceMainMenu.Id; var addDeviceMenuId = await db.Insertable(menu.CopyTo()) - .ExecuteReturnIdentityAsync(); + .ExecuteReturnIdentityAsync(); stopwatch.Stop(); - // Logger.Info($"添加设备菜单 '{device.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + Logger.Info($"添加设备菜单 '{device.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); return addDeviceMenuId; } + /// + /// 编辑菜单 + /// + /// + /// public async Task Edit(MenuBean menu) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); using (var db = DbContext.GetInstance()) { - var result = await db.Updateable(menu.CopyTo()).ExecuteCommandAsync(); + var result = await Edit(menu, db); stopwatch.Stop(); - // Logger.Info($"编辑菜单 '{menu.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + Logger.Info($"编辑菜单 '{menu.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } } + + /// + /// 编辑菜单,支持事务 + /// + /// + /// + public async Task Edit(MenuBean menu, SqlSugarClient db) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + var result = await db.Updateable(menu.CopyTo()) + .ExecuteCommandAsync(); + stopwatch.Stop(); + Logger.Info($"编辑菜单 '{menu.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; + } } \ No newline at end of file diff --git a/Data/Repositories/VarDataRepository.cs b/Data/Repositories/VarDataRepository.cs index 6ea3d68..52136fb 100644 --- a/Data/Repositories/VarDataRepository.cs +++ b/Data/Repositories/VarDataRepository.cs @@ -5,6 +5,7 @@ using NLog; using PMSWPF.Data.Entities; using PMSWPF.Extensions; using PMSWPF.Models; +using SqlSugar; namespace PMSWPF.Data.Repositories; @@ -26,7 +27,9 @@ public class VarDataRepository stopwatch.Start(); using (var _db = DbContext.GetInstance()) { - var result = await _db.Queryable().In(id).SingleAsync(); + var result = await _db.Queryable() + .In(id) + .SingleAsync(); stopwatch.Stop(); Logger.Info($"根据ID '{id}' 获取VariableData耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; @@ -43,10 +46,30 @@ public class VarDataRepository stopwatch.Start(); using (var _db = DbContext.GetInstance()) { - var result = await _db.Queryable().Select(dbVarData => dbVarData.CopyTo()) - .ToListAsync(); + var result = await _db.Queryable() + .ToListAsync(); stopwatch.Stop(); Logger.Info($"获取所有VariableData耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result.Select(d=>d.CopyTo()).ToList(); + } + } + + /// + /// 获取所有VariableData + /// + /// + public async Task> GetByVariableTableId(int varTableId) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + using (var _db = DbContext.GetInstance()) + { + var result = await _db.Queryable() + .Where(d => d.VariableTableId == varTableId) + .Select(dbVarData => dbVarData.CopyTo()) + .ToListAsync(); + stopwatch.Stop(); + Logger.Info($"获取变量表的所有变量{result.Count()}个耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } } @@ -60,41 +83,75 @@ public class VarDataRepository { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); - using (var _db = DbContext.GetInstance()) + using (var db = DbContext.GetInstance()) { - var dbVarData = await _db.Insertable(variableData.CopyTo()).ExecuteReturnEntityAsync(); + var varData = await AddAsync(variableData, db); stopwatch.Stop(); Logger.Info($"新增VariableData '{variableData.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); - return dbVarData.CopyTo(); + return varData; } } - + + /// /// 新增VariableData /// /// VariableData实体 /// - public async Task> AddAsync(List variableDatas) + public async Task AddAsync(VariableData variableData, SqlSugarClient db) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); - - List variableDataList = new List(); - using (var _db = DbContext.GetInstance()) + var dbVarData = await db.Insertable(variableData.CopyTo()) + .ExecuteReturnEntityAsync(); + stopwatch.Stop(); + Logger.Info($"新增VariableData '{variableData.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return dbVarData.CopyTo(); + } + + /// + /// 新增VariableData + /// + /// VariableData实体 + /// + public async Task AddAsync(IEnumerable variableDatas) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + using (var db = DbContext.GetInstance()) { - List dbVarDataList = variableDatas.Select(varData=>varData.CopyTo()).ToList(); - foreach (var dbVariableData in dbVarDataList) - { - var resVarData = await _db.Insertable(dbVariableData).ExecuteReturnEntityAsync(); - variableDataList.Add(resVarData.CopyTo()); - } - + var varData = await AddAsync(variableDatas, db); stopwatch.Stop(); - Logger.Info($"新增VariableData{dbVarDataList.Count}个, 耗时:{stopwatch.ElapsedMilliseconds}ms"); - return variableDataList; + Logger.Info($"新增VariableData '{variableDatas.Count()}'个, 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return varData; } } + + /// + /// 新增VariableData + /// + /// VariableData实体 + /// + public async Task AddAsync(IEnumerable variableDatas, SqlSugarClient db) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + Stopwatch stopwatch2 = new Stopwatch(); + stopwatch2.Start(); + var dbList = variableDatas.Select(vb => vb.CopyTo()).ToList(); + stopwatch2.Stop(); + Logger.Info($"复制 VariableData'{variableDatas.Count()}'个, 耗时:{stopwatch2.ElapsedMilliseconds}ms"); + + var res = await db.Insertable(dbList) + .ExecuteCommandAsync(); + + stopwatch.Stop(); + Logger.Info($"新增VariableData '{variableDatas.Count()}'个, 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return res; + } + + /// /// 更新VariableData /// @@ -106,13 +163,14 @@ public class VarDataRepository stopwatch.Start(); using (var _db = DbContext.GetInstance()) { - var result = await _db.Updateable(variableData.CopyTo()).ExecuteCommandAsync(); + var result = await _db.Updateable(variableData.CopyTo()) + .ExecuteCommandAsync(); stopwatch.Stop(); Logger.Info($"更新VariableData '{variableData.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } } - + /// /// 更新VariableData /// @@ -124,30 +182,102 @@ public class VarDataRepository stopwatch.Start(); using (var _db = DbContext.GetInstance()) { - var dbVarDatas = variableDatas.Select(vd=>vd.CopyTo()); - var result = await _db.Updateable(dbVarDatas.ToList()).ExecuteCommandAsync(); - + var result = await UpdateAsync(variableDatas, _db); + stopwatch.Stop(); Logger.Info($"更新VariableData {variableDatas.Count()}个 耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } } + /// + /// 更新VariableData + /// + /// VariableData实体 + /// + public async Task UpdateAsync(List variableDatas, SqlSugarClient db) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + + var dbVarDatas = variableDatas.Select(vd => vd.CopyTo()); + var result = await db.Updateable(dbVarDatas.ToList()) + .ExecuteCommandAsync(); + + stopwatch.Stop(); + Logger.Info($"更新VariableData {variableDatas.Count()}个 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; + } + + /// + /// 删除VariableData + /// + /// 主键ID + /// + public async Task DeleteAsync(VariableData variableData) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + using var db = DbContext.GetInstance(); + var result = await DeleteAsync(variableData, db); + stopwatch.Stop(); + Logger.Info($"删除VariableData: '{variableData.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; + } + /// /// 根据ID删除VariableData /// /// 主键ID /// - public async Task DeleteAsync(int id) + public async Task DeleteAsync(VariableData variableData, SqlSugarClient db) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); - using (var _db = DbContext.GetInstance()) - { - var result = await _db.Deleteable().In(id).ExecuteCommandAsync(); - stopwatch.Stop(); - Logger.Info($"删除VariableData ID '{id}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); - return result; - } + using var _db = DbContext.GetInstance(); + + var result = await _db.Deleteable() + .Where(d => d.Id == variableData.Id) + .ExecuteCommandAsync(); + stopwatch.Stop(); + Logger.Info($"删除VariableData: '{variableData.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; + } + + /// + /// 删除VariableData + /// + /// 主键ID + /// + public async Task DeleteAsync(IEnumerable variableDatas) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + using var db = DbContext.GetInstance(); + + var result = await DeleteAsync(variableDatas, db); + + stopwatch.Stop(); + Logger.Info($"删除VariableData: '{variableDatas.Count()}'个 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; + } + + /// + /// 根据ID删除VariableData + /// + /// 主键ID + /// + public async Task DeleteAsync(IEnumerable variableDatas, SqlSugarClient db) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + using var _db = DbContext.GetInstance(); + + var dbList = variableDatas.Select(vd => vd.CopyTo()); + var result = await _db.Deleteable(dbList) + .ExecuteCommandAsync(); + stopwatch.Stop(); + Logger.Info($"删除VariableData: '{variableDatas.Count()}'个 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; } } \ No newline at end of file diff --git a/Data/Repositories/VarTableRepository.cs b/Data/Repositories/VarTableRepository.cs index 182bae0..66bc067 100644 --- a/Data/Repositories/VarTableRepository.cs +++ b/Data/Repositories/VarTableRepository.cs @@ -18,57 +18,123 @@ public class VarTableRepository /// /// /// 变量表的ID - public async Task Add(VariableTable varTable) + public async Task Add(VariableTable varTable) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); using (var db = DbContext.GetInstance()) { - var result = await db.Insertable(varTable.CopyTo()) - .ExecuteReturnIdentityAsync(); + var addVarTable = await Add(varTable, db); + stopwatch.Stop(); Logger.Info($"添加变量表 '{varTable.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); - return result; + return addVarTable; } } - + /// - /// 添加默认变量表 + /// 添加变量表支持事务 /// /// /// /// - public async Task AddDeviceDefVarTable(DbDevice dbDevice, SqlSugarClient db) + public async Task Add(VariableTable variableTable, SqlSugarClient db) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); - // 添加默认变量表 - dbDevice.VariableTables = new List(); - var dbVariableTable = new DbVariableTable(); - dbVariableTable.IsActive = true; - dbVariableTable.DeviceId=dbDevice.Id; - dbVariableTable.Name = "默认变量表"; - dbVariableTable.Description = "默认变量表"; - dbVariableTable.ProtocolType = dbDevice.ProtocolType; - dbDevice.VariableTables.Add(dbVariableTable); - var result = await db.Insertable(dbVariableTable).ExecuteReturnEntityAsync(); + + var addVarTabel = await db.Insertable(variableTable.CopyTo()) + .ExecuteReturnEntityAsync(); stopwatch.Stop(); - Logger.Info($"添加设备 '{dbDevice.Name}' 的默认变量表耗时:{stopwatch.ElapsedMilliseconds}ms"); - return result; + Logger.Info($"添加设备 '{addVarTabel.Name}' 的默认变量表耗时:{stopwatch.ElapsedMilliseconds}ms"); + return addVarTabel.CopyTo(); } - + /// + /// 编辑变量表 + /// + /// + /// public async Task Edit(VariableTable variableTable) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); using (var db = DbContext.GetInstance()) { - var result = await db.Updateable(variableTable.CopyTo()).ExecuteCommandAsync(); + var result = await Edit(variableTable, db); stopwatch.Stop(); Logger.Info($"编辑变量表 '{variableTable.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } } + + /// + /// 编辑变量表,支持事务 + /// + /// + /// + public async Task Edit(VariableTable variableTable, SqlSugarClient db) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + var result = await db.Updateable(variableTable.CopyTo()) + .ExecuteCommandAsync(); + stopwatch.Stop(); + Logger.Info($"编辑变量表 '{variableTable.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; + } + + /// + /// 删除变量表 + /// + /// + /// + public async Task Delete(VariableTable variableTable) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + using (var db = DbContext.GetInstance()) + { + var result = await Delete(variableTable, db); + stopwatch.Stop(); + Logger.Info($"删除变量表 '{variableTable.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return result; + } + } + + /// + /// 删除变量表支持事务 + /// + /// + /// + public async Task Delete(VariableTable varTable, SqlSugarClient db) + { + if (varTable == null ) + return 0; + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + // 转换对象 + var res= await db.Deleteable(varTable.CopyTo()) + .ExecuteCommandAsync(); + stopwatch.Stop(); + Logger.Info($"删除变量表 '{varTable.Name}' 耗时:{stopwatch.ElapsedMilliseconds}ms"); + return res; + } + + /// + /// 删除变量表支持事务 + /// + /// + /// + public async Task Delete(List deviceVariableTables, SqlSugarClient db) + { + if (deviceVariableTables == null || deviceVariableTables.Count == 0) + return; + // 转换对象 + var dbList = deviceVariableTables.Select(v => v.CopyTo()) + .ToList(); + await db.Deleteable(dbList) + .ExecuteCommandAsync(); + } } \ No newline at end of file diff --git a/Helper/DataServicesHelper.cs b/Helper/DataServicesHelper.cs index 7e2e7b9..7efb1fe 100644 --- a/Helper/DataServicesHelper.cs +++ b/Helper/DataServicesHelper.cs @@ -25,20 +25,33 @@ public class DataServicesHelper return varTable; } - public static MenuBean FindMenusForDevice(Device device,List menus) + + + + + public static MenuBean FindMenusForDevice(Device device, IEnumerable menus) { - foreach (var mainMenu in menus) + if (menus == null) { - if (mainMenu.Items == null || mainMenu.Items.Count == 0) - continue; - foreach (var secondMenu in mainMenu.Items) + return null; + } + + foreach (var menu in menus) + { + // 检查当前菜单项是否匹配 + if (menu.Type==MenuType.DeviceMenu && menu.DataId ==device.Id) { - if (secondMenu.Type == MenuType.DeviceMenu && secondMenu.Data != null && secondMenu.Data == device) - { - return secondMenu; - } + return menu; + } + + // 递归搜索子菜单 + var foundInSubMenu = FindMenusForDevice(device, menu.Items); + if (foundInSubMenu != null) + { + return foundInSubMenu; } } + return null; } diff --git a/ViewModels/DevicesViewModel.cs b/ViewModels/DevicesViewModel.cs index 1feb379..1c6e4e6 100644 --- a/ViewModels/DevicesViewModel.cs +++ b/ViewModels/DevicesViewModel.cs @@ -62,16 +62,24 @@ public partial class DevicesViewModel : ViewModelBase [RelayCommand] public async void AddDevice() { - // 1. 显示添加设备对话框 - var device = await _dialogService.ShowAddDeviceDialog(); - // 如果用户取消或对话框未返回设备,则直接返回 - if (device == null) + try { - _logger.LogInformation("用户取消了添加设备操作。"); - return; - } + // 1. 显示添加设备对话框 + var device = await _dialogService.ShowAddDeviceDialog(); + // 如果用户取消或对话框未返回设备,则直接返回 + if (device == null) + { + _logger.LogInformation("用户取消了添加设备操作。"); + return; + } - await _deviceRepository.AddDeviceAndMenu(device); + await _deviceRepository.Add(device); + } + catch (Exception e) + { + NotificationHelper.ShowMessage($"添加设备的过程中发生错误:{e.Message}", NotificationType.Error); + _logger.LogError($"添加设备的过程中发生错误:{e}"); + } } /// @@ -80,6 +88,7 @@ public partial class DevicesViewModel : ViewModelBase [RelayCommand] public async void DeleteDevice() { + try { if (SelectedDevice == null) @@ -92,12 +101,9 @@ public partial class DevicesViewModel : ViewModelBase var isDel = await _dialogService.ShowConfrimeDialog("删除设备", msg, "删除设备"); if (isDel) { + // 删除设备 - await _deviceRepository.DeleteById(SelectedDevice.Id); - // 删除菜单 - var menu = DataServicesHelper.FindMenusForDevice(SelectedDevice, _dataServices.MenuTrees); - if (menu != null) - await _menuRepository.DeleteMenu(menu); + await _deviceRepository.Delete(SelectedDevice ,_dataServices.MenuTrees); MessageHelper.SendLoadMessage(LoadTypes.Menu); MessageHelper.SendLoadMessage(LoadTypes.Devices); diff --git a/ViewModels/MainViewModel.cs b/ViewModels/MainViewModel.cs index e3352b9..1b3a116 100644 --- a/ViewModels/MainViewModel.cs +++ b/ViewModels/MainViewModel.cs @@ -4,6 +4,7 @@ using iNKORE.UI.WPF.Modern.Common.IconKeys; using iNKORE.UI.WPF.Modern.Controls; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using PMSWPF.Data; using PMSWPF.Data.Repositories; using PMSWPF.Enums; using PMSWPF.Helper; @@ -69,6 +70,7 @@ public partial class MainViewModel : ViewModelBase /// 当前菜单项,用于获取父级设备信息。 private async Task AddVariableTable(MenuBean menu) { + var db = DbContext.GetInstance(); try { // 1. 检查父级设备信息 @@ -94,29 +96,25 @@ public partial class MainViewModel : ViewModelBase varTable.ProtocolType = device.ProtocolType; // 4. 添加变量表到数据库 - // 假设 _varTableRepository.Add 返回一个布尔值表示成功,或者一个表示 ID 的整数 + // 假设 _varTableRepository.AddAsync 返回一个布尔值表示成功,或者一个表示 ID 的整数 // 这里为了演示,我们假设它返回新添加的ID,如果失败则返回0 - var addVarTableId = await _varTableRepository.Add(varTable); - if (addVarTableId <= 0) - { - NotificationHelper.ShowMessage($"变量表:{varTable.Name},添加失败", NotificationType.Error); - _logger.LogError($"变量表:{varTable.Name},添加失败"); - return; // 添加变量表失败,提前返回 - } + await db.BeginTranAsync(); + var addVarTable = await _varTableRepository.Add(varTable,db); // 5. 添加变量表菜单 MenuBean newMenu = new MenuBean { Icon = SegoeFluentIcons.Tablet.Glyph, Name = varTable.Name, - DataId = addVarTableId, // 使用实际添加的ID + DataId = addVarTable.Id, // 使用实际添加的ID Type = MenuType.VariableTableMenu, ParentId = menu.Parent.Id }; - var addMenuRes = await _menuRepository.Add(newMenu); + var addMenuRes = await _menuRepository.Add(newMenu,db); if (addMenuRes > 0) { + await db.CommitTranAsync(); // 变量表和菜单都添加成功 MessageHelper.SendLoadMessage(LoadTypes.Menu); MessageHelper.SendLoadMessage(LoadTypes.Devices); @@ -125,6 +123,7 @@ public partial class MainViewModel : ViewModelBase } else { + await db.RollbackTranAsync(); // 变量表菜单添加失败 (此时变量表可能已添加成功,需要根据业务决定是否回滚) NotificationHelper.ShowMessage($"变量表:{varTable.Name},添加菜单失败", NotificationType.Error); _logger.LogError($"变量表:{varTable.Name},添加菜单失败"); @@ -134,8 +133,9 @@ public partial class MainViewModel : ViewModelBase } catch (Exception e) { + await db.RollbackTranAsync(); // 捕获并记录所有未预料的异常 - _logger.LogError(e, "添加变量表时出现了未预期的错误。"); + _logger.LogError($"添加变量表时出现了未预期的错误:{e}"); NotificationHelper.ShowMessage($"添加变量表时出现了错误:{e.Message}", NotificationType.Error); } } diff --git a/ViewModels/VariableTableViewModel.cs b/ViewModels/VariableTableViewModel.cs index 8861b6d..6ae272d 100644 --- a/ViewModels/VariableTableViewModel.cs +++ b/ViewModels/VariableTableViewModel.cs @@ -162,16 +162,14 @@ partial class VariableTableViewModel : ViewModelBase variableData.VariableTableId = VariableTable.Id; } // 插入数据库 - var resVarDataList= await _varDataRepository.AddAsync(importVarDataList); + var resVarDataCount= await _varDataRepository.AddAsync(importVarDataList); //更新界面 // variableTable.DataVariables.AddRange(resVarDataList); - foreach (var variableData in resVarDataList) - { - variableTable.DataVariables.Add(variableData); - } - DataVariables=new ObservableCollection(resVarDataList); + variableTable.DataVariables= await _varDataRepository.GetAllAsync(); + DataVariables=new ObservableCollection(variableTable.DataVariables); processingDialog?.Hide(); - string msgSuccess = $"成功导入变量:{resVarDataList.Count}个。"; + + string msgSuccess = $"成功导入变量:{resVarDataCount}个。"; Logger.Info(msgSuccess); NotificationHelper.ShowMessage(msgSuccess, NotificationType.Success); diff --git a/Views/DevicesView.xaml b/Views/DevicesView.xaml index 24ecca0..a42174f 100644 --- a/Views/DevicesView.xaml +++ b/Views/DevicesView.xaml @@ -12,36 +12,102 @@ d:DesignWidth="300"> - - - + + + + + + + + + + + + + - + - - - - - -