using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
namespace MesWork.Pages
{
///
/// 日志查询页面 — 现代化风格,统一 CRUD 模块设计
/// 直接查询 [记录_日志_项目运行日志] 表
///
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);
}
}
///
/// 数据绑定完成后按日志类型着色(首次加载和每次查询都会触发)
///
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();
}
///
/// 导出 Excel(重新查询全量数据后导出)
///
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);
}
}
}
}
///
/// 根据当前筛选条件构建日志查询SQL(查询和导出共用)
///
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);
}
}
}