张洋 22 hours ago
parent
commit
4126941ebb

+ 11 - 0
bin/Win32/Debug/zhipuzi_pos_windows/skin/aixuexi_page_fooditem.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Window>
+	<Font id="shangpin_price" name="微软雅黑" size="18" />
+	<Font id="1" name="微软雅黑" size="14" />
+	
+	<AIXuexiFoodItem name="aixuexi_page_fooditem" bkcolor="#FFFFFFFF" padding="0,0,5,5">
+		<Control name="image" height="130" bkimage="file='food_image_default.png'" padding="0,0,0,0"></Control>
+		<Label name="foodname" width="130" height="64" wordbreak="true" endellipsis="true"></Label>
+		<Label name="price" height="26" font="daindan_price" textcolor="#FFFF7F50" align="left"></Label>
+	</AIXuexiFoodItem>
+</Window>

+ 10 - 0
bin/Win32/Debug/zhipuzi_pos_windows/skin/aixuexi_page_fooditem_wutu.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Window>
+	<Font id="shangpin_price" name="微软雅黑" size="18" />
+	<Font id="1" name="微软雅黑" size="14" />
+	
+	<ShangpinFoodItem name="shangpin_fooditem" bkcolor="#FFFFFFFF" padding="0,0,5,5">
+		<Label name="foodname" width="130" height="64" wordbreak="true" endellipsis="true"></Label>
+		<Label name="price" height="26" font="daindan_price" textcolor="#FFFF7F50" align="left"></Label>
+	</ShangpinFoodItem>
+</Window>

+ 19 - 2
zhipuzi_pos_windows/ai/SQLiteVecManager.cpp

@@ -228,7 +228,7 @@ std::vector<std::pair<std::string, std::string>> SQLiteVecManager::GetFoodXueXiI
 {
 	std::vector<std::pair<std::string, std::string>> results;
 
-	std::string sql = "SELECT image_name, image_path FROM image_features WHERE food_id = ?;";
+	std::string sql = "SELECT image_name, image_path FROM image_features WHERE food_id = ? ORDER BY id ASC;";
 
 	sqlite3_stmt* stmt;
 		
@@ -254,4 +254,21 @@ std::vector<std::pair<std::string, std::string>> SQLiteVecManager::GetFoodXueXiI
 	sqlite3_finalize(stmt);
 
 	return results;
-}
+}
+
+bool SQLiteVecManager::DeleteFeatureVectorByImageName(const std::string& imageName)
+{
+	std::string sql = "DELETE FROM image_features WHERE image_name = ?;";
+	sqlite3_stmt* stmt;
+	int rc = sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, NULL);
+	if (rc != SQLITE_OK)
+	{
+		std::string err = sqlite3_errmsg(db);
+		std::cerr << "Failed to prepare statement: " << err << std::endl;
+		return false;
+	}
+	sqlite3_bind_text(stmt, 1, imageName.c_str(), -1, SQLITE_STATIC);
+	rc = sqlite3_step(stmt);
+	sqlite3_finalize(stmt);
+	return rc == SQLITE_DONE;
+}

+ 4 - 0
zhipuzi_pos_windows/ai/SQLiteVecManager.h

@@ -33,6 +33,10 @@ public:
 
 	//根据foodId获取这个商品已经学习过的图片信息,包含图片路径和图片名字
 	std::vector<std::pair<std::string, std::string>> GetFoodXueXiImageInfoByFoodId(const std::string& foodId);
+
+	//根据图片名字删除这个图片对应的向量
+	bool DeleteFeatureVectorByImageName(const std::string& imageName);
+
 private:
 	float distanceToSimilarity(float distance);
 };

+ 79 - 0
zhipuzi_pos_windows/control/CAIXuexiPageFoodItemUI.cpp

@@ -0,0 +1,79 @@
+#include "CAIXuexiPageFoodItemUI.h"
+
+#include "../pch/pch.h"
+
+CAIXuexiPageFoodItemUI::CAIXuexiPageFoodItemUI()
+{
+
+}
+
+
+CAIXuexiPageFoodItemUI::~CAIXuexiPageFoodItemUI()
+{
+}
+
+void CAIXuexiPageFoodItemUI::DoEvent(TEventUI& event)
+{
+	if (event.Type == UIEVENT_BUTTONUP)
+	{
+		m_pManager->SendNotify(this, DUI_MSGTYPE_CLICK);
+	}
+	else if (event.Type == UIEVENT_MOUSEENTER)
+	{
+		HCURSOR hcur = LoadCursor(NULL, IDC_HAND);  //加载系统自带鼠标样式
+		HWND hwnd = m_pManager->GetPaintWindow(); // 获取绘图窗口句柄
+		//SetClassLong(hwnd, GCL_HCURSOR, (long)hcur);
+	}
+	else if (event.Type == UIEVENT_MOUSELEAVE)
+	{
+		HCURSOR hcur = LoadCursor(NULL, IDC_ARROW);  //加载系统自带鼠标样式
+		HWND hwnd = m_pManager->GetPaintWindow(); // 获取绘图窗口句柄
+		//SetClassLong(hwnd, GCL_HCURSOR, (long)hcur);
+	}
+
+	CVerticalLayoutUI::DoEvent(event);
+}
+
+void CAIXuexiPageFoodItemUI::SetFoodInfo(CFood info)
+{
+	m_foodinfo = info;
+}
+
+CFood CAIXuexiPageFoodItemUI::GetFoodInfo()
+{
+	return m_foodinfo;
+}
+
+void CAIXuexiPageFoodItemUI::UpdateShow()
+{
+	if (m_is_youtu)
+	{
+		CControlUI* pImage = static_cast<CControlUI*>(this->FindSubControl(_T("image")));
+
+		//获取本地图片的路径
+		std::wstring imagepath = m_foodinfo.getImageTmpPath();
+		if (CSystem::IsFileExist(imagepath.c_str()))
+		{
+			//图片已经存在,直接显示
+			pImage->SetBkImage(imagepath.c_str());
+		}
+	}
+
+	CLabelUI* pName = static_cast<CLabelUI*>(this->FindSubControl(_T("foodname")));
+	pName->SetText(CLewaimaiString::UTF8ToUnicode(m_foodinfo.name).c_str());
+
+	CLabelUI* pPrice = static_cast<CLabelUI*>(this->FindSubControl(_T("price")));
+
+	std::wstring price = L"¥" + CLewaimaiString::UTF8ToUnicode(m_foodinfo.price);
+	if (m_foodinfo.is_nature == "1")
+	{
+		price += L"起";
+	}
+
+	pPrice->SetText(price.c_str());
+}
+
+void CAIXuexiPageFoodItemUI::SetYoutuModel(bool is_youtu)
+{
+	m_is_youtu = is_youtu;
+}

+ 34 - 0
zhipuzi_pos_windows/control/CAIXuexiPageFoodItemUI.h

@@ -0,0 +1,34 @@
+#pragma once
+
+#include "../pch/pch.h"
+
+#include "../zhipuzi/CFood.h"
+#include "../zhipuzi/CFoodpackage.h"
+
+
+/**
+ * 商品和商品套餐的ITEM,都用这个
+ */
+class CAIXuexiPageFoodItemUI : public CVerticalLayoutUI
+{
+public:
+	CAIXuexiPageFoodItemUI();
+	~CAIXuexiPageFoodItemUI();
+
+	void DoEvent(TEventUI& event);
+
+	void SetFoodInfo(CFood info);
+
+	CFood GetFoodInfo();
+
+	//刷新显示
+	void UpdateShow();
+
+	void SetYoutuModel(bool is_youtu);
+
+private:
+	CFood m_foodinfo;
+
+	//默认有图模式
+	bool m_is_youtu = true;
+};

+ 10 - 0
zhipuzi_pos_windows/control/CFoodXuexiImageItemUI.h

@@ -11,6 +11,16 @@ public:
 	void SetImageName(std::string imageName);
 	void SetImagePath(std::string imagePath);
 
+	std::string GetImageName()
+	{
+		return m_imageName;
+	}
+
+	std::string GetImagePath()
+	{
+		return m_imagePath;
+	}
+
 private:
 	std::string m_imageName;
 	std::string m_imagePath;

+ 5 - 0
zhipuzi_pos_windows/control/ControlEx.h

@@ -38,6 +38,7 @@
 #include "CZhengcanOrderItemUI.h"
 #include "CShoukuanOrderItemUI.h"
 #include "CFoodXuexiImageItemUI.h"
+#include "CAIXuexiPageFoodItemUI.h"
 
 class CDialogBuilderCallbackEx : public IDialogBuilderCallback
 {
@@ -187,6 +188,10 @@ public:
 		{
 			return new CFoodXuexiImageItemUI;
 		}
+		else if (_tcscmp(pstrClass, _T("AIXuexiFoodItem")) == 0)
+		{
+			return new CAIXuexiPageFoodItemUI;
+		}
 
 		return NULL;
 	}

+ 25 - 8
zhipuzi_pos_windows/page/CAIxuexiPageUI.cpp

@@ -46,10 +46,15 @@ void CAIxuexiPageUI::InitShow()
 
 	//重新进来的时候,重置当前选中的分类和商品
 	m_cur_click_food_item = NULL;
+
 	CLabelUI* pLabel = static_cast<CLabelUI*>(this->FindSubControl(_T("aixuexi_page_xuanzhong_food_name")));
 	std::wstring wsShow = L"当前选中商品:无";
 	pLabel->SetText(wsShow.c_str());
 
+	//先把之前的显示清空
+	CTileLayoutUI* pXuexiScrollLayout = static_cast<CTileLayoutUI*>(this->FindSubControl(_T("aixuexi_page_food_xuexi_image_layout")));
+	pXuexiScrollLayout->RemoveAll();
+
 	//先初始化商品分类
 	this->InitFoodtypeShow();
 
@@ -237,7 +242,7 @@ void CAIxuexiPageUI::InitFoodShow()
 		itemsize.cy = 220;
 		m_foodLayout->SetItemSize(itemsize);
 
-		xml_name = _T("shangpin_fooditem.xml");
+		xml_name = _T("aixuexi_page_fooditem.xml");
 	}
 	else
 	{
@@ -246,7 +251,7 @@ void CAIxuexiPageUI::InitFoodShow()
 		itemsize.cy = 90;
 		m_foodLayout->SetItemSize(itemsize);
 
-		xml_name = _T("shangpin_fooditem_wutu.xml");
+		xml_name = _T("aixuexi_page_fooditem_wutu.xml");
 	}
 
 	//如果当前一个分类都没有,那么就不处理了
@@ -269,7 +274,7 @@ void CAIxuexiPageUI::InitFoodShow()
 				CDialogBuilder builder;
 				CDialogBuilderCallbackEx cb;
 
-				CShangpinFoodItemUI* pItem = static_cast<CShangpinFoodItemUI*>(builder.Create(xml_name.c_str(), (UINT)0, &cb, m_pManager));
+				CAIXuexiPageFoodItemUI* pItem = static_cast<CAIXuexiPageFoodItemUI*>(builder.Create(xml_name.c_str(), (UINT)0, &cb, m_pManager));
 
 				pItem->SetYoutuModel(is_youtu);
 				pItem->SetFoodInfo(food);
@@ -291,7 +296,7 @@ void CAIxuexiPageUI::InitFoodShow()
 				CDialogBuilder builder;
 				CDialogBuilderCallbackEx cb;
 
-				CShangpinFoodItemUI* pItem = static_cast<CShangpinFoodItemUI*>(builder.Create(xml_name.c_str(), (UINT)0, &cb, m_pManager));
+				CAIXuexiPageFoodItemUI* pItem = static_cast<CAIXuexiPageFoodItemUI*>(builder.Create(xml_name.c_str(), (UINT)0, &cb, m_pManager));
 
 				pItem->SetYoutuModel(is_youtu);
 				pItem->SetFoodInfo(food);
@@ -314,7 +319,7 @@ void CAIxuexiPageUI::InitFoodShow()
 			CDialogBuilder builder;
 			CDialogBuilderCallbackEx cb;
 
-			CShangpinFoodItemUI* pItem = static_cast<CShangpinFoodItemUI*>(builder.Create(xml_name.c_str(), (UINT)0, &cb, m_pManager));
+			CAIXuexiPageFoodItemUI* pItem = static_cast<CAIXuexiPageFoodItemUI*>(builder.Create(xml_name.c_str(), (UINT)0, &cb, m_pManager));
 
 			pItem->SetYoutuModel(is_youtu);
 			pItem->SetFoodInfo(food);
@@ -330,9 +335,9 @@ void CAIxuexiPageUI::HandleClickMsg(TNotifyUI& msg)
 {
 	CDuiString name = msg.pSender->GetName();
 
-	if (name == L"shangpin_fooditem")
+	if (name == L"aixuexi_page_fooditem")
 	{
-		CShangpinFoodItemUI* fooditemUI = static_cast<CShangpinFoodItemUI*>(msg.pSender);
+		CAIXuexiPageFoodItemUI* fooditemUI = static_cast<CAIXuexiPageFoodItemUI*>(msg.pSender);
 
 		m_cur_click_food_item = fooditemUI;
 
@@ -349,8 +354,20 @@ void CAIxuexiPageUI::HandleClickMsg(TNotifyUI& msg)
 	{
 		this->DoXuexi();
 	}
-}
+	else if (name == L"aixuexi_page_food_image_delete")
+	{
+		CFoodXuexiImageItemUI* m_pImageItem = static_cast<CFoodXuexiImageItemUI*>(msg.pSender->GetParent());
+
+		//先删除图片控件
+		CTileLayoutUI* pXuexiScrollLayout = static_cast<CTileLayoutUI*>(this->FindSubControl(_T("aixuexi_page_food_xuexi_image_layout")));
+		pXuexiScrollLayout->Remove(m_pImageItem);
+
+		//然后从数据库中删除这个图片对应的向量
+		std::string imageName = m_pImageItem->GetImageName();
 
+		SQLiteVecManager::GetInstance()->DeleteFeatureVectorByImageName(imageName);
+	}
+}
 
 void CAIxuexiPageUI::HandleSelectChangeMsg(TNotifyUI& msg)
 {

+ 2 - 2
zhipuzi_pos_windows/page/CAIxuexiPageUI.h

@@ -9,7 +9,7 @@
 #include "../zhipuzi/CFoodtype.h"
 #include "../zhipuzi/CFoodpackage.h"
 
-#include "../control/CShangpinFoodItemUI.h"
+#include "../control/CAIXuexiPageFoodItemUI.h"
 
 class CAIxuexiPageUI : public CBasePageUI
 {
@@ -89,7 +89,7 @@ private:
 	std::string m_sousuo_foodname;
 
 	//当前点击的哪个商品
-	CShangpinFoodItemUI* m_cur_click_food_item;
+	CAIXuexiPageFoodItemUI* m_cur_click_food_item;
 
 	//当前控件的实际宽度
 	int m_nPageWidth;

+ 2 - 0
zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj

@@ -244,6 +244,7 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     <ClInclude Include="ai\SQLiteVecManager.h" />
     <ClInclude Include="ai\YoloClassName.h" />
     <ClInclude Include="ai\YoloFeatureManager.h" />
+    <ClInclude Include="control\CAIXuexiPageFoodItemUI.h" />
     <ClInclude Include="control\CFoodXuexiImageItemUI.h" />
     <ClInclude Include="wnd\CVirtualKeyboardWnd.h" />
     <ClInclude Include="page\CAIxuexiPageUI.h" />
@@ -378,6 +379,7 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     <ClCompile Include="ai\test.cpp" />
     <ClCompile Include="ai\test.h" />
     <ClCompile Include="ai\YoloFeatureManager.cpp" />
+    <ClCompile Include="control\CAIXuexiPageFoodItemUI.cpp" />
     <ClCompile Include="control\CFoodXuexiImageItemUI.cpp" />
     <ClCompile Include="wnd\CVirtualKeyboardWnd.cpp" />
     <ClCompile Include="page\CAIxuexiPageUI.cpp" />

+ 6 - 0
zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj.filters

@@ -408,6 +408,9 @@
     <ClInclude Include="control\CFoodXuexiImageItemUI.h">
       <Filter>头文件</Filter>
     </ClInclude>
+    <ClInclude Include="control\CAIXuexiPageFoodItemUI.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="pch\pch.cpp">
@@ -776,6 +779,9 @@
     <ClCompile Include="control\CFoodXuexiImageItemUI.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
+    <ClCompile Include="control\CAIXuexiPageFoodItemUI.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <Image Include="resource\zhipuzi.ico">