From 991581280848b10c9c76ca47502194f99f8063da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=B7=A7?= <625215135@qq.com> Date: Mon, 21 Jul 2025 15:24:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BD=95=E5=B1=8F=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DM_Weight/App.config | 4 +- DM_Weight/App.xaml.cs | 2 + DM_Weight/DM_Weight.csproj | 1 - DM_Weight/Models/ChannelStock.cs | 2 +- DM_Weight/Models/DrugInfo.cs | 4 +- .../ViewModels/AddToJiaoJieDialogViewModel.cs | 200 ++++++++------- .../AddToJiaoJieNewWindowViewModel.cs | 241 ++++++++++++++++++ .../ViewModels/AddToJiaoJieWindowViewModel.cs | 10 +- DM_Weight/ViewModels/HomeWindowViewModel.cs | 2 + DM_Weight/ViewModels/LoginWindowViewModel.cs | 5 +- DM_Weight/ViewModels/MainWindowViewModel.cs | 147 ++++++----- DM_Weight/Views/AddToJiaoJieNewWindow.xaml | 165 ++++++++++++ DM_Weight/Views/AddToJiaoJieNewWindow.xaml.cs | 28 ++ DM_Weight/Views/AddToJiaoJieWindow.xaml | 2 +- .../Views/Dialog/AddToJiaoJieDialog.xaml | 88 ++++--- DM_Weight/Views/MainWindow.xaml.cs | 15 +- DM_Weight/util/FFmpegHelper.cs | 79 ++++++ DM_Weight/util/OpenCVScreenRecord.cs | 13 + 18 files changed, 784 insertions(+), 224 deletions(-) create mode 100644 DM_Weight/ViewModels/AddToJiaoJieNewWindowViewModel.cs create mode 100644 DM_Weight/Views/AddToJiaoJieNewWindow.xaml create mode 100644 DM_Weight/Views/AddToJiaoJieNewWindow.xaml.cs create mode 100644 DM_Weight/util/FFmpegHelper.cs create mode 100644 DM_Weight/util/OpenCVScreenRecord.cs diff --git a/DM_Weight/App.config b/DM_Weight/App.config index 68a8d03..73e426e 100644 --- a/DM_Weight/App.config +++ b/DM_Weight/App.config @@ -37,12 +37,12 @@ - + - + diff --git a/DM_Weight/App.xaml.cs b/DM_Weight/App.xaml.cs index 0a23294..6ef46ef 100644 --- a/DM_Weight/App.xaml.cs +++ b/DM_Weight/App.xaml.cs @@ -266,6 +266,8 @@ namespace DM_Weight containerRegistry.RegisterForNavigation(); //紧急开锁页面 containerRegistry.RegisterForNavigation(); + //交接柜加药页面 + containerRegistry.RegisterForNavigation(); } diff --git a/DM_Weight/DM_Weight.csproj b/DM_Weight/DM_Weight.csproj index b75f7e8..2b270b6 100644 --- a/DM_Weight/DM_Weight.csproj +++ b/DM_Weight/DM_Weight.csproj @@ -71,7 +71,6 @@ - diff --git a/DM_Weight/Models/ChannelStock.cs b/DM_Weight/Models/ChannelStock.cs index 2256fea..42093ea 100644 --- a/DM_Weight/Models/ChannelStock.cs +++ b/DM_Weight/Models/ChannelStock.cs @@ -112,7 +112,7 @@ namespace DM_Weight.Models [SugarColumn(IsIgnore = true)] public string Location { - get => ColNo == 0 ? DrawerNo + "号交接柜" :ColNo==-1?"未绑定": ColNo == -2 ? "库存不足" : DrawerNo + "-" + ColNo; + get => ColNo == 0 ? DrawerNo + "号交接柜" :ColNo==-1?"未绑定/无库存": ColNo == -2 ? "库存不足" : DrawerNo + "-" + ColNo; } private int _addQuantity = 0; diff --git a/DM_Weight/Models/DrugInfo.cs b/DM_Weight/Models/DrugInfo.cs index 8506887..628ac9d 100644 --- a/DM_Weight/Models/DrugInfo.cs +++ b/DM_Weight/Models/DrugInfo.cs @@ -94,7 +94,9 @@ namespace DM_Weight.Models set { SetProperty(ref _base, value); } } - + //交接柜补药弹窗对应的需补药数 + [SugarColumn(IsIgnore = true)] + public int? NeedQuantity { get; set; } } } diff --git a/DM_Weight/ViewModels/AddToJiaoJieDialogViewModel.cs b/DM_Weight/ViewModels/AddToJiaoJieDialogViewModel.cs index 4754524..29e10f0 100644 --- a/DM_Weight/ViewModels/AddToJiaoJieDialogViewModel.cs +++ b/DM_Weight/ViewModels/AddToJiaoJieDialogViewModel.cs @@ -9,6 +9,7 @@ using Prism.Events; using Prism.Mvvm; using Prism.Regions; using Prism.Services.Dialogs; +using SqlSugar; using System; using System.Collections.Generic; using System.Configuration; @@ -24,6 +25,13 @@ namespace DM_Weight.ViewModels public class AddToJiaoJieDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime { private readonly ILog logger = LogManager.GetLogger(typeof(OrderTakeDialogViewModel)); + private List _drugInfoList = new List(); + + public List _DrugInfoList + { + get => _drugInfoList; + set => SetProperty(ref _drugInfoList, value); + } private List _channelStocks = new List(); @@ -52,12 +60,12 @@ namespace DM_Weight.ViewModels /// /// 交接柜的库位信息 /// - private ChannelStock _jiaojei_cs; + private ChannelStock _jiaojie_cs; public ChannelStock Jiaojie_cs { - get => _jiaojei_cs; - set => SetProperty(ref _jiaojei_cs, value); + get => _jiaojie_cs; + set => SetProperty(ref _jiaojie_cs, value); } private static readonly DateTime Jan1st1970 = new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); @@ -209,12 +217,14 @@ namespace DM_Weight.ViewModels } public async void RequestData() { - List channelStocks = new List(); - List msg = new List(); + //List channelStocks = new List(); + List drugList = new List(); for (int i = 0; i < ChannelStocks.Count; i++) { + DrugInfo drug = ChannelStocks[i].DrugInfo; + drug.NeedQuantity = ChannelStocks[i].AddQuantity; List HasQChannels = SqlSugarHelper.Db.Queryable() - .Includes(cs => cs.DrugInfo) + //.Includes(cs => cs.DrugInfo) .Where(cs => cs.Quantity > 0) .Where(cs => cs.DrawerType == 1) .Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM3")) @@ -222,11 +232,6 @@ namespace DM_Weight.ViewModels //.OrderBy(cs => cs.EffDate) .OrderBy(cs => new { cs.EffDate, cs.DrawerNo, cs.ColNo }) .ToList(); - //if (HasQChannels == null || HasQChannels.Count <= 0) - //{ - // msg.Add($"有药品未绑定,请先绑定"); - // continue; - //} if (HasQChannels != null && HasQChannels.Count > 0) { int total = HasQChannels.Sum(it => it.Quantity); @@ -234,37 +239,42 @@ namespace DM_Weight.ViewModels // 说明数量足够 //if (total >= TakeQ) //{ - //for (int j = 0; TakeQ > 0; j++) - //{ - // ChannelStock stock = HasQChannels[j]; - // if (TakeQ > stock.Quantity) - // { - // stock.TakeQuantity = stock.Quantity; - // channelStocks.Add(stock); - // TakeQ -= stock.Quantity; - // } - // else - // { - // stock.TakeQuantity = TakeQ; - // channelStocks.Add(stock); - // TakeQ = 0; - // } - //} - int hadTakeQ = 0; - for (int j = 0; j < HasQChannels.Count; j++) + //for (int j = 0; TakeQ > 0; j++) + //{ + // ChannelStock stock = HasQChannels[j]; + // if (TakeQ > stock.Quantity) + // { + // stock.TakeQuantity = stock.Quantity; + // channelStocks.Add(stock); + // TakeQ -= stock.Quantity; + // } + // else + // { + // stock.TakeQuantity = TakeQ; + // channelStocks.Add(stock); + // TakeQ = 0; + // } + //} + int hadTakeQ = 0; + for (int j = 0; j < HasQChannels.Count; j++) + { + if ((ChannelStocks[i].AddQuantity - hadTakeQ) > HasQChannels[j].Quantity) { - if ((ChannelStocks[i].AddQuantity - hadTakeQ) > HasQChannels[j].Quantity) - { - HasQChannels[j].TakeQuantity = HasQChannels[j].Quantity; - hadTakeQ += HasQChannels[j].Quantity; - } - else - { - HasQChannels[j].TakeQuantity = ChannelStocks[i].AddQuantity - hadTakeQ; - break; - } + HasQChannels[j].TakeQuantity = HasQChannels[j].Quantity; + hadTakeQ += HasQChannels[j].Quantity; } - channelStocks.AddRange(HasQChannels); + else + { + HasQChannels[j].TakeQuantity = ChannelStocks[i].AddQuantity - hadTakeQ; + break; + } + } + + if (drug.channelStocks == null) + { + drug.channelStocks = new List(); + } + drug.channelStocks.AddRange(HasQChannels); //} //else //{ @@ -287,31 +297,13 @@ namespace DM_Weight.ViewModels channel.ManuNo = null; channel.EffDate = null; channel.TakeQuantity = 0; - channelStocks.Add(channel); + if (drug.channelStocks == null) + { + drug.channelStocks = new List(); + } + drug.channelStocks.Add(channel); } - } - if (msg.Count > 0) - { - RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); - //MessageBox.Show(string.Join("\n", msg)); - DialogParameters dialogParameters = new DialogParameters(); - dialogParameters.Add("msgInfo", msg); - DialogServiceExtensions.ShowDialogHost(_dialogService, "ShowMessageDialog", dialogParameters, "RootDialog"); - - } - else - { - //channelStocks.Sort((a, b) => - //{ - // if ((a.DrawerNo - b.DrawerNo) == 0) - // { - // return a.ColNo - b.ColNo; - // } - // return a.DrawerNo - b.DrawerNo; - //}); - ChannelStocks = channelStocks; - - + _DrugInfoList.Add(drug); } } public DelegateCommand OpenDrawer @@ -323,7 +315,7 @@ namespace DM_Weight.ViewModels if (HomeWindowViewModel.Operator.Role != null && HomeWindowViewModel.Operator.Role.RoleName != "管理员") { //查看当前用户是否有所在药品抽屉的权限;1-2层所有人能开,其他6层管理员才能开 - bool bDrawer = ChannelStocks.Select(it => it.DrawerNo).Where(n => n > 2).Any(); + bool bDrawer = _DrugInfoList.Where(di => di.channelStocks.Select(it => it.DrawerNo).Where(n => n > 2).Any()).Count() > 0; if (bDrawer) { AlertMsg alertMsg = new AlertMsg @@ -336,7 +328,9 @@ namespace DM_Weight.ViewModels } } - enumerable = ChannelStocks.Where(cs => cs.TakeQuantity > 0).GroupBy(cs => cs.DrawerNo, cs => cs); + enumerable = _DrugInfoList.SelectMany(di => di.channelStocks).Where(cs => cs.TakeQuantity > 0).GroupBy(cs => cs.DrawerNo, cs => cs); + + // enumerable = ChannelStocks.Where(cs => cs.TakeQuantity > 0).GroupBy(cs => cs.DrawerNo, cs => cs); if (enumerable != null && enumerable.Count() > 0) { enumerator = enumerable.GetEnumerator(); @@ -410,12 +404,12 @@ namespace DM_Weight.ViewModels _isFinishClick = true; - List record = ChannelStocks.FindAll(it => it.TakeQuantity > 0).ToList(); + List record = _DrugInfoList.SelectMany(di => di.channelStocks).Where(cs => cs.TakeQuantity > 0).ToList(); if (record.Count > 0) { //交接柜需要补药数量与加药数量对比,数量不一致则提示 - var jjSum = from item in Jiaojie_ChannelStocks orderby item.DrugId group item by item.DrugId into g select new { DrugId = g.Key, Quantity = g.Sum(item => item.NeedNum) }; + var jjSum = from item in Jiaojie_ChannelStocks orderby item.DrugId group item by item.DrugId into g select new { DrugId = g.Key, Quantity = g.Sum(item => item.AddQuantity) }; var csSum = from item in record orderby item.DrugId group item by item.DrugId into g select new { DrugId = g.Key, Quantity = g.Sum(item => item.TakeQuantity) }; foreach (var jjItem in jjSum) @@ -476,14 +470,30 @@ namespace DM_Weight.ViewModels for (int i = 0; i < Jiaojie_ChannelStocks.Count; i++) { ChannelStock jiaoStock = Jiaojie_ChannelStocks[i]; - List csStockList = record.Where(cs => cs.DrugId == Jiaojie_ChannelStocks[i].DrugId && cs.TakeQuantity > 0).ToList(); + List csStockList = record.Where(cs => cs.DrugId == jiaoStock.DrugId && cs.TakeQuantity > 0).ToList(); if (csStockList != null && csStockList.Count > 0) { - int jjNeedQuantity = SqlSugarHelper.Db.Queryable().Where(cs => cs.DrawerNo == jiaoStock.DrawerNo && cs.DrugId == jiaoStock.DrugId && cs.MachineId == jiaoStock.MachineId).Sum(cs => cs.NeedNum); + int jjNeedQuantity = jiaoStock.AddQuantity;// SqlSugarHelper.Db.Queryable().Where(cs => cs.DrawerNo == jiaoStock.DrawerNo && cs.DrugId == jiaoStock.DrugId && cs.MachineId == jiaoStock.MachineId).Sum(cs => (cs.BaseQuantity-cs.Quantity)); SqlSugarHelper.Db.Deleteable().Where(cs => cs.DrawerNo == jiaoStock.DrawerNo && cs.DrugId == jiaoStock.DrugId && cs.MachineId == jiaoStock.MachineId && cs.Quantity <= 0).ExecuteCommand(); for (int j = 0; j < csStockList.Count; j++) { + // 保存数据 记录 + SqlSugarHelper.Db.Insertable(new MachineRecord() + { + MachineId = jiaoStock.MachineId, + DrawerNo = jiaoStock.DrawerNo, + DrugId = jiaoStock.DrugId, + ManuNo = csStockList[i].ManuNo, + Operator = HomeWindowViewModel.Operator?.Id, + Reviewer = HomeWindowViewModel.Reviewer?.Id, + OperationTime = DateTime.Now, + Quantity = csStockList[i].TakeQuantity, + Type = 55, + Status = 2,//给交接柜补药不用还空瓶,等真正用了以后再还空瓶,所以先把状态置为2 + InvoiceId = $"毒麻柜{csStockList[i].Location}给交接柜{jiaoStock.DrawerNo}补药" + }).ExecuteCommand(); + ChannelStock csStock = (ChannelStock)csStockList[j].Clone(); ChannelStock jjStockManuNo = SqlSugarHelper.Db.Queryable() .Where(cs => cs.DrawerNo == Jiaojie_ChannelStocks[i].DrawerNo && cs.DrugId == Jiaojie_ChannelStocks[i].DrugId && cs.ManuNo == csStock.ManuNo && cs.MachineId == "DM5").First(); @@ -491,9 +501,9 @@ namespace DM_Weight.ViewModels if (jjStockManuNo != null) { int addNum = csStock.TakeQuantity; - logger.Info($"需补药数{Jiaojie_ChannelStocks[i].NeedNum},该批次取药数{csStock.TakeQuantity}"); + logger.Info($"需补药数{Jiaojie_ChannelStocks[i].AddQuantity},该批次取药数{csStock.TakeQuantity}"); //有该批次 - if (Jiaojie_ChannelStocks[i].NeedNum > csStock.TakeQuantity) + if (Jiaojie_ChannelStocks[i].AddQuantity > csStock.TakeQuantity) { //不够取 ChannelStock newStock = new ChannelStock(); @@ -512,7 +522,7 @@ namespace DM_Weight.ViewModels UpdateJJStock.Add(newStock); csStockList[j].CheckQuantity = csStockList[j].TakeQuantity; csStockList[j].TakeQuantity = 0; - Jiaojie_ChannelStocks[i].NeedNum = Jiaojie_ChannelStocks[i].NeedNum - csStock.TakeQuantity; + Jiaojie_ChannelStocks[i].AddQuantity = Jiaojie_ChannelStocks[i].AddQuantity - csStock.TakeQuantity; } else { @@ -530,7 +540,7 @@ namespace DM_Weight.ViewModels newStock.EffDate = Jiaojie_ChannelStocks[i].EffDate; newStock.DrawerNo = Jiaojie_ChannelStocks[i].DrawerNo; newStock.DrugId = Jiaojie_ChannelStocks[i].DrugId; - newStock.AddToJJNum = Jiaojie_ChannelStocks[i].NeedNum; + newStock.AddToJJNum = Jiaojie_ChannelStocks[i].AddQuantity; newStock.Id = jjStockManuNo.Id; newStock.State = 1; //newStock.MachineId = jiaoStock.MachineId; @@ -538,14 +548,14 @@ namespace DM_Weight.ViewModels //newStock.Quantity = jiaoStock.Quantity + csStock.TakeQuantity; UpdateJJStock.Add(newStock); csStockList[j].CheckQuantity = csStockList[j].TakeQuantity; - csStockList[j].TakeQuantity = csStock.TakeQuantity - Jiaojie_ChannelStocks[i].NeedNum; - Jiaojie_ChannelStocks[i].NeedNum = 0; + csStockList[j].TakeQuantity = csStock.TakeQuantity - Jiaojie_ChannelStocks[i].AddQuantity; + Jiaojie_ChannelStocks[i].AddQuantity = 0; break; } } else //没有该批次 { - if (Jiaojie_ChannelStocks[i].NeedNum > csStock.TakeQuantity) + if (Jiaojie_ChannelStocks[i].AddQuantity > csStock.TakeQuantity) { //不够取 ChannelStock newStock = new ChannelStock(); @@ -559,10 +569,10 @@ namespace DM_Weight.ViewModels newStock.Id = Guid.NewGuid().ToString(); newStock.MachineId = Jiaojie_ChannelStocks[i].MachineId; newStock.DrawerType = 1; - newStock.NeedNum = 0; + newStock.AddQuantity = 0; newStock.State = 1; AddJJStock.Add(newStock); - Jiaojie_ChannelStocks[i].NeedNum = Jiaojie_ChannelStocks[i].NeedNum - csStock.TakeQuantity; + Jiaojie_ChannelStocks[i].AddQuantity = Jiaojie_ChannelStocks[i].AddQuantity - csStock.TakeQuantity; csStockList[j].CheckQuantity = csStockList[j].TakeQuantity; csStockList[j].TakeQuantity = 0; } @@ -576,8 +586,8 @@ namespace DM_Weight.ViewModels newStock.DrugId = Jiaojie_ChannelStocks[i].DrugId; newStock.ManuNo = csStock.ManuNo; newStock.EffDate = csStock.EffDate; - newStock.AddToJJNum = Jiaojie_ChannelStocks[i].NeedNum; - newStock.NeedNum = 0; + newStock.AddToJJNum = Jiaojie_ChannelStocks[i].AddQuantity; + newStock.AddQuantity = 0; newStock.Id = Guid.NewGuid().ToString(); newStock.MachineId = Jiaojie_ChannelStocks[i].MachineId; newStock.DrawerType = 1; @@ -589,18 +599,18 @@ namespace DM_Weight.ViewModels } } } - int addQuantity= AddJJStock.Where(aj => aj.DrugId == jiaoStock.DrugId).Sum(aj => aj.AddToJJNum); - int updateQuantity = UpdateJJStock.Where(aj => aj.DrugId == jiaoStock.DrugId).Sum(aj => aj.AddToJJNum); - int iUpdateResult= SqlSugarHelper.Db.Updateable() - .SetColumns(cs => new ChannelStock() { NeedNum = 0,State=1 }) - .Where(cs => cs.DrawerNo == Jiaojie_ChannelStocks[i].DrawerNo && cs.DrugId == Jiaojie_ChannelStocks[i].DrugId && cs.MachineId == Jiaojie_ChannelStocks[i].MachineId) - .ExecuteCommand(); - jiaoStock.NeedNum = jjNeedQuantity - (addQuantity + updateQuantity); - int iUpdateResult2 = SqlSugarHelper.Db.Updateable(jiaoStock) - .UpdateColumns(it => new { it.NeedNum }) - .ExecuteCommand(); + //int addQuantity= AddJJStock.Where(aj => aj.DrugId == jiaoStock.DrugId).Sum(aj => aj.AddToJJNum); + //int updateQuantity = UpdateJJStock.Where(aj => aj.DrugId == jiaoStock.DrugId).Sum(aj => aj.AddToJJNum); + int iUpdateResult = SqlSugarHelper.Db.Updateable() + .SetColumns(cs => new ChannelStock() { State = 1 }) + .Where(cs => cs.DrawerNo == Jiaojie_ChannelStocks[i].DrawerNo && cs.DrugId == Jiaojie_ChannelStocks[i].DrugId && cs.MachineId == Jiaojie_ChannelStocks[i].MachineId) + .ExecuteCommand(); + //jiaoStock.NeedNum = jjNeedQuantity - (addQuantity + updateQuantity); + //int iUpdateResult2 = SqlSugarHelper.Db.Updateable(jiaoStock) + // .UpdateColumns(it => new { it.NeedNum }) + // .ExecuteCommand(); } - + } //保存交接柜数据 @@ -611,7 +621,7 @@ namespace DM_Weight.ViewModels { var ret = jj.First(); ret.AddToJJNum = jj.Sum(itx => itx.AddToJJNum); - ret.NeedNum = 0; + //ret.NeedNum = 0; return ret; }).ToList(); SqlSugarHelper.Db.Insertable(AddJJStock).ExecuteCommand(); @@ -623,7 +633,7 @@ namespace DM_Weight.ViewModels { var ret = jj.First(); ret.AddToJJNum = jj.Sum(itx => itx.AddToJJNum); - ret.NeedNum = 0; + //ret.NeedNum = 0; return ret; }).ToList(); for (int i = 0; i < UpdateJJStock.Count; i++) @@ -716,7 +726,7 @@ namespace DM_Weight.ViewModels _eventAggregator.GetEvent().Publish(alertMsg); } Status = 0; - _isFinishClick = false; + _isFinishClick = false; _portUtil.OperateFinish = true; //RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); RequestClose?.Invoke(new DialogResult(ButtonResult.OK)); diff --git a/DM_Weight/ViewModels/AddToJiaoJieNewWindowViewModel.cs b/DM_Weight/ViewModels/AddToJiaoJieNewWindowViewModel.cs new file mode 100644 index 0000000..bbadeaa --- /dev/null +++ b/DM_Weight/ViewModels/AddToJiaoJieNewWindowViewModel.cs @@ -0,0 +1,241 @@ +using DM_Weight.Models; +using DM_Weight.msg; +using DM_Weight.Port; +using DM_Weight.util; +using log4net; +using Prism.Commands; +using Prism.Events; +using Prism.Mvvm; +using Prism.Regions; +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DM_Weight.ViewModels +{ + internal class AddToJiaoJieNewWindowViewModel : BindableBase, INavigationAware, IRegionMemberLifetime + { + private readonly ILog logger = LogManager.GetLogger(typeof(AddToJiaoJieWindowViewModel)); + private static readonly DateTime Jan1st1970 = new DateTime + (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + public long CurrentTimeMillis() + { + return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds; + } + public bool KeepAlive => false; + public bool IsNavigationTarget(NavigationContext navigationContext) + { + return true; + } + + public void OnNavigatedFrom(NavigationContext navigationContext) + { + // 取消消息订阅 + //_eventAggregator.GetEvent().Unsubscribe(DoMyPrismEvent); + //_eventAggregator.GetEvent().Unsubscribe(SetIsSelected); + } + + + private List? channelStocks; + public List? ChannelStocks + { + get => channelStocks; + set => SetProperty(ref channelStocks, value); + } + + private ChannelStock _channelStock; + public ChannelStock _ChannelStock + { + get => _channelStock; + set => SetProperty(ref _channelStock, value); + } + + private List? _channelStocksList; + public List? _ChannelStocksList + { + get => _channelStocksList; + set => SetProperty(ref _channelStocksList, value); + } + + private List? _channelLists; + public List? _ChannelLists + { + get => _channelLists; + set => SetProperty(ref _channelLists, value); + } + private ChannelList _channelList; + public ChannelList _ChannelList + { + get => _channelList; + set => SetProperty(ref _channelList, value); + } + + + + public void OnNavigatedTo(NavigationContext navigationContext) + { + RequestData(); + } + private PortUtil _portUtil; + IEventAggregator _eventAggregator; + IDialogService _dialogService; + public AddToJiaoJieNewWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator, IDialogService DialogService) + { + _portUtil = portUtil; + _eventAggregator = eventAggregator; + _dialogService = DialogService; + } + private void RequestData() + { + + ChannelStocks?.Clear(); + _ChannelLists?.Clear(); + //1)查询channel_stock所有要补药的药箱 + ChannelStocks = SqlSugarHelper.Db.Queryable() + .Includes(cs => cs.ChannelLst) + .Includes(cs => cs.DrugInfo) + .Where(cs => cs.MachineId == (ConfigurationManager.AppSettings["jj_machineId"] ?? "DM5")) + .OrderBy(cs => cs.Chnguid) + .OrderBy(cs => cs.DrawerNo) + .ToList(); + ChannelStocks = ChannelStocks.GroupBy(it => new { it.DrawerNo, it.DrugId }) + .Select(it => + { + var ret = it.First(); + ret.Quantity = it.Sum(itx => itx.Quantity); + //ret.NeedNum = ret.BaseQuantity-it.Sum(itx => itx.Quantity); + return ret; + }).Where(it => it.BaseQuantity > it.Quantity) + .ToList(); + if (ChannelStocks != null && ChannelStocks.Count > 0) + { + ChannelStocks.ForEach(cs => cs.AddQuantity =cs.BaseQuantity- cs.Quantity); + + //2)查询channel_list将1)中查询的添加到channel_list的channel_stock里供页面呈现显示 + List DrawerNoList = ChannelStocks.Select(cs => cs.DrawerNo).Distinct().ToList(); + List channelLists = new List(); + for (int i = 0; i < DrawerNoList.Count; i++) + { + var channelList = SqlSugarHelper.Db.Queryable() + .Where(cl => cl.MachineId == (ConfigurationManager.AppSettings["jj_machineId"] ?? "DM5") && cl.DrawerNo == DrawerNoList[i]) + .OrderBy(cl => cl.Id) + .OrderBy(cl => cl.DrawerNo) + .First(); + if (channelList.channelStocks == null) + { + channelList.channelStocks = new List(); + } + channelList.channelStocks.AddRange(ChannelStocks.Where(cs => cs.DrawerNo == DrawerNoList[i]).ToList()); + if (channelList != null) + { + //if (channelList.channelStocks[0].AddToJJNum>0) + // channelList.State=1; //表示有补药 + channelLists.Add(channelList); + } + } + _ChannelLists = channelLists; + } + else + { + _ChannelLists?.Clear(); + _ChannelLists = new List(); + } + + } + private int _status = 0; + + public int Status { get => _status; set => SetProperty(ref _status, value); } + + private bool _isEnable = true; + public bool IsEnable { get => _isEnable; set => SetProperty(ref _isEnable, value); } + + private List iDrawerNoLst + { get; set; } + private int CurrentNum { get; set; } + + //刷新 + public DelegateCommand QueryCommand + { + get => new DelegateCommand(() => RequestData()); + } + public DelegateCommand RejectReport_Download + { + get => new DelegateCommand(() => + { + //GridReportUtil.RejectionReport(""); + }); + } + public DelegateCommand Account_Download + { + get => new DelegateCommand(() => + { + //GridReportUtil.AccountNewReport(); + }); + } + + + private List csList = new List(); + //取药 弹出出药列表 + public DelegateCommand TakeDrugCommand + { + get => new DelegateCommand(async () => + { + csList = _ChannelList.channelStocks.FindAll(cs => cs.ChannelLst.IsSelected).ToList(); + + if (csList != null && csList.Count > 0) + { + // 此处延时1毫秒,等待页面渲染 + await Task.Delay(TimeSpan.FromMilliseconds(1)); + DialogParameters dialogParameters = new DialogParameters(); + dialogParameters.Add("_ChannelStock", csList); + DialogServiceExtensions.ShowDialogHost(_dialogService, "AddToJiaoJieDialog", dialogParameters, DoDialogResult, "RootDialog"); + + } + else + { + AlertMsg alertMsg = new AlertMsg + { + Message = $"未选择药品,请先点选药箱号", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + _portUtil.Operate = false; + } + }); + } + private void DoDialogResult(IDialogResult dialogResult) + { + RequestData(); + } + + private DelegateCommand _rowSelected; + + public DelegateCommand RowSelected => _rowSelected ??= new DelegateCommand(OpenOrderDialog); + public async void OpenOrderDialog() + { + if (_ChannelList != null && _ChannelList.channelStocks != null && _ChannelList.channelStocks.Any(cs => cs.State == 0)) + { + // 此处延时1毫秒,等待页面渲染 + await Task.Delay(TimeSpan.FromMilliseconds(1)); + //选中药箱号下的所有药品id + DialogParameters dialogParameters = new DialogParameters(); + dialogParameters.Add("_ChannelStock", _ChannelList.channelStocks.Where(cs => cs.State == 0).ToList()); + DialogServiceExtensions.ShowDialogHost(_dialogService, "AddToJiaoJieDialog", dialogParameters, DoDialogResult, "RootDialog"); + + } + if (_ChannelList != null) + { + AlertMsg alertMsg = new AlertMsg + { + Message = $"药品已取出,待入库", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + } + } + } +} diff --git a/DM_Weight/ViewModels/AddToJiaoJieWindowViewModel.cs b/DM_Weight/ViewModels/AddToJiaoJieWindowViewModel.cs index 54028c3..c5d8fb5 100644 --- a/DM_Weight/ViewModels/AddToJiaoJieWindowViewModel.cs +++ b/DM_Weight/ViewModels/AddToJiaoJieWindowViewModel.cs @@ -96,7 +96,7 @@ namespace DM_Weight.ViewModels ChannelStocks = SqlSugarHelper.Db.Queryable() .Includes(cs => cs.ChannelLst) .Includes(cs => cs.DrugInfo) - .Where(cs => cs.MachineId == (ConfigurationManager.AppSettings["jj_machineId"] ?? "DM5") && (cs.NeedNum > 0 || cs.AddToJJNum > 0)) + .Where(cs => cs.MachineId == (ConfigurationManager.AppSettings["jj_machineId"] ?? "DM5")) .OrderBy(cs => cs.Chnguid) .OrderBy(cs => cs.DrawerNo) .ToList(); @@ -105,16 +105,16 @@ namespace DM_Weight.ViewModels { var ret = it.First(); ret.Quantity = it.Sum(itx => itx.Quantity); - ret.NeedNum = it.Sum(itx => itx.NeedNum); + //ret.NeedNum = it.Sum(itx => itx.NeedNum); return ret; }).Where(it => it.BaseQuantity > it.Quantity) .ToList(); if (ChannelStocks != null && ChannelStocks.Count > 0) { - ChannelStocks.ForEach(cs => cs.AddQuantity = cs.NeedNum); + ChannelStocks.ForEach(cs => cs.AddQuantity = cs.BaseQuantity-cs.Quantity); //2)查询channel_list将1)中查询的添加到channel_list的channel_stock里供页面呈现显示 - List DrawerNoList = ChannelStocks.Select(cs => cs.DrawerNo).Distinct().ToList(); + List DrawerNoList = ChannelStocks.Select(cs => cs.DrawerNo).Distinct().OrderBy(cs=>cs).ToList(); List channelLists = new List(); for (int i = 0; i < DrawerNoList.Count; i++) { @@ -127,7 +127,7 @@ namespace DM_Weight.ViewModels { channelList.channelStocks = new List(); } - channelList.channelStocks.AddRange(ChannelStocks.Where(cs => cs.DrawerNo == DrawerNoList[i]&&(cs.NeedNum>0||cs.AddToJJNum>0)).ToList()); + channelList.channelStocks.AddRange(ChannelStocks.Where(cs => cs.DrawerNo == DrawerNoList[i]).ToList()); if (channelList != null) { //if (channelList.channelStocks[0].AddToJJNum>0) diff --git a/DM_Weight/ViewModels/HomeWindowViewModel.cs b/DM_Weight/ViewModels/HomeWindowViewModel.cs index 7a6186a..322400a 100644 --- a/DM_Weight/ViewModels/HomeWindowViewModel.cs +++ b/DM_Weight/ViewModels/HomeWindowViewModel.cs @@ -349,6 +349,8 @@ namespace DM_Weight.ViewModels IEventAggregator _eventAggregator; public HomeWindowViewModel(IRegionManager iRegionManager, PortUtil portUtil, IDialogService dialogService, IUnityContainer container, IEventAggregator eventAggregator) { + + logger.Info("HomeWindowViewModel"); _portUtil = portUtil; _regionManager = iRegionManager; _dialogService = dialogService; diff --git a/DM_Weight/ViewModels/LoginWindowViewModel.cs b/DM_Weight/ViewModels/LoginWindowViewModel.cs index 889cc5c..93fcde1 100644 --- a/DM_Weight/ViewModels/LoginWindowViewModel.cs +++ b/DM_Weight/ViewModels/LoginWindowViewModel.cs @@ -14,7 +14,6 @@ using Prism.Events; using Prism.Ioc; using Prism.Mvvm; using Prism.Regions; -using ScreenRecorderLib; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -471,6 +470,7 @@ _exitCommand ??= new DelegateCommand(Exit); public void OnNavigatedTo(NavigationContext navigationContext) { FingerMsg = !_fingerprintUtil.bIsConnected; + logger.Info("OnNavigatedTo"); _eventAggregator.GetEvent().Subscribe(LoginEvent); //结束录屏 _eventAggregator.GetEvent().Publish(0); @@ -486,8 +486,9 @@ _exitCommand ??= new DelegateCommand(Exit); //这个方法用于拦截请求 public void OnNavigatedFrom(NavigationContext navigationContext) { - _eventAggregator.GetEvent().Unsubscribe(LoginEvent); + _eventAggregator.GetEvent().Unsubscribe(LoginEvent); + logger.Info("OnNavigatedFrom"); #region 录屏 //登录进来后开始录屏 _eventAggregator.GetEvent().Publish(1); diff --git a/DM_Weight/ViewModels/MainWindowViewModel.cs b/DM_Weight/ViewModels/MainWindowViewModel.cs index 7a93d39..be4ff5d 100644 --- a/DM_Weight/ViewModels/MainWindowViewModel.cs +++ b/DM_Weight/ViewModels/MainWindowViewModel.cs @@ -11,7 +11,6 @@ using Prism.Commands; using Prism.Events; using Prism.Mvvm; using Prism.Regions; -using ScreenRecorderLib; using System; using System.Collections.Generic; using System.IO; @@ -26,10 +25,10 @@ namespace DM_Weight.ViewModels internal class MainWindowViewModel : BindableBase { #region 录屏相关 - public Recorder _recorder; + //public Recorder _recorder; private string _outputFolder; private string _outputFilePath; - public static MainWindowViewModel vm; + //public static MainWindowViewModel vm; #endregion private readonly ILog logger = LogManager.GetLogger(typeof(MainWindowViewModel)); @@ -76,9 +75,10 @@ namespace DM_Weight.ViewModels IRegionManager _regionManager; IUnityContainer _container; //private CHKFunction _cHKFunction; - public MainWindowViewModel(IRegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator, FingerprintUtil fingerprintUtil, ScreenUtil screenUtil) + FFmpegHelper fFmpegHelper; + public MainWindowViewModel(IRegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator, FingerprintUtil fingerprintUtil, ScreenUtil screenUtil, FFmpegHelper fFmpegHelper) { - vm = this; + //vm = this; //_portUtil = portUtil; this.eventAggregator = eventAggregator; this.eventAggregator.GetEvent().Subscribe(doMyPrismEvent2); @@ -101,6 +101,7 @@ namespace DM_Weight.ViewModels } })); + this.fFmpegHelper = fFmpegHelper; } void doMyPrismEvent2(AlertMsg msg) @@ -127,83 +128,97 @@ namespace DM_Weight.ViewModels /// 0停止录屏;1开始录屏;2退出软件清进程 void PrintScreen(int type) { - if(type==0) + logger.Info($"录屏事件PrintScreen{type}"); + if (type == 0) { - StopPrintScreen(); - //删除7天前的录屏文件 + fFmpegHelper.stopFlag = true; + fFmpegHelper.StopRecording(); + //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}"); - } - } - } - } + //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.Info($"删除录屏文件失败: {ex.Message}"); + // } + // } + // } + //} } else if (type == 1) { - StartPrintScreen(); + fFmpegHelper.stopFlag = false; + // 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}.webm"); + fFmpegHelper.StartRecording(_outputFilePath, 25); } else if (type == 2) { - _recorder?.Dispose(); + // _recorder?.Dispose(); } } #endregion - void StopPrintScreen() - { + //void StopPrintScreen() + //{ - //退出登录结束录屏 - _recorder?.Stop(); - } - //录屏 - void StartPrintScreen() - { + // //退出登录结束录屏 + // _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"); + // // 创建输出目录 + // _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(); + // // 设置录制选项 + // var options = new RecorderOptions(); - // 创建录制器实例 - _recorder = Recorder.CreateRecorder(options); + // // 创建录制器实例 + // _recorder = Recorder.CreateRecorder(options); - // 设置事件处理 - _recorder.OnRecordingComplete += Recorder_OnRecordingComplete; - _recorder.OnRecordingFailed += Recorder_OnRecordingFailed; + // // 设置事件处理 + // _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}"); - } + // // 开始录制 + // _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/AddToJiaoJieNewWindow.xaml b/DM_Weight/Views/AddToJiaoJieNewWindow.xaml new file mode 100644 index 0000000..e46699b --- /dev/null +++ b/DM_Weight/Views/AddToJiaoJieNewWindow.xaml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DM_Weight/Views/AddToJiaoJieNewWindow.xaml.cs b/DM_Weight/Views/AddToJiaoJieNewWindow.xaml.cs new file mode 100644 index 0000000..fa1c780 --- /dev/null +++ b/DM_Weight/Views/AddToJiaoJieNewWindow.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace DM_Weight.Views +{ + /// + /// AddToJiaoJieNewWindow.xaml 的交互逻辑 + /// + public partial class AddToJiaoJieNewWindow : UserControl + { + public AddToJiaoJieNewWindow() + { + InitializeComponent(); + } + } +} diff --git a/DM_Weight/Views/AddToJiaoJieWindow.xaml b/DM_Weight/Views/AddToJiaoJieWindow.xaml index de40c9f..4735490 100644 --- a/DM_Weight/Views/AddToJiaoJieWindow.xaml +++ b/DM_Weight/Views/AddToJiaoJieWindow.xaml @@ -259,7 +259,7 @@ - + diff --git a/DM_Weight/Views/Dialog/AddToJiaoJieDialog.xaml b/DM_Weight/Views/Dialog/AddToJiaoJieDialog.xaml index 07085b6..c381b4e 100644 --- a/DM_Weight/Views/Dialog/AddToJiaoJieDialog.xaml +++ b/DM_Weight/Views/Dialog/AddToJiaoJieDialog.xaml @@ -37,7 +37,7 @@ - + - - - - - + + + + + + + + + + + + + + + + + + + + + + - + IsReadOnly="True"> + + + + + + - - - - - - + + + + + + + + diff --git a/DM_Weight/Views/MainWindow.xaml.cs b/DM_Weight/Views/MainWindow.xaml.cs index 057a3dd..fc97971 100644 --- a/DM_Weight/Views/MainWindow.xaml.cs +++ b/DM_Weight/Views/MainWindow.xaml.cs @@ -4,7 +4,6 @@ using DM_Weight.ViewModels; using Prism.Events; using Prism.Ioc; using Prism.Regions; -using ScreenRecorderLib; using System; using System.Collections.Generic; using System.Linq; @@ -30,11 +29,11 @@ namespace DM_Weight.Views { //IRegionManager _regionManager; //IUnityContainer _container; - MainWindowViewModel vms; + //MainWindowViewModel vms; public MainWindow() { InitializeComponent(); - vms = MainWindowViewModel.vm; + //vms = MainWindowViewModel.vm; //_regionManager = regionManager; //_container = container; //System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() => @@ -46,11 +45,11 @@ namespace DM_Weight.Views //})); } - protected override void OnClosed(EventArgs e) - { - vms._recorder?.Dispose(); - base.OnClosed(e); - } + //protected override void OnClosed(EventArgs e) + //{ + // vms._recorder?.Dispose(); + // base.OnClosed(e); + //} } } diff --git a/DM_Weight/util/FFmpegHelper.cs b/DM_Weight/util/FFmpegHelper.cs new file mode 100644 index 0000000..6c84f38 --- /dev/null +++ b/DM_Weight/util/FFmpegHelper.cs @@ -0,0 +1,79 @@ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; + +namespace DM_Weight.util +{ + public class FFmpegHelper + { + private Process _ffmpegProcess; + private string _ffmpegPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ffmpeg.exe"); + //是否停止录屏标志 + public bool stopFlag = false; + + public void StartRecording(string outputPath, int frameRate = 30) + { + //int width = (int)SystemParameters.PrimaryScreenWidth; + //int height =(int)SystemParameters.PrimaryScreenHeight; + int segmentDuration = 1800; // 每段半小时 + string args = $"-f gdigrab -framerate {frameRate} " + + $"-i desktop -preset ultrafast -t {segmentDuration} {outputPath}"; + + _ffmpegProcess = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = _ffmpegPath, + Arguments = args, + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardInput = true + } + }; + _ffmpegProcess.Start(); + ThreadPool.QueueUserWorkItem(CheckFFmpegProcess); // 检查FFmpeg进程是否完成,以开始下一个录制段 + } + public void StopRecording() + { + _ffmpegProcess?.StandardInput.WriteLine("q"); + _ffmpegProcess?.WaitForExit(1000); + _ffmpegProcess?.Close(); + stopFlag = true; + } + private void CheckFFmpegProcess(object state) + { + try + { + + if (!stopFlag) + { + _ffmpegProcess.WaitForExit(); // 等待FFmpeg进程结束 + if (!_ffmpegProcess.HasExited) return; // 如果进程未结束,则不继续 + // 开始下一个录制段,如果需要循环录制,可以取消注释下面的代码行并适当调整逻辑 + // StartRecording(); // 注意:这将无限循环录制,可能需要用户界面干预来停止或重置计数器。 + string _outputFolder; + string _outputFilePath; + _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"); + StartRecording(_outputFilePath, 25); + } + } + catch (Exception) + { + } + } + } +} diff --git a/DM_Weight/util/OpenCVScreenRecord.cs b/DM_Weight/util/OpenCVScreenRecord.cs new file mode 100644 index 0000000..56d518a --- /dev/null +++ b/DM_Weight/util/OpenCVScreenRecord.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DM_Weight.util +{ + public class OpenCVScreenRecord + { + + } +}