Parcourir la source

设置中心的完成了

zhangyang il y a 5 ans
Parent
commit
ffe5ff69dd

+ 20 - 0
zhipuzi_pay_plugin/tool/CSetting.cpp

@@ -219,6 +219,26 @@ void CSetting::Init()
 		m_paramsMap[system_setting_dayinji_wangkou_ip] = "";
 	}
 
+	/*收款设置相关的*/
+	std::string shoukuan_setting_fubiao = "shoukuan_setting_fubiao";
+	if (m_paramsMap.find(shoukuan_setting_fubiao) == m_paramsMap.end())
+	{
+		m_paramsMap[shoukuan_setting_fubiao] = "1";
+	}
+
+	std::string shoukuan_setting_yuyinbobao = "shoukuan_setting_yuyinbobao";
+	if (m_paramsMap.find(shoukuan_setting_yuyinbobao) == m_paramsMap.end())
+	{
+		m_paramsMap[shoukuan_setting_yuyinbobao] = "1";
+	}
+
+	std::string shoukuan_setting_mianqueren = "shoukuan_setting_mianqueren";
+	if (m_paramsMap.find(shoukuan_setting_mianqueren) == m_paramsMap.end())
+	{
+		//默认不开启收款免确认
+		m_paramsMap[shoukuan_setting_mianqueren] = "0";
+	}
+
 	//当前的上班状态
 	std::string jiaoban_is_work = "jiaoban_is_work";
 	if (m_paramsMap.find(jiaoban_is_work) == m_paramsMap.end())

+ 36 - 3
zhipuzi_pay_plugin/wnd/CShoukuanWnd.cpp

@@ -348,6 +348,27 @@ void CShoukuanWnd::InitMoney(std::wstring value)
 	m_money = value;
 }
 
+void CShoukuanWnd::InitFukuanma(std::string fukuanma)
+{
+	std::wstring ws_fukuanma = CLewaimaiString::UTF8ToUnicode(fukuanma);
+
+	CLabelUI* pFukuanmaLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("fukuanma_edit")));
+	if (pFukuanmaLabel)
+	{
+		pFukuanmaLabel->SetText(ws_fukuanma.c_str());
+	}
+
+	std::string shoukuan_setting_mianqueren = CSetting::GetParam("shoukuan_setting_mianqueren");
+	if (shoukuan_setting_mianqueren == "1")
+	{
+		if (m_is_money_init)
+		{
+			//如果金额也是初始化好的,可以直接支付了
+			this->StartShoukuan();
+		}
+	}
+}
+
 void CShoukuanWnd::UpdateFocus()
 {
 	if (m_is_money_init == false)
@@ -374,7 +395,11 @@ void CShoukuanWnd::UpdateFocus()
 LRESULT CShoukuanWnd::OnShoukuanNeedPassword(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 {
 	wstring path = CSystem::GetProgramDir() + L"\\music\\pay_password.wav";
-	PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+
+	if (CSetting::GetParam("shoukuan_setting_yuyinbobao") == "1")
+	{
+		PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+	}
 
 	CLabelUI* pFukuanEdit = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuan_paying_status")));
 	pFukuanEdit->SetText(L"用户支付中,需要输入密码");
@@ -396,7 +421,11 @@ LRESULT CShoukuanWnd::OnShoukuanSuccess(UINT uMsg, WPARAM wParam, LPARAM lParam,
 	}
 
 	wstring path = CSystem::GetProgramDir() + L"\\music\\pay_success.wav";
-	PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+
+	if (CSetting::GetParam("shoukuan_setting_yuyinbobao") == "1")
+	{
+		PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+	}
 
 	CVerticalLayoutUI* paying_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_paying_layout")));
 	paying_layout->SetVisible(false);
@@ -437,7 +466,11 @@ LRESULT CShoukuanWnd::OnShoukuanSuccess(UINT uMsg, WPARAM wParam, LPARAM lParam,
 LRESULT CShoukuanWnd::OnShoukuanFail(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 {
 	wstring path = CSystem::GetProgramDir() + L"\\music\\pay_fail.wav";
-	PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+
+	if (CSetting::GetParam("shoukuan_setting_yuyinbobao") == "1")
+	{
+		PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+	}
 
 	CVerticalLayoutUI* paying_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_paying_layout")));
 	paying_layout->SetVisible(false);

+ 2 - 0
zhipuzi_pay_plugin/wnd/CShoukuanWnd.h

@@ -71,6 +71,8 @@ public:
 
 	void InitMoney(std::wstring value);
 
+	void InitFukuanma(std::string fukuanma);
+
 	void UpdateFocus();
 
 	//点击确认,开始执行收款

+ 70 - 0
zhipuzi_pay_plugin/wnd/CSystemSettingWnd.cpp

@@ -335,6 +335,50 @@ void CSystemSettingWnd::Init()
     CEditUI* ip_edit = static_cast<CEditUI*>(m_pm.FindControl(_T("dayinji_setting_wangkou_ip")));
     ip_edit->SetText(CLewaimaiString::UTF8ToUnicode(system_setting_dayinji_wangkou_ip).c_str());
 
+	//开始收款设置
+	CCheckBoxUI* kaijiqidong = static_cast<CCheckBoxUI*>(m_pm.FindControl(L"shoukuan_setting_kaijiqidong"));
+	if (CSystem::IsAutoStart())
+	{
+		kaijiqidong->SetCheck(true);
+	}
+	else
+	{
+		kaijiqidong->SetCheck(false);
+	}
+
+	std::string shoukuan_setting_fubiao = CSetting::GetParam("shoukuan_setting_fubiao");
+	CCheckBoxUI* fubiao = static_cast<CCheckBoxUI*>(m_pm.FindControl(L"shoukuan_setting_fubiao"));
+	if (shoukuan_setting_fubiao == "1")
+	{
+		fubiao->SetCheck(true);
+	}
+	else
+	{
+		fubiao->SetCheck(false);
+	}
+
+	CCheckBoxUI* yuyinbobao = static_cast<CCheckBoxUI*>(m_pm.FindControl(L"shoukuan_setting_yuyinbobao"));
+	std::string shoukuan_setting_yuyinbobao = CSetting::GetParam("shoukuan_setting_yuyinbobao");
+	if (shoukuan_setting_yuyinbobao == "1")
+	{
+		yuyinbobao->SetCheck(true);
+	}
+	else
+	{
+		yuyinbobao->SetCheck(false);
+	}
+
+	CCheckBoxUI* mianqueren = static_cast<CCheckBoxUI*>(m_pm.FindControl(L"shoukuan_setting_mianqueren"));
+	std::string shoukuan_setting_mianqueren = CSetting::GetParam("shoukuan_setting_mianqueren");
+	if (shoukuan_setting_mianqueren == "1")
+	{
+		mianqueren->SetCheck(true);
+	}
+	else
+	{
+		mianqueren->SetCheck(false);
+	}
+
     //初始化快捷键的展示
     UINT shoukuan_mod = (UINT)atoi(CSetting::GetParam("system_setting_kuaijiejian_shoukuan_mod").c_str());
     UINT shoukuan_vk = (UINT)atoi(CSetting::GetParam("system_setting_kuaijiejian_shoukuan_vk").c_str());
@@ -820,10 +864,36 @@ void CSystemSettingWnd::HandleClickMsg(TNotifyUI& msg)
 		if (fubiao->IsSelected())
 		{
 			m_valueWnd->ShowWindow(true);
+
+			CSetting::SetParam("shoukuan_setting_fubiao", "1");
 		}
 		else
 		{
 			m_valueWnd->ShowWindow(false);
+
+			CSetting::SetParam("shoukuan_setting_fubiao", "0");
+		}
+
+		//处理语音播报
+		CCheckBoxUI* yuyinbobao = static_cast<CCheckBoxUI*>(m_pm.FindControl(L"shoukuan_setting_yuyinbobao"));
+		if (yuyinbobao->IsSelected())
+		{
+			CSetting::SetParam("shoukuan_setting_yuyinbobao", "1");
+		}
+		else
+		{
+			CSetting::SetParam("shoukuan_setting_yuyinbobao", "0");
+		}
+
+		//处理收款免确认
+		CCheckBoxUI* mianqueren = static_cast<CCheckBoxUI*>(m_pm.FindControl(L"shoukuan_setting_mianqueren"));
+		if (mianqueren->IsSelected())
+		{
+			CSetting::SetParam("shoukuan_setting_mianqueren", "1");
+		}
+		else
+		{
+			CSetting::SetParam("shoukuan_setting_mianqueren", "0");
 		}
 	}
     else if(senderName == _T("kuaijiejian_setting_jiesuan_btn"))

+ 15 - 3
zhipuzi_pay_plugin/wnd/CTuikuanWnd.cpp

@@ -362,7 +362,11 @@ void CTuikuanWnd::UpdateFocus()
 LRESULT CTuikuanWnd::OnTuikuanNeedPassword(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 {
 	wstring path = CSystem::GetProgramDir() + L"\\music\\refund_query.wav";
-	PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+
+	if (CSetting::GetParam("shoukuan_setting_yuyinbobao") == "1")
+	{
+		PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+	}
 
 	CLabelUI* pFukuanEdit = static_cast<CLabelUI*>(m_pm.FindControl(_T("tuikuan_paying_status")));
 	pFukuanEdit->SetText(L"退款结果查询中...");
@@ -384,7 +388,11 @@ LRESULT CTuikuanWnd::OnTuikuanSuccess(UINT uMsg, WPARAM wParam, LPARAM lParam, B
 	}
 
 	wstring path = CSystem::GetProgramDir() + L"\\music\\refund_success.wav";
-	PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+
+	if (CSetting::GetParam("shoukuan_setting_yuyinbobao") == "1")
+	{
+		PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+	}
 
 	CVerticalLayoutUI* paying_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("tuikuan_paying_layout")));
 	paying_layout->SetVisible(false);
@@ -418,7 +426,11 @@ LRESULT CTuikuanWnd::OnTuikuanSuccess(UINT uMsg, WPARAM wParam, LPARAM lParam, B
 LRESULT CTuikuanWnd::OnTuikuanFail(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 {
 	wstring path = CSystem::GetProgramDir() + L"\\music\\refund_fail.wav";
-	PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+
+	if (CSetting::GetParam("shoukuan_setting_yuyinbobao") == "1")
+	{
+		PlaySound(path.c_str(), NULL, SND_FILENAME | SND_ASYNC);
+	}
 
 	CVerticalLayoutUI* paying_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("tuikuan_paying_layout")));
 	paying_layout->SetVisible(false);

+ 149 - 0
zhipuzi_pay_plugin/wnd/CValueWnd.cpp

@@ -11,6 +11,19 @@
 
 #include <atltypes.h>
 
+void RegKeyboardRawInput(HWND hWnd)
+{
+	RAWINPUTDEVICE rawInputDevice[1];
+	rawInputDevice[0].usUsagePage = 0x01;//设备类
+	rawInputDevice[0].usUsage = 0x06;//设备类内的具体设备
+	rawInputDevice[0].dwFlags = RIDEV_INPUTSINK;//意味着即使窗口失去焦点位置,仍然会一直接收输入消息
+	rawInputDevice[0].hwndTarget = hWnd;
+	if (RegisterRawInputDevices(rawInputDevice, 1, sizeof(rawInputDevice[0])) == FALSE)
+	{
+		printf("RegisterRawInputDevices failed");
+	}
+}
+
 void CValueWnd::Notify(TNotifyUI& msg)
 {
     if(msg.sType == _T("click"))
@@ -75,6 +88,8 @@ void CValueWnd::Init()
 
     //开始启动监听
     RestartWatch();
+
+	RegKeyboardRawInput(m_hWnd);
 }
 
 /*
@@ -429,6 +444,132 @@ LRESULT CValueWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
     return HTCLIENT;
 }
 
+LRESULT CValueWnd::OnInput(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	UINT dwSize = 0;
+	GetRawInputData((HRAWINPUT)lParam, (UINT)RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));//取数据,第一次调用函数将获取需要的字节大小		
+	LPBYTE lpbBuffer = new BYTE[dwSize];//分配指定的缓冲区大小
+	GetRawInputData((HRAWINPUT)lParam, (UINT)RID_INPUT, (LPVOID)lpbBuffer, (PUINT)&dwSize, (UINT)sizeof(RAWINPUTHEADER));//第二次调用获取原始输入数据,读入lpbBuffer
+
+	RAWINPUT * raw = (RAWINPUT *)lpbBuffer;
+	if (raw->header.dwType == RIM_TYPEKEYBOARD)//这里可以截获所有键盘信息,如需区分不同的键盘输入信息,可以通过设备句柄判断。
+	{
+		if (raw->data.keyboard.Message == WM_KEYDOWN)
+		{
+			
+		}
+		else if (raw->data.keyboard.Message == WM_KEYUP)
+		{
+			char keytext[10] = { 0 };
+			BYTE state[256] = { 0 };
+
+			//通过虚拟键盘码得到名字
+			ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
+
+			string a = keytext;
+
+			if (raw->data.keyboard.VKey >= 48 && raw->data.keyboard.VKey <= 57)
+			{
+				//只考虑数字
+				if (m_is_start_catch == false)
+				{
+					m_is_start_catch = true;
+
+					m_catch_string = "";
+
+					char keytext[10] = { 0 };
+					BYTE state[256] = { 0 };
+
+					//通过虚拟键盘码得到名字
+					ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
+
+					m_catch_string += string(keytext);
+
+					m_last_catch_clock = clock();
+				}
+				else
+				{
+					//已经是在抓取过程中了
+					clock_t now = clock();
+
+					double total_t = (double)(now - m_last_catch_clock) / CLOCKS_PER_SEC;
+					if (total_t > 0.05)
+					{
+						//如果超过了50ms,说明是人工输入的了,就重置所有状态
+						m_is_start_catch = false;
+
+						m_catch_string = "";
+					}
+					else
+					{
+						char keytext[10] = { 0 };
+						BYTE state[256] = { 0 };
+
+						//通过虚拟键盘码得到名字
+						ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
+
+						m_catch_string += string(keytext);
+
+						m_last_catch_clock = clock();
+					}
+				}
+			}
+			else if (raw->data.keyboard.VKey == 13)
+			{
+				//enter
+				std::string last = m_catch_string;
+
+				bool is_fukuanma = false;
+				//判断是不是正常的付款码格式
+				if (last.find("10") == 0 \
+					|| last.find("11") == 0 \
+					|| last.find("12") == 0 \
+					|| last.find("13") == 0 \
+					|| last.find("14") == 0 \
+					|| last.find("15") == 0)
+				{
+					//微信付款码
+					is_fukuanma = true;
+				}
+				else if (last.find("25") == 0 \
+					|| last.find("26") == 0 \
+					|| last.find("27") == 0 \
+					|| last.find("28") == 0 \
+					|| last.find("29") == 0 \
+					|| last.find("30") == 0)
+				{
+					//支付宝付款码
+					is_fukuanma = true;
+				}
+
+				if (is_fukuanma)
+				{
+					//得到一个合适的付款码
+					if (m_is_show_shoukuan == false)
+					{
+						ShowShoukuan();
+					}
+				}				
+
+				//不管是不是正常的付款码,收到enter后,这里都清空重来
+				m_is_start_catch = false;
+				m_catch_string = "";
+			}
+			else
+			{
+				//这种直接忽略,重新开始
+				m_is_start_catch = false;
+
+				m_catch_string = "";
+			}
+		}
+	}
+	delete[] lpbBuffer;
+
+	bHandled = true;
+	return 0;
+}
+
 LRESULT CValueWnd::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 {
 	pMenu->ShowWindow(false);
@@ -550,6 +691,9 @@ LRESULT CValueWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
 		lRes = OnHotKey(uMsg, wParam, lParam, bHandled);
 		break;
 
+	case WM_INPUT:
+		lRes = OnInput(uMsg, wParam, lParam, bHandled);
+		break;
     default:
         bHandled = FALSE;
     }
@@ -604,6 +748,11 @@ void CValueWnd::ShowShoukuan()
 			pShoukuanWnd->InitMoney(m_watchValue);
 		}
 
+		if (m_is_start_catch && m_catch_string.length() == 18)
+		{
+			pShoukuanWnd->InitFukuanma(m_catch_string);
+		}
+
 		UINT ret = pShoukuanWnd->ShowModal();
 
 		m_is_show_shoukuan = false;

+ 9 - 0
zhipuzi_pay_plugin/wnd/CValueWnd.h

@@ -54,6 +54,8 @@ public:
 
 	LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
 
+	LRESULT OnInput(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
 	LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
 
 	LRESULT OnRButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
@@ -192,5 +194,12 @@ private:
 	COcrWnd* pOcrWnd;
 
 	tesseract::TessBaseAPI m_tess;
+
+	//ץȡ¼üÅÌÊäÈëÏà¹ØµÄ
+	bool m_is_start_catch = false;
+
+	clock_t m_last_catch_clock;
+
+	std::string m_catch_string;
 };