MainVM.cs 4.2 KB
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using HHECS.DAQClient.Common;
using HHECS.DAQClient.DataAccess;
using HHECS.DAQClient.Services;
using HHECS.DAQClient.View.CommunicationsView;
using HHECS.DAQClient.View.EquipmentView;
using MessageBox = HandyControl.Controls.MessageBox;

namespace HHECS.DAQClient.ViewModel
{
    internal partial class MainVM : ObservableObject
    {
        private readonly SystemLog _log = SystemLog.GetInstance();
        private readonly CenterService _centerService;
        private readonly DataContext _context;
        [ObservableProperty]
        private bool btnStartEnabled = true;

        [ObservableProperty]
        private bool btnStopEnabled = false;

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

        [ObservableProperty]
        private Page communicationPage = new CommunicationPage();

        [ObservableProperty]
        private Page equipmentPage = new EquipmentPage();

        [ObservableProperty]
        private Page equipmentDataQueuePage = new EquipmentDataQueuePage();

        public MainVM(CenterService centerService, DataContext context)
        {
            _centerService = centerService;
            _context = context;
            InitialDataTemps();
            InitialLogComponent();
        }

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

        }

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

        /// <summary>
        /// 初始化数据模板
        /// </summary>
        private void InitialDataTemps()
        {
            try
            {
                var equipmentTypeCount = _context.EquipmentType.Where(x => true).Count();
                //无设备类型数据,则使用种子数据初始化模板
                if (equipmentTypeCount == 0)
                {
                    //待完善
                    var equipmentTypes = DataSeeding.GetEquipmentTypes();
                    _context.EquipmentType.AddRange(equipmentTypes);
                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Error($"数据初始化失败.{ex.Message}");
            }
        }

        private void InitialLogComponent()
        {
            Task.Run(() =>
            {
                Application.Current.Dispatcher.Invoke(async () =>
                {
                    do
                    {
                        while (!_log.IsEmpty)
                        {
                            var log = _log.GetLog();
                            if (log != null)
                            {
                                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);
                });
            });
        }
    }
}