|
|
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
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|