Files
WC-CZGKJ/SCADA/Pages/UC_LogRecord.cs
2026-05-11 11:09:04 +08:00

210 lines
9.8 KiB
C#
Raw Permalink 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 System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
namespace MesWork.Pages
{
/// <summary>
/// 日志查询页面 — 现代化风格,统一 CRUD 模块设计
/// 直接查询 [记录_日志_项目运行日志] 表
/// </summary>
public partial class UC_LogRecord : UserControl
{
private const string KEYWORD_HINT = "关键字搜索...";
public UC_LogRecord()
{
InitializeComponent();
InitColumns();
InitFilterData();
// 绑定数据完成后自动着色
dgv_Data.DataBindingComplete += dgv_Data_DataBindingComplete;
}
private void InitColumns()
{
dgv_Data.AutoGenerateColumns = false;
dgv_Data.Columns.Clear();
dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "AID", HeaderText = "AID", DataPropertyName = "AID", Visible = false });
dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "工位号", HeaderText = "工位号", DataPropertyName = "工位号", FillWeight = 70 });
dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "类型", HeaderText = "类型", DataPropertyName = "类型", FillWeight = 70 });
dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "请求时间", HeaderText = "请求时间", DataPropertyName = "请求时间", FillWeight = 100 });
dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "请求内容", HeaderText = "请求内容", DataPropertyName = "请求内容", FillWeight = 200 });
dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "响应时间", HeaderText = "响应时间", DataPropertyName = "响应时间", FillWeight = 100 });
dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "响应内容", HeaderText = "响应内容", DataPropertyName = "响应内容", FillWeight = 200 });
dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "CMD", HeaderText = "CMD", DataPropertyName = "CMD", FillWeight = 60 });
dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "FROM", HeaderText = "FROM", DataPropertyName = "FROM", FillWeight = 50 });
dgv_Data.Columns.Add(new DataGridViewTextBoxColumn { Name = "TO", HeaderText = "TO", DataPropertyName = "TO", FillWeight = 50 });
}
private void InitFilterData()
{
// 日志类型下拉
cmb_Type.Items.Add("全部");
foreach (var name in Enum.GetNames(typeof(Log_Type)))
cmb_Type.Items.Add(name);
cmb_Type.SelectedIndex = 0;
// 日期范围
dtp_End.Value = DateTime.Now.AddDays(1);
dtp_Start.Value = DateTime.Now.AddDays(-3);
// 搜索框事件
txt_Keyword.GotFocus += (s, e) => { if (txt_Keyword.Text == KEYWORD_HINT) { txt_Keyword.Text = ""; txt_Keyword.ForeColor = Color.FromArgb(31, 41, 55); } };
txt_Keyword.LostFocus += (s, e) => { if (string.IsNullOrWhiteSpace(txt_Keyword.Text)) { txt_Keyword.Text = KEYWORD_HINT; txt_Keyword.ForeColor = Color.FromArgb(156, 163, 175); } };
txt_Keyword.KeyDown += (s, e) => { if (e.KeyCode == Keys.Enter) { btn_Query_Click(s, e); e.SuppressKeyPress = true; } };
}
// ====================================================================
// 查询
// ====================================================================
private void btn_Query_Click(object sender, EventArgs e)
{
try
{
string sql = BuildQuerySql();
DataLinkMesWork.SQLCommon.ExecuteDataTable(sql, MesWorkForm.ConnectionString, out DataTable dt, out string err);
if (dt != null)
{
dgv_Data.DataSource = dt;
lbl_RecordCount.Text = $"共 {dt.Rows.Count} 条记录";
}
}
catch (Exception ex)
{
MessageBox.Show($"查询失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// 数据绑定完成后按日志类型着色(首次加载和每次查询都会触发)
/// </summary>
private void dgv_Data_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
for (int i = 0; i < dgv_Data.Rows.Count; i++)
{
string typeStr = dgv_Data.Rows[i].Cells["类型"]?.Value?.ToString() ?? "";
Color rowColor;
switch (typeStr)
{
case "ZK_Alarm":
case "ZK_Delete":
rowColor = Color.FromArgb(254, 226, 226); // 红底
break;
case "ZK_Login":
rowColor = Color.FromArgb(220, 252, 231); // 绿底
break;
case "ZK_Tip":
rowColor = Color.FromArgb(254, 249, 195); // 黄底
break;
default:
rowColor = (i % 2 == 0) ? Color.White : Color.FromArgb(248, 250, 252);
break;
}
dgv_Data.Rows[i].DefaultCellStyle.BackColor = rowColor;
}
dgv_Data.ClearSelection();
}
/// <summary>
/// 导出 Excel重新查询全量数据后导出
/// </summary>
private void btn_Export_Click(object sender, EventArgs e)
{
if (dgv_Data.Rows.Count == 0)
{
MessageBox.Show("没有数据可导出,请先查询", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
using (var sfd = new SaveFileDialog())
{
sfd.Filter = "Excel 文件|*.xlsx";
sfd.FileName = $"运行日志_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx";
sfd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
if (sfd.ShowDialog() == DialogResult.OK)
{
try
{
string sql = BuildQuerySql();
DataLinkMesWork.SQLCommon.ExecuteDataTable(sql, MesWorkForm.ConnectionString, out DataTable dt, out string err);
if (dt != null && dt.Rows.Count > 0)
{
bool exported = NPOITest.ExeclHelper.DataTableToExcel(dt, "运行日志", sfd.FileName);
if (exported)
{
MessageBox.Show($"导出成功!共 {dt.Rows.Count} 条记录", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
System.Diagnostics.Process.Start("explorer.exe", $"/select,\"{sfd.FileName}\"");
}
else
{
MessageBox.Show("导出失败,请检查文件是否被占用", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
MessageBox.Show("查询数据失败,请重试", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
catch (Exception ex)
{
MessageBox.Show($"导出失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
/// <summary>
/// 根据当前筛选条件构建日志查询SQL查询和导出共用
/// </summary>
private string BuildQuerySql(bool includeAID = true)
{
var start = dtp_Start.Value;
var end = dtp_End.Value;
string keyword = txt_Keyword.Text == KEYWORD_HINT ? "" : txt_Keyword.Text.Trim();
string logType = cmb_Type.Text == "全部" ? "" : cmb_Type.Text;
string where = $" AND [请求时间] >= '{start:G}' AND [请求时间] < '{end:yyyy-MM-dd 23:59:59}'";
if (!string.IsNullOrEmpty(keyword))
where += $" AND ([请求内容] LIKE '%{keyword}%' OR [响应内容] LIKE '%{keyword}%' OR [工位号] LIKE '%{keyword}%')";
if (!string.IsNullOrEmpty(logType))
where += $" AND [日志类型] = '{logType}'";
string sql =
" SELECT [工位号] '工位号'" +
",[日志类型] '类型'" +
",[请求时间] '请求时间'" +
",[请求内容] '请求内容'" +
",[响应时间] '响应时间'" +
",[响应内容] '响应内容'" +
",[请求CMD] 'CMD'" +
",[请求FROM] 'FROM'" +
",[请求TO] 'TO'" +
(includeAID ? ",[AID] 'AID'" : "") +
" FROM [记录_日志_项目运行日志]" +
" WHERE 1=1 " + where +
" ORDER BY [请求时间] DESC";
return sql;
}
private void btn_Refresh_Click(object sender, EventArgs e)
{
cmb_Type.SelectedIndex = 0;
txt_Keyword.Text = KEYWORD_HINT;
txt_Keyword.ForeColor = Color.FromArgb(156, 163, 175);
dtp_Start.Value = DateTime.Now.AddDays(-3);
dtp_End.Value = DateTime.Now.AddDays(1);
btn_Query_Click(sender, e);
}
protected override void OnVisibleChanged(EventArgs e)
{
base.OnVisibleChanged(e);
if (Visible && dgv_Data.DataSource == null)
btn_Query_Click(this, EventArgs.Empty);
}
}
}