You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

525 lines
20 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
{
/// <summary>
/// weighWindows.xaml 的交互逻辑
/// </summary>
public partial class weighWindows : UserControl
{
Dispatcher dispatcher ;
FinishProdDBService userDbWareHouse = new FinishProdDBService();
static SerialPort serialPort;
public CheckTaskModel checkTaskModel = new CheckTaskModel();//当前选择的任务
string CurrentWeighingData;
public weighWindows()
{
InitializeComponent();
}
/// <summary>
/// 初始化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
/// <summary>
/// 重置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
/// <summary>
/// 称重
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
/// <summary>
/// 称重更新数据库
/// </summary>
/// <param name="Date"></param>
public async void upDateDate(string Date)
{
int issesscc=0;
// 将数据保存
CheckTaskModel newItem = new CheckTaskModel() { material_name = Date };
try
{
// 创建一个任务等待10秒
var timeoutTask = Task.Delay(TimeSpan.FromSeconds(5));
// 执行数据库操作的任务
var saveDataTask = Task.Run(() =>
{
// 在这里执行数据库操作
issesscc= userDbWareHouse.InsertCheckTaskDetail(checkTaskModel.actual_value, checkTaskModel.record_id);
});
// 等待哪个任务先完成
var completedTask = await Task.WhenAny(saveDataTask, timeoutTask);
// 判断是哪个任务先完成
if (completedTask == timeoutTask)
{
// 弹窗提醒
MessageBox.Show("保存数据超时!");
}
else
{
LogHelper.instance.log.Error("issesscc为" + issesscc);
if (issesscc>0)
{
// 获取当前应用程序的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}\"]";
}
}
else
{ // 弹窗提醒
MessageBox.Show("保存数据失败!请重新测量~");
}
}
//userDbWareHouse.InsertCheckTaskDetail(checkTaskModel.actual_value, checkTaskModel.record_id);//保存称重数据
Button_Click_2(null, null);
}
catch (Exception ex)
{
LogHelper.instance.log.Error("称重更新数据库发生异常:" + ex.Message);
}
}
/// <summary>
/// 查询数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
/// <summary>
/// 表格双击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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<string> stringList = JsonConvert.DeserializeObject<List<string>>(selectedRow["actual_value"].ToString());
if (stringList.Count != 0)
{
//List<CheckTaskModel> materialList = new List<CheckTaskModel>();
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);
}
}
/// <summary>
/// 表格删除按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void DeleteButton_Click(object sender, RoutedEventArgs e)
{
int issesscc = 0;
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(() =>
{
// 在这里执行数据库操作
issesscc= userDbWareHouse.InsertCheckTaskDetail(checkTaskModel.actual_value, checkTaskModel.record_id);
});
// 等待哪个任务先完成
var completedTask = await Task.WhenAny(saveDataTask, timeoutTask);
// 判断是哪个任务先完成
if (completedTask == timeoutTask)
{
// 弹窗提醒
MessageBox.Show("删除数据超时!");
}
else
{
LogHelper.instance.log.Error("issesscc为" + issesscc);
if (issesscc > 0)
{
// 从 DataGrid 的 ItemsSource 中移除该项
zhongDate.Items.Remove(item);
}
else
{
// 弹窗提醒
MessageBox.Show("删除数据失败!请重新删除~");
}
}
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<List<string>>(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
{
/// <summary>
/// 检验节点名称
/// </summary>
public string check_name { get; set; }
//public string CheckType { get; set; }
/// <summary>
/// 检验任务号
/// </summary>
public string check_no { get; set; }
/// <summary>
/// 物料编码
/// </summary>
public string material_code { get; set; }
/// <summary>
/// 物料名称
/// </summary>
public string material_name { get; set; }
/// <summary>
/// 检验日期
/// </summary>
public DateTime income_time { get; set; }
/// <summary>
/// 序号
/// </summary>
public string RowNumber { get; set; }
/// <summary>
/// 检测项ID
/// </summary>
public string record_id { get; set; }
/// <summary>
/// 检测项称量结果
/// </summary>
public string actual_value { get; set; }
/// <summary>
/// 检测项名称
/// </summary>
public string rule_name { get; set; }
}
public enum Signal
{
/// <summary>
/// 打印
/// </summary>
Print = 0x70,
/// <summary>
/// 校准
/// </summary>
Calibration = 0x71,
/// <summary>
/// 计数
/// </summary>
Count = 0x72,
/// <summary>
/// 单位转换
/// </summary>
UnitConvert = 0x73,
/// <summary>
/// 去皮重
/// </summary>
Tare = 0x74
}
}