259 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			259 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C#
		
	
	
	
using DM_Weight.Finger;
 | 
						||
using DM_Weight.HIKVISION;
 | 
						||
using DM_Weight.Models;
 | 
						||
using DM_Weight.msg;
 | 
						||
using DM_Weight.Port;
 | 
						||
using DM_Weight.util;
 | 
						||
using DM_Weight.Views;
 | 
						||
using log4net;
 | 
						||
using log4net.Repository.Hierarchy;
 | 
						||
using MaterialDesignThemes.Wpf;
 | 
						||
using Prism.Commands;
 | 
						||
using Prism.Events;
 | 
						||
using Prism.Mvvm;
 | 
						||
using Prism.Regions;
 | 
						||
using System;
 | 
						||
using System.Collections.Generic;
 | 
						||
using System.IO;
 | 
						||
using System.Linq;
 | 
						||
using System.Text;
 | 
						||
using System.Threading.Tasks;
 | 
						||
using System.Windows;
 | 
						||
using System.Windows.Media;
 | 
						||
using Unity;
 | 
						||
 | 
						||
namespace DM_Weight.ViewModels
 | 
						||
{
 | 
						||
    internal class MainWindowViewModel : BindableBase
 | 
						||
    {
 | 
						||
 | 
						||
        #region 录屏相关
 | 
						||
        //public Recorder _recorder;
 | 
						||
        private string _outputFolder;
 | 
						||
        private string _outputFilePath;
 | 
						||
        //public static MainWindowViewModel vm;
 | 
						||
        #endregion 
 | 
						||
 | 
						||
        private string _title = "Prism App";   //标题
 | 
						||
 | 
						||
        private ISnackbarMessageQueue _snackbarMessageQueue = new SnackbarMessageQueue(TimeSpan.FromSeconds(3));
 | 
						||
 | 
						||
        private SolidColorBrush _colorBrush;
 | 
						||
 | 
						||
 | 
						||
        //private PortUtil _portUtil;
 | 
						||
 | 
						||
        //private ScreenUtil _screenUtil;
 | 
						||
 | 
						||
        public SolidColorBrush Background
 | 
						||
        {
 | 
						||
            get => _colorBrush;
 | 
						||
            set => SetProperty(ref _colorBrush, value);
 | 
						||
        }
 | 
						||
 | 
						||
        public ISnackbarMessageQueue SnackbarMessageQueue
 | 
						||
        {
 | 
						||
            get => _snackbarMessageQueue;
 | 
						||
            set => SetProperty(ref _snackbarMessageQueue, value);
 | 
						||
        }
 | 
						||
        public string Title
 | 
						||
        {
 | 
						||
            get { return _title; }
 | 
						||
            set { SetProperty(ref _title, value); }
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        IEventAggregator eventAggregator;
 | 
						||
 | 
						||
 | 
						||
        //public MainWindowViewModel(IEventAggregator eventAggregator, PortUtil portUtil, ScreenUtil screenUtil)
 | 
						||
        //{
 | 
						||
        //    _portUtil = portUtil;
 | 
						||
        //    this.eventAggregator = eventAggregator;
 | 
						||
        //    this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2);
 | 
						||
        //    _screenUtil = screenUtil;
 | 
						||
        //}
 | 
						||
        private FingerprintUtil _fingerprintUtil;
 | 
						||
        IRegionManager _regionManager;
 | 
						||
        IUnityContainer _container;
 | 
						||
        //private CHKFunction _cHKFunction;
 | 
						||
        private readonly ILog logger = LogManager.GetLogger(typeof(PortUtil));
 | 
						||
 | 
						||
        SocketHelper _socketHelper;
 | 
						||
        private PortUtil _portUtil;
 | 
						||
        FFmpegHelper fmpegHelper;
 | 
						||
        public MainWindowViewModel(IRegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator, FingerprintUtil fingerprintUtil, SocketHelper socketHelper, PortUtil portUtil,FFmpegHelper fmpegHelper)
 | 
						||
        {
 | 
						||
            //vm = this;
 | 
						||
            _portUtil = portUtil;
 | 
						||
            this.eventAggregator = eventAggregator;
 | 
						||
            this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2);
 | 
						||
            this.eventAggregator.GetEvent<PrintScreenEvent>().Subscribe(PrintScreen);
 | 
						||
            _fingerprintUtil = fingerprintUtil;
 | 
						||
            _regionManager = regionManager;
 | 
						||
            _container = container;
 | 
						||
            //_cHKFunction = cHKFunction;
 | 
						||
 | 
						||
            //System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
 | 
						||
            //{
 | 
						||
            if (App.DbConnectionFail)
 | 
						||
            {
 | 
						||
                _regionManager.RequestNavigate("MainRegion", "EmergencyWindow");
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                _container.RegisterType<object, LoginWindow>("LoginWindow");
 | 
						||
                _regionManager.RegisterViewWithRegion("MainRegion", "LoginWindow");
 | 
						||
            }
 | 
						||
            //}));
 | 
						||
            _socketHelper = socketHelper;
 | 
						||
            new PromiseUtil<int>().taskAsyncLoop(1200000, 0, async (options, next, stop) =>
 | 
						||
            {
 | 
						||
                _socketHelper.IsMultiThread = true;
 | 
						||
                try
 | 
						||
                {
 | 
						||
                    TemperatureHumidityInfo temp = _portUtil.GetWSD();
 | 
						||
                    if (temp != null)
 | 
						||
                    {
 | 
						||
                        SqlSugarHelper.Db.Insertable(new TemperatureHumidityInfo()
 | 
						||
                        {
 | 
						||
                            GroupNo = temp.GroupNo,
 | 
						||
                            Temp = temp.Temp,
 | 
						||
                            Humi = temp.Humi,
 | 
						||
                            AddTime = DateTime.Now
 | 
						||
                        }).ExecuteCommand();
 | 
						||
                        logger.Info($"保存温湿度信息:{temp.Temp},{temp.Humi}");
 | 
						||
                        Task.Delay(1200000);//20分钟查一次
 | 
						||
                    }
 | 
						||
                    else
 | 
						||
                    {
 | 
						||
                        logger.Info("温湿度信息返回空");
 | 
						||
                    }
 | 
						||
                    next();
 | 
						||
                }
 | 
						||
                catch (Exception ex)
 | 
						||
                {
 | 
						||
                    logger.Info($"保存温湿度异常:{ex.Message}");
 | 
						||
                    next();
 | 
						||
                }
 | 
						||
            });
 | 
						||
            this.fmpegHelper= fmpegHelper;
 | 
						||
        }
 | 
						||
 | 
						||
        void doMyPrismEvent2(AlertMsg msg)
 | 
						||
        {
 | 
						||
            Application.Current.Dispatcher.Invoke(new Action(() =>
 | 
						||
            {
 | 
						||
                switch (msg.Type)
 | 
						||
                {
 | 
						||
                    case MsgType.INFO:
 | 
						||
                        this.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#00e676"));
 | 
						||
                        break;
 | 
						||
                    case MsgType.ERROR:
 | 
						||
                        this.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
 | 
						||
                        break;
 | 
						||
                    default:
 | 
						||
                        this.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#00e676"));
 | 
						||
                        break;
 | 
						||
                }
 | 
						||
                SnackbarMessageQueue.Enqueue(msg.Message);
 | 
						||
            }));
 | 
						||
        }
 | 
						||
        #region 录屏
 | 
						||
        /// <summary>
 | 
						||
        /// 录屏事件
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="type">0停止录屏;1开始录屏;2退出软件清进程</param>
 | 
						||
        void PrintScreen(int type)
 | 
						||
        {
 | 
						||
            if (type == 0)
 | 
						||
            {
 | 
						||
                StopPrintScreen();
 | 
						||
                //删除7天前的录屏文件
 | 
						||
 | 
						||
                if (Directory.Exists(_outputFolder))
 | 
						||
                {
 | 
						||
                    var files = Directory.GetFiles(_outputFolder);
 | 
						||
                    foreach (var file in files)
 | 
						||
                    {
 | 
						||
                        var fileInfo = new FileInfo(file);
 | 
						||
                        if (fileInfo.CreationTime < DateTime.Now.AddDays(-7))
 | 
						||
                        {
 | 
						||
                            try
 | 
						||
                            {
 | 
						||
                                fileInfo.Delete();
 | 
						||
                            }
 | 
						||
                            catch (Exception ex)
 | 
						||
                            {
 | 
						||
                                logger.Error($"删除录屏文件失败: {ex.Message}");
 | 
						||
                            }
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                }
 | 
						||
            }
 | 
						||
            else if (type == 1)
 | 
						||
            {
 | 
						||
                StartPrintScreen();
 | 
						||
            }
 | 
						||
            else if (type == 2)
 | 
						||
            {
 | 
						||
                //_recorder?.Dispose();
 | 
						||
            }
 | 
						||
        }
 | 
						||
        #endregion
 | 
						||
        void StopPrintScreen()
 | 
						||
        {
 | 
						||
            fmpegHelper.stopFlag = true;
 | 
						||
            fmpegHelper.StopRecording();
 | 
						||
            //退出登录结束录屏
 | 
						||
            //_recorder?.Stop();
 | 
						||
        }
 | 
						||
        //录屏
 | 
						||
        void StartPrintScreen()
 | 
						||
        {
 | 
						||
            fmpegHelper.stopFlag = false;
 | 
						||
            _outputFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "Log", "ScreenRecordings");
 | 
						||
            if (!Directory.Exists(_outputFolder))
 | 
						||
            {
 | 
						||
                Directory.CreateDirectory(_outputFolder);
 | 
						||
            }
 | 
						||
            // 生成输出文件名
 | 
						||
            string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
 | 
						||
            _outputFilePath = Path.Combine(_outputFolder, $"{timestamp}.webm");
 | 
						||
            fmpegHelper.StartRecording(_outputFilePath, 25);
 | 
						||
            //// 创建输出目录
 | 
						||
            //_outputFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "Log", "ScreenRecordings");
 | 
						||
            //if (!Directory.Exists(_outputFolder))
 | 
						||
            //{
 | 
						||
            //    Directory.CreateDirectory(_outputFolder);
 | 
						||
            //}
 | 
						||
            //// 生成输出文件名
 | 
						||
            //string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
 | 
						||
            //_outputFilePath = Path.Combine(_outputFolder, $"{timestamp}.mp4");
 | 
						||
 | 
						||
            //// 设置录制选项
 | 
						||
            //var options = new RecorderOptions();
 | 
						||
 | 
						||
            //// 创建录制器实例
 | 
						||
            //_recorder = Recorder.CreateRecorder(options);
 | 
						||
 | 
						||
            //// 设置事件处理
 | 
						||
            //_recorder.OnRecordingComplete += Recorder_OnRecordingComplete;
 | 
						||
            //_recorder.OnRecordingFailed += Recorder_OnRecordingFailed;
 | 
						||
 | 
						||
            //// 开始录制
 | 
						||
            //_recorder.Record(_outputFilePath);
 | 
						||
        }
 | 
						||
        //录制失败
 | 
						||
        //private void Recorder_OnRecordingFailed(object sender, RecordingFailedEventArgs e)
 | 
						||
        //{
 | 
						||
        //    logger.Info($"录制失败: {e.Error}");
 | 
						||
        //}
 | 
						||
        ////录制完成
 | 
						||
        //private void Recorder_OnRecordingComplete(object sender, RecordingCompleteEventArgs e)
 | 
						||
        //{
 | 
						||
        //    logger.Info($"录制完成: {e.FilePath}");
 | 
						||
        //}
 | 
						||
    }
 | 
						||
}
 |