// PageTransferLog.cpp: 实现文件 // #include "stdafx.h" #include "Servo.h" #include "afxdialogex.h" #include "PageTransferLog.h" #include "Common.h" #define PAGE_SIZE 100 #define PAGE_BACKGROUND_COLOR RGB(252, 252, 255) // CPageTransferLog 对话框 IMPLEMENT_DYNAMIC(CPageTransferLog, CDialogEx) CPageTransferLog::CPageTransferLog(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_PAGE_TRANSFER_LOG, pParent) { m_crBkgnd = PAGE_BACKGROUND_COLOR; m_hbrBkgnd = nullptr; m_pObserver = nullptr; m_strStatus = ""; m_strKeyword = ""; m_nCurPage = 0; m_nTotalPages = 0; memset(m_szTimeStart, 0, sizeof(m_szTimeStart)); memset(m_szTimeEnd, 0, sizeof(m_szTimeEnd)); m_szTimeStart[0] = '\0'; m_szTimeEnd[0] = '\0'; } CPageTransferLog::~CPageTransferLog() { if (m_hbrBkgnd != nullptr) { ::DeleteObject(m_hbrBkgnd); } if (m_pObserver != nullptr) { m_pObserver->unsubscribe(); m_pObserver = nullptr; } } void CPageTransferLog::DoDataExchange(CDataExchange* pDX) { DDX_Control(pDX, IDC_DATETIMEPICKER_START, m_dateTimeStart); DDX_Control(pDX, IDC_DATETIMEPICKER_END, m_dateTimeEnd); DDX_Control(pDX, IDC_LIST_ALARM, m_listCtrl); CDialogEx::DoDataExchange(pDX); } void CPageTransferLog::InitRxWindow() { /* code */ // 订阅数据 IRxWindows* pRxWindows = RX_GetRxWindows(); pRxWindows->enableLog(5); if (m_pObserver == NULL) { m_pObserver = pRxWindows->allocObserver([&](IAny* pAny) -> void { // onNext pAny->addRef(); int code = pAny->getCode(); //if (RX_CODE_ALARM_SET == code) { // UpdatePageData(); //} //else if (RX_CODE_ALARM_CLEAR == code) { // UpdatePageData(); //} pAny->release(); }, [&]() -> void { // onComplete }, [&](IThrowable* pThrowable) -> void { // onErrorm pThrowable->printf(); }); theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread())->subscribe(m_pObserver); } } void CPageTransferLog::Resize() { CRect rcClient; GetClientRect(&rcClient); // ===== 常量定义 ===== const int nLeft = 12; const int nRight = 12; const int nTop = 58; const int nButtonHeight = 28; const int nButtonMarginBottom = 12; const int nSpacing = 8; const int nButtonWidth = 80; const int nLabelWidth = 100; // ===== 分页控件布局 ===== int yBottom = rcClient.bottom - nButtonMarginBottom - nButtonHeight; int xRight = rcClient.Width() - nRight; CWnd* pBtnNext = GetDlgItem(IDC_BUTTON_NEXT_PAGE); CWnd* pBtnPrev = GetDlgItem(IDC_BUTTON_PREV_PAGE); CWnd* pLabelPage = GetDlgItem(IDC_LABEL_PAGE_NUMBER); if (pBtnNext && pBtnPrev && pLabelPage) { // 获取分页文本宽度估算 //CString strLabel; //GetDlgItemText(IDC_LABEL_PAGE_NUMBER, strLabel); //if (strLabel.IsEmpty()) { // strLabel = _T("第 1 / 1 页"); //} //int nCharWidth = 8; //int nLabelWidth = strLabel.GetLength() * nCharWidth + 20; // 设置按钮和标签位置 pBtnNext->MoveWindow(xRight - nButtonWidth, yBottom, nButtonWidth, nButtonHeight); xRight -= nButtonWidth + nSpacing; pLabelPage->MoveWindow(xRight - nLabelWidth, yBottom, nLabelWidth, nButtonHeight); xRight -= nLabelWidth + nSpacing; pBtnPrev->MoveWindow(xRight - nButtonWidth, yBottom, nButtonWidth, nButtonHeight); } // ===== 表格区域布局 ===== if (nullptr != m_listCtrl.m_hWnd) { int listHeight = yBottom - nTop - nSpacing; m_listCtrl.MoveWindow(nLeft, nTop, rcClient.Width() - nLeft - nRight, listHeight); } } void CPageTransferLog::InitStatusCombo() { CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_STATUS_FILTER); if (nullptr != pComboBox) { pComboBox->ResetContent(); pComboBox->AddString(_T("全部")); pComboBox->AddString(_T("Ready")); pComboBox->AddString(_T("Running")); pComboBox->AddString(_T("Error")); pComboBox->AddString(_T("Abort")); pComboBox->AddString(_T("Completed")); pComboBox->SetCurSel(0); } } void CPageTransferLog::InitTimeRangeCombo() { CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_DATETIME); if (nullptr != pComboBox) { pComboBox->ResetContent(); pComboBox->AddString(_T("不限")); pComboBox->AddString(_T("今天")); pComboBox->AddString(_T("七天内")); pComboBox->AddString(_T("本月")); pComboBox->AddString(_T("今年")); pComboBox->AddString(_T("自定义")); pComboBox->SetCurSel(0); } } void CPageTransferLog::InitDateTimeControls() { if (m_dateTimeStart.m_hWnd == nullptr || m_dateTimeEnd.m_hWnd == nullptr) { return; } // 禁用初始状态 m_dateTimeStart.EnableWindow(FALSE); m_dateTimeEnd.EnableWindow(FALSE); // 设置格式:显示日期 + 时间 //m_dateTimeStart.SetFormat(_T("yyyy/MM/dd HH:mm:ss")); //m_dateTimeEnd.SetFormat(_T("yyyy/MM/dd HH:mm:ss")); // 修改样式以支持时间格式 //DWORD dwStyleStart = m_dateTimeStart.GetStyle(); //DWORD dwStyleEnd = m_dateTimeEnd.GetStyle(); //m_dateTimeStart.ModifyStyle(0, DTS_TIMEFORMAT | DTS_UPDOWN); //m_dateTimeEnd.ModifyStyle(0, DTS_TIMEFORMAT); } void CPageTransferLog::LoadTransfers() { m_nCurPage = 1; UpdatePageData(); } void CPageTransferLog::UpdatePageData() { TransferData filter; filter.strStatus = m_strStatus; filter.strDescription = m_strKeyword; filter.strCreateTime = m_szTimeStart; filter.strEndTime = m_szTimeEnd; auto vecData = TransferManager::getInstance().getTransfers(filter, m_nCurPage, PAGE_SIZE); FillDataToListCtrl(vecData); int nTotalRecords = TransferManager::getInstance().getFilteredTransferCount(filter); m_nTotalPages = (nTotalRecords + PAGE_SIZE - 1) / PAGE_SIZE; UpdatePageControls(); } void CPageTransferLog::UpdatePageControls() { CString strPage; strPage.Format(_T("第 %d / %d 页"), m_nCurPage, m_nTotalPages); SetDlgItemText(IDC_LABEL_PAGE_NUMBER, strPage); GetDlgItem(IDC_BUTTON_PREV_PAGE)->EnableWindow(m_nCurPage > 1); GetDlgItem(IDC_BUTTON_NEXT_PAGE)->EnableWindow(m_nCurPage < m_nTotalPages); Resize(); } void CPageTransferLog::UpdateDateFilter() { CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_DATETIME); if (nullptr != pComboBox) { int nIndex = pComboBox->GetCurSel(); if (nIndex == 0) { memset(m_szTimeStart, 0, sizeof(m_szTimeStart)); memset(m_szTimeEnd, 0, sizeof(m_szTimeEnd)); m_szTimeStart[0] = '\0'; m_szTimeEnd[0] = '\0'; } else { CTime time = CTime::GetCurrentTime(); if (nIndex == 1) { sprintf_s(m_szTimeStart, 64, "%d-%02d-%02d 00:00:00", time.GetYear(), time.GetMonth(), time.GetDay()); sprintf_s(m_szTimeEnd, 64, "%d-%02d-%02d 23:59:59", time.GetYear(), time.GetMonth(), time.GetDay()); } else if (nIndex == 2) { CTime time2 = time - CTimeSpan(7, 0, 0, 0); sprintf_s(m_szTimeStart, 64, "%d-%02d-%02d 00:00:00", time2.GetYear(), time2.GetMonth(), time2.GetDay()); sprintf_s(m_szTimeEnd, 64, "%d-%02d-%02d 23:59:59", time.GetYear(), time.GetMonth(), time.GetDay()); } else if (nIndex == 3) { sprintf_s(m_szTimeStart, 64, "%d-%02d-01 00:00:00", time.GetYear(), time.GetMonth()); sprintf_s(m_szTimeEnd, 64, "%d-%02d-%02d 23:59:59", time.GetYear(), time.GetMonth(), time.GetDay()); } else if (nIndex == 4) { sprintf_s(m_szTimeStart, 64, "%d-01-01 00:00:00", time.GetYear()); sprintf_s(m_szTimeEnd, 64, "%d-12-31 23:59:59", time.GetYear()); } else if (nIndex == 5) { SYSTEMTIME t1, t2; m_dateTimeStart.GetTime(&t1); m_dateTimeEnd.GetTime(&t2); //sprintf_s(m_szTimeStart, 64, "%d-%02d-%02d %02d:%02d:%02d", t1.wYear, t1.wMonth, t1.wDay, t1.wHour, t1.wMinute, t1.wSecond); //sprintf_s(m_szTimeEnd, 64, "%d-%02d-%02d %02d:%02d:%02d", t2.wYear, t2.wMonth, t2.wDay, t2.wHour, t2.wMinute, t2.wSecond); sprintf_s(m_szTimeStart, 64, "%d-%02d-%02d 00:00:00", t1.wYear, t1.wMonth, t1.wDay); sprintf_s(m_szTimeEnd, 64, "%d-%02d-%02d 23:59:59", t2.wYear, t2.wMonth, t2.wDay); } } } } void CPageTransferLog::FillDataToListCtrl(const std::vector& vecData) { if (m_listCtrl.m_hWnd == nullptr) { return; } m_listCtrl.DeleteAllItems(); for (const auto& item : vecData) { InsertTransferData(item); } } void CPageTransferLog::InsertTransferData(const TransferData& data) { if (m_listCtrl.m_hWnd == nullptr) { return; } int nItem = m_listCtrl.InsertItem(0, _T("")); CString str; str.Format(_T("%d"), data.nRecordId); m_listCtrl.SetItemText(nItem, 1, str); m_listCtrl.SetItemText(nItem, 2, CString(data.strStatus.c_str())); m_listCtrl.SetItemText(nItem, 3, CString(data.strClassID.c_str())); m_listCtrl.SetItemText(nItem, 4, CString(data.strCreateTime.c_str())); m_listCtrl.SetItemText(nItem, 5, CString(data.strPickTime.c_str())); m_listCtrl.SetItemText(nItem, 6, CString(data.strPlaceTime.c_str())); m_listCtrl.SetItemText(nItem, 7, CString(data.strEndTime.c_str())); m_listCtrl.SetItemText(nItem, 8, CString(data.strDescription.c_str())); } BEGIN_MESSAGE_MAP(CPageTransferLog, CDialogEx) ON_WM_CTLCOLOR() ON_WM_DESTROY() ON_WM_SIZE() ON_WM_TIMER() ON_CBN_SELCHANGE(IDC_COMBO_DATETIME, &CPageTransferLog::OnCbnSelchangeComboDatetime) ON_CBN_SELCHANGE(IDC_COMBO_STATUS_FILTER, &CPageTransferLog::OnCbnSelchangeComboStatusFilter) ON_BN_CLICKED(IDC_BUTTON_SEARCH, &CPageTransferLog::OnBnClickedButtonSearch) ON_BN_CLICKED(IDC_BUTTON_EXPORT, &CPageTransferLog::OnBnClickedButtonExport) ON_BN_CLICKED(IDC_BUTTON_PREV_PAGE, &CPageTransferLog::OnBnClickedButtonPrevPage) ON_BN_CLICKED(IDC_BUTTON_NEXT_PAGE, &CPageTransferLog::OnBnClickedButtonNextPage) END_MESSAGE_MAP() // CPageTransferLog 消息处理程序 BOOL CPageTransferLog::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 SetTimer(1, 3000, nullptr); // 下拉框控件 InitStatusCombo(); InitTimeRangeCombo(); // 日期控件 InitDateTimeControls(); // 报表控件 DWORD dwStyle = m_listCtrl.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT; dwStyle |= LVS_EX_GRIDLINES; m_listCtrl.SetExtendedStyle(dwStyle); HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1); ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL); CString headers[] = { _T(""), _T("任务ID"), _T("状态"), _T("ClassID"), _T("创建时间"), _T("取片时间"), _T("放片时间"), _T("结束时间"), _T("描述") }; int widths[] = { 0, 80, 80, 100, 120, 120, 120, 120, 200 }; for (int i = 0; i < 9; ++i) { m_listCtrl.InsertColumn(i, headers[i], LVCFMT_LEFT, widths[i]); } m_listCtrl.SetColumnWidth(8, LVSCW_AUTOSIZE_USEHEADER); // 读出列宽 CString strIniFile, strItem; strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); int width[8] = { 0, 80, 180, 80, 80, 100, 80, 180 }; for (int i = 0; i < 8; i++) { strItem.Format(_T("Col_%d_Width"), i); width[i] = GetPrivateProfileInt("TransferListCtrl", strItem, width[i], strIniFile); } // 计算总页数 int nTotalRecords = TransferManager::getInstance().getTotalTransferCountAll(); m_nTotalPages = (nTotalRecords + PAGE_SIZE - 1) / PAGE_SIZE; m_nCurPage = 1; Resize(); LoadTransfers(); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } HBRUSH CPageTransferLog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if (nCtlColor == CTLCOLOR_STATIC) { pDC->SetBkColor(m_crBkgnd); } if (m_hbrBkgnd == nullptr) { m_hbrBkgnd = CreateSolidBrush(m_crBkgnd); } return m_hbrBkgnd; } void CPageTransferLog::OnDestroy() { CDialogEx::OnDestroy(); if (m_hbrBkgnd != nullptr) { ::DeleteObject(m_hbrBkgnd); m_hbrBkgnd = nullptr; } if (m_pObserver != nullptr) { m_pObserver->unsubscribe(); m_pObserver = nullptr; } // 保存列宽 CString strIniFile, strItem, strTemp; strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); CHeaderCtrl* pHeader = m_listCtrl.GetHeaderCtrl(); for (int i = 0; i < pHeader->GetItemCount(); i++) { RECT rect; pHeader->GetItemRect(i, &rect); strItem.Format(_T("Col_%d_Width"), i); strTemp.Format(_T("%d"), rect.right - rect.left); WritePrivateProfileString("TransferListCtrl", strItem, strTemp, strIniFile); } } void CPageTransferLog::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); Resize(); } void CPageTransferLog::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == 1) { KillTimer(1); InitRxWindow(); } CDialogEx::OnTimer(nIDEvent); } void CPageTransferLog::OnCbnSelchangeComboDatetime() { CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_DATETIME); int nIndex = pComboBox->GetCurSel(); int nCount = pComboBox->GetCount(); m_dateTimeStart.EnableWindow(nIndex == nCount - 1); m_dateTimeEnd.EnableWindow(nIndex == nCount - 1); // 更新日期过滤器和页面数据 UpdateDateFilter(); LoadTransfers(); } void CPageTransferLog::OnCbnSelchangeComboStatusFilter() { CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_STATUS_FILTER); int nIndex = pComboBox->GetCurSel(); if (nIndex == 0) { m_strStatus.clear(); } else { CString cstrText; pComboBox->GetLBText(nIndex, cstrText); m_strStatus = CT2A(cstrText); } LoadTransfers(); } void CPageTransferLog::OnBnClickedButtonSearch() { // 获取关键字输入框内容 CString strKeyword; GetDlgItemText(IDC_EDIT_KEYWORD, strKeyword); m_strKeyword = CT2A(strKeyword); // 更新日期过滤器和页面数据 UpdateDateFilter(); LoadTransfers(); } void CPageTransferLog::OnBnClickedButtonExport() { CFileDialog fileDialog(FALSE, _T("csv"), NULL, OFN_HIDEREADONLY, _T("CSV Files (*.csv)|*.csv||")); if (fileDialog.DoModal() != IDOK) { return; } CStdioFile file; if (!file.Open(fileDialog.GetPathName(), CFile::modeCreate | CFile::modeWrite | CFile::typeText)) { AfxMessageBox(_T("创建文件失败!")); return; } CString strHeader = _T("任务ID,状态,ClassID,创建时间,取片时间,放片时间,结束时间,描述\n"); file.WriteString(strHeader); for (int i = 0; i < m_listCtrl.GetItemCount(); ++i) { CString row; for (int j = 1; j <= 8; ++j) { row += m_listCtrl.GetItemText(i, j); if (j != 8) { row += ","; } } row += "\n"; file.WriteString(row); } file.Close(); } void CPageTransferLog::OnBnClickedButtonPrevPage() { if (m_nCurPage > 1) { m_nCurPage--; UpdatePageData(); } } void CPageTransferLog::OnBnClickedButtonNextPage() { if (m_nCurPage < m_nTotalPages) { m_nCurPage++; UpdatePageData(); } }