Bladeren bron

商品选属性的完成了

zhangyang 4 jaren geleden
bovenliggende
commit
4ac178c99d
28 gewijzigde bestanden met toevoegingen van 910 en 100 verwijderingen
  1. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/db/pos.db
  2. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/dump/2021-08-29-15-30-59.dmp
  3. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/dump/2021-08-29-17-39-32.dmp
  4. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/dump/2021-08-29-17-39-34.dmp
  5. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/dump/2021-08-29-21-21-44.dmp
  6. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/Btn_White.png
  7. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/Btn_White_Click.png
  8. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/Btn_White_Hover.png
  9. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/Dialog_BG1.png
  10. BIN
      bin/Win32/Debug/zhipuzi_pos_windows/skin/EditBg.png
  11. 10 6
      bin/Win32/Debug/zhipuzi_pos_windows/skin/diandan_cart_item.xml
  12. 11 0
      bin/Win32/Debug/zhipuzi_pos_windows/skin/diandan_nature_item.xml
  13. 22 0
      bin/Win32/Debug/zhipuzi_pos_windows/skin/diandan_nature_wnd.xml
  14. 4 4
      bin/Win32/Debug/zhipuzi_pos_windows/skin/diandan_page.xml
  15. 22 0
      zhipuzi_pos_windows/control/CDiandanFoodItemUI.cpp
  16. 2 22
      zhipuzi_pos_windows/control/CDiandanFoodItemUI.h
  17. 150 0
      zhipuzi_pos_windows/control/CDiandanNatureItemUI.cpp
  18. 72 0
      zhipuzi_pos_windows/control/CDiandanNatureItemUI.h
  19. 5 0
      zhipuzi_pos_windows/control/ControlEx.h
  20. 13 0
      zhipuzi_pos_windows/helper/CLewaimaiJson.cpp
  21. 10 0
      zhipuzi_pos_windows/helper/CLewaimaiJson.h
  22. 110 48
      zhipuzi_pos_windows/page/CDiandanPageUI.cpp
  23. 1 1
      zhipuzi_pos_windows/page/CDiandanPageUI.h
  24. 267 0
      zhipuzi_pos_windows/wnd/CDiandanNatureWnd.cpp
  25. 70 0
      zhipuzi_pos_windows/wnd/CDiandanNatureWnd.h
  26. 125 19
      zhipuzi_pos_windows/zhipuzi/CDiandanOrder.h
  27. 4 0
      zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj
  28. 12 0
      zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj.filters

BIN
bin/Win32/Debug/zhipuzi_pos_windows/db/pos.db


BIN
bin/Win32/Debug/zhipuzi_pos_windows/dump/2021-08-29-15-30-59.dmp


BIN
bin/Win32/Debug/zhipuzi_pos_windows/dump/2021-08-29-17-39-32.dmp


BIN
bin/Win32/Debug/zhipuzi_pos_windows/dump/2021-08-29-17-39-34.dmp


BIN
bin/Win32/Debug/zhipuzi_pos_windows/dump/2021-08-29-21-21-44.dmp


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


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


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


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


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


+ 10 - 6
bin/Win32/Debug/zhipuzi_pos_windows/skin/diandan_cart_item.xml

@@ -1,11 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <Window> 
-	<ListContainerElement name="diandan_cart_item" height="60"> 
-		<HorizontalLayout> 
-			<Label name="diandan_cart_item_name" width="180" height="80" align="left"/> 
-			<Label name="diandan_cart_item_num" width="60" align="left"/> 
-			<Label name="diandan_cart_item_price" width="60" align="left"/>
-		</HorizontalLayout> 
+	<ListContainerElement name="diandan_cart_item" width="350" height="42">
+		<VerticalLayout>
+			<HorizontalLayout height="42"> 
+				<Label name="diandan_cart_item_name" width="220" height="42" align="left" endellipsis="true" />
+				<Control width="10"></Control>
+				<Label name="diandan_cart_item_num" width="60" align="left"/> 
+				<Label name="diandan_cart_item_price" width="60" align="left"/>
+			</HorizontalLayout>
+			<Label name="diandan_cart_item_nature" width="220" height="42" align="left" padding="0,0,10,0" textcolor="#FF808080" visible="false" multiline="true" endellipsis="true" />
+		</VerticalLayout>
 	</ListContainerElement> 
 </Window>

+ 11 - 0
bin/Win32/Debug/zhipuzi_pos_windows/skin/diandan_nature_item.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Window>
+	<Font id="diandan_nature_layout_name" name="微软雅黑" size="18" />
+	<DiandanNatureItem padding="0,10,0,0">
+		<Label name="diandan_nature_layout_name" text="" font="diandan_nature_layout_name" height="30" />
+		
+		<HorizontalLayout name="diandan_nature_layout_value">
+
+		</HorizontalLayout>
+	</DiandanNatureItem>
+</Window>

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

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Window size="800,600" caption="0,0,0,36" roundcorner="4,4" >
+	<VerticalLayout bkimage="file='Dialog_BG1.png' corner='4,50,4,4'">
+		<HorizontalLayout height="40" inset="10,2,10,0">
+			<Label name="diandan_nature_title" text="选择商品属性" width="150" />
+			<Control />
+		</HorizontalLayout>
+		<VerticalLayout inset="15,0,15,15" vscrollbar="true" >
+			<Control height="20" />
+			
+			<VerticalLayout name="diandan_nature_layout" height="418" vscrollbar="true">
+				
+			</VerticalLayout>
+		</VerticalLayout>
+		
+		<HorizontalLayout height="56" valign="center" padding="0,30,0,20">
+			<Control />
+			<Button name="diandan_nature_save" align="center" width="280" height="44" 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 />
+		</HorizontalLayout>
+	</VerticalLayout>
+</Window>

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

@@ -6,9 +6,9 @@
 	
 	<DiandanPage>
 		<HorizontalLayout>
-			<VerticalLayout width="450">
+			<VerticalLayout width="480">
 				<HorizontalLayout>
-					<VerticalLayout bkcolor="#FFFFFFFF" width="320" padding="15,15,0,0">
+					<VerticalLayout bkcolor="#FFFFFFFF" width="350" padding="15,15,0,0">
 						<HorizontalLayout height="70">
 							<Control></Control>
 							<Button name="btn_diandan_cundan" width="70" height="36" padding="0,15,20,0" text="存单" textcolor="#FFFFFFFF" />
@@ -19,12 +19,12 @@
 						
 						<List name="list_diandan_cart" padding="0,10,0,0" itemlinecolor="#FF000000" vscrollbar="true">
 							<ListHeader />
-							<ListHeaderItem text="商品" width="180" align="left" />
+							<ListHeaderItem text="商品" width="230" align="left" />
 							<ListHeaderItem text="数量" width="60" align="left" />
 							<ListHeaderItem text="金额" width="60" align="left" />
 						</List>
 						
-						<Label text="5份 ¥100" font="0" textcolor="#FFFF0000" height="40" align="right" padding="0,10,15,0"></Label>
+						<Label name="diandan_page_totalprice" text="" font="0" textcolor="#FFFF0000" height="40" align="right" padding="0,10,15,0"></Label>
 						
 						<HorizontalLayout height="70">
 							<Button name="btn_diandan_zhengdanbeizhu" width="80" height="36" padding="0,15,20,0" text="整单备注" textcolor="#FFFFFFFF" />

+ 22 - 0
zhipuzi_pos_windows/control/CDiandanFoodItemUI.cpp

@@ -12,6 +12,28 @@ CDiandanFoodItemUI::~CDiandanFoodItemUI()
 {
 }
 
+void CDiandanFoodItemUI::DoEvent(TEventUI& event)
+{
+	if (event.Type == UIEVENT_BUTTONUP)
+	{
+		m_pManager->SendNotify(this, DUI_MSGTYPE_CLICK);
+	}
+	else if (event.Type == UIEVENT_MOUSEENTER)
+	{
+		HCURSOR hcur = LoadCursor(NULL, IDC_HAND);  //加载系统自带鼠标样式
+		HWND hwnd = m_pManager->GetPaintWindow(); // 获取绘图窗口句柄
+		SetClassLong(hwnd, GCL_HCURSOR, (long)hcur);
+	}
+	else if (event.Type == UIEVENT_MOUSELEAVE)
+	{
+		HCURSOR hcur = LoadCursor(NULL, IDC_ARROW);  //加载系统自带鼠标样式
+		HWND hwnd = m_pManager->GetPaintWindow(); // 获取绘图窗口句柄
+		SetClassLong(hwnd, GCL_HCURSOR, (long)hcur);
+	}
+
+	CVerticalLayoutUI::DoEvent(event);
+}
+
 void CDiandanFoodItemUI::SetFoodInfo(CFood info)
 {
 	m_foodinfo = info;

+ 2 - 22
zhipuzi_pos_windows/control/CDiandanFoodItemUI.h

@@ -15,6 +15,8 @@ public:
 	CDiandanFoodItemUI();
 	~CDiandanFoodItemUI();
 
+	void DoEvent(TEventUI& event);
+
 	void SetFoodInfo(CFood info);
 	void SetFoodpackageInfo(CFoodpackage info);
 
@@ -25,28 +27,6 @@ public:
 	//刷新显示
 	void UpdateShow();
 
-	void DoEvent(TEventUI& event)
-	{
-		if (event.Type == UIEVENT_BUTTONDOWN)
-		{
-			m_pManager->SendNotify(this, DUI_MSGTYPE_CLICK);
-		}
-		else if (event.Type == UIEVENT_MOUSEENTER)
-		{
-			HCURSOR hcur = LoadCursor(NULL, IDC_HAND);  //加载系统自带鼠标样式
-			HWND hwnd = m_pManager->GetPaintWindow(); // 获取绘图窗口句柄
-			SetClassLong(hwnd, GCL_HCURSOR, (long)hcur);
-		}
-		else if (event.Type == UIEVENT_MOUSELEAVE)
-		{
-			HCURSOR hcur = LoadCursor(NULL, IDC_ARROW);  //加载系统自带鼠标样式
-			HWND hwnd = m_pManager->GetPaintWindow(); // 获取绘图窗口句柄
-			SetClassLong(hwnd, GCL_HCURSOR, (long)hcur);
-		}
-
-		CVerticalLayoutUI::DoEvent(event);
-	}
-
 private:
 	CFood m_foodinfo;
 	CFoodpackage m_foodpackageinfo;

+ 150 - 0
zhipuzi_pos_windows/control/CDiandanNatureItemUI.cpp

@@ -0,0 +1,150 @@
+#include "../pch/pch.h"
+#include "CDiandanNatureItemUI.h"
+
+
+
+CDiandanNatureItemUI::CDiandanNatureItemUI()
+{
+}
+
+
+CDiandanNatureItemUI::~CDiandanNatureItemUI()
+{
+}
+
+void CDiandanNatureItemUI::SetNatureName(std::string name)
+{
+	m_nature_name = name;
+
+	CLabelUI* pName = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_nature_layout_name")));
+	pName->SetText(CLewaimaiString::UTF8ToUnicode(name).c_str());
+}
+
+void CDiandanNatureItemUI::SetNatureNameNum(int nNum)
+{
+	m_nNatureNameNum = nNum;
+}
+
+void CDiandanNatureItemUI::addNatureValue(FoodNatureValue value)
+{
+	m_nature_value.push_back(value);
+}
+
+void CDiandanNatureItemUI::ShowNatureValue()
+{
+	CHorizontalLayoutUI* pValueLayout = static_cast<CHorizontalLayoutUI*>(this->FindSubControl(_T("diandan_nature_layout_value")));
+
+	int totoal_value_size = m_nature_value.size();
+
+	int nRows = (totoal_value_size - 1) / 5 + 1;
+	int nCols = 5;
+
+	//设置属性区域的高度
+	pValueLayout->SetFixedHeight(nRows * 54);
+
+	this->SetFixedHeight(nRows * 54 + 30);
+
+	//开始设置每个控件的位置
+	int value_num = 0;
+	for (std::vector<FoodNatureValue>::iterator it = m_nature_value.begin(); it != m_nature_value.end(); it++)
+	{
+		//这里面的是属性值信息
+		FoodNatureValue curNature = *it;
+
+		std::string valuename = curNature.name;
+		int valueprice = curNature.value;
+
+		CButtonUI* newButton = new CButtonUI();
+
+		newButton->SetFixedWidth(145);
+		newButton->SetFixedHeight(44);
+		newButton->SetText(CLewaimaiString::UTF8ToUnicode(valuename).c_str());
+
+		newButton->SetBorderSize(1);
+		newButton->SetBorderColor(0xFFA9A9A9);
+		newButton->SetTextColor(0xFFA9A9A9);
+
+		//设置定义属性,在点击按钮的时候好区分
+		newButton->SetAttribute(L"name", L"diandan_nature_value_btn");
+		newButton->AddCustomAttribute(L"nature_name_num", to_wstring(m_nNatureNameNum).c_str());
+		newButton->AddCustomAttribute(L"nature_value_num", to_wstring(value_num).c_str());
+
+		//必须先Add,才能调用下面的SetPos,否则无效
+		pValueLayout->Add(newButton);
+
+		//设置位置,根据行数和列数来计算,行数和列数第一个都是1,按钮宽度145,高度44,右和下间距10
+		int curRow = value_num / 5 + 1;
+		int curCol = (value_num + 1) % 5;
+
+		RECT rect;
+		rect.left = (curCol - 1) * 155;
+		rect.right = rect.left + 145;
+		rect.top = (curRow - 1) * 54;
+		rect.bottom = rect.top + 44;
+
+		newButton->SetFloat(true);
+		newButton->SetPos(rect);
+
+		//默认选中第一个
+		if (value_num == 0)
+		{
+			m_nSelectIndex = 0;
+			m_nature_value[0].is_select = true;
+			newButton->SetBorderColor(0xFFFF4500);
+			newButton->SetTextColor(0xFFFF4500);
+		}
+
+		value_num++;
+	}
+}
+
+void CDiandanNatureItemUI::SetNatureSelected(int index)
+{
+	if (m_nSelectIndex == index)
+	{
+		return;
+	}
+
+	CHorizontalLayoutUI* pValueLayout = static_cast<CHorizontalLayoutUI*>(this->FindSubControl(_T("diandan_nature_layout_value")));
+
+	//先取消旧的选中
+	m_nature_value[m_nSelectIndex].is_select = false;
+	CButtonUI* old_btn = static_cast<CButtonUI*>(pValueLayout->GetItemAt(m_nSelectIndex));
+	old_btn->SetBorderColor(0xFFA9A9A9);
+	old_btn->SetTextColor(0xFFA9A9A9);
+
+	//再选中新的
+	m_nSelectIndex = index;
+	m_nature_value[m_nSelectIndex].is_select = true;
+	CButtonUI* new_btn = static_cast<CButtonUI*>(pValueLayout->GetItemAt(m_nSelectIndex));
+	new_btn->SetBorderColor(0xFFFF4500);
+	new_btn->SetTextColor(0xFFFF4500);
+}
+
+std::string CDiandanNatureItemUI::GetNatureName()
+{
+	return m_nature_name;
+}
+
+int CDiandanNatureItemUI::GetNatureNameNum()
+{
+	return m_nNatureNameNum;
+}
+
+//获取当前被选中的属性值的名字
+std::string CDiandanNatureItemUI::GetSelectedNatureValueName()
+{
+	return m_nature_value[m_nSelectIndex].name;
+}
+
+//获取当前被选中的属性值的索引
+int CDiandanNatureItemUI::GetSelectedNatureValueNum()
+{
+	return m_nSelectIndex;
+}
+
+//获取当前被选中属性的值
+int CDiandanNatureItemUI::GetSelectedNatureValuePrice()
+{
+	return m_nature_value[m_nSelectIndex].value;
+}

+ 72 - 0
zhipuzi_pos_windows/control/CDiandanNatureItemUI.h

@@ -0,0 +1,72 @@
+#pragma once
+
+#include <string>
+
+//这个对应的是一个属性值
+class FoodNatureValue
+{
+public:
+	std::string name;
+	int value;
+
+	bool is_select = false;;
+};
+
+//这个用来记录每个被选中的属性信息
+class FoodNatureSelectValue
+{
+public:
+	std::string nature_name; //属性名字
+	int nNameIndex; //属性名字在所有属性中的顺序
+	std::string nature_select_name; //选中的属性值名字
+	int nature_select_index; //选中的属性值属于第几个属性
+	int nature_select_value; //选中的属性值的价格
+};
+
+//这个对应的是属性弹框里面的一个属性
+class CDiandanNatureItemUI : public CVerticalLayoutUI
+{
+public:
+	CDiandanNatureItemUI();
+	~CDiandanNatureItemUI();
+
+	void SetNatureName(std::string name);
+
+	//设置这个属性在所有属性中的顺序
+	void SetNatureNameNum(int nNum);
+
+	//添加属性值
+	void addNatureValue(FoodNatureValue value);
+
+	//刷新属性值的位置
+	void ShowNatureValue();
+
+	//选中第1几个属性
+	void SetNatureSelected(int index);
+
+	std::string GetNatureName();
+	int GetNatureNameNum();
+
+	//获取当前被选中的属性值的名字
+	std::string GetSelectedNatureValueName();
+
+	//获取当前被选中的属性值的索引
+	int GetSelectedNatureValueNum();
+
+	//获取当前被选中属性的值
+	int GetSelectedNatureValuePrice();
+
+private:
+	//属性名
+	std::string m_nature_name;
+
+	//属性值
+	std::vector<FoodNatureValue> m_nature_value;
+
+	//表示哪个属性是被选中的,默认-1表示没有任何属性被选中
+	int m_nSelectIndex = -1;
+
+	//属性在所有属性中的顺序
+	int m_nNatureNameNum = 0;
+};
+

+ 5 - 0
zhipuzi_pos_windows/control/ControlEx.h

@@ -10,6 +10,7 @@
 #include "CWaimaiOrderItemUI.h"
 #include "CDiandanFoodItemUI.h"
 #include "CFoodtypeOptionUI.h"
+#include "CDiandanNatureItemUI.h"
 
 class CDialogBuilderCallbackEx : public IDialogBuilderCallback
 {
@@ -47,6 +48,10 @@ public:
 		{
 			return new CDiandanFoodItemUI;
 		}
+		else if (_tcscmp(pstrClass, _T("DiandanNatureItem")) == 0)
+		{
+			return new CDiandanNatureItemUI;
+		}
 
 		return NULL;
 	}

+ 13 - 0
zhipuzi_pos_windows/helper/CLewaimaiJson.cpp

@@ -17,3 +17,16 @@ std::string CLewaimaiJson::JsonToString(const rapidjson::Value& valObj)
 	valObj.Accept(jWriter);
 	return std::string(sbBuf.GetString());
 }
+
+rapidjson::Document CLewaimaiJson::StringToJson(std::string jsonString)
+{
+	rapidjson::Document document;
+	document.Parse(jsonString.c_str());
+
+	if (document.HasParseError())
+	{
+		return false;
+	}
+
+	return document;
+}

+ 10 - 0
zhipuzi_pos_windows/helper/CLewaimaiJson.h

@@ -6,6 +6,14 @@
 #include <regex>
 #include <string>
 
+//json¿â
+#include "rapidjson/document.h"
+#include "rapidjson/prettywriter.h"  
+#include "rapidjson/writer.h"
+#include "rapidjson/stringbuffer.h"
+
+using namespace rapidjson;
+
 class CLewaimaiJson
 {
 public:
@@ -13,5 +21,7 @@ public:
 	~CLewaimaiJson();
 
 	static std::string JsonToString(const rapidjson::Value& valObj);
+
+	static rapidjson::Document StringToJson(std::string jsonString);
 };
 

+ 110 - 48
zhipuzi_pos_windows/page/CDiandanPageUI.cpp

@@ -1,10 +1,12 @@
-#include "../pch/pch.h"
+#include "../pch/pch.h"
 #include "CDiandanPageUI.h"
 
 #include "../control/ControlEx.h"
 
 #include "../tool/CSqlite3.h"
 
+#include "../wnd/CDiandanNatureWnd.h"
+
 CDiandanPageUI::CDiandanPageUI()
 {
 }
@@ -14,7 +16,7 @@ CDiandanPageUI::~CDiandanPageUI()
 {
 }
 
-//初始化当前页面的展示,处理默认展示效果,在页面被加载的时候调用
+//初始化当前页面的展示,处理默认展示效果,在页面被加载的时候调用
 void CDiandanPageUI::InitShow()
 {
 	m_foodLayout = static_cast<CTileLayoutUI*>(this->FindSubControl(_T("diandan_foodlist")));
@@ -22,25 +24,25 @@ void CDiandanPageUI::InitShow()
 
 	CSqlite3 sqlite;
 	m_nFoodpackageNum = sqlite.GetFoodpackageNum();
-	m_types = sqlite.GetFoodtypes(); //只包含收银机显示的分类
+	m_types = sqlite.GetFoodtypes(); //只包含收银机显示的分类
 	if (m_nFoodpackageNum > 0)
 	{
-		//默认选中的分类是商品套餐
+		//榛樿�閫変腑鐨勫垎绫绘槸鍟嗗搧濂楅�
 		m_cur_type_id = "taocan";
 	}
 	else
 	{
-		//没有套餐,默认选中第一个商品分类
+		//没有套餐,默认选中第一个商品分类
 		if (m_types.size() > 0)
 		{
 			m_cur_type_id = m_types[0].id;
 		}
 	}
 
-	//先初始化商品分类
+	//鍏堝垵濮嬪寲鍟嗗搧鍒嗙被
 	this->InitFoodtypeShow();
 
-	//如果不是一个分类都没有,选中第一个分类
+	//如果不是一个分类都没有,选中第一个分类
 	if (m_cur_type_id != "")
 	{
 		CFoodtypeOptionUI* curTypeUI = static_cast<CFoodtypeOptionUI*>(m_foodtypeLayout->GetItemAt(0));
@@ -51,7 +53,7 @@ void CDiandanPageUI::InitShow()
 	this->RefreshFoodlist();
 }
 
-//处理按钮点击类事件
+//处理按钮点击类事件
 void CDiandanPageUI::HandleClickMsg(TNotifyUI& msg)
 {
 	CDuiString name = msg.pSender->GetName();
@@ -66,7 +68,7 @@ void CDiandanPageUI::HandleClickMsg(TNotifyUI& msg)
 	}
 }
 
-//处理option切换事件
+//澶勭悊option鍒囨崲浜嬩欢
 void CDiandanPageUI::HandleSelectChangeMsg(TNotifyUI& msg)
 {
 	COptionUI* curOption = static_cast<COptionUI*>(msg.pSender);
@@ -75,7 +77,7 @@ void CDiandanPageUI::HandleSelectChangeMsg(TNotifyUI& msg)
 
 	if (groupname == L"diandan_foodtype")
 	{
-		//商品分类切换
+		//鍟嗗搧鍒嗙被鍒囨崲
 		CFoodtypeOptionUI* typeUI = static_cast<CFoodtypeOptionUI*>(curOption);
 		std::string id = typeUI->GetTypeId();
 
@@ -85,7 +87,7 @@ void CDiandanPageUI::HandleSelectChangeMsg(TNotifyUI& msg)
 	}
 }
 
-//处理下拉框、radio的切换事件
+//处理下拉框、radio的切换事件
 void CDiandanPageUI::HandleItemSelectMsg(TNotifyUI& msg)
 {
 
@@ -93,7 +95,7 @@ void CDiandanPageUI::HandleItemSelectMsg(TNotifyUI& msg)
 
 void CDiandanPageUI::InitFoodtypeShow()
 {	
-	//先判断有没有套餐分类
+	//鍏堝垽鏂�湁娌℃湁濂楅�鍒嗙被
 	if (m_nFoodpackageNum > 0)
 	{
 		CDialogBuilder builder;
@@ -101,7 +103,7 @@ void CDiandanPageUI::InitFoodtypeShow()
 
 		CFoodtypeOptionUI* pItem = static_cast<CFoodtypeOptionUI*>(builder.Create(_T("foodtype_option.xml"), (UINT)0, &cb, m_pManager));
 
-		pItem->SetName(L"商品套餐");
+		pItem->SetName(L"鍟嗗搧濂楅�");
 		pItem->SetTypeId("taocan");
 		pItem->SetTaocan();
 		pItem->SetGroup(L"diandan_foodtype");
@@ -109,7 +111,7 @@ void CDiandanPageUI::InitFoodtypeShow()
 		m_foodtypeLayout->Add(pItem);
 	}
 
-	//接下来开始处理商品分类
+	//接下来开始处理商品分类
 	for (std::vector<CFoodType>::iterator it = m_types.begin(); it != m_types.end(); it++)
 	{
 		CFoodType type = *it;
@@ -131,14 +133,14 @@ void CDiandanPageUI::RefreshFoodlist()
 {
 	m_foodLayout->RemoveAll();
 
-	//如果当前一个分类都没有,那么就不处理了
+	//濡傛灉褰撳墠涓€涓�垎绫婚兘娌℃湁锛岄偅涔堝氨涓嶅�鐞嗕簡
 	if (m_cur_type_id == "")
 	{
 		return;
 	}
 	else if (m_cur_type_id == "taocan")
 	{
-		//选择的是套餐分类
+		//閫夋嫨鐨勬槸濂楅�鍒嗙被
 		CSqlite3 sqlite;
 		std::vector<CFoodpackage> foodlist = sqlite.GetFoodpackages(true);
 
@@ -179,13 +181,17 @@ void CDiandanPageUI::RefreshFoodlist()
 	}
 }
 
-void CDiandanPageUI::AddDiandanOrderItemShow(CDiandanOrderItem item)
+void CDiandanPageUI::AddDiandanOrderItemShow(int index)
 {
+	CDiandanOrderItem item = m_cur_diandan_order.getDiandanOrderItem(index);
+
 	CListUI* pList = static_cast<CListUI*>(this->FindSubControl(_T("list_diandan_cart")));
 
 	CDialogBuilder builder;
 	CListContainerElementUI* pEle = static_cast<CListContainerElementUI*>(builder.Create(_T("diandan_cart_item.xml"), (UINT)0, NULL, m_pManager));
 
+	pList->Add(pEle);
+
 	CLabelUI* pName = static_cast<CLabelUI*>(pEle->FindSubControl(_T("diandan_cart_item_name")));
 	pName->SetText(CLewaimaiString::UTF8ToUnicode(item.food_name).c_str());
 
@@ -193,9 +199,24 @@ void CDiandanPageUI::AddDiandanOrderItemShow(CDiandanOrderItem item)
 	pNum->SetText(CLewaimaiString::UTF8ToUnicode(item.num).c_str());
 
 	CLabelUI* pPrice = static_cast<CLabelUI*>(pEle->FindSubControl(_T("diandan_cart_item_price")));
-	pPrice->SetText(CLewaimaiString::UTF8ToUnicode(item.price).c_str());
+	pPrice->SetText(CLewaimaiString::UTF8ToUnicode(item.show_price).c_str());
 
-	pList->Add(pEle);
+	CLabelUI* pNature = static_cast<CLabelUI*>(pEle->FindSubControl(_T("diandan_cart_item_nature")));
+	if (item.is_nature)
+	{
+		pEle->SetFixedHeight(84);
+		pNature->SetVisible(true);
+		pNature->SetText(CLewaimaiString::UTF8ToUnicode(item.getNatureShow()).c_str());
+	}
+	else
+	{
+		pEle->SetFixedHeight(42);
+		pNature->SetVisible(false);
+	}
+
+	//鏇存柊鎬讳环鏄剧ず
+	CLabelUI* pTotalPrice = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_page_totalprice")));
+	pTotalPrice->SetText((L"总价:¥" + CLewaimaiString::UTF8ToUnicode(m_cur_diandan_order.getTotalPriceShow())).c_str());
 }
 
 void CDiandanPageUI::UpdateDiandanOrderItemShow(int index)
@@ -213,7 +234,24 @@ void CDiandanPageUI::UpdateDiandanOrderItemShow(int index)
 	pNum->SetText(CLewaimaiString::UTF8ToUnicode(item.num).c_str());
 
 	CLabelUI* pPrice = static_cast<CLabelUI*>(pEle->FindSubControl(_T("diandan_cart_item_price")));
-	pPrice->SetText(CLewaimaiString::UTF8ToUnicode(item.price).c_str());
+	pPrice->SetText(CLewaimaiString::UTF8ToUnicode(item.show_price).c_str());
+
+	CLabelUI* pNature = static_cast<CLabelUI*>(pEle->FindSubControl(_T("diandan_cart_item_nature")));
+	if (item.is_nature)
+	{
+		pEle->SetFixedHeight(84);
+		pNature->SetVisible(true);
+		pNature->SetText(CLewaimaiString::UTF8ToUnicode(item.getNatureShow()).c_str());
+	}
+	else
+	{
+		pEle->SetFixedHeight(42);
+		pNature->SetVisible(false);
+	}
+
+	//鏇存柊鎬讳环鏄剧ず
+	CLabelUI* pTotalPrice = static_cast<CLabelUI*>(this->FindSubControl(_T("diandan_page_totalprice")));
+	pTotalPrice->SetText((L"总价:¥" + CLewaimaiString::UTF8ToUnicode(m_cur_diandan_order.getTotalPriceShow())).c_str());
 }
 
 void CDiandanPageUI::ClickFoodAction()
@@ -222,45 +260,69 @@ void CDiandanPageUI::ClickFoodAction()
 
 	if (is_taocan)
 	{
-		//点击套餐之后的处理逻辑
+		//鐐瑰嚮濂楅�涔嬪悗鐨勫�鐞嗛€昏緫
 	}
 	else
 	{
-		//点击普通商品之后的处理逻辑
+		//鐐瑰嚮鏅�€氬晢鍝佷箣鍚庣殑澶勭悊閫昏緫
 		CFood foodinfo = m_cur_click_food_item->GetFoodInfo();
 
-		if (foodinfo.is_nature == "1")
-		{
-			//商品有商品属性
-		}
-		else
-		{
-			//商品没有商品属性
-			CDiandanOrderItem clickItem;
+		CDiandanOrderItem clickItem;
 
-			clickItem.food_id = foodinfo.id;
-			clickItem.food_name = foodinfo.name;
-			clickItem.type_id = foodinfo.type_id;
-			clickItem.price = foodinfo.price;
-			clickItem.is_dabao = "";
-			clickItem.num = "1";
-			clickItem.is_foodpackage = "0";
-			clickItem.is_weight = "0";
+		clickItem.food_id = foodinfo.id;
+		clickItem.food_name = foodinfo.name;
+		clickItem.type_id = foodinfo.type_id;
+		clickItem.price = foodinfo.price;
+		clickItem.is_dabao = "";
+		clickItem.num = "1";
+		clickItem.is_foodpackage = "0";
+		clickItem.is_weight = "0";
 
-			bool is_add_new = false;
+		if (foodinfo.is_nature == "1")
+		{
+			//商品有商品属性
+			clickItem.is_nature = true;
 
-			int index = m_cur_diandan_order.AddItem(clickItem, is_add_new);
+			//先弹框进行选择属性
+			CDiandanNatureWnd* pNatureFrame = new CDiandanNatureWnd(1);
+			pNatureFrame->SetFooditemUI(m_cur_click_food_item);
 
-			if (is_add_new)
+			if (pNatureFrame != NULL)
 			{
-				//说明是新增了一项,要刷新一下购物车展示
-				this->AddDiandanOrderItemShow(clickItem);
-			}
-			else
-			{
-				//没有新增,而是修改了一项
-				this->UpdateDiandanOrderItemShow(index);
+				pNatureFrame->Create(m_pManager->GetPaintWindow(), _T(""), UI_WNDSTYLE_DIALOG, WS_EX_WINDOWEDGE);
+				pNatureFrame->SetIcon(IDI_ICON_DUILIB);
+				pNatureFrame->CenterWindow();
+				UINT ret = pNatureFrame->ShowModal();
+
+				if (ret == IDOK)
+				{
+					//保存选择的属性
+					std::vector<FoodNatureSelectValue> natureSelectedArray = pNatureFrame->GetNatureSelectedArray();
+					clickItem.natureSelectedArray = natureSelectedArray;
+
+					delete pNatureFrame;
+				}
+				else
+				{
+					return;
+				}
 			}
 		}
+		
+		//商品没有商品属性
+		bool is_add_new = false;
+
+		int index = m_cur_diandan_order.AddItem(clickItem, is_add_new);
+
+		if (is_add_new)
+		{
+			//璇存槑鏄�柊澧炰簡涓€椤癸紝瑕佸埛鏂颁竴涓嬭喘鐗╄溅灞曠ず
+			this->AddDiandanOrderItemShow(index);
+		}
+		else
+		{
+			//没有新增,而是修改了一项
+			this->UpdateDiandanOrderItemShow(index);
+		}
 	}
 }

+ 1 - 1
zhipuzi_pos_windows/page/CDiandanPageUI.h

@@ -34,7 +34,7 @@ public:
 	void RefreshFoodlist();
 
 	//添加一个新的商品到购物车展示
-	void AddDiandanOrderItemShow(CDiandanOrderItem item);
+	void AddDiandanOrderItemShow(int index);
 
 	//刷新某个购物车商品的显示
 	void UpdateDiandanOrderItemShow(int index);

+ 267 - 0
zhipuzi_pos_windows/wnd/CDiandanNatureWnd.cpp

@@ -0,0 +1,267 @@
+#include "../pch/pch.h"
+#include "CDiandanNatureWnd.h"
+
+#include "../control/CDiandanNatureItemUI.h"
+#include "../control/ControlEx.h"
+
+void CDiandanNatureWnd::Init()
+{
+	if (m_fooditemUI->GetIsTaocan())
+	{
+		//当前展示的是套餐
+	}
+	else
+	{
+		//当前展示的是普通商品
+		std::string nature = m_fooditemUI->GetFoodInfo().nature;
+
+		rapidjson::Document document;
+		document.Parse(nature.c_str());
+
+		if (document.HasParseError())
+		{
+			//属性json报错,直接不处理了
+			Close(IDCANCEL);
+			return;
+		}
+
+		CVerticalLayoutUI* pNatureLayout = static_cast<CVerticalLayoutUI*>(this->m_pm.FindControl(_T("diandan_nature_layout")));
+
+		rapidjson::Value& data = document;
+		for (rapidjson::SizeType i = 0; i < data.Size(); ++i)
+		{
+			//创建一个属性控件
+			CDialogBuilder builder;
+			CDialogBuilderCallbackEx cb;
+			CDiandanNatureItemUI* pItem = static_cast<CDiandanNatureItemUI*>(builder.Create(_T("diandan_nature_item.xml"), (UINT)0, &cb, &m_pm));
+
+			//要先Add,子控件才能调用SetPos
+			pNatureLayout->Add(pItem);
+
+			m_natureitems.push_back(pItem);
+
+			//这里面的是属性名字信息
+			rapidjson::Value& natureinfo = data[i];
+
+			std::string name = natureinfo["name"].GetString();
+			std::string limit_choose = natureinfo["limit_choose"].GetString();
+
+			rapidjson::Value& value = natureinfo["value"];
+
+			for (rapidjson::SizeType j = 0; j < value.Size(); ++j)
+			{
+				FoodNatureValue newvalueItem;
+
+				newvalueItem.name = value[j]["name"].GetString();
+				newvalueItem.value = value[j]["value"].GetInt();
+
+				pItem->addNatureValue(newvalueItem);
+			}			
+
+			pItem->SetNatureName(name);
+			pItem->SetNatureNameNum(i);
+			pItem->ShowNatureValue();
+		}
+	}
+}
+
+void CDiandanNatureWnd::SetFooditemUI(CDiandanFoodItemUI* item)
+{
+	m_fooditemUI = item;
+}
+
+std::vector<FoodNatureSelectValue> CDiandanNatureWnd::GetNatureSelectedArray()
+{
+	return m_NatureSelectedArray;
+}
+
+void CDiandanNatureWnd::Notify(TNotifyUI& msg)
+{
+	if (msg.sType == _T("click"))
+	{
+		DuiLib::CDuiString senderName = msg.pSender->GetName();
+
+		if (senderName == _T("diandan_nature_closebtn"))
+		{
+			//商品属性暂时不支持退出
+			Close(IDCANCEL);
+			return;
+		}
+		else if (senderName == _T("diandan_nature_save"))
+		{
+			//点这个表示已经选好了属性,关闭属性弹框
+			for (std::vector<CDiandanNatureItemUI*>::iterator it = m_natureitems.begin(); it != m_natureitems.end(); it++)
+			{
+				CDiandanNatureItemUI* curNatureItem = *it;
+
+				FoodNatureSelectValue curSelect;
+				curSelect.nature_name = curNatureItem->GetNatureName();
+				curSelect.nNameIndex = curNatureItem->GetNatureNameNum();
+				curSelect.nature_select_name = curNatureItem->GetSelectedNatureValueName();
+				curSelect.nature_select_index = curNatureItem->GetSelectedNatureValueNum();
+				curSelect.nature_select_value = curNatureItem->GetSelectedNatureValuePrice();
+
+				m_NatureSelectedArray.push_back(curSelect);
+			}
+
+			Close(IDOK);
+			return;
+		}
+		else if (senderName == _T("diandan_nature_value_btn"))
+		{
+			//点击了属性按钮
+			int nature_name_num = atoi(CLewaimaiString::UnicodeToUTF8(msg.pSender->GetCustomAttribute(L"nature_name_num")).c_str());
+			int nature_value_num = atoi(CLewaimaiString::UnicodeToUTF8( msg.pSender->GetCustomAttribute(L"nature_value_num")).c_str());
+
+			m_natureitems[nature_name_num]->SetNatureSelected(nature_value_num);
+		}
+	}
+}
+
+LRESULT CDiandanNatureWnd::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("diandan_nature_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 CDiandanNatureWnd::OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	if (::IsIconic(*this))
+	{
+		bHandled = FALSE;
+	}
+	return (wParam == 0) ? TRUE : FALSE;
+}
+
+LRESULT CDiandanNatureWnd::OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	return 0;
+}
+
+LRESULT CDiandanNatureWnd::OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	return 0;
+}
+
+LRESULT CDiandanNatureWnd::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 CDiandanNatureWnd::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 CDiandanNatureWnd::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 CDiandanNatureWnd::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;
+}
+
+
+
+

+ 70 - 0
zhipuzi_pos_windows/wnd/CDiandanNatureWnd.h

@@ -0,0 +1,70 @@
+#pragma once
+
+#include "../pch/pch.h"
+#include "CMainWnd.h"
+
+#include "../control/CDiandanFoodItemUI.h"
+#include "../control/CDiandanNatureItemUI.h"
+
+class CDiandanNatureWnd : public CWindowWnd, public INotifyUI, public IMessageFilterUI
+{
+public:
+	CDiandanNatureWnd(int mode)
+	{
+		m_mode = mode;
+	}
+
+	LPCTSTR GetWindowClassName() const
+	{
+		return _T("UIDiandanNatureFrame");
+	};
+
+	UINT GetClassStyle() const
+	{
+		return UI_CLASSSTYLE_DIALOG;
+	};
+
+	void OnFinalMessage(HWND /*hWnd*/)
+	{
+		//WindowImplBase::OnFinalMessage(hWnd);
+		m_pm.RemovePreMessageFilter(this);
+		//delete this;
+	};
+
+	void Init();
+
+	void SetFooditemUI(CDiandanFoodItemUI* item);
+
+	std::vector<FoodNatureSelectValue> GetNatureSelectedArray();
+
+	void Notify(TNotifyUI& msg);
+
+	LRESULT OnCreate(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 HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+	LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);
+
+public:
+	CPaintManagerUI m_pm;
+
+	int m_mode; //为1表示新建,为2表示修改
+
+	//这个表示点击哪个商品(或者套餐)弹出的属性框
+	CDiandanFoodItemUI* m_fooditemUI;
+
+	//当前弹框下的属性控件数组
+	std::vector<CDiandanNatureItemUI*> m_natureitems;
+
+	std::vector<FoodNatureSelectValue> m_NatureSelectedArray;
+};

+ 125 - 19
zhipuzi_pos_windows/zhipuzi/CDiandanOrder.h

@@ -3,6 +3,8 @@
 #include <string>
 #include <vector>
 
+#include "../control/CDiandanNatureItemUI.h"
+
 /**
  * 订单中的一个商品
  */
@@ -12,14 +14,96 @@ public:
 	std::string food_id;
 	std::string food_name;
 	std::string type_id;
+
+	//这个是商品的基础价格
 	std::string price;
 	std::string is_dabao;
 	std::string num;
 	std::string is_foodpackage;
 	std::string is_weight;
 
-	bool is_nature;
-	std::string select_nature;
+	bool is_nature = false;
+	std::vector<FoodNatureSelectValue> natureSelectedArray;
+
+	//这个是商品对外展示的价格,根据数量和属性来计算的
+	std::string show_price;
+
+	bool operator==(CDiandanOrderItem& t)
+	{
+		if (this->food_id != t.food_id)
+		{
+			return false;
+		}
+
+		if (this->is_nature != t.is_nature)
+		{
+			return false;
+		}
+
+		int i = 0;
+		for (std::vector<FoodNatureSelectValue>::iterator it = this->natureSelectedArray.begin(); it != this->natureSelectedArray.end(); it++)
+		{
+			if ((*it).nature_name != t.natureSelectedArray[i].nature_name)
+			{
+				return false;
+			}
+
+			if ((*it).nature_select_index != t.natureSelectedArray[i].nature_select_index)
+			{
+				return false;
+			}
+
+			i++;
+		}
+
+		return true;
+	}
+	
+	//根据当前选中的商品属性,重新设置price字段值
+	void UpdateShowPrice()
+	{
+		if (!is_nature)
+		{
+			show_price = CLewaimaiString::DoubleToString(std::stod(price) * std::stod(num), 2);
+		}
+		else
+		{
+			int nature_price = 0;
+			for (std::vector<FoodNatureSelectValue>::iterator it = this->natureSelectedArray.begin(); it != this->natureSelectedArray.end(); it++)
+			{
+				nature_price += (*it).nature_select_value;
+			}
+
+			double new_price = std::stod(price) + nature_price;
+
+			show_price = CLewaimaiString::DoubleToString(new_price * std::stod(num), 2);
+		}
+	}
+
+	//获取用于展示的属性名字
+	std::string getNatureShow()
+	{
+		if (!is_nature)
+		{
+			return "";
+		}
+
+		std::string show = "";
+		size_t i = 0;
+		for (std::vector<FoodNatureSelectValue>::iterator it = this->natureSelectedArray.begin(); it != this->natureSelectedArray.end(); it++)
+		{
+			show += (*it).nature_select_name;
+
+			if (i < natureSelectedArray.size() - 1)
+			{
+				show += CLewaimaiString::UnicodeToUTF8(L"、");
+			}
+
+			i++;
+		}
+
+		return show;
+	}
 };
 
 /**
@@ -31,11 +115,18 @@ class CDiandanOrder
 public:
 	std::vector<CDiandanOrderItem> m_items;
 
+	std::string m_total_price_show;
+
 	int getItemNum()
 	{
 		return m_items.size();
 	}
 
+	std::string getTotalPriceShow()
+	{
+		return m_total_price_show;
+	}
+
 	CDiandanOrderItem getDiandanOrderItem(int index)
 	{
 		return m_items[index];
@@ -52,23 +143,10 @@ public:
 		{
 			CDiandanOrderItem curItem = *it;
 
-			if (curItem.food_id == newitem.food_id)
+			if (curItem == newitem)
 			{
-				//商品ID一样,继续比较商品属性是否一样
-				if (curItem.is_nature)
-				{
-					if (curItem.select_nature == newitem.select_nature)
-					{
-						is_found = true;
-						break;
-					}
-				}
-				else
-				{
-					//如果没有属性,只要商品ID一样就行
-					is_found = true;
-					break;
-				}
+				is_found = true;
+				break;
 			}
 
 			index++;
@@ -82,7 +160,19 @@ public:
 			double d_old_num = std::stod(old_num);
 			double d_new_num = d_old_num + 1;
 
-			m_items[index].num = CLewaimaiString::DoubleToString(d_new_num, 3);
+			//如果新的数量是一个整数,那么展示的时候就把小数去掉
+			if (d_new_num - (int)d_new_num < 0.0001)
+			{
+				m_items[index].num = std::to_string((int)d_new_num);
+			}
+			else
+			{
+				m_items[index].num = CLewaimaiString::DoubleToString(d_new_num, 3);
+			}
+
+			m_items[index].UpdateShowPrice();
+
+			UpdateTotalPriceShow();
 
 			is_add_new = false;
 		}
@@ -91,9 +181,25 @@ public:
 			//如果没找到,直接加一个新的item
 			m_items.push_back(newitem);
 
+			m_items[index].UpdateShowPrice();
+
+			UpdateTotalPriceShow();
+
 			is_add_new = true;
 		}
 
 		return index;
 	}
+
+	void UpdateTotalPriceShow()
+	{
+		double total_price_show = 0;
+
+		for (std::vector<CDiandanOrderItem>::iterator it = m_items.begin(); it != m_items.end(); it++)
+		{
+			total_price_show += std::stod((*it).show_price);
+		}
+
+		m_total_price_show = CLewaimaiString::DoubleToString(total_price_show, 2);
+	}
 };

+ 4 - 0
zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj

@@ -225,6 +225,8 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     </PostBuildEvent>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClInclude Include="control\CDiandanNatureItemUI.h" />
+    <ClInclude Include="wnd\CDiandanNatureWnd.h" />
     <ClInclude Include="control\CFoodtypeOptionUI.h" />
     <ClInclude Include="page\CBasePageUI.h" />
     <ClInclude Include="page\CWaimaiOrderListPageUI.h" />
@@ -268,6 +270,8 @@ copy $(ProjectDir)conf\ $(SolutionDir)bin\$(Platform)\$(Configuration)\conf\</Co
     <ClInclude Include="helper\CSystem.h" />
   </ItemGroup>
   <ItemGroup>
+    <ClCompile Include="control\CDiandanNatureItemUI.cpp" />
+    <ClCompile Include="wnd\CDiandanNatureWnd.cpp" />
     <ClCompile Include="control\CFoodtypeOptionUI.cpp" />
     <ClCompile Include="page\CWaimaiOrderListPageUI.cpp" />
     <ClCompile Include="page\CDiandanPageUI.cpp" />

+ 12 - 0
zhipuzi_pos_windows/zhipuzi_pos_windows.vcxproj.filters

@@ -138,6 +138,12 @@
     <ClInclude Include="zhipuzi\CDiandanOrder.h">
       <Filter>头文件</Filter>
     </ClInclude>
+    <ClInclude Include="wnd\CDiandanNatureWnd.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="control\CDiandanNatureItemUI.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="pch\pch.cpp">
@@ -236,6 +242,12 @@
     <ClCompile Include="zhipuzi\CWaimaiOrder.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
+    <ClCompile Include="wnd\CDiandanNatureWnd.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="control\CDiandanNatureItemUI.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <Image Include="resource\zhipuzi.ico">