张洋 hai 1 ano
pai
achega
8004bd7fa4

+ 92 - 22
zhipuzi_pos_windows/worker/CMqttClientWorker.cpp

@@ -33,7 +33,13 @@ void CMqttClientWorker::Start()
 
 void CMqttClientWorker::Stop()
 {
-    m_is_running = false; 
+    m_is_running = false;
+
+	//等待进程结束
+	while (m_nStopNum < 1)
+	{
+		Sleep(50);
+	}
 }
 
 void CMqttClientWorker::Run()
@@ -242,19 +248,37 @@ void CMqttClientWorker::HandleMessage(std::string message)
 		return;
 	}
 
-	rapidjson::Value& data = document["data"];
+	if (!document.HasMember("version"))
+	{
+		return;
+	}
+
+	std::string version = CLewaimaiJson::ToString(document["version"]);
+	if (version < "1.0")
+	{
+		return;
+	}
 
-	int type = CLewaimaiJson::ToInt(data["msg_type"]);
+	std::string timestamp = CLewaimaiJson::ToString(document["timestamp"]);
+	long int int_timesteamp = atol(timestamp.c_str());
 
-	if (type == MESSAGE_TYPE::LOGIN_OFFLINE)
+	time_t now = time(NULL);
+
+	if (now - int_timesteamp > 60 * 3)
 	{
-		//这个表示被人挤下线了
-		PostMessage(m_hwnd, WM_LOGIN_AGAIN_OUT, 0, 0);
+		//大于3分钟的消息直接丢弃
+		return;
 	}
-	else if (type == MESSAGE_TYPE::NEW_WAIMAI_ORDER)
+
+	rapidjson::Value& data = document["body"];
+
+	std::string type = CLewaimaiJson::ToString(data["order_type"]);
+
+	if (type == "waimai")
 	{
-		std::string order_id = CLewaimaiJson::ToString(data["waimai_order_id"]);
-		std::string order_no = CLewaimaiJson::ToString(data["waimai_order_no"]);
+		//外卖新订单(非预约单,或者预约单快到时间了)
+		std::string order_id = CLewaimaiJson::ToString(data["order_id"]);
+		std::string order_no = CLewaimaiJson::ToString(data["order_no"]);
 
 		//新订单来了,首先判断是否要语音提醒
 		if (CSetting::GetInstance()->GetParam("setting_is_new_waimai_voice") == "1")
@@ -278,17 +302,38 @@ void CMqttClientWorker::HandleMessage(std::string message)
 		CPosPrinter printer;
 		printer.PrintWaimaiOrder(order_id, order_no);
 	}
-	else if (type == MESSAGE_TYPE::QUXIAO_WAIMAI_ORDER)
+	else if (type == "waimai_yuyue_notify")
 	{
+		//外卖新订单(预约单的通知)
+		std::string order_id = CLewaimaiJson::ToString(data["order_id"]);
+		std::string order_no = CLewaimaiJson::ToString(data["order_no"]);
+
+		//新订单来了,首先判断是否要语音提醒
+		if (CSetting::GetInstance()->GetParam("setting_is_new_waimai_voice") == "1")
+		{
+			CVoiceWorker::GetInstance()->AddVoice(1);
+		}
+
+		//判断是否要自动确认
+		if (CSetting::GetInstance()->GetParam("setting_is_new_waimai_autoconfirm") == "1")
+		{
+			CCommonWorker::GetInstance()->AddConfirm(order_id);
+		}
+	}
+	else if (type == "waimai_cancel")
+	{
+		//取消外卖订单
 		CVoiceWorker::GetInstance()->AddVoice(3);
 	}
-	else if (type == MESSAGE_TYPE::REFUND_WAIMAI_ORDER)
+	else if (type == "waimai_order_refund")
 	{
+		//外卖订单退款
 		CVoiceWorker::GetInstance()->AddVoice(4);
 	}
-	else if (type == MESSAGE_TYPE::NEW_KAUICANTANGSHI_ORDER)
+	else if (type == "tangshi")
 	{
-		std::string order_id = CLewaimaiJson::ToString(data["waimai_order_id"]);
+		//快餐扫码下单
+		std::string order_id = CLewaimaiJson::ToString(data["order_id"]);
 
 		//新订单来了,首先判断是否要语音提醒
 		if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_voice") == "1")
@@ -302,9 +347,10 @@ void CMqttClientWorker::HandleMessage(std::string message)
 			printer.PrintDiandanOrder(order_id);
 		}
 	}
-	else if (type == MESSAGE_TYPE::NEW_KUAICANSHANGJIAAPP_ORDER)
+	else if (type == "kuaican")
 	{
-		std::string order_id =  CLewaimaiJson::ToString(data["waimai_order_id"]);
+		//新的快餐订单,商家app下单
+		std::string order_id =  CLewaimaiJson::ToString(data["order_id"]);
 
 		//新订单来了,首先判断是否要语音提醒
 		if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_voice") == "1")
@@ -318,9 +364,10 @@ void CMqttClientWorker::HandleMessage(std::string message)
 			printer.PrintDiandanOrder(order_id);
 		}
 	}
-	else if (type == MESSAGE_TYPE::NEW_ZHENGCAN_JIACAI)
+	else if (type == "zhengcan_jiacai")
 	{
-		std::string order_id = CLewaimaiJson::ToString(data["waimai_order_id"]);
+		//这个是通过商家app加菜,或者H5加菜被商家app确认,提醒收银系统去打印
+		std::string order_id = CLewaimaiJson::ToString(data["order_id"]);
 		std::string jiacai_no = CLewaimaiJson::ToString(data["jiacai_no"]);
 
 		if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_saomadiancan_printer") == "1")
@@ -329,16 +376,18 @@ void CMqttClientWorker::HandleMessage(std::string message)
 			printer.PrintZhengcanOrderXiadan(order_id, jiacai_no);
 		}
 	}
-	else if (type == MESSAGE_TYPE::NEW_ZHENGCAN_H5_JIACAI)
+	else if (type == "zhengcan_jiacai_h5")
 	{
+		//通过扫码下单加菜,还没确认,提醒收银系统确认
 		CVoiceWorker::GetInstance()->AddVoice(6);
 
 		//同时自动刷新桌位
 		PostMessage(m_hwnd, WM_ZHENGCAN_SAOMADIANCAI_XIADAN, 0, 0);
 	}
-	else if (type == MESSAGE_TYPE::NEW_ZHENGCAN_TUICAI)
+	else if (type == "zhengcan_tuicai")
 	{
-		std::string order_id = CLewaimaiJson::ToString(data["waimai_order_id"]);
+		//正餐退菜
+		std::string order_id = CLewaimaiJson::ToString(data["order_id"]);
 		std::string tuicai_item_id = CLewaimaiJson::ToString(data["tuicai_item_id"]);
 
 		if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_saomadiancan_printer") == "1")
@@ -347,9 +396,10 @@ void CMqttClientWorker::HandleMessage(std::string message)
 			printer.PrintZhengcanOrderTuicai(order_id, tuicai_item_id);
 		}
 	}
-	else if (type == MESSAGE_TYPE::NEW_ZHENGCAN_JIESUAN)
+	else if (type == "zhengcan_jiesuan")
 	{
-		std::string order_id = CLewaimaiJson::ToString(data["waimai_order_id"]);
+		//推送正餐收银订单H5上支付成功的消息给收银机,收银打印结算小票
+		std::string order_id = CLewaimaiJson::ToString(data["order_id"]);
 
 		if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_saomadiancan_printer") == "1")
 		{
@@ -357,6 +407,26 @@ void CMqttClientWorker::HandleMessage(std::string message)
 			printer.PrintZhengcanOrderJiesuan(order_id);
 		}
 	}
+	else if (type == "shouyintai_order")
+	{
+		std::string content = CLewaimaiJson::ToString(data["content"]);
+
+		CVoiceWorker::GetInstance()->AddVoice(content);
+	}
+	else if (type == "tangshi_service")
+	{
+		std::string content = CLewaimaiJson::ToString(data["content"]);
+
+		CVoiceWorker::GetInstance()->AddVoice(content);
+	}
+	else if (type == "yuyue_order")
+	{
+		//预约功能的预约单,不是外卖的预约单
+		std::string order_id = CLewaimaiJson::ToString(data["order_id"]);
+		std::string content = CLewaimaiJson::ToString(data["content"]);
+
+		CVoiceWorker::GetInstance()->AddVoice(content);
+	}
 }
 
 void CMqttClientWorker::AddStopNum()

+ 0 - 17
zhipuzi_pos_windows/worker/CMqttClientWorker.h

@@ -11,23 +11,6 @@
 #include <chrono>
 #include "mqtt/async_client.h"
 
-enum MESSAGE_TYPE
-{
-	LOGIN_OFFLINE = 0,
-
-	NEW_WAIMAI_ORDER = 1,
-	QUXIAO_WAIMAI_ORDER = 2,
-	REFUND_WAIMAI_ORDER = 3,
-
-	NEW_KAUICANTANGSHI_ORDER = 4,
-	NEW_KUAICANSHANGJIAAPP_ORDER = 5, //商家app下单的,自动打印
-
-	NEW_ZHENGCAN_JIACAI = 6, //正餐加菜成功
-	NEW_ZHENGCAN_H5_JIACAI = 7, //正餐扫码下单加菜
-	NEW_ZHENGCAN_TUICAI = 8, //正餐通过商家app退菜成功
-	NEW_ZHENGCAN_JIESUAN = 9, //正餐通过H5或者商家app结算成功
-};
-
 class CMqttClientWorker : public virtual mqtt::callback,
     public virtual mqtt::iaction_listener
 {

+ 57 - 0
zhipuzi_pos_windows/worker/CVoiceWorker.cpp

@@ -3,6 +3,8 @@
 
 #include "mmsystem.h"
 
+#include "../helper/CSpeech.h"
+
 void CVoiceWorker::Start()
 {
 	m_is_work = true;
@@ -11,6 +13,9 @@ void CVoiceWorker::Start()
 
 	//处理声音提醒
 	std::thread(&CVoiceWorker::HandleVoice, this).detach();
+
+	//处理文字转语音
+	std::thread(&CVoiceWorker::HandleVoiceContent, this).detach();
 }
 
 void CVoiceWorker::Stop()
@@ -18,11 +23,24 @@ 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();
+
+	//等待进程结束
+	while (m_nStopNum < 2)
+	{
+		Sleep(50);
+	}
 }
 
 void CVoiceWorker::AddVoice(int voice_type)
@@ -34,6 +52,16 @@ void CVoiceWorker::AddVoice(int voice_type)
 	m_voice_mutex.unlock();
 }
 
+//文字转语音播放
+void CVoiceWorker::AddVoice(std::string voiceContent)
+{
+	m_voice_mutex.lock();
+
+	m_voice_content_queue.push(voiceContent);
+
+	m_voice_mutex.unlock();
+}
+
 void CVoiceWorker::HandleVoice()
 {
 	while (m_is_work)
@@ -91,6 +119,35 @@ void CVoiceWorker::HandleVoice()
 	AddStopNum();
 }
 
+//处理文字转语音的
+void CVoiceWorker::HandleVoiceContent()
+{
+	while (m_is_work)
+	{
+		m_voice_mutex.lock();
+
+		if (m_voice_content_queue.empty())
+		{
+			m_voice_mutex.unlock();
+
+			CSystem::my_sleep(1);
+			continue;
+		}
+
+		std::string content = m_voice_content_queue.front();
+		m_voice_content_queue.pop();
+
+		m_voice_mutex.unlock();
+
+		//进行播放
+		std::wstring ws_content = CLewaimaiString::UTF8ToUnicode(content);
+
+		CSpeech::MSSSpeak(ws_content.c_str());
+	}
+
+	AddStopNum();
+}
+
 void CVoiceWorker::AddStopNum()
 {
 	m_nStopNumMutex.lock();

+ 8 - 0
zhipuzi_pos_windows/worker/CVoiceWorker.h

@@ -24,11 +24,17 @@ public:
 	//队列处理
 	void HandleVoice();
 
+	//处理文字转语音的
+	void HandleVoiceContent();
+
 	/*
 	 *类型 1:新外卖订单 2:新外卖订单自动接单 3:外卖订单取消 4:外卖订单退款 5:新的快餐扫码下单订单 6:正餐扫码下单H5点菜
 	 **/
 	void AddVoice(int voice_type);
 
+	//文字转语音播放
+	void AddVoice(std::string voiceContent);
+
 private:
 	CVoiceWorker()
 	{
@@ -45,5 +51,7 @@ private:
 
 	std::queue<int> m_voice_queue;
 
+	std::queue<std::string> m_voice_content_queue;
+
 	std::mutex m_voice_mutex;
 };