From 296cead8add8a66a00aa1ea07c19c1039d098c3b Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期三, 10 九月 2025 16:15:30 +0800
Subject: [PATCH] 1.将CListCtrlEx功能移到CExpandableListCtrl。

---
 SourceCode/Bond/Servo/CPageGlassList.cpp |  148 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 133 insertions(+), 15 deletions(-)

diff --git a/SourceCode/Bond/Servo/CPageGlassList.cpp b/SourceCode/Bond/Servo/CPageGlassList.cpp
index b5fb2f8..1a4cabb 100644
--- a/SourceCode/Bond/Servo/CPageGlassList.cpp
+++ b/SourceCode/Bond/Servo/CPageGlassList.cpp
@@ -8,6 +8,7 @@
 #include "GlassJson.h"
 #include "CServoUtilsTool.h"
 #include "ToolUnits.h"
+#include <optional>
 
 
 #define PAGE_SIZE						10
@@ -207,23 +208,29 @@
 
 void CPageGlassList::UpdatePageData()
 {
+	// 濡傛灉涓虹1椤�, 鍙栧嚭缂撳瓨Glass, 绗﹀悎鏉′欢鍒欐樉绀猴紱
+	m_listCtrl.DeleteAllItems();
+	UpdateWipData();
+
+
 	// 鏌ヨ
 	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 index = m_listCtrl.InsertItem(m_listCtrl.GetItemCount(), "");
+		m_listCtrl.SetItemText(index, 1, std::to_string(r.id).c_str());
+		m_listCtrl.SetItemText(index, 2, std::to_string(r.cassetteSeqNo).c_str());
+		m_listCtrl.SetItemText(index, 3, std::to_string(r.jobSeqNo).c_str());
+		m_listCtrl.SetItemText(index, 4, r.classId.c_str());
+		m_listCtrl.SetItemText(index, 5, SERVO::CServoUtilsTool::getMaterialsTypeText((SERVO::MaterialsType)r.materialType).c_str());
+		m_listCtrl.SetItemText(index, 6, SERVO::CServoUtilsTool::getGlassStateText((SERVO::GlsState)r.state).c_str());
+		m_listCtrl.SetItemText(index, 7, r.tStart.c_str());
+		m_listCtrl.SetItemText(index, 8, r.tEnd.c_str());
+		m_listCtrl.SetItemText(index, 9, r.buddyId.c_str());
+		m_listCtrl.SetItemText(index, 10, SERVO::CServoUtilsTool::getInspResultText((SERVO::InspResult)r.aoiResult).c_str());
+		m_listCtrl.SetItemText(index, 11, r.path.c_str());
+		m_listCtrl.SetItemText(index, 12, r.params.c_str());
+		m_listCtrl.SetItemColor(index, RGB(0, 0, 0), index % 2 == 0 ? RGB(255, 255, 255) : RGB(235, 235, 235));
 
 		// 娴嬭瘯鍙嶅簭鍒楀寲
 		/*
@@ -237,6 +244,42 @@
 
 	// 涓婁竴椤� / 涓嬩竴椤�
 	UpdatePageControls();
+}
+
+void CPageGlassList::UpdateWipData()
+{
+	if (m_nCurPage != 1) return;
+
+	// 鍙栧嚭缂撳瓨Glass, 绗﹀悎鏉′欢鍒欐樉绀猴紱
+	// 浣嗚鍒犻櫎鏃х殑鏁版嵁
+	std::vector<SERVO::CGlass*> wipGlasses;
+	theApp.m_model.m_master.getWipGlasses(wipGlasses);
+	std::vector<SERVO::CGlass*> tempGlasses = wipGlasses;
+	int count = m_listCtrl.GetItemCount();
+	if (count > 0) {
+		for (int i = count - 1; i >= 0; i--) {
+			SERVO::CGlass* pGlass = (SERVO::CGlass*)m_listCtrl.GetItemData(i);
+			if (eraseGlassInVector(pGlass, wipGlasses)
+				&& GlassMatchesFilters(*pGlass, m_filters)) {
+				// 鏇存柊
+				UpdateWipRow(i, pGlass);
+			}
+			else {
+				// 鍒犻櫎
+				m_listCtrl.DeleteItem(i);
+			}
+		}
+	}
+
+	// 鍓╀笅鐨勫绗﹀彿鎻掑叆
+	for (auto* item : wipGlasses) {
+		if (GlassMatchesFilters(*item, m_filters)) {
+			InsertWipRow(item);
+		}
+	}
+	for (auto* item : tempGlasses) {
+		item->release();
+	}
 }
 
 void CPageGlassList::UpdatePageControls()
@@ -256,6 +299,7 @@
 
 	// TODO:  鍦ㄦ娣诲姞棰濆鐨勫垵濮嬪寲
 	SetTimer(1, 3000, nullptr);
+	SetTimer(2, 2000, nullptr);
 
 	// 涓嬫媺妗嗘帶浠�
 	InitStatusCombo();
@@ -277,6 +321,7 @@
 	ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL);
 
 	CString headers[] = { 
+		_T(""),
 		_T("id"), 
 		_T("Cassette Sequence No"),
 		_T("Job Sequence No"),
@@ -290,11 +335,11 @@
 		_T("璺緞"),
 		_T("宸ヨ壓鍙傛暟") 
 	};
-	int widths[] = { 80, 80, 80, 100, 120, 120, 120, 120, 200, 200, 200, 200 };
+	int widths[] = { 0, 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.InsertColumn(i, headers[i], i == 0 ? LVCFMT_RIGHT : LVCFMT_LEFT, widths[i]);
 	}
 
 	Resize();
@@ -354,6 +399,11 @@
 		KillTimer(1);
 		InitRxWindow();
 	}
+
+	else if (nIDEvent == 2) {
+		UpdateWipData();
+	}
+
 	CDialogEx::OnTimer(nIDEvent);
 }
 
@@ -464,4 +514,72 @@
 		m_nCurPage++;
 		UpdatePageData();
 	}
+}
+
+// 鏍稿績锛歐IP 鐨� CGlass 鏄惁鍛戒腑褰撳墠 Filters
+// useEndTime=true 鏃剁敤 tEnd 鍒ゆ椂闂达紙姣斿鈥滃畬鎴愬垪琛ㄢ�濈敤 t_end锛夛紝榛樿鎸� tStart銆�
+bool CPageGlassList::GlassMatchesFilters(const SERVO::CGlass& g,
+	const GlassLogDb::Filters& f,
+	bool useEndTime/* = false*/)
+{
+	// 1) 绮剧‘瀛楁
+	if (f.classId && g.getID() != *f.classId)      return false;
+	if (f.cassetteSeqNo && g.getCassetteSequenceNo() != *f.cassetteSeqNo)return false;
+	if (f.jobSeqNo && g.getJobSequenceNo() != *f.jobSeqNo)     return false;
+
+	// 2) 鍏抽敭瀛楋紙涓� DB 淇濇寔涓�鑷达細class_id / buddy_id / path / params / pretty锛�
+	if (f.keyword) {
+		const std::string& kw = *f.keyword;
+		if (!(CToolUnits::containsCI(g.getID(), kw)
+			|| CToolUnits::containsCI(g.getBuddyId(), kw)
+			|| CToolUnits::containsCI(g.getPathDescription(), kw)
+			|| CToolUnits::containsCI(g.getParamsDescription(), kw)))
+			return false;
+	}
+
+	// 3) 鏃堕棿锛堜笌 DB 淇濇寔涓�鑷达細榛樿鎸� t_start 杩囨护锛涢渶瑕佸彲鍒囧埌 t_end锛�
+	if (f.tStartFrom || f.tStartTo) {
+		std::optional<std::chrono::system_clock::time_point> tp = useEndTime ? g.tEnd() : g.tStart();
+		// 绾﹀畾锛氳嫢娌℃湁瀵瑰簲鏃堕棿鎴筹紝鍒欒涓轰笉鍛戒腑锛堜笌 DB 鐩稿悓锛歂ULL 涓嶄細鍛戒腑鑼冨洿锛�
+		if (!tp) return false;
+		if (f.tStartFrom && *tp < *f.tStartFrom) return false;
+		if (f.tStartTo && *tp > *f.tStartTo)   return false;
+	}
+
+	return true;
+}
+
+void CPageGlassList::InsertWipRow(SERVO::CGlass* pGlass)
+{
+	int index = m_listCtrl.InsertItem(0, "");
+	m_listCtrl.SetItemColor(index, RGB(0, 0, 0), RGB(201, 228, 180));
+	UpdateWipRow(index, pGlass);
+}
+
+void CPageGlassList::UpdateWipRow(unsigned int index, SERVO::CGlass* pGlass)
+{
+	ASSERT(index < m_listCtrl.GetItemCount());
+	m_listCtrl.SetItemData(index, (DWORD_PTR)pGlass);
+	m_listCtrl.SetItemText(index, 2, std::to_string(pGlass->getCassetteSequenceNo()).c_str());
+	m_listCtrl.SetItemText(index, 3, std::to_string(pGlass->getJobSequenceNo()).c_str());
+	m_listCtrl.SetItemText(index, 4, pGlass->getID().c_str());
+	m_listCtrl.SetItemText(index, 5, SERVO::CServoUtilsTool::getMaterialsTypeText(pGlass->getType()).c_str());
+	m_listCtrl.SetItemText(index, 6, SERVO::CServoUtilsTool::getGlassStateText(pGlass->state()).c_str());
+	m_listCtrl.SetItemText(index, 7, CToolUnits::TimePointToLocalString(pGlass->tStart()).c_str());
+	m_listCtrl.SetItemText(index, 8, CToolUnits::TimePointToLocalString(pGlass->tEnd()).c_str());
+	m_listCtrl.SetItemText(index, 9, pGlass->getBuddyId().c_str());
+	m_listCtrl.SetItemText(index, 10, SERVO::CServoUtilsTool::getInspResultText((SERVO::InspResult)pGlass->getAOIInspResult()).c_str());
+	m_listCtrl.SetItemText(index, 11, pGlass->getPathDescription().c_str());
+	m_listCtrl.SetItemText(index, 12, pGlass->getParamsDescription().c_str());
+}
+
+bool CPageGlassList::eraseGlassInVector(SERVO::CGlass* pGlass, std::vector<SERVO::CGlass*>& glasses)
+{
+	auto iter = std::find(glasses.begin(), glasses.end(), pGlass);
+	if (iter != glasses.end()) {
+		glasses.erase(iter);
+		return true;
+	}
+
+	return false;
 }
\ No newline at end of file

--
Gitblit v1.9.3