using GalaSoft.MvvmLight; using HslCommunication.Enthernet; using Microsoft.Extensions.DependencyInjection; using Models; using SlnMesnac.Config; using SlnMesnac.Model.domain; using SlnMesnac.Model.dto; using SlnMesnac.Model.Enum; using SlnMesnac.Repository.service; using SlnMesnac.Rfid; using SlnMesnac.Serilog; using SlnMesnac.TouchSocket; using SlnMesnac.WPF.Attribute; using SlnMesnac.WPF.Model; using SqlSugar; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Threading; using static Microsoft.WindowsAPICodePack.Shell.PropertySystem.SystemProperties.System; using Task = System.Threading.Tasks.Task; namespace SlnMesnac.WPF.ViewModel.IndexPage { [RegisterAsSingletonAttribute] public class ProductionLineViewModel : ViewModelBase { private SerilogHelper _logger; private ISqlSugarClient? sqlSugarClient; //容器里面的读写器集合 public List rfidList; private AppConfig appConfig; private ApiServer apiServer; private MeshttpClient meshttpClient; public TcpServer _TcpServer; private DispatcherTimer _timer; private ObservableCollection _rfidHistoryRecords = new ObservableCollection(); public ObservableCollection RFIDHistoryRecords { get { return _rfidHistoryRecords; } set { _rfidHistoryRecords = value; RaisePropertyChanged(() => RFIDHistoryRecords); } } ChangeTypeViewModel ChangeTypeView; /// /// 日期时间 /// private DateTime _currentDateTime; public DateTime CurrentDateTime { get => _currentDateTime; set { if (_currentDateTime != value) { _currentDateTime = value; RaisePropertyChanged(() => CurrentDateTime); } } } public ProductionLineViewModel() { ChangeTypeView = App.ServiceProvider.GetService(); ChangeTypeView.Action += RefreshOrderNo; Console.WriteLine(ChangeTypeView.Action.GetHashCode().ToString()); _logger = App.ServiceProvider.GetService(); appConfig = App.ServiceProvider.GetService(); sqlSugarClient = App.ServiceProvider.GetService(); _TcpServer = App.ServiceProvider.GetRequiredService(); rfidList = App.ServiceProvider.GetRequiredService>(); rfidList.ForEach(rfid => { rfid._Action += RecvIdentifyData_Instance; //rfid._RefreshLogMessageAction += RefreshLogMessage; }); LoadDeviceInfo(); StartCheckStatus(); //GetRFIDHistoryRecords(); _currentDateTime = DateTime.Now; _timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) // 每秒更新一次 }; _timer.Tick += (s, e) => { CurrentDateTime = DateTime.Now; }; _timer.Start(); } private void RefreshOrderNo(Real_DataInfo real_Data) { Deviceinfo.FirstOrDefault(x => x.Deviceid == real_Data.Deviceid).OrderNo = real_Data.OrderNo; } private void LoadDeviceInfo() { //List DeviceInfos = sqlSugarClient.Queryable().Where(expression: x => x.Collectid == appConfig.StationCode && x.Deleteflag == 0).ToList(); List real_DataInfos = new List(); Real_DataInfo real_DataInfo = new Real_DataInfo() { Name = "1", Deviceid = "10001", Connectstr = "192.168.0.1:20108", LineNo = "6#", OrderNo = "123456", ProductType = "整芯带", WriteCount = "0", RfidCount = "20", IsOnline = "未连接", RfidASCII = "0", RfidEPC = "0", ReadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), WriteTime = DateTime.Now.AddSeconds(10).ToString("yyyy-MM-dd HH:mm:ss"), ProductStatus = "生产中", WriteStatus = "写入成功", }; Real_DataInfo real_DataInfo2 = new Real_DataInfo() { Name = "2", Deviceid = "10002", Connectstr = "127.0.0.1:20108", LineNo = "7#", OrderNo = "123456", ProductType = "整芯带", WriteCount = "0", RfidCount = "20", IsOnline = "未连接", RfidASCII = "0", RfidEPC = "0", ReadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), WriteTime = DateTime.Now.AddSeconds(10).ToString("yyyy-MM-dd HH:mm:ss"), ProductStatus = "生产中", WriteStatus = "写入成功", }; real_DataInfos.Add(real_DataInfo); real_DataInfos.Add(real_DataInfo2); App.Current.Dispatcher.Invoke(() => { Deviceinfo.Clear(); foreach (var item in real_DataInfos) { Real_DataInfo real_DataInfo = new Real_DataInfo() { Name = item.Name, Deviceid = item.Deviceid, Connectstr = item.Connectstr, LineNo = item.LineNo, OrderNo = item.OrderNo, ProductType = item.ProductType, WriteCount = item.WriteCount, RfidCount = item.RfidCount, IsOnline = item.IsOnline, RfidASCII = item.RfidASCII, ReadTime = item.ReadTime, WriteTime = item.WriteTime, ProductStatus = item.ProductStatus, WriteStatus=item.WriteStatus, RfidEPC = item.RfidEPC, }; Deviceinfo.Add(real_DataInfo); } }); } /// /// 刷新日志 /// /// public void RefreshLogMessage(string msg) { try { App.Current.Dispatcher.BeginInvoke((Action)(() => { //LogMessages.Add($"{DateTime.Now}: {msg}"); //while (LogMessages.Count > 100) //{ // LogMessages.Clear(); //} //var orderedList = LogMessages.OrderByDescending(x => x); // 排序后转为 List //LogMessages = new ObservableCollection(orderedList); })); } catch (Exception ex) { _logger.Error($"异常:{ex.Message}"); } } /// /// 接收到连续盘点标签返回 /// /// /// private async void RecvIdentifyData_Instance(string iCombineId, List tagInfos) { string info = ""; try { bool stopflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_StopIdentify(); //测试写入 bool writeflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_Write(Encoding.ASCII.GetString(tagInfos[0].EPC), "JG26522604101"); if (!writeflag) { writeflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_Write(Encoding.ASCII.GetString(tagInfos[0].EPC), "JG26522604101"); if (!writeflag) { writeflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_Write(Encoding.ASCII.GetString(tagInfos[0].EPC), "JG26522604101"); } } //查询数据库是否已存在记录 bool iflag = false; //如果不存在则 if (!iflag) { //拼接订单号写入标签 } } catch (Exception e) { _logger.Error($"RecvIdentifyData_Instance异常:{e.Message}"); } finally { //刷新界面 RefreshEventArgs(iCombineId, tagInfos); AddRFIDData(iCombineId, tagInfos); } } public void RefreshEventArgs(string iCombineId, List tagInfos) { try { App.Current.Dispatcher.BeginInvoke((Action)(() => { Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).RfidEPC = tagInfos[0].EPCstring; Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).RfidASCII = Encoding.ASCII.GetString(tagInfos[0].EPC); Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).ReadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); })); } catch (Exception ex) { _logger.Error($"异常:{ex.Message}"); } } // 添加数据的方法(核心:添加前/后判断行数) public void AddRFIDData(string iCombineId,List tagInfos) { // 1. 判断当前行数是否>10,是则清空 if (RFIDHistoryRecords.Count > 10) { RFIDHistoryRecords.Clear(); } App.Current.Dispatcher.Invoke(() => { RFIDHistoryRecords.Add(new RFIDRecord { OrderNumber = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).OrderNo, LineNumber = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).LineNo, ProductType = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).ProductType, OriginalEPC = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).RfidEPC, RFIDCode = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).RfidASCII, ReadTime = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).ReadTime, WriteTime = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).ReadTime, WriteStatus = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).WriteStatus // 模拟1条失败数据 }); }); } private ObservableCollection _Deviceinfo = new ObservableCollection(); public ObservableCollection Deviceinfo { get { return _Deviceinfo; } set { _Deviceinfo = value; RaisePropertyChanged(() => Deviceinfo); } } private void StartCheckStatus() { Task.Run(async () => { while (true) { try { #region RFID状态 //RefreshLogMessage("检测设备状态"); var batches = SplitListIntoBatches(rfidList, 10); for (int i = 0; i < batches.Count; i++) { var currentBatch = batches[i]; // 显示当前批次信息(UI线程) Console.WriteLine($"{DateTime.Now}开始检测第{i + 1}批(共{currentBatch.Count}个设备)\r\n"); // 异步检测当前批次的设备状态(不阻塞UI) await DetectDeviceBatchAsync(currentBatch); // 批次之间的间隔(最后一批无需等待) if (i < batches.Count - 1) { Console.WriteLine($"{DateTime.Now}第{i + 1}批检测完成,共{batches.Count}批,等待{1000 / 1000}秒后检测下一批\r\n"); await Task.Delay(10); } } #endregion RFID状态 } catch (Exception ex) { _logger.Error($"监听设备状态异常:{ex.Message}"); } await Task.Delay(1000 * 30); } }); } private List> SplitListIntoBatches(List sourceList, int batchSize) { var batches = new List>(); for (int i = 0; i < sourceList.Count; i += batchSize) { // 截取每批的设备(最后一批可能不足10个) var batch = sourceList.Skip(i).Take(batchSize).ToList(); batches.Add(batch); } return batches; } private async Task DetectDeviceBatchAsync(List batch) { // 并行检测当前批次的设备(可选,根据接口性能调整) var detectionTasks = batch.Select(device => DetectSingleDeviceAsync(device)); // 等待当前批次所有设备检测完成 await Task.WhenAll(detectionTasks); } private async Task DetectSingleDeviceAsync(RfidAbsractFactory device) { try { bool iflag = await device.ConnectAsync(device.ip, device.port, device.deviceid); if (iflag) { //bool iflag11111 = await device.Set_BeginIdentify(); //bool ifa = await device.Set_Write("",""); //string ifla = await device.Get_Frequencyband(); //bool ifla1 = await device.Set_FilterData("FC 08"); //string ia = await device.Get_FilterData(); iflag = await device.SendHeartPack(); if (!iflag) { //device.Close(); bool iflag1 = await device.ConnectAsync(device.ip, device.port, device.deviceid); iflag = await device.SendHeartPack(); if (iflag) { Deviceinfo.FirstOrDefault(x => x.Deviceid == device.deviceid).IsOnline = "已连接"; } else { Deviceinfo.FirstOrDefault(x => x.Deviceid == device.deviceid).IsOnline = "未连接"; } } else { Deviceinfo.FirstOrDefault(x => x.Deviceid == device.deviceid).IsOnline = "已连接"; } } else { //更新界面状态 Deviceinfo.FirstOrDefault(x => x.Deviceid == device.deviceid).IsOnline = "未连接"; device.Close(); bool iflag1 = await device.ConnectAsync(device.ip, device.port, device.ConfigKey); iflag = await device.SendHeartPack(); if (iflag) { Deviceinfo.FirstOrDefault(x => x.Deviceid == device.deviceid).IsOnline = "已连接"; } } //存库,如果没有则插入如果存在则更新 lock (string.Empty) { try { List Base_device_state = sqlSugarClient.Ado.Context.CopyNew().Queryable().Where(x => x.DeviceId == int.Parse(device.deviceid)).ToList(); if (Base_device_state != null && Base_device_state.Count > 0) { //只更新 Base_device_state[0].DeviceState = iflag ? 1 : 0; Base_device_state[0].DeviceTime = DateTime.Now; sqlSugarClient.Ado.Context.CopyNew().Updateable(Base_device_state).UpdateColumns(it => new { it.DeviceState, it.DeviceTime }).ExecuteCommand(); } else { Base_device_state base_device_state = new Base_device_state() { DeviceId = int.Parse(device.deviceid), DeviceState = iflag ? 1 : 0, DeviceTime = DateTime.Now, }; var a = sqlSugarClient.Ado.Context.CopyNew().Insertable(base_device_state).ExecuteCommand(); } } catch (Exception ex) { _logger.Error($"更新RFID状态异常:{ex.Message}", ex); } } } catch (Exception ex) { _logger.Error($"更新RFID状态异常:{ex.Message}", ex); } } } }