Przeglądaj źródła

完成了所有优惠、价格计算

张洋 4 lat temu
rodzic
commit
b275ca860e
44 zmienionych plików z 2357 dodań i 49 usunięć
  1. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/dump/2021-11-18-18-53-47.dmp
  2. 22 0
      bin/Win32/Debug/zhipuzi_pos_windows/skin/canpai_input_dlg.xml
  3. 10 8
      bin/Win32/Debug/zhipuzi_pos_windows/skin/diandan_page.xml
  4. 14 14
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main.xml
  5. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_baobiao.png
  6. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_baobiao_select.png
  7. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_diandan.png
  8. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_diandan_select.png
  9. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_gengduo.png
  10. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_gengduo_select.png
  11. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_huiyuan.png
  12. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_huiyuan_select.png
  13. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_jiaoban.png
  14. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_jiaoban_select.png
  15. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_logo.png
  16. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_setting.png
  17. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_setting_select.png
  18. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_waimai.png
  19. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/main_waimai_select.png
  20. 24 0
      bin/Win32/Debug/zhipuzi_pos_windows/skin/saoma_cika_dlg.xml
  21. 24 0
      bin/Win32/Debug/zhipuzi_pos_windows/skin/saoma_quanyika_dlg.xml
  22. 24 0
      bin/Win32/Debug/zhipuzi_pos_windows/skin/saoma_shangpinquan_dlg.xml
  23. 24 0
      bin/Win32/Debug/zhipuzi_pos_windows/skin/saoma_youhuiquan_dlg.xml
  24. 1 0
      zhipuzi_pos_windows/network/CZhipuziHttpClient.cpp
  25. 267 13
      zhipuzi_pos_windows/page/CDiandanPageUI.cpp
  26. 20 1
      zhipuzi_pos_windows/page/CDiandanPageUI.h
  27. 194 0
      zhipuzi_pos_windows/wnd/CCanpaiWnd.cpp
  28. 69 0
      zhipuzi_pos_windows/wnd/CCanpaiWnd.h
  29. 5 3
      zhipuzi_pos_windows/wnd/CJiajiaWnd.cpp
  30. 38 0
      zhipuzi_pos_windows/wnd/CMainWnd.cpp
  31. 3 0
      zhipuzi_pos_windows/wnd/CMainWnd.h
  32. 6 4
      zhipuzi_pos_windows/wnd/CMemberLoginWnd.cpp
  33. 5 3
      zhipuzi_pos_windows/wnd/CRengongYouhuiWnd.cpp
  34. 326 0
      zhipuzi_pos_windows/wnd/CSaomaCikaWnd.cpp
  35. 85 0
      zhipuzi_pos_windows/wnd/CSaomaCikaWnd.h
  36. 302 0
      zhipuzi_pos_windows/wnd/CSaomaQuanyikaWnd.cpp
  37. 74 0
      zhipuzi_pos_windows/wnd/CSaomaQuanyikaWnd.h
  38. 304 0
      zhipuzi_pos_windows/wnd/CSaomaShangpinquanWnd.cpp
  39. 76 0
      zhipuzi_pos_windows/wnd/CSaomaShangpinquanWnd.h
  40. 318 0
      zhipuzi_pos_windows/wnd/CSaomaYouhuiquanWnd.cpp
  41. 77 0
      zhipuzi_pos_windows/wnd/CSaomaYouhuiquanWnd.h
  42. 5 3
      zhipuzi_pos_windows/wnd/CZhekouWnd.cpp
  43. 10 0
      zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj
  44. 30 0
      zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj.filters

BIN
bin/Win32/Debug/zhipuzi_pos_windows/dump/2021-11-18-18-53-47.dmp


+ 22 - 0
bin/Win32/Debug/zhipuzi_pos_windows/skin/canpai_input_dlg.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Window size="700,369" caption="0,0,0,36" roundcorner="4,4" >
+	<Font id="0" name="微软雅黑" size="26" />
+	<Font id="1" name="微软雅黑" size="32" />
+	
+	<VerticalLayout bkcolor="#FFFFFFFF">
+		<HorizontalLayout height="50" inset="10,2,10,0">
+			<Label name="memo_dlg_title" text="" align="center" valign="center" padding="0,20,0,0" font="0"/>
+		</HorizontalLayout>
+		
+		<Label name="name" text="请输入餐牌号"  height="30" width="300" padding="30,50,0,0" align="left"/>
+	
+		<Edit name="content" width="250" height="50" tipvalue="1111" padding="30,20,0,0" textcolor="0xFF3CB371" bkcolor="#FFF2F2F2" nativebkcolor="#FFF2F2F2" font="1"/>
+		
+		<Label name="errinfo" text=""  height="60" width="250" float="true" pos="30,230,280,290" align="left" textcolor="#FFFF0000" visible="false"/>
+		
+		<HorizontalLayout height="56" valign="center" padding="30,80,0,20">
+			<Button name="quit" align="center" width="100" height="45" padding="0,20,0,0" text="取消" normalimage="file='Btn_White.png' corner='5,5,5,5'" hotimage="file='Btn_White_Hover.png' corner='5,5,5,5'" pushedimage="file='Btn_White_Click.png' corner='5,5,5,5'" />
+			<Button name="save" align="center" width="100" height="45" padding="20,20,90,0" text="确认" normalimage="file='Btn_White.png' corner='5,5,5,5'" hotimage="file='Btn_White_Hover.png' corner='5,5,5,5'" pushedimage="file='Btn_White_Click.png' corner='5,5,5,5'" />
+		</HorizontalLayout>
+	</VerticalLayout>
+</Window>

+ 10 - 8
bin/Win32/Debug/zhipuzi_pos_windows/skin/diandan_page.xml

@@ -8,18 +8,20 @@
 	
 	<DiandanPage>
 		<HorizontalLayout>
-			<Control width="1" bkcolor="#FFEBE8E8"></Control>
+			<Control width="1" bkcolor="#FFD1D1D1"></Control>
 			
 			<VerticalLayout width="553" bkcolor="#FFFFFFFF">
 				<HorizontalLayout>					
 					<VerticalLayout width="430" padding="0,0,0,0">
 						<HorizontalLayout name="btn_diandan_qingkong" height="60">
 							<Control bkimage="member_login.png" width="32" height="32" padding="10,14,0,0"></Control>
-							<Button name="btn_diandan_member_login" text="会员登录" heiht="20" width="100" padding="0,4,10,0" font="1" normalimage="" hotimage="" pushedimage="" bordersize="0" bkcolor="#00FFFFFF"></Button>
+							<Button name="btn_diandan_member_login" text="会员登录" heiht="38" width="100" padding="0,0,10,0" normalimage="" hotimage="" pushedimage="" bordersize="0" bkcolor="#00FFFFFF"></Button>
 							<Label name="diandan_page_member_info" text="" heiht="30" padding="10,10,10,10" visible="false"></Label>
 							<Control></Control>
-							<Control bkimage="order_delete.png" width="20" height="20" padding="0,22,0,0"></Control>
-							<Button name="btn_diandan_qingkong" text="清空" heiht="20" width="40" padding="5,4,10,0" textcolor="#FF999999" normalimage="" hotimage="" pushedimage="" bordersize="0" bkcolor="#00FFFFFF"></Button>
+							<Button name="btn_diandan_canpaihao" text="输入餐牌号" heiht="38" width="150" padding="0,0,0,0" normalimage="" hotimage="" pushedimage="" bordersize="0" bkcolor="#00FFFFFF"></Button>
+							<Control width="1" bkcolor="#FFEBE8E8" padding="15,15,15,15"></Control>
+							<Control bkimage="order_delete.png" width="20" height="20" padding="0,20,0,0"></Control>
+							<Button name="btn_diandan_qingkong" text="清空" heiht="38" width="40" padding="0,0,10,0" textcolor="#FF999999" normalimage="" hotimage="" pushedimage="" bordersize="0" bkcolor="#00FFFFFF"></Button>
 						</HorizontalLayout>
 						
 						<HorizontalLayout height="50" bkcolor="#FFF5F5F5">
@@ -131,25 +133,25 @@
 					
 					<HorizontalLayout padding="0,15,0,0" height="48">
 						<Label text="优惠券:" width="120" height="48" padding="20,0,0,0"></Label>
-						<Label text="未使用" width="120" height="48" padding="0,0,0,0"></Label>
+						<Label name="diandan_jiesuan_youhuiquan_status" text="未使用" width="120" height="48" padding="0,0,0,0"></Label>
 						<Button name="diandan_jiesuan_youhuiquan_btn" text="扫码使用" heiht="35" width="90" padding="0,6,0,0" textcolor="#FF41A846" normalimage="" hotimage="" pushedimage="" bordersize="1" bordercolor="#FF41A846" bkcolor="#FFFFFFFF"></Button>
 					</HorizontalLayout>
 					
 					<HorizontalLayout padding="0,15,0,0" height="48">
 						<Label text="商品券:" width="120" height="48" padding="20,0,0,0"></Label>
-						<Label text="未使用" width="120" height="48" padding="0,0,0,0"></Label>
+						<Label name="diandan_jiesuan_shangpinquan_status" text="未使用" width="120" height="48" padding="0,0,0,0"></Label>
 						<Button name="diandan_jiesuan_shangpinquan_btn" text="扫码使用" heiht="35" width="90" padding="0,6,0,0" textcolor="#FF41A846" normalimage="" hotimage="" pushedimage="" bordersize="1" bordercolor="#FF41A846" bkcolor="#FFFFFFFF"></Button>
 					</HorizontalLayout>
 					
 					<HorizontalLayout padding="0,15,0,0" height="48">
 						<Label text="次卡:" width="120" height="48" padding="20,0,0,0"></Label>
-						<Label text="未使用" width="120" height="48" padding="0,0,0,0"></Label>
+						<Label name="diandan_jiesuan_cika_status" text="未使用" width="120" height="48" padding="0,0,0,0"></Label>
 						<Button name="diandan_jiesuan_cika_btn" text="扫码使用" heiht="35" width="90" padding="0,6,0,0" textcolor="#FF41A846" normalimage="" hotimage="" pushedimage="" bordersize="1" bordercolor="#FF41A846" bkcolor="#FFFFFFFF"></Button>
 					</HorizontalLayout>
 					
 					<HorizontalLayout padding="0,15,0,0" height="48">
 						<Label text="权益卡:" width="120" height="48" padding="20,0,0,0"></Label>
-						<Label text="未使用" width="120" height="48" padding="0,0,0,0"></Label>
+						<Label name="diandan_jiesuan_quanyika_status" text="未使用" width="120" height="48" padding="0,0,0,0"></Label>
 						<Button name="diandan_jiesuan_quanyika_btn" text="扫码使用" heiht="35" width="90" padding="0,6,0,0" textcolor="#FF41A846" normalimage="" hotimage="" pushedimage="" bordersize="1" bordercolor="#FF41A846" bkcolor="#FFFFFFFF"></Button>
 					</HorizontalLayout>
 					

Plik diff jest za duży
+ 14 - 14
bin/Win32/Debug/zhipuzi_pos_windows/skin/main.xml


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


+ 24 - 0
bin/Win32/Debug/zhipuzi_pos_windows/skin/saoma_cika_dlg.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Window size="500,369" caption="0,0,0,36" roundcorner="4,4" >
+	<Font id="0" name="微软雅黑" size="26" />
+	<Font id="1" name="微软雅黑" size="20" />
+	
+	<VerticalLayout bkcolor="#FFFFFFFF">
+		<HorizontalLayout height="50" inset="10,2,10,0">
+			<Label name="memo_dlg_title" text="" align="center" valign="center" padding="0,20,0,0" font="0"/>
+		</HorizontalLayout>
+		
+		<Label name="name" text="请扫描顾客次卡二维码"  height="30" width="500" padding="0,50,0,0" align="center"/>
+	
+		<Edit name="content" width="400" height="50" padding="50,20,50,0" textcolor="0xFF3CB371" bkcolor="#FFF2F2F2" nativebkcolor="#FFF2F2F2" font="1"/>
+		
+		<Label name="errinfo" text=""  height="60" width="250" float="true" pos="30,230,280,290" align="left" textcolor="#FFFF0000" visible="false"/>
+		
+		<HorizontalLayout height="56" valign="center" padding="30,80,0,20">
+			<Control></Control>
+			<Button name="quit" align="center" width="100" height="45" padding="0,20,0,0" text="取消" normalimage="file='Btn_White.png' corner='5,5,5,5'" hotimage="file='Btn_White_Hover.png' corner='5,5,5,5'" pushedimage="file='Btn_White_Click.png' corner='5,5,5,5'" />
+			<Button name="save" align="center" width="100" height="45" padding="20,20,90,0" text="确认" normalimage="file='Btn_White.png' corner='5,5,5,5'" hotimage="file='Btn_White_Hover.png' corner='5,5,5,5'" pushedimage="file='Btn_White_Click.png' corner='5,5,5,5'" />
+			<Control></Control>
+		</HorizontalLayout>
+	</VerticalLayout>
+</Window>

+ 24 - 0
bin/Win32/Debug/zhipuzi_pos_windows/skin/saoma_quanyika_dlg.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Window size="500,369" caption="0,0,0,36" roundcorner="4,4" >
+	<Font id="0" name="微软雅黑" size="24" />
+	<Font id="1" name="微软雅黑" size="20" />
+	
+	<VerticalLayout bkcolor="#FFFFFFFF">
+		<HorizontalLayout height="50" inset="10,2,10,0">
+			<Label name="memo_dlg_title" text="" align="center" valign="center" padding="0,20,0,0" font="0"/>
+		</HorizontalLayout>
+		
+		<Label name="name" text="请扫描顾客权益卡二维码"  height="30" width="500" padding="0,50,0,0" align="center"/>
+	
+		<Edit name="content" width="400" height="50" padding="50,20,50,0" textcolor="0xFF3CB371" bkcolor="#FFF2F2F2" nativebkcolor="#FFF2F2F2" font="1"/>
+		
+		<Label name="errinfo" text=""  height="60" width="350" float="true" pos="30,230,380,290" align="left" textcolor="#FFFF0000" visible="false"/>
+		
+		<HorizontalLayout height="56" valign="center" padding="30,80,0,20">
+			<Control></Control>
+			<Button name="quit" align="center" width="100" height="45" padding="0,20,0,0" text="取消" normalimage="file='Btn_White.png' corner='5,5,5,5'" hotimage="file='Btn_White_Hover.png' corner='5,5,5,5'" pushedimage="file='Btn_White_Click.png' corner='5,5,5,5'" />
+			<Button name="save" align="center" width="100" height="45" padding="20,20,90,0" text="确认" normalimage="file='Btn_White.png' corner='5,5,5,5'" hotimage="file='Btn_White_Hover.png' corner='5,5,5,5'" pushedimage="file='Btn_White_Click.png' corner='5,5,5,5'" />
+			<Control></Control>
+		</HorizontalLayout>
+	</VerticalLayout>
+</Window>

+ 24 - 0
bin/Win32/Debug/zhipuzi_pos_windows/skin/saoma_shangpinquan_dlg.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Window size="500,369" caption="0,0,0,36" roundcorner="4,4" >
+	<Font id="0" name="微软雅黑" size="26" />
+	<Font id="1" name="微软雅黑" size="20" />
+	
+	<VerticalLayout bkcolor="#FFFFFFFF">
+		<HorizontalLayout height="50" inset="10,2,10,0">
+			<Label name="memo_dlg_title" text="" align="center" valign="center" padding="0,20,0,0" font="0"/>
+		</HorizontalLayout>
+		
+		<Label name="name" text="请扫描顾客商品券二维码"  height="30" width="500" padding="0,50,0,0" align="center"/>
+	
+		<Edit name="content" width="400" height="50" padding="50,20,50,0" textcolor="0xFF3CB371" bkcolor="#FFF2F2F2" nativebkcolor="#FFF2F2F2" font="1"/>
+		
+		<Label name="errinfo" text=""  height="60" width="250" float="true" pos="30,230,280,290" align="left" textcolor="#FFFF0000" visible="false"/>
+		
+		<HorizontalLayout height="56" valign="center" padding="30,80,0,20">
+			<Control></Control>
+			<Button name="quit" align="center" width="100" height="45" padding="0,20,0,0" text="取消" normalimage="file='Btn_White.png' corner='5,5,5,5'" hotimage="file='Btn_White_Hover.png' corner='5,5,5,5'" pushedimage="file='Btn_White_Click.png' corner='5,5,5,5'" />
+			<Button name="save" align="center" width="100" height="45" padding="20,20,90,0" text="确认" normalimage="file='Btn_White.png' corner='5,5,5,5'" hotimage="file='Btn_White_Hover.png' corner='5,5,5,5'" pushedimage="file='Btn_White_Click.png' corner='5,5,5,5'" />
+			<Control></Control>
+		</HorizontalLayout>
+	</VerticalLayout>
+</Window>

+ 24 - 0
bin/Win32/Debug/zhipuzi_pos_windows/skin/saoma_youhuiquan_dlg.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Window size="500,369" caption="0,0,0,36" roundcorner="4,4" >
+	<Font id="0" name="微软雅黑" size="26" />
+	<Font id="1" name="微软雅黑" size="20" />
+	
+	<VerticalLayout bkcolor="#FFFFFFFF">
+		<HorizontalLayout height="50" inset="10,2,10,0">
+			<Label name="memo_dlg_title" text="" align="center" valign="center" padding="0,20,0,0" font="0"/>
+		</HorizontalLayout>
+		
+		<Label name="name" text="请扫描顾客优惠券二维码"  height="30" width="500" padding="0,50,0,0" align="center"/>
+	
+		<Edit name="content" width="400" height="50" padding="50,20,50,0" textcolor="0xFF3CB371" bkcolor="#FFF2F2F2" nativebkcolor="#FFF2F2F2" font="1"/>
+		
+		<Label name="errinfo" text=""  height="60" width="250" float="true" pos="30,230,280,290" align="left" textcolor="#FFFF0000" visible="false"/>
+		
+		<HorizontalLayout height="56" valign="center" padding="30,80,0,20">
+			<Control></Control>
+			<Button name="quit" align="center" width="100" height="45" padding="0,20,0,0" text="取消" normalimage="file='Btn_White.png' corner='5,5,5,5'" hotimage="file='Btn_White_Hover.png' corner='5,5,5,5'" pushedimage="file='Btn_White_Click.png' corner='5,5,5,5'" />
+			<Button name="save" align="center" width="100" height="45" padding="20,20,90,0" text="确认" normalimage="file='Btn_White.png' corner='5,5,5,5'" hotimage="file='Btn_White_Hover.png' corner='5,5,5,5'" pushedimage="file='Btn_White_Click.png' corner='5,5,5,5'" />
+			<Control></Control>
+		</HorizontalLayout>
+	</VerticalLayout>
+</Window>

+ 1 - 0
zhipuzi_pos_windows/network/CZhipuziHttpClient.cpp

@@ -231,6 +231,7 @@ bool CZhipuziHttpClient::RequestNew(std::string url, std::map<string, string> pa
 	params["lwm_appid"] = lwm_appid;
 	params["nonce"] = nonce;
 	params["timestamp"] = timestamp;
+	params["lwm_sess_token"] = m_client.lwm_sess_token;
 
 	//计算签名
 	std::string postString;

+ 267 - 13
zhipuzi_pos_windows/page/CDiandanPageUI.cpp

@@ -12,6 +12,11 @@
 #include "../wnd/CZhekouWnd.h"
 #include "../wnd/CRengongYouhuiWnd.h"
 #include "../wnd/CJiajiaWnd.h"
+#include "../wnd/CSaomaYouhuiquanWnd.h"
+#include "../wnd/CSaomaShangpinquanWnd.h"
+#include "../wnd/CSaomaCikaWnd.h"
+#include "../wnd/CSaomaQuanyikaWnd.h"
+#include "../wnd/CCanpaiWnd.h"
 
 CDiandanPageUI::CDiandanPageUI()
 {
@@ -25,6 +30,10 @@ CDiandanPageUI::~CDiandanPageUI()
 //初始化当前页面的展示,处理默认展示效果,在页面被加载的时候调用
 void CDiandanPageUI::InitShow()
 {
+	//根据店铺设置,初始化结算信息
+	this->InitJiesuanInfo();
+
+	//初始化商品渲染相关的信息
 	m_foodLayout = static_cast<CTileLayoutUI*>(this->FindSubControl(_T("diandan_foodlist")));
 	m_foodtypeLayout = static_cast<CHorizontalLayoutUI*>(this->FindSubControl(_T("diandan_fenlei_layout")));
 
@@ -57,9 +66,6 @@ void CDiandanPageUI::InitShow()
 	}
 
 	this->RefreshFoodlist();
-
-	//根据店铺设置,初始化结算信息
-	this->InitJiesuanInfo();
 }
 
 //初始化结算页面的信息
@@ -67,6 +73,21 @@ void CDiandanPageUI::InitJiesuanInfo()
 {
 	CShopinfo shopinfo = CShopinfo::m_shopinfo;
 
+	//先清空会员登录状态
+	m_is_member = false;
+
+	CButtonUI* pMemberLoginBtn = static_cast<CButtonUI*>(this->FindSubControl(_T("btn_diandan_member_login")));
+	pMemberLoginBtn->SetVisible(true);
+
+	CLabelUI* pMemberInfo = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_page_member_info")));
+	pMemberInfo->SetVisible(false);
+
+	//再重新设置牌号
+	m_canpai = "";
+
+	CButtonUI* pCanpaiEdit = static_cast<CButtonUI*>(this->FindSubControl(_T("btn_diandan_canpaihao")));
+	pCanpaiEdit->SetText(L"输入餐牌号");
+
 	//先初始化折扣值
 	CEditUI* pZhekouEdit = static_cast<CEditUI*>(this->FindSubControl(_T("diandan_jiesuan_zhekou_value")));
 	pZhekouEdit->SetText(L"100");
@@ -83,24 +104,35 @@ void CDiandanPageUI::InitJiesuanInfo()
 
 	//优惠券
 	m_is_youhuiquan = false;
+	CLabelUI* pYouhuiquanEdit = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_jiesuan_youhuiquan_status")));
+	pYouhuiquanEdit->SetText(L"未使用");
 
 	//商品券
 	m_is_shangpinquan = false;
+	CLabelUI* pShangpinEdit = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_jiesuan_shangpinquan_status")));
+	pShangpinEdit->SetText(L"未使用");
 
 	//次卡
 	m_is_cika = false;
+	CLabelUI* pCikaEdit = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_jiesuan_cika_status")));
+	pCikaEdit->SetText(L"未使用");
 
 	//权益卡
 	m_is_quanyika = false;
+	CLabelUI* pQuanyikaEdit = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_jiesuan_quanyika_status")));
+	pQuanyikaEdit->SetText(L"未使用");
 
 	//抹零
 	m_moling_type = 0;
 	CCheckBoxUI* pMolingCheck = static_cast<CCheckBoxUI*>(this->FindSubControl(_T("diandan_jiesuan_moling_bumoling")));
 	pMolingCheck->Selected(true, false);
 
-	CHorizontalLayoutUI* pZhifufangshiLayout = static_cast<CHorizontalLayoutUI*>(this->FindSubControl(_T("diandan_jiesuan_zhifufangshi_layout")));
+	//调整所有与价格相关的展示
+	UpdateJiesuanInfo();
 
 	//添加支付方式
+	CHorizontalLayoutUI* pZhifufangshiLayout = static_cast<CHorizontalLayoutUI*>(this->FindSubControl(_T("diandan_jiesuan_zhifufangshi_layout")));
+
 	int num = 0;
 
 	CHorizontalLayoutUI* pWeixinLayout = static_cast<CHorizontalLayoutUI*>(this->FindSubControl(_T("diandan_jiesuan_zhifufangshi_weixinzhifu")));
@@ -375,6 +407,31 @@ void CDiandanPageUI::HandleClickMsg(TNotifyUI& msg)
 		//点击人工优惠
 		this->ClickRengongyouhui();
 	}
+	else if (name == L"diandan_jiesuan_youhuiquan_btn")
+	{
+		//点击扫码优惠券
+		this->ClickSaomaYouhuiquan();
+	}
+	else if (name == L"diandan_jiesuan_shangpinquan_btn")
+	{
+		//点击扫码商品券
+		this->ClickSaomaShangpinquan();
+	}
+	else if (name == L"diandan_jiesuan_cika_btn")
+	{
+		//点击扫码次卡
+		this->ClickSaomaCika();
+	}
+	else if (name == L"diandan_jiesuan_quanyika_btn")
+	{
+		//点击扫码权益卡
+		this->ClickSaomaQuanyika();
+	}
+	else if (name == L"btn_diandan_canpaihao")
+	{
+		//点击餐牌号
+		this->ClickCanpai();
+	}
 }
 
 //处理option切换事件
@@ -769,19 +826,16 @@ void CDiandanPageUI::UpdateJiesuanInfo()
 	m_quanyika_youhui = 0;
 	if (m_is_quanyika == true)
 	{
-		if (CShopinfo::m_shopinfo.m_is_eq_card_discount == "1")
-		{
-			double quanyika_zhekou = atof(CShopinfo::m_shopinfo.m_eq_card_discount_value.c_str());
+		double quanyika_zhekou = atof(m_quanyika_discount.c_str());
 
-			//这里最多是10折
-			double old_cur_price_quanyika_discount = cur_price;
+		//这里最多是10折
+		double old_cur_price_quanyika_discount = cur_price;
 
-			cur_price = (double)(cur_price * quanyika_zhekou) / 10.00;
+		cur_price = (double)(cur_price * quanyika_zhekou) / 10.00;
 
-			m_quanyika_youhui = old_cur_price_quanyika_discount - cur_price;
+		m_quanyika_youhui = old_cur_price_quanyika_discount - cur_price;
 
-			totol_youhui += m_quanyika_youhui;
-		}
+		totol_youhui += m_quanyika_youhui;
 	}
 
 	//次卡折扣
@@ -1769,4 +1823,204 @@ void CDiandanPageUI::ClickRengongyouhui()
 			return;
 		}
 	}
+}
+
+void CDiandanPageUI::ClickSaomaYouhuiquan()
+{
+	CSaomaYouhuiquanWnd* pSaomaYouhuiquanDlg = new CSaomaYouhuiquanWnd();
+
+	if (pSaomaYouhuiquanDlg != NULL)
+	{
+		pSaomaYouhuiquanDlg->Create(m_pManager->GetPaintWindow(), _T(""), UI_WNDSTYLE_DIALOG, WS_EX_WINDOWEDGE);
+		pSaomaYouhuiquanDlg->SetIcon(IDI_ICON_DUILIB);
+		pSaomaYouhuiquanDlg->CenterWindow();
+
+		pSaomaYouhuiquanDlg->SetTitle(L"扫码使用优惠券");
+
+		UINT ret = pSaomaYouhuiquanDlg->ShowModal();
+
+		if (ret == IDOK)
+		{
+			//这说明优惠券核销成功了
+			m_is_youhuiquan = true;
+			m_youhuiquan_id = pSaomaYouhuiquanDlg->m_coupon_id;
+			m_coupon_basic_price = pSaomaYouhuiquanDlg->m_coupon_basic_price;
+			m_coupon_deadline = pSaomaYouhuiquanDlg->m_coupon_deadline;
+			m_coupon_value = pSaomaYouhuiquanDlg->m_coupon_value;
+
+			CLabelUI* pYouhuiEdit = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_jiesuan_youhuiquan_status")));
+			pYouhuiEdit->SetText(L"已使用");
+
+			this->UpdateJiesuanInfo();
+
+			delete pSaomaYouhuiquanDlg;
+		}
+		else
+		{
+			delete pSaomaYouhuiquanDlg;
+
+			return;
+		}
+	}
+}
+
+//点击扫码商品券
+void CDiandanPageUI::ClickSaomaShangpinquan()
+{
+	CSaomaShangpinquanWnd* pSaomaShangpinquanDlg = new CSaomaShangpinquanWnd();
+
+	if (pSaomaShangpinquanDlg != NULL)
+	{
+		pSaomaShangpinquanDlg->Create(m_pManager->GetPaintWindow(), _T(""), UI_WNDSTYLE_DIALOG, WS_EX_WINDOWEDGE);
+		pSaomaShangpinquanDlg->SetIcon(IDI_ICON_DUILIB);
+		pSaomaShangpinquanDlg->CenterWindow();
+
+		pSaomaShangpinquanDlg->SetTitle(L"扫码使用商品券");
+
+		UINT ret = pSaomaShangpinquanDlg->ShowModal();
+
+		if (ret == IDOK)
+		{
+			//这说明商品券核销成功了
+			m_is_shangpinquan = true;
+			
+			m_shangpinquan_id = pSaomaShangpinquanDlg->m_goodscoupon_id;
+			m_shangpinquan_name = pSaomaShangpinquanDlg->m_goods_coupon_name;
+			m_shangpinquan_foodid = pSaomaShangpinquanDlg->m_bind_foods_id;
+
+			CLabelUI* pYouhuiEdit = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_jiesuan_shangpinquan_status")));
+			pYouhuiEdit->SetText(L"已使用");
+
+			this->UpdateJiesuanInfo();
+
+			delete pSaomaShangpinquanDlg;
+		}
+		else
+		{
+			delete pSaomaShangpinquanDlg;
+
+			return;
+		}
+	}
+}
+
+//点击扫码权益卡
+void CDiandanPageUI::ClickSaomaQuanyika()
+{
+	CSaomaQuanyikaWnd* pSaomaQuanyikaDlg = new CSaomaQuanyikaWnd();
+
+	if (pSaomaQuanyikaDlg != NULL)
+	{
+		pSaomaQuanyikaDlg->Create(m_pManager->GetPaintWindow(), _T(""), UI_WNDSTYLE_DIALOG, WS_EX_WINDOWEDGE);
+		pSaomaQuanyikaDlg->SetIcon(IDI_ICON_DUILIB);
+		pSaomaQuanyikaDlg->CenterWindow();
+
+		pSaomaQuanyikaDlg->SetTitle(L"扫码使用权益卡");
+
+		UINT ret = pSaomaQuanyikaDlg->ShowModal();
+
+		if (ret == IDOK)
+		{
+			//这说明权益卡核销成功了
+			m_is_quanyika = true;
+
+			m_quanyika_discount = pSaomaQuanyikaDlg->m_discount;
+
+			CLabelUI* pYouhuiEdit = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_jiesuan_quanyika_status")));
+			pYouhuiEdit->SetText(L"已使用");
+
+			this->UpdateJiesuanInfo();
+
+			delete pSaomaQuanyikaDlg;
+		}
+		else
+		{
+			delete pSaomaQuanyikaDlg;
+
+			return;
+		}
+	}
+}
+
+//点击扫码次卡
+void CDiandanPageUI::ClickSaomaCika()
+{
+	CSaomaCikaWnd* pSaomaCikaDlg = new CSaomaCikaWnd();
+
+	if (pSaomaCikaDlg != NULL)
+	{
+		pSaomaCikaDlg->Create(m_pManager->GetPaintWindow(), _T(""), UI_WNDSTYLE_DIALOG, WS_EX_WINDOWEDGE);
+		pSaomaCikaDlg->SetIcon(IDI_ICON_DUILIB);
+		pSaomaCikaDlg->CenterWindow();
+
+		pSaomaCikaDlg->SetTitle(L"扫码使用次卡");
+
+		UINT ret = pSaomaCikaDlg->ShowModal();
+
+		if (ret == IDOK)
+		{
+			//这说明商品券核销成功了
+			m_is_cika = true;			
+
+			m_cika_id = pSaomaCikaDlg->m_timescoupon_id;
+			m_cika_deduct_type = pSaomaCikaDlg->m_deduct_type;
+			m_cika_discount = pSaomaCikaDlg->m_discount;
+			m_cika_discount_value = pSaomaCikaDlg->m_discount_value;
+			m_cika_full_reduce = pSaomaCikaDlg->m_full_reduce;
+			m_cika_full_reduce_value = pSaomaCikaDlg->m_full_reduce_value;
+			m_cika_offer = pSaomaCikaDlg->m_offer;
+			m_cika_offer_value = pSaomaCikaDlg->m_offer_value;
+			m_cika_bind_foods_id = pSaomaCikaDlg->m_bind_foods_id;
+
+			CLabelUI* pYouhuiEdit = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_jiesuan_cika_status")));
+			pYouhuiEdit->SetText(L"已使用");
+
+			this->UpdateJiesuanInfo();
+
+			delete pSaomaCikaDlg;
+		}
+		else
+		{
+			delete pSaomaCikaDlg;
+
+			return;
+		}
+	}
+}
+
+void CDiandanPageUI::ClickCanpai()
+{
+	CCanpaiWnd* pCanpaiDlg = new CCanpaiWnd();
+
+	if (pCanpaiDlg != NULL)
+	{
+		pCanpaiDlg->Create(m_pManager->GetPaintWindow(), _T(""), UI_WNDSTYLE_DIALOG, WS_EX_WINDOWEDGE);
+		pCanpaiDlg->SetIcon(IDI_ICON_DUILIB);
+		pCanpaiDlg->CenterWindow();
+
+		pCanpaiDlg->SetTitle(L"输入餐牌号");
+
+		UINT ret = pCanpaiDlg->ShowModal();
+
+		if (ret == IDOK)
+		{
+			//这说明折扣输入了
+			std::string canpai = pCanpaiDlg->getContent();
+
+			m_canpai = canpai;
+
+			CButtonUI* pCanpaiEdit = static_cast<CButtonUI*>(this->FindSubControl(_T("btn_diandan_canpaihao")));
+			pCanpaiEdit->SetText((L"餐牌号 " + CLewaimaiString::UTF8ToUnicode(canpai)).c_str());
+
+			this->UpdateJiesuanInfo();
+
+			delete pCanpaiDlg;
+		}
+		else
+		{
+			delete pCanpaiDlg;
+
+			return;
+		}
+	}
 }

+ 20 - 1
zhipuzi_pos_windows/page/CDiandanPageUI.h

@@ -19,7 +19,7 @@ public:
 	//初始化当前页面的展示,处理默认展示效果,在页面被加载的时候调用
 	void InitShow();
 
-	//初始化结算页面的信息
+	//初始化所有与结算相关的信息,用于下一个新的订单之前的准备工作,清除之前的优惠状态等
 	void InitJiesuanInfo();
 
 	//处理按钮点击类事件
@@ -99,6 +99,21 @@ public:
 	//点击优惠
 	void ClickRengongyouhui();
 
+	//点击扫码使用优惠券
+	void ClickSaomaYouhuiquan();
+
+	//点击扫码商品券
+	void ClickSaomaShangpinquan();
+
+	//点击扫码权益卡
+	void ClickSaomaQuanyika();
+
+	//点击扫码次卡
+	void ClickSaomaCika();
+
+	//点击餐牌号按钮
+	void ClickCanpai();
+
 private:
 	CTileLayoutUI* m_foodLayout;
 	CHorizontalLayoutUI* m_foodtypeLayout;
@@ -166,6 +181,7 @@ private:
 
 	//权益卡
 	bool m_is_quanyika;
+	std::string m_quanyika_discount; //这里是接口返回的,实际上店铺设置里面也有一个
 	double m_quanyika_youhui;
 
 	//抹零 0:不抹零 1:抹零到角 2:抹零到元
@@ -184,5 +200,8 @@ private:
 
 	//满减
 	double m_manjian_youhui;
+
+	//餐牌
+	std::string m_canpai;
 };
 

+ 194 - 0
zhipuzi_pos_windows/wnd/CCanpaiWnd.cpp

@@ -0,0 +1,194 @@
+#include "../pch/pch.h"
+#include "CCanpaiWnd.h"
+
+LRESULT CCanpaiWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	POINT pt;
+	pt.x = GET_X_LPARAM(lParam);
+	pt.y = GET_Y_LPARAM(lParam);
+	::ScreenToClient(*this, &pt);
+
+	RECT rcClient;
+	::GetClientRect(*this, &rcClient);
+
+	RECT rcCaption = m_pm.GetCaptionRect();
+	if (pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \
+		&& pt.y >= rcCaption.top && pt.y < rcCaption.bottom)
+	{
+		CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));
+		if (pControl && _tcscmp(pControl->GetClass(), DUI_CTR_BUTTON) != 0)
+		{
+			return HTCAPTION;
+		}
+	}
+
+	return HTCLIENT;
+}
+
+LRESULT CCanpaiWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	SIZE szRoundCorner = m_pm.GetRoundCorner();
+	if (!::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0))
+	{
+		CDuiRect rcWnd;
+		::GetWindowRect(*this, &rcWnd);
+		rcWnd.Offset(-rcWnd.left, -rcWnd.top);
+		rcWnd.right++;
+		rcWnd.bottom++;
+		HRGN hRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy);
+		::SetWindowRgn(*this, hRgn, TRUE);
+		::DeleteObject(hRgn);
+	}
+
+	bHandled = FALSE;
+	return 0;
+}
+
+LRESULT CCanpaiWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+	LRESULT lRes = 0;
+	BOOL bHandled = TRUE;
+	switch (uMsg)
+	{
+	case WM_CREATE:
+		lRes = OnCreate(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCACTIVATE:
+		lRes = OnNcActivate(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCCALCSIZE:
+		lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCPAINT:
+		lRes = OnNcPaint(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCHITTEST:
+		lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_SIZE:
+		lRes = OnSize(uMsg, wParam, lParam, bHandled);
+		break;
+	default:
+		bHandled = FALSE;
+	}
+	if (bHandled)
+	{
+		return lRes;
+	}
+	if (m_pm.MessageHandler(uMsg, wParam, lParam, lRes))
+	{
+		return lRes;
+	}
+	return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
+}
+
+LRESULT CCanpaiWnd::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
+{
+	if (uMsg == WM_KEYDOWN)
+	{
+		if (wParam == VK_RETURN)
+		{
+			return true;
+		}
+		else if (wParam == VK_ESCAPE)
+		{
+			return true;
+		}
+	}
+
+	return false;
+}
+
+LRESULT CCanpaiWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
+	styleValue &= ~WS_CAPTION;
+	::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
+
+	// 把自己的窗口句柄与窗口绘制管理器挂接在一起
+	m_pm.Init(m_hWnd);
+
+	m_pm.AddPreMessageFilter(this);
+
+	CDialogBuilder builder;
+
+	CControlUI* pRoot = builder.Create(_T("canpai_input_dlg.xml"), (UINT)0, NULL, &m_pm);
+	ASSERT(pRoot && "Failed to parse XML");
+
+	// 把这些控件绘制到本窗口上
+	m_pm.AttachDialog(pRoot);
+
+	// 把自己加入到CPaintManagerUI的m_aNotifiers数组中,用于处理Notify函数
+	m_pm.AddNotifier(this);
+
+	Init();
+
+	return 0;
+}
+
+void CCanpaiWnd::Notify(TNotifyUI& msg)
+{
+	if (msg.sType == _T("click"))
+	{
+		DuiLib::CDuiString senderName = msg.pSender->GetName();
+
+		if (senderName == _T("quit"))
+		{
+			Close(IDCANCEL);
+			return;
+		}
+		else if (senderName == _T("save"))
+		{
+			CEditUI* pContent = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+			wstring wsReason = pContent->GetText();
+
+			m_content = CLewaimaiString::UnicodeToUTF8(wsReason);
+
+			int zhekou = atoi(m_content.c_str());
+
+			Close(IDOK);
+		}
+	}
+	else if (msg.sType == _T("textchanged"))
+	{
+		//只能输入数字,其他的全部删除
+		CEditUI* m_pEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+		if (!m_pEdit->GetText().IsEmpty())
+		{
+			wstring ws_Value = m_pEdit->GetText();
+			string strValue = CLewaimaiString::UnicodeToUTF8(ws_Value);
+
+			for (size_t nIndex = 0; nIndex < strValue.length(); nIndex++)
+			{
+				unsigned char tmp = strValue.at(nIndex);
+				if (tmp > 57 || tmp < 48)
+				{
+					//ASCII码不是数字的都过滤掉
+					strValue = strValue.substr(0, nIndex);
+
+					m_pEdit->SetText(CLewaimaiString::UTF8ToUnicode(strValue).c_str());
+					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置
+
+					break;
+				}
+			}
+		}
+	}
+}
+
+void CCanpaiWnd::Init()
+{
+
+}
+
+
+std::string CCanpaiWnd::getContent()
+{
+	return m_content;
+}
+
+void CCanpaiWnd::SetTitle(std::wstring title)
+{
+	CLabelUI* pLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("memo_dlg_title")));
+	pLabel->SetText(title.c_str());
+}

+ 69 - 0
zhipuzi_pos_windows/wnd/CCanpaiWnd.h

@@ -0,0 +1,69 @@
+#pragma once
+
+#include "../pch/pch.h"
+#include "CMainWnd.h"
+
+class CCanpaiWnd : public CWindowWnd, public INotifyUI, public IMessageFilterUI
+{
+public:
+	LPCTSTR GetWindowClassName() const
+	{
+		return _T("UIMemoWndFrame");
+	};
+
+	UINT GetClassStyle() const
+	{
+		return UI_CLASSSTYLE_DIALOG;
+	};
+
+	void OnFinalMessage(HWND /*hWnd*/)
+	{
+		//WindowImplBase::OnFinalMessage(hWnd);
+		m_pm.RemovePreMessageFilter(this);
+
+		//delete this;
+	};
+
+	void Init();
+
+	std::string getContent();
+
+	void SetTitle(std::wstring title);
+
+	void Notify(TNotifyUI& msg);
+
+	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+	{
+		if (::IsIconic(*this))
+		{
+			bHandled = FALSE;
+		}
+		return (wParam == 0) ? TRUE : FALSE;
+	}
+
+	LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+	{
+		return 0;
+	}
+
+	LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+	{
+		return 0;
+	}
+
+	LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+	LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);
+
+public:
+	CPaintManagerUI m_pm;
+
+	std::string m_content;
+};
+

+ 5 - 3
zhipuzi_pos_windows/wnd/CJiajiaWnd.cpp

@@ -168,14 +168,16 @@ void CjiajiaWnd::Notify(TNotifyUI& msg)
 
 			for (size_t nIndex = 0; nIndex < strValue.length(); nIndex++)
 			{
-				char tmp = strValue.at(nIndex);
+				unsigned char tmp = strValue.at(nIndex);
 				if (tmp > 57 || tmp < 48)
 				{
 					//ASCII码不是数字的都过滤掉
-					strValue = strValue.substr(0, nIndex) + strValue.substr(nIndex + 1);
+					strValue = strValue.substr(0, nIndex);
 
 					m_pEdit->SetText(CLewaimaiString::UTF8ToUnicode(strValue).c_str());
-					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置            
+					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置
+
+					break;
 				}
 			}
 		}

+ 38 - 0
zhipuzi_pos_windows/wnd/CMainWnd.cpp

@@ -11,6 +11,13 @@
 
 void CMainWnd::Init()
 {
+	//设置店铺名字
+	CLabelUI* pShopname = static_cast<CLabelUI*>(m_pm.FindControl(_T("main_shopname")));
+	pShopname->SetText(CLewaimaiString::UTF8ToUnicode(CShopinfo::m_shopinfo.m_shop_name).c_str());
+
+	m_curOptionName = L"main_diandan";
+	m_curOption = static_cast<CControlUI*>(m_pm.FindControl(_T("main_diandan")));
+
     m_pCloseBtn = static_cast<CButtonUI*>(m_pm.FindControl(_T("closebtn")));
     m_pMaxBtn = static_cast<CButtonUI*>(m_pm.FindControl(_T("maxbtn")));
     m_pRestoreBtn = static_cast<CButtonUI*>(m_pm.FindControl(_T("restorebtn")));
@@ -249,6 +256,21 @@ void CMainWnd::HandleClickMsg(TNotifyUI& msg)
 void CMainWnd::HandleSelectChangeMsg(TNotifyUI& msg)
 {
     CDuiString name = msg.pSender->GetName();
+	std::wstring ws_name = name;
+
+	if (ws_name == _T("main_diandan") || ws_name == _T("main_waimai") || ws_name == _T("main_huiyuan") || ws_name == _T("main_baobiao") || ws_name == _T("main_jiaoban") || ws_name == _T("main_setting") || ws_name == _T("main_gengduo"))
+	{
+		if (m_curOptionName != ws_name)
+		{
+			//表示切换了tab
+			m_curOption->SetBkColor(0x00000000);
+
+			msg.pSender->SetBkColor(0xFF3CB371);
+
+			m_curOptionName = ws_name;
+			m_curOption = static_cast<CControlUI*>(msg.pSender);
+		}
+	}
 
     //先判断主页面的tab
 	if (name == _T("main_diandan"))
@@ -259,10 +281,26 @@ void CMainWnd::HandleSelectChangeMsg(TNotifyUI& msg)
     {
 		this->SwitchPage(DINGDAN);
     }
+	else if (name == L"main_huiyuan")
+	{
+
+	}
+	else if (name == L"main_baobiao")
+	{
+
+	}
+	else if (name == L"main_jiaoban")
+	{
+
+	}
     else if(name == _T("main_setting"))
     {
 		this->SwitchPage(SHEZHI);
     }
+	else if (name == L"main_gengduo")
+	{
+
+	}
 	else
 	{
 		//除了主界面固定区域的事件,其他的事件全部分发给子页面

+ 3 - 0
zhipuzi_pos_windows/wnd/CMainWnd.h

@@ -119,4 +119,7 @@ private:
 	//这2个保存在这里,用于进去订单详情之前设置,进入订单详情之后获取订单信息
 	std::string m_infopage_waimaiorder_id;
 	std::string m_infopage_waimaiorder_no;
+
+	std::wstring m_curOptionName;
+	CControlUI* m_curOption;
 };

+ 6 - 4
zhipuzi_pos_windows/wnd/CMemberLoginWnd.cpp

@@ -191,14 +191,16 @@ void CMemberLoginWnd::Notify(TNotifyUI& msg)
 
 			for (size_t nIndex = 0; nIndex < strValue.length(); nIndex++)
 			{
-				char tmp = strValue.at(nIndex);
+				unsigned char tmp = strValue.at(nIndex);
 				if (tmp > 57 || tmp < 48)
 				{
 					//ASCII码不是数字的都过滤掉
-					strValue = strValue.substr(0, nIndex) + strValue.substr(nIndex + 1);
+					strValue = strValue.substr(0, nIndex);
 
 					m_pEdit->SetText(CLewaimaiString::UTF8ToUnicode(strValue).c_str());
-					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置            
+					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置
+
+					break;
 				}
 			}
 		}
@@ -285,7 +287,7 @@ void CMemberLoginWnd::ConfirmMember()
 
 		m_member_name = rowinfo["name"].GetString();
 		m_member_level = rowinfo["member_level"].GetString();
-		m_member_level_name = "";
+		m_member_level_name = rowinfo["member_level_name"].GetString();;
 
 		PostMessage(WM_MEMBER_CHECK_SUCCESS);
 	}

+ 5 - 3
zhipuzi_pos_windows/wnd/CRengongYouhuiWnd.cpp

@@ -168,14 +168,16 @@ void CRengongYouhuiWnd::Notify(TNotifyUI& msg)
 
 			for (size_t nIndex = 0; nIndex < strValue.length(); nIndex++)
 			{
-				char tmp = strValue.at(nIndex);
+				unsigned char tmp = strValue.at(nIndex);
 				if (tmp > 57 || tmp < 48)
 				{
 					//ASCII码不是数字的都过滤掉
-					strValue = strValue.substr(0, nIndex) + strValue.substr(nIndex + 1);
+					strValue = strValue.substr(0, nIndex);
 
 					m_pEdit->SetText(CLewaimaiString::UTF8ToUnicode(strValue).c_str());
-					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置            
+					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置
+
+					break;
 				}
 			}
 		}

+ 326 - 0
zhipuzi_pos_windows/wnd/CSaomaCikaWnd.cpp

@@ -0,0 +1,326 @@
+#include "../pch/pch.h"
+#include "CSaomaCikaWnd.h"
+
+LRESULT CSaomaCikaWnd::OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	CEditUI* pFukuanEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+
+	pFukuanEdit->SetFocus();
+
+	return 0;
+}
+
+LRESULT CSaomaCikaWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	POINT pt;
+	pt.x = GET_X_LPARAM(lParam);
+	pt.y = GET_Y_LPARAM(lParam);
+	::ScreenToClient(*this, &pt);
+
+	RECT rcClient;
+	::GetClientRect(*this, &rcClient);
+
+	RECT rcCaption = m_pm.GetCaptionRect();
+	if (pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \
+		&& pt.y >= rcCaption.top && pt.y < rcCaption.bottom)
+	{
+		CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));
+		if (pControl && _tcscmp(pControl->GetClass(), DUI_CTR_BUTTON) != 0)
+		{
+			return HTCAPTION;
+		}
+	}
+
+	return HTCLIENT;
+}
+
+LRESULT CSaomaCikaWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	SIZE szRoundCorner = m_pm.GetRoundCorner();
+	if (!::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0))
+	{
+		CDuiRect rcWnd;
+		::GetWindowRect(*this, &rcWnd);
+		rcWnd.Offset(-rcWnd.left, -rcWnd.top);
+		rcWnd.right++;
+		rcWnd.bottom++;
+		HRGN hRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy);
+		::SetWindowRgn(*this, hRgn, TRUE);
+		::DeleteObject(hRgn);
+	}
+
+	bHandled = FALSE;
+	return 0;
+}
+
+LRESULT CSaomaCikaWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+	LRESULT lRes = 0;
+	BOOL bHandled = TRUE;
+	switch (uMsg)
+	{
+	case WM_CREATE:
+		lRes = OnCreate(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCACTIVATE:
+		lRes = OnNcActivate(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCCALCSIZE:
+		lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCPAINT:
+		lRes = OnNcPaint(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCHITTEST:
+		lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_SIZE:
+		lRes = OnSize(uMsg, wParam, lParam, bHandled);
+		break;
+	default:
+		bHandled = FALSE;
+	}
+	if (bHandled)
+	{
+		return lRes;
+	}
+	if (m_pm.MessageHandler(uMsg, wParam, lParam, lRes))
+	{
+		return lRes;
+	}
+	return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
+}
+
+LRESULT CSaomaCikaWnd::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
+{
+	if (uMsg == WM_KEYDOWN)
+	{
+		if (wParam == VK_RETURN)
+		{
+			StartYanzheng();
+
+			return true;
+		}
+		else if (wParam == VK_ESCAPE)
+		{
+			Close(IDCANCEL);
+
+			return true;
+		}
+	}
+	else if (uMsg == WM_MEMBER_CHECK_SUCCESS)
+	{
+		//验证成功了
+		Close(IDOK);
+
+		return true;
+	}
+	else if (uMsg == WM_MEMBER_CHECK_FAIL)
+	{
+		//验证失败了
+		CEditUI* pContent = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+		pContent->SetEnabled(true);
+
+		CButtonUI* pQuit = static_cast<CButtonUI*>(m_pm.FindControl(_T("quit")));
+		pQuit->SetEnabled(true);
+		CButtonUI* pSave = static_cast<CButtonUI*>(m_pm.FindControl(_T("save")));
+		pSave->SetEnabled(true);
+
+		//失败原因
+		CLabelUI* pErrorInfo = static_cast<CLabelUI*>(m_pm.FindControl(_T("errinfo")));
+		pErrorInfo->SetText(m_errorInfo.c_str());
+		pErrorInfo->SetVisible(true);
+
+		return true;
+	}
+
+	return false;
+}
+
+LRESULT CSaomaCikaWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
+	styleValue &= ~WS_CAPTION;
+	::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
+
+	// 把自己的窗口句柄与窗口绘制管理器挂接在一起
+	m_pm.Init(m_hWnd);
+
+	m_pm.AddPreMessageFilter(this);
+
+	CDialogBuilder builder;
+
+	CControlUI* pRoot = builder.Create(_T("saoma_cika_dlg.xml"), (UINT)0, NULL, &m_pm);
+	ASSERT(pRoot && "Failed to parse XML");
+
+	// 把这些控件绘制到本窗口上
+	m_pm.AttachDialog(pRoot);
+
+	// 把自己加入到CPaintManagerUI的m_aNotifiers数组中,用于处理Notify函数
+	m_pm.AddNotifier(this);
+
+	Init();
+
+	return 0;
+}
+
+void CSaomaCikaWnd::Notify(TNotifyUI& msg)
+{
+	if (msg.sType == _T("click"))
+	{
+		DuiLib::CDuiString senderName = msg.pSender->GetName();
+
+		if (senderName == _T("quit"))
+		{
+			Close(IDCANCEL);
+			return;
+		}
+		else if (senderName == _T("save"))
+		{
+			StartYanzheng();
+		}
+	}
+	else if (msg.sType == _T("textchanged"))
+	{
+		//只能输入数字,其他的全部删除
+		CEditUI* m_pEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+		if (!m_pEdit->GetText().IsEmpty())
+		{
+			wstring ws_Value = m_pEdit->GetText();
+			string strValue = CLewaimaiString::UnicodeToUTF8(ws_Value);
+
+			for (size_t nIndex = 0; nIndex < strValue.length(); nIndex++)
+			{
+				unsigned char tmp = strValue.at(nIndex);
+				if (tmp > 122 || tmp < 48)
+				{
+					//ASCII码不是数字的都过滤掉
+					strValue = strValue.substr(0, nIndex);
+
+					m_pEdit->SetText(CLewaimaiString::UTF8ToUnicode(strValue).c_str());
+					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置
+
+					break;
+				}
+			}
+		}
+	}
+}
+
+void CSaomaCikaWnd::Init()
+{
+
+}
+
+
+std::string CSaomaCikaWnd::getContent()
+{
+	return m_content;
+}
+
+void CSaomaCikaWnd::SetTitle(std::wstring title)
+{
+	CLabelUI* pLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("memo_dlg_title")));
+	pLabel->SetText(title.c_str());
+}
+
+void CSaomaCikaWnd::StartYanzheng()
+{
+	CEditUI* pContent = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+	wstring wsReason = pContent->GetText();
+
+	m_content = CLewaimaiString::UnicodeToUTF8(wsReason);
+
+	if (m_content.length() == 0)
+	{
+		return;
+	}
+
+	pContent->SetEnabled(false);
+
+	CButtonUI* pQuit = static_cast<CButtonUI*>(m_pm.FindControl(_T("quit")));
+	pQuit->SetEnabled(false);
+	CButtonUI* pSave = static_cast<CButtonUI*>(m_pm.FindControl(_T("save")));
+	pSave->SetEnabled(false);
+
+	//开始处理
+	std::thread(&CSaomaCikaWnd::ConfirmMember, this).detach();
+}
+
+void CSaomaCikaWnd::ConfirmMember()
+{
+	std::map<string, string> params;
+	params["rand_number"] = m_content;
+
+	std::string response;
+	bool ret = CZhipuziHttpClient::RequestNew("/crm/marketing/timescoupon/gettimescouponinfobyrandnumber", params, response);
+	if (!ret)
+	{
+		m_errorInfo = _T("网络请求出错");
+		PostMessage(WM_MEMBER_CHECK_FAIL);
+
+		return;
+	}
+
+	rapidjson::Document document;
+	document.Parse(response.c_str());
+
+	if (document.HasParseError())
+	{
+		m_errorInfo = _T("服务器返回数据格式错误");
+		PostMessage(WM_MEMBER_CHECK_FAIL);
+
+		return;
+	}
+	else
+	{
+		if (!document.HasMember("errcode") || !document.HasMember("errmsg"))
+		{
+			m_errorInfo = _T("服务器返回数据格式错误");
+			PostMessage(WM_MEMBER_CHECK_FAIL);
+
+			return;
+		}
+
+		rapidjson::Value& v_errcode = document["errcode"];
+		int errcode = v_errcode.GetInt();
+		if (errcode != 0)
+		{
+			std::string errmsg = CLewaimaiString::UnicodeToUTF8(L"次卡扫码失败:") + string(document["errmsg"].GetString());
+			m_errorInfo = CLewaimaiString::UTF8ToUnicode(errmsg);
+			PostMessage(WM_MEMBER_CHECK_FAIL);
+
+			return;
+		}
+
+		rapidjson::Value& data = document["data"];
+
+		m_timescoupon_id = data["timescoupon_id"].GetString();
+		m_timescoupon_name = data["timescoupon_name"].GetString();
+		m_deduct_type = data["deduct_type"].GetString();
+		m_deduct_way = data["deduct_way"].GetString();
+
+		if (m_deduct_type == "0")
+		{
+			m_discount = data["discount"].GetString();
+			m_discount_value = data["discount_value"].GetString();
+		}
+		else if (m_deduct_type == "1")
+		{
+			m_full_reduce = data["full_reduce"].GetString();
+			m_full_reduce_value = data["full_reduce_value"].GetString();
+		}
+		else if (m_deduct_type == "2")
+		{
+			m_offer = data["offer"].GetString();
+			m_offer_value = data["offer_value"].GetString();
+		}
+		else if (m_deduct_type == "3")
+		{
+			m_bind_foods_name = data["bind_foods_name"].GetString();
+			m_bind_foods_id = data["bind_foods_id"].GetString();
+		}
+
+		PostMessage(WM_MEMBER_CHECK_SUCCESS);
+	}
+}

+ 85 - 0
zhipuzi_pos_windows/wnd/CSaomaCikaWnd.h

@@ -0,0 +1,85 @@
+#pragma once
+
+#include "../pch/pch.h"
+#include "CMainWnd.h"
+
+class CSaomaCikaWnd : public CWindowWnd, public INotifyUI, public IMessageFilterUI
+{
+public:
+	LPCTSTR GetWindowClassName() const
+	{
+		return _T("UIMemoWndFrame");
+	};
+
+	UINT GetClassStyle() const
+	{
+		return UI_CLASSSTYLE_DIALOG;
+	};
+
+	void OnFinalMessage(HWND /*hWnd*/)
+	{
+		//WindowImplBase::OnFinalMessage(hWnd);
+		m_pm.RemovePreMessageFilter(this);
+
+		//delete this;
+	};
+
+	void Init();
+
+	std::string getContent();
+
+	void SetTitle(std::wstring title);
+
+	void Notify(TNotifyUI& msg);
+
+	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+	{
+		if (::IsIconic(*this))
+		{
+			bHandled = FALSE;
+		}
+		return (wParam == 0) ? TRUE : FALSE;
+	}
+
+	LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+	{
+		return 0;
+	}
+
+	LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+	LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);
+
+	void StartYanzheng();
+
+	void ConfirmMember();
+
+public:
+	CPaintManagerUI m_pm;
+
+	std::string m_content;
+
+	std::wstring m_errorInfo;
+
+	std::string m_timescoupon_id;
+	std::string m_timescoupon_name;
+	std::string m_deduct_type;
+	std::string m_deduct_way;
+	std::string m_discount;
+	std::string m_discount_value;
+	std::string m_full_reduce;
+	std::string m_full_reduce_value;
+	std::string m_offer;
+	std::string m_offer_value;
+	std::string m_bind_foods_name;
+	std::string m_bind_foods_id;
+};
+

+ 302 - 0
zhipuzi_pos_windows/wnd/CSaomaQuanyikaWnd.cpp

@@ -0,0 +1,302 @@
+#include "../pch/pch.h"
+#include "CSaomaQuanyikaWnd.h"
+
+LRESULT CSaomaQuanyikaWnd::OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	CEditUI* pFukuanEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+
+	pFukuanEdit->SetFocus();
+
+	return 0;
+}
+
+LRESULT CSaomaQuanyikaWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	POINT pt;
+	pt.x = GET_X_LPARAM(lParam);
+	pt.y = GET_Y_LPARAM(lParam);
+	::ScreenToClient(*this, &pt);
+
+	RECT rcClient;
+	::GetClientRect(*this, &rcClient);
+
+	RECT rcCaption = m_pm.GetCaptionRect();
+	if (pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \
+		&& pt.y >= rcCaption.top && pt.y < rcCaption.bottom)
+	{
+		CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));
+		if (pControl && _tcscmp(pControl->GetClass(), DUI_CTR_BUTTON) != 0)
+		{
+			return HTCAPTION;
+		}
+	}
+
+	return HTCLIENT;
+}
+
+LRESULT CSaomaQuanyikaWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	SIZE szRoundCorner = m_pm.GetRoundCorner();
+	if (!::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0))
+	{
+		CDuiRect rcWnd;
+		::GetWindowRect(*this, &rcWnd);
+		rcWnd.Offset(-rcWnd.left, -rcWnd.top);
+		rcWnd.right++;
+		rcWnd.bottom++;
+		HRGN hRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy);
+		::SetWindowRgn(*this, hRgn, TRUE);
+		::DeleteObject(hRgn);
+	}
+
+	bHandled = FALSE;
+	return 0;
+}
+
+LRESULT CSaomaQuanyikaWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+	LRESULT lRes = 0;
+	BOOL bHandled = TRUE;
+	switch (uMsg)
+	{
+	case WM_CREATE:
+		lRes = OnCreate(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCACTIVATE:
+		lRes = OnNcActivate(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCCALCSIZE:
+		lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCPAINT:
+		lRes = OnNcPaint(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCHITTEST:
+		lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_SIZE:
+		lRes = OnSize(uMsg, wParam, lParam, bHandled);
+		break;
+	default:
+		bHandled = FALSE;
+	}
+	if (bHandled)
+	{
+		return lRes;
+	}
+	if (m_pm.MessageHandler(uMsg, wParam, lParam, lRes))
+	{
+		return lRes;
+	}
+	return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
+}
+
+LRESULT CSaomaQuanyikaWnd::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
+{
+	if (uMsg == WM_KEYDOWN)
+	{
+		if (wParam == VK_RETURN)
+		{
+			StartYanzheng();
+
+			return true;
+		}
+		else if (wParam == VK_ESCAPE)
+		{
+			Close(IDCANCEL);
+
+			return true;
+		}
+	}
+	else if (uMsg == WM_MEMBER_CHECK_SUCCESS)
+	{
+		//验证成功了
+		Close(IDOK);
+
+		return true;
+	}
+	else if (uMsg == WM_MEMBER_CHECK_FAIL)
+	{
+		//验证失败了
+		CEditUI* pContent = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+		pContent->SetEnabled(true);
+
+		CButtonUI* pQuit = static_cast<CButtonUI*>(m_pm.FindControl(_T("quit")));
+		pQuit->SetEnabled(true);
+		CButtonUI* pSave = static_cast<CButtonUI*>(m_pm.FindControl(_T("save")));
+		pSave->SetEnabled(true);
+
+		//失败原因
+		CLabelUI* pErrorInfo = static_cast<CLabelUI*>(m_pm.FindControl(_T("errinfo")));
+		pErrorInfo->SetText(m_errorInfo.c_str());
+		pErrorInfo->SetVisible(true);
+
+		return true;
+	}
+
+	return false;
+}
+
+LRESULT CSaomaQuanyikaWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
+	styleValue &= ~WS_CAPTION;
+	::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
+
+	// 把自己的窗口句柄与窗口绘制管理器挂接在一起
+	m_pm.Init(m_hWnd);
+
+	m_pm.AddPreMessageFilter(this);
+
+	CDialogBuilder builder;
+
+	CControlUI* pRoot = builder.Create(_T("saoma_quanyika_dlg.xml"), (UINT)0, NULL, &m_pm);
+	ASSERT(pRoot && "Failed to parse XML");
+
+	// 把这些控件绘制到本窗口上
+	m_pm.AttachDialog(pRoot);
+
+	// 把自己加入到CPaintManagerUI的m_aNotifiers数组中,用于处理Notify函数
+	m_pm.AddNotifier(this);
+
+	Init();
+
+	return 0;
+}
+
+void CSaomaQuanyikaWnd::Notify(TNotifyUI& msg)
+{
+	if (msg.sType == _T("click"))
+	{
+		DuiLib::CDuiString senderName = msg.pSender->GetName();
+
+		if (senderName == _T("quit"))
+		{
+			Close(IDCANCEL);
+			return;
+		}
+		else if (senderName == _T("save"))
+		{
+			StartYanzheng();
+		}
+	}
+	else if (msg.sType == _T("textchanged"))
+	{
+		//只能输入数字,其他的全部删除
+		CEditUI* m_pEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+		if (!m_pEdit->GetText().IsEmpty())
+		{
+			wstring ws_Value = m_pEdit->GetText();
+			string strValue = CLewaimaiString::UnicodeToUTF8(ws_Value);
+
+			for (size_t nIndex = 0; nIndex < strValue.length(); nIndex++)
+			{
+				unsigned char tmp = strValue.at(nIndex);
+				if (tmp > 122 || tmp < 48)
+				{
+					//ASCII码不是数字的都过滤掉
+					strValue = strValue.substr(0, nIndex);
+
+					m_pEdit->SetText(CLewaimaiString::UTF8ToUnicode(strValue).c_str());
+					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置
+
+					break;
+				}
+			}
+		}
+	}
+}
+
+void CSaomaQuanyikaWnd::Init()
+{
+
+}
+
+
+std::string CSaomaQuanyikaWnd::getContent()
+{
+	return m_content;
+}
+
+void CSaomaQuanyikaWnd::SetTitle(std::wstring title)
+{
+	CLabelUI* pLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("memo_dlg_title")));
+	pLabel->SetText(title.c_str());
+}
+
+void CSaomaQuanyikaWnd::StartYanzheng()
+{
+	CEditUI* pContent = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+	wstring wsReason = pContent->GetText();
+
+	m_content = CLewaimaiString::UnicodeToUTF8(wsReason);
+
+	if (m_content.length() == 0)
+	{
+		return;
+	}
+
+	pContent->SetEnabled(false);
+
+	CButtonUI* pQuit = static_cast<CButtonUI*>(m_pm.FindControl(_T("quit")));
+	pQuit->SetEnabled(false);
+	CButtonUI* pSave = static_cast<CButtonUI*>(m_pm.FindControl(_T("save")));
+	pSave->SetEnabled(false);
+
+	//开始处理
+	std::thread(&CSaomaQuanyikaWnd::ConfirmMember, this).detach();
+}
+
+void CSaomaQuanyikaWnd::ConfirmMember()
+{
+	std::map<string, string> params;
+	params["code"] = m_content;
+
+	std::string response;
+	bool ret = CZhipuziHttpClient::RequestNew("/crm/marketing/equitycard/getinfobycode", params, response);
+	if (!ret)
+	{
+		m_errorInfo = _T("网络请求出错");
+		PostMessage(WM_MEMBER_CHECK_FAIL);
+
+		return;
+	}
+
+	rapidjson::Document document;
+	document.Parse(response.c_str());
+
+	if (document.HasParseError())
+	{
+		m_errorInfo = _T("服务器返回数据格式错误");
+		PostMessage(WM_MEMBER_CHECK_FAIL);
+
+		return;
+	}
+	else
+	{
+		if (!document.HasMember("errcode") || !document.HasMember("errmsg"))
+		{
+			m_errorInfo = _T("服务器返回数据格式错误");
+			PostMessage(WM_MEMBER_CHECK_FAIL);
+
+			return;
+		}
+
+		rapidjson::Value& v_errcode = document["errcode"];
+		int errcode = v_errcode.GetInt();
+		if (errcode != 0)
+		{
+			std::string errmsg = CLewaimaiString::UnicodeToUTF8(L"权益卡扫码失败:") + string(document["errmsg"].GetString());
+			m_errorInfo = CLewaimaiString::UTF8ToUnicode(errmsg);
+			PostMessage(WM_MEMBER_CHECK_FAIL);
+
+			return;
+		}
+
+		rapidjson::Value& data = document["data"];
+
+		m_discount = data["discount"].GetString();
+
+		PostMessage(WM_MEMBER_CHECK_SUCCESS);
+	}
+}

+ 74 - 0
zhipuzi_pos_windows/wnd/CSaomaQuanyikaWnd.h

@@ -0,0 +1,74 @@
+#pragma once
+
+#include "../pch/pch.h"
+#include "CMainWnd.h"
+
+class CSaomaQuanyikaWnd : public CWindowWnd, public INotifyUI, public IMessageFilterUI
+{
+public:
+	LPCTSTR GetWindowClassName() const
+	{
+		return _T("UIMemoWndFrame");
+	};
+
+	UINT GetClassStyle() const
+	{
+		return UI_CLASSSTYLE_DIALOG;
+	};
+
+	void OnFinalMessage(HWND /*hWnd*/)
+	{
+		//WindowImplBase::OnFinalMessage(hWnd);
+		m_pm.RemovePreMessageFilter(this);
+
+		//delete this;
+	};
+
+	void Init();
+
+	std::string getContent();
+
+	void SetTitle(std::wstring title);
+
+	void Notify(TNotifyUI& msg);
+
+	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+	{
+		if (::IsIconic(*this))
+		{
+			bHandled = FALSE;
+		}
+		return (wParam == 0) ? TRUE : FALSE;
+	}
+
+	LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+	{
+		return 0;
+	}
+
+	LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+	LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);
+
+	void StartYanzheng();
+
+	void ConfirmMember();
+
+public:
+	CPaintManagerUI m_pm;
+
+	std::string m_content;
+
+	std::wstring m_errorInfo;
+
+	std::string m_discount;
+};
+

+ 304 - 0
zhipuzi_pos_windows/wnd/CSaomaShangpinquanWnd.cpp

@@ -0,0 +1,304 @@
+#include "../pch/pch.h"
+#include "CSaomaShangpinquanWnd.h"
+
+LRESULT CSaomaShangpinquanWnd::OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	CEditUI* pFukuanEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+
+	pFukuanEdit->SetFocus();
+
+	return 0;
+}
+
+LRESULT CSaomaShangpinquanWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	POINT pt;
+	pt.x = GET_X_LPARAM(lParam);
+	pt.y = GET_Y_LPARAM(lParam);
+	::ScreenToClient(*this, &pt);
+
+	RECT rcClient;
+	::GetClientRect(*this, &rcClient);
+
+	RECT rcCaption = m_pm.GetCaptionRect();
+	if (pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \
+		&& pt.y >= rcCaption.top && pt.y < rcCaption.bottom)
+	{
+		CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));
+		if (pControl && _tcscmp(pControl->GetClass(), DUI_CTR_BUTTON) != 0)
+		{
+			return HTCAPTION;
+		}
+	}
+
+	return HTCLIENT;
+}
+
+LRESULT CSaomaShangpinquanWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	SIZE szRoundCorner = m_pm.GetRoundCorner();
+	if (!::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0))
+	{
+		CDuiRect rcWnd;
+		::GetWindowRect(*this, &rcWnd);
+		rcWnd.Offset(-rcWnd.left, -rcWnd.top);
+		rcWnd.right++;
+		rcWnd.bottom++;
+		HRGN hRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy);
+		::SetWindowRgn(*this, hRgn, TRUE);
+		::DeleteObject(hRgn);
+	}
+
+	bHandled = FALSE;
+	return 0;
+}
+
+LRESULT CSaomaShangpinquanWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+	LRESULT lRes = 0;
+	BOOL bHandled = TRUE;
+	switch (uMsg)
+	{
+	case WM_CREATE:
+		lRes = OnCreate(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCACTIVATE:
+		lRes = OnNcActivate(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCCALCSIZE:
+		lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCPAINT:
+		lRes = OnNcPaint(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCHITTEST:
+		lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_SIZE:
+		lRes = OnSize(uMsg, wParam, lParam, bHandled);
+		break;
+	default:
+		bHandled = FALSE;
+	}
+	if (bHandled)
+	{
+		return lRes;
+	}
+	if (m_pm.MessageHandler(uMsg, wParam, lParam, lRes))
+	{
+		return lRes;
+	}
+	return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
+}
+
+LRESULT CSaomaShangpinquanWnd::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
+{
+	if (uMsg == WM_KEYDOWN)
+	{
+		if (wParam == VK_RETURN)
+		{
+			StartYanzheng();
+
+			return true;
+		}
+		else if (wParam == VK_ESCAPE)
+		{
+			Close(IDCANCEL);
+
+			return true;
+		}
+	}
+	else if (uMsg == WM_MEMBER_CHECK_SUCCESS)
+	{
+		//验证成功了
+		Close(IDOK);
+
+		return true;
+	}
+	else if (uMsg == WM_MEMBER_CHECK_FAIL)
+	{
+		//验证失败了
+		CEditUI* pContent = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+		pContent->SetEnabled(true);
+
+		CButtonUI* pQuit = static_cast<CButtonUI*>(m_pm.FindControl(_T("quit")));
+		pQuit->SetEnabled(true);
+		CButtonUI* pSave = static_cast<CButtonUI*>(m_pm.FindControl(_T("save")));
+		pSave->SetEnabled(true);
+
+		//失败原因
+		CLabelUI* pErrorInfo = static_cast<CLabelUI*>(m_pm.FindControl(_T("errinfo")));
+		pErrorInfo->SetText(m_errorInfo.c_str());
+		pErrorInfo->SetVisible(true);
+
+		return true;
+	}
+
+	return false;
+}
+
+LRESULT CSaomaShangpinquanWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
+	styleValue &= ~WS_CAPTION;
+	::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
+
+	// 把自己的窗口句柄与窗口绘制管理器挂接在一起
+	m_pm.Init(m_hWnd);
+
+	m_pm.AddPreMessageFilter(this);
+
+	CDialogBuilder builder;
+
+	CControlUI* pRoot = builder.Create(_T("saoma_shangpinquan_dlg.xml"), (UINT)0, NULL, &m_pm);
+	ASSERT(pRoot && "Failed to parse XML");
+
+	// 把这些控件绘制到本窗口上
+	m_pm.AttachDialog(pRoot);
+
+	// 把自己加入到CPaintManagerUI的m_aNotifiers数组中,用于处理Notify函数
+	m_pm.AddNotifier(this);
+
+	Init();
+
+	return 0;
+}
+
+void CSaomaShangpinquanWnd::Notify(TNotifyUI& msg)
+{
+	if (msg.sType == _T("click"))
+	{
+		DuiLib::CDuiString senderName = msg.pSender->GetName();
+
+		if (senderName == _T("quit"))
+		{
+			Close(IDCANCEL);
+			return;
+		}
+		else if (senderName == _T("save"))
+		{
+			StartYanzheng();
+		}
+	}
+	else if (msg.sType == _T("textchanged"))
+	{
+		//只能输入数字,其他的全部删除
+		CEditUI* m_pEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+		if (!m_pEdit->GetText().IsEmpty())
+		{
+			wstring ws_Value = m_pEdit->GetText();
+			string strValue = CLewaimaiString::UnicodeToUTF8(ws_Value);
+
+			for (size_t nIndex = 0; nIndex < strValue.length(); nIndex++)
+			{
+				unsigned char tmp = strValue.at(nIndex);
+				if (tmp > 122 || tmp < 48)
+				{
+					//ASCII码不是数字的都过滤掉
+					strValue = strValue.substr(0, nIndex);
+
+					m_pEdit->SetText(CLewaimaiString::UTF8ToUnicode(strValue).c_str());
+					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置
+
+					break;
+				}
+			}
+		}
+	}
+}
+
+void CSaomaShangpinquanWnd::Init()
+{
+
+}
+
+
+std::string CSaomaShangpinquanWnd::getContent()
+{
+	return m_content;
+}
+
+void CSaomaShangpinquanWnd::SetTitle(std::wstring title)
+{
+	CLabelUI* pLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("memo_dlg_title")));
+	pLabel->SetText(title.c_str());
+}
+
+void CSaomaShangpinquanWnd::StartYanzheng()
+{
+	CEditUI* pContent = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+	wstring wsReason = pContent->GetText();
+
+	m_content = CLewaimaiString::UnicodeToUTF8(wsReason);
+
+	if (m_content.length() == 0)
+	{
+		return;
+	}
+
+	pContent->SetEnabled(false);
+
+	CButtonUI* pQuit = static_cast<CButtonUI*>(m_pm.FindControl(_T("quit")));
+	pQuit->SetEnabled(false);
+	CButtonUI* pSave = static_cast<CButtonUI*>(m_pm.FindControl(_T("save")));
+	pSave->SetEnabled(false);
+
+	//开始处理
+	std::thread(&CSaomaShangpinquanWnd::ConfirmMember, this).detach();
+}
+
+void CSaomaShangpinquanWnd::ConfirmMember()
+{
+	std::map<string, string> params;
+	params["rand_number"] = m_content;
+
+	std::string response;
+	bool ret = CZhipuziHttpClient::RequestNew("/crm/marketing/goodscoupon/getgoodscouponinfobyrandnumber", params, response);
+	if (!ret)
+	{
+		m_errorInfo = _T("网络请求出错");
+		PostMessage(WM_MEMBER_CHECK_FAIL);
+
+		return;
+	}
+
+	rapidjson::Document document;
+	document.Parse(response.c_str());
+
+	if (document.HasParseError())
+	{
+		m_errorInfo = _T("服务器返回数据格式错误");
+		PostMessage(WM_MEMBER_CHECK_FAIL);
+
+		return;
+	}
+	else
+	{
+		if (!document.HasMember("errcode") || !document.HasMember("errmsg"))
+		{
+			m_errorInfo = _T("服务器返回数据格式错误");
+			PostMessage(WM_MEMBER_CHECK_FAIL);
+
+			return;
+		}
+
+		rapidjson::Value& v_errcode = document["errcode"];
+		int errcode = v_errcode.GetInt();
+		if (errcode != 0)
+		{
+			std::string errmsg = CLewaimaiString::UnicodeToUTF8(L"商品券扫码失败:") + string(document["errmsg"].GetString());
+			m_errorInfo = CLewaimaiString::UTF8ToUnicode(errmsg);
+			PostMessage(WM_MEMBER_CHECK_FAIL);
+
+			return;
+		}
+
+		rapidjson::Value& data = document["data"];
+
+		m_goodscoupon_id = to_string(data["info"]["goodscoupon_id"].GetInt());
+		m_goods_coupon_name = data["info"]["goods_coupon_name"].GetString();
+		m_bind_foods_id = data["info"]["bind_foods_id"].GetString();
+
+		PostMessage(WM_MEMBER_CHECK_SUCCESS);
+	}
+}

+ 76 - 0
zhipuzi_pos_windows/wnd/CSaomaShangpinquanWnd.h

@@ -0,0 +1,76 @@
+#pragma once
+
+#include "../pch/pch.h"
+#include "CMainWnd.h"
+
+class CSaomaShangpinquanWnd : public CWindowWnd, public INotifyUI, public IMessageFilterUI
+{
+public:
+	LPCTSTR GetWindowClassName() const
+	{
+		return _T("UIMemoWndFrame");
+	};
+
+	UINT GetClassStyle() const
+	{
+		return UI_CLASSSTYLE_DIALOG;
+	};
+
+	void OnFinalMessage(HWND /*hWnd*/)
+	{
+		//WindowImplBase::OnFinalMessage(hWnd);
+		m_pm.RemovePreMessageFilter(this);
+
+		//delete this;
+	};
+
+	void Init();
+
+	std::string getContent();
+
+	void SetTitle(std::wstring title);
+
+	void Notify(TNotifyUI& msg);
+
+	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+	{
+		if (::IsIconic(*this))
+		{
+			bHandled = FALSE;
+		}
+		return (wParam == 0) ? TRUE : FALSE;
+	}
+
+	LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+	{
+		return 0;
+	}
+
+	LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+	LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);
+
+	void StartYanzheng();
+
+	void ConfirmMember();
+
+public:
+	CPaintManagerUI m_pm;
+
+	std::string m_content;
+
+	std::wstring m_errorInfo;
+
+	std::string m_goodscoupon_id;
+	std::string m_goods_coupon_name;
+	std::string m_bind_foods_id;
+};
+

+ 318 - 0
zhipuzi_pos_windows/wnd/CSaomaYouhuiquanWnd.cpp

@@ -0,0 +1,318 @@
+#include "../pch/pch.h"
+#include "CSaomaYouhuiquanWnd.h"
+
+LRESULT CSaomaYouhuiquanWnd::OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	CEditUI* pFukuanEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+
+	pFukuanEdit->SetFocus();
+
+	return 0;
+}
+
+LRESULT CSaomaYouhuiquanWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	POINT pt;
+	pt.x = GET_X_LPARAM(lParam);
+	pt.y = GET_Y_LPARAM(lParam);
+	::ScreenToClient(*this, &pt);
+
+	RECT rcClient;
+	::GetClientRect(*this, &rcClient);
+
+	RECT rcCaption = m_pm.GetCaptionRect();
+	if (pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \
+		&& pt.y >= rcCaption.top && pt.y < rcCaption.bottom)
+	{
+		CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));
+		if (pControl && _tcscmp(pControl->GetClass(), DUI_CTR_BUTTON) != 0)
+		{
+			return HTCAPTION;
+		}
+	}
+
+	return HTCLIENT;
+}
+
+LRESULT CSaomaYouhuiquanWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	SIZE szRoundCorner = m_pm.GetRoundCorner();
+	if (!::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0))
+	{
+		CDuiRect rcWnd;
+		::GetWindowRect(*this, &rcWnd);
+		rcWnd.Offset(-rcWnd.left, -rcWnd.top);
+		rcWnd.right++;
+		rcWnd.bottom++;
+		HRGN hRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy);
+		::SetWindowRgn(*this, hRgn, TRUE);
+		::DeleteObject(hRgn);
+	}
+
+	bHandled = FALSE;
+	return 0;
+}
+
+LRESULT CSaomaYouhuiquanWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+	LRESULT lRes = 0;
+	BOOL bHandled = TRUE;
+	switch (uMsg)
+	{
+	case WM_CREATE:
+		lRes = OnCreate(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCACTIVATE:
+		lRes = OnNcActivate(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCCALCSIZE:
+		lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCPAINT:
+		lRes = OnNcPaint(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_NCHITTEST:
+		lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_SIZE:
+		lRes = OnSize(uMsg, wParam, lParam, bHandled);
+		break;
+	default:
+		bHandled = FALSE;
+	}
+	if (bHandled)
+	{
+		return lRes;
+	}
+	if (m_pm.MessageHandler(uMsg, wParam, lParam, lRes))
+	{
+		return lRes;
+	}
+	return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
+}
+
+LRESULT CSaomaYouhuiquanWnd::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
+{
+	if (uMsg == WM_KEYDOWN)
+	{
+		if (wParam == VK_RETURN)
+		{
+			StartYanzheng();
+
+			return true;
+		}
+		else if (wParam == VK_ESCAPE)
+		{
+			Close(IDCANCEL);
+
+			return true;
+		}
+	}
+	else if (uMsg == WM_MEMBER_CHECK_SUCCESS)
+	{
+		//验证成功了
+		Close(IDOK);
+
+		return true;
+	}
+	else if (uMsg == WM_MEMBER_CHECK_FAIL)
+	{
+		//验证失败了
+		CEditUI* pContent = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+		pContent->SetEnabled(true);
+
+		CButtonUI* pQuit = static_cast<CButtonUI*>(m_pm.FindControl(_T("quit")));
+		pQuit->SetEnabled(true);
+		CButtonUI* pSave = static_cast<CButtonUI*>(m_pm.FindControl(_T("save")));
+		pSave->SetEnabled(true);
+
+		//失败原因
+		CLabelUI* pErrorInfo = static_cast<CLabelUI*>(m_pm.FindControl(_T("errinfo")));
+		pErrorInfo->SetText(m_errorInfo.c_str());
+		pErrorInfo->SetVisible(true);
+
+		return true;
+	}
+
+	return false;
+}
+
+LRESULT CSaomaYouhuiquanWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
+	styleValue &= ~WS_CAPTION;
+	::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
+
+	// 把自己的窗口句柄与窗口绘制管理器挂接在一起
+	m_pm.Init(m_hWnd);
+
+	m_pm.AddPreMessageFilter(this);
+
+	CDialogBuilder builder;
+
+	CControlUI* pRoot = builder.Create(_T("saoma_youhuiquan_dlg.xml"), (UINT)0, NULL, &m_pm);
+	ASSERT(pRoot && "Failed to parse XML");
+
+	// 把这些控件绘制到本窗口上
+	m_pm.AttachDialog(pRoot);
+
+	// 把自己加入到CPaintManagerUI的m_aNotifiers数组中,用于处理Notify函数
+	m_pm.AddNotifier(this);
+
+	Init();
+
+	return 0;
+}
+
+void CSaomaYouhuiquanWnd::Notify(TNotifyUI& msg)
+{
+	if (msg.sType == _T("click"))
+	{
+		DuiLib::CDuiString senderName = msg.pSender->GetName();
+
+		if (senderName == _T("quit"))
+		{
+			Close(IDCANCEL);
+			return;
+		}
+		else if (senderName == _T("save"))
+		{
+			StartYanzheng();
+		}
+	}
+	else if (msg.sType == _T("textchanged"))
+	{
+		//只能输入数字,其他的全部删除
+		CEditUI* m_pEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+		if (!m_pEdit->GetText().IsEmpty())
+		{
+			wstring ws_Value = m_pEdit->GetText();
+			string strValue = CLewaimaiString::UnicodeToUTF8(ws_Value);
+
+			for (size_t nIndex = 0; nIndex < strValue.length(); nIndex++)
+			{
+				unsigned char tmp = strValue.at(nIndex);
+				if (tmp > 122 || tmp < 48)
+				{
+					//ASCII码不是数字的都过滤掉
+					strValue = strValue.substr(0, nIndex);
+
+					m_pEdit->SetText(CLewaimaiString::UTF8ToUnicode(strValue).c_str());
+					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置
+
+					break;
+				}
+			}
+		}
+	}
+}
+
+void CSaomaYouhuiquanWnd::Init()
+{
+
+}
+
+
+std::string CSaomaYouhuiquanWnd::getContent()
+{
+	return m_content;
+}
+
+void CSaomaYouhuiquanWnd::SetTitle(std::wstring title)
+{
+	CLabelUI* pLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("memo_dlg_title")));
+	pLabel->SetText(title.c_str());
+}
+
+void CSaomaYouhuiquanWnd::StartYanzheng()
+{
+	CEditUI* pContent = static_cast<CEditUI*>(m_pm.FindControl(_T("content")));
+	wstring wsReason = pContent->GetText();
+
+	m_content = CLewaimaiString::UnicodeToUTF8(wsReason);
+
+	if (m_content.length() == 0)
+	{
+		return;
+	}
+
+	pContent->SetEnabled(false);
+
+	CButtonUI* pQuit = static_cast<CButtonUI*>(m_pm.FindControl(_T("quit")));
+	pQuit->SetEnabled(false);
+	CButtonUI* pSave = static_cast<CButtonUI*>(m_pm.FindControl(_T("save")));
+	pSave->SetEnabled(false);
+
+	//开始处理
+	std::thread(&CSaomaYouhuiquanWnd::ConfirmMember, this).detach();
+}
+
+void CSaomaYouhuiquanWnd::ConfirmMember()
+{
+	std::map<string, string> params;
+	params["rand_number"] = m_content;
+
+	std::string response;
+	bool ret = CZhipuziHttpClient::Request("/coupon/getcouponinfobyrandnumber", params, response);
+	if (!ret)
+	{
+		m_errorInfo = _T("网络请求出错");
+		PostMessage(WM_MEMBER_CHECK_FAIL);
+
+		return;
+	}
+
+	rapidjson::Document document;
+	document.Parse(response.c_str());
+
+	if (document.HasParseError())
+	{
+		m_errorInfo = _T("服务器返回数据格式错误");
+		PostMessage(WM_MEMBER_CHECK_FAIL);
+
+		return;
+	}
+	else
+	{
+		if (!document.HasMember("errcode") || !document.HasMember("errmsg"))
+		{
+			m_errorInfo = _T("服务器返回数据格式错误");
+			PostMessage(WM_MEMBER_CHECK_FAIL);
+
+			return;
+		}
+
+		rapidjson::Value& v_errcode = document["errcode"];
+		int errcode = v_errcode.GetInt();
+		if (errcode != 0)
+		{
+			std::string errmsg = CLewaimaiString::UnicodeToUTF8(L"优惠券扫码失败:") + string(document["errmsg"].GetString());
+			m_errorInfo = CLewaimaiString::UTF8ToUnicode(errmsg);
+			PostMessage(WM_MEMBER_CHECK_FAIL);
+
+			return;
+		}
+
+		rapidjson::Value& data = document["data"];
+
+		m_coupon_id = data["id"].GetString();
+		m_coupon_basic_price = data["coupon_basic_price"].GetString();
+		m_coupon_deadline = data["coupon_deadline"].GetString();
+		m_coupon_value = data["coupon_value"].GetString();
+
+		//判断优惠券是否过期
+		time_t deadline = CLewaimaiTime::StringToDatetime(m_coupon_deadline);
+		time_t now = time(NULL);
+		if (deadline <= now)
+		{
+			m_errorInfo = _T("该优惠券已过期,无法使用");
+			PostMessage(WM_MEMBER_CHECK_FAIL);
+
+			return;
+		}
+
+		//这里正常来说还要判断优惠券关联的店铺
+
+		PostMessage(WM_MEMBER_CHECK_SUCCESS);
+	}
+}

+ 77 - 0
zhipuzi_pos_windows/wnd/CSaomaYouhuiquanWnd.h

@@ -0,0 +1,77 @@
+#pragma once
+
+#include "../pch/pch.h"
+#include "CMainWnd.h"
+
+class CSaomaYouhuiquanWnd : public CWindowWnd, public INotifyUI, public IMessageFilterUI
+{
+public:
+	LPCTSTR GetWindowClassName() const
+	{
+		return _T("UIMemoWndFrame");
+	};
+
+	UINT GetClassStyle() const
+	{
+		return UI_CLASSSTYLE_DIALOG;
+	};
+
+	void OnFinalMessage(HWND /*hWnd*/)
+	{
+		//WindowImplBase::OnFinalMessage(hWnd);
+		m_pm.RemovePreMessageFilter(this);
+
+		//delete this;
+	};
+
+	void Init();
+
+	std::string getContent();
+
+	void SetTitle(std::wstring title);
+
+	void Notify(TNotifyUI& msg);
+
+	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+	{
+		if (::IsIconic(*this))
+		{
+			bHandled = FALSE;
+		}
+		return (wParam == 0) ? TRUE : FALSE;
+	}
+
+	LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+	{
+		return 0;
+	}
+
+	LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+	LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);
+
+	void StartYanzheng();
+
+	void ConfirmMember();
+
+public:
+	CPaintManagerUI m_pm;
+
+	std::string m_content;
+
+	std::wstring m_errorInfo;
+
+	std::string m_coupon_id;
+	std::string m_coupon_basic_price;
+	std::string m_coupon_deadline;
+	std::string m_coupon_value;
+};
+

+ 5 - 3
zhipuzi_pos_windows/wnd/CZhekouWnd.cpp

@@ -168,14 +168,16 @@ void CZhekouWnd::Notify(TNotifyUI& msg)
 
 			for (size_t nIndex = 0; nIndex < strValue.length(); nIndex++)
 			{
-				char tmp = strValue.at(nIndex);
+				unsigned char tmp = strValue.at(nIndex);
 				if (tmp > 57 || tmp < 48)
 				{
 					//ASCII码不是数字的都过滤掉
-					strValue = strValue.substr(0, nIndex) + strValue.substr(nIndex + 1);
+					strValue = strValue.substr(0, nIndex);
 
 					m_pEdit->SetText(CLewaimaiString::UTF8ToUnicode(strValue).c_str());
-					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置            
+					m_pEdit->SetSel(strValue.length(), strValue.length());//重设给光标设置位置
+
+					break;
 				}
 			}
 		}

+ 10 - 0
zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj

@@ -225,6 +225,11 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     </PostBuildEvent>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClInclude Include="wnd\CCanpaiWnd.h" />
+    <ClInclude Include="wnd\CSaomaCikaWnd.h" />
+    <ClInclude Include="wnd\CSaomaQuanyikaWnd.h" />
+    <ClInclude Include="wnd\CSaomaShangpinquanWnd.h" />
+    <ClInclude Include="wnd\CSaomaYouhuiquanWnd.h" />
     <ClInclude Include="wnd\CJiajiaWnd.h" />
     <ClInclude Include="wnd\CRengongYouhuiWnd.h" />
     <ClInclude Include="wnd\CZhekouWnd.h" />
@@ -278,6 +283,11 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     <ClInclude Include="helper\CSystem.h" />
   </ItemGroup>
   <ItemGroup>
+    <ClCompile Include="wnd\CCanpaiWnd.cpp" />
+    <ClCompile Include="wnd\CSaomaCikaWnd.cpp" />
+    <ClCompile Include="wnd\CSaomaQuanyikaWnd.cpp" />
+    <ClCompile Include="wnd\CSaomaShangpinquanWnd.cpp" />
+    <ClCompile Include="wnd\CSaomaYouhuiquanWnd.cpp" />
     <ClCompile Include="wnd\CJiajiaWnd.cpp" />
     <ClCompile Include="wnd\CRengongYouhuiWnd.cpp" />
     <ClCompile Include="wnd\CZhekouWnd.cpp" />

+ 30 - 0
zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj.filters

@@ -168,6 +168,21 @@
     <ClInclude Include="wnd\CRengongYouhuiWnd.h">
       <Filter>头文件</Filter>
     </ClInclude>
+    <ClInclude Include="wnd\CSaomaYouhuiquanWnd.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="wnd\CSaomaQuanyikaWnd.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="wnd\CSaomaShangpinquanWnd.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="wnd\CSaomaCikaWnd.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="wnd\CCanpaiWnd.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="pch\pch.cpp">
@@ -299,6 +314,21 @@
     <ClCompile Include="wnd\CRengongYouhuiWnd.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
+    <ClCompile Include="wnd\CSaomaYouhuiquanWnd.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="wnd\CSaomaQuanyikaWnd.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="wnd\CSaomaShangpinquanWnd.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="wnd\CSaomaCikaWnd.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="wnd\CCanpaiWnd.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <Image Include="resource\zhipuzi.ico">