2025-12-09 09:28:39 +08:00

360 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using MQTT_WinformV1.Model;
using MqttClient;
using MySqlX.XDevAPI.Relational;
using Newtonsoft.Json;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace MQTT_WinformV1
{
public partial class Form1 : Form
{
private System.Timers.Timer _timer;
private MqttClientService _mqttService;
private DataTable dtPeiFang;
private DataTable dtMqttDic;
private string strPeiFangId;
private DataRow drPeiFang;
public Form1()
{
InitializeComponent();
_mqttService = new MqttClientService();
_mqttService.MessageReceived += OnMqttMessage;
dtPeiFang = new DataTable();
dtMqttDic = new DataTable();
buttonDisconnect.Enabled = false;
}
private void Form1_Load(object sender, EventArgs e)
{
// 调用方法将指定 Panel 变成圆形
MakePanelRound(panelLed);
getPeiFang();
InitMqttDic();
timer1.Enabled = true;
}
private void MakePanelRound(Panel panel)
{
int size = Math.Min(panel.Width, panel.Height);
panel.Size = new Size(size, size);
GraphicsPath path = new GraphicsPath();
path.AddEllipse(0, 0, panel.Width, panel.Height);
panel.Region = new Region(path);
}
private async void getPeiFang()
{
DataTable dt = await _mqttService.QueryPeifangAsync();
if (dt != null)
{
dtPeiFang = dt;
bsPF.DataSource = dtPeiFang;
this.comboBox1.DisplayMember = "part_name";
this.comboBox1.ValueMember = "id";
}
}
//初始化MQTT字典
private async void InitMqttDic()
{
DataTable dt = await _mqttService.InitMqttDic();
if (dt != null)
{
dtMqttDic = dt;
}
}
private async void buttonConnect_Click(object sender, EventArgs e)
{
try
{
AppendLog("正在连接MQTT服务器...");
await _mqttService.MqttClientStartAsync();
AppendLog("连接成功!");
panelLed.BackColor = Color.Green;
toolStripStatusLabel1.Text = "已连接";
buttonConnect.Enabled = false;
buttonDisconnect.Enabled = true;
}
catch (Exception ex)
{
panelLed.BackColor = Color.Red;
AppendLog($"连接失败:{ex.Message}");
toolStripStatusLabel1.Text = "连接失败";
}
}
private async void buttonDisconnect_Click(object sender, EventArgs e)
{
await _mqttService.MqttClientStopAsync();
AppendLog("已断开连接。");
panelLed.BackColor = Color.Red;
toolStripStatusLabel1.Text = "未连接";
buttonConnect.Enabled = true;
buttonDisconnect.Enabled = false;
}
private void OnMqttMessage(string msg)
{
if (InvokeRequired)
{
BeginInvoke(new Action<string>(OnMqttMessage), msg);
return;
}
AppendLog($"收到消息: {msg}");
}
private void AppendLog(string message)
{
try
{
if (InvokeRequired)
{
BeginInvoke(new Action<string>(AppendLog), message);
return;
}
string timeStamped = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {message}\r\n";
textBoxLog.AppendText(timeStamped);
}
catch (Exception ex)
{
}
}
private async void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
await _mqttService.MqttClientStopAsync();
}
//配方导入功能
private async void button1_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog openFile = new OpenFileDialog();
if (openFile.ShowDialog() == DialogResult.OK)
{
string filePath = openFile.FileName;
DataTable excelDt = GetExcel(filePath);
if (excelDt != null && excelDt.Rows.Count > 0)
{
await _mqttService.SavePeiFangByExcel(excelDt);
MessageBox.Show("配方信息已导入!");
}
else
{
MessageBox.Show("不允许导入空表!");
}
}
}
catch (Exception ex)
{
AppendLog($"配方导入失败:{ex.Message}");
}
}
// <summary>
/// 获取Excel到Datatable中
/// </summary>
/// <param name="filePath">Excel路径</param>
/// <returns>返回DataTable数据</returns>
public static DataTable GetExcel(string filePath)
{
IWorkbook iwkX;
using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
iwkX = WorkbookFactory.Create(fs);
fs.Close();
}
//sheet
DataTable dt = new DataTable();
for (int h = 0; h < iwkX.NumberOfSheets; h++)
{
ISheet sheet = iwkX.GetSheetAt(h);
var rows = sheet.GetRowEnumerator();
bool isMove = rows.MoveNext();
//循环sheet
if (isMove)
{
var Cols = (IRow)rows.Current;
dt.TableName = sheet.SheetName;
for (int i = 0; i < Cols.LastCellNum; i++)
{
string str = Cols.GetCell(i).ToString();
dt.Columns.Add(Cols.GetCell(i).ToString());
}
while (rows.MoveNext())
{
var row = (IRow)rows.Current;
var dr = dt.NewRow();
for (int i = 0; i < row.LastCellNum; i++)
{
var cell = row.GetCell(i);
if (cell == null)
{
dr[i] = "";
}
else
{
string strdr = cell.ToString();
dr[i] = cell.ToString();
}
}
dt.Rows.Add(dr);
}
}
}
return dt;
}
//上传宜搭
private async void button2_Click(object sender, EventArgs e)
{
if (toolStripStatusLabel1.Text != "已连接")
{
MessageBox.Show("请先连接MQTT网关");
return;
}
if (this.comboBox1.Text.Length == 0)
{
MessageBox.Show("请先导入配方信息,再刷新!");
return;
}
if (this.txtLUploadPL.Text.Length == 0)
{
MessageBox.Show("请输入频率信息!");
return;
}
strPeiFangId = this.comboBox1.SelectedValue.ToString();
drPeiFang = dtPeiFang.Select("id = '" + strPeiFangId + "'")[0];
int seconds;
if (!int.TryParse(txtLUploadPL.Text, out seconds) || seconds <= 0)
{
seconds = 10;
}
// 设置定时器(转换为毫秒)
_timer = new System.Timers.Timer(seconds * 1000);
_timer.Elapsed += _timer_Tick;
_timer.AutoReset = true; // 是否重复
_timer.Enabled = true; // 开始计时
}
private void _timer_Tick(object sender, ElapsedEventArgs e)
{
MQttYiDaUpload();
AppendLog("宜搭数据已上传!");
}
//上传宜搭
private async void MQttYiDaUpload()
{
DataTable dtMqtt = await _mqttService.GetLatestMqttDataAsync();
if (dtMqtt != null && dtMqtt.Rows.Count > 0)
{
string strMessage = dtMqtt.Rows[0]["MESSAGE"].ToString();
MqttDataModel data = JsonConvert.DeserializeObject<MqttDataModel>(strMessage);
Type paramsType = data.@params.GetType();
PropertyInfo[] properties = paramsType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
List<MQTTModel> mqttLists = new List<MQTTModel>();
List<YIDAModel> yidaLists = new List<YIDAModel>();
foreach (PropertyInfo prop in properties)
{
string name = prop.Name;
DataRow[] drs = dtMqttDic.Select("col_code = '"+ name + "'");
if (drs != null && drs.Length > 0)
{
name = drs[0]["name"].ToString();
}
object value = prop.GetValue(data.@params);
MQTTModel mqttNew = new MQTTModel();
mqttNew.SupplierCode = drPeiFang["supplier_code"].ToString();
mqttNew.SupplierName = drPeiFang["supplier_name"].ToString();
mqttNew.VehicleModel = drPeiFang["vehicle_model"].ToString();
mqttNew.PartNumber = drPeiFang["part_number"].ToString();
mqttNew.PartName = drPeiFang["part_name"].ToString();
mqttNew.Configuration = drPeiFang["configuration"].ToString();
mqttNew.ParameterName = name;
mqttNew.ParameterValue = value == null ? "" : value.ToString();
mqttNew.LeaderPart = drPeiFang["leader_part"].ToString();
mqttLists.Add(mqttNew);
YIDAModel yidaNew = new YIDAModel();
yidaNew.textField_pbadehs = drPeiFang["supplier_code"].ToString();
yidaNew.textField_1xi9sfn = drPeiFang["supplier_name"].ToString();
yidaNew.textField_59qd85u = drPeiFang["vehicle_model"].ToString();
yidaNew.textField_bvm0r0n = drPeiFang["part_number"].ToString();
yidaNew.textField_36ov0ev = drPeiFang["part_name"].ToString();
yidaNew.textField_2az30vq = drPeiFang["configuration"].ToString();
yidaNew.textField_rqco1qe = name;
yidaNew.textField_u0til0r = value == null ? "" : value.ToString();
yidaNew.textField_wyvrvdh = drPeiFang["leader_part"].ToString();
yidaLists.Add(yidaNew);
}
List<MQTTModel> mqttLists1 = mqttLists;
List<YIDAModel> yidaLists1 = yidaLists;
//记载宜搭上传成功日志
RecordSuccessLog(mqttLists1);
}
}
//记载宜搭上传成功日志
private async void RecordSuccessLog(List<MQTTModel> mqttLists)
{
if (mqttLists != null && mqttLists.Count > 0)
{
await _mqttService.CreateSuccessLog(mqttLists);
}
}
private void btnRefresh_Click(object sender, EventArgs e)
{
getPeiFang();
}
//中止上传
private void button3_Click(object sender, EventArgs e)
{
this._timer.Enabled = false;
AppendLog("停止上传数据");
MessageBox.Show("待程序完成后,将停止自动上传", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void txtLUploadPL_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Back)
{
e.Handled = false;
return;
}
if (char.IsDigit(e.KeyChar))
{
e.Handled = false;
}
else if (e.KeyChar == '.' && !txtLUploadPL.Text.Contains("."))
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
}
}