UserVM.cs 4.47 KB
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using HandyControl.Data;
using HHECS.BllModel;
using HHECS.RobotTool.Model;
using HHECS.RobotTool.View.AccountView;
using LinqKit;
using System.Collections;
using System.Collections.ObjectModel;
using System.Linq.Expressions;
using System.Windows;
using MessageBox = HandyControl.Controls.MessageBox;

namespace HHECS.RobotTool.ViewModel.AccountVM
{
    public partial class UserVM : ViewModelBase
    {
        [ObservableProperty]
        private string account = null!;

        [ObservableProperty]
        private string userName = null!;

        [ObservableProperty]
        private ObservableCollection<User> users = new ObservableCollection<User>();

        public UserVM()
        {
            LoadData();
        }

        [RelayCommand]
        public void Serach()
        {
            var result = LoadData();
            if (!result.Success)
            {
                MessageBox.Error($"[{nameof(CommunicationVM)}]加载数据失败.{result.Msg}");
            }
        }

        [RelayCommand]
        public void Add()
        {
            var view = new UserAddOrEditView();
            var result = view.ShowDialog();
            if (result == true)
            {
                LoadData();
            }
        }

        [RelayCommand]
        public void Edit(int userId)
        {
            var vm = new UserAddOrEditView(userId);
            var result = vm.ShowDialog();
            if (result == true)
            {
                LoadData();
            }
        }

        [RelayCommand]
        public void Delete(int userId)
        {
            try
            {
                var result = MessageBox.Ask($"确认删除数据?");
                if (result != MessageBoxResult.OK)
                {
                    return;
                }
                _freeSql.Delete<User>().Where(x => x.Id == userId).ExecuteAffrows();
                _freeSql.Delete<UserRole>().Where(x => x.UserId == userId).ExecuteAffrows();
                LoadData();
                MessageBox.Success("删除数据成功");
            }
            catch (Exception ex)
            {
                MessageBox.Error($"删除数据失败.{ex.Message}");
            }
        }

        [RelayCommand]
        public void BatchDelete(IList sender)
        {
            try
            {
                var temps = sender.Cast<User>().ToList();
                if (temps.Count == 0)
                {
                    MessageBox.Warning("未选中任何数据!");
                    return;
                }
                var result = MessageBox.Ask($"确认删除选中数据?");
                if (result == MessageBoxResult.OK)
                {
                    return;
                }
                var communicationIds = temps.Select(x => x.Id).ToList();
                _freeSql.Delete<User>().Where(x => communicationIds.Contains(x.Id)).ExecuteAffrows();
                LoadData();
                MessageBox.Success($"成功删除{temps.Count}条数据");
            }
            catch (Exception ex)
            {
                MessageBox.Error($"删除失败.{ex.Message}");
            }
        }

        /// <summary>
        /// 页码改变
        /// </summary>
        [RelayCommand]
        private void PageUpdated(FunctionEventArgs<int> info)
        {
            PageIndex = info.Info;
            LoadData();
        }

        private BllResult LoadData()
        {
            try
            {
                var query = _freeSql.Queryable<User>().Where(GetFilter());
                var total = query.Count();
                MaxPage = total / PageSize + Convert.ToInt32(total % PageSize != 0);
                var result = query.Page(PageIndex, PageSize).ToList();
                Users = new ObservableCollection<User>(result);
                return BllResultFactory.Success();
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(ex.Message);
            }
        }

        private Expression<Func<User, bool>> GetFilter()
        {
            var filter = PredicateBuilder.New<User>(true);
            if (!string.IsNullOrWhiteSpace(Account))
            {
                filter = filter.And(x => x.Account.Contains(Account));
            }
            if (!string.IsNullOrWhiteSpace(UserName))
            {
                filter = filter.And(x => x.UserName.Contains(UserName));
            }
            return filter;
        }
    }
}