Browse Source

继续做正餐的打印

张洋 3 years ago
parent
commit
bc85948a06

+ 16 - 4
zhipuzi_pos_windows/page/CZhengcanDiandanPageUI.cpp

@@ -2605,10 +2605,7 @@ void CZhengcanDiandanPageUI::ClickTuicai()
 	Value& stock = data["stock"];
 	Value& stock = data["stock"];
 	std::string kucun_string = CLewaimaiJson::JsonToString(stock);
 	std::string kucun_string = CLewaimaiJson::JsonToString(stock);
 
 
-	this->UpdateFoodStock(kucun_string);
-
-	//如果走到这里说明退菜成功了,这个时候刷新显示
-	this->InitShow();
+	this->StartWorkAfterTuicai(kucun_string);
 }
 }
 
 
 void CZhengcanDiandanPageUI::ClickXidanBtn()
 void CZhengcanDiandanPageUI::ClickXidanBtn()
@@ -4119,6 +4116,21 @@ void CZhengcanDiandanPageUI::StopSerachFood()
 	this->InitFoodShow();
 	this->InitFoodShow();
 }
 }
 
 
+void CZhengcanDiandanPageUI::StartWorkAfterTuicai(std::string kucunstring)
+{
+	//更新商品库存
+	this->UpdateFoodStock(kucunstring);
+
+	//处理打印
+	CZhengcanOrder order = this->GetPrintOrderinfoXiadan(show_trade_no);
+
+	CPosPrinter printer;
+	printer.PrintZhengcanOrder(order);
+
+	//如果走到这里说明退菜成功了,这个时候刷新显示
+	this->InitShow();
+}
+
 //执行下单成功后的所有操作逻辑
 //执行下单成功后的所有操作逻辑
 void CZhengcanDiandanPageUI::StartWorkAfterXiadan(std::string kucunstring, std::string show_trade_no)
 void CZhengcanDiandanPageUI::StartWorkAfterXiadan(std::string kucunstring, std::string show_trade_no)
 {
 {

+ 3 - 0
zhipuzi_pos_windows/page/CZhengcanDiandanPageUI.h

@@ -191,6 +191,9 @@ public:
 	//停止搜索商品
 	//停止搜索商品
 	void StopSerachFood();
 	void StopSerachFood();
 
 
+	//执行退菜后的逻辑
+	void StartWorkAfterTuicai(std::string kucunstring);
+
 	//执行下单成功后的所有操作逻辑
 	//执行下单成功后的所有操作逻辑
 	void StartWorkAfterXiadan(std::string kucunstring, std::string show_trade_no);
 	void StartWorkAfterXiadan(std::string kucunstring, std::string show_trade_no);
 
 

+ 50 - 0
zhipuzi_pos_windows/print/CPosPrinter.cpp

@@ -135,13 +135,63 @@ void CPosPrinter::PrintDiandanOrder(std::string order_id)
 //完成所有打印一个正餐订单的操作(不等待,立即返回)
 //完成所有打印一个正餐订单的操作(不等待,立即返回)
 void CPosPrinter::PrintZhengcanOrder(CZhengcanOrder& order)
 void CPosPrinter::PrintZhengcanOrder(CZhengcanOrder& order)
 {
 {
+	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_printer") == "1")
+	{
+		//执行收银小票打印操作
+		CPosPrinterData printData;
+
+		std::string data = printData.PrintZhengcanOrderXiadanShouyin(order);
+
+		if (data.length() > 0)
+		{
+			CPosPrinterQueue::GetInstance()->AddShouyinPrinter(data);
+		}
+	}
+
+	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_biaoqian_printer") == "1")
+	{
+		//执行标签小票打印操作
+		CPosPrinterData printData;
+
+		std::string data = printData.PrintZhengcanOrderXiadanBiaoqian(order);
+
+		if (data.length() > 0)
+		{
+			CPosPrinterQueue::GetInstance()->AddBiaoqianPrinter(data);
+		}
+	}
 
 
+	//判断是否进行自动的厨房打印
+	if (CSetting::GetInstance()->GetParam("setting_is_new_diannei_chufang_printer") == "1")
+	{
+		//进行厨房打印
+		CPosPrinterData printData;
+
+		std::vector<ChufangPrinterContent> datas = printData.PrintZhengcanOrderXiadanChufang(order);
+
+		if (datas.size() > 0)
+		{
+			for (std::vector<ChufangPrinterContent>::iterator it = datas.begin(); it != datas.end(); it++)
+			{
+				ChufangPrinterContent content = *it;
+
+				if (content.data.length() > 0)
+				{
+					CPosPrinterQueue::GetInstance()->AddChufangPrinter(content);
+				}
+			}
+		}
+	}
 }
 }
 
 
 //通过订单号打印订单,后面要改成异步才行
 //通过订单号打印订单,后面要改成异步才行
 void CPosPrinter::PrintZhengcanOrder(std::string order_id)
 void CPosPrinter::PrintZhengcanOrder(std::string order_id)
 {
 {
+	CZhengcanOrder order;
+
+	bool ret = order.InitData(order_id);
 
 
+	PrintZhengcanOrder(order);
 }
 }
 
 
 void CPosPrinter::PirntJiaobanOrder(CJiaobaoOrder& order)
 void CPosPrinter::PirntJiaobanOrder(CJiaobaoOrder& order)

+ 766 - 1
zhipuzi_pos_windows/print/CPosPrinterData.cpp

@@ -1189,7 +1189,7 @@ std::string CPosPrinterData::PrintDiandanOrderShouyin(CDiandanOrder& order)
 		}
 		}
 		else if (order.order_from == 2)
 		else if (order.order_from == 2)
 		{
 		{
-			string from_type = "订单来源:商家appp";
+			string from_type = "订单来源:商家app";
 			POS_TextOut(from_type);
 			POS_TextOut(from_type);
 			POS_FeedLine();
 			POS_FeedLine();
 		}
 		}
@@ -2054,6 +2054,771 @@ std::vector<ChufangPrinterContent> CPosPrinterData::PrintDiandanOrderChufang(CDi
 	return datas;
 	return datas;
 }
 }
 
 
+std::string CPosPrinterData::PrintZhengcanOrderXiadanShouyin(CZhengcanOrder& order)
+{
+	//读取当前收银打印机的设置
+	std::string guige = CSetting::GetInstance()->GetParam("setting_printer_guige");
+	std::string lianshu = CSetting::GetInstance()->GetParam("setting_printer_lianshu");
+	int n_lianshu = atoi(lianshu.c_str());
+
+	//正式开始打印
+	for (int i = 0; i < n_lianshu; i++)
+	{
+		POS_Reset();
+
+		//判断是否打印顶部logo
+		if (CShopinfo::GetInstance()->m_machine_logo_open == "1")
+		{
+			std::wstring imagePath = CShopinfo::GetInstance()->GetImageTmpPathFromUrl(CShopinfo::GetInstance()->m_machine_logo_url);
+
+			POS_OutBmp(imagePath);
+			POS_FeedLine();
+		}
+
+		//打印店铺名字
+		string shop_name = CLewaimaiString::UTF8ToANSI(order.shopname);
+		POS_TextOut(shop_name, true, true, 1);
+
+		POS_FeedLine();
+		POS_FeedLine();
+
+		//打印点菜单
+		string diancaidan = "点菜单";
+		POS_TextOut(diancaidan, false, false, 1);
+
+		POS_FeedLine();
+		POS_FeedLine();
+
+		//打印桌位
+		string date = "桌位:" + CLewaimaiString::UTF8ToANSI(order.table_name);
+		POS_TextOut(date, true, true, 0);
+
+		POS_FeedLine();
+		POS_FeedLine();
+
+		//订单号
+		bool setting_printer_dingdanhao_big = false;
+		if (CSetting::GetInstance()->GetParam("setting_printer_dingdanhao_big") == "1")
+		{
+			setting_printer_dingdanhao_big = true;
+		}
+
+		string order_num = "订 单 号:" + CLewaimaiString::UTF8ToANSI(order.show_trade_no);
+		POS_TextOut(order_num, false, setting_printer_dingdanhao_big);
+		POS_FeedLine();
+
+		//订单来源
+		if (order.order_from == 1)
+		{
+			string from_type = "订单来源:收银系统";
+			POS_TextOut(from_type);
+			POS_FeedLine();
+		}
+		else if (order.order_from == 2)
+		{
+			string from_type = "订单来源:商家app";
+			POS_TextOut(from_type);
+			POS_FeedLine();
+		}
+		else if (order.order_from == 3)
+		{
+			string from_type = "订单来源:扫码下单";
+			POS_TextOut(from_type);
+			POS_FeedLine();
+		}
+
+		//下单时间
+		bool setting_printer_xiadanshijian_big = false;
+
+		if (CSetting::GetInstance()->GetParam("setting_printer_xiadanshijian_big") == "1")
+		{
+			setting_printer_xiadanshijian_big = true;
+		}
+
+		string order_date = "下单时间:" + CLewaimaiString::UTF8ToANSI(order.init_time);
+		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();
+
+		//准备开始打印商品详情
+		string lines;
+
+		if (guige == "58")
+		{
+			lines = "--------------------------------";
+		}
+		else
+		{
+			lines = "------------------------------------------------";
+		}
+
+		POS_TextOut(lines);
+		POS_FeedLine();
+
+		//商品标题
+		bool setting_printer_shangpin_big = false;
+
+		if (CSetting::GetInstance()->GetParam("setting_printer_shangpin_big") == "1")
+		{
+			setting_printer_shangpin_big = true;
+		}
+
+		if (guige == "58")
+		{
+			POS_TextOut("商品           单价   数量  金额", false, setting_printer_shangpin_big);
+		}
+		else
+		{
+			POS_TextOut("商品                         单价    数量   金额", false, setting_printer_shangpin_big);
+		}
+
+		POS_FeedLine();
+
+		int n_fenshu = 0;
+
+		//商品内容
+		for (std::vector<CZhengcanOrderItemPrint>::iterator it = order.m_items_print.begin(); it != order.m_items_print.end(); it++)
+		{
+			if (it->is_taocan_item == true)
+			{
+				//套餐的item,收银小票不打印
+				continue;
+			}
+
+			std::string food_name = (*it).m_food_name;
+			std::string food_price = (*it).m_item_price;
+			std::string quantity = (*it).m_quantity;
+
+			if (atof(quantity.c_str()) - atoi(quantity.c_str()) > 0.00001)
+			{
+				//数量为小数,称重商品
+				n_fenshu += 1;
+			}
+			else
+			{
+				n_fenshu += atoi(quantity.c_str());
+			}
+
+			//计算总价
+			double item_price = atof(food_price.c_str()) * atof(quantity.c_str());
+			std::string food_total_price = CLewaimaiString::DoubleToString(item_price, 2);
+
+			if (food_total_price == "0.00")
+			{
+				//这里是特殊处理满赠的展示
+				food_total_price = "";
+			}
+
+			food_name = CLewaimaiString::UTF8ToANSI(food_name);
+
+			//先输出商品名字
+			std::vector<string> m_names;
+
+			if (guige == "58")
+			{
+				m_names = HandleFoodname(food_name, 1);
+			}
+			else
+			{
+				m_names = HandleFoodname(food_name, 2);
+			}
+
+			std::string firstLine = m_names[0];
+			int nGuige;
+
+			if (guige == "58")
+			{
+				nGuige = 1;
+			}
+			else
+			{
+				nGuige = 2;
+			}
+
+			std::string priceShow = HandleFoodItemPrice(food_price, nGuige);
+			std::string quantityShow = HandleFoodQuantity(quantity, nGuige);
+			std::string priceTotalShow = HandleFoodTotalPrice(food_total_price, nGuige);
+			std::string firstLineShow = firstLine + priceShow + quantityShow + priceTotalShow;
+
+			POS_TextOut(firstLineShow, false, setting_printer_shangpin_big);
+			POS_FeedLine();
+
+			for (std::vector<string>::iterator it = m_names.begin() + 1; it != m_names.end(); it++)
+			{
+				POS_TextOut((*it), false, setting_printer_shangpin_big);
+				POS_FeedLine();
+			}
+		}
+
+		//判断是否有备注
+		if (order.m_memo.length() > 0)
+		{
+			bool setting_printer_memo_big = false;
+
+			if (CSetting::GetInstance()->GetParam("setting_printer_memo_big") == "1")
+			{
+				setting_printer_memo_big = true;
+			}
+
+			POS_FeedLine();
+			string address = "整单备注:" + CLewaimaiString::UTF8ToANSI(order.m_memo);
+			POS_TextOut(address, false, setting_printer_memo_big);
+			POS_FeedLine();
+		}
+
+		//结束商品详情打印
+		POS_TextOut(lines);
+		POS_FeedLine();
+
+		
+		POS_TextOut("共:" + to_string(n_fenshu) + "份", false, false, 2);
+		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();
+		POS_FeedLine();
+		POS_FeedLine();
+		POS_FeedLine();
+
+		POS_CutPaper();
+	}
+
+	//还原打印机初始设置,有些傻逼收银设备居然不是自动调用,比如哗啦啦
+	POS_Reset();
+
+	return m_print_content;
+}
+
+std::string CPosPrinterData::PrintZhengcanOrderXiadanBiaoqian(CZhengcanOrder& order)
+{
+	std::string printer_usb = CSetting::GetInstance()->GetParam("setting_biaoqian_printer_usb");
+	std::wstring ws_printer_usb = CLewaimaiString::UTF8ToUnicode(printer_usb);
+
+	//读取标签纸的规格和方向
+	int biaoqian_width, biaoqian_height;
+	std::string printer_guige = CSetting::GetInstance()->GetParam("setting_biaoqian_printer_guige");
+	if (printer_guige == "40*30mm")
+	{
+		biaoqian_width = 40;
+		biaoqian_height = 30;
+	}
+	else  if (printer_guige == "35*25mm")
+	{
+		biaoqian_width = 35;
+		biaoqian_height = 25;
+	}
+	else  if (printer_guige == "30*25mm")
+	{
+		biaoqian_width = 30;
+		biaoqian_height = 25;
+	}
+	else  if (printer_guige == "30*20mm")
+	{
+		biaoqian_width = 30;
+		biaoqian_height = 20;
+	}
+	else
+	{
+		biaoqian_width = 40;
+		biaoqian_height = 30;
+	}
+
+	int nDIRECTION;
+	std::string printer_fangxiang = CSetting::GetInstance()->GetParam("setting_biaoqian_printer_fangxiang");
+	if (printer_fangxiang == "1")
+	{
+		nDIRECTION = 1;
+	}
+	else
+	{
+		nDIRECTION = 0;
+	}
+
+	//初始化标签打印机
+	BIAOQIAN_Reset(biaoqian_width, biaoqian_height, nDIRECTION);
+
+	std::vector<CZhengcanOrderItemPrint> cur_printer_use;
+
+	std::string setting_biaoqian_printer_is_type = CSetting::GetInstance()->GetParam("setting_biaoqian_printer_is_type");
+	std::string setting_biaoqian_printer_type_ids = CSetting::GetInstance()->GetParam("setting_biaoqian_printer_type_ids");
+
+	if (setting_biaoqian_printer_is_type == "0")
+	{
+		for (std::vector<CZhengcanOrderItemPrint>::iterator it = order.m_items_print.begin(); it != order.m_items_print.end(); it++)
+		{
+			if (it->is_taocan_item == false)
+			{
+				//如果当前商品的分类,在厨房打印机设置的分类里面,才加入
+				cur_printer_use.push_back(*it);
+			}
+		}
+	}
+	else
+	{
+		std::map<string, bool> ids_map;
+		std::vector<string> ids = CLewaimaiString::Split(setting_biaoqian_printer_type_ids, ",");
+
+		for (std::vector<string>::iterator it = ids.begin(); it != ids.end(); it++)
+		{
+			ids_map[(*it)] = true;
+		}
+
+		for (std::vector<CZhengcanOrderItemPrint>::iterator it = order.m_items_print.begin(); it != order.m_items_print.end(); it++)
+		{
+			if (ids_map.find((*it).m_type_id) != ids_map.end() && it->is_taocan_item == false)
+			{
+				//如果当前商品的分类,在厨房打印机设置的分类里面,才加入
+				cur_printer_use.push_back(*it);
+			}
+		}
+	}
+
+	//先计算商品的总数量
+	int foodNum = 0;
+
+	for (std::vector<CZhengcanOrderItemPrint>::iterator it = cur_printer_use.begin(); it != cur_printer_use.end(); it++)
+	{
+		std::string quantity = (*it).m_quantity;
+
+		foodNum += atoi(quantity.c_str());
+	}
+
+	//商品内容
+	int curFoodNum = 0;
+
+	for (std::vector<CZhengcanOrderItemPrint>::iterator it = cur_printer_use.begin(); it != cur_printer_use.end(); it++)
+	{
+		std::string food_name = (*it).m_food_name;
+		std::string food_price = (*it).m_item_price;
+		std::string quantity = (*it).m_quantity;
+
+		//每份商品打印一个标签
+		int nQuantity = atoi(quantity.c_str());
+
+		for (int i = 0; i < nQuantity; i++)
+		{
+			std::string textData = "";
+
+			curFoodNum++;
+
+			//打印份数
+			std::string numInfo = to_string(curFoodNum) + "/" + to_string(foodNum);
+			textData += BIAOQIAN_TEXTGet(numInfo, 180, 6, 1, 1);
+
+			//每行最多显示12个汉字,这里要计算一下换行(要先转成ANSI格式)
+			std::string handle_food_name = CLewaimaiString::UTF8ToANSI(food_name);
+			std::vector<std::string> foodNameVector = HandleBiaoqianFoodname(handle_food_name, biaoqian_width);
+
+			int nRow = 0;
+
+			//考虑是否用大号字体
+			bool is_big_name = false;
+
+			/*暂时全部打印小字,这里注释掉
+			if(foodNameVector.size() <= 2)
+			{
+				//不超过2行,可以用大的字体
+				is_big_name = true;
+			}*/
+
+			//LOG_INFO("foodNameVector size:" << foodNameVector.size());
+
+			for (std::vector<std::string>::iterator it = foodNameVector.begin(); it != foodNameVector.end(); it++)
+			{
+				LOG_INFO("nRow:" << nRow << ", 准备打印商品名字:" << (*it).c_str());
+
+				if (is_big_name)
+				{
+					textData += BIAOQIAN_TEXTGet(*it, 12, 42 + 60 * nRow, 1, 2);
+				}
+				else
+				{
+					textData += BIAOQIAN_TEXTGet(*it, 12, 42 + 30 * nRow, 1, 1);
+				}
+
+				nRow++;
+			}
+
+			int nPriceY;
+			if (biaoqian_height == 30)
+			{
+				nPriceY = 180;
+			}
+			else if (biaoqian_height == 25)
+			{
+				nPriceY = 140;
+			}
+			else if (biaoqian_height == 20)
+			{
+				nPriceY = 100;
+			}
+
+			//打印价格
+			std::string priceInfo = CLewaimaiString::UTF8ToANSI(food_price) + "元";
+			textData += BIAOQIAN_TEXTGet(priceInfo, 12, nPriceY, 1, 1);
+
+			//打印订单号
+			std::string order_num = "订单号:" + CLewaimaiString::UTF8ToANSI(order.show_trade_no);
+			textData += BIAOQIAN_TEXTGet(order_num, 12, nPriceY + 30, 1, 1);
+
+			WriteData(textData);
+
+			BIAOQIAN_PRINT();
+
+			BIAOQIAN_CLS();
+		}
+	}
+
+	return m_print_content;
+}
+
+std::vector<ChufangPrinterContent> CPosPrinterData::PrintZhengcanOrderXiadanChufang(CZhengcanOrder& order)
+{
+	std::vector<ChufangPrinterContent> datas;
+
+	//读取厨房打印机信息
+	std::vector<ChufangPrinter> total_printers = CSetting::GetInstance()->getChufangPrints();
+
+	for (std::vector<ChufangPrinter>::iterator it = total_printers.begin(); it != total_printers.end(); it++)
+	{
+		//清空每个厨房打印机的打印内容
+		m_print_content = "";
+
+		ChufangPrinter printer = *it;
+		std::string ip = printer.ip;
+
+		std::string guige = printer.guige;
+		std::string fendan = printer.fendan;
+		std::string fenlei = printer.fenlei;
+		std::string fenlei_ids = printer.fenlei_ids;
+
+		std::vector<CZhengcanOrderItemPrint> cur_printer_use;
+		if (fenlei == "0")
+		{
+			cur_printer_use = order.m_items_print;
+		}
+		else
+		{
+			//如果开启了分类打印,就要比对了
+			std::map<string, bool> ids_map;
+			std::vector<string> ids = CLewaimaiString::Split(fenlei_ids, ",");
+
+			for (std::vector<string>::iterator it = ids.begin(); it != ids.end(); it++)
+			{
+				ids_map[(*it)] = true;
+			}
+
+			for (std::vector<CZhengcanOrderItemPrint>::iterator it = order.m_items_print.begin(); it != order.m_items_print.end(); it++)
+			{
+				if (ids_map.find((*it).m_type_id) != ids_map.end())
+				{
+					//如果当前商品的分类,在厨房打印机设置的分类里面,才加入
+					cur_printer_use.push_back(*it);
+				}
+			}
+		}
+
+		if (cur_printer_use.size() == 0)
+		{
+			//如果这个厨房打印机没有商品可以打印(开启了商品分类打印可能出现),就直接跳过
+			continue;
+		}
+
+		if (fendan == "0")
+		{
+			POS_Reset();
+			POS_TextOut("派工单", true, true, 1);
+			POS_FeedLine();
+
+			POS_FeedLine();
+
+			string order_type = "订单号:" + order.show_trade_no;
+			POS_TextOut(order_type, false, false, 0);
+			POS_FeedLine();
+
+			string init_time = "下单时间:" + order.init_time;
+			POS_TextOut(init_time, false, false, 0);
+			POS_FeedLine();
+
+			//预设选项
+			/*
+			if (order.m_order_field.size() > 1)
+			{
+				for (std::vector<CWaimaiOrderField>::iterator it = order.m_order_field.begin(); it != order.m_order_field.end() - 1; it++)
+				{
+					string order_field = CLewaimaiString::UTF8ToANSI((*it).name) + ":" + CLewaimaiString::UTF8ToANSI((*it).value);
+					POS_TextOut(order_field, false, true, 0);
+					POS_FeedLine();
+				}
+			}
+			}*/
+
+			//准备开始打印商品详情
+			string lines;
+
+			if (guige == "58")
+			{
+				lines = "--------------------------------";
+			}
+			else
+			{
+				lines = "------------------------------------------------";
+			}
+
+			POS_TextOut(lines);
+			POS_FeedLine();
+
+			//商品标题
+			if (guige == "58")
+			{
+				POS_TextOut("商品           单价   数量  金额", false, true);
+			}
+			else
+			{
+				POS_TextOut("商品                         单价    数量   金额", false, true);
+			}
+
+			POS_FeedLine();
+
+			//商品内容
+			for (std::vector<CZhengcanOrderItemPrint>::iterator it = cur_printer_use.begin(); it != cur_printer_use.end(); it++)
+			{
+				if (it->is_taocan == true)
+				{
+					//套餐的名字,厨房打印不打印
+					continue;
+				}
+
+				std::string food_name = (*it).m_food_name;
+				std::string food_price = (*it).m_item_price;
+				std::string quantity = (*it).m_quantity;
+
+				//计算总价
+				double item_price = atof(food_price.c_str()) * atof(quantity.c_str());
+				std::string food_total_price = CLewaimaiString::DoubleToString(item_price, 2);
+				food_name = CLewaimaiString::UTF8ToANSI(food_name);
+				//先输出商品名字
+				std::vector<string> m_names;
+
+				if (guige == "58")
+				{
+					m_names = HandleFoodname(food_name, 1);
+				}
+				else
+				{
+					m_names = HandleFoodname(food_name, 2);
+				}
+
+				std::string firstLine = m_names[0];
+				int nGuige;
+
+				if (guige == "58")
+				{
+					nGuige = 1;
+				}
+				else
+				{
+					nGuige = 2;
+				}
+
+				std::string priceShow = HandleFoodItemPrice(food_price, nGuige);
+				std::string quantityShow = HandleFoodQuantity(quantity, nGuige);
+				std::string priceTotalShow = HandleFoodTotalPrice(food_total_price, nGuige);
+				std::string firstLineShow = firstLine + priceShow + quantityShow + priceTotalShow;
+				POS_TextOut(firstLineShow, false, true, 0);
+				POS_FeedLine();
+
+				for (std::vector<string>::iterator it = m_names.begin() + 1; it != m_names.end(); it++)
+				{
+					POS_TextOut((*it), false, true, 0);
+					POS_FeedLine();
+				}
+			}
+
+			//判断是否有备注
+			if (order.m_memo.length() > 0)
+			{
+				POS_FeedLine();
+				string address = "整单备注:" + CLewaimaiString::UTF8ToANSI(order.m_memo);
+				POS_TextOut(address, false, true, 0);
+				POS_FeedLine();
+			}
+
+			//结束商品详情打印
+			POS_TextOut(lines);
+			POS_FeedLine();
+
+			POS_FeedLine();
+			POS_FeedLine();
+			POS_FeedLine();
+			POS_FeedLine();
+			POS_FeedLine();
+
+			POS_CutPaper();
+
+			//还原打印机初始设置,有些傻逼收银设备居然不是自动调用,比如哗啦啦
+			POS_Reset();
+		}
+		else
+		{
+			POS_Reset();
+
+			//分单模式下,每个商品打印一张单
+			for (std::vector<CZhengcanOrderItemPrint>::iterator it = cur_printer_use.begin(); it != cur_printer_use.end(); it++)
+			{
+				if (it->is_taocan == true)
+				{
+					//套餐的名字,厨房打印不打印
+					continue;
+				}
+
+				POS_TextOut("派工单", true, true, 1);
+				POS_FeedLine();
+
+				POS_FeedLine();
+
+				string order_type = "订单号:" + order.show_trade_no + "  ";
+
+				POS_TextOut(order_type, false, true, 1);
+				POS_FeedLine();
+
+				POS_FeedLine();
+
+				//预设选项
+				/*
+				if (order.m_order_field.size() > 1)
+				{
+					for (std::vector<CWaimaiOrderField>::iterator it = order.m_order_field.begin(); it != order.m_order_field.end() - 1; it++)
+					{
+						string order_field = CLewaimaiString::UTF8ToANSI((*it).name) + ":" + CLewaimaiString::UTF8ToANSI((*it).value);
+						POS_TextOut(order_field, false, true, 0);
+						POS_FeedLine();
+					}
+				}
+				}*/
+
+				//准备开始打印商品详情
+				string lines;
+
+				if (guige == "58")
+				{
+					lines = "--------------------------------";
+				}
+				else
+				{
+					lines = "------------------------------------------------";
+				}
+
+				POS_TextOut(lines);
+				POS_FeedLine();
+
+				//商品标题
+				if (guige == "58")
+				{
+					POS_TextOut("商品           单价   数量  金额", false, true);
+				}
+				else
+				{
+					POS_TextOut("商品                         单价    数量   金额", false, true);
+				}
+
+				POS_FeedLine();
+				std::string food_name = (*it).m_food_name;
+				std::string food_price = (*it).m_item_price;
+				std::string quantity = (*it).m_quantity;
+				//计算总价
+				double item_price = atof(food_price.c_str()) * atof(quantity.c_str());
+				std::string food_total_price = CLewaimaiString::DoubleToString(item_price, 2);
+				food_name = CLewaimaiString::UTF8ToANSI(food_name);
+				//先输出商品名字
+				std::vector<string> m_names;
+
+				if (guige == "58")
+				{
+					m_names = HandleFoodname(food_name, 1);
+				}
+				else
+				{
+					m_names = HandleFoodname(food_name, 2);
+				}
+
+				std::string firstLine = m_names[0];
+				std::string priceShow = HandleFoodItemPrice(food_price, 2);
+				std::string quantityShow = HandleFoodQuantity(quantity, 2);
+				std::string priceTotalShow = HandleFoodTotalPrice(food_total_price, 2);
+				std::string firstLineShow = firstLine + priceShow + quantityShow + priceTotalShow;
+				POS_TextOut(firstLineShow, false, true, 0);
+				POS_FeedLine();
+
+				for (std::vector<string>::iterator it = m_names.begin() + 1; it != m_names.end(); it++)
+				{
+					POS_TextOut((*it), false, true, 0);
+					POS_FeedLine();
+				}
+
+				//判断是否有备注
+				if (order.m_memo.length() > 0)
+				{
+					POS_FeedLine();
+					string address = "顾客备注:" + CLewaimaiString::UTF8ToANSI(order.m_memo);
+					POS_TextOut(address, false, true, 0);
+					POS_FeedLine();
+				}
+
+				//结束商品详情打印
+				POS_TextOut(lines);
+				POS_FeedLine();
+
+				POS_FeedLine();
+				POS_FeedLine();
+				POS_FeedLine();
+				POS_FeedLine();
+				POS_FeedLine();
+
+				POS_CutPaper();
+			}
+
+			//还原打印机初始设置,有些傻逼收银设备居然不是自动调用,比如哗啦啦
+			POS_Reset();
+		}
+
+		ChufangPrinterContent newData;
+		newData.ip = ip;
+		newData.data = m_print_content;
+
+		datas.push_back(newData);
+	}
+
+	return datas;
+}
+
 std::string CPosPrinterData::PrintJiaobanOrder(CJiaobaoOrder& order)
 std::string CPosPrinterData::PrintJiaobanOrder(CJiaobaoOrder& order)
 {
 {
 	//读取当前收银打印机的设置
 	//读取当前收银打印机的设置

+ 4 - 0
zhipuzi_pos_windows/print/CPosPrinterData.h

@@ -29,6 +29,10 @@ public:
 	std::string PrintDiandanOrderBiaoqian(CDiandanOrder& order);
 	std::string PrintDiandanOrderBiaoqian(CDiandanOrder& order);
 	std::vector<ChufangPrinterContent> PrintDiandanOrderChufang(CDiandanOrder& order);
 	std::vector<ChufangPrinterContent> PrintDiandanOrderChufang(CDiandanOrder& order);
 
 
+	std::string PrintZhengcanOrderXiadanShouyin(CZhengcanOrder& order);
+	std::string PrintZhengcanOrderXiadanBiaoqian(CZhengcanOrder& order);
+	std::vector<ChufangPrinterContent> PrintZhengcanOrderXiadanChufang(CZhengcanOrder& order);
+
 	std::string PrintJiaobanOrder(CJiaobaoOrder& order);
 	std::string PrintJiaobanOrder(CJiaobaoOrder& order);
 
 
 	std::string PrintHuiyuanchongzhiOrder(CHuiyuanchongzhiOrder& order);
 	std::string PrintHuiyuanchongzhiOrder(CHuiyuanchongzhiOrder& order);