张洋 hace 1 mes
padre
commit
e1b0bc8cd7
Se han modificado 38 ficheros con 477 adiciones y 582 borrados
  1. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/dingwei_bkg.png
  2. 1 1
      zhipuzi_pos_windows/ai/YoloFeatureManager.cpp
  3. 2 2
      zhipuzi_pos_windows/helper/readme.txt
  4. 24 16
      zhipuzi_pos_windows/page/CAIxuexiPageUI.cpp
  5. 3 2
      zhipuzi_pos_windows/page/CAIxuexiPageUI.h
  6. 5 3
      zhipuzi_pos_windows/page/CSettingPageUI.cpp
  7. 0 1
      zhipuzi_pos_windows/page/CSettingPageUI.h
  8. 1 1
      zhipuzi_pos_windows/page/CShangpinUpdatePageUI.cpp
  9. 0 0
      zhipuzi_pos_windows/pch/define.h
  10. 8 4
      zhipuzi_pos_windows/pch/pch.h
  11. 48 46
      zhipuzi_pos_windows/print/CPosPrinter.cpp
  12. 20 24
      zhipuzi_pos_windows/print/CPosPrinter.h
  13. 0 1
      zhipuzi_pos_windows/print/CPosPrinterData.h
  14. 34 37
      zhipuzi_pos_windows/tool/CAppEnv.cpp
  15. 5 2
      zhipuzi_pos_windows/tool/CAppEnv.h
  16. 9 9
      zhipuzi_pos_windows/tool/CFoodHandle.cpp
  17. 6 7
      zhipuzi_pos_windows/tool/CFoodHandle.h
  18. 0 2
      zhipuzi_pos_windows/tool/CSqlite3.cpp
  19. 14 16
      zhipuzi_pos_windows/tool/CSqlite3.h
  20. 129 0
      zhipuzi_pos_windows/tool/CVideoCapture.cpp
  21. 33 0
      zhipuzi_pos_windows/tool/CVideoCapture.h
  22. 4 0
      zhipuzi_pos_windows/wnd/CMainWnd.cpp
  23. 4 12
      zhipuzi_pos_windows/worker/CChengzhongWorker.cpp
  24. 2 2
      zhipuzi_pos_windows/worker/CChengzhongWorker.h
  25. 14 21
      zhipuzi_pos_windows/worker/CCommonWorker.cpp
  26. 8 16
      zhipuzi_pos_windows/worker/CCommonWorker.h
  27. 4 4
      zhipuzi_pos_windows/worker/CDiandanAIShibieWorker.cpp
  28. 2 2
      zhipuzi_pos_windows/worker/CDiandanAIShibieWorker.h
  29. 5 15
      zhipuzi_pos_windows/worker/CMqttClientWorker.cpp
  30. 0 6
      zhipuzi_pos_windows/worker/CMqttClientWorker.h
  31. 30 63
      zhipuzi_pos_windows/worker/CPosPrinterWorker.cpp
  32. 25 32
      zhipuzi_pos_windows/worker/CPosPrinterWorker.h
  33. 0 143
      zhipuzi_pos_windows/worker/CVideoCaptureWorker.cpp
  34. 0 36
      zhipuzi_pos_windows/worker/CVideoCaptureWorker.h
  35. 16 27
      zhipuzi_pos_windows/worker/CVoiceWorker.cpp
  36. 11 19
      zhipuzi_pos_windows/worker/CVoiceWorker.h
  37. 5 5
      zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj
  38. 5 5
      zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj.filters

BIN
bin/Win32/Debug/zhipuzi_pos_windows/skin/dingwei_bkg.png


+ 1 - 1
zhipuzi_pos_windows/ai/YoloFeatureManager.cpp

@@ -8,7 +8,7 @@
 #include <numeric>
 #include <sstream>
 
-#include "../worker/CVideoCaptureWorker.h"
+#include "../tool/CVideoCapture.h"
 
 #include "YoloClassName.h"
 

+ 2 - 2
zhipuzi_pos_windows/helper/readme.txt

@@ -1,3 +1,3 @@
-helper目录下,主要处理一些与业务逻辑无关的辅助类封装
+helper目录下,主要处理一些与业务逻辑无关的辅助类封装
 
-与业务逻辑有关的不要放这里
+与业务逻辑有关的不要放这里

+ 24 - 16
zhipuzi_pos_windows/page/CAIxuexiPageUI.cpp

@@ -3,7 +3,7 @@
 #include "../control/ControlEx.h"
 
 #include "../wnd/CMainWnd.h"
-#include "../worker/CVideoCaptureWorker.h"
+#include "../tool/CVideoCapture.h"
 
 #include "../tool/CSqlite3.h"
 
@@ -17,6 +17,8 @@
 
 #include "../worker/CDiandanAIShibieWorker.h"
 
+#include "../tool/CAppEnv.h"
+
 CAIxuexiPageUI::CAIxuexiPageUI()
 {
 	m_hBitmap = NULL;
@@ -43,13 +45,12 @@ void CAIxuexiPageUI::InitControl()
 }
 
 void CAIxuexiPageUI::InitShow()
-{
-	if (m_isFirstInit)
-	{
-		m_isFirstInit = false;
-		
-		std::thread(&CAIxuexiPageUI::HandleUpdateVideo, this).detach();
-	}	
+{		
+	//每次进入该页面,就启动一个线程来处理摄像头读取,退出这个页面的时候这个线程会自动结束
+	m_is_video_thread_run = true;
+
+	std::thread(&CAIxuexiPageUI::HandleUpdateVideo, this).detach();
+	CAppEnv::GetInstance()->AddWorkerNum();
 
 	//重新进来的时候,重置当前选中的分类和商品
 	m_cur_click_food_item = NULL;
@@ -464,20 +465,20 @@ bool CAIxuexiPageUI::HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam
 
 void CAIxuexiPageUI::HandleUpdateVideo()
 {
-	while (true)
+	while (m_is_video_thread_run == true)
 	{
 		if (m_pMainWnd->GetCurPageName() != CMainWnd::AIXUEXI)
 		{
-			Sleep(30);
-			continue;
+			//如果不是在AI学习页面,这个线程直接结束
+			break;
 		}
 
 		cv::Mat img;
-		CVideoCaptureWorker::GetInstance()->GetFrame(img);
-
+		CVideoCapture::GetInstance()->GetFrame(img);
 		if (img.empty())
 		{
-			Sleep(30);
+			//摄像头有问题,等待一会再重新读取
+			Sleep(1000);
 			continue;
 		}
 
@@ -508,11 +509,14 @@ void CAIxuexiPageUI::HandleUpdateVideo()
 		m_hBitmap = CreateDIBitmap(hDC, &bmi.bmiHeader, CBM_INIT, img.data, &bmi, DIB_RGB_COLORS);
 		ReleaseDC(NULL, hDC);
 
+		//位图已经生成好,发送消息进行刷新显示
 		::PostMessage(m_pMainWnd->GetHWND(), WM_AI_XUEXI_UPDATE, 0, 0);
 
 		// 控制帧率,避免过度占用 CPU,30 FPS 大约是每 33 毫秒更新一次
 		Sleep(1000 / 30);
 	}
+
+	CAppEnv::GetInstance()->DelWorkerNum();
 }
 
 void CAIxuexiPageUI::UpdateVideoShow()
@@ -634,8 +638,7 @@ void CAIxuexiPageUI::DoXuexi()
 	std::string s_file_save_path = CLewaimaiString::UnicodeToUTF8(file_save_path);
 
 	cv::Mat img;
-	CVideoCaptureWorker::GetInstance()->GetFrame(img);
-
+	CVideoCapture::GetInstance()->GetFrame(img);
 	if (img.empty())
 	{
 		return;
@@ -674,4 +677,9 @@ void CAIxuexiPageUI::DoXuexi()
 	pItem->SetImagePath(imagePath);
 
 	pXuexiScrollLayout->Add(pItem);
+}
+
+void CAIxuexiPageUI::StopVideoThread()
+{
+	m_is_video_thread_run = false;
 }

+ 3 - 2
zhipuzi_pos_windows/page/CAIxuexiPageUI.h

@@ -71,9 +71,10 @@ public:
 	//点击拍摄并学习按钮之后的处理逻辑
 	void DoXuexi();
 
-private:
-	bool m_isFirstInit = true;
+	void StopVideoThread();
 
+private:
+	bool m_is_video_thread_run = false;
 	HBITMAP m_hBitmap;
 	HDC m_hMemDC;
 

+ 5 - 3
zhipuzi_pos_windows/page/CSettingPageUI.cpp

@@ -5,8 +5,10 @@
 
 #include "../print/CPosPrinter.h"
 #include "../helper/CComHelper.h"
+
 #include "../worker/CChengzhongWorker.h"
 #include "../worker/CDiandanAIShibieWorker.h"
+#include "../worker/CPosPrinterWorker.h"
 
 #include <boost/array.hpp>
 
@@ -226,7 +228,7 @@ void CSettingPageUI::InitControl()
 		std::string setting_printer_usb = CSetting::GetInstance()->GetParam("setting_printer_usb");
 		std::wstring ws_setting_printer_usb = CLewaimaiString::UTF8ToUnicode(setting_printer_usb);
 
-		std::vector<std::wstring> usb_devices = CPosPrinterQueue::GetInstance()->getUsbDevices();
+		std::vector<std::wstring> usb_devices = CPosPrinterWorker::GetInstance()->getUsbDevices();
 
 		int i = 0;
 		int nSelect = -1;
@@ -678,7 +680,7 @@ void CSettingPageUI::InitControl()
 	std::string setting_biaoqian_printer_usb = CSetting::GetInstance()->GetParam("setting_biaoqian_printer_usb");
 	std::wstring ws_setting_biaoqian_printer_usb = CLewaimaiString::UTF8ToUnicode(setting_biaoqian_printer_usb);
 
-	std::vector<std::wstring> usb_devices = CPosPrinterQueue::GetInstance()->getUsbDevices();
+	std::vector<std::wstring> usb_devices = CPosPrinterWorker::GetInstance()->getUsbDevices();
 
 	i = 0;
 	nSelect = -1;
@@ -1869,7 +1871,7 @@ void CSettingPageUI::HandleItemSelectMsg(TNotifyUI& msg)
 			std::string setting_printer_usb = CSetting::GetInstance()->GetParam("setting_printer_usb");
 			std::wstring ws_setting_printer_usb = CLewaimaiString::UTF8ToUnicode(setting_printer_usb);
 
-			std::vector<std::wstring> usb_devices = CPosPrinterQueue::GetInstance()->getUsbDevices();
+			std::vector<std::wstring> usb_devices = CPosPrinterWorker::GetInstance()->getUsbDevices();
 
 			int i = 0;
 			int nSelect = -1;

+ 0 - 1
zhipuzi_pos_windows/page/CSettingPageUI.h

@@ -1,6 +1,5 @@
 #pragma once
 
-#include "../pch/pch.h"
 #include "CBasePageUI.h"
 
 class CSettingPageUI : public CBasePageUI

+ 1 - 1
zhipuzi_pos_windows/page/CShangpinUpdatePageUI.cpp

@@ -826,7 +826,7 @@ void CShangpinUpdatePageUI::HandleDelete()
 	}
 
 	//本地数据库删除这个商品
-	CFoodHandle::GetInstance()->DeleteOndeFood(m_foodinfo.id);
+	CFoodHandle::GetInstance()->DeleteOneFood(m_foodinfo.id);
 
 	PostMessage(m_pManager->GetPaintWindow(), WM_FOOD_HANDLE_SUCCESS, 0, 0);
 }

+ 0 - 0
zhipuzi_pos_windows/helper/define.h → zhipuzi_pos_windows/pch/define.h


+ 8 - 4
zhipuzi_pos_windows/pch/pch.h

@@ -40,13 +40,16 @@
 #include <setupapi.h>
 #include <winuser.h>
 
-//gdi+
-#include <gdiplus.h>
-using namespace Gdiplus;
+//消息定义宏
+#include "define.h"
 
 //资源文件
 #include "../resource/resource.h"
 
+//gdi+
+#include <gdiplus.h>
+using namespace Gdiplus;
+
 //UI库
 #include <../../DuiLib/UIlib.h>
 using namespace DuiLib;
@@ -60,7 +63,6 @@ using namespace DuiLib;
 using namespace rapidjson;
 
 //自己写的辅助函数
-#include "../helper/define.h"
 #include "../helper/CRandomHelper.h"
 #include "../helper/CSystem.h"
 #include "../helper/CLewaimaiString.h"
@@ -68,8 +70,10 @@ using namespace rapidjson;
 #include "../helper/CLewaimaiLog.h"
 #include "../helper/CLewaimaiTime.h"
 
+//业务相关的工具类函数
 #include "../tool/CSetting.h"
 
+//网络相关的工具类函数
 #include "../network/CZhipuziHttpClient.h"
 
 #endif //PCH_H

+ 48 - 46
zhipuzi_pos_windows/print/CPosPrinter.cpp

@@ -1,6 +1,8 @@
-#include "../pch/pch.h"
+锘�#include "../pch/pch.h"
 #include "CPosPrinter.h"
 
+#include "../worker/CPosPrinterWorker.h"
+
 CPosPrinter::CPosPrinter()
 {
 }
@@ -10,39 +12,39 @@ CPosPrinter::~CPosPrinter()
 {
 }
 
-//完成所有打印一个外卖订单的操作
+//瀹屾垚鎵€鏈夋墦鍗颁竴涓��鍗栬�鍗曠殑鎿嶄綔
 void CPosPrinter::PrintWaimaiOrder(CWaimaiOrder& order)
 {
 	if (CSetting::GetInstance()->GetParam("setting_is_new_waimai_printer") == "1")
 	{
-		//执行收银小票打印操作
+		//鎵ц�鏀堕摱灏忕エ鎵撳嵃鎿嶄綔
 		CPosPrinterData printData;
 		
 		std::string data = printData.PrintWaimaiOrderShouyin(order);
 
 		if (data.length() > 0)
 		{
-			CPosPrinterQueue::GetInstance()->AddShouyinPrinter(data);
+			CPosPrinterWorker::GetInstance()->AddShouyinPrinter(data);
 		}
 	}
 
 	if (CSetting::GetInstance()->GetParam("setting_is_new_waimai_biaoqian_printer") == "1")
 	{
-		//执行标签小票打印操作
+		//鎵ц�鏍囩�灏忕エ鎵撳嵃鎿嶄綔
 		CPosPrinterData printData;
 
 		std::string data = printData.PrintWaimaiOrderBiaoqian(order);
 
 		if (data.length() > 0)
 		{
-			CPosPrinterQueue::GetInstance()->AddBiaoqianPrinter(data);
+			CPosPrinterWorker::GetInstance()->AddBiaoqianPrinter(data);
 		}
 	}
 
-	//判断是否进行自动的厨房打印
+	//鍒ゆ柇鏄�惁杩涜�鑷�姩鐨勫帹鎴挎墦鍗�
 	if (CSetting::GetInstance()->GetParam("setting_is_new_waimai_chufang_printer") == "1")
 	{
-		//进行厨房打印
+		//杩涜�鍘ㄦ埧鎵撳嵃
 		CPosPrinterData printData;
 
 		std::vector<ChufangPrinterContent> datas = printData.PrintWaimaiOrderChufang(order);
@@ -55,7 +57,7 @@ void CPosPrinter::PrintWaimaiOrder(CWaimaiOrder& order)
 
 				if (content.data.length() > 0)
 				{
-					CPosPrinterQueue::GetInstance()->AddChufangPrinter(content);
+					CPosPrinterWorker::GetInstance()->AddChufangPrinter(content);
 				}
 			}
 		}
@@ -71,39 +73,39 @@ void CPosPrinter::PrintWaimaiOrder(std::string order_id, std::string order_no)
 	PrintWaimaiOrder(order);
 }
 
-//完成所有打印一个点单订单的操作
+//瀹屾垚鎵€鏈夋墦鍗颁竴涓�偣鍗曡�鍗曠殑鎿嶄綔
 void CPosPrinter::PrintDiandanOrder(CDiandanOrder& order)
 {
 	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_printer") == "1")
 	{
-		//执行收银小票打印操作
+		//鎵ц�鏀堕摱灏忕エ鎵撳嵃鎿嶄綔
 		CPosPrinterData printData;
 
 		std::string data = printData.PrintDiandanOrderShouyin(order);
 
 		if (data.length() > 0)
 		{
-			CPosPrinterQueue::GetInstance()->AddShouyinPrinter(data);
+			CPosPrinterWorker::GetInstance()->AddShouyinPrinter(data);
 		}
 	}
 
 	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_biaoqian_printer") == "1")
 	{
-		//执行标签小票打印操作
+		//鎵ц�鏍囩�灏忕エ鎵撳嵃鎿嶄綔
 		CPosPrinterData printData;
 
 		std::string data = printData.PrintDiandanOrderBiaoqian(order);
 
 		if (data.length() > 0)
 		{
-			CPosPrinterQueue::GetInstance()->AddBiaoqianPrinter(data);
+			CPosPrinterWorker::GetInstance()->AddBiaoqianPrinter(data);
 		}
 	}
 
-	//判断是否进行自动的厨房打印
+	//鍒ゆ柇鏄�惁杩涜�鑷�姩鐨勫帹鎴挎墦鍗�
 	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_chufang_printer") == "1")
 	{
-		//进行厨房打印
+		//杩涜�鍘ㄦ埧鎵撳嵃
 		CPosPrinterData printData;
 
 		std::vector<ChufangPrinterContent> datas = printData.PrintDiandanOrderChufang(order);
@@ -116,7 +118,7 @@ void CPosPrinter::PrintDiandanOrder(CDiandanOrder& order)
 
 				if (content.data.length() > 0)
 				{
-					CPosPrinterQueue::GetInstance()->AddChufangPrinter(content);
+					CPosPrinterWorker::GetInstance()->AddChufangPrinter(content);
 				}
 			}
 		}
@@ -132,39 +134,39 @@ void CPosPrinter::PrintDiandanOrder(std::string order_id)
 	PrintDiandanOrder(order);
 }
 
-//完成所有打印一个正餐订单的操作(不等待,立即返回)
+//瀹屾垚鎵€鏈夋墦鍗颁竴涓��椁愯�鍗曠殑鎿嶄綔锛堜笉绛夊緟锛岀珛鍗宠繑鍥烇級
 void CPosPrinter::PrintZhengcanOrderXiadan(CZhengcanOrder& order)
 {
 	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_printer") == "1")
 	{
-		//执行收银小票打印操作
+		//鎵ц�鏀堕摱灏忕エ鎵撳嵃鎿嶄綔
 		CPosPrinterData printData;
 
 		std::string data = printData.PrintZhengcanOrderXiadanShouyin(order);
 
 		if (data.length() > 0)
 		{
-			CPosPrinterQueue::GetInstance()->AddShouyinPrinter(data);
+			CPosPrinterWorker::GetInstance()->AddShouyinPrinter(data);
 		}
 	}
 
 	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_biaoqian_printer") == "1")
 	{
-		//执行标签小票打印操作
+		//鎵ц�鏍囩�灏忕エ鎵撳嵃鎿嶄綔
 		CPosPrinterData printData;
 
 		std::string data = printData.PrintZhengcanOrderXiadanBiaoqian(order);
 
 		if (data.length() > 0)
 		{
-			CPosPrinterQueue::GetInstance()->AddBiaoqianPrinter(data);
+			CPosPrinterWorker::GetInstance()->AddBiaoqianPrinter(data);
 		}
 	}
 
-	//判断是否进行自动的厨房打印
+	//鍒ゆ柇鏄�惁杩涜�鑷�姩鐨勫帹鎴挎墦鍗�
 	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_chufang_printer") == "1")
 	{
-		//进行厨房打印
+		//杩涜�鍘ㄦ埧鎵撳嵃
 		CPosPrinterData printData;
 
 		std::vector<ChufangPrinterContent> datas = printData.PrintZhengcanOrderXiadanChufang(order);
@@ -177,7 +179,7 @@ void CPosPrinter::PrintZhengcanOrderXiadan(CZhengcanOrder& order)
 
 				if (content.data.length() > 0)
 				{
-					CPosPrinterQueue::GetInstance()->AddChufangPrinter(content);
+					CPosPrinterWorker::GetInstance()->AddChufangPrinter(content);
 				}
 			}
 		}
@@ -190,7 +192,7 @@ void CPosPrinter::PrintZhengcanOrderXiadan(std::string order_id, std::string jia
 
 	bool ret = order.InitData(order_id);
 
-	//需要先对order中的itemprint进行处理
+	//闇€瑕佸厛瀵筼rder涓�殑itemprint杩涜�澶勭悊
 	order.UpdateItemPrintForJiacai(jiacai_no);
 
 	PrintZhengcanOrderXiadan(order);
@@ -198,10 +200,10 @@ void CPosPrinter::PrintZhengcanOrderXiadan(std::string order_id, std::string jia
 
 void CPosPrinter::PrintZhengcanOrderTuicai(CZhengcanOrder& order)
 {
-	//判断是否进行自动的厨房打印(退菜只打印厨房小票,不打印收银小票)
+	//鍒ゆ柇鏄�惁杩涜�鑷�姩鐨勫帹鎴挎墦鍗帮紙閫€鑿滃彧鎵撳嵃鍘ㄦ埧灏忕エ锛屼笉鎵撳嵃鏀堕摱灏忕エ锛�
 	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_chufang_printer") == "1")
 	{
-		//进行厨房打印
+		//杩涜�鍘ㄦ埧鎵撳嵃
 		CPosPrinterData printData;
 
 		std::vector<ChufangPrinterContent> datas = printData.PrintZhengcanOrderTuicaiChufang(order);
@@ -214,7 +216,7 @@ void CPosPrinter::PrintZhengcanOrderTuicai(CZhengcanOrder& order)
 
 				if (content.data.length() > 0)
 				{
-					CPosPrinterQueue::GetInstance()->AddChufangPrinter(content);
+					CPosPrinterWorker::GetInstance()->AddChufangPrinter(content);
 				}
 			}
 		}
@@ -227,7 +229,7 @@ void CPosPrinter::PrintZhengcanOrderTuicai(std::string order_id, std::string tui
 
 	bool ret = order.InitData(order_id);
 
-	//需要先对order中的itemprint进行处理
+	//闇€瑕佸厛瀵筼rder涓�殑itemprint杩涜�澶勭悊
 	order.UpdateItemPrintForTuicai(tuicai_item_id);
 
 	PrintZhengcanOrderTuicai(order);
@@ -237,31 +239,31 @@ void CPosPrinter::PrintZhengcanOrderYulan(CZhengcanOrder& order)
 {
 	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_printer") == "1")
 	{
-		//执行收银小票打印操作
+		//鎵ц�鏀堕摱灏忕エ鎵撳嵃鎿嶄綔
 		CPosPrinterData printData;
 
 		std::string data = printData.PrintZhengcanOrderYulanShouyin(order);
 
 		if (data.length() > 0)
 		{
-			CPosPrinterQueue::GetInstance()->AddShouyinPrinter(data);
+			CPosPrinterWorker::GetInstance()->AddShouyinPrinter(data);
 		}
 	}
 }
 
-//完成所有打印一个正餐结算的打印操作(不等待,立即返回)
+//瀹屾垚鎵€鏈夋墦鍗颁竴涓��椁愮粨绠楃殑鎵撳嵃鎿嶄綔锛堜笉绛夊緟锛岀珛鍗宠繑鍥烇級
 void CPosPrinter::PrintZhengcanOrderJiesuan(CZhengcanOrder& order)
 {
 	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_printer") == "1")
 	{
-		//执行收银小票打印操作
+		//鎵ц�鏀堕摱灏忕エ鎵撳嵃鎿嶄綔
 		CPosPrinterData printData;
 
 		std::string data = printData.PrintZhengcanOrderJiesuanShouyin(order);
 
 		if (data.length() > 0)
 		{
-			CPosPrinterQueue::GetInstance()->AddShouyinPrinter(data);
+			CPosPrinterWorker::GetInstance()->AddShouyinPrinter(data);
 		}
 	}
 }
@@ -277,24 +279,24 @@ void CPosPrinter::PrintZhengcanOrderJiesuan(std::string order_id)
 	PrintZhengcanOrderJiesuan(order);
 }
 
-//完成所有打印一个快速收银订单的操作(不等待,立即返回)
+//瀹屾垚鎵€鏈夋墦鍗颁竴涓�揩閫熸敹閾惰�鍗曠殑鎿嶄綔锛堜笉绛夊緟锛岀珛鍗宠繑鍥烇級
 void CPosPrinter::PrintShoukuanOrder(CShoukuanOrder& order)
 {
 	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_printer") == "1")
 	{
-		//执行收银小票打印操作
+		//鎵ц�鏀堕摱灏忕エ鎵撳嵃鎿嶄綔
 		CPosPrinterData printData;
 
 		std::string data = printData.PrintShoukuanOrderShouyin(order);
 
 		if (data.length() > 0)
 		{
-			CPosPrinterQueue::GetInstance()->AddShouyinPrinter(data);
+			CPosPrinterWorker::GetInstance()->AddShouyinPrinter(data);
 		}
 	}
 }
 
-//通过订单号打印订单,后面要改成异步才行
+//閫氳繃璁㈠崟鍙锋墦鍗拌�鍗曪紝鍚庨潰瑕佹敼鎴愬紓姝ユ墠琛�
 void CPosPrinter::PrintShoukuanOrder(std::string order_id)
 {
 	CShoukuanOrder order;
@@ -310,7 +312,7 @@ void CPosPrinter::PirntJiaobanOrder(CJiaobaoOrder& order)
 
 	std::string data = printData.PrintJiaobanOrder(order);
 
-	CPosPrinterQueue::GetInstance()->AddShouyinPrinter(data);
+	CPosPrinterWorker::GetInstance()->AddShouyinPrinter(data);
 }
 
 void CPosPrinter::PrintHuiyuanchongzhiOrder(CHuiyuanchongzhiOrder& order)
@@ -319,7 +321,7 @@ void CPosPrinter::PrintHuiyuanchongzhiOrder(CHuiyuanchongzhiOrder& order)
 
 	std::string data = printData.PrintHuiyuanchongzhiOrder(order);
 
-	CPosPrinterQueue::GetInstance()->AddShouyinPrinter(data);
+	CPosPrinterWorker::GetInstance()->AddShouyinPrinter(data);
 }
 
 void CPosPrinter::PrintShangpinTiaoma(CFood foodinfo)
@@ -328,21 +330,21 @@ void CPosPrinter::PrintShangpinTiaoma(CFood foodinfo)
 
 	std::string data = printData.PrintShangpintiaomaBiaoqian(foodinfo);
 
-	CPosPrinterQueue::GetInstance()->AddBiaoqianPrinter(data);
+	CPosPrinterWorker::GetInstance()->AddBiaoqianPrinter(data);
 }
 
-//打开钱箱
+//鎵撳紑閽辩�
 void CPosPrinter::OpenQianxiang()
 {
 	CPosPrinterData printData;
 
 	std::string data = printData.GetQianxiangCommand();
 
-	CPosPrinterQueue::GetInstance()->AddShouyinPrinter(data);
+	CPosPrinterWorker::GetInstance()->AddShouyinPrinter(data);
 }
 
-//获取当前电脑上所有的打印usb设备
+//鑾峰彇褰撳墠鐢佃剳涓婃墍鏈夌殑鎵撳嵃usb璁惧�
 std::vector<std::wstring> CPosPrinter::getUsbDevices()
 {
-	return CPosPrinterQueue::GetInstance()->getUsbDevices();
+	return CPosPrinterWorker::GetInstance()->getUsbDevices();
 }

+ 20 - 24
zhipuzi_pos_windows/print/CPosPrinter.h

@@ -1,10 +1,6 @@
-#pragma once
+锘�#pragma once
 
-#include "../pch/pch.h"
-
-#include "CPosPrinterQueue.h"
-#include "../zhipuzi/CJiaobanOrder.h"
-#include "../zhipuzi/CHuiyuanchognzhiOrder.h"
+#include "../print/CPosPrinterData.h"
 
 class CPosPrinter
 {
@@ -12,58 +8,58 @@ public:
 	CPosPrinter();
 	~CPosPrinter();
 
-	//完成所有打印一个外卖订单的操作(不等待,立即返回)
+	//瀹屾垚鎵€鏈夋墦鍗颁竴涓��鍗栬�鍗曠殑鎿嶄綔锛堜笉绛夊緟锛岀珛鍗宠繑鍥烇級
 	void PrintWaimaiOrder(CWaimaiOrder& order);
 
-	//通过订单号打印订单,后面要改成异步才行
+	//閫氳繃璁㈠崟鍙锋墦鍗拌�鍗曪紝鍚庨潰瑕佹敼鎴愬紓姝ユ墠琛�
 	void PrintWaimaiOrder(std::string order_id, std::string order_no);
 
-	//完成所有打印一个点单订单的操作(不等待,立即返回)
+	//瀹屾垚鎵€鏈夋墦鍗颁竴涓�偣鍗曡�鍗曠殑鎿嶄綔锛堜笉绛夊緟锛岀珛鍗宠繑鍥烇級
 	void PrintDiandanOrder(CDiandanOrder& order);
 
-	//通过订单号打印订单,后面要改成异步才行
+	//閫氳繃璁㈠崟鍙锋墦鍗拌�鍗曪紝鍚庨潰瑕佹敼鎴愬紓姝ユ墠琛�
 	void PrintDiandanOrder(std::string order_id);
 
-	//完成所有打印一个正餐下单的打印操作(不等待,立即返回)
+	//瀹屾垚鎵€鏈夋墦鍗颁竴涓��椁愪笅鍗曠殑鎵撳嵃鎿嶄綔锛堜笉绛夊緟锛岀珛鍗宠繑鍥烇級
 	void PrintZhengcanOrderXiadan(CZhengcanOrder& order);
 
-	//通过商家app加菜成功,或者商家app确认扫码下单加菜,这个时候推送给收银机来打印
+	//閫氳繃鍟嗗�app鍔犺彍鎴愬姛锛屾垨鑰呭晢瀹禷pp纭��鎵�爜涓嬪崟鍔犺彍锛岃繖涓�椂鍊欐帹閫佺粰鏀堕摱鏈烘潵鎵撳嵃
 	void PrintZhengcanOrderXiadan(std::string order_id, std::string jiacai_no);
 
-	//完成所有打印一个正餐退菜的打印操作(不等待,立即返回)
+	//瀹屾垚鎵€鏈夋墦鍗颁竴涓��椁愰€€鑿滅殑鎵撳嵃鎿嶄綔锛堜笉绛夊緟锛岀珛鍗宠繑鍥烇級
 	void PrintZhengcanOrderTuicai(CZhengcanOrder& order);
 
-	//通过商家app退菜成功,这个时候推送给收银机来打印
+	//閫氳繃鍟嗗�app閫€鑿滄垚鍔燂紝杩欎釜鏃跺€欐帹閫佺粰鏀堕摱鏈烘潵鎵撳嵃
 	void PrintZhengcanOrderTuicai(std::string order_id, std::string tuicai_item_id);
 
-	//完成所有打印一个正餐预览的打印操作(不等待,立即返回)
+	//瀹屾垚鎵€鏈夋墦鍗颁竴涓��椁愰�瑙堢殑鎵撳嵃鎿嶄綔锛堜笉绛夊緟锛岀珛鍗宠繑鍥烇級
 	void PrintZhengcanOrderYulan(CZhengcanOrder& order);
 
-	//完成所有打印一个正餐结算的打印操作(不等待,立即返回)
+	//瀹屾垚鎵€鏈夋墦鍗颁竴涓��椁愮粨绠楃殑鎵撳嵃鎿嶄綔锛堜笉绛夊緟锛岀珛鍗宠繑鍥烇級
 	void PrintZhengcanOrderJiesuan(CZhengcanOrder& order);
 
-	//通过H5或者商家app结算成功之后,收银机打印结算单
+	//閫氳繃H5鎴栬€呭晢瀹禷pp缁撶畻鎴愬姛涔嬪悗锛屾敹閾舵満鎵撳嵃缁撶畻鍗�
 	void PrintZhengcanOrderJiesuan(std::string order_id);
 
-	//完成所有打印一个快速收银订单的操作(不等待,立即返回)
+	//瀹屾垚鎵€鏈夋墦鍗颁竴涓�揩閫熸敹閾惰�鍗曠殑鎿嶄綔锛堜笉绛夊緟锛岀珛鍗宠繑鍥烇級
 	void PrintShoukuanOrder(CShoukuanOrder& order);
 
-	//通过订单号打印订单,后面要改成异步才行
+	//閫氳繃璁㈠崟鍙锋墦鍗拌�鍗曪紝鍚庨潰瑕佹敼鎴愬紓姝ユ墠琛�
 	void PrintShoukuanOrder(std::string order_id);
 
-	//打印交班单
+	//鎵撳嵃浜ょ彮鍗�
 	void PirntJiaobanOrder(CJiaobaoOrder& order);
 
-	//打印会员充值订单
+	//鎵撳嵃浼氬憳鍏呭€艰�鍗�
 	void PrintHuiyuanchongzhiOrder(CHuiyuanchongzhiOrder& order);
 
-	//打印某个商品的条码(用于商品管理里面)
+	//鎵撳嵃鏌愪釜鍟嗗搧鐨勬潯鐮侊紙鐢ㄤ簬鍟嗗搧绠$悊閲岄潰锛�
 	void PrintShangpinTiaoma(CFood foodinfo);
 
-	//打开钱箱
+	//鎵撳紑閽辩�
 	void OpenQianxiang();
 
-	//获取当前电脑上所有的打印usb设备
+	//鑾峰彇褰撳墠鐢佃剳涓婃墍鏈夌殑鎵撳嵃usb璁惧�
 	std::vector<std::wstring> getUsbDevices();
 };
 

+ 0 - 1
zhipuzi_pos_windows/print/CPosPrinterData.h

@@ -1,6 +1,5 @@
 #pragma once
 
-#include "../pch/pch.h"
 #include "../zhipuzi/CWaimaiOrder.h"
 #include "../zhipuzi/CDiandanOrder.h"
 #include "../zhipuzi/CZhengcanOrder.h"

+ 34 - 37
zhipuzi_pos_windows/tool/CAppEnv.cpp

@@ -1,14 +1,15 @@
 #include "../pch/pch.h"
 #include "CAppEnv.h"
 
-#include "../print/CPosPrinterQueue.h"
+#include "../worker/CPosPrinterWorker.h"
 #include "../worker/CChengzhongWorker.h"
 #include "../worker/CMqttClientWorker.h"
 #include "../worker/CCommonWorker.h"
 #include "../worker/CVoiceWorker.h"
-#include "../worker/CVideoCaptureWorker.h"
 #include "../worker/CDiandanAIShibieWorker.h"
+
 #include "CShuangpingTool.h"
+#include "CVideoCapture.h"
 
 #include "../ai/SQLiteVecManager.h"
 
@@ -27,32 +28,23 @@ void CAppEnv::Start()
 	//初始化配置
 	CSetting::GetInstance()->Init();
 
-	//加载YOLO模型
-	YoloFeatureManager::GetInstance()->loadModel();
-
-	//初始化特征数据库
-	SQLiteVecManager::GetInstance()->initializeDatabase(1280);
-
 	//启动打印队列
-	CPosPrinterQueue::GetInstance()->StartWork();
+	CPosPrinterWorker::GetInstance()->Start();
 
 	//启动称重任务
-	CChengzhongWorker::GetInstance()->StartWork();
+	CChengzhongWorker::GetInstance()->Start();
 
 	//启动声音任务
 	CVoiceWorker::GetInstance()->Start();
 
-	//启动摄像头任务
-	CVideoCaptureWorker::GetInstance()->Start();
-
-	//启动AI识别任务(有2个工作线程)
-	CDiandanAIShibieWorker::GetInstance()->StartWork();
+	//启动AI识别任务
+	CDiandanAIShibieWorker::GetInstance()->Start();
 
 	//启动通用任务
 	CCommonWorker::GetInstance()->Start();
 
-	//初始化副屏
-	CShuangpingTool::GetInstance()->Init();
+	//一些不太重要的初始化,放到异步线程里去做,避免阻塞主线程
+	std::thread(&CAppEnv::AsyncInit, this).detach();
 }
 
 void CAppEnv::Stop()
@@ -60,12 +52,12 @@ void CAppEnv::Stop()
 	auto time_1 = std::chrono::high_resolution_clock::now();
 
 	//停止打印任务
-	CPosPrinterQueue::GetInstance()->StopWork();
+	CPosPrinterWorker::GetInstance()->Stop();
 
 	auto time_2 = std::chrono::high_resolution_clock::now();
 
 	//停止称重任务
-	CChengzhongWorker::GetInstance()->StopWork();
+	CChengzhongWorker::GetInstance()->Stop();
 
 	auto time_3 = std::chrono::high_resolution_clock::now();
 
@@ -74,26 +66,21 @@ void CAppEnv::Stop()
 
 	auto time_4 = std::chrono::high_resolution_clock::now();
 
-	//停止摄像头任务
-	CVideoCaptureWorker::GetInstance()->Stop();
-
-	auto time_5 = std::chrono::high_resolution_clock::now();
-
 	//暂停AI识别任务
-	CDiandanAIShibieWorker::GetInstance()->StopWork();
-
-	auto time_6 = std::chrono::high_resolution_clock::now();
+	CDiandanAIShibieWorker::GetInstance()->Stop();
 
+	auto time_5 = std::chrono::high_resolution_clock::now();
+	
 	//停止通用任务
 	CCommonWorker::GetInstance()->Stop();
 
-	auto time_7 = std::chrono::high_resolution_clock::now();
+	auto time_6 = std::chrono::high_resolution_clock::now();
 
 	//必须等所有工作线程都退出了,才能走到这里,否则可能会有一些线程还在访问已经被销毁的资源,导致崩溃
 	while (m_worker_count > 0)
 	{
 		CLewaimaiLog::OutputDebugMessage(L"正在等待工作线程退出,剩余线程数:" + std::to_wstring(m_worker_count));
-		Sleep(30);
+		Sleep(10);
 	}
 
 	auto time_8 = std::chrono::high_resolution_clock::now();
@@ -107,19 +94,14 @@ void CAppEnv::Stop()
 	auto duration3 = std::chrono::duration_cast<std::chrono::milliseconds>(time_4 - time_3);
 	CLewaimaiLog::OutputDebugMessage(("声音任务耗时: " + std::to_string(duration3.count()) + " 毫秒").c_str());
 
-	auto duration4 = std::chrono::duration_cast<std::chrono::milliseconds>(time_5 - time_4);
-	CLewaimaiLog::OutputDebugMessage(("摄像头任务耗时: " + std::to_string(duration4.count()) + " 毫秒").c_str());
-
-	auto duration5 = std::chrono::duration_cast<std::chrono::milliseconds>(time_6 - time_5);
+	auto duration5 = std::chrono::duration_cast<std::chrono::milliseconds>(time_5 - time_4);
 	CLewaimaiLog::OutputDebugMessage(("AI识别任务耗时: " + std::to_string(duration5.count()) + " 毫秒").c_str());
 
-	auto duration6 = std::chrono::duration_cast<std::chrono::milliseconds>(time_7 - time_6);
+	auto duration6 = std::chrono::duration_cast<std::chrono::milliseconds>(time_6 - time_5);
 	CLewaimaiLog::OutputDebugMessage(("通用任务耗时: " + std::to_string(duration6.count()) + " 毫秒").c_str());
 
-	auto duration7 = std::chrono::duration_cast<std::chrono::milliseconds>(time_8 - time_7);
+	auto duration7 = std::chrono::duration_cast<std::chrono::milliseconds>(time_8 - time_1);
 	CLewaimaiLog::OutputDebugMessage(("总耗时: " + std::to_string(duration7.count()) + " 毫秒").c_str());
-
-	int a = 1;
 }
 
 void CAppEnv::AddWorkerNum()
@@ -133,3 +115,18 @@ void CAppEnv::DelWorkerNum()
 	std::lock_guard<std::mutex> lock(m_mutex);
 	m_worker_count--;
 }
+
+void CAppEnv::AsyncInit()
+{
+	//初始化副屏
+	CShuangpingTool::GetInstance()->Init();
+
+	//初始化摄像头
+	CVideoCapture::GetInstance()->InitVideoCapture();
+
+	//加载YOLO模型
+	YoloFeatureManager::GetInstance()->loadModel();
+
+	//初始化特征数据库
+	SQLiteVecManager::GetInstance()->initializeDatabase(1280);
+}

+ 5 - 2
zhipuzi_pos_windows/tool/CAppEnv.h

@@ -1,6 +1,6 @@
-#pragma once
+锘�#pragma once
 
-//处理所有环境初始化,在应用一起动就进行初始化(登录前就初始化)
+//澶勭悊鎵€鏈夌幆澧冨垵濮嬪寲锛屽湪搴旂敤涓€璧峰姩灏辫繘琛屽垵濮嬪寲锛堢櫥褰曞墠灏卞垵濮嬪寲锛�
 class CAppEnv
 {
 public:
@@ -20,6 +20,9 @@ public:
 	void AddWorkerNum();
 	void DelWorkerNum();
 
+	// 寮傛�鍒濆�鍖栵紝閬垮厤闃诲�涓荤嚎绋�
+	void AsyncInit();
+
 private:
 	int m_worker_count;
 

+ 9 - 9
zhipuzi_pos_windows/tool/CFoodHandle.cpp

@@ -1,4 +1,4 @@
-#include "../pch/pch.h"
+锘�#include "../pch/pch.h"
 #include "CFoodHandle.h"
 
 #include "CSqlite3.h"
@@ -27,12 +27,12 @@ bool CFoodHandle::InitAllFood()
 		return false;
 	}
 
-	//获得数据成功
+	//鑾峰緱鏁版嵁鎴愬姛
 	rapidjson::Value& data = document["data"];
 
 	CSqlite3 sqlite;
 
-	//先处理商品的
+	//鍏堝�鐞嗗晢鍝佺殑
 	rapidjson::Value& v_goods_rows = data["goods_rows"];
 	ret = sqlite.InitFoodData(v_goods_rows);
 	if (!ret)
@@ -40,7 +40,7 @@ bool CFoodHandle::InitAllFood()
 		return false;
 	}
 
-	//再处理商品分类的
+	//鍐嶅�鐞嗗晢鍝佸垎绫荤殑
 	rapidjson::Value& v_types_lv1_ids = data["types_lv1_ids"];
 	ret = sqlite.InitFoodtypeData(v_types_lv1_ids);
 	if (!ret)
@@ -48,7 +48,7 @@ bool CFoodHandle::InitAllFood()
 		return false;
 	}
 
-	//再处理商品套餐的
+	//鍐嶅�鐞嗗晢鍝佸�椁愮殑
 	rapidjson::Value& v_food_package = data["food_package"];
 	ret = sqlite.InitFoodpackageData(v_food_package);
 	if (!ret)
@@ -79,12 +79,12 @@ bool CFoodHandle::UpdateOneFood(std::string food_id)
 		return false;
 	}
 
-	//获得数据成功
+	//鑾峰緱鏁版嵁鎴愬姛
 	rapidjson::Value& data = document["data"];
 
 	CSqlite3 sqlite;
 
-	//先处理商品的
+	//鍏堝�鐞嗗晢鍝佺殑
 	rapidjson::Value& v_goods_rows = data["goods_row"];
 	ret = sqlite.UpdateOneFood(v_goods_rows);
 	if (!ret)
@@ -95,11 +95,11 @@ bool CFoodHandle::UpdateOneFood(std::string food_id)
 	return true;
 }
 
-bool CFoodHandle::DeleteOndeFood(std::string food_id)
+bool CFoodHandle::DeleteOneFood(std::string food_id)
 {
 	CSqlite3 sqlite;
 
-	//先处理商品的
+	//鍏堝�鐞嗗晢鍝佺殑
 	bool ret = sqlite.DeleteOneFood(food_id);
 	if (!ret)
 	{

+ 6 - 7
zhipuzi_pos_windows/tool/CFoodHandle.h

@@ -1,4 +1,4 @@
-#pragma once
+锘�#pragma once
 
 class CFoodHandle
 {
@@ -10,16 +10,15 @@ public:
 		return &instance;
 	}
 
-	//本地数据库全量同步云端商品
+	//鏈�湴鏁版嵁搴撳叏閲忓悓姝ヤ簯绔�晢鍝�
 	bool InitAllFood();
 
-	//本地数据库同步云端的某一个商品
+	//鏈�湴鏁版嵁搴撳悓姝ヤ簯绔�殑鏌愪竴涓�晢鍝�
 	bool UpdateOneFood(std::string food_id);
 
-	//本地数据库删除某一个删除
-	bool DeleteOndeFood(std::string food_id);
+	//鏈�湴鏁版嵁搴撳垹闄ゆ煇涓€涓�垹闄�
+	bool DeleteOneFood(std::string food_id);
 
 private:
 	CFoodHandle();	
-};
-
+};

+ 0 - 2
zhipuzi_pos_windows/tool/CSqlite3.cpp

@@ -1,8 +1,6 @@
 #include "../pch/pch.h"
 #include "CSqlite3.h"
 
-#include "CSetting.h"
-
 CSqlite3::CSqlite3()
 {
 	try

+ 14 - 16
zhipuzi_pos_windows/tool/CSqlite3.h

@@ -1,9 +1,7 @@
-#pragma once
+锘�#pragma once
 
 #include <../sqlite3/sqlite3.h>
 
-#include "CSetting.h"
-
 #include "../zhipuzi/CFoodtype.h"
 #include "../zhipuzi/CFood.h"
 #include "../zhipuzi/CFoodpackage.h"
@@ -15,7 +13,7 @@ public:
 	~CSqlite3();
 
 public:
-	//下面这些是初始化数据库表的函数
+	//涓嬮潰杩欎簺鏄�垵濮嬪寲鏁版嵁搴撹〃鐨勫嚱鏁�
 	bool InitDB();
 	bool InitPosConfig();
 	bool InitPosChufangPrinter();
@@ -24,12 +22,12 @@ public:
 	bool InitPosFoodType();
 	bool InitPosFoodPackage();
 
-	//下面这些是读写数据库特定表的函数
+	//涓嬮潰杩欎簺鏄��鍐欐暟鎹�簱鐗瑰畾琛ㄧ殑鍑芥暟
 	bool SaveParams(std::map<std::string, std::string>& params);
 	bool SaveChufangPrinter(std::vector<ChufangPrinter>& printers);
 	bool SaveUsers(std::map<std::string, std::string> users);
 
-	//登录成功的时候,初始化数据库数据
+	//鐧诲綍鎴愬姛鐨勬椂鍊欙紝鍒濆�鍖栨暟鎹�簱鏁版嵁
 	bool InitFoodData(rapidjson::Value& foodrows);
 	bool InitFoodtypeData(rapidjson::Value& foodtyperows);
 	bool InitFoodpackageData(rapidjson::Value& foodpackagerows);
@@ -39,38 +37,38 @@ public:
 
 	bool AddOneFoodtype(std::string type_id, std::string name, std::string is_shouyinji_show, std::string tag);
 
-	//获取套餐商品的数量
+	//鑾峰彇濂楅�鍟嗗搧鐨勬暟閲�
 	int GetFoodpackageNum();
 
-	//获取所有分类信息
+	//鑾峰彇鎵€鏈夊垎绫讳俊鎭�
 	std::vector<CFoodType> GetFoodtypes(bool is_shouyinji_show = true);
 
 	bool GetFoodtypeById(std::string foodtype_id, CFoodType& newFoodType);
 
-	//获取某一个商品分类下的商品
+	//鑾峰彇鏌愪竴涓�晢鍝佸垎绫讳笅鐨勫晢鍝�
 	std::vector<CFood> GetFoodByTypeid(std::string type_id, bool is_shouyinji_show = true);
 
-	//获取某一个商品分类下的商品
+	//鑾峰彇鏌愪竴涓�晢鍝佸垎绫讳笅鐨勫晢鍝�
 	std::vector<CFood> GetFoodForTiaomacheng();
 
-	//用于商品搜索
+	//鐢ㄤ簬鍟嗗搧鎼滅储
 	std::vector<CFood> GetFoodByFoodname(std::string foodname, bool is_shouyinji_show = true);
 
 	std::vector<CFoodpackage> GetFoodpackages(bool is_shouyinji_show = true);
 
-	//通过商品ID查找商品,如果找到返回true,找不到返回false
+	//閫氳繃鍟嗗搧ID鏌ユ壘鍟嗗搧锛屽�鏋滄壘鍒拌繑鍥瀟rue锛屾壘涓嶅埌杩斿洖false
 	bool GetFoodById(std::string food_id, CFood& newFood);
 
-	//通过商品条码查找商品,如果找到返回true,找不到返回false
+	//閫氳繃鍟嗗搧鏉$爜鏌ユ壘鍟嗗搧锛屽�鏋滄壘鍒拌繑鍥瀟rue锛屾壘涓嶅埌杩斿洖false
 	bool GetFoodByBarcode(std::string barcode, CFood& newFood);
 
-	//通过PLU商品编码查找商品,如果找到返回true,找不到返回false
+	//閫氳繃PLU鍟嗗搧缂栫爜鏌ユ壘鍟嗗搧锛屽�鏋滄壘鍒拌繑鍥瀟rue锛屾壘涓嶅埌杩斿洖false
 	bool GetFoodByPluBianma(std::string barcode, CFood& newFood);
 
-	//通过套餐ID获取套餐信息
+	//閫氳繃濂楅�ID鑾峰彇濂楅�淇℃伅
 	bool GetFoodpackageById(std::string foodpackage_id, CFoodpackage& newFoodpackage);
 
-	//更新商品ID的库存
+	//鏇存柊鍟嗗搧ID鐨勫簱瀛�
 	void UpdateFoodStock(std::string food_id, std::string stock);
 private:
 	bool ExeSQl(std::string sql);

+ 129 - 0
zhipuzi_pos_windows/tool/CVideoCapture.cpp

@@ -0,0 +1,129 @@
+#include "../pch/pch.h"
+#include "CVideoCapture.h"
+#include "../tool/CAppEnv.h"
+
+CVideoCapture::CVideoCapture()
+{
+
+}
+
+CVideoCapture::~CVideoCapture()
+{
+	if (m_is_video_capture_open == true)
+	{
+		m_cap.release();
+	}
+}
+
+// 新增:自动检测可用摄像头索引
+int CVideoCapture::findAvailableCamera()
+{
+    for (int i = 0; i < 10; i++)
+    { 
+		// 检测前10个索引
+        cv::VideoCapture tempCap(i, cv::CAP_DSHOW);
+        if (tempCap.isOpened())
+        {
+            tempCap.release();
+
+            return i;
+        }
+    }
+    return -1;
+}
+
+void CVideoCapture::InitVideoCapture()
+{
+	//对初始化摄像头的操作加锁,避免多线程同时初始化摄像头导致崩溃
+	std::lock_guard<std::mutex> lock(m_init_mutex);
+
+	int cameraIndex = findAvailableCamera();
+	if (cameraIndex == -1)
+	{
+		m_is_video_capture_open = false;
+
+		CLewaimaiLog::OutputDebugMessage("未找到任何可用摄像头!");
+		return;
+	}
+
+	m_cap.open(cameraIndex, cv::CAP_DSHOW);
+	if (!m_cap.isOpened())
+	{
+		m_is_video_capture_open = false;
+
+		CLewaimaiLog::OutputDebugMessage("打开摄像头失败,正在重试...");
+		return;
+	}
+
+	m_is_video_capture_open = true;
+
+	CLewaimaiLog::OutputDebugMessage("摄像头打开成功!");
+
+	/*
+	160×120(QQVGA):适用于低带宽或嵌入式场景,资源占用极低
+	320×240(QVGA):轻量级视频传输常用,适合实时性要求高的应用
+	640×480(VGA):OpenCV 默认常用分辨率,兼容性强,广泛用于基础图像处理
+	800×600(SVGA):中等清晰度,适用于需要细节但不追求高清的场景
+	1024×768(XGA):较高清分辨率,适合文档扫描或静态图像采集
+	1280×720(720p HD):标准高清分辨率,广泛用于人脸识别、目标检测等视觉任务
+	1920×1080(1080p Full HD):全高清分辨率,提供高质量图像,适用于高精度视觉分析
+	*/
+	int width = 1920;
+	int height = 1080;
+
+	m_cap.set(cv::CAP_PROP_FRAME_WIDTH, width);
+	m_cap.set(cv::CAP_PROP_FRAME_HEIGHT, height);
+
+	// 验证设置是否成功
+	double actualWidth = m_cap.get(cv::CAP_PROP_FRAME_WIDTH);
+	double actualHeight = m_cap.get(cv::CAP_PROP_FRAME_HEIGHT);
+
+	std::cout << "设置的分辨率: " << width << " x " << height << std::endl;
+	std::cout << "实际分辨率: " << actualWidth << " x " << actualHeight << std::endl;
+
+	//CLewaimaiLog::OutputMessageBoxFormat(L"摄像头分辨率设置为: %d x %d\n实际分辨率: %.0f x %.0f", width, height, actualWidth, actualHeight);
+
+	// ========== 关键硬件参数:解决反光过曝发白 ==========
+	// 1. 关闭自动曝光(必须,否则强光自动提亮加重发白)
+	m_cap.set(cv::CAP_PROP_AUTO_EXPOSURE, 0);
+	// 2. 手动降低曝光值,数值越小进光越少,根据相机微调
+	m_cap.set(cv::CAP_PROP_EXPOSURE, -6);
+	// 3. 降低增益ISO,减少高光噪点饱和
+	//m_cap.set(cv::CAP_PROP_GAIN, 1);
+	// 4. 提高对比度,拉开明暗层次
+	//m_cap.set(cv::CAP_PROP_CONTRAST, 70);
+	// 5. 关闭自动白平衡,防止反光泛白
+	//m_cap.set(cv::CAP_PROP_AUTO_WB, 0);
+	// 手动色温,调低减少冷白反光
+	//m_cap.set(cv::CAP_PROP_WB_TEMPERATURE, 3300);
+	// 降低饱和度,高光不易一片惨白
+	//m_cap.set(cv::CAP_PROP_SATURATION, 40);
+}
+
+bool CVideoCapture::GetFrame(cv::Mat& frame)
+{
+	//如果还是没打开摄像头,说明摄像头有问题,直接返回false
+	if (m_is_video_capture_open == false)
+	{
+		CLewaimaiLog::OutputDebugMessage("摄像头未打开,请检查摄像头连接或驱动是否正常!");
+
+		return false;
+	}
+
+	m_cap >> frame;
+	if (frame.empty())
+	{
+		CLewaimaiLog::OutputDebugMessage("摄像头读取失败");
+
+		return false;
+	}
+
+	//什么都不用做,只需要把摄像头读取的帧放在成员变量里就行,后续其他地方需要用到摄像头数据的时候直接从成员变量里取就行。
+	// 显示摄像头帧(可选)
+	//cv::imshow("Camera", m_frame);
+	//if (cv::waitKey(30) >= 0) break; // 按任意键退出
+
+	//cv::destroyAllWindows();
+
+	return true;
+}

+ 33 - 0
zhipuzi_pos_windows/tool/CVideoCapture.h

@@ -0,0 +1,33 @@
+#pragma once
+
+#include <opencv2/opencv.hpp>
+#include <opencv2/dnn.hpp>
+
+//这个Worker只负责从摄像头读取图像数据,不负责进行任何处理
+class CVideoCapture
+{
+public:
+	CVideoCapture();
+	~CVideoCapture();
+
+	static CVideoCapture * GetInstance()
+	{
+		static CVideoCapture instance;
+
+		return &instance;
+	}
+
+	void InitVideoCapture();
+
+	bool GetFrame(cv::Mat& frame);
+
+private:
+	int findAvailableCamera();	
+
+private:
+	bool m_is_video_capture_open = false;
+
+	cv::VideoCapture m_cap;
+
+	std::mutex m_init_mutex;
+};

+ 4 - 0
zhipuzi_pos_windows/wnd/CMainWnd.cpp

@@ -73,6 +73,10 @@ void CMainWnd::End()
 {
 	//停止消息推送
 	CMqttClientWorker::GetInstance()->Stop();
+
+	//停止AI学习页面的摄像头线程
+	CAIxuexiPageUI* page = static_cast<CAIxuexiPageUI*>(this->GetPage(CMainWnd::AIXUEXI));
+	page->StopVideoThread();
 }
 
 void CMainWnd::UpdateFoodImage()

+ 4 - 12
zhipuzi_pos_windows/worker/CChengzhongWorker.cpp

@@ -10,31 +10,23 @@ CChengzhongWorker::CChengzhongWorker()
 }
 
 //启动工作线程
-void CChengzhongWorker::StartWork()
+void CChengzhongWorker::Start()
 {
-	m_worker_mutex.lock();
-
 	m_is_work = true;
 
-	m_worker_mutex.unlock();
-
 	std::thread(&CChengzhongWorker::HandleWork, this).detach();
 	CAppEnv::GetInstance()->AddWorkerNum();
 }
 
 //结束工作线程
-void CChengzhongWorker::StopWork()
+void CChengzhongWorker::Stop()
 {
-	m_worker_mutex.lock();
-
-	m_is_work = false;
-
-	m_worker_mutex.unlock();
-
 	m_serial.closeComm();
 
 	m_weight = "";
 	m_hwnd = NULL;
+
+	m_is_work = false;
 }
 
 void CChengzhongWorker::RestartWork()

+ 2 - 2
zhipuzi_pos_windows/worker/CChengzhongWorker.h

@@ -27,10 +27,10 @@ public:
 	}
 
 	//启动工作线程
-	void StartWork();
+	void Start();
 
 	//结束工作线程
-	void StopWork();
+	void Stop();
 
 	//修改了设置,重新启动工作线程,重新连接串口
 	void RestartWork();

+ 14 - 21
zhipuzi_pos_windows/worker/CCommonWorker.cpp

@@ -1,28 +1,30 @@
-#include "../pch/pch.h"
+#include "../pch/pch.h"
 #include "CCommonWorker.h"
 
 #include "../zhipuzi/CWaimaiOrder.h"
 
+#include "../tool/CAppEnv.h"
+
+CCommonWorker::CCommonWorker()
+{
+}
+
+CCommonWorker::~CCommonWorker()
+{
+}
+
 void CCommonWorker::Start()
 {
 	m_is_work = true;
 
-	m_nStopNum = 0;
-
-	//´¦Àí¶©µ¥È·ÈÏ
+	//处�订�确认
 	std::thread(&CCommonWorker::HandleConfirm, this).detach();
+	CAppEnv::GetInstance()->AddWorkerNum();
 }
 
 void CCommonWorker::Stop()
 {
 	m_is_work = false;
-
-	m_confirm_mutex.lock();
-	while (!m_confirm_queue.empty())
-	{
-		m_confirm_queue.pop();
-	}
-	m_confirm_mutex.unlock();
 }
 
 void CCommonWorker::AddConfirm(std::string order_id)
@@ -57,14 +59,5 @@ void CCommonWorker::HandleConfirm()
 		newOrder.ConfirmeOrder(order_id);
 	}
 
-	AddStopNum();
-}
-
-void CCommonWorker::AddStopNum()
-{
-	m_nStopNumMutex.lock();
-
-	m_nStopNum++;
-
-	m_nStopNumMutex.unlock();
+	CAppEnv::GetInstance()->DelWorkerNum();
 }

+ 8 - 16
zhipuzi_pos_windows/worker/CCommonWorker.h

@@ -1,11 +1,14 @@
-#pragma once
+锘�#pragma once
 
 #include "../pch/pch.h"
 
-//这个类专门用于接收服务器端的消息推送
+//杩欎釜绫讳笓闂ㄧ敤浜庢帴鏀舵湇鍔″櫒绔�殑娑堟伅鎺ㄩ€�
 class CCommonWorker
 {
 public:
+	CCommonWorker();
+	~CCommonWorker();
+
 	static CCommonWorker* GetInstance()
 	{
 		static CCommonWorker instance;
@@ -13,31 +16,20 @@ public:
 		return &instance;
 	}
 
-	//开始工作
+	//寮€濮嬪伐浣�
 	void Start();
 
-	//停止工作
+	//鍋滄�宸ヤ綔
 	void Stop();
 
-	//队列处理
+	//闃熷垪澶勭悊
 	void HandleConfirm();
 
 	void AddConfirm(std::string order_id);
 
-private:
-	CCommonWorker()
-	{
-
-	}
-
-	void AddStopNum();
-
 private:
 	bool m_is_work;
 
-	int m_nStopNum = 0;
-	std::mutex m_nStopNumMutex;
-
 	std::queue<std::string> m_confirm_queue;
 
 	std::mutex m_confirm_mutex;

+ 4 - 4
zhipuzi_pos_windows/worker/CDiandanAIShibieWorker.cpp

@@ -3,7 +3,7 @@
 #include "CChengzhongWorker.h"
 #include "../tool/CAppEnv.h"
 #include "../ai/SQLiteVecManager.h"
-#include "CVideoCaptureWorker.h"
+#include "../tool/CVideoCapture.h"
 #include "../tool/CSqlite3.h"
 
 CDiandanAIShibieWorker::CDiandanAIShibieWorker()
@@ -17,7 +17,7 @@ CDiandanAIShibieWorker::~CDiandanAIShibieWorker()
 }
 
 //启动工作线程
-void CDiandanAIShibieWorker::StartWork()
+void CDiandanAIShibieWorker::Start()
 {
 	m_is_work = true;
 
@@ -30,7 +30,7 @@ void CDiandanAIShibieWorker::StartWork()
 }
 
 //结束工作线程
-void CDiandanAIShibieWorker::StopWork()
+void CDiandanAIShibieWorker::Stop()
 {
 	m_is_work = false;
 }
@@ -65,7 +65,7 @@ void CDiandanAIShibieWorker::DoAIShibie()
 		}
 
 		cv::Mat image;
-		CVideoCaptureWorker::GetInstance()->GetFrame(image);
+		CVideoCapture::GetInstance()->GetFrame(image);
 		if (image.empty())
 		{
 			//从摄像头获取帧失败

+ 2 - 2
zhipuzi_pos_windows/worker/CDiandanAIShibieWorker.h

@@ -17,10 +17,10 @@ public:
 	}
 
 	//启动工作线程
-	void StartWork();
+	void Start();
 
 	//结束工作线程
-	void StopWork();
+	void Stop();
 
 	void SetHWND(HWND hwnd)
 	{

+ 5 - 15
zhipuzi_pos_windows/worker/CMqttClientWorker.cpp

@@ -11,6 +11,8 @@
 
 #include "../print/CPosPrinter.h"
 
+#include "../tool/CAppEnv.h"
+
 CMqttClientWorker::CMqttClientWorker()
 {
 
@@ -25,17 +27,14 @@ void CMqttClientWorker::Start()
 {
 	m_is_running = true;
 
-	m_nStopNum = 0;
-
 	//处理Mqtt消息接收
 	std::thread(&CMqttClientWorker::Run, this).detach();
+	CAppEnv::GetInstance()->AddWorkerNum();
 }
 
 void CMqttClientWorker::Stop()
 {
 	m_is_running = false;
-
-	Sleep(100);
 }
 
 void CMqttClientWorker::Run()
@@ -76,7 +75,7 @@ void CMqttClientWorker::Run()
 	while (m_is_running)
 	{
 		//一直循环,一直工作,等待接收消息
-		int a = 1;
+		Sleep(100);
 	}
 
 	//代码走到这里,说明退出登录了,要暂停推送了
@@ -95,7 +94,7 @@ void CMqttClientWorker::Run()
 	//销毁客户端
 	delete m_async_client;
 
-	AddStopNum();
+	CAppEnv::GetInstance()->DelWorkerNum();
 
 	return;
 }
@@ -431,13 +430,4 @@ void CMqttClientWorker::HandleMessage(std::string message)
 
 		CVoiceWorker::GetInstance()->AddVoice(content);
 	}
-}
-
-void CMqttClientWorker::AddStopNum()
-{
-	m_nStopNumMutex.lock();
-
-	m_nStopNum++;
-
-	m_nStopNumMutex.unlock();
 }

+ 0 - 6
zhipuzi_pos_windows/worker/CMqttClientWorker.h

@@ -41,10 +41,6 @@ private:
     //工作状态
     bool m_is_running = false;
 
-    //下面是消息处理相关的
-    int m_nStopNum = 0;
-    std::mutex m_nStopNumMutex;
-
     HWND m_hwnd;
 
 public:
@@ -100,6 +96,4 @@ private:
     void message_arrived(mqtt::const_message_ptr msg) override;
 
     void delivery_complete(mqtt::delivery_token_ptr token) override;
-
-    void AddStopNum();
 };

+ 30 - 63
zhipuzi_pos_windows/print/CPosPrinterQueue.cpp → zhipuzi_pos_windows/worker/CPosPrinterWorker.cpp

@@ -1,61 +1,43 @@
 #include "../pch/pch.h"
-#include "CPosPrinterQueue.h"
+#include "CPosPrinterWorker.h"
 
 #include "../helper/CComHelper.h"
 
+#include "../tool/CAppEnv.h"
+
 //boost库的头文件
 #include <boost/asio.hpp>
 #include <boost/asio/io_context.hpp>
 using boost::asio::ip::tcp;
 
-CPosPrinterQueue::CPosPrinterQueue()
+CPosPrinterWorker::CPosPrinterWorker()
 {
 }
 
 
-void CPosPrinterQueue::StartWork()
+void CPosPrinterWorker::Start()
 {
 	m_is_work = true;
 
-	m_nStopNum = 0;
-
 	//处理收银打印
-	std::thread(&CPosPrinterQueue::HandleShouyinPrinter, this).detach();
+	std::thread(&CPosPrinterWorker::HandleShouyinPrinter, this).detach();
+	CAppEnv::GetInstance()->AddWorkerNum();
 
 	//处理标签打印
-	std::thread(&CPosPrinterQueue::HandleBiaoqianPrinter, this).detach();
+	std::thread(&CPosPrinterWorker::HandleBiaoqianPrinter, this).detach();
+	CAppEnv::GetInstance()->AddWorkerNum();
 
 	//处理厨房打印
-	std::thread(&CPosPrinterQueue::HandleChufangPrinter, this).detach();
+	std::thread(&CPosPrinterWorker::HandleChufangPrinter, this).detach();
+	CAppEnv::GetInstance()->AddWorkerNum();
 }
 
-void CPosPrinterQueue::StopWork()
+void CPosPrinterWorker::Stop()
 {
 	m_is_work = false;
-
-	m_shouyin_printer_mutex.lock();
-	while (!m_shouyin_printer_queue.empty())
-	{
-		m_shouyin_printer_queue.pop();
-	}
-	m_shouyin_printer_mutex.unlock();
-
-	m_biaoqian_printer_mutex.lock();
-	while (!m_biaoqian_printer_queue.empty())
-	{
-		m_biaoqian_printer_queue.pop();
-	}
-	m_biaoqian_printer_mutex.unlock();
-
-	m_chufang_printer_mutex.lock();
-	while (!m_chufang_printer_queue.empty())
-	{
-		m_chufang_printer_queue.pop();
-	}
-	m_chufang_printer_mutex.unlock();
 }
 
-void CPosPrinterQueue::AddShouyinPrinter(std::string chufang_data)
+void CPosPrinterWorker::AddShouyinPrinter(std::string chufang_data)
 {
 	m_shouyin_printer_mutex.lock();
 
@@ -64,7 +46,7 @@ void CPosPrinterQueue::AddShouyinPrinter(std::string chufang_data)
 	m_shouyin_printer_mutex.unlock();
 }
 
-void CPosPrinterQueue::AddBiaoqianPrinter(std::string data)
+void CPosPrinterWorker::AddBiaoqianPrinter(std::string data)
 {
 	m_biaoqian_printer_mutex.lock();
 
@@ -73,7 +55,7 @@ void CPosPrinterQueue::AddBiaoqianPrinter(std::string data)
 	m_biaoqian_printer_mutex.unlock();
 }
 
-void CPosPrinterQueue::AddChufangPrinter(ChufangPrinterContent data)
+void CPosPrinterWorker::AddChufangPrinter(ChufangPrinterContent data)
 {
 	m_chufang_printer_mutex.lock();
 
@@ -82,7 +64,7 @@ void CPosPrinterQueue::AddChufangPrinter(ChufangPrinterContent data)
 	m_chufang_printer_mutex.unlock();
 }
 
-void CPosPrinterQueue::HandleShouyinPrinter()
+void CPosPrinterWorker::HandleShouyinPrinter()
 {
 	while (m_is_work)
 	{
@@ -105,10 +87,10 @@ void CPosPrinterQueue::HandleShouyinPrinter()
 		SendDataToShouyinPirnter(data);
 	}
 
-	AddStopNum();
+	CAppEnv::GetInstance()->DelWorkerNum();
 }
 
-void CPosPrinterQueue::HandleBiaoqianPrinter()
+void CPosPrinterWorker::HandleBiaoqianPrinter()
 {
 	while (m_is_work)
 	{
@@ -131,10 +113,10 @@ void CPosPrinterQueue::HandleBiaoqianPrinter()
 		SendDataToBiaoqianPirnter(data);
 	}
 
-	AddStopNum();
+	CAppEnv::GetInstance()->DelWorkerNum();
 }
 
-void CPosPrinterQueue::HandleChufangPrinter()
+void CPosPrinterWorker::HandleChufangPrinter()
 {
 	while (m_is_work)
 	{
@@ -157,25 +139,10 @@ void CPosPrinterQueue::HandleChufangPrinter()
 		SendDataToChufangPirnter(chufang_data);
 	}
 
-	AddStopNum();
-}
-
-void CPosPrinterQueue::AddStopNum()
-{
-	m_nStopNumMutex.lock();
-
-	m_nStopNum++;
-
-	m_nStopNumMutex.unlock();
-
-	if (m_nStopNum == 8)
-	{
-		//确认所有子线程都退出了,再删除自己
-		delete this;
-	}
+	CAppEnv::GetInstance()->DelWorkerNum();
 }
 
-void CPosPrinterQueue::SendDataToShouyinPirnter(std::string data)
+void CPosPrinterWorker::SendDataToShouyinPirnter(std::string data)
 {
 	//默认是句柄模式
 	int nType = 1;
@@ -291,7 +258,7 @@ void CPosPrinterQueue::SendDataToShouyinPirnter(std::string data)
 	}
 }
 
-void CPosPrinterQueue::SendDataToBiaoqianPirnter(std::string data)
+void CPosPrinterWorker::SendDataToBiaoqianPirnter(std::string data)
 {
 	//默认是句柄模式
 	int nType = 1;
@@ -382,7 +349,7 @@ void CPosPrinterQueue::SendDataToBiaoqianPirnter(std::string data)
 	}
 }
 
-void CPosPrinterQueue::SendDataToChufangPirnter(ChufangPrinterContent chufang_data)
+void CPosPrinterWorker::SendDataToChufangPirnter(ChufangPrinterContent chufang_data)
 {
 	boost::asio::io_context m_io;
 	boost::asio::ip::tcp::socket m_socket(m_io);
@@ -424,7 +391,7 @@ void CPosPrinterQueue::SendDataToChufangPirnter(ChufangPrinterContent chufang_da
 }
 
 //自动识别用于收银小票的USB打印机列表
-void CPosPrinterQueue::InitUsb()
+void CPosPrinterWorker::InitUsb()
 {
 	//设置中文字符
 	setlocale(LC_CTYPE, "chs");
@@ -484,7 +451,7 @@ void CPosPrinterQueue::InitUsb()
 	m_usb_devices.clear();
 }
 
-bool CPosPrinterQueue::InitOneUsb(std::wstring usb_path, int nType)
+bool CPosPrinterWorker::InitOneUsb(std::wstring usb_path, int nType)
 {
 	if (usb_path == L"")
 	{
@@ -527,7 +494,7 @@ bool CPosPrinterQueue::InitOneUsb(std::wstring usb_path, int nType)
 	return true;
 }
 
-bool CPosPrinterQueue::InitBingkou()
+bool CPosPrinterWorker::InitBingkou()
 {
 	std::wstring LptStr = L"lpt1";
 
@@ -562,7 +529,7 @@ bool CPosPrinterQueue::InitBingkou()
 	return true;
 }
 
-void CPosPrinterQueue::InitCom()
+void CPosPrinterWorker::InitCom()
 {
 	CComHelper helper;
 	std::vector<std::wstring> comVector = helper.getComPort();
@@ -630,7 +597,7 @@ void CPosPrinterQueue::InitCom()
 /*
  *获取CreateFile的USB端口号
  **/
-int CPosPrinterQueue::GetDevicePath(LPGUID lpGuid, std::vector<std::wstring>& usb_devices)
+int CPosPrinterWorker::GetDevicePath(LPGUID lpGuid, std::vector<std::wstring>& usb_devices)
 {
 	HDEVINFO hDevInfoSet;
 	SP_DEVINFO_DATA spDevInfoData;
@@ -762,7 +729,7 @@ int CPosPrinterQueue::GetDevicePath(LPGUID lpGuid, std::vector<std::wstring>& us
 	return nCount;
 }
 
-std::vector<std::wstring> CPosPrinterQueue::getUsbDevices()
+std::vector<std::wstring> CPosPrinterWorker::getUsbDevices()
 {
 	std::vector<std::wstring> usb_devices;
 

+ 25 - 32
zhipuzi_pos_windows/print/CPosPrinterQueue.h → zhipuzi_pos_windows/worker/CPosPrinterWorker.h

@@ -1,71 +1,67 @@
-#pragma once
+锘�#pragma once
 
-#include "../pch/pch.h"
+#include "../print/CPosPrinterData.h"
 
-#include "CPosPrinterData.h"
-
-//SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大
+//SetupDiGetInterfaceDeviceDetail鎵€闇€瑕佺殑杈撳嚭闀垮害锛屽畾涔夎冻澶熷ぇ
 #define INTERFACE_DETAIL_SIZE 1024
 
-//设备数量上限,假设16台上限
+//璁惧�鏁伴噺涓婇檺锛屽亣璁�16鍙颁笂闄�
 #define MAX_DEVICE 16
 
-//USB类的GUID,通过这个去找USB打印机
+//USB绫荤殑GUID锛岄€氳繃杩欎釜鍘绘壘USB鎵撳嵃鏈�
 const GUID USB_GUID = { 0x28d78fad, 0x5a12, 0x11d1, {0xae, 0x5b, 0x00, 0x00, 0xf8, 0x03, 0xa8, 0xc2 } };
 
-//这个类采用队列的模式,执行把数据发送给打印机,注意这个类只负责发送,不负责数据内容的组装
-class CPosPrinterQueue
+//杩欎釜绫婚噰鐢ㄩ槦鍒楃殑妯″紡锛屾墽琛屾妸鏁版嵁鍙戦€佺粰鎵撳嵃鏈猴紝娉ㄦ剰杩欎釜绫诲彧璐熻矗鍙戦€侊紝涓嶈礋璐f暟鎹�唴瀹圭殑缁勮�
+class CPosPrinterWorker
 {
 public:
-	static CPosPrinterQueue* GetInstance()
+	static CPosPrinterWorker* GetInstance()
 	{
-		static CPosPrinterQueue instance;
+		static CPosPrinterWorker instance;
 
 		return &instance;
 	}
 
-	//启动工作线程
-	void StartWork();
+	//鍚�姩宸ヤ綔绾跨▼
+	void Start();
 
-	//结束工作线程
-	void StopWork();
+	//缁撴潫宸ヤ綔绾跨▼
+	void Stop();
 
-	//把打印数据添加到消息队列
+	//鎶婃墦鍗版暟鎹�坊鍔犲埌娑堟伅闃熷垪
 	void AddShouyinPrinter(std::string data);
 	void AddBiaoqianPrinter(std::string data);
 	void AddChufangPrinter(ChufangPrinterContent chufang_data);
 
-	//从队列中读数据
+	//浠庨槦鍒椾腑璇绘暟鎹�
 	void HandleShouyinPrinter();
 	void HandleBiaoqianPrinter();
 	void HandleChufangPrinter();
 
-	//执行实际的数据往打印机的发送
+	//鎵ц�瀹為檯鐨勬暟鎹�線鎵撳嵃鏈虹殑鍙戦€�
 	void SendDataToShouyinPirnter(std::string data);
 	void SendDataToBiaoqianPirnter(std::string data);
 	void SendDataToChufangPirnter(ChufangPrinterContent chufang_data);
 
-	//获取当前电脑上所有的打印usb设备
+	//鑾峰彇褰撳墠鐢佃剳涓婃墍鏈夌殑鎵撳嵃usb璁惧�
 	std::vector<std::wstring> getUsbDevices();
 
 private:
-	CPosPrinterQueue();
+	CPosPrinterWorker();
 
-	//自动识别用于收银小票的USB打印机列表
+	//鑷�姩璇嗗埆鐢ㄤ簬鏀堕摱灏忕エ鐨刄SB鎵撳嵃鏈哄垪琛�
 	void InitUsb();
 
-	//打开某一个指定的usb端口
-	//nType 1 收银打印 2标签打印
+	//鎵撳紑鏌愪竴涓�寚瀹氱殑usb绔�彛
+	//nType 1 鏀堕摱鎵撳嵃 2鏍囩�鎵撳嵃
 	bool InitOneUsb(std::wstring usb_path, int nType);
 
 	bool InitBingkou();
 	void InitCom();
 
-	//获取USB打印机的路径,用于收银小票打印机的智能识别,也用于设置中心获取所有打印机
+	//鑾峰彇USB鎵撳嵃鏈虹殑璺�緞锛岀敤浜庢敹閾跺皬绁ㄦ墦鍗版満鐨勬櫤鑳借瘑鍒�紝涔熺敤浜庤�缃�腑蹇冭幏鍙栨墍鏈夋墦鍗版満
 	int GetDevicePath(LPGUID lpGuid, std::vector<std::wstring>& usb_devices);
 
-	void AddStopNum();
-
 private:
 	std::queue<std::string> m_shouyin_printer_queue;
 	std::queue<std::string> m_biaoqian_printer_queue;
@@ -77,15 +73,12 @@ private:
 
 	bool m_is_work;
 
-	int m_nStopNum = 0;
-	std::mutex m_nStopNumMutex;
-
-	//收银小票打印的句柄组合
+	//鏀堕摱灏忕エ鎵撳嵃鐨勫彞鏌勭粍鍚�
 	std::vector<HANDLE> m_hShouyinPorts;
 
-	//标签小票打印的句柄组合
+	//鏍囩�灏忕エ鎵撳嵃鐨勫彞鏌勭粍鍚�
 	std::vector<HANDLE> m_hBiaoqianPorts;
 
-	//usb打印机的描述集合,用于收银小票打印机的智能识别模式
+	//usb鎵撳嵃鏈虹殑鎻忚堪闆嗗悎锛岀敤浜庢敹閾跺皬绁ㄦ墦鍗版満鐨勬櫤鑳借瘑鍒�ā寮�
 	std::vector<std::wstring> m_usb_devices;
 };

+ 0 - 143
zhipuzi_pos_windows/worker/CVideoCaptureWorker.cpp

@@ -1,143 +0,0 @@
-#include "../pch/pch.h"
-#include "CVideoCaptureWorker.h"
-#include "../tool/CAppEnv.h"
-
-CVideoCaptureWorker::CVideoCaptureWorker()
-{
-
-}
-
-CVideoCaptureWorker::~CVideoCaptureWorker()
-{
-	
-}
-
-//开始工作
-void CVideoCaptureWorker::Start()
-{
-	m_is_work = true;
-
-
-	//持续获取摄像头数据,直到程序退出,这里开启一个线程来处理摄像头数据的获取,避免阻塞主线程
-	std::thread(&CVideoCaptureWorker::HandleVideoCapture, this).detach();
-	CAppEnv::GetInstance()->AddWorkerNum();
-}
-
-//停止工作
-void CVideoCaptureWorker::Stop()
-{
-    m_is_work = false;
-}
-
-// 新增:自动检测可用摄像头索引
-int CVideoCaptureWorker::findAvailableCamera()
-{
-    for (int i = 0; i < 10; i++)
-    { 
-		// 检测前10个索引
-        cv::VideoCapture tempCap(i, cv::CAP_DSHOW);
-        if (tempCap.isOpened())
-        {
-            tempCap.release();
-
-            return i;
-        }
-    }
-    return -1;
-}
-
-void CVideoCaptureWorker::HandleVideoCapture()
-{
-    int cameraIndex = findAvailableCamera();
-    if (cameraIndex == -1)
-    {
-		CLewaimaiLog::OutputDebugMessage("未找到任何可用摄像头!");
-        return;
-    }
-
-    cv::VideoCapture cap(cameraIndex, cv::CAP_DSHOW);
-    if (!cap.isOpened())
-    {
-        CSystem::my_sleep(1);
-		CLewaimaiLog::OutputDebugMessage("打开摄像头失败,正在重试...");
-        
-        return;
-    }
-
-	CLewaimaiLog::OutputDebugMessage("摄像头打开成功!");
-
-    /*
-    160×120(QQVGA):适用于低带宽或嵌入式场景,资源占用极低
-    320×240(QVGA):轻量级视频传输常用,适合实时性要求高的应用
-    640×480(VGA):OpenCV 默认常用分辨率,兼容性强,广泛用于基础图像处理
-    800×600(SVGA):中等清晰度,适用于需要细节但不追求高清的场景
-    1024×768(XGA):较高清分辨率,适合文档扫描或静态图像采集
-    1280×720(720p HD):标准高清分辨率,广泛用于人脸识别、目标检测等视觉任务
-    1920×1080(1080p Full HD):全高清分辨率,提供高质量图像,适用于高精度视觉分析
-    */
-    int width = 800;
-    int height = 600;
-
-    cap.set(cv::CAP_PROP_FRAME_WIDTH, width);
-    cap.set(cv::CAP_PROP_FRAME_HEIGHT, height);
-
-    // 验证设置是否成功
-    double actualWidth = cap.get(cv::CAP_PROP_FRAME_WIDTH);
-    double actualHeight = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
-
-    std::cout << "设置的分辨率: " << width << " x " << height << std::endl;
-    std::cout << "实际分辨率: " << actualWidth << " x " << actualHeight << std::endl;
-
-	//CLewaimaiLog::OutputMessageBoxFormat(L"摄像头分辨率设置为: %d x %d\n实际分辨率: %.0f x %.0f", width, height, actualWidth, actualHeight);
-
-	// ========== 关键硬件参数:解决反光过曝发白 ==========
-	// 1. 关闭自动曝光(必须,否则强光自动提亮加重发白)
-	cap.set(cv::CAP_PROP_AUTO_EXPOSURE, 0);
-	// 2. 手动降低曝光值,数值越小进光越少,根据相机微调
-	cap.set(cv::CAP_PROP_EXPOSURE, -6);
-	// 3. 降低增益ISO,减少高光噪点饱和
-	//cap.set(cv::CAP_PROP_GAIN, 1);
-	// 4. 提高对比度,拉开明暗层次
-	//cap.set(cv::CAP_PROP_CONTRAST, 70);
-	// 5. 关闭自动白平衡,防止反光泛白
-	//cap.set(cv::CAP_PROP_AUTO_WB, 0);
-	// 手动色温,调低减少冷白反光
-	//cap.set(cv::CAP_PROP_WB_TEMPERATURE, 3300);
-	// 降低饱和度,高光不易一片惨白
-	//cap.set(cv::CAP_PROP_SATURATION, 40);
-
-    while (m_is_work == true)
-    {
-        // 读取摄像头帧
-        cap >> m_frame;
-
-        if (m_frame.empty())
-        {
-			CLewaimaiLog::OutputDebugMessage("读取摄像头帧失败,正在重试...");
-            CSystem::my_sleep(1);
-            continue;
-        }
-
-		// 控制帧率,避免占用过多CPU资源,这里设置为30帧每秒
-		Sleep(1000 / 30);
-
-		//什么都不用做,只需要把摄像头读取的帧放在成员变量里就行,后续其他地方需要用到摄像头数据的时候直接从成员变量里取就行了
-        // 显示摄像头帧(可选)
-        //cv::imshow("Camera", m_frame);
-		//if (cv::waitKey(30) >= 0) break; // 按任意键退出
-    }
-
-    // 程序走到这里,说明收银系统被退出了,这里不释放资源也无所谓了,释放资源太慢了要卡住几百毫秒
-    //cap.release();
-    //cv::destroyAllWindows();
-
-	//走到这里说明线程要退出了,做一些清理工作
-	CAppEnv::GetInstance()->DelWorkerNum();
-
-    return;
-}
-
-void CVideoCaptureWorker::GetFrame(cv::Mat& frame)
-{
-    frame = m_frame.clone();
-}

+ 0 - 36
zhipuzi_pos_windows/worker/CVideoCaptureWorker.h

@@ -1,36 +0,0 @@
-#pragma once
-
-#include <opencv2/opencv.hpp>
-#include <opencv2/dnn.hpp>
-
-//这个Worker只负责从摄像头读取图像数据,不负责进行任何处理
-class CVideoCaptureWorker
-{
-public:
-	CVideoCaptureWorker();
-	~CVideoCaptureWorker();
-
-	static CVideoCaptureWorker * GetInstance()
-	{
-		static CVideoCaptureWorker instance;
-
-		return &instance;
-	}
-
-	//开始工作
-	void Start();
-	
-	//停止工作
-	void Stop();
-
-	void HandleVideoCapture();
-
-	void GetFrame(cv::Mat& frame);
-
-	int findAvailableCamera();
-
-private:
-	bool m_is_work;
-
-	cv::Mat m_frame;
-};

+ 16 - 27
zhipuzi_pos_windows/worker/CVoiceWorker.cpp

@@ -5,36 +5,34 @@
 
 #include "../helper/CSpeech.h"
 
+#include "../tool/CAppEnv.h"
+
+CVoiceWorker::CVoiceWorker()
+{
+
+}
+
+CVoiceWorker::~CVoiceWorker()
+{
+
+}
+
 void CVoiceWorker::Start()
 {
 	m_is_work = true;
 
-	m_nStopNum = 0;
-
 	//处理声音提醒
 	std::thread(&CVoiceWorker::HandleVoice, this).detach();
+	CAppEnv::GetInstance()->AddWorkerNum();
 
 	//处理文字转语音
 	std::thread(&CVoiceWorker::HandleVoiceContent, this).detach();
+	CAppEnv::GetInstance()->AddWorkerNum();
 }
 
 void CVoiceWorker::Stop()
 {
 	m_is_work = false;
-
-	m_voice_mutex.lock();
-
-	while (!m_voice_queue.empty())
-	{
-		m_voice_queue.pop();
-	}
-
-	while (!m_voice_content_queue.empty())
-	{
-		m_voice_content_queue.pop();
-	}
-
-	m_voice_mutex.unlock();
 }
 
 void CVoiceWorker::AddVoice(int voice_type)
@@ -110,7 +108,7 @@ void CVoiceWorker::HandleVoice()
 		//CSystem::my_sleep(8);
 	}
 
-	AddStopNum();
+	CAppEnv::GetInstance()->DelWorkerNum();
 }
 
 //处理文字转语音的
@@ -139,14 +137,5 @@ void CVoiceWorker::HandleVoiceContent()
 		CSpeech::MSSSpeak(ws_content.c_str());
 	}
 
-	AddStopNum();
-}
-
-void CVoiceWorker::AddStopNum()
-{
-	m_nStopNumMutex.lock();
-
-	m_nStopNum++;
-
-	m_nStopNumMutex.unlock();
+	CAppEnv::GetInstance()->DelWorkerNum();
 }

+ 11 - 19
zhipuzi_pos_windows/worker/CVoiceWorker.h

@@ -1,11 +1,14 @@
-#pragma once
+锘�#pragma once
 
 #include "../pch/pch.h"
 
-//这个类专门用于处理声音的播报
+//杩欎釜绫讳笓闂ㄧ敤浜庡�鐞嗗0闊崇殑鎾�姤
 class CVoiceWorker
 {
 public:
+	CVoiceWorker();
+	~CVoiceWorker();
+
 	static CVoiceWorker* GetInstance()
 	{
 		static CVoiceWorker instance;
@@ -13,40 +16,29 @@ public:
 		return &instance;
 	}
 
-	//开始工作
+	//寮€濮嬪伐浣�
 	void Start();
 
-	//停止工作
+	//鍋滄�宸ヤ綔
 	void Stop();
 
-	//队列处理
+	//闃熷垪澶勭悊
 	void HandleVoice();
 
-	//处理文字转语音的
+	//澶勭悊鏂囧瓧杞��闊崇殑
 	void HandleVoiceContent();
 
 	/*
-	 *类型 1:新外卖订单 2:新外卖订单自动接单 3:外卖订单取消 4:外卖订单退款 5:新的快餐扫码下单订单 6:正餐扫码下单H5点菜
+	 *绫诲瀷 1锛氭柊澶栧崠璁㈠崟 2锛氭柊澶栧崠璁㈠崟鑷�姩鎺ュ崟 3锛氬�鍗栬�鍗曞彇娑� 4锛氬�鍗栬�鍗曢€€娆� 5锛氭柊鐨勫揩椁愭壂鐮佷笅鍗曡�鍗� 6锛氭�椁愭壂鐮佷笅鍗旽5鐐硅彍
 	 **/
 	void AddVoice(int voice_type);
 
-	//文字转语音播放
+	//鏂囧瓧杞��闊虫挱鏀�
 	void AddVoice(std::string voiceContent);
 
-private:
-	CVoiceWorker()
-	{
-
-	}
-
-	void AddStopNum();
-
 private:
 	bool m_is_work;
 
-	int m_nStopNum = 0;
-	std::mutex m_nStopNumMutex;
-
 	std::queue<int> m_voice_queue;
 
 	std::queue<std::string> m_voice_content_queue;

+ 5 - 5
zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj

@@ -250,7 +250,7 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     <ClInclude Include="page\CAIxuexiPageUI.h" />
     <ClInclude Include="ui\TouchWindowBase.h" />
     <ClInclude Include="worker\CDiandanAIShibieWorker.h" />
-    <ClInclude Include="worker\CVideoCaptureWorker.h" />
+    <ClInclude Include="tool\CVideoCapture.h" />
     <ClInclude Include="sqlite3\sqlite-vec.h" />
     <ClInclude Include="sqlite3\sqlite3.h" />
     <ClInclude Include="sqlite3\sqlite3ext.h" />
@@ -306,7 +306,7 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     <ClInclude Include="page\CDianneiOrderListPageUI.h" />
     <ClInclude Include="worker\CChengzhongWorker.h" />
     <ClInclude Include="print\CPosPrinter.h" />
-    <ClInclude Include="print\CPosPrinterQueue.h" />
+    <ClInclude Include="worker\CPosPrinterWorker.h" />
     <ClInclude Include="wnd\CGuadanWnd.h" />
     <ClInclude Include="wnd\CModalWnd.h" />
     <ClInclude Include="wnd\CChengzhongWnd.h" />
@@ -363,7 +363,7 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     <ClInclude Include="network\CZhipuziHttpClient.h" />
     <ClInclude Include="helper\CLewaimaiString.h" />
     <ClInclude Include="helper\CRandomHelper.h" />
-    <ClInclude Include="helper\define.h" />
+    <ClInclude Include="pch\define.h" />
     <ClInclude Include="network\CHttpClient.h" />
     <ClInclude Include="control\ControlEx.h" />
     <ClInclude Include="resource\resource.h" />
@@ -382,7 +382,7 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     <ClCompile Include="page\CAIxuexiPageUI.cpp" />
     <ClCompile Include="ui\TouchWindowBase.cpp" />
     <ClCompile Include="worker\CDiandanAIShibieWorker.cpp" />
-    <ClCompile Include="worker\CVideoCaptureWorker.cpp" />
+    <ClCompile Include="tool\CVideoCapture.cpp" />
     <ClCompile Include="sqlite3\shell.c" />
     <ClCompile Include="sqlite3\sqlite-vec.c" />
     <ClCompile Include="sqlite3\sqlite3.c" />
@@ -438,7 +438,7 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     <ClCompile Include="page\CDianneiOrderListPageUI.cpp" />
     <ClCompile Include="worker\CChengzhongWorker.cpp" />
     <ClCompile Include="print\CPosPrinter.cpp" />
-    <ClCompile Include="print\CPosPrinterQueue.cpp" />
+    <ClCompile Include="worker\CPosPrinterWorker.cpp" />
     <ClCompile Include="wnd\CGuadanWnd.cpp" />
     <ClCompile Include="wnd\CModalWnd.cpp" />
     <ClCompile Include="wnd\CChengzhongWnd.cpp" />

+ 5 - 5
zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj.filters

@@ -27,7 +27,7 @@
     <ClInclude Include="helper\CRandomHelper.h">
       <Filter>头文件</Filter>
     </ClInclude>
-    <ClInclude Include="helper\define.h">
+    <ClInclude Include="pch\define.h">
       <Filter>头文件</Filter>
     </ClInclude>
     <ClInclude Include="helper\MD5.h">
@@ -201,7 +201,7 @@
     <ClInclude Include="print\CPosPrinterData.h">
       <Filter>头文件</Filter>
     </ClInclude>
-    <ClInclude Include="print\CPosPrinterQueue.h">
+    <ClInclude Include="worker\CPosPrinterWorker.h">
       <Filter>头文件</Filter>
     </ClInclude>
     <ClInclude Include="print\CPosPrinter.h">
@@ -384,7 +384,7 @@
     <ClInclude Include="ai\YoloFeatureManager.h">
       <Filter>头文件</Filter>
     </ClInclude>
-    <ClInclude Include="worker\CVideoCaptureWorker.h">
+    <ClInclude Include="tool\CVideoCapture.h">
       <Filter>头文件</Filter>
     </ClInclude>
     <ClInclude Include="ai\YoloClassName.h">
@@ -575,7 +575,7 @@
     <ClCompile Include="print\CPosPrinterData.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
-    <ClCompile Include="print\CPosPrinterQueue.cpp">
+    <ClCompile Include="worker\CPosPrinterWorker.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
     <ClCompile Include="print\CPosPrinter.cpp">
@@ -752,7 +752,7 @@
     <ClCompile Include="ai\YoloFeatureManager.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
-    <ClCompile Include="worker\CVideoCaptureWorker.cpp">
+    <ClCompile Include="tool\CVideoCapture.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
     <ClCompile Include="worker\CDiandanAIShibieWorker.cpp">