From c119b8ef36718a8ca24b719cdbff86913cbca129 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期二, 09 九月 2025 17:59:23 +0800
Subject: [PATCH] 1.Glass数据库保存,查询,分页,关键字,时间段等功能;

---
 SourceCode/Bond/Servo/CPageGlassList.cpp |  280 +++++++++++++++++--------------------------------------
 1 files changed, 87 insertions(+), 193 deletions(-)

diff --git a/SourceCode/Bond/Servo/CPageGlassList.cpp b/SourceCode/Bond/Servo/CPageGlassList.cpp
index 4a35061..b5fb2f8 100644
--- a/SourceCode/Bond/Servo/CPageGlassList.cpp
+++ b/SourceCode/Bond/Servo/CPageGlassList.cpp
@@ -6,9 +6,11 @@
 #include "CPageGlassList.h"
 #include "afxdialogex.h"
 #include "GlassJson.h"
+#include "CServoUtilsTool.h"
+#include "ToolUnits.h"
 
 
-#define PAGE_SIZE						100
+#define PAGE_SIZE						10
 #define PAGE_BACKGROUND_COLOR			RGB(252, 252, 255)
 
 // CPageGlassList 瀵硅瘽妗�
@@ -23,9 +25,8 @@
 	m_pObserver = nullptr;
 
 	m_strStatus = "";
-	m_strKeyword = "";
 	m_nCurPage = 0;
-	m_nTotalPages = 0;
+	m_nTotalPages = 1;
 
 	memset(m_szTimeStart, 0, sizeof(m_szTimeStart));
 	memset(m_szTimeEnd, 0, sizeof(m_szTimeEnd));
@@ -198,7 +199,7 @@
 	//m_dateTimeEnd.ModifyStyle(0, DTS_TIMEFORMAT);
 }
 
-void CPageGlassList::LoadTransfers()
+void CPageGlassList::LoadData()
 {
 	m_nCurPage = 1;
 	UpdatePageData();
@@ -206,19 +207,36 @@
 
 void CPageGlassList::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);
+	// 鏌ヨ
+	auto& db = GlassLogDb::Instance();
+	auto page = db.queryPaged(m_filters, PAGE_SIZE, PAGE_SIZE * (m_nCurPage - 1));
+	m_listCtrl.DeleteAllItems();
+	for (const auto& r : page.items) {
+		int index = m_listCtrl.InsertItem(m_listCtrl.GetItemCount(), std::to_string(r.id).c_str());
+		m_listCtrl.SetItemText(index, 1, std::to_string(r.cassetteSeqNo).c_str());
+		m_listCtrl.SetItemText(index, 2, std::to_string(r.jobSeqNo).c_str());
+		m_listCtrl.SetItemText(index, 3, r.classId.c_str());
+		m_listCtrl.SetItemText(index, 4, SERVO::CServoUtilsTool::getMaterialsTypeText((SERVO::MaterialsType)r.materialType).c_str());
+		m_listCtrl.SetItemText(index, 5, SERVO::CServoUtilsTool::getGlassStateText((SERVO::GlsState)r.state).c_str());
+		m_listCtrl.SetItemText(index, 6, r.tStart.c_str());
+		m_listCtrl.SetItemText(index, 7, r.tEnd.c_str());
+		m_listCtrl.SetItemText(index, 8, r.buddyId.c_str());
+		m_listCtrl.SetItemText(index, 9, SERVO::CServoUtilsTool::getInspResultText((SERVO::InspResult)r.aoiResult).c_str());
+		m_listCtrl.SetItemText(index, 10, r.path.c_str());
+		m_listCtrl.SetItemText(index, 11, r.params.c_str());
 
-	int nTotalRecords = TransferManager::getInstance().getFilteredTransferCount(filter);
-	m_nTotalPages = (nTotalRecords + PAGE_SIZE - 1) / PAGE_SIZE;
+		// 娴嬭瘯鍙嶅簭鍒楀寲
+		/*
+		SERVO::CGlass g2;
+		std::string err;
+		if (GlassJson::FromString(r.pretty, g2, &err)) {
+			AfxMessageBox(r.pretty.c_str());
+		}
+		*/
+	}
+
+	// 涓婁竴椤� / 涓嬩竴椤�
 	UpdatePageControls();
-	*/
 }
 
 void CPageGlassList::UpdatePageControls()
@@ -228,91 +246,8 @@
 	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 CPageGlassList::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 CPageGlassList::FillDataToListCtrl(const std::vector<TransferData>& vecData)
-{
-	if (m_listCtrl.m_hWnd == nullptr) {
-		return;
-	}
-
-	m_listCtrl.DeleteAllItems();
-	for (const auto& item : vecData) {
-		InsertTransferData(item);
-	}
-}
-
-void CPageGlassList::InsertTransferData(const TransferData& data)
-{
-	if (m_listCtrl.m_hWnd == nullptr) {
-		return;
-	}
-
-	int nIndex = m_listCtrl.GetItemCount();
-	if (nIndex < 0) {
-		return;
-	}
-
-	int nItem = m_listCtrl.InsertItem(nIndex, _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()));
-}
-*/
 // CPageTransferLog 娑堟伅澶勭悊绋嬪簭
 
 BOOL CPageGlassList::OnInitDialog()
@@ -342,7 +277,7 @@
 	ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL);
 
 	CString headers[] = { 
-		_T(""), 
+		_T("id"), 
 		_T("Cassette Sequence No"),
 		_T("Job Sequence No"),
 		_T("Class ID"),
@@ -355,24 +290,15 @@
 		_T("璺緞"),
 		_T("宸ヨ壓鍙傛暟") 
 	};
-	int widths[] = { 0, 80, 80, 100, 120, 120, 120, 120, 200, 200, 200, 200 };
+	int widths[] = { 80, 80, 80, 100, 120, 120, 120, 120, 200, 200, 200, 200 };
 	for (int i = 0; i < _countof(headers); ++i) {
 		strItem.Format(_T("Col_%d_Width"), i);
 		widths[i] = GetPrivateProfileInt("GlassListCtrl", strItem, widths[i], strIniFile);
 		m_listCtrl.InsertColumn(i, headers[i], LVCFMT_LEFT, widths[i]);
 	}
-	m_listCtrl.SetColumnWidth(10, LVSCW_AUTOSIZE_USEHEADER);
-
-
-	// 璁$畻鎬婚〉鏁�
-	/*
-	int nTotalRecords = TransferManager::getInstance().getTotalTransferCountAll();
-	m_nTotalPages = (nTotalRecords + PAGE_SIZE - 1) / PAGE_SIZE;
-	m_nCurPage = 1;
-	*/
 
 	Resize();
-	LoadTransfers();
+	OnBnClickedButtonSearch();
 
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
@@ -440,8 +366,8 @@
 	m_dateTimeEnd.EnableWindow(nIndex == nCount - 1);
 
 	// 鏇存柊鏃ユ湡杩囨护鍣ㄥ拰椤甸潰鏁版嵁
-	UpdateDateFilter();
-	LoadTransfers();
+	// UpdateDateFilter();
+	// LoadTransfers();
 }
 
 void CPageGlassList::OnCbnSelchangeComboStatusFilter()
@@ -456,7 +382,7 @@
 		pComboBox->GetLBText(nIndex, cstrText);
 		m_strStatus = CT2A(cstrText);
 	}
-	LoadTransfers();
+	// LoadTransfers();
 }
 
 void CPageGlassList::OnBnClickedButtonSearch()
@@ -464,11 +390,47 @@
 	// 鑾峰彇鍏抽敭瀛楄緭鍏ユ鍐呭
 	CString strKeyword;
 	GetDlgItemText(IDC_EDIT_KEYWORD, strKeyword);
-	m_strKeyword = CT2A(strKeyword);
+	m_filters.keyword = CT2A(strKeyword);
 
-	// 鏇存柊鏃ユ湡杩囨护鍣ㄥ拰椤甸潰鏁版嵁
-	UpdateDateFilter();
-	LoadTransfers();
+	CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_DATETIME);
+	int index = pComboBox->GetCurSel();
+	if (index == 0) {
+		// 涓嶉檺
+		m_filters.tStartFrom = std::nullopt;
+		m_filters.tStartTo = std::nullopt;
+	}
+	else if (index == 1) {
+		auto [fromUtc, toUtc] = CToolUnits::CalcQuickRangeUtc(QuickRange::Today);
+		m_filters.tStartFrom = fromUtc;
+		m_filters.tStartTo = toUtc;
+	}
+	else if (index == 2) {
+		auto [fromUtc, toUtc] = CToolUnits::CalcQuickRangeUtc(QuickRange::Last7Days);
+		m_filters.tStartFrom = fromUtc;
+		m_filters.tStartTo = toUtc;
+	}
+	else if (index == 3) {
+		auto [fromUtc, toUtc] = CToolUnits::CalcQuickRangeUtc(QuickRange::ThisMonth);
+		m_filters.tStartFrom = fromUtc;
+		m_filters.tStartTo = toUtc;
+	}
+	else if (index == 4) {
+		auto [fromUtc, toUtc] = CToolUnits::CalcQuickRangeUtc(QuickRange::ThisYear);
+		m_filters.tStartFrom = fromUtc;
+		m_filters.tStartTo = toUtc;
+	}
+	else if(index == 5){
+		// 鑷畾涔�
+		std::chrono::system_clock::time_point tp;
+		if (CToolUnits::GetCtrlDateRangeUtc_StartOfDay(m_dateTimeStart, tp)) m_filters.tStartFrom = tp;
+		if (CToolUnits::GetCtrlDateRangeUtc_EndOfDay(m_dateTimeEnd, tp))   m_filters.tStartTo = tp;
+	}
+
+	auto& db = GlassLogDb::Instance();
+	long long total = db.count(m_filters);
+	m_nTotalPages = (PAGE_SIZE > 0) ? int((total + PAGE_SIZE - 1) / PAGE_SIZE) : 1;
+
+	LoadData();
 }
 
 void CPageGlassList::OnBnClickedButtonExport()
@@ -478,90 +440,22 @@
 		return;
 	}
 
-	CStdioFile file;
-	if (!file.Open(fileDialog.GetPathName(), CFile::modeCreate | CFile::modeWrite | CFile::typeText)) {
-		AfxMessageBox(_T("鍒涘缓鏂囦欢澶辫触锛�"));
-		return;
+	// 瀵煎嚭 CSV锛氬鍑虹鍚� filters 鐨勨�滃叏閮ㄨ褰曗�濓紙涓嶅彈鍒嗛〉闄愬埗锛�
+		// 杩斿洖瀵煎嚭鐨勮鏁帮紙涓嶅惈琛ㄥご锛�
+		// csvPath锛氱洰鏍囨枃浠惰矾寰勶紙UTF-8锛�
+	auto& db = GlassLogDb::Instance();
+	std::string csvPath((LPTSTR)(LPCTSTR)fileDialog.GetPathName());
+	if (db.exportCsv(csvPath, m_filters) > 0) {
+		AfxMessageBox("瀵煎嚭CSV鎴愬姛锛�");
 	}
-
-	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 CPageGlassList::OnBnClickedButtonPrevPage()
 {
-	SERVO::CGlass g;
-	g.setID("GLS-001");
-	g.setType(SERVO::MaterialsType::G1);
-	g.setOriginPort(1, 5);
-	g.setScheduledForProcessing(TRUE);
-	g.m_failReason = "none";
-	g.markQueued();
-	g.markStart();
-
-
-	// 娣诲姞鍙傛暟
-	CParam p1("鏍℃瀵逛綅寤舵椂", "P001", "ms", 123);
-	CParam p2("娓╁害", "P002", "degC", 25.5);
-	g.getParams().push_back(p1);
-	g.getParams().push_back(p2);
-
-	// 璁剧疆 JobDataS
-	SERVO::CJobDataS* js = g.getJobDataS();
-	js->setCassetteSequenceNo(10);
-	js->setJobSequenceNo(20);
-	js->setLotId("LOT-ABC");
-	js->setGlass1Id("GLS-001");
-
-	// 娣诲姞 Path
-	g.addPath(100, 1);
-	SERVO::CPath* tail = g.getPath()->getTailPath();
-	tail->setInTime(111111);
-	tail->setOutTime(222222);
-	tail->setInspResult(SERVO::InspResult::Pass);
-	tail->processEnd();
-	return;
-	// 2. 杞负 JSON
-	std::string jsonText = GlassJson::ToPrettyString(g);
-	TRACE("搴忓垪鍖栫粨鏋�:\n%s\n\n", jsonText.c_str());
-
-	// 3. 鍙嶅簭鍒楀寲
-	SERVO::CGlass g2;
-	std::string err;
-	if (!GlassJson::FromString(jsonText, g2, &err)) {
-		TRACE("瑙f瀽澶辫触: %s\n", err.c_str());
-		return;
-	}
-
-	// 4. 鎵撳嵃楠岃瘉
-	TRACE("鍙嶅簭鍒楀寲鍚庣殑ID: %s\n", g2.getID().c_str());
-	TRACE("鍙嶅簭鍒楀寲鍚庣殑鍙傛暟鏁伴噺: %d\n", (int)g2.getParams().size());
-	if (!g2.getParams().empty()) {
-		TRACE("绗竴涓弬鏁板悕: %s 鍊�=%d\n",
-			g2.getParams()[0].getName().c_str(),
-			g2.getParams()[0].getIntValue());
-	}
-
-
-
 	if (m_nCurPage > 1) {
 		m_nCurPage--;
 		UpdatePageData();
-	}
-	
+	}	
 }
 
 void CPageGlassList::OnBnClickedButtonNextPage()

--
Gitblit v1.9.3