Ver código fonte

标签打印增加打印纸规格和出纸方向设置

张洋 5 anos atrás
pai
commit
25bdee1ea4

+ 18 - 0
bin/Win32/Debug/lewaimai_pos_windows/skin/setting.xml

@@ -134,6 +134,24 @@
 						<Combo name="setting_biaoqian_printer_usb" padding="0,9,0,0" width="800" height="26" tooltip="请点击这里选择您的标签打印机usb端口" normalimage="file='Setting_Combox_Normal.png' corner='2,2,24,2'" hotimage="file='Setting_Combox_Hover.png' corner='2,2,24,2'" pushedimage="Setting_Combox_Click.png' corner='2,2,24,2'" textpadding="10,1,1,1" >
 						</Combo>
 					</HorizontalLayout>
+					
+					<HorizontalLayout height="44">
+						<Label text="标签纸尺寸规格" width="260"/>
+						<Combo name="setting_biaoqian_printer_guige" padding="0,9,0,0" width="140" height="26" tooltip="请点击这里选择您的标签纸尺寸规格" normalimage="file='Setting_Combox_Normal.png' corner='2,2,24,2'" hotimage="file='Setting_Combox_Hover.png' corner='2,2,24,2'" pushedimage="Setting_Combox_Click.png' corner='2,2,24,2'" textpadding="10,1,1,1" >
+							<ListLabelElement text="40*30mm" selected="true" />
+							<ListLabelElement text="35*25mm" />
+							<ListLabelElement text="30*25mm" />
+							<ListLabelElement text="30*20mm" />
+						</Combo>
+					</HorizontalLayout>
+					
+					<HorizontalLayout height="44">
+						<Label text="出纸方向" width="260"/>
+						<Combo name="setting_biaoqian_printer_fangxiang" padding="0,9,0,0" width="140" height="26" tooltip="请点击这里选择您的标签纸出纸方向" normalimage="file='Setting_Combox_Normal.png' corner='2,2,24,2'" hotimage="file='Setting_Combox_Hover.png' corner='2,2,24,2'" pushedimage="Setting_Combox_Click.png' corner='2,2,24,2'" textpadding="10,1,1,1" >
+							<ListLabelElement text="正方向" selected="true" />
+							<ListLabelElement text="反方向" />
+						</Combo>
+					</HorizontalLayout>
 				</VerticalLayout>
 
 				<VerticalLayout bkcolor="#FFFFFFFF" padding="0,20,20,20" inset="15,15,15,15">

BIN
bin/Win32/Release/lewaimai_pos_windows/skin/skin.lwm


BIN
bin/Win32/Release/setup/lewaimai_pos_windows_setup_1.0.3.1.exe


+ 1 - 1
bin/Win32/Release/setup/乐外卖接单软件安装脚本.nsi

@@ -2,7 +2,7 @@
 
 ; HM NIS Edit Wizard helper defines
 !define PRODUCT_NAME "乐外卖接单软件"
-!define PRODUCT_VERSION "1.0.3.1"
+!define PRODUCT_VERSION "1.0.3.2"
 !define PRODUCT_PUBLISHER "深圳市迅享科技有限公司"
 !define PRODUCT_WEB_SITE "https://www.lewaimai.com"
 !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_NAME}.exe"

BIN
bin/x64/Release/lewaimai_pos_windows_server_linux/lewaimai_pos_windows_server_linux


BIN
lewaimai_pos_windows/resource/lewaimai_pos_windows.aps


BIN
lewaimai_pos_windows/resource/lewaimai_pos_windows.rc


+ 102 - 17
lewaimai_pos_windows/tool/CPosPrinter.cpp

@@ -952,11 +952,51 @@ void CPosPrinter::PrintWaimaiOrderBiaoqian(CWaimaiOrder& order)
     std::string printer_usb = CSetting::GetParam("setting_biaoqian_printer_usb");
     std::wstring ws_printer_usb = CLewaimaiString::UTF8ToUnicode(printer_usb);
 
+	//读取标签纸的规格和方向
+	int biaoqian_width, biaoqian_height;
+	std::string printer_guige = CSetting::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::GetParam("setting_biaoqian_printer_fangxiang");
+	if (printer_fangxiang ==  "1")
+	{
+		nDIRECTION = 1;
+	}
+	else
+	{
+		nDIRECTION = 0;
+	}
+
     //连接usb端口
     InitOneUsb(ws_printer_usb);
 
 	//初始化标签打印机
-	BIAOQIAN_Reset();
+	BIAOQIAN_Reset(biaoqian_width, biaoqian_height, nDIRECTION);
 
     std::vector<CWaimaiOrderItem> cur_printer_use = order.m_order_items;
 
@@ -987,55 +1027,80 @@ void CPosPrinter::PrintWaimaiOrderBiaoqian(CWaimaiOrder& order)
 			std::string textData = "";
 
             curFoodNum++;
+			
+			//打印小票自定义名称
+			string printer_tip_name = CLewaimaiString::UTF8ToANSI(order.m_printer_tip_name);
+			if (printer_tip_name.length() == 0)
+			{
+				printer_tip_name = "外卖";
+			}
 
             std::string restaurant_number = order.m_restaurant_number;
-            std::string order_num_info = "外卖 #" + CLewaimaiString::UTF8ToANSI(restaurant_number);
-            textData += BIAOQIAN_TEXTGet(order_num_info, 16, 24, 1, 1);
+            std::string order_num_info = printer_tip_name + " #" + CLewaimaiString::UTF8ToANSI(restaurant_number);
+
+			//纸张宽度40mm的,是 320个点位(每mm8个),刚好可以放13个汉字,每个汉字宽度差不多是24,商品换行显示的时候,
+			//每行最多12个汉字,也就是空24个,因此这里设置12,刚好左右各空一半
+            textData += BIAOQIAN_TEXTGet(order_num_info, 12, 6, 1, 1);
 
             //打印份数
             std::string numInfo = to_string(curFoodNum) + "/" + to_string(foodNum);
-            textData += BIAOQIAN_TEXTGet(numInfo, 160, 24, 1, 1);
+            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);
+            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());
+            }*/
 
+            //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, 16, 64 + 64 * nRow, 1, 2);
+                    textData += BIAOQIAN_TEXTGet(*it, 12, 42 + 60 * nRow, 1, 2);
                 }
                 else
                 {
-                    textData += BIAOQIAN_TEXTGet(*it, 16, 64 + 32 * nRow, 1, 1);
+                    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, 16, 188, 1, 1);
+            textData += BIAOQIAN_TEXTGet(priceInfo, 12, nPriceY, 1, 1);
 
             //打印订单号
             std::string order_num = "订单号:" + CLewaimaiString::UTF8ToANSI(order.m_order_num);
-            textData += BIAOQIAN_TEXTGet(order_num, 16, 218, 1, 1);
+            textData += BIAOQIAN_TEXTGet(order_num, 12, nPriceY + 30, 1, 1);
 
 			WriteData(textData);
 
@@ -1805,11 +1870,11 @@ void CPosPrinter::POS_OutBmp(std::wstring ImagePath)
 	delete[] dataTmp;
 }
 
-void CPosPrinter::BIAOQIAN_Reset()
+void CPosPrinter::BIAOQIAN_Reset(int nWidth, int nHeight, int nDirection)
 {
     char endTag[3] = {0x0d, 0x0a, 0x00};
 
-    std::string size = "SIZE 40 mm, 30 mm";
+    std::string size = "SIZE " + to_string(nWidth) + " mm," + to_string(nHeight) + " mm";
     size += endTag;
 
     std::string gap = "GAP 2 mm,0 mm";
@@ -1821,6 +1886,9 @@ void CPosPrinter::BIAOQIAN_Reset()
     std::string density = "DENSITY 12";
     density += endTag;
 
+	std::string DIRECTION = "DIRECTION " + to_string(nDirection);
+	DIRECTION += endTag;
+
     std::string REFERENCE = "REFERENCE 0,0";
     REFERENCE += endTag;
 
@@ -1833,7 +1901,7 @@ void CPosPrinter::BIAOQIAN_Reset()
     std::string cls = "CLS";
     cls += endTag;
 
-    std::string data = size + gap + speed + density + REFERENCE + PEER + TEAR + cls;
+    std::string data = size + gap + speed + density + DIRECTION + REFERENCE + PEER + TEAR + cls;
 
     WriteData(data);
 }
@@ -2172,16 +2240,33 @@ std::string CPosPrinter::HandleFoodTotalPrice(std::string oldprice, int guige)
     }
 }
 
-std::vector<std::string> CPosPrinter::HandleBiaoqianFoodname(std::string oldname)
+std::vector<std::string> CPosPrinter::HandleBiaoqianFoodname(std::string oldname, int nBiaoqianWidth)
 {
     std::vector<std::string> newnameArray;
     int nHanzi, nZimu;
     CalWord(oldname, nHanzi, nZimu);
 
+	//文字内容的实际宽度,1个汉字算2个宽度,1个英文或者数字、标点算1个(40mm宽度最多打印12个汉字 )
     int nWidth = nHanzi * 2 + nZimu;
 
     //40 *30mmm的标签,宽度最大24
-    int maxWidth = 24;
+    int maxWidth;
+	if (nBiaoqianWidth == 40)
+	{
+		maxWidth = 24;
+	}
+	else if (nBiaoqianWidth == 35)
+	{
+		maxWidth = 21;
+	}
+	else if (nBiaoqianWidth == 30)
+	{
+		maxWidth = 18;
+	}
+	else
+	{
+		maxWidth = 24;
+	}
 
     if(nWidth <= maxWidth)
     {

+ 2 - 2
lewaimai_pos_windows/tool/CPosPrinter.h

@@ -72,7 +72,7 @@ private:
 	void POS_OutBmp(std::wstring ImagePath);
 
 	//标签打印机的处理方法
-	void BIAOQIAN_Reset();
+	void BIAOQIAN_Reset(int nWidth, int nHeight, int nDirection);
 	void BIAOQIAN_FORMFEED();
 	void BIAOQIAN_TEXTOUT(std::string content, int x, int y, int x_multiplication, int y_multiplication);
 	std::string BIAOQIAN_TEXTGet(std::string content, int x, int y, int x_multiplication, int y_multiplication);
@@ -89,7 +89,7 @@ private:
 	std::string HandleFoodTotalPrice(std::string oldprice, int guige = 1);
 
 	//对标签打印的名字进行换行处理
-	std::vector<std::string> HandleBiaoqianFoodname(std::string oldname);
+	std::vector<std::string> HandleBiaoqianFoodname(std::string oldname, int nBiaoqianWdith);
 
 private:
 	//收银小票打印的句柄组合

+ 13 - 0
lewaimai_pos_windows/tool/CSetting.cpp

@@ -264,6 +264,19 @@ void CSetting::Init()
 		m_paramsMap[setting_biaoqian_printer_usb] = "";
 	}
 
+	std::string setting_biaoqian_printer_guige = "setting_biaoqian_printer_guige";
+	if (m_paramsMap.find(setting_biaoqian_printer_guige) == m_paramsMap.end())
+	{
+		m_paramsMap[setting_biaoqian_printer_guige] = "40*30mm";
+	}
+
+	std::string setting_biaoqian_printer_fangxiang = "setting_biaoqian_printer_fangxiang";
+	if (m_paramsMap.find(setting_biaoqian_printer_fangxiang) == m_paramsMap.end())
+	{
+		//1表示正方向,0表示反方向
+		m_paramsMap[setting_biaoqian_printer_fangxiang] = "1";
+	}
+
 	//厨房打印的默认参数
 	std::string setting_is_new_waimai_chufang_printer = "setting_is_new_waimai_chufang_printer";
 	if (m_paramsMap.find(setting_is_new_waimai_chufang_printer) == m_paramsMap.end())

+ 78 - 0
lewaimai_pos_windows/wnd/CMainWnd.cpp

@@ -1087,6 +1087,40 @@ void CMainWnd::HandleItemSelectMsg(TNotifyUI& msg)
 
         CSetting::SetParam("setting_biaoqian_printer_usb", CLewaimaiString::UnicodeToUTF8(usb_device));
     }
+	else if (name == _T("setting_biaoqian_printer_guige"))
+	{
+		CComboUI* com = static_cast<CComboUI*>(m_pm.FindControl(_T("setting_biaoqian_printer_guige")));
+
+		if (com->GetCurSel() == 0)
+		{
+			CSetting::SetParam("setting_biaoqian_printer_guige", "40*30mm");
+		}
+		else if (com->GetCurSel() == 1)
+		{
+			CSetting::SetParam("setting_biaoqian_printer_guige", "35*25mm");
+		}
+		else if (com->GetCurSel() == 2)
+		{
+			CSetting::SetParam("setting_biaoqian_printer_guige", "30*25mm");
+		}
+		else if (com->GetCurSel() == 3)
+		{
+			CSetting::SetParam("setting_biaoqian_printer_guige", "30*20mm");
+		}
+	}
+	else if (name == _T("setting_biaoqian_printer_fangxiang"))
+	{
+		CComboUI* com = static_cast<CComboUI*>(m_pm.FindControl(_T("setting_biaoqian_printer_fangxiang")));
+
+		if (com->GetCurSel() == 0)
+		{
+			CSetting::SetParam("setting_biaoqian_printer_fangxiang", "1");
+		}
+		else if (com->GetCurSel() == 1)
+		{
+			CSetting::SetParam("setting_biaoqian_printer_fangxiang", "0");
+		}
+	}
 }
 
 LRESULT CMainWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
@@ -1855,6 +1889,50 @@ void CMainWnd::InitSettingStatus()
     com_usb->SelectItem(nSelect, false, false);
     com_usb->SetText(CLewaimaiString::UTF8ToUnicode(setting_biaoqian_printer_usb).c_str());
 
+	com = static_cast<CComboUI*>(m_pm.FindControl(_T("setting_biaoqian_printer_guige")));
+	std::string setting_biaoqian_printer_guige = CSetting::GetParam("setting_biaoqian_printer_guige");
+
+	if (setting_biaoqian_printer_guige == "40*30mm")
+	{
+		com->SetInternVisible(true);
+		com->SelectItem(0, false, false);
+		com->SetText(L"40*30mm");
+	}
+	else if (setting_biaoqian_printer_guige == "35*25mm")
+	{
+		com->SetInternVisible(true);
+		com->SelectItem(1, false, false);
+		com->SetText(L"35*25mm");
+	}
+	else if (setting_biaoqian_printer_guige == "30*25mm")
+	{
+		com->SetInternVisible(true);
+		com->SelectItem(2, false, false);
+		com->SetText(L"30*25mm");
+	}
+	else if (setting_biaoqian_printer_guige == "30*20mm")
+	{
+		com->SetInternVisible(true);
+		com->SelectItem(3, false, false);
+		com->SetText(L"30*20mm");
+	}
+
+	com = static_cast<CComboUI*>(m_pm.FindControl(_T("setting_biaoqian_printer_fangxiang")));
+	std::string setting_biaoqian_printer_fangxiang = CSetting::GetParam("setting_biaoqian_printer_fangxiang");
+
+	if (setting_biaoqian_printer_fangxiang == "1")
+	{
+		com->SetInternVisible(true);
+		com->SelectItem(0, false, false);
+		com->SetText(L"正方向");
+	}
+	else if (setting_biaoqian_printer_fangxiang == "0")
+	{
+		com->SetInternVisible(true);
+		com->SelectItem(1, false, false);
+		com->SetText(L"反方向");
+	}
+
     //这里开始,初始化厨房打印机的设置
     CListUI* pPrinterList = static_cast<CListUI*>(m_pm.FindControl(_T("setting_chufang_printer_list")));