RoleAddOrEditVM.cs 5.23 KB
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;
        }
    }
}