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