LAPTOP-SNT8I5JK\Boounion
2024-12-02 aedb3b85fed48cb2cf0abb5fafa8e7591644c9f4
SourceCode/Bond/BondEq/View/SystemLogManagerDlg.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,498 @@
// SystemLogManagerDlg.cpp: å®žçŽ°æ–‡ä»¶
//
#include "stdafx.h"
#include "BondEq.h"
#include "afxdialogex.h"
#include "SystemLogManagerDlg.h"
// CSystemLogManagerDlg å¯¹è¯æ¡†
IMPLEMENT_DYNAMIC(CSystemLogManagerDlg, CDialogEx)
CSystemLogManagerDlg::CSystemLogManagerDlg(CWnd* pParent /*=nullptr*/)
   : CDialogEx(IDD_DIALOG_SYSTEM_LOG_MANAGER, pParent)
{
   m_nInitialWidth = 0;
   m_nInitialHeight = 0;
}
CSystemLogManagerDlg::~CSystemLogManagerDlg()
{
   for (auto& pair : m_mapFonts) {
      if (pair.second) {
         pair.second->DeleteObject();
         delete pair.second;
      }
   }
   m_mapFonts.clear();
}
void CSystemLogManagerDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialogEx::DoDataExchange(pDX);
   DDX_Control(pDX, IDC_COMBO_TYPE, m_comboType);
   DDX_Control(pDX, IDC_COMBO_USER, m_comboUser);
   DDX_Control(pDX, IDC_DATETIMEPICKER_START, m_dateTimeStart);
   DDX_Control(pDX, IDC_DATETIMEPICKER_END, m_dateTimeEnd);
   DDX_Control(pDX, IDC_EDIT_DESCRIPTION, m_editDescription);
   DDX_Control(pDX, IDC_CUSTOM_LIST_LOGS, m_listLogs);
   DDX_Control(pDX, IDC_STATIC_PAGE_NUMBER, m_staticPageNum);
}
void CSystemLogManagerDlg::InitSystemLogManager()
{
   if (m_listLogs.GetSafeHwnd() == NULL)
      return;
   int nRows = 21; // åŒ…括表头(1 è¡Œï¼‰å’Œæ•°æ®ï¼ˆ20 è¡Œï¼‰
   int nCols = 5;
   int nFixRows = 1;
   int nFixCols = 0;
   int nRowIdx = 0;
   int nColIdx = 0;
   m_listLogs.DeleteAllItems();
   m_listLogs.SetVirtualMode(FALSE);
   m_listLogs.GetDefaultCell(TRUE, FALSE)->SetBackClr(g_nGridFixCellColor); // è®¾ç½®å›ºå®šè¡ŒèƒŒæ™¯è‰²
   m_listLogs.GetDefaultCell(FALSE, TRUE)->SetBackClr(g_nGridFixCellColor); // è®¾ç½®å›ºå®šåˆ—背景色
   m_listLogs.GetDefaultCell(FALSE, FALSE)->SetBackClr(g_nGridCellColor);   // è®¾ç½®å•元格背景色
   m_listLogs.SetFixedTextColor(g_nGridFixFontColor); // è®¾ç½®å›ºå®šè¡Œåˆ—字体颜色
   m_listLogs.SetRowCount(nRows);
   m_listLogs.SetColumnCount(nCols);
   m_listLogs.SetFixedRowCount(nFixRows);
   m_listLogs.SetFixedColumnCount(nFixCols);
   // Col
   m_listLogs.SetColumnWidth(nColIdx, 10);
   m_listLogs.SetItemText(nRowIdx, nColIdx++, _T("No."));
   m_listLogs.SetColumnWidth(nColIdx, 10);
   m_listLogs.SetItemText(nRowIdx, nColIdx++, _T("类型"));
   m_listLogs.SetColumnWidth(nColIdx, 100);
   m_listLogs.SetItemText(nRowIdx, nColIdx++, _T("事件"));
   m_listLogs.SetColumnWidth(nColIdx, 30);
   m_listLogs.SetItemText(nRowIdx, nColIdx++, _T("用户"));
   m_listLogs.SetColumnWidth(nColIdx, 50);
   m_listLogs.SetItemText(nRowIdx, nColIdx++, _T("时间"));
   // åˆ›å»º 20 è¡Œç©ºç™½æ•°æ®è¡Œ
   for (int i = 1; i < nRows; ++i) {
      for (int j = 0; j < nCols; ++j) {
         m_listLogs.SetItemText(i, j, _T("")); // åˆå§‹åŒ–为空字符串
      }
   }
   m_listLogs.SetFixedRowSelection(FALSE);
   m_listLogs.SetFixedColumnSelection(FALSE);
   m_listLogs.SetEditable(FALSE);
   m_listLogs.SetRowResize(FALSE);
   m_listLogs.SetColumnResize(TRUE);
   m_listLogs.ExpandColumnsToFit(TRUE);
   m_listLogs.SetListMode(TRUE);            // å¯ç”¨åˆ—表模式
   m_listLogs.EnableSelection(TRUE);         // å¯ç”¨é€‰æ‹©
   m_listLogs.SetSingleRowSelection(TRUE);      // è‡ªåŠ¨æ•´è¡Œé«˜äº®ï¼ˆé™åˆ¶ä¸ºå•è¡Œé€‰æ‹©ï¼‰
   m_listLogs.ExpandLastColumn();            // æœ€åŽä¸€åˆ—填充网格
   try {
      FillSystemLogManager();
   }
   catch (const std::exception& ex) {
      CString errorMsg;
      errorMsg.Format(_T("初始化运行日志失败:%s"), CString(ex.what()));
      AfxMessageBox(errorMsg, MB_ICONERROR);
   }
}
void CSystemLogManagerDlg::FillSystemLogManager()
{
   // èŽ·å–ç­›é€‰æ¡ä»¶
   CString selectedType, selectedUser, description;
   m_comboType.GetLBText(m_comboType.GetCurSel(), selectedType);
   m_comboUser.GetLBText(m_comboUser.GetCurSel(), selectedUser);
   m_editDescription.GetWindowText(description);
   COleDateTime startTime, endTime;
   m_dateTimeStart.GetTime(startTime);
   m_dateTimeEnd.GetTime(endTime);
   CString strStartTime = startTime.Format(_T("%Y-%m-%d %H:%M:%S"));
   CString strEndTime = endTime.Format(_T("%Y-%m-%d %H:%M:%S"));
   std::string type = CT2A(selectedType);
   std::string user = CT2A(selectedUser);
   std::string desc = CT2A(description);
   std::string start = CT2A(strStartTime);
   std::string end = CT2A(strEndTime);
   // èŽ·å–æ—¥å¿—ç®¡ç†å®žä¾‹
   SystemLogManager& logManager = SystemLogManager::getInstance();
   int pageSize = 20; // æ¯é¡µæ˜¾ç¤º 20 æ¡è®°å½•
   int totalRecords = logManager.getTotalLogCount(type, user, desc, start, end);
   m_nTotalPages = (totalRecords + pageSize - 1) / pageSize;
   auto logs = logManager.getFilteredLogs(type, user, desc, start, end, m_nCurrentPage, pageSize);
   // æ›´æ–°è¡¨æ ¼æ•°æ®
   int rowIdx = 1;
   for (const auto& log : logs) {
      m_listLogs.SetItemText(rowIdx, 0, CString(std::to_string(rowIdx).c_str())); // åºå·
      m_listLogs.SetItemText(rowIdx, 1, CString(log[1].c_str()));                 // ç±»åž‹
      m_listLogs.SetItemText(rowIdx, 2, CString(log[2].c_str()));                 // äº‹ä»¶
      m_listLogs.SetItemText(rowIdx, 3, CString(log[3].c_str()));                 // ç”¨æˆ·
      m_listLogs.SetItemText(rowIdx, 4, CString(log[4].c_str()));                 // æ—¶é—´
      ++rowIdx;
   }
   // æ¸…空多余行
   for (; rowIdx <= 20; ++rowIdx) {
      m_listLogs.SetItemText(rowIdx, 0, CString(std::to_string(rowIdx).c_str())); // åºå·åˆ—
      for (int colIdx = 1; colIdx < m_listLogs.GetColumnCount(); ++colIdx) {
         m_listLogs.SetItemText(rowIdx, colIdx, _T(""));
      }
   }
   m_listLogs.ExpandColumnsToFit(FALSE);
   m_listLogs.ExpandLastColumn();
   m_listLogs.Invalidate();
   m_listLogs.UpdateWindow();
   UpdatePageInfo();
}
CFont* CSystemLogManagerDlg::GetOrCreateFont(int nFontSize)
{
   auto it = m_mapFonts.find(nFontSize);
   if (it != m_mapFonts.end()) {
      return it->second;
   }
   CFont* font = new CFont();
   LOGFONT logFont = { 0 };
   _tcscpy_s(logFont.lfFaceName, _T("Segoe UI"));
   logFont.lfHeight = -nFontSize;
   logFont.lfQuality = CLEARTYPE_QUALITY;
   font->CreateFontIndirect(&logFont);
   m_mapFonts[nFontSize] = font;
   return font;
}
void CSystemLogManagerDlg::UpdatePageInfo()
{
   // æ ¼å¼åŒ–页码信息为 "当前页/总页数"
   CString pageInfo;
   pageInfo.Format(_T("%d/%d é¡µ"), m_nCurrentPage, m_nTotalPages);
   m_staticPageNum.SetWindowText(pageInfo);
}
void CSystemLogManagerDlg::SetDefaultFont()
{
   CFont* defaultFont = GetOrCreateFont(12);
   // éåŽ†æ‰€æœ‰æŽ§ä»¶ï¼Œåº”ç”¨é»˜è®¤å­—ä½“
   CWnd* pWnd = GetWindow(GW_CHILD);
   while (pWnd) {
      // è·³è¿‡ç‰¹æ®ŠæŽ§ä»¶ï¼ˆå¦‚ MFCGridCtrl)
      TCHAR szClassName[256];
      GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName));
      if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) {
         pWnd = pWnd->GetNextWindow();
         continue;
      }
      pWnd->SetFont(defaultFont, TRUE);
      pWnd = pWnd->GetNextWindow();
   }
}
void CSystemLogManagerDlg::AdjustControls(float dScaleX, float dScaleY)
{
   CWnd* pWnd = GetWindow(GW_CHILD);
   while (pWnd) {
      int nCtrlID = pWnd->GetDlgCtrlID();
      if (nCtrlID != -1 && m_mapCtrlLayouts.find(nCtrlID) != m_mapCtrlLayouts.end())
      {
         CRect originalRect = m_mapCtrlLayouts[nCtrlID];
         CRect newRect(
            static_cast<int>(originalRect.left * dScaleX),
            static_cast<int>(originalRect.top * dScaleY),
            static_cast<int>(originalRect.right * dScaleX),
            static_cast<int>(originalRect.bottom * dScaleY));
         TCHAR szClassName[256];
         GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName));
         if (_tcsicmp(szClassName, _T("ComboBox")) == 0) {
            CComboBox* pComboBox = (CComboBox*)pWnd;
            pComboBox->SetItemHeight(-1, newRect.Height());  // -1 è¡¨ç¤ºæ‰€æœ‰é¡¹çš„高度
         }
         if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) {
            CGridCtrl* pGridCtrl = (CGridCtrl*)pWnd;
            pGridCtrl->SetDefCellHeight(newRect.Height() / 21);
            pGridCtrl->ExpandColumnsToFit(TRUE);
            pGridCtrl->ExpandLastColumn();
            pGridCtrl->Invalidate();
            pGridCtrl->UpdateWindow();
         }
         pWnd->MoveWindow(&newRect);
         AdjustControlFont(pWnd, newRect.Width(), newRect.Height());
      }
      pWnd = pWnd->GetNextWindow();
   }
}
void CSystemLogManagerDlg::AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight)
{
   TCHAR szClassName[256];
   GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName));
   // è·³è¿‡ç‰¹æ®ŠæŽ§ä»¶ï¼ˆå¦‚ MFCGridCtrl)
   if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) {
      return;
   }
   // æ ¹æ®æŽ§ä»¶é«˜åº¦åŠ¨æ€è°ƒæ•´å­—ä½“å¤§å°
   int fontSize = nHeight / 2;
   if (fontSize < 8) fontSize = 8;
   // èŽ·å–æˆ–åˆ›å»ºå­—ä½“
   CFont* pFont = GetOrCreateFont(fontSize);
   pWnd->SetFont(pFont);
   pWnd->Invalidate(); // åˆ·æ–°æŽ§ä»¶æ˜¾ç¤º
}
void CSystemLogManagerDlg::AdjustComboBoxStyle(CComboBox& comboBox)
{
   DWORD dwStyle = comboBox.GetStyle();
   comboBox.ModifyStyle(0, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_OWNERDRAWFIXED);
   comboBox.Invalidate();
   comboBox.UpdateWindow();
}
void CSystemLogManagerDlg::AdjustDateTimeCtrlStyle(CDateTimeCtrl& dateTimeCtrl)
{
   dateTimeCtrl.ModifyStyle(0, DTS_RIGHTALIGN);
   dateTimeCtrl.Invalidate();
   dateTimeCtrl.UpdateWindow();
}
BEGIN_MESSAGE_MAP(CSystemLogManagerDlg, CDialogEx)
   ON_BN_CLICKED(IDC_BUTTON_SEARCH, &CSystemLogManagerDlg::OnBnClickedButtonSearch)
   ON_BN_CLICKED(IDC_BUTTON_PREV_PAGE, &CSystemLogManagerDlg::OnBnClickedButtonPrevPage)
   ON_BN_CLICKED(IDC_BUTTON_NEXT_PAGE, &CSystemLogManagerDlg::OnBnClickedButtonNextPage)
   ON_CBN_SELCHANGE(IDC_COMBO_TYPE, &CSystemLogManagerDlg::OnSelchangeComboType)
   ON_CBN_SELCHANGE(IDC_COMBO_USER, &CSystemLogManagerDlg::OnSelchangeComboUser)
   ON_WM_SIZE()
   ON_WM_GETMINMAXINFO()
END_MESSAGE_MAP()
// CSystemLogManagerDlg æ¶ˆæ¯å¤„理程序
BOOL CSystemLogManagerDlg::OnInitDialog()
{
   CDialogEx::OnInitDialog();
   // TODO:  åœ¨æ­¤æ·»åŠ é¢å¤–çš„åˆå§‹åŒ–
   SetWindowText(_T("系统运行日志"));
   m_nCurrentPage = 1;  // ä»Žç¬¬ä¸€é¡µå¼€å§‹
   m_nTotalPages = 1;   // é»˜è®¤æ€»é¡µæ•°ä¸º 1
   m_comboType.AddString(_T("ALL"));
   m_comboType.AddString(_T("信息"));
   m_comboType.AddString(_T("操作"));
   m_comboType.AddString(_T("错误"));
   m_comboType.AddString(_T("未知"));
   m_comboType.SetCurSel(0);
   m_comboUser.AddString(_T("ALL"));
   m_comboUser.AddString(_T("SYSTEM"));
   auto usernames = UserManager::getInstance().getUsernames();
   for (const auto& username : usernames) {
      CString cstrUsername(username.c_str());
      m_comboUser.AddString(cstrUsername);
   }
   m_comboUser.SetCurSel(0);
   // è®¾ç½®ä¸º 30 å¤©å‰
   COleDateTime currentTime = COleDateTime::GetCurrentTime();
   COleDateTime defaultStartTime = currentTime - COleDateTimeSpan(30, 0, 0, 0);
   m_dateTimeStart.SetTime(defaultStartTime);
   CRect screenRect, dlgRect, clientRect;
   GetClientRect(&clientRect);
   m_nInitialWidth = clientRect.Width();
   m_nInitialHeight = clientRect.Height();
   // åˆå§‹åŒ–默认字体
   CFont* pDefaultFont = GetOrCreateFont(12);
   // éåŽ†æ‰€æœ‰å­æŽ§ä»¶ï¼Œè®°å½•åˆå§‹ä½ç½®å¹¶è®¾ç½®é»˜è®¤å­—ä½“
   CWnd* pWnd = GetWindow(GW_CHILD);
   while (pWnd) {
      int nCtrlID = pWnd->GetDlgCtrlID();
      if (nCtrlID != -1) {
         // è®°å½•控件初始布局
         CRect ctrlRect;
         pWnd->GetWindowRect(&ctrlRect);
         ScreenToClient(&ctrlRect);
         m_mapCtrlLayouts[nCtrlID] = ctrlRect;
         // è·³è¿‡ç‰¹æ®ŠæŽ§ä»¶ï¼ˆå¦‚ MFCGridCtrl)
         TCHAR szClassName[256];
         GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName));
         if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) {
            pWnd = pWnd->GetNextWindow();
            continue;
         }
         // è®¾ç½®é»˜è®¤å­—体
         pWnd->SetFont(pDefaultFont);
      }
      pWnd = pWnd->GetNextWindow();
   }
   GetWindowRect(&dlgRect);
   int dlgWidth = dlgRect.Width() * 2;
   int dlgHeight = dlgRect.Height() * 2;
   SystemParametersInfo(SPI_GETWORKAREA, 0, &screenRect, 0);
   if (dlgWidth > screenRect.Width()) {
      dlgWidth = screenRect.Width();
   }
   if (dlgHeight > screenRect.Height()) {
      dlgHeight = screenRect.Height();
   }
   int centerX = screenRect.left + (screenRect.Width() - dlgWidth) / 2;
   int centerY = screenRect.top + (screenRect.Height() - dlgHeight) / 2;
   MoveWindow(centerX, centerY, dlgWidth, dlgHeight);
   InitSystemLogManager();
   return TRUE;  // return TRUE unless you set the focus to a control
   // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
}
void CSystemLogManagerDlg::OnSize(UINT nType, int cx, int cy)
{
   CDialogEx::OnSize(nType, cx, cy);
   // TODO: åœ¨æ­¤å¤„添加消息处理程序代码
   if (nType == SIZE_MINIMIZED || m_mapCtrlLayouts.empty()) {
      return;
   }
   float dScaleX = static_cast<float>(cx) / m_nInitialWidth;
   float dScaleY = static_cast<float>(cy) / m_nInitialHeight;
   // éåŽ†å¯¹è¯æ¡†ä¸­çš„æ‰€æœ‰æŽ§ä»¶
   AdjustControls(dScaleX, dScaleY);
}
void CSystemLogManagerDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
   // TODO: åœ¨æ­¤æ·»åŠ æ¶ˆæ¯å¤„ç†ç¨‹åºä»£ç å’Œ/或调用默认值
   lpMMI->ptMinTrackSize.x = 400; // æœ€å°å®½åº¦
   lpMMI->ptMinTrackSize.y = 300; // æœ€å°é«˜åº¦
   CDialogEx::OnGetMinMaxInfo(lpMMI);
}
void CSystemLogManagerDlg::OnBnClickedButtonSearch()
{
   // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
   try {
      m_nCurrentPage = 1;
      FillSystemLogManager();
   }
   catch (const std::exception& ex) {
      CString errorMsg;
      errorMsg.Format(_T("搜索失败:%s"), CString(ex.what()));
      AfxMessageBox(errorMsg, MB_ICONERROR);
   }
}
void CSystemLogManagerDlg::OnBnClickedButtonPrevPage()
{
   // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
   try {
      if (m_nCurrentPage > 1) {
         m_nCurrentPage--;
         FillSystemLogManager();
      }
      else {
         AfxMessageBox(_T("已经是第一页!"));
      }
   }
   catch (const std::exception& ex) {
      CString errorMsg;
      errorMsg.Format(_T("切换到上一页失败:%s"), CString(ex.what()));
      AfxMessageBox(errorMsg, MB_ICONERROR);
   }
}
void CSystemLogManagerDlg::OnBnClickedButtonNextPage()
{
   // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
   try {
      if (m_nCurrentPage < m_nTotalPages) {
         m_nCurrentPage++;
         FillSystemLogManager();
      }
      else {
         AfxMessageBox(_T("已经是最后一页!"));
      }
   }
   catch (const std::exception& ex) {
      CString errorMsg;
      errorMsg.Format(_T("切换到下一页失败:%s"), CString(ex.what()));
      AfxMessageBox(errorMsg, MB_ICONERROR);
   }
}
void CSystemLogManagerDlg::OnSelchangeComboType()
{
   // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
   try {
      m_nCurrentPage = 1;
      FillSystemLogManager();
   }
   catch (const std::exception& ex) {
      CString errorMsg;
      errorMsg.Format(_T("切换类型失败:%s"), CString(ex.what()));
      AfxMessageBox(errorMsg, MB_ICONERROR);
   }
}
void CSystemLogManagerDlg::OnSelchangeComboUser()
{
   // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
   try {
      m_nCurrentPage = 1;
      FillSystemLogManager();
   }
   catch (const std::exception& ex) {
      CString errorMsg;
      errorMsg.Format(_T("切换角色失败:%s"), CString(ex.what()));
      AfxMessageBox(errorMsg, MB_ICONERROR);
   }
}