diff --git a/SlnMesnac.RfidUpload.UI/MainWindow.xaml b/SlnMesnac.RfidUpload.UI/MainWindow.xaml index 5a1907f..b8765dd 100644 --- a/SlnMesnac.RfidUpload.UI/MainWindow.xaml +++ b/SlnMesnac.RfidUpload.UI/MainWindow.xaml @@ -161,7 +161,7 @@ diff --git a/SlnMesnac.RfidUpload.UI/viewModel/MainWindowViewModel.cs b/SlnMesnac.RfidUpload.UI/viewModel/MainWindowViewModel.cs index f558800..361fea3 100644 --- a/SlnMesnac.RfidUpload.UI/viewModel/MainWindowViewModel.cs +++ b/SlnMesnac.RfidUpload.UI/viewModel/MainWindowViewModel.cs @@ -26,6 +26,7 @@ using TouchSocket.Core; using System.Windows.Interop; using static Dm.net.buffer.ByteArrayBuffer; using System.IO; +using System.Collections.Concurrent; namespace SlnMesnac.RfidUpload.UI.viewModel { @@ -49,9 +50,11 @@ namespace SlnMesnac.RfidUpload.UI.viewModel private SysData sysData = SysData.Instance; //暂存库存容器分发配发机构数据 private Institution Institution; + + #region 参数定义 - + /// /// 标签数量 @@ -212,7 +215,7 @@ namespace SlnMesnac.RfidUpload.UI.viewModel FinishCommand = new RelayCommand(Finish); ReUploadRecordCommand = new RelayCommand(ReUploadRecord); this.Init(); - + // test(); } @@ -275,7 +278,11 @@ namespace SlnMesnac.RfidUpload.UI.viewModel private void Init() { - + // 初始化定时器 + _batchTimer.Elapsed += OnBatchTimerElapsed; + _batchTimer.AutoReset = true; + _batchTimer.Start(); + DeleteLogsLogic(); GetRfidList(); @@ -284,12 +291,7 @@ namespace SlnMesnac.RfidUpload.UI.viewModel service.AddTouchSocketAsync(appConfig.RFIDAddress); WorkModelParam = Convert.ToInt32(appConfig.workModel); - Task.Run(() => - { - Thread.Sleep(1000 * 10); - throw new Exception("test"); - - }); + } @@ -587,6 +589,17 @@ namespace SlnMesnac.RfidUpload.UI.viewModel sqliteHelper.DeleteRFIDList(); GetRfidList(); + + #region test + //Task.Run(() => + //{ + // for (int i = 0; i < 1000; i++) + // { + + // RefreshLabelInfoDataGrid($"B{i}"); + // } + //}); + #endregion } /// @@ -597,13 +610,21 @@ namespace SlnMesnac.RfidUpload.UI.viewModel No = 0; labelItems.Clear(); LabelCountParam = 0; - + _rfidQueue.Clear(); + _dataGridQueue.Clear(); + _labelResultSet.Clear(); + List rfidInfos = sqliteHelper.GetRFIDList(); - if(rfidInfos != null&& rfidInfos.Count > 0) + // 根据 Result 字段去重 + rfidInfos = rfidInfos.GroupBy(r => r.Result) + .Select(g => g.First()) + .ToList(); + if (rfidInfos != null&& rfidInfos.Count > 0) { foreach (var item in rfidInfos) { + _labelResultSet.Add(item.Result); App.Current.Dispatcher.BeginInvoke((Action)(() => { int no = labelItems.Count; @@ -623,10 +644,10 @@ namespace SlnMesnac.RfidUpload.UI.viewModel /// - /// 加载标签信息DataGrid + /// TCP接收到RFID信息---卡死,暂不使用 /// /// - private void RefreshLabelInfoDataGrid(string code) + private void RefreshLabelInfoDataGrid1(string code) { RfidInfo rfidInfo = new RfidInfo(); rfidInfo.Dbdh = _transferOrderInfo.dbdh; @@ -654,19 +675,120 @@ namespace SlnMesnac.RfidUpload.UI.viewModel LabelCountParam += 1; })); - Task.Run(() => + + } + + #region 优化卡死 + + // 使用线程安全的队列存储待处理的数据 + private readonly ConcurrentQueue _rfidQueue = new ConcurrentQueue(); + private readonly ConcurrentQueue _dataGridQueue = new ConcurrentQueue(); + // 使用 HashSet 提高查找效率 + private readonly HashSet _labelResultSet = new HashSet(); + + // 批量处理数据 + private readonly System.Timers.Timer _batchTimer = new System.Timers.Timer(2000); + + /// + /// TCP接收到RFID信息 + /// + /// + private void RefreshLabelInfoDataGrid(string code) + { + // 检查是否已存在 + if (_labelResultSet.Contains(code)) + { + return; + } + + // 添加到 HashSet + _labelResultSet.Add(code); + // 打印消息------改,批量刷新 + PrintMessageToListBox(code); + + // 创建 RFID 信息并加入队列 + var rfidInfo = new RfidInfo + { + Dbdh = _transferOrderInfo.dbdh, + Result = code, + RecordTime = DateTime.Now.ToString() + }; + _rfidQueue.Enqueue(rfidInfo); + + // 创建界面数据并加入队列 + LabelCountParam += 1; + int no = labelCountParam; + var dataGridEnt = new DataGridEnt + { + no = no, + dbdh = _transferOrderInfo.dbdh, + result = code, + recordtime = DateTime.Now + }; + _dataGridQueue.Enqueue(dataGridEnt); + } + + private void OnBatchTimerElapsed(object sender, System.Timers.ElapsedEventArgs e) + { + // 批量插入数据库 + BatchInsertRfidData(); + + // 批量刷新界面 + BatchRefreshUI(); + } + + private void BatchInsertRfidData() + { + // 从队列中批量取出数据 + var batch = new List(); + while (_rfidQueue.TryDequeue(out var rfidInfo)) { - if (workModelParam == 101) + batch.Add(rfidInfo); + if (batch.Count >= 300) // 每批最多 100 条 { - var info = BatchOpenQuery.Instance; - info.rqtm = code; + break; + } + } + // 批量插入数据库 + if (batch.Count > 0) + { + sqliteHelper.InsertRFIDList(batch); + } + } - _business.upload(101, jsonChange.ModeToJson(info), "新容器入库"); + private void BatchRefreshUI() + { + // 从队列中批量取出数据 + var batch = new List(); + while (_dataGridQueue.TryDequeue(out var dataGridEnt)) + { + batch.Add(dataGridEnt); + if (batch.Count >= 100) + { + break; } + } + + // 批量更新界面 + if (batch.Count > 0) + { + App.Current.Dispatcher.BeginInvoke((Action)(() => + { + foreach (var item in batch) + { + labelItems.Add(item); + } - }); + LabelInfoDataGrid = new ObservableCollection(labelItems); + + })); + } } + + + #endregion + /// /// listBox绑定日志 /// diff --git a/slnmesnac.rfidupload.Repository/SqlSugarHelper.cs b/slnmesnac.rfidupload.Repository/SqlSugarHelper.cs index 4a4d98b..75145f6 100644 --- a/slnmesnac.rfidupload.Repository/SqlSugarHelper.cs +++ b/slnmesnac.rfidupload.Repository/SqlSugarHelper.cs @@ -165,6 +165,19 @@ namespace slnmesnac.rfidupload.Repository return result; } + + /// + /// 插入RFID集合 + /// + /// + /// + public int InsertRFIDList(List list) + { + int result = db.Insertable(list).ExecuteCommand(); + return result; + } + + #endregion } } \ No newline at end of file