From e79cdae0da13e51c85d7c8bb30655a834256d3df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=B7=A7?= <625215135@qq.com> Date: Thu, 10 Jul 2025 11:53:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BD=95=E5=B1=8F=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=8F=AF=E5=A4=9A=E6=AC=A1?= =?UTF-8?q?=E5=8A=A0=E8=8D=AF=EF=BC=8C=E6=AF=92=E9=BA=BB=E6=9F=9C=E6=97=A0?= =?UTF-8?q?=E8=8D=AF=E5=88=99=E6=98=BE=E7=A4=BA=E6=97=A0=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E6=88=96=E6=9C=AA=E7=BB=91=E5=AE=9A=EF=BC=8C=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E7=9A=84=E8=8D=AF=E5=93=81=E5=85=88=E4=B8=8D=E8=A1=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DM_Weight/DM_Weight.csproj | 1 + .../ViewModels/AdditionWindowViewModel.cs | 29 +++-- .../BindBoxPackageWindowViewModel.cs | 1 + .../CheckSelfOrderWindowViewModel.cs | 2 +- .../ViewModels/CheckStockWindowViewModel.cs | 13 +- DM_Weight/ViewModels/LoginWindowViewModel.cs | 16 ++- DM_Weight/ViewModels/MainWindowViewModel.cs | 120 ++++++++++++++++-- DM_Weight/Views/AdditionWindow.xaml | 18 ++- DM_Weight/Views/MainWindow.xaml.cs | 21 ++- DM_Weight/msg/PrintScreenEvent.cs | 13 ++ 10 files changed, 189 insertions(+), 45 deletions(-) create mode 100644 DM_Weight/msg/PrintScreenEvent.cs diff --git a/DM_Weight/DM_Weight.csproj b/DM_Weight/DM_Weight.csproj index e965709..fed40ab 100644 --- a/DM_Weight/DM_Weight.csproj +++ b/DM_Weight/DM_Weight.csproj @@ -74,6 +74,7 @@ + diff --git a/DM_Weight/ViewModels/AdditionWindowViewModel.cs b/DM_Weight/ViewModels/AdditionWindowViewModel.cs index ff5a2cb..6583fc0 100644 --- a/DM_Weight/ViewModels/AdditionWindowViewModel.cs +++ b/DM_Weight/ViewModels/AdditionWindowViewModel.cs @@ -116,11 +116,11 @@ namespace DM_Weight.ViewModels channelList.channelStocks = new List(); } channelList.channelStocks.AddRange(ChannelStocks.Where(cs => cs.DrawerNo == DrawerNoList[i]).ToList()); - if (channelList != null) - { - channelList.State = 1;//统一将所有的状态设置为已取药待入库 - channelLists.Add(channelList); - } + //if (channelList != null) + //{ + // channelList.State = 1;//统一将所有的状态设置为已取药待入库 + channelLists.Add(channelList); + //} } _ChannelLists = channelLists; } @@ -149,7 +149,7 @@ namespace DM_Weight.ViewModels selectedStock = _ChannelList.channelStocks.ToList(); if (selectedStock != null && selectedStock.Count > 0) { - selectedStock.ForEach(cs => cs.ChannelLst.State = 2); + //selectedStock.ForEach(cs => cs.ChannelLst.State = 2); int drawerNo = -1; for (int i = 0; i < selectedStock.Count; i++) @@ -308,17 +308,22 @@ namespace DM_Weight.ViewModels selectedStock.ForEach(cs => { cs.Quantity = cs.Quantity + cs.AddToJJNum; - cs.NeedNum = 0; + //cs.NeedNum = 0; cs.AddToJJNum = 0; + //cs.State = 0; }); SqlSugarHelper.Db.Updateable(selectedStock).ExecuteCommand(); // 更新交接柜状态为 已取药未入库 - SqlSugarHelper.Db.Updateable(new ChannelList() - { - State = 0 - }).UpdateColumns(it => it.State).Where(it => it.DrawerNo == _ChannelList.DrawerNo).ExecuteCommand(); + //SqlSugarHelper.Db.Updateable(new ChannelList() + //{ + // State = 0 + //}).UpdateColumns(it => it.State).Where(it => it.DrawerNo == _ChannelList.DrawerNo).ExecuteCommand(); for (int i = 0; i < selectedStock.Count; i++) { + int iUpdateResult = SqlSugarHelper.Db.Updateable() + .SetColumns(cs => new ChannelStock() { State = 0 }) + .Where(cs => cs.DrawerNo == selectedStock[i].DrawerNo && cs.DrugId == selectedStock[i].DrugId && cs.MachineId == selectedStock[i].MachineId) + .ExecuteCommand(); string InvoiceId = "AddJiaoJieFromDM_" + CurrentTimeMillis(); // 保存记录 SqlSugarHelper.Db.Insertable(new MachineRecord() @@ -392,7 +397,7 @@ namespace DM_Weight.ViewModels { if (channelStock != null) { - if (channelStock.ChannelLst.State == 1) + if (channelStock.State == 1) { channelStock.ChannelLst.IsSelected = !channelStock.ChannelLst.IsSelected; } diff --git a/DM_Weight/ViewModels/BindBoxPackageWindowViewModel.cs b/DM_Weight/ViewModels/BindBoxPackageWindowViewModel.cs index 7724093..d51c756 100644 --- a/DM_Weight/ViewModels/BindBoxPackageWindowViewModel.cs +++ b/DM_Weight/ViewModels/BindBoxPackageWindowViewModel.cs @@ -316,6 +316,7 @@ namespace DM_Weight.ViewModels MachineId = "DM5", AddToJJNum = 0, NeedNum = baseQuantity, + State=0 //ManuNo=DrugManuNo.ManuNo }).ExecuteCommand(); // 保存数据 入库记录 diff --git a/DM_Weight/ViewModels/CheckSelfOrderWindowViewModel.cs b/DM_Weight/ViewModels/CheckSelfOrderWindowViewModel.cs index ddf933e..a74b1bf 100644 --- a/DM_Weight/ViewModels/CheckSelfOrderWindowViewModel.cs +++ b/DM_Weight/ViewModels/CheckSelfOrderWindowViewModel.cs @@ -1074,7 +1074,7 @@ namespace DM_Weight.ViewModels { AlertMsg alertMsg = new AlertMsg { - Message = $"处方{oi.OrderNo}应药品批次{oi._OrderDetail.SetManuNo}无库存,无法确认", + Message = $"处方{oi.OrderNo}因药品批次{oi._OrderDetail.SetManuNo}无库存,无法确认", Type = MsgType.ERROR, }; _eventAggregator.GetEvent().Publish(alertMsg); diff --git a/DM_Weight/ViewModels/CheckStockWindowViewModel.cs b/DM_Weight/ViewModels/CheckStockWindowViewModel.cs index 5618b24..01ed36b 100644 --- a/DM_Weight/ViewModels/CheckStockWindowViewModel.cs +++ b/DM_Weight/ViewModels/CheckStockWindowViewModel.cs @@ -182,14 +182,15 @@ namespace DM_Weight.ViewModels EffDate = it.EffDate, Id = it.Id, NeedNum = 0, - AddToJJNum = 0 + AddToJJNum = 0, + State = 0, }).UpdateColumns(it => new { it.Quantity, it.ManuNo, it.EffDate, it.NeedNum, it.AddToJJNum }).ExecuteCommand(); - SqlSugarHelper.Db.Updateable(new ChannelList() - { - State = 0, - Id = it.Chnguid - }).UpdateColumns(cl => new { cl.State }).ExecuteCommand(); + //SqlSugarHelper.Db.Updateable(new ChannelList() + //{ + // State = 0, + // Id = it.Chnguid + //}).UpdateColumns(cl => new { cl.State }).ExecuteCommand(); // 保存数据 盘点记录 SqlSugarHelper.Db.Insertable(new MachineRecord() diff --git a/DM_Weight/ViewModels/LoginWindowViewModel.cs b/DM_Weight/ViewModels/LoginWindowViewModel.cs index fccd615..8b3ba4d 100644 --- a/DM_Weight/ViewModels/LoginWindowViewModel.cs +++ b/DM_Weight/ViewModels/LoginWindowViewModel.cs @@ -127,16 +127,16 @@ namespace DM_Weight.ViewModels // _eventAggregator = eventAggregator; //} - public LoginWindowViewModel(IRegionManager regionManager, IEventAggregator eventAggregator, PortUtil portUtil, FingerprintUtil fingerprintUtil,SocketHelper socketHelper) + public LoginWindowViewModel(IRegionManager regionManager, IEventAggregator eventAggregator, PortUtil portUtil, FingerprintUtil fingerprintUtil, SocketHelper socketHelper) { _fingerprintUtil = fingerprintUtil; _portUtil = portUtil; //_chkFunction= chcFunction; _regionManager = regionManager; _eventAggregator = eventAggregator; - _socketHelper= socketHelper; + _socketHelper = socketHelper; FingerMsg = !_fingerprintUtil.bIsConnected; - NetMsg=!_socketHelper.ConnectedStatus; + NetMsg = !_socketHelper.ConnectedStatus; _eventAggregator.GetEvent().Subscribe(LoginEvent); } private DelegateCommand? _loginCommand; @@ -277,7 +277,7 @@ _exitCommand ??= new DelegateCommand(Exit); keys.Add("operator", user); //System.Windows.Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() => //{ - _regionManager.RequestNavigate("MainRegion", "HomeWindow", keys); + _regionManager.RequestNavigate("MainRegion", "HomeWindow", keys); //})); } // 双人登录模式 @@ -377,6 +377,8 @@ _exitCommand ??= new DelegateCommand(Exit); void Exit() { //_chkFunction.HIKLoginOut(); + //清录屏进程 + _eventAggregator.GetEvent().Publish(2); _socketHelper.SocketDisConnect(); Process.GetCurrentProcess().Kill(); Environment.Exit(0); @@ -465,6 +467,8 @@ _exitCommand ??= new DelegateCommand(Exit); { //FingerMsg = !_fingerprintUtil.bIsConnected; //_eventAggregator.GetEvent().Subscribe(LoginEvent); + //结束录屏 + _eventAggregator.GetEvent().Publish(0); } @@ -478,6 +482,10 @@ _exitCommand ??= new DelegateCommand(Exit); public void OnNavigatedFrom(NavigationContext navigationContext) { _eventAggregator.GetEvent().Unsubscribe(LoginEvent); + #region 录屏 + //登录进来后开始录屏 + _eventAggregator.GetEvent().Publish(1); + #endregion } //手动实现调用配置的逻辑 规避修改配置文件后不起作用的问题 public string ReadAppSetting(string key) diff --git a/DM_Weight/ViewModels/MainWindowViewModel.cs b/DM_Weight/ViewModels/MainWindowViewModel.cs index ae79b7b..5c12129 100644 --- a/DM_Weight/ViewModels/MainWindowViewModel.cs +++ b/DM_Weight/ViewModels/MainWindowViewModel.cs @@ -1,30 +1,40 @@ -using MaterialDesignThemes.Wpf; +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 ScreenRecorderLib; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; -using System.Windows.Media; -using DM_Weight.msg; -using DM_Weight.Port; -using DM_Weight.util; -using DM_Weight.Finger; -using DM_Weight.Views; -using Unity; -using DM_Weight.HIKVISION; -using log4net.Repository.Hierarchy; -using log4net; -using DM_Weight.Models; 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)); @@ -74,9 +84,11 @@ namespace DM_Weight.ViewModels private PortUtil _portUtil; public MainWindowViewModel(IRegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator, FingerprintUtil fingerprintUtil, SocketHelper socketHelper, PortUtil portUtil) { + vm = this; _portUtil = portUtil; this.eventAggregator = eventAggregator; this.eventAggregator.GetEvent().Subscribe(doMyPrismEvent2); + this.eventAggregator.GetEvent().Subscribe(PrintScreen); _fingerprintUtil = fingerprintUtil; _regionManager = regionManager; _container = container; @@ -146,6 +158,90 @@ namespace DM_Weight.ViewModels SnackbarMessageQueue.Enqueue(msg.Message); })); } + #region 录屏 + /// + /// 录屏事件 + /// + /// 0停止录屏;1开始录屏;2退出软件清进程 + 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() + { + + //退出登录结束录屏 + _recorder?.Stop(); + } + //录屏 + void StartPrintScreen() + { + + // 创建输出目录 + _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}"); + } } } diff --git a/DM_Weight/Views/AdditionWindow.xaml b/DM_Weight/Views/AdditionWindow.xaml index 36da0f9..7e63f7e 100644 --- a/DM_Weight/Views/AdditionWindow.xaml +++ b/DM_Weight/Views/AdditionWindow.xaml @@ -240,9 +240,21 @@ - + + + + + + + + + + + + + + diff --git a/DM_Weight/Views/MainWindow.xaml.cs b/DM_Weight/Views/MainWindow.xaml.cs index b4157d4..d811dc4 100644 --- a/DM_Weight/Views/MainWindow.xaml.cs +++ b/DM_Weight/Views/MainWindow.xaml.cs @@ -1,4 +1,10 @@ -using Prism.Events; +using DM_Weight.msg; +using DM_Weight.Port; +using DM_Weight.util; +using DM_Weight.ViewModels; +using log4net; +using log4net.Repository.Hierarchy; +using Prism.Events; using Prism.Ioc; using Prism.Regions; using System; @@ -16,11 +22,6 @@ using System.Windows.Media.Imaging; using System.Windows.Shapes; using Unity; using Unity.Lifetime; -using DM_Weight.msg; -using DM_Weight.util; -using log4net.Repository.Hierarchy; -using DM_Weight.Port; -using log4net; namespace DM_Weight.Views { @@ -31,10 +32,12 @@ namespace DM_Weight.Views { //IRegionManager _regionManager; //IUnityContainer _container; + MainWindowViewModel vms; private readonly ILog logger = LogManager.GetLogger(typeof(PortUtil)); public MainWindow() { InitializeComponent(); + vms = MainWindowViewModel.vm; //_regionManager = regionManager; //_container = container; //System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() => @@ -46,6 +49,10 @@ namespace DM_Weight.Views //})); } - + protected override void OnClosed(EventArgs e) + { + vms._recorder?.Dispose(); + base.OnClosed(e); + } } } diff --git a/DM_Weight/msg/PrintScreenEvent.cs b/DM_Weight/msg/PrintScreenEvent.cs new file mode 100644 index 0000000..720e81c --- /dev/null +++ b/DM_Weight/msg/PrintScreenEvent.cs @@ -0,0 +1,13 @@ +using Prism.Events; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DM_Weight.msg +{ + internal class PrintScreenEvent : PubSubEvent + { + } +}