RoleAddOrEditVM.cs
5.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using HHECS.RobotTool.Model;
using RobotTool;
using System.Collections.ObjectModel;
using System.Windows;
using MessageBox = HandyControl.Controls.MessageBox;
namespace HHECS.RobotTool.ViewModel.AccountVM
{
public partial class RoleAddOrEditVM : ObservableObject
{
[ObservableProperty]
private Role role = new Role();
[ObservableProperty]
private ObservableCollection<Permission> permissions = new ObservableCollection<Permission>();
public Window Owner { get; set; } = null!;
private bool IsEdit = false;
private readonly IFreeSql _freeSql;
public RoleAddOrEditVM(IFreeSql freeSql)
{
_freeSql = freeSql;
}
internal void InitialData(int? roleId = null)
{
try
{
var allPermissions = _freeSql.Queryable<Permission>().ToList();
//所有的角色
if (roleId != null)
{
Owner.Title = "修改角色信息";
IsEdit = true;
Role = _freeSql.Queryable<Role>().Where(x => x.Id.Equals(roleId)).First();
var permissionIds = _freeSql.Queryable<RolePermission>().Where(x => x.RoleId == roleId).ToList(x => x.PermissionId);
allPermissions.ForEach(x => x.CurrentNodeIsChanged = permissionIds.Contains(x.Id));
}
Permissions = new ObservableCollection<Permission>(BuildTree(allPermissions));
}
catch (Exception ex)
{
MessageBox.Error($"初始化数据失败.{ex.Message}");
}
}
[RelayCommand]
private void Save()
{
try
{
if (string.IsNullOrWhiteSpace(Role.Code))
{
MessageBox.Warning($"角色编码不能为空!");
return;
}
if (string.IsNullOrWhiteSpace(Role.Name))
{
MessageBox.Warning($"角色名称不能为空!");
return;
}
var roleId = Role.Id;
if (!IsEdit)
{
Role.Created = DateTime.Now;
Role.CreatedBy = App.User.Account;
roleId = (int)_freeSql.Insert(Role).ExecuteIdentity();
}
else
{
Role.Updated = DateTime.Now;
Role.UpdatedBy = App.User.Account;
_freeSql.Update<Role>().SetSource(Role).ExecuteAffrows();
}
var rolePermissionIds = _freeSql.Queryable<RolePermission>().Where(x => x.RoleId == roleId).ToList(x => x.PermissionId);
var allPermissions = FlattenTree(Permissions).ToList();
//新增
var rolePermissionTemp1 = allPermissions.Where(x => x.CurrentNodeIsChanged && !rolePermissionIds.Contains(x.Id)).Select(x => new RolePermission
{
RoleId = roleId,
PermissionId = x.Id,
Created = DateTime.Now,
CreatedBy = App.User.Account
}).ToList();
_freeSql.Insert(rolePermissionTemp1).ExecuteAffrows();
//删除
var rolePermissionTemp2 = allPermissions.Where(x => !x.CurrentNodeIsChanged && rolePermissionIds.Contains(x.Id)).Select(x => x.Id).ToList();
_freeSql.Delete<RolePermission>().Where(x => rolePermissionTemp2.Contains(x.PermissionId) && x.RoleId == roleId).ExecuteAffrows();
Owner.DialogResult = true;
MessageBox.Success("操作成功");
}
catch (Exception ex)
{
MessageBox.Error($"操作失败.{ex.Message}");
}
}
[RelayCommand]
private void Cancel()
{
Owner.Close();
}
private List<Permission> BuildTree(List<Permission> flatList)
{
var lookup = flatList.ToLookup(p => p.ParentId);
// 创建根节点列表
var roots = lookup[null].ToList();
// 遍历每个根节点,递归构建子树
foreach (var root in roots)
{
AddChildren(root, lookup);
}
return roots;
}
private void AddChildren(Permission parent, ILookup<int?, Permission> lookup)
{
// 找到所有直接子节点
var children = lookup[parent.Id].ToList();
// 为每个子节点添加子节点集合,并递归构建子树
foreach (var child in children)
{
parent.Children.Add(child);
AddChildren(child, lookup);
}
}
private static IEnumerable<Permission> FlattenTree(IEnumerable<Permission> roots)
{
var result = new List<Permission>();
foreach (var root in roots)
{
result.Add(root);
result.AddRange(FlattenTree(root.Children));
}
return result;
}
}
}