张洋 4 tahun lalu
induk
melakukan
2ed0a273c1

TEMPAT SAMPAH
bin/Win32/Release/zhipuzi_pos_windows/db/pos.db


+ 0 - 0
bin/Win32/Release/zhipuzi_pos_windows/log/pos.log


+ 0 - 0
bin/Win32/Release/zhipuzi_pos_windows/log/pos_error.log


TEMPAT SAMPAH
bin/Win32/Release/zhipuzi_pos_windows/zhipuzi_pos_windows.exe


+ 1 - 1
zhipuzi_pos_windows/helper/CComHelper.cpp

@@ -42,7 +42,7 @@ std::vector<std::wstring> CComHelper::getComPort()
 	}
 	else
 	{
-		MessageBox(NULL, L"您的计算机的注册表上没有HKEY_LOCAL_MACHINE:Hardware\\DeviceMap\\SerialComm项", L"警告", MB_OK);
+		//MessageBox(NULL, L"您的计算机的注册表上没有HKEY_LOCAL_MACHINE:Hardware\\DeviceMap\\SerialComm项", L"警告", MB_OK);
 	}
 
 	// 返回串口号

+ 6 - 0
zhipuzi_pos_windows/helper/CLewaimaiString.cpp

@@ -427,6 +427,12 @@ vector<string> CLewaimaiString::Split(const string& in, const string& delim)
 {
     vector<string> ret;
 
+	if (in == "")
+	{
+		//空字符串,直接返回空vector
+		return ret;
+	}
+
     try
     {
         regex re{ delim };

+ 43 - 8
zhipuzi_pos_windows/page/CDiandanPageUI.cpp

@@ -379,9 +379,24 @@ void CDiandanPageUI::InitJiesuanShow()
 	pQuanyikaEdit->SetText(L"未使用");
 
 	//抹零
-	m_moling_type = 0;
-	CCheckBoxUI* pMolingCheck = static_cast<CCheckBoxUI*>(this->FindSubControl(_T("diandan_jiesuan_moling_bumoling")));
-	pMolingCheck->Selected(true, false);
+	std::string diandan_moling_type = CSetting::GetInstance()->GetParam("diandan_moling_type");
+	m_moling_type = atoi(diandan_moling_type.c_str());
+
+	if (m_moling_type == 0)
+	{
+		CCheckBoxUI* pMolingCheck = static_cast<CCheckBoxUI*>(this->FindSubControl(_T("diandan_jiesuan_moling_bumoling")));
+		pMolingCheck->Selected(true, false);
+	}
+	else if (m_moling_type == 1)
+	{
+		CCheckBoxUI* pMolingCheck = static_cast<CCheckBoxUI*>(this->FindSubControl(_T("diandan_jiesuan_moling_molingdaojiao")));
+		pMolingCheck->Selected(true, false);
+	}
+	else if (m_moling_type == 2)
+	{
+		CCheckBoxUI* pMolingCheck = static_cast<CCheckBoxUI*>(this->FindSubControl(_T("diandan_jiesuan_moling_molingdaoyuan")));
+		pMolingCheck->Selected(true, false);
+	}	
 }
 
 void CDiandanPageUI::InitJiesuanZhifu()
@@ -789,17 +804,23 @@ void CDiandanPageUI::HandleSelectChangeMsg(TNotifyUI& msg)
 		{
 			m_moling_type = 0;
 
+			CSetting::GetInstance()->SetParam("diandan_moling_type", "0");
+
 			UpdateJiesuanInfo();
 		}
 		else if (name == _T("diandan_jiesuan_moling_molingdaojiao"))
 		{
 			m_moling_type = 1;
 
+			CSetting::GetInstance()->SetParam("diandan_moling_type", "1");
+
 			UpdateJiesuanInfo();
 		}
 		else if (name == _T("diandan_jiesuan_moling_molingdaoyuan"))
 		{
 			m_moling_type = 2;
+			
+			CSetting::GetInstance()->SetParam("diandan_moling_type", "2");
 
 			UpdateJiesuanInfo();
 		}
@@ -1723,7 +1744,16 @@ void CDiandanPageUI::ClickFoodAction()
 			MemberPrice newPirce;
 			newPirce.id = member_price_info["id"].GetString();
 			newPirce.level = member_price_info["level"].GetString();
-			newPirce.price = member_price_info["price"].GetString();
+
+			if (member_price_info["price"].IsString())
+			{
+				newPirce.price = member_price_info["price"].GetString();
+			}
+			else
+			{
+				newPirce.price = to_string(member_price_info["price"].GetDouble());
+			}
+			
 
 			clickItem.m_member_price.push_back(newPirce);
 		}
@@ -2878,8 +2908,11 @@ void CDiandanPageUI::StartHuiyuanShoukuan()
 		UINT ret = pShoukuanWnd->ShowModal();
 		if (ret == IDOK)
 		{
+			std::string balance = pShoukuanWnd->m_balance;
+			std::string member_number = pShoukuanWnd->m_member_number;
+
 			//说明收款成功了,需要进行一些后续的处理
-			this->StartWorkAfterShoukuan(pShoukuanWnd->m_kucun_string, pShoukuanWnd->m_take_food_code, pShoukuanWnd->m_show_trade_no, "huiyuanzhifu");
+			this->StartWorkAfterShoukuan(pShoukuanWnd->m_kucun_string, pShoukuanWnd->m_take_food_code, pShoukuanWnd->m_show_trade_no, "huiyuanzhifu", balance, member_number);
 
 		}
 
@@ -3474,7 +3507,7 @@ void CDiandanPageUI::StopSerachFood()
 	this->InitFoodShow();
 }
 
-void CDiandanPageUI::StartWorkAfterShoukuan(std::string kucunstring, std::string take_food_code, std::string show_trade_no, std::string shoukuan_type)
+void CDiandanPageUI::StartWorkAfterShoukuan(std::string kucunstring, std::string take_food_code, std::string show_trade_no, std::string shoukuan_type, std::string balance, std::string member_number)
 {
 	//针对现金收款成功,单独做一个打开钱箱的判断处理
 	if (shoukuan_type == "xianjinzhifu")
@@ -3492,7 +3525,7 @@ void CDiandanPageUI::StartWorkAfterShoukuan(std::string kucunstring, std::string
 	this->UpdateFoodStock(kucunstring);
 
 	//处理打印
-	CDiandanOrder order = this->GetPrintOrderinfo(take_food_code, show_trade_no, shoukuan_type);
+	CDiandanOrder order = this->GetPrintOrderinfo(take_food_code, show_trade_no, shoukuan_type, balance, member_number);
 
 	CPosPrinter printer;
 	printer.PrintDiandanOrder(order);
@@ -3501,11 +3534,13 @@ void CDiandanPageUI::StartWorkAfterShoukuan(std::string kucunstring, std::string
 	RefreshShow();
 }
 
-CDiandanOrder CDiandanPageUI::GetPrintOrderinfo(std::string take_food_code, std::string show_trade_no, std::string shoukuan_type)
+CDiandanOrder CDiandanPageUI::GetPrintOrderinfo(std::string take_food_code, std::string show_trade_no, std::string shoukuan_type, std::string balance, std::string member_number)
 {
 	m_cur_diandan_order.shopname = CShopinfo::GetInstance()->m_shop_name;
 	m_cur_diandan_order.take_food_code = take_food_code;
 	m_cur_diandan_order.show_trade_no = show_trade_no;
+	m_cur_diandan_order.balance = balance;
+	m_cur_diandan_order.member_number = member_number;
 
 	if (shoukuan_type == "weixinzhifu")
 	{

+ 2 - 2
zhipuzi_pos_windows/page/CDiandanPageUI.h

@@ -183,7 +183,7 @@ public:
 	void StopSerachFood();
 
 	//执行付款成功后的所有操作逻辑
-	void StartWorkAfterShoukuan(std::string kucunstring, std::string take_food_code, std::string show_trade_no, std::string shoukuan_type);
+	void StartWorkAfterShoukuan(std::string kucunstring, std::string take_food_code, std::string show_trade_no, std::string shoukuan_type, std::string balance = "", std::string member_number = "");
 
 	void SetPos(RECT rc, bool bNeedInvalidate = true);
 
@@ -192,7 +192,7 @@ private:
 	std::map<string, string> GetSendorderParams();
 
 	//用于支付完成后,获取用于打印的order
-	CDiandanOrder GetPrintOrderinfo(std::string take_food_code, std::string show_trade_no, std::string shoukuan_type);
+	CDiandanOrder GetPrintOrderinfo(std::string take_food_code, std::string show_trade_no, std::string shoukuan_type, std::string balance, std::string member_number);
 
 private:
 	CTileLayoutUI* m_foodLayout;

+ 62 - 0
zhipuzi_pos_windows/page/CGengduoPageUI.cpp

@@ -24,6 +24,68 @@ void CGengduoPageUI::InitShow()
 
 	m_gengduoString = CSetting::GetInstance()->GetParam("setting_gongneng_gengduo_string");
 
+	//处理一下餐饮和零售版的区别
+	if (CShopinfo::GetInstance()->m_version_type == "1")
+	{
+		//餐饮版不显示扫码收银		
+		std::vector<string> changyong_v = CLewaimaiString::Split(m_changyongString, ",");
+
+		for (std::vector<string>::iterator it = changyong_v.begin(); it != changyong_v.end(); it++)
+		{
+			if (*it == "saomashouyin")
+			{
+				changyong_v.erase(it);
+				break;
+			}
+		}
+
+		m_changyongString = CLewaimaiString::Merge(changyong_v, ",");
+
+		//开始处理更多
+		std::vector<string> gengduo_v = CLewaimaiString::Split(m_gengduoString, ",");
+
+		for (std::vector<string>::iterator it = gengduo_v.begin(); it != gengduo_v.end(); it++)
+		{
+			if (*it == "saomashouyin")
+			{
+				gengduo_v.erase(it);
+				break;
+			}
+		}
+
+		m_gengduoString = CLewaimaiString::Merge(gengduo_v, ",");
+	}
+	else if (CShopinfo::GetInstance()->m_version_type == "2")
+	{
+		//零售版不显示正餐收银
+		std::vector<string> changyong_v = CLewaimaiString::Split(m_changyongString, ",");
+
+		for (std::vector<string>::iterator it = changyong_v.begin(); it != changyong_v.end(); it++)
+		{
+			if (*it == "zhengcan")
+			{
+				changyong_v.erase(it);
+				break;
+			}
+		}
+
+		m_changyongString = CLewaimaiString::Merge(changyong_v, ",");
+
+		//开始处理更多
+		std::vector<string> gengduo_v = CLewaimaiString::Split(m_gengduoString, ",");
+
+		for (std::vector<string>::iterator it = gengduo_v.begin(); it != gengduo_v.end(); it++)
+		{
+			if (*it == "zhengcan")
+			{
+				gengduo_v.erase(it);
+				break;
+			}
+		}
+
+		m_gengduoString = CLewaimaiString::Merge(gengduo_v, ",");
+	}
+
 	Refresh();
 }
 

+ 84 - 5
zhipuzi_pos_windows/print/CPosPrinterData.cpp

@@ -28,6 +28,15 @@ std::string CPosPrinterData::PrintWaimaiOrderShouyin(CWaimaiOrder& order)
     {
         POS_Reset();
 
+		//判断是否打印顶部logo
+		if (CShopinfo::GetInstance()->m_machine_logo_open == "1")
+		{
+			std::wstring imagePath = CShopinfo::GetInstance()->GetMachineLogoPath();
+
+			POS_OutBmp(imagePath);
+			POS_FeedLine();
+		}
+
 		//打印店铺名字
         string shop_name = "#" + order.m_restaurant_number + "  " + CLewaimaiString::UTF8ToANSI(order.m_shop_name);
         POS_TextOut(shop_name, true, true, 1);
@@ -422,8 +431,30 @@ std::string CPosPrinterData::PrintWaimaiOrderShouyin(CWaimaiOrder& order)
 
         POS_FeedLine();
 
-		POS_FeedLine();;
 		POS_FeedLine();
+		POS_FeedLine();
+
+		//是否打印底部二维码
+		if (CShopinfo::GetInstance()->m_machine_qrcode_open == "1")
+		{
+			POS_OutQRCode(CLewaimaiString::UTF8ToANSI(CShopinfo::GetInstance()->m_machine_qrcode_url));
+			POS_FeedLine();
+
+			POS_TextOut(CLewaimaiString::UTF8ToANSI(CShopinfo::GetInstance()->m_machine_qrcode_title), false, false, 1);
+			POS_FeedLine();
+			POS_FeedLine();
+		}
+
+		if (CShopinfo::GetInstance()->m_self_defined_open == "1")
+		{
+			POS_TextOut(CLewaimaiString::UTF8ToANSI(CShopinfo::GetInstance()->m_self_defined_content1), false, false, 1);
+			POS_FeedLine();
+			POS_FeedLine();
+
+			POS_TextOut(CLewaimaiString::UTF8ToANSI(CShopinfo::GetInstance()->m_self_defined_content2), false, false, 1);
+			POS_FeedLine();
+			POS_FeedLine();
+		}
 
         //走纸几行再切
         POS_FeedLine();
@@ -978,6 +1009,15 @@ std::string CPosPrinterData::PrintDiandanOrderShouyin(CDiandanOrder& order)
 	{
 		POS_Reset();
 
+		//判断是否打印顶部logo
+		if (CShopinfo::GetInstance()->m_machine_logo_open == "1")
+		{
+			std::wstring imagePath = CShopinfo::GetInstance()->GetMachineLogoPath();
+
+			POS_OutBmp(imagePath);
+			POS_FeedLine();
+		}
+
 		//打印店铺名字
 		string shop_name = CLewaimaiString::UTF8ToANSI(order.shopname);
 		POS_TextOut(shop_name, true, true, 1);
@@ -1042,6 +1082,10 @@ std::string CPosPrinterData::PrintDiandanOrderShouyin(CDiandanOrder& order)
 		POS_TextOut(order_date, false, setting_printer_xiadanshijian_big);
 		POS_FeedLine();
 
+		string shouyinyuan = "收银员:" + CLewaimaiString::UTF8ToANSI(CSetting::GetInstance()->getUsername());
+		POS_TextOut(shouyinyuan, false, false);
+		POS_FeedLine();
+
 		//预设选项
 		/*
 		if (order.m_order_field.size() > 1)
@@ -1315,12 +1359,42 @@ std::string CPosPrinterData::PrintDiandanOrderShouyin(CDiandanOrder& order)
 		}
 
 		POS_TextOut("支付方式:" + CLewaimaiString::UTF8ToANSI(order.shoukuan_type), false, setting_printer_pay_big, 2);
-
 		POS_FeedLine();
 
-		POS_FeedLine();;
+		if (order.shoukuan_type == CLewaimaiString::UnicodeToUTF8(L"会员支付"))
+		{
+			POS_TextOut("会员余额:" + CLewaimaiString::UTF8ToANSI(order.balance), false, false, 2);
+			POS_FeedLine();
+
+			POS_TextOut("会员编号:" + CLewaimaiString::UTF8ToANSI(order.member_number), false, false, 2);
+			POS_FeedLine();
+		}
+
+		POS_FeedLine();
 		POS_FeedLine();
 
+		//是否打印底部二维码
+		if (CShopinfo::GetInstance()->m_machine_qrcode_open == "1")
+		{
+			POS_OutQRCode(CLewaimaiString::UTF8ToANSI(CShopinfo::GetInstance()->m_machine_qrcode_url));
+			POS_FeedLine();
+
+			POS_TextOut(CLewaimaiString::UTF8ToANSI(CShopinfo::GetInstance()->m_machine_qrcode_title), false, false, 1);
+			POS_FeedLine();
+			POS_FeedLine();
+		}
+
+		if (CShopinfo::GetInstance()->m_self_defined_open == "1")
+		{
+			POS_TextOut(CLewaimaiString::UTF8ToANSI(CShopinfo::GetInstance()->m_self_defined_content1), false, false, 1);
+			POS_FeedLine();
+			POS_FeedLine();
+
+			POS_TextOut(CLewaimaiString::UTF8ToANSI(CShopinfo::GetInstance()->m_self_defined_content2), false, false, 1);
+			POS_FeedLine();
+			POS_FeedLine();
+		}
+
 		//走纸几行再切
 		POS_FeedLine();
 		POS_FeedLine();
@@ -1586,11 +1660,16 @@ std::vector<ChufangPrinterContent> CPosPrinterData::PrintDiandanOrderChufang(CDi
 
 			POS_FeedLine();
 
-			string order_type = "订单号:" + order.show_trade_no + "  ";
+			string order_type = "订单号:" + order.show_trade_no;
+			POS_TextOut(order_type, false, false, 0);
+			POS_FeedLine();
 
-			POS_TextOut(order_type, false, true, 1);
+			string take_food_code = "取餐号:" + order.take_food_code;
+			POS_TextOut(take_food_code, false, false, 0);
 			POS_FeedLine();
 
+			string init_time = "下单时间:" + order.init_time;
+			POS_TextOut(init_time, false, false, 0);
 			POS_FeedLine();
 
 			//预设选项

TEMPAT SAMPAH
zhipuzi_pos_windows/resource/skin.zip


+ 7 - 0
zhipuzi_pos_windows/tool/CSetting.cpp

@@ -338,6 +338,13 @@ void CSetting::Init()
 		m_paramsMap[setting_gongneng_gengduo_string] = "shangpin,kucun,caigou,zhengcan,saomashouyin";
 	}
 
+	//点单页面关于抹零的设置 0 不抹零 1 抹零到角 2 抹零到元
+	std::string diandan_moling_type = "diandan_moling_type";
+	if (m_paramsMap.find(diandan_moling_type) == m_paramsMap.end())
+	{
+		m_paramsMap[diandan_moling_type] = "0";
+	}
+
 	m_mutex.unlock();
 
 	//设置好默认参数之后,将默认参数写回到数据库

+ 2 - 0
zhipuzi_pos_windows/wnd/CHuiyuanShoukuanWnd.cpp

@@ -1069,6 +1069,8 @@ void CHuiyuanShoukuanWnd::HandleShoukuan()
 
 		m_take_food_code = data["take_food_code"].GetString();
 		m_show_trade_no = data["show_trade_no"].GetString();
+		m_balance = CLewaimaiString::DoubleToString(data["balance"].GetFloat(), 2);
+		m_member_number = data["member_number"].GetString();
 
 		SendMessage(WM_SHOUKUAN_STATUS_SUCCESS, 0, 0);
 	}

+ 2 - 0
zhipuzi_pos_windows/wnd/CHuiyuanShoukuanWnd.h

@@ -117,5 +117,7 @@ public:
 	std::string m_out_trade_no;
 	std::string m_take_food_code;
 	std::string m_show_trade_no;
+	std::string m_balance;
+	std::string m_member_number;
 };
 

+ 12 - 0
zhipuzi_pos_windows/wnd/CMainWnd.cpp

@@ -1069,6 +1069,12 @@ void CMainWnd::UpdateGongnengDaohang()
 		}
 		else if (curName == "zhengcan")
 		{
+			if (CShopinfo::GetInstance()->m_version_type == "2")
+			{
+				//零售版不显示桌台
+				continue;;
+			}
+
 			newOption->SetName(L"main_zhengcan");
 			newOption->SetText(L"桌台");
 
@@ -1077,6 +1083,12 @@ void CMainWnd::UpdateGongnengDaohang()
 		}
 		else if (curName == "saomashouyin")
 		{
+			if (CShopinfo::GetInstance()->m_version_type == "1")
+			{
+				//餐饮版不显示扫码收银
+				continue;;
+			}
+
 			newOption->SetName(L"main_saomashouyin");
 			newOption->SetText(L"收银");
 

+ 5 - 1
zhipuzi_pos_windows/zhipuzi/CDiandanOrder.h

@@ -47,6 +47,10 @@ public:
 	std::string take_food_code;
 	std::string show_trade_no;
 
+	//会员余额和会员卡号,仅会员支付时有用
+	std::string balance;
+	std::string member_number;
+
 	std::string m_renshu;
 
 	//微信支付 会员支付 现金支付 福利卡支付 自定义支付
@@ -84,7 +88,7 @@ public:
 
 	std::vector<CDiandanOrderItemPrint> m_items_print;
 
-	//下面是从服务端获取的参数,暂时存在这里
+	//下面是从订单接口从服务端获取的参数,暂时存在这里
 	std::string m_order_id;
 	std::string is_refund;
 	std::string refund_time;

+ 57 - 2
zhipuzi_pos_windows/zhipuzi/CShopinfo.cpp

@@ -10,6 +10,7 @@ CShopinfo::CShopinfo()
 // 处理登录接口返回的店铺信息
 void CShopinfo::InitShopinfoByLogin(rapidjson::Value& v_data)
 {
+	this->m_version_type = v_data["version_type"].GetString();
 	this->m_shop_id = v_data["shop_id"].GetString();
 	this->m_shop_name = v_data["shop_name"].GetString();
 	this->m_is_member_fun_module = v_data["is_member_fun_module"].GetInt();
@@ -108,8 +109,26 @@ void CShopinfo::InitShopinfoByGetshopinfo(rapidjson::Value& data)
 		rapidjson::Value& promotioninfo = promotion[i];
 
 		Promotion newPromotion;
-		newPromotion.amount = promotioninfo["amount"].GetDouble();
-		newPromotion.discount = promotioninfo["discount"].GetDouble();
+
+		if (promotioninfo["amount"].IsString())
+		{
+			std::string amount = promotioninfo["amount"].GetString();
+			newPromotion.amount = atof(amount.c_str());
+		}
+		else
+		{
+			newPromotion.amount = promotioninfo["amount"].GetDouble();
+		}
+
+		if (promotioninfo["discount"].IsString())
+		{
+			std::string discount = promotioninfo["discount"].GetString();
+			newPromotion.discount = atof(discount.c_str());
+		}
+		else
+		{
+			newPromotion.discount = promotioninfo["discount"].GetDouble();
+		}
 
 		m_promotion.push_back(newPromotion);
 	}
@@ -250,4 +269,40 @@ void CShopinfo::InitShopinfoByGetshopinfo(rapidjson::Value& data)
 		m_is_open_fulika_pay = "0";
 	}
 	
+	//开始下载小票打印的logo图
+	std::string logo_url = "http://img.zhipuzi.com" + m_machine_logo_url + "!max400"; //下载小图
+
+	wstring imagePath = GetMachineLogoPath();
+	if (!CSystem::IsFileExist(imagePath))
+	{
+		//图片还不存在,开始下载
+		if (URLDownloadToFile(NULL, CLewaimaiString::UTF8ToUnicode(logo_url).c_str(), imagePath.c_str(), 0, NULL) == S_OK)
+		{
+			//图片下载成功了,发个消息,更新图片
+			int a = 1;
+		}
+		else
+		{
+			LOG_INFO("URLDownloadToFile Fail,Error" << GetLastError());
+		}
+	}
 }
+
+std::wstring CShopinfo::GetMachineLogoPath()
+{
+	string folderPath = CLewaimaiString::UnicodeToANSI(CSystem::GetProgramDir()) + "\\tmp\\image\\";
+	std::wstring ws_folderPath = CLewaimaiString::ANSIToUnicode(folderPath);
+	if (!CSystem::IsDirExist(ws_folderPath))
+	{
+		LOG_INFO("folderPath:" << folderPath.c_str() << ",没有找到对应的目录,即将创建");
+		CSystem::CreateMultiLevel(folderPath);
+	}
+
+	//纯文件名
+	std::string file_name = CLewaimaiString::GetPathOrURLShortName(m_machine_logo_url);
+
+	//根据文件名,计算文件临时路径
+	wstring imagePath = ws_folderPath + CLewaimaiString::UTF8ToUnicode(file_name);
+
+	return imagePath;
+}

+ 10 - 0
zhipuzi_pos_windows/zhipuzi/CShopinfo.h

@@ -57,7 +57,12 @@ public:
 	//处理登录成功后,通过获取店铺信息接口获取的信息并保存
 	void InitShopinfoByGetshopinfo(rapidjson::Value& data);
 
+	std::wstring GetMachineLogoPath();
+
 public:
+	//当前系统版本 1餐饮版 2零售版
+	std::string m_version_type;
+
 	//这个是当前登陆的账号对应的店铺ID
 	std::string m_shop_id;
 
@@ -146,15 +151,20 @@ public:
 	std::string m_is_only_discount;
 	std::string m_is_vip_price_for_yue;
 	std::string m_is_discount_for_yue;
+
 	std::string m_machine_qrcode_url;
 	std::string m_machine_qrcode_open;
 	std::string m_machine_qrcode_title;
+
 	std::string m_lunbo_logo;
+
 	std::string m_machine_logo_url;
 	std::string m_machine_logo_open;
+
 	std::string m_self_defined_content1;
 	std::string m_self_defined_content2;
 	std::string m_self_defined_open;
+
 	std::string m_header_text;
 	std::string m_machinecode_logo;