MainVM.cs 7.73 KB
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using HHECS.RobotTool.Common;
using HHECS.RobotTool.Model;
using HHECS.RobotTool.Service;
using HHECS.RobotTool.View;
using RobotTool;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using MessageBox = HandyControl.Controls.MessageBox;

namespace HHECS.RobotTool.ViewModel
{
    internal partial class MainVM : ObservableObject
    {
        [ObservableProperty]
        private bool btnStartEnabled = true;

        [ObservableProperty]
        private bool btnStopEnabled = false;

        [ObservableProperty]
        private ObservableCollection<LogModel> logModels = new ObservableCollection<LogModel>();

        [ObservableProperty]
        private ObservableCollection<MenuItem> menuItems = new ObservableCollection<MenuItem>();

        [ObservableProperty]
        private GrooveComputerPage grooveComputerPage = new GrooveComputerPage();

        [ObservableProperty]
        private bool tcpServerStatus;

        private List<Window> _windows = new List<Window>();
        private readonly IFreeSql _freeSql;
        private readonly CenterService _centerService;
        private readonly KukaService _kukaService;
        private readonly SystemLog _log = SystemLog.GetInstance();

        public MainWindow Owner { get; internal set; } = null!;

        public MainVM(IFreeSql freeSql, CenterService centerService, KukaService kukaService)
        {
            _freeSql = freeSql;
            _centerService = centerService;
            _kukaService = kukaService;
            InitialData();
            RefreshLog();
        }

        private void InitialData()
        {
            try
            {
                var userId = App.User.Id;
                var roleIds = _freeSql.Queryable<UserRole>().Where(x => x.UserId == userId).Distinct().ToList(x => x.RoleId);
                var permissionIds = _freeSql.Queryable<RolePermission>().Where(x => roleIds.Contains(x.RoleId)).Distinct().ToList(x => x.PermissionId);
                var permissions = _freeSql.Queryable<Permission>().Where(x => permissionIds.Contains(x.Id) && x.PermissionType == PermissionType.MenuItem).ToList();

                MenuItems = new ObservableCollection<MenuItem>(BuiderMenu(permissions));
                //var temp = BuiderMenu(permissions);
            }
            catch (Exception ex)
            {
                MessageBox.Error($"初始化数据出现异常:{ex.Message}");
            }
        }

        private List<MenuItem> BuiderMenu(List<Permission> permissions)
        {
            var lookup = permissions.ToLookup(p => p.ParentId);

            // 创建根节点列表
            var roots = lookup[null].Select(x => new MenuItem
            {
                Header = x.Name,
                Command = OpenMenuCommand,
                CommandParameter = x.ViewName,
                HorizontalAlignment = HorizontalAlignment.Center,
                Tag = x.Id,
            }).ToList();

            // 遍历每个根节点,递归构建子树
            foreach (var root in roots)
            {
                AddChildren(root, lookup);
            }
            return roots;
        }

        private void AddChildren(MenuItem parent, ILookup<int?, Permission> lookup)
        {
            _ = int.TryParse($"{parent.Tag}", out var parentId);
            // 找到所有直接子节点
            var children = lookup[parentId].ToList();

            // 为每个子节点添加子节点集合,并递归构建子树
            foreach (var child in children)
            {
                var menuItem = new MenuItem
                {
                    Header = child.Name,
                    Command = OpenMenuCommand,
                    CommandParameter = child.ViewName,
                    Width = 100,
                    Tag = child.Id,
                };
                parent.Items.Add(menuItem);
                AddChildren(menuItem, lookup);
            }
        }

        [RelayCommand]
        private void Start()
        {
            BtnStartEnabled = false;
            BtnStopEnabled = true;
            _centerService.Start();
        }

        [RelayCommand]
        private void Stop()
        {
            BtnStartEnabled = true;
            BtnStopEnabled = false;
            _centerService.Stop();
        }

        [RelayCommand]
        private void TcpServer()
        {
            if (TcpServerStatus)
            {
                var result = _kukaService.StartTcpServer();
                if (!result.Success)
                {
                    TcpServerStatus = false;
                    MessageBox.Error($"TcpServer启动失败:{result.Msg}");
                }
                _log.LogSuccess($"TcpServer已启动");
            }
            else
            {
                _kukaService.StopTcpServer();
                _log.LogInfo($"TcpServer已关闭");
            }
        }

        [RelayCommand]
        private void OpenMenu(object args)
        {
            try
            {
                //var fulllName = typeof(UserView).FullName!;
                var type = Type.GetType(args.ToString()!)!;
                var oldWindow = _windows.Where(x => x.GetType().FullName == type.FullName).FirstOrDefault();
                if (oldWindow != null)
                {
                    oldWindow.Activate();
                    return;
                }
                if (Activator.CreateInstance(type) is Window window)
                {
                    window.Closed += (sender, e) =>
                    {
                        if (sender is Window temp)
                        {
                            _windows.Remove(temp);
                        }
                    };
                    _windows.Add(window);
                    window.Show();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Error($"打开页面出现异常:{ex.Message}");
            }
        }

        [RelayCommand]
        private void CurrentViewShow()
        {
            Owner.Show();
        }

        private void RefreshLog()
        {
            Task.Run(() =>
            {
                Application.Current.Dispatcher.Invoke(async () =>
                {
                    do
                    {
                        while (!_log.IsEmpty)
                        {
                            var log = _log.GetLog();
                            if (log == null)
                            {
                                await Task.Delay(100);
                                continue;
                            }

                            var oldItem = LogModels.Where(x => x.Messages.Equals(log.Messages)).FirstOrDefault();
                            if (oldItem != null)
                            {
                                oldItem.CreateTime = log.CreateTime;
                                LogModels = new ObservableCollection<LogModel>(LogModels.OrderByDescending(x => x.CreateTime));
                            }
                            else
                            {
                                LogModels.Insert(0, new LogModel()
                                {
                                    LogType = log.LogType,
                                    Messages = log.Messages,
                                    CreateTime = log.CreateTime
                                });
                            }
                            if (LogModels.Count > 50)
                            {
                                LogModels.Remove(LogModels.Last());
                            }
                        }
                        await Task.Delay(100);
                    } while (true);
                });
            });
        }
    }
}