|
@@ -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)
|
|
|
{
|
|
{
|
|
|
//读取当前收银打印机的设置
|
|
//读取当前收银打印机的设置
|