360 lines
13 KiB
C#
360 lines
13 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|
||
}
|