using Google.Protobuf.WellKnownTypes; using HandyControl.Tools.Extension; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data; using System.IO.Ports; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Threading; using XGL.Dats.DBServiceFinishProd; using System.Configuration; using CommonFunc; namespace XGLFinishPro.Views { /// /// weighWindows.xaml 的交互逻辑 /// public partial class weighWindows : UserControl { Dispatcher dispatcher ; FinishProdDBService userDbWareHouse = new FinishProdDBService(); static SerialPort serialPort; public CheckTaskModel checkTaskModel = new CheckTaskModel();//当前选择的任务 string CurrentWeighingData; public weighWindows() { InitializeComponent(); } /// /// 初始化 /// /// /// private void UserControl_Loaded(object sender, RoutedEventArgs e) { try { var dataTable = userDbWareHouse.WeighingTask(""); if (dataTable != null && dataTable.Rows.Count > 0) { // 绑定 DataTable 到 DataGrid WeighingTaskDateTable.ItemsSource = dataTable.DefaultView; } else { // 清空 DataGrid WeighingTaskDateTable.ItemsSource = null; } } catch (Exception ex) { LogHelper.instance.log.Error("初始化发生异常:" + ex.Message); } } /// /// 重置 /// /// /// private void Button_Click(object sender, RoutedEventArgs e) { jianyanwuliao.Text = null; jianyanjiedian.Text = null; renwubianhao.Text = null; guizemingcheng.Text = null; zhongliang.Text = null; renwubianhao1.Text = null; jianyanjiedian1.Text = null; jianyanwuliao1.Text = null; if (zhongDate.Items.Count != 0) { zhongDate.Items.Clear(); zhongDate.ItemsSource = null; } Button_Click_2(null, null); } /// /// 称重 /// /// /// private void Button_Click_1(object sender, RoutedEventArgs e) { try { if (jianyanwuliao.Text.IsNullOrEmpty() || jianyanjiedian.Text.IsNullOrEmpty() || renwubianhao.Text.IsNullOrEmpty() || guizemingcheng.Text.IsNullOrEmpty()) { //MessageBox.Show("数据不完整,无法称重!!"); upDateDate("1.0"); } else { // 获取当前应用程序的Dispatcher dispatcher = Application.Current.Dispatcher; // 创建一个新的SerialPort实例 serialPort = new SerialPort(); string portName = ConfigurationManager.AppSettings["weigh"]; if (!string.IsNullOrEmpty(portName)) { serialPort.PortName = portName; } // 设置串口号和波特率 //serialPort.PortName = "COM12"; // 串口号根据实际情况设置 serialPort.BaudRate = 9600; // 波特率根据实际情况设置 // 设置其他串口参数,如数据位、校验位等 serialPort.DataBits = 8; serialPort.Parity = Parity.None; serialPort.StopBits = StopBits.One; try { serialPort.Open(); Console.WriteLine("串口已打开"); lianjiezhuangtai.Text = "已连接"; serialPort.Write(new byte[] { 0x1B, (byte)Signal.Print }, 0, 2); Task.Run(() => ReadDataInBackground()); } catch (Exception ex) { Console.WriteLine("打开串口时出错:" + ex.Message); } Console.ReadLine(); // 阻塞主线程,保持程序运行 } void ReadDataInBackground() { try { int i = 0; while (true) { i++; string data = serialPort.ReadExisting(); Thread.Sleep(500); if (!string.IsNullOrEmpty(data)) { Match match1 = Regex.Match(data, @"(\d+\.\d+)"); string bb = match1.Groups[1].Value; upDateDate(bb); UpdateUI(bb); break; // 读到数据后跳出循环 } else { Thread.Sleep(1000); if (i == 5) { MessageBox.Show("获取称重数据超时,检查秤是否正常"); break; } } } } catch (Exception ex) { Console.WriteLine("读取串口数据时出错:" + ex.Message); } finally { ClosePort(); } } void UpdateUI(string data) { // 使用Dispatcher.Invoke确保在UI线程上执行更新操作 dispatcher.Invoke(() => { // 更新UI控件 zhongliang.Text = data; }); } void ClosePort() { if (serialPort != null && serialPort.IsOpen) { serialPort.Close(); Console.WriteLine("串口已关闭"); Dispatcher.Invoke(() => { lianjiezhuangtai.Text = "未连接"; }); } } } catch (Exception ex) { LogHelper.instance.log.Error("称重发生异常:" + ex.Message); } } /// /// 称重更新数据库 /// /// public async void upDateDate(string Date) { // 将数据保存 CheckTaskModel newItem = new CheckTaskModel() { material_name = Date }; try { // 创建一个任务,等待10秒 var timeoutTask = Task.Delay(TimeSpan.FromSeconds(5)); // 执行数据库操作的任务 var saveDataTask = Task.Run(() => { // 在这里执行数据库操作 userDbWareHouse.InsertCheckTaskDetail(checkTaskModel.actual_value, checkTaskModel.record_id); }); // 等待哪个任务先完成 var completedTask = await Task.WhenAny(saveDataTask, timeoutTask); // 判断是哪个任务先完成 if (completedTask == timeoutTask) { // 弹窗提醒 MessageBox.Show("保存数据超时!"); } else { // 获取当前应用程序的Dispatcher dispatcher = Application.Current.Dispatcher; Dispatcher.Invoke(() => { zhongDate.Items.Add(newItem); }); if (string.IsNullOrEmpty(checkTaskModel.actual_value)) { checkTaskModel.actual_value = $"[\"{Date}\"]"; } else { // 去除字符串开头和结尾的方括号 checkTaskModel.actual_value = checkTaskModel.actual_value.Trim(']'); // 在字符串末尾添加逗号和aaa的值 checkTaskModel.actual_value += $", \"{Date}\"]"; } } //userDbWareHouse.InsertCheckTaskDetail(checkTaskModel.actual_value, checkTaskModel.record_id);//保存称重数据 Button_Click_2(null, null); } catch (Exception ex) { LogHelper.instance.log.Error("称重更新数据库发生异常:" + ex.Message); } } /// /// 查询数据 /// /// /// private void Button_Click_2(object sender, RoutedEventArgs e) { string wher = ""; try { // 获取当前应用程序的Dispatcher dispatcher = Application.Current.Dispatcher; // 使用Dispatcher.Invoke确保在UI线程上执行更新操作 dispatcher.Invoke(() => { // 更新UI控件 if (!renwubianhao1.Text.IsNullOrEmpty()) { wher += " and qct.check_no LIKE '%" + renwubianhao1.Text + "%'"; } if (!jianyanjiedian1.Text.IsNullOrEmpty()) { wher += " and qt.check_name LIKE '%" + jianyanjiedian1.Text + "%'"; } if (!jianyanwuliao1.Text.IsNullOrEmpty()) { wher += " and qct.material_name LIKE '%" + jianyanwuliao1.Text + "%'"; } if (!dateStart.Text.IsNullOrEmpty()) { wher += " and qct.income_time='" + dateStart.Text + "'"; } var dataTable = userDbWareHouse.WeighingTask(wher); if (dataTable != null && dataTable.Rows.Count > 0) { // 绑定 DataTable 到 DataGrid WeighingTaskDateTable.ItemsSource = null; WeighingTaskDateTable.ItemsSource = dataTable.DefaultView; } else { // 清空 DataGrid WeighingTaskDateTable.ItemsSource = null; } }); } catch (Exception ex) { LogHelper.instance.log.Error("查询数据发生异常:" + ex.Message); } } /// /// 表格双击事件 /// /// /// private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) { try { // 获取选中行的索引 int selectedIndex = WeighingTaskDateTable.SelectedIndex; if (zhongDate.Items.Count != 0) { zhongDate.Items.Clear(); zhongDate.ItemsSource = null; } // 检查是否选中了行 if (selectedIndex >= 0 && selectedIndex < WeighingTaskDateTable.Items.Count) { // 获取选中行的数据项 var selectedRow = WeighingTaskDateTable.Items[selectedIndex] as DataRowView; // 将选中行的数据项赋给控件 jianyanwuliao.Text = selectedRow["material_name"].ToString(); jianyanjiedian.Text = selectedRow["check_name"].ToString(); renwubianhao.Text = selectedRow["check_no"].ToString(); guizemingcheng.Text = selectedRow["rule_name"].ToString(); checkTaskModel.check_name = selectedRow["check_name"].ToString(); checkTaskModel.material_name = selectedRow["material_name"].ToString(); checkTaskModel.check_no = selectedRow["check_no"].ToString(); checkTaskModel.rule_name = selectedRow["rule_name"].ToString(); checkTaskModel.material_code = selectedRow["material_code"].ToString(); checkTaskModel.record_id = selectedRow["record_id"].ToString(); checkTaskModel.actual_value = selectedRow["actual_value"].ToString(); if (!selectedRow["actual_value"].ToString().IsNullOrEmpty()) { List stringList = JsonConvert.DeserializeObject>(selectedRow["actual_value"].ToString()); if (stringList.Count != 0) { //List materialList = new List(); foreach (var item in stringList) { //materialList.Add(new CheckTaskModel { material_name = item }); zhongDate.Items.Add(new CheckTaskModel { material_name = item }); } //zhongDate.Items.Add(materialList); } } } } catch (Exception ex) { LogHelper.instance.log.Error("表格双击事件发生异常:" + ex.Message); } } /// /// 表格删除按钮 /// /// /// private async void DeleteButton_Click(object sender, RoutedEventArgs e) { try { var button = sender as Button; var dataContext = button?.DataContext; if (dataContext != null && dataContext is CheckTaskModel) { var item = (CheckTaskModel)dataContext; string materialName = item.material_name; // 从 actual_value 中移除 materialName checkTaskModel.actual_value = RemoveMaterialNameFromActualValue(checkTaskModel.actual_value, materialName); if (checkTaskModel.actual_value == "[]") { checkTaskModel.actual_value = null; } // 创建一个任务,等待10秒 var timeoutTask = Task.Delay(TimeSpan.FromSeconds(10)); // 执行数据库操作的任务 var saveDataTask = Task.Run(() => { // 在这里执行数据库操作 userDbWareHouse.InsertCheckTaskDetail(checkTaskModel.actual_value, checkTaskModel.record_id); }); // 等待哪个任务先完成 var completedTask = await Task.WhenAny(saveDataTask, timeoutTask); // 判断是哪个任务先完成 if (completedTask == timeoutTask) { // 弹窗提醒 MessageBox.Show("删除数据超时!"); } else { // 从 DataGrid 的 ItemsSource 中移除该项 zhongDate.Items.Remove(item); } Button_Click_2(null, null); // 从数据源中移除该项 } } catch (Exception ex) { LogHelper.instance.log.Error(" 表格删除按钮发生异常:" + ex.Message); } } private string RemoveMaterialNameFromActualValue(string actualValue, string materialName) { // 解析 actualValue,移除 materialName,并返回更新后的值 var list = JsonConvert.DeserializeObject>(actualValue); list.Remove(materialName); return JsonConvert.SerializeObject(list); } private void pickerstart_SelectedDateChanged(object sender, SelectionChangedEventArgs e) { } } public class motre { public string material_name { get; set; } } public class CheckTaskModel { /// /// 检验节点名称 /// public string check_name { get; set; } //public string CheckType { get; set; } /// /// 检验任务号 /// public string check_no { get; set; } /// /// 物料编码 /// public string material_code { get; set; } /// /// 物料名称 /// public string material_name { get; set; } /// /// 检验日期 /// public DateTime income_time { get; set; } /// /// 序号 /// public string RowNumber { get; set; } /// /// 检测项ID /// public string record_id { get; set; } /// /// 检测项称量结果 /// public string actual_value { get; set; } /// /// 检测项名称 /// public string rule_name { get; set; } } public enum Signal { /// /// 打印 /// Print = 0x70, /// /// 校准 /// Calibration = 0x71, /// /// 计数 /// Count = 0x72, /// /// 单位转换 /// UnitConvert = 0x73, /// /// 去皮重 /// Tare = 0x74 } }