Просмотр исходного кода

继续优化吧,点单快做完了

zhangyang 4 лет назад
Родитель
Сommit
da6bceb6b1

+ 6 - 4
bin/Win32/Debug/zhipuzi_pos_windows/skin/diandan_fooditem.xml

@@ -4,10 +4,12 @@
 	<Font id="1" name="微软雅黑" size="14" />
 	
 	<DiandanFoodItem name="diandan_fooditem" bkcolor="#FFFFFFFF" padding="0,0,7,7">
-		<Control name="image" height="165" bkimage="file='food_image_default.png'" padding="0,0,0,0"></Control>
-		<Label name="foodname" width="165" height="60" multiline="true" endellipsis="true"></Label>
+		<Control name="image" height="155" bkimage="file='food_image_default.png'" padding="0,0,0,0"></Control>
+		<Label name="foodname" width="155" height="60" multiline="true" endellipsis="true"></Label>
 		<Label name="price" height="30" font="daindan_price" textcolor="#FFFF7F50" align="left"></Label>
-		<Label name="nature" visible="false" width="50" height="26" font="1" text="多属性" float="true" pos="110,224,160,250" textcolor="#FFFFFFFF" bkcolor="#FF2E8B57" align="center"></Label>		
-		<Label name="chengzhong" visible="false" width="50" height="26" font="1" text="称重" float="true" pos="110,224,160,250" textcolor="#FFFFFFFF" bkcolor="#FFFF4500" align="center"></Label>
+		<Label name="nature" visible="false" width="50" height="26" font="1" text="多属性" float="true" pos="100,214,150,240" textcolor="#FFFFFFFF" bkcolor="#FF2E8B57" align="center"></Label>		
+		<Label name="chengzhong" visible="false" width="50" height="26" font="1" text="称重" float="true" pos="100,214,150,240" textcolor="#FFFFFFFF" bkcolor="#FFFF4500" align="center"></Label>
+		
+		<Label name="kucun" visible="false" width="50" height="26" font="1" text="已售空" float="true" pos="0,210,155,245" textcolor="#FFFFFFFF" bkcolor="#FF696969" align="center"></Label>
 	</DiandanFoodItem>
 </Window>

+ 1 - 1
bin/Win32/Debug/zhipuzi_pos_windows/skin/diandan_page.xml

@@ -96,7 +96,7 @@
 
 				</HorizontalLayout>
 				
-				<TileLayout name="diandan_foodlist" padding="0,0,0,0" inset="15,15,15,15" childpadding="1" itemsize="180,270" vscrollbar="true" hscrollbar="false">
+				<TileLayout name="diandan_foodlist" padding="0,0,0,0" inset="15,15,15,15" childpadding="1" itemsize="170,260" vscrollbar="true" hscrollbar="false">
 				
 				</TileLayout>
 				

+ 92 - 0
bin/Win32/Debug/zhipuzi_pos_windows/skin/zidingyi_shoukuan_wnd.xml

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Window size="580,450" caption="0,0,0,44" roundcorner="4,4" >
+	<Font id="0" name="微软雅黑" size="24" />
+	<Font id="1" name="微软雅黑" size="40" />
+	<Font id="2" name="微软雅黑" size="18" />
+	<Font id="3" name="微软雅黑" size="32" />
+	<Font id="4" name="微软雅黑" size="14" />
+	<VerticalLayout bkimage="shoukuan_bkg.png" >
+		<HorizontalLayout name="shoukuan_title_bkg" height="44" bkcolor="0xFF3CB371">
+			<Label name="shoukuan_version" text="" height="44" align="center" valign="center" padding="0,0,0,0" textcolor="#FFFFFFFF" font="2"/>
+		</HorizontalLayout>
+		
+		<VerticalLayout visible="true" name="shoukuan_before_pay_layout" height="520" padding="0,20,0,0">
+			<HorizontalLayout name="shoukuan_money_input_layout" height="60" padding="0,15,0,0">
+				<Label height="40" padding="190,20,0,10" name="shoukuan_before_pay_huobi" text="¥" font="0" textcolor="0xFF3CB371"></Label>
+				<Edit name="money_edit" float="true" pos="223,0,400,60" font="1" textcolor="0xFF3CB371" bkcolor="0xFFFCFCFC" nativebkcolor="0xFFFCFCFC"/>
+			</HorizontalLayout>
+			
+			<HorizontalLayout name="shoukuan_money_show_layout" height="50" padding="0,15,0,15" visible="false">
+				<Label text="¥" font="0" textcolor="0xFF3CB371" float="true" pos="230,24,245,50"/>
+				<Label name="shoukuan_money_show_money" font="1" textcolor="0xFF3CB371" float="true" pos="255,12,530,48"/>
+			</HorizontalLayout>
+			
+			<HorizontalLayout height="50" padding="0,15,0,0">
+				<Label name="shoukuan_attention" text="" font="2" align="center"/>
+			</HorizontalLayout>
+			
+			<HorizontalLayout height="60" padding="0,50,0,0">
+				<Control></Control>
+				<Button name="shoukuanBtn" text="确认" font="2" textcolor="#FFFFFFFF" height="50" width="150" padding="0,0,0,0" tooltip="点击这里确认收款" normalimage="file='Btn_Green.png' corner='5,5,5,5'" hotimage="file='Btn_Green_Hover.png' corner='5,5,5,5'" pushedimage="file='Btn_Green_Click.png' corner='5,5,5,5'" />
+				<Button name="closebtn" text="关闭" font="2" textcolor="#FFFFFFFF" height="50" width="150" padding="20,0,0,0" tooltip="点击这里取消收款" normalimage="file='Btn_Red.png' corner='5,5,5,5'" hotimage="file='Btn_Red_Hover.png' corner='5,5,5,5'" pushedimage="file='Btn_Red_Click.png' corner='5,5,5,5'" />
+				<Control></Control>
+			</HorizontalLayout>	
+
+			<HorizontalLayout height="50" padding="0,20,0,0">
+				<Control></Control>
+				<Label name="shoukuanresult" font="2" width="400" height="50" multiline="true" text="" visible="false" textcolor="#FF0000" align="center" />
+				<Control></Control>
+			</HorizontalLayout>			
+		</VerticalLayout>
+		
+		<VerticalLayout name="shoukuan_paying_layout" visible="false">
+			<HorizontalLayout name="shoukuan_paying_loading" height="24" padding="0, 20, 0, 20">
+				<Control></Control>
+				<VerticalLayout width="24">
+					<Control></Control>
+					<HorizontalLayout height="24">
+						<GifAnim bkimage="loading.gif" autosize="true"></GifAnim>
+					</HorizontalLayout>
+					<Control></Control>
+				</VerticalLayout>
+				<Control></Control>
+			</HorizontalLayout>
+			
+			<Label height="40" padding="0,10,0,10" name="shoukuan_paying_money" text="收款金额:" font="3" textcolor="0xFF3CB371" align="center"></Label>
+			
+			<Label height="32" padding="0,10,0,10" name="shoukuan_paying_status" text="请求支付中..." font="2" textcolor="0xFF3CB371" align="center"></Label>
+			
+			<Label height="60" padding="20,30,20,0" name="shouyin_paying_attention" text="如果用户没有支付成功,则请确认客户不再进行支付时再关闭此窗口,按【Esc】取消本次支付" font="2" textcolor="0xFF808080" multiline="true" align="center" />
+		</VerticalLayout>
+		
+		<VerticalLayout name="shoukuan_pay_success_layout" visible="false">
+			<HorizontalLayout name="shoukuan_pay_success_logo_wx" height="100" padding="0,20,0,0" visible="false">
+				<Control></Control>
+				<Control bkimage="wx_logo.png" width="100" height="100" align="center"></Control>
+				<Control></Control>
+			</HorizontalLayout>
+			
+			<HorizontalLayout name="shoukuan_pay_success_logo_zhifubao" height="100" padding="0,20,0,0" visible="false">
+				<Control></Control>
+				<Control bkimage="zhifubao_logo.png"  width="100" height="100" align="center"></Control>
+				<Control></Control>
+			</HorizontalLayout>
+			
+			<Label height="40" padding="0,20,0,20" name="shoukuan_pay_success_money" text="成功收款:" font="3" textcolor="0xFF3CB371" align="center"></Label>
+			
+			<Label height="60" padding="20,30,20,0" name="shouyin_pay_success_attention" text="按任意键关闭窗口" font="2" textcolor="0xFF808080" multiline="true" align="center" />
+		</VerticalLayout>
+		
+		<VerticalLayout name="shoukuan_pay_fail_layout" visible="false">
+			<HorizontalLayout height="100" padding="0,20,0,0">
+				<Control></Control>
+				<Control bkimage="pay_fail.png" width="100" height="100" align="center"></Control>
+				<Control></Control>
+			</HorizontalLayout>
+			
+			<Label height="40" padding="0,20,0,20" name="shoukuan_pay_fail_money" text="订单支付失败" font="3" textcolor="0xFFD33E3A" align="center"></Label>
+			
+			<Label height="60" padding="20,30,20,0" name="shouyin_pay_fail_attention" text="" font="2" textcolor="0xFF808080" multiline="true" align="center" />
+		</VerticalLayout>
+    </VerticalLayout>
+</Window>

+ 8 - 1
zhipuzi_pos_windows/control/CDiandanFoodItemUI.cpp

@@ -120,7 +120,7 @@ void CDiandanFoodItemUI::UpdateShow()
 
 		if (m_foodinfo.is_weight == "1")
 		{
-			//称重商品,显示称重的标签
+			//称重商品,显示称重的标签(称重的标签与属性的标签不同时存在,优先显示称重的)
 			CLabelUI* pChenzhong = static_cast<CLabelUI*>(this->FindSubControl(_T("chengzhong")));
 			pChenzhong->SetVisible(true);
 		}
@@ -133,5 +133,12 @@ void CDiandanFoodItemUI::UpdateShow()
 				pNature->SetVisible(true);
 			}
 		}
+
+		if (m_foodinfo.stockvalid == "1" && atof(m_foodinfo.stock.c_str()) < 0.001)
+		{
+			//库存为0了
+			CLabelUI* pKucun = static_cast<CLabelUI*>(this->FindSubControl(_T("kucun")));
+			pKucun->SetVisible(true);
+		}
 	}
 }

+ 223 - 107
zhipuzi_pos_windows/page/CDiandanPageUI.cpp

@@ -21,6 +21,7 @@
 #include "../wnd/CHuiyuanShoukuanWnd.h"
 #include "../wnd/CXianjinShoukuanWnd.h"
 #include "../wnd/CFulikaShoukuanWnd.h"
+#include "../wnd/CZidingyiShoukuanWnd.h"
 
 CDiandanPageUI::CDiandanPageUI()
 {
@@ -40,13 +41,13 @@ void CDiandanPageUI::InitShow()
 	//再初始化商品显示
 	this->InitFoodShow();
 
-	//初始化结算页面相关的展示
+	//初始化结算页面相关的展示,把所有活动清零
 	this->InitJiesuanShow();
 
-	//调整所有与价格相关的展示
+	//计算所有活动优惠,并且调整所有与价格相关的展示
 	this->UpdateJiesuanInfo();
 
-	//默认展示选购页面
+	//展示选购页面
 	this->ShowXuangouPage();
 }
 
@@ -596,6 +597,14 @@ void CDiandanPageUI::HandleClickMsg(TNotifyUI& msg)
 		//福利卡收款
 		this->StartFulikaShoukuan();
 	}
+	else if (name == L"diandan_jiesuan_zhifufangshi_zidingyi_btn")
+	{
+		//自定义支付
+		std::wstring name = msg.pSender->GetText();
+		std::wstring selfpay_id = msg.pSender->GetCustomAttribute(L"selfpay_id");
+
+		this->StartZidingyiShoukuan(name, selfpay_id);
+	}
 }
 
 //处理option切换事件
@@ -1408,6 +1417,13 @@ void CDiandanPageUI::ClickFoodAction()
 		//点击普通商品之后的处理逻辑
 		CFood foodinfo = m_cur_click_food_item->GetFoodInfo();
 
+		if (foodinfo.stockvalid == "1" && atof(foodinfo.stock.c_str()) < 0.001)
+		{
+			//库存为0了,不做任何处理
+			m_pMainWnd->ShowToast(L"该商品已售完");
+			return;
+		}
+
 		CDiandanOrderItem clickItem;
 
 		clickItem.food_id = foodinfo.id;
@@ -1667,6 +1683,8 @@ void CDiandanPageUI::ClickQingkong()
 	m_cur_diandan_order.Clear();
 
 	this->ClearDiandanOrderItemShow();
+
+	ShowXuangouPage();
 }
 
 void CDiandanPageUI::ClickZhengdanMemo()
@@ -1710,7 +1728,7 @@ void CDiandanPageUI::ClickGengduoPay()
 {
 	if (m_cur_diandan_order.getItemNum() == 0)
 	{
-		m_pMainWnd->ShowToast(L"请先选择商品再结算");
+		m_pMainWnd->ShowToast(L"请先选择商品再支付");
 
 		return;
 	}
@@ -2113,6 +2131,125 @@ void CDiandanPageUI::ClickCanpai()
 	}
 }
 
+//获取通用参数,任何支付方式都要用到的参数,个性化参数在弹框里面处理
+//参考文档 http://apidoc.zhipuzi.com/index.php/home/item/show?item_id=4
+std::map<string, string> CDiandanPageUI::GetSendorderParams()
+{
+	std::map<string, string> params;
+
+	params["order_no"] = CRandomHelper::GetRandString(20);
+
+	//构建food_list参数
+	params["food_list"] = m_cur_diandan_order.getDiandanFoodlistParam();
+	params["foodpackage_array"] = m_cur_diandan_order.getDiandanTaocanParam();
+	params["person_num"] = "1";
+	params["table_name"] = m_canpai;
+	params["note"] = m_cur_diandan_order.GetMemo();
+	params["dabao_price"] = CLewaimaiString::DoubleToString(m_dabao, 2);
+	params["food_price"] = CLewaimaiString::DoubleToString(m_cur_diandan_order.getTotalPrice(), 2);
+	params["total_price"] = CLewaimaiString::DoubleToString(m_cur_diandan_order.getTotalPrice() + m_dabao, 2);
+
+	CEditUI* pZhekouEdit = static_cast<CEditUI*>(this->FindSubControl(_T("diandan_jiesuan_zhekou_value")));
+	wstring ws_zhekou = pZhekouEdit->GetText();
+	params["discount"] = CLewaimaiString::UnicodeToUTF8(ws_zhekou);
+
+	params["coupon"] = CLewaimaiString::DoubleToString(m_rengong_youhui, 2);
+	params["price_plus"] = CLewaimaiString::DoubleToString(m_jiajia, 2);
+	params["price_moling"] = CLewaimaiString::DoubleToString(m_moling_youhui, 2);
+	params["yingshou_value"] = CLewaimaiString::DoubleToString(m_cur_total_price, 2);
+	params["shishou_value"] = CLewaimaiString::DoubleToString(m_cur_total_price, 2);
+	params["zhaoling_value"] = "0";
+
+	params["zhifu_type"] = "";
+
+	if (m_is_youhuiquan)
+	{
+		params["coupon_id"] = m_youhuiquan_id;
+	}
+
+	if (m_is_cika)
+	{
+		params["timescoupon_id"] = m_cika_id;
+	}
+
+	if (m_is_shangpinquan)
+	{
+		params["goodscoupon_id"] = m_shangpinquan_id;
+	}
+
+	if (m_is_quanyika)
+	{
+		params["is_eq_card_discount"] = "1";
+		params["eq_card_discount_value"] = m_quanyika_discount;
+	}
+	else
+	{
+		params["is_eq_card_discount"] = "0";
+	}
+
+	if (m_is_member)
+	{
+		params["member_level"] = m_member_level;
+
+		if (m_is_member_zhekou)
+		{
+			params["member_level_value"] = m_member_zhekou_value;
+		}
+		else
+		{
+			params["member_level_value"] = 10;
+		}
+	}
+
+	if (m_is_cika == true)
+	{
+		params["time_coupon_type"] = m_cika_deduct_type;
+		params["time_coupon_discount_value"] = m_cika_discount_value;
+		params["time_coupon_full_reduce_value"] = m_cika_full_reduce_value;
+		params["time_coupon_offer_value"] = m_cika_offer_value;
+		params["time_coupon_band_food_value"] = CLewaimaiString::DoubleToString(m_cika_youhui, 2);
+	}
+
+	if (m_is_shangpinquan)
+	{
+		params["goods_coupon_band_food_value"] = CLewaimaiString::DoubleToString(m_shangpinquan_youhui, 2);
+	}
+
+	if (m_manjian_youhui > 0)
+	{
+		params["promotion_value"] = CLewaimaiString::DoubleToString(m_manjian_youhui, 2);
+	}
+
+	if (m_youhuiquan_youhui > 0)
+	{
+		params["coupon_value"] = CLewaimaiString::DoubleToString(m_youhuiquan_youhui, 2);
+	}
+
+	if (m_member_zhekou_youhui > 0)
+	{
+		params["member_discount_money"] = CLewaimaiString::DoubleToString(m_member_zhekou_youhui, 2);
+	}
+
+	if (m_zhekou_youhui > 0)
+	{
+		params["shop_discount_money"] = CLewaimaiString::DoubleToString(m_zhekou_youhui, 2);
+	}
+
+	if (m_cika_youhui > 0)
+	{
+		params["timescoupon_discount_money"] = CLewaimaiString::DoubleToString(m_cika_youhui, 2);
+	}
+
+	if (m_quanyika_youhui > 0)
+	{
+		params["eq_card_discount_money"] = CLewaimaiString::DoubleToString(m_quanyika_youhui, 2);
+	}
+
+	params["total_delete_money"] = CLewaimaiString::DoubleToString(m_total_youhui, 2);
+
+	return params;
+}
+
 void CDiandanPageUI::StartWeixinzhifuShoukuan()
 {
 	if (m_is_show_shoukuan == true)
@@ -2122,6 +2259,8 @@ void CDiandanPageUI::StartWeixinzhifuShoukuan()
 
 	if (m_cur_diandan_order.getItemNum() == 0)
 	{
+		m_pMainWnd->ShowToast(L"请先选择商品再支付");
+
 		return;
 	}
 
@@ -2153,6 +2292,9 @@ void CDiandanPageUI::StartWeixinzhifuShoukuan()
 		{
 			//说明收款成功了,需要进行一些后续的处理
 
+			//更新商品库存
+			this->UpdateFoodStock(pShoukuanWnd->m_kucun_string);
+
 			//初始化页面信息
 			InitShow();
 
@@ -2175,6 +2317,8 @@ void CDiandanPageUI::StartHuiyuanShoukuan()
 
 	if (m_cur_diandan_order.getItemNum() == 0)
 	{
+		m_pMainWnd->ShowToast(L"请先选择商品再支付");
+
 		return;
 	}
 
@@ -2206,6 +2350,9 @@ void CDiandanPageUI::StartHuiyuanShoukuan()
 		{
 			//说明收款成功了,需要进行一些后续的处理
 
+			//更新商品库存
+			this->UpdateFoodStock(pShoukuanWnd->m_kucun_string);
+
 			//初始化页面信息
 			InitShow();
 
@@ -2219,127 +2366,66 @@ void CDiandanPageUI::StartHuiyuanShoukuan()
 	}
 }
 
-//获取通用参数,任何支付方式都要用到的参数,个性化参数在弹框里面处理
-//参考文档 http://apidoc.zhipuzi.com/index.php/home/item/show?item_id=4
-std::map<string, string> CDiandanPageUI::GetSendorderParams()
+//开始进行现金收款
+void CDiandanPageUI::StartXianjinShoukuan()
 {
-	std::map<string, string> params;
-
-	params["order_no"] = CRandomHelper::GetRandString(20);
-
-	//构建food_list参数
-	params["food_list"] = m_cur_diandan_order.getDiandanFoodlistParam();
-	params["foodpackage_array"] = m_cur_diandan_order.getDiandanTaocanParam();
-	params["person_num"] = "1";
-	params["table_name"] = m_canpai;
-	params["note"] = m_cur_diandan_order.GetMemo();
-	params["dabao_price"] = CLewaimaiString::DoubleToString(m_dabao, 2);
-	params["food_price"] = CLewaimaiString::DoubleToString(m_cur_diandan_order.getTotalPrice(), 2);
-	params["total_price"] = CLewaimaiString::DoubleToString(m_cur_diandan_order.getTotalPrice() + m_dabao, 2);
-
-	CEditUI* pZhekouEdit = static_cast<CEditUI*>(this->FindSubControl(_T("diandan_jiesuan_zhekou_value")));
-	wstring ws_zhekou = pZhekouEdit->GetText();
-	params["discount"] = CLewaimaiString::UnicodeToUTF8(ws_zhekou);
-
-	params["coupon"] = CLewaimaiString::DoubleToString(m_rengong_youhui, 2);
-	params["price_plus"] = CLewaimaiString::DoubleToString(m_jiajia, 2);
-	params["price_moling"] = CLewaimaiString::DoubleToString(m_moling_youhui, 2);
-	params["yingshou_value"] = CLewaimaiString::DoubleToString(m_cur_total_price, 2);
-	params["shishou_value"] = CLewaimaiString::DoubleToString(m_cur_total_price, 2);
-	params["zhaoling_value"] = "0";
-
-	params["zhifu_type"] = "";
-
-	if (m_is_youhuiquan)
-	{
-		params["coupon_id"] = m_youhuiquan_id;
-	}
-	
-	if (m_is_cika)
+	if (m_is_show_shoukuan == true)
 	{
-		params["timescoupon_id"] = m_cika_id;
+		return;
 	}
 
-	if (m_is_shangpinquan)
+	if (m_cur_diandan_order.getItemNum() == 0)
 	{
-		params["goodscoupon_id"] = m_shangpinquan_id;
-	}
+		m_pMainWnd->ShowToast(L"请先选择商品再支付");
 
-	if (m_is_quanyika)
-	{
-		params["is_eq_card_discount"] = "1";
-		params["eq_card_discount_value"] = m_quanyika_discount;
-	}
-	else
-	{
-		params["is_eq_card_discount"] = "0";
+		return;
 	}
 
-	if (m_is_member)
+	CXianjinShoukuanWnd* pShoukuanWnd = new CXianjinShoukuanWnd();
+	if (pShoukuanWnd != NULL)
 	{
-		params["member_level"] = m_member_level;
+		pShoukuanWnd->Create(m_pManager->GetPaintWindow(), _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
+		pShoukuanWnd->SetIcon(IDI_ICON_DUILIB);
+		pShoukuanWnd->CenterWindow();
 
-		if (m_is_member_zhekou)
-		{
-			params["member_level_value"] = m_member_zhekou_value;
-		}
-		else
+		m_is_show_shoukuan = true;
+
+		std::string format_string = CLewaimaiString::DoubleToString(m_cur_total_price, 2);
+		std::wstring watchValue = CLewaimaiString::UTF8ToUnicode(format_string);
+		pShoukuanWnd->InitMoney(watchValue);
+
+		//这里要对提交订单的参数进行组装,然后方便请求
+		pShoukuanWnd->SetCommonParams(GetSendorderParams());
+
+		/*
+		if (m_is_start_catch && m_catch_string.length() == 18)
 		{
-			params["member_level_value"] = 10;
+			pShoukuanWnd->InitFukuanma(m_catch_string);
 		}
-	}
+		}*/
 
-	if (m_is_cika == true)
-	{
-		params["time_coupon_type"] = m_cika_deduct_type;
-		params["time_coupon_discount_value"] = m_cika_discount_value;
-		params["time_coupon_full_reduce_value"] = m_cika_full_reduce_value;
-		params["time_coupon_offer_value"] = m_cika_offer_value;
-		params["time_coupon_band_food_value"] = CLewaimaiString::DoubleToString(m_cika_youhui, 2);
-	}
+		UINT ret = pShoukuanWnd->ShowModal();
+		if (ret == IDOK)
+		{
+			//说明收款成功了,需要进行一些后续的处理
 
-	if (m_is_shangpinquan)
-	{
-		params["goods_coupon_band_food_value"] = CLewaimaiString::DoubleToString(m_shangpinquan_youhui, 2);
-	}
-	
-	if (m_manjian_youhui > 0)
-	{
-		params["promotion_value"] = CLewaimaiString::DoubleToString(m_manjian_youhui, 2);
-	}
+			//更新商品库存
+			this->UpdateFoodStock(pShoukuanWnd->m_kucun_string);
 
-	if (m_youhuiquan_youhui > 0)
-	{
-		params["coupon_value"] = CLewaimaiString::DoubleToString(m_youhuiquan_youhui, 2);
-	}
-	
-	if (m_member_zhekou_youhui > 0)
-	{
-		params["member_discount_money"] = CLewaimaiString::DoubleToString(m_member_zhekou_youhui, 2);
-	}
+			//初始化页面信息
+			InitShow();
 
-	if (m_zhekou_youhui > 0)
-	{
-		params["shop_discount_money"] = CLewaimaiString::DoubleToString(m_zhekou_youhui, 2);
-	}
-	
-	if (m_cika_youhui > 0)
-	{
-		params["timescoupon_discount_money"] = CLewaimaiString::DoubleToString(m_cika_youhui, 2);
-	}
+			//处理打印
 
-	if (m_quanyika_youhui > 0)
-	{
-		params["eq_card_discount_money"] = CLewaimaiString::DoubleToString(m_quanyika_youhui, 2);
-	}
+		}
 
-	params["total_delete_money"] = CLewaimaiString::DoubleToString(m_total_youhui, 2);
+		delete pShoukuanWnd;
 
-	return params;
+		m_is_show_shoukuan = false;
+	}
 }
 
-//开始进行现金收款
-void CDiandanPageUI::StartXianjinShoukuan()
+void CDiandanPageUI::StartFulikaShoukuan()
 {
 	if (m_is_show_shoukuan == true)
 	{
@@ -2348,10 +2434,12 @@ void CDiandanPageUI::StartXianjinShoukuan()
 
 	if (m_cur_diandan_order.getItemNum() == 0)
 	{
+		m_pMainWnd->ShowToast(L"请先选择商品再支付");
+
 		return;
 	}
 
-	CXianjinShoukuanWnd* pShoukuanWnd = new CXianjinShoukuanWnd();
+	CFulikaShoukuanWnd* pShoukuanWnd = new CFulikaShoukuanWnd();
 	if (pShoukuanWnd != NULL)
 	{
 		pShoukuanWnd->Create(m_pManager->GetPaintWindow(), _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
@@ -2379,6 +2467,9 @@ void CDiandanPageUI::StartXianjinShoukuan()
 		{
 			//说明收款成功了,需要进行一些后续的处理
 
+			//更新商品库存
+			this->UpdateFoodStock(pShoukuanWnd->m_kucun_string);
+
 			//初始化页面信息
 			InitShow();
 
@@ -2392,7 +2483,24 @@ void CDiandanPageUI::StartXianjinShoukuan()
 	}
 }
 
-void CDiandanPageUI::StartFulikaShoukuan()
+void CDiandanPageUI::UpdateFoodStock(std::string food_stock)
+{
+	rapidjson::Document doc;
+	rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); //获取分配器
+
+	Value& data = CLewaimaiJson::StringToJson(food_stock, allocator);
+
+	for (rapidjson::SizeType i = 0; i < data.Size(); ++i)
+	{
+		std::string food_id = data[i]["food_id"].GetString();
+		std::string stock = data[i]["stock"].GetString();
+
+		CSqlite3 sqlite;
+		sqlite.UpdateFoodStock(food_id, stock);
+	}
+}
+
+void CDiandanPageUI::StartZidingyiShoukuan(std::wstring name, std::wstring selfpay_id)
 {
 	if (m_is_show_shoukuan == true)
 	{
@@ -2401,10 +2509,12 @@ void CDiandanPageUI::StartFulikaShoukuan()
 
 	if (m_cur_diandan_order.getItemNum() == 0)
 	{
+		m_pMainWnd->ShowToast(L"请先选择商品再支付");
+
 		return;
 	}
 
-	CFulikaShoukuanWnd* pShoukuanWnd = new CFulikaShoukuanWnd();
+	CZidingyiShoukuanWnd* pShoukuanWnd = new CZidingyiShoukuanWnd();
 	if (pShoukuanWnd != NULL)
 	{
 		pShoukuanWnd->Create(m_pManager->GetPaintWindow(), _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
@@ -2427,11 +2537,17 @@ void CDiandanPageUI::StartFulikaShoukuan()
 		}
 		}*/
 
+		pShoukuanWnd->SetZidingyiName(name);
+		pShoukuanWnd->SetZidingyiId(selfpay_id);
+
 		UINT ret = pShoukuanWnd->ShowModal();
 		if (ret == IDOK)
 		{
 			//说明收款成功了,需要进行一些后续的处理
 
+			//更新商品库存
+			this->UpdateFoodStock(pShoukuanWnd->m_kucun_string);
+
 			//初始化页面信息
 			InitShow();
 

+ 6 - 0
zhipuzi_pos_windows/page/CDiandanPageUI.h

@@ -133,6 +133,12 @@ public:
 	//开始进行福利卡收款
 	void StartFulikaShoukuan();
 
+	//开始自定义支付收款
+	void StartZidingyiShoukuan(std::wstring name, std::wstring selfpay_id);
+
+	//支付成功后,更新商品库存
+	void UpdateFoodStock(std::string food_stock);
+
 private:
 	//获取用于提交订单的参数结构
 	std::map<string, string> GetSendorderParams();

+ 11 - 0
zhipuzi_pos_windows/tool/CSqlite3.cpp

@@ -1207,4 +1207,15 @@ bool CSqlite3::GetFoodById(std::string food_id, CFood& newFood)
 	}
 
 	return is_found;
+}
+
+//¸üÐÂÉÌÆ·IDµÄ¿â´æ
+void CSqlite3::UpdateFoodStock(std::string food_id, std::string stock)
+{
+	int result = sqlite3_exec(m_db, "BEGIN;", 0, 0, 0);
+
+	std::string sql = "UPDATE pos_food SET stock = '" + stock + "' WHERE id = " + food_id;
+	result = sqlite3_exec(m_db, sql.c_str(), 0, 0, 0);
+
+	result = sqlite3_exec(m_db, "COMMIT;", 0, 0, 0);
 }

+ 3 - 0
zhipuzi_pos_windows/tool/CSqlite3.h

@@ -44,6 +44,9 @@ public:
 	//通过商品ID查找商品,如果找到返回true,找不到返回false
 	bool GetFoodById(std::string food_id, CFood& newFood);
 
+	//更新商品ID的库存
+	void UpdateFoodStock(std::string food_id, std::string stock);
+
 private:
 	bool ExeSQl(std::string sql);
 

+ 6 - 0
zhipuzi_pos_windows/wnd/CFulikaShoukuanWnd.cpp

@@ -701,6 +701,9 @@ void CFulikaShoukuanWnd::HandleShoukuan()
 		//支付成功
 		m_shoukuan_status = 3;
 
+		Value& stock = data["stock"];
+		m_kucun_string = CLewaimaiJson::JsonToString(stock);
+
 		SendMessage(WM_SHOUKUAN_STATUS_SUCCESS, 0, 0);
 	}
 	else if (s_status == "fail")
@@ -799,6 +802,9 @@ void CFulikaShoukuanWnd::HandleShoukuanPassword()
 			//支付成功
 			m_shoukuan_status = 3;
 
+			Value& stock = data["stock"];
+			m_kucun_string = CLewaimaiJson::JsonToString(stock);
+
 			SendMessage(WM_SHOUKUAN_STATUS_SUCCESS, 0, 0);
 
 			break;

+ 3 - 0
zhipuzi_pos_windows/wnd/CFulikaShoukuanWnd.h

@@ -110,5 +110,8 @@ public:
 	std::map<string, string> m_commonParams;
 
 	int m_shoukuanModel = 1; //收款模式 1:会员扫码 2:手机号+密码
+
+	//更新库存的字符串
+	std::string m_kucun_string;
 };
 

+ 6 - 0
zhipuzi_pos_windows/wnd/CHuiyuanShoukuanWnd.cpp

@@ -783,6 +783,9 @@ void CHuiyuanShoukuanWnd::HandleShoukuan()
 		//支付成功
 		m_shoukuan_status = 3;
 
+		Value& stock = data["stock"];
+		m_kucun_string = CLewaimaiJson::JsonToString(stock);
+
 		SendMessage(WM_SHOUKUAN_STATUS_SUCCESS, 0, 0);
 	}
 	else if (s_status == "fail")
@@ -881,6 +884,9 @@ void CHuiyuanShoukuanWnd::HandleShoukuanPassword()
 			//支付成功
 			m_shoukuan_status = 3;
 
+			Value& stock = data["stock"];
+			m_kucun_string = CLewaimaiJson::JsonToString(stock);
+
 			SendMessage(WM_SHOUKUAN_STATUS_SUCCESS, 0, 0);
 
 			break;

+ 3 - 0
zhipuzi_pos_windows/wnd/CHuiyuanShoukuanWnd.h

@@ -110,5 +110,8 @@ public:
 	std::map<string, string> m_commonParams;
 
 	int m_shoukuanModel = 1; //收款模式 1:会员扫码 2:手机号+密码
+
+	//更新库存的字符串
+	std::string m_kucun_string;
 };
 

+ 6 - 0
zhipuzi_pos_windows/wnd/CWeixinzhifuShoukuanWnd.cpp

@@ -701,6 +701,9 @@ void CWeixinzhifuShoukuanWnd::HandleShoukuan()
 		//支付成功
 		m_shoukuan_status = 3;
 
+		Value& stock = data["stock"];
+		m_kucun_string = CLewaimaiJson::JsonToString(stock);
+
 		m_out_trade_no = data["trade_no"].GetString();
 
 		SendMessage(WM_SHOUKUAN_STATUS_SUCCESS, 0, 0);
@@ -803,6 +806,9 @@ void CWeixinzhifuShoukuanWnd::HandleShoukuanPassword()
 			//支付成功
 			m_shoukuan_status = 3;
 
+			Value& stock = data["stock"];
+			m_kucun_string = CLewaimaiJson::JsonToString(stock);
+
 			m_out_trade_no = data["out_trade_no"].GetString();
 
 			SendMessage(WM_SHOUKUAN_STATUS_SUCCESS, 0, 0);

+ 3 - 0
zhipuzi_pos_windows/wnd/CWeixinzhifuShoukuanWnd.h

@@ -107,5 +107,8 @@ public:
 	int m_timer_now = 4;
 
 	std::map<string, string> m_commonParams;
+
+	//¸üÐÂ¿â´æµÄ×Ö·û´®
+	std::string m_kucun_string;
 };
 

+ 890 - 0
zhipuzi_pos_windows/wnd/CZidingyiShoukuanWnd.cpp

@@ -0,0 +1,890 @@
+#include "../pch/pch.h"
+#include "CZidingyiShoukuanWnd.h"
+
+#include "CMessageboxWnd.h"
+
+#include "../helper/CSpeech.h"
+
+#include "../helper/MD5.h"
+
+#define WM_TIMER_WND_CLOSE 200001
+
+void CZidingyiShoukuanWnd::Init()
+{
+	//::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
+}
+
+void CZidingyiShoukuanWnd::Notify(TNotifyUI& msg)
+{
+	if (msg.sType == _T("click"))
+	{
+		if (msg.pSender->GetName() == _T("closebtn"))
+		{
+			Close(IDCANCEL);
+			return;
+		}
+		else if (msg.pSender->GetName() == _T("shoukuanBtn"))
+		{
+			StartShoukuan();
+		}
+	}
+}
+
+LRESULT CZidingyiShoukuanWnd::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("zidingyi_shoukuan_wnd.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;
+}
+
+LRESULT CZidingyiShoukuanWnd::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	//销毁定时器
+	KillTimer(m_hWnd, WM_TIMER_WND_CLOSE);
+
+	bHandled = FALSE;
+	return 0;
+}
+
+/*
+ *这个是窗口被销毁的时候调用的
+ **/
+LRESULT CZidingyiShoukuanWnd::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	bHandled = FALSE;
+	return 0;
+}
+
+LRESULT CZidingyiShoukuanWnd::OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	if (::IsIconic(*this))
+	{
+		bHandled = FALSE;
+	}
+
+	return (wParam == 0) ? TRUE : FALSE;
+}
+
+LRESULT CZidingyiShoukuanWnd::OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	return 0;
+}
+
+LRESULT CZidingyiShoukuanWnd::OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	//自定义支付暂时不需要
+	//UpdateFocus();
+
+	return 0;
+}
+
+LRESULT CZidingyiShoukuanWnd::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 CZidingyiShoukuanWnd::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 CZidingyiShoukuanWnd::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	bHandled = TRUE;
+
+	return 0;
+}
+
+LRESULT CZidingyiShoukuanWnd::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	if (wParam != WM_TIMER_WND_CLOSE)
+	{
+		bHandled = FALSE;
+		return 0;
+	}
+
+	if (m_shoukuan_status == 0 || m_shoukuan_status == 1)
+	{
+	}
+	else if (m_shoukuan_status == 2)
+	{
+	}
+	else if (m_shoukuan_status == 3)
+	{
+		m_timer_now--;
+
+		if (m_timer_now > 0)
+		{
+			CLabelUI* attention = static_cast<CLabelUI*>(m_pm.FindControl(_T("shouyin_pay_success_attention")));
+			std::wstring ws_attention = L"按任意键关闭窗口," + to_wstring(m_timer_now) + L" 秒后自动关闭";
+			attention->SetText(ws_attention.c_str());
+		}
+		else
+		{
+			Close(IDOK);
+		}
+	}
+	else if (m_shoukuan_status == 4)
+	{
+		m_timer_now--;
+
+		if (m_timer_now > 0)
+		{
+			CLabelUI* pFailMessage = static_cast<CLabelUI*>(m_pm.FindControl(_T("shouyin_pay_fail_attention")));
+
+			std::wstring ws_fail_message = L"失败信息:" + m_fail_message + L",按任意键关闭窗口,";
+			std::wstring ws_attention = ws_fail_message + to_wstring(m_timer_now) + L" 秒后自动关闭";
+
+			pFailMessage->SetText(ws_attention.c_str());
+		}
+		else
+		{
+			Close(IDCANCEL);
+		}
+	}
+
+	bHandled = TRUE;
+
+	return 0;
+}
+
+LRESULT CZidingyiShoukuanWnd::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_CLOSE:
+		lRes = OnClose(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_DESTROY:
+		lRes = OnDestroy(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;
+	case WM_MOUSEHOVER:
+		lRes = OnMouseMove(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_SHOUKUAN_STATUS_NEEDPASSWORD:
+		lRes = OnShoukuanNeedPassword(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_SHOUKUAN_STATUS_SUCCESS:
+		lRes = OnShoukuanSuccess(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_SHOUKUAN_STATUS_FAIL:
+		lRes = OnShoukuanFail(uMsg, wParam, lParam, bHandled);
+		break;
+	case WM_TIMER:
+		lRes = OnTimer(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 CZidingyiShoukuanWnd::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
+{
+	if (uMsg == WM_KEYDOWN)
+	{
+		if (wParam == VK_RETURN)
+		{
+			if (m_shoukuan_status == 0)
+			{
+				StartShoukuan();
+			}
+			else if (m_shoukuan_status == 1 || m_shoukuan_status == 2 || m_shoukuan_status == 5)
+			{
+				//正在支付的过程中,这个时候按Enter键,不做任何处理
+			}
+			else if (m_shoukuan_status == 3)
+			{
+				//已经明确成功或者失败了,那么久直接关闭就可以了
+				Close(IDOK);
+			}
+			else if (m_shoukuan_status == 4)
+			{
+				Close(IDCANCEL);
+			}
+
+			return true;
+		}
+		else if (wParam == VK_ESCAPE)
+		{
+			if (m_shoukuan_status == 0)
+			{
+				//还没开始支付,按Esc直接退出
+				Close(IDCANCEL);
+			}
+			else if (m_shoukuan_status == 1 || m_shoukuan_status == 5)
+			{
+				//不能做任何处理
+			}
+			else if (m_shoukuan_status == 2)
+			{
+				//查询密码的过程中,取消付款
+				CancelShoukuanPassword();
+			}
+			else if (m_shoukuan_status == 3)
+			{
+				Close(IDOK);
+			}
+			else if (m_shoukuan_status == 4)
+			{
+				Close(IDCANCEL);
+			}
+
+			return true;
+		}
+
+		if (m_shoukuan_status == 3)
+		{
+			Close(IDOK);
+
+			return true;
+		}
+		else if (m_shoukuan_status == 4)
+		{
+			Close(IDCANCEL);
+
+			return true;
+		}
+	}
+
+	return false;
+}
+
+void CZidingyiShoukuanWnd::InitMoney(std::wstring value)
+{
+	CHorizontalLayoutUI* pInputLayout = static_cast<CHorizontalLayoutUI*>(m_pm.FindControl(_T("shoukuan_money_input_layout")));
+	pInputLayout->SetVisible(false);
+
+	CHorizontalLayoutUI* pShowLayout = static_cast<CHorizontalLayoutUI*>(m_pm.FindControl(_T("shoukuan_money_show_layout")));
+	pShowLayout->SetVisible(true);
+
+	CLabelUI* pMoneyLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuan_money_show_money")));
+	if (pMoneyLabel)
+	{
+		pMoneyLabel->SetText(value.c_str());
+	}
+
+	m_is_money_init = true;
+	m_money = value;
+}
+
+void CZidingyiShoukuanWnd::InitFukuanma(std::string fukuanma)
+{
+	std::wstring ws_fukuanma = CLewaimaiString::UTF8ToUnicode(fukuanma);
+
+	CLabelUI* pFukuanmaLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("shishou_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 CZidingyiShoukuanWnd::SetCommonParams(std::map<string, string> params)
+{
+	m_commonParams = params;
+}
+
+void CZidingyiShoukuanWnd::UpdateFocus()
+{
+	if (m_is_money_init == false)
+	{
+		//如果没初始化,这个时候有2个编辑框,不能抢焦点
+		CEditUI* pMoneyEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("money_edit")));
+
+		pMoneyEdit->SetFocus();
+
+		//下一个焦点的,就设置为这个控件
+		m_pm.SetFocusNeeded(pMoneyEdit);
+
+		//这个干嘛的不知道,但是不加好像不行
+		m_pm.SetNextTabControl(false);
+	}
+	else
+	{
+		CEditUI* pFukuanEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("shishou_edit")));
+
+		pFukuanEdit->SetFocus();
+	}
+}
+
+LRESULT CZidingyiShoukuanWnd::OnShoukuanNeedPassword(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	wstring path = CSystem::GetProgramDir() + L"\\music\\pay_password.wav";
+
+	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"用户支付中,需要输入密码");
+
+	//需要用户输入密码,开始查询状态
+	std::thread(&CZidingyiShoukuanWnd::HandleShoukuanPassword, this).detach();
+
+	bHandled = TRUE;
+	return 0;
+}
+
+LRESULT CZidingyiShoukuanWnd::OnShoukuanSuccess(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	//判断是否要打印
+	/*
+	int dayinji_setting_auto_print = atoi(CSetting::GetParam("system_setting_dayinji_setting_auto_print").c_str());
+	if (dayinji_setting_auto_print == 1)
+	{
+		m_valueWnd->PrintZhifu(m_out_trade_no);
+	}
+	}*/
+
+	//播放收款成功的金额
+	//if (CSetting::GetParam("shoukuan_setting_yuyinbobao") == "1")
+	//{
+	std::thread(&CZidingyiShoukuanWnd::ReadShoukuanValue, this).detach();
+	//}
+
+	CVerticalLayoutUI* paying_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_paying_layout")));
+	paying_layout->SetVisible(false);
+
+	CVerticalLayoutUI* pay_success_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_pay_success_layout")));
+	pay_success_layout->SetVisible(true);
+
+	CLabelUI* pMoneyPaySuccess = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuan_pay_success_money")));
+
+	std::wstring valueInfo = L"成功收款:¥" + m_money;
+	pMoneyPaySuccess->SetText(valueInfo.c_str());
+
+	CHorizontalLayoutUI* wx_logo = static_cast<CHorizontalLayoutUI*>(m_pm.FindControl(_T("shoukuan_pay_success_logo_wx")));
+	CHorizontalLayoutUI* zhifubao_logo = static_cast<CHorizontalLayoutUI*>(m_pm.FindControl(_T("shoukuan_pay_success_logo_zhifubao")));
+
+	wx_logo->SetVisible(true);
+	zhifubao_logo->SetVisible(false);
+
+	CLabelUI* attention = static_cast<CLabelUI*>(m_pm.FindControl(_T("shouyin_pay_success_attention")));
+	std::wstring ws_attention = L"按任意键关闭窗口," + to_wstring(m_timer_now) + L" 秒后自动关闭";
+	attention->SetText(ws_attention.c_str());
+
+	SetTimer(m_hWnd, WM_TIMER_WND_CLOSE, 1000, NULL);
+
+	SetFocus(m_hWnd);
+
+	bHandled = TRUE;
+	return 0;
+}
+
+LRESULT CZidingyiShoukuanWnd::OnShoukuanFail(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	wstring path = CSystem::GetProgramDir() + L"\\music\\pay_fail.wav";
+
+	//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);
+
+	CVerticalLayoutUI* pay_fail_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_pay_fail_layout")));
+	pay_fail_layout->SetVisible(true);
+
+	CHorizontalLayoutUI* title_layout = static_cast<CHorizontalLayoutUI*>(m_pm.FindControl(_T("shoukuan_title_bkg")));
+	title_layout->SetBkColor(0xFFD33E3A);
+
+	CLabelUI* pFailMessage = static_cast<CLabelUI*>(m_pm.FindControl(_T("shouyin_pay_fail_attention")));
+
+	std::wstring ws_fail_message = L"失败信息:" + m_fail_message + L",按任意键关闭窗口,";
+	std::wstring ws_attention = ws_fail_message + to_wstring(m_timer_now) + L" 秒后自动关闭";
+
+	pFailMessage->SetText(ws_attention.c_str());
+
+	SetTimer(m_hWnd, WM_TIMER_WND_CLOSE, 1000, NULL);
+
+	SetFocus(m_hWnd);
+
+	bHandled = TRUE;
+	return 0;
+}
+
+void CZidingyiShoukuanWnd::StartShoukuan()
+{
+	CLabelUI* pLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuanresult")));
+
+	//检查收款金额
+	if (m_is_money_init == false)
+	{
+		CEditUI* pMoneyEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("money_edit")));
+		m_money = pMoneyEdit->GetText();
+
+		if (m_money == L"")
+		{
+			pLabel->SetText(L"收款金额不能为空,请重新输入!");
+			pLabel->SetVisible(true);
+
+			return;
+		}
+
+		if (m_money == L"0.00")
+		{
+			pLabel->SetText(L"收款金额不能为 0 元,请重新输入!");
+			pLabel->SetVisible(true);
+
+			return;
+		}
+
+		double money_value = atof(CLewaimaiString::UnicodeToUTF8(m_money).c_str());
+		if (!money_value || money_value < 0.01)
+		{
+			pLabel->SetText(L"收款金额错误,请重新输入!");
+			pLabel->SetVisible(true);
+
+			return;
+		}
+	}
+
+	//全部验证通过,就可以开始修改状态了
+	m_shoukuan_status = 1;
+
+	//不加这个的话,edit按回车之后样式有问题
+	SetFocus(m_hWnd);
+
+	CVerticalLayoutUI* before_pay_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_before_pay_layout")));
+	before_pay_layout->SetVisible(false);
+
+	CVerticalLayoutUI* paying_layout = static_cast<CVerticalLayoutUI*>(m_pm.FindControl(_T("shoukuan_paying_layout")));
+	paying_layout->SetVisible(true);
+
+	CLabelUI* pMoneyPaying = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuan_paying_money")));
+
+	std::wstring valueInfo = L"付款金额:¥" + m_money;
+	pMoneyPaying->SetText(valueInfo.c_str());
+
+	//开启一个线程,开始处理登录
+	std::thread(&CZidingyiShoukuanWnd::HandleShoukuan, this).detach();
+}
+
+void CZidingyiShoukuanWnd::HandleShoukuan()
+{
+	//生成随机的order_no
+
+	m_commonParams["zhifu_type"] = to_string(5);
+	m_commonParams["zhifu_code"] = "";
+	m_commonParams["zidingyi_pay_id"] = m_zidingyi_pay_id;
+
+	std::string response;
+
+	std::string url = "/diancan/sendorder";
+	bool ret = CZhipuziHttpClient::Request(url.c_str(), m_commonParams, response);
+	if (ret == false)
+	{
+		m_shoukuan_status = 4;
+
+		m_fail_message = L"请求服务器失败,请检查网络设置!";
+
+		SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+		return;
+	}
+
+	rapidjson::Document document;
+	document.Parse(response.c_str());
+
+	if (document.HasParseError())
+	{
+		LOG_INFO("parse response error!");
+		m_shoukuan_status = 4;
+
+		m_fail_message = L"服务器错误";
+
+		SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+		return;
+	}
+
+	if (!document.HasMember("errcode") || !document.HasMember("errmsg"))
+	{
+		LOG_INFO("json error!");
+		m_shoukuan_status = 4;
+
+		m_fail_message = L"服务器错误";
+
+		SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+		return;
+	}
+
+	rapidjson::Value& v_errcode = document["errcode"];
+	int errcode = v_errcode.GetInt();
+	if (errcode != 0)
+	{
+		LOG_INFO("response failed! message:" << document["errmsg"].GetString());
+		m_shoukuan_status = 4;
+
+		std::string errmsg = document["errmsg"].GetString();
+		m_fail_message = CLewaimaiString::UTF8ToUnicode(errmsg);
+
+		SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+		return;
+	}
+
+	if (!document.HasMember("data"))
+	{
+		LOG_INFO("json error!");
+		m_shoukuan_status = 4;
+
+		m_fail_message = L"服务器错误";
+
+		SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+		return;
+	}
+
+	rapidjson::Value& data = document["data"];
+	rapidjson::Value& status = data["status"];
+
+	std::string s_status = status.GetString();
+
+	if (s_status == "success")
+	{
+		//支付成功
+		m_shoukuan_status = 3;
+
+		Value& stock = data["stock"];
+		m_kucun_string = CLewaimaiJson::JsonToString(stock);
+
+		SendMessage(WM_SHOUKUAN_STATUS_SUCCESS, 0, 0);
+	}
+	else if (s_status == "fail")
+	{
+		//支付失败
+		m_shoukuan_status = 4;
+
+		m_fail_message = CLewaimaiString::UTF8ToUnicode(data["message"].GetString());
+
+		SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+	}
+	else if (s_status == "password")
+	{
+		m_shoukuan_status = 2;
+
+		//需要查询支付状态
+		SendMessage(WM_SHOUKUAN_STATUS_NEEDPASSWORD, 0, 0);
+	}
+	else
+	{
+		m_shoukuan_status = 4;
+
+		m_fail_message = L"服务器错误";
+
+		SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+	}
+}
+
+void CZidingyiShoukuanWnd::HandleShoukuanPassword()
+{
+	std::map<string, string> params;
+
+	params["trade_no"] = "";
+
+	while (m_shoukuan_status == 2)
+	{
+		std::string response;
+
+		std::string url = "/diancan/queryorderstatus";
+		bool ret = CZhipuziHttpClient::Request(url.c_str(), params, response);
+		if (ret == false)
+		{
+			m_shoukuan_status = 4;
+
+			m_fail_message = L"请求服务器失败,请检查网络设置!";
+
+			SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+			return;
+		}
+
+		rapidjson::Document document;
+		document.Parse(response.c_str());
+
+		if (document.HasParseError())
+		{
+			LOG_INFO("parse response error!");
+			m_shoukuan_status = 4;
+
+			m_fail_message = L"服务器错误";
+
+			SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+			return;
+		}
+
+		if (!document.HasMember("errcode") || !document.HasMember("errmsg") || !document.HasMember("data"))
+		{
+			LOG_INFO("json error!");
+			m_shoukuan_status = 4;
+
+			m_fail_message = L"服务器错误";
+
+			SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+			return;
+		}
+
+		rapidjson::Value& v_errcode = document["errcode"];
+		int errcode = v_errcode.GetInt();
+		if (errcode != 0)
+		{
+			LOG_INFO("response failed! message:" << document["errmsg"].GetString());
+			m_shoukuan_status = 4;
+
+			m_fail_message = L"服务器错误";
+
+			SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+			return;
+		}
+
+		rapidjson::Value& data = document["data"];
+		rapidjson::Value& status = data["status"];
+
+		std::string s_status = status.GetString();
+
+		if (s_status == "success")
+		{
+			//支付成功
+			m_shoukuan_status = 3;
+
+			Value& stock = data["stock"];
+			m_kucun_string = CLewaimaiJson::JsonToString(stock);
+
+			SendMessage(WM_SHOUKUAN_STATUS_SUCCESS, 0, 0);
+
+			break;
+		}
+		else if (s_status == "closed")
+		{
+			//表示顾客那边出问题,已经失败了
+			m_shoukuan_status = 4;
+
+			m_fail_message = L"顾客取消支付,请重新扫码收款";
+
+			SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+
+			break;
+		}
+		else if (s_status == "fail")
+		{
+			//这个只是表示状态未知
+			Sleep(1000);
+		}
+		else
+		{
+			m_shoukuan_status = 4;
+
+			m_fail_message = L"服务器错误";
+
+			SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+			break;
+		}
+	}
+}
+
+void CZidingyiShoukuanWnd::CancelShoukuanPassword()
+{
+	m_shoukuan_status = 5;
+
+	std::thread(&CZidingyiShoukuanWnd::HandleCancelShoukuan, this).detach();
+}
+
+void CZidingyiShoukuanWnd::HandleCancelShoukuan()
+{
+	std::map<string, string> params;
+
+	params["trade_no"] = "";
+
+	std::string response;
+
+	std::string url = "/diancan/closeorder";
+	bool ret = CZhipuziHttpClient::Request(url.c_str(), params, response);
+	if (ret == false)
+	{
+		m_shoukuan_status = 4;
+
+		m_fail_message = L"请求服务器失败,请检查网络设置!";
+
+		SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+		return;
+	}
+
+	rapidjson::Document document;
+	document.Parse(response.c_str());
+
+	if (document.HasParseError())
+	{
+		LOG_INFO("parse response error!");
+		m_shoukuan_status = 4;
+
+		m_fail_message = L"服务器错误";
+
+		SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+		return;
+	}
+
+	if (!document.HasMember("errcode") || !document.HasMember("errmsg") || !document.HasMember("data"))
+	{
+		LOG_INFO("json error!");
+		m_shoukuan_status = 4;
+
+		m_fail_message = L"服务器错误";
+
+		SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+		return;
+	}
+
+	rapidjson::Value& v_errcode = document["errcode"];
+	int errcode = v_errcode.GetInt();
+	if (errcode != 0)
+	{
+		LOG_INFO("response failed! message:" << document["errmsg"].GetString());
+		m_shoukuan_status = 4;
+
+		m_fail_message = L"服务器错误";
+
+		SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+		return;
+	}
+
+	rapidjson::Value& data = document["data"];
+	rapidjson::Value& status = data["status"];
+
+	std::string s_status = status.GetString();
+
+	if (s_status == "success")
+	{
+		//取消成功,订单变为失败状态
+		m_shoukuan_status = 4;
+
+		m_fail_message = L"商家取消收款";
+		SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+	}
+
+	m_shoukuan_status = 4;
+
+	m_fail_message = L"服务器错误";
+
+	SendMessage(WM_SHOUKUAN_STATUS_FAIL, 0, 0);
+}
+
+bool CZidingyiShoukuanWnd::IsCanClose()
+{
+	if (m_shoukuan_status == 0 || m_shoukuan_status == 3 || m_shoukuan_status == 4)
+	{
+		return true;
+	}
+
+	return false;
+}
+
+void CZidingyiShoukuanWnd::ReadShoukuanValue()
+{
+	CSpeech::SpeakNum(1, CLewaimaiString::UnicodeToUTF8(m_money));
+}
+
+void CZidingyiShoukuanWnd::SetZidingyiName(std::wstring name)
+{
+	m_zidingyi_name = CLewaimaiString::UnicodeToUTF8(name);
+
+	CLabelUI* pName = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuan_version")));
+	pName->SetText((name + L"收款").c_str());
+
+	CLabelUI* pAttention = static_cast<CLabelUI*>(m_pm.FindControl(_T("shoukuan_attention")));
+	pAttention->SetText((L"确定使用" + name + L"支付吗?").c_str());
+}
+
+void CZidingyiShoukuanWnd::SetZidingyiId(std::wstring selfpay_id)
+{
+	m_zidingyi_pay_id = CLewaimaiString::UnicodeToUTF8(selfpay_id);
+}

+ 117 - 0
zhipuzi_pos_windows/wnd/CZidingyiShoukuanWnd.h

@@ -0,0 +1,117 @@
+#pragma once
+
+#include "../pch/pch.h"
+
+class CZidingyiShoukuanWnd : public CWindowWnd, public INotifyUI, public IMessageFilterUI
+{
+public:
+	CZidingyiShoukuanWnd()
+	{
+
+	}
+
+	LPCTSTR GetWindowClassName() const
+	{
+		return _T("UIShoukuanFrame");
+	};
+
+	UINT GetClassStyle() const
+	{
+		return UI_CLASSSTYLE_DIALOG;
+	};
+
+	void OnFinalMessage(HWND /*hWnd*/)
+	{
+		m_pm.RemovePreMessageFilter(this);
+	};
+
+	void Init();
+
+	void Notify(TNotifyUI& msg);
+
+	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	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 OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnShoukuanNeedPassword(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnShoukuanSuccess(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+	LRESULT OnShoukuanFail(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 InitMoney(std::wstring value);
+
+	void InitFukuanma(std::string fukuanma);
+
+	void SetCommonParams(std::map<string, string> params);
+
+	void UpdateFocus();
+
+	//点击确认,开始执行收款
+	void StartShoukuan();
+
+	//处理收款
+	void HandleShoukuan();
+
+	//处理收款的密码查询
+	void HandleShoukuanPassword();
+
+	//取消查询密码
+	void CancelShoukuanPassword();
+
+	//处理取消收款
+	void HandleCancelShoukuan();
+
+	bool IsCanClose();
+
+	void ReadShoukuanValue();
+
+	void SetZidingyiName(std::wstring name);
+	void SetZidingyiId(std::wstring selfpay_id);
+
+public:
+	CPaintManagerUI m_pm;
+
+	bool m_is_money_init = false;
+	std::wstring m_money;
+
+	std::string m_order_no;
+	std::string m_out_trade_no;
+
+	//收款状态 0:未开始 1:请求发给服务器了,但是暂时还没得到反馈 2:查询密码中 3:成功 4:失败 5:正在取消支付
+	int m_shoukuan_status = 0;
+
+	std::wstring m_fail_message;
+
+	//窗口关闭的定时器时间
+	int m_timer_now = 4;
+
+	std::map<string, string> m_commonParams;
+
+	std::string m_zidingyi_name;
+	std::string m_zidingyi_pay_id;
+
+	//更新库存的字符串
+	std::string m_kucun_string;
+};
+

+ 2 - 0
zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj

@@ -225,6 +225,7 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     </PostBuildEvent>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClInclude Include="wnd\CZidingyiShoukuanWnd.h" />
     <ClInclude Include="wnd\CToastWnd.h" />
     <ClInclude Include="wnd\CFulikaShoukuanWnd.h" />
     <ClInclude Include="wnd\CXianjinShoukuanWnd.h" />
@@ -289,6 +290,7 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     <ClInclude Include="helper\CSystem.h" />
   </ItemGroup>
   <ItemGroup>
+    <ClCompile Include="wnd\CZidingyiShoukuanWnd.cpp" />
     <ClCompile Include="wnd\CToastWnd.cpp" />
     <ClCompile Include="wnd\CFulikaShoukuanWnd.cpp" />
     <ClCompile Include="wnd\CXianjinShoukuanWnd.cpp" />

+ 6 - 0
zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj.filters

@@ -201,6 +201,9 @@
     <ClInclude Include="wnd\CToastWnd.h">
       <Filter>头文件</Filter>
     </ClInclude>
+    <ClInclude Include="wnd\CZidingyiShoukuanWnd.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="pch\pch.cpp">
@@ -365,6 +368,9 @@
     <ClCompile Include="wnd\CToastWnd.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
+    <ClCompile Include="wnd\CZidingyiShoukuanWnd.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <Image Include="resource\zhipuzi.ico">