multi-store/extend/Xpyun/util/NoteFormatter.php

129 lines
4.9 KiB
PHP
Raw Normal View History

<?php
namespace Xpyun\util;
class NoteFormatter
{
/**
* 58mm 系列打印机模板
*/
public const ROW_MAX_CHAR_LEN = 32;
public const MAX_HEAD_NAME_CHAR_LEN58 = 116;
private const MAX_NAME_CHAR_LEN = 20;
private const LAST_ROW_MAX_NAME_CHAR_LEN = 16;
private const MAX_QUANTITY_CHAR_LEN = 6;
private const MAX_PRICE_CHAR_LEN = 6;
/**
* 80mm 系列打印机模板
*/
public const ROW_MAX_CHAR_LEN80 = 48;
public const MAX_HEAD_NAME_CHAR_LEN80 = 32;
private const MAX_NAME_CHAR_LEN80 = 36;
// 每行打印的字符数汉字字母数字均为1
private const LAST_ROW_MAX_NAME_CHAR_LEN80 = 17;
private const MAX_QUANTITY_CHAR_LEN80 = 6;
private const MAX_PRICE_CHAR_LEN80 = 6;
public static function formatPrintOrderItem80($foodName, $quantity, $price)
{
$foodNameLen = Encoding::CalcGbkLenForPrint($foodName);
$mod = $foodNameLen % self::ROW_MAX_CHAR_LEN80;
$result = "";
if ($foodNameLen <= self::LAST_ROW_MAX_NAME_CHAR_LEN80 * 2) {
$result = $foodName;
$result = $result . str_repeat(" ", self::MAX_NAME_CHAR_LEN80 - $mod);
$quantityStr = '' . $quantity;
$quantityLen = Encoding::CalcAsciiLenForPrint($quantityStr);
$priceStr = '' . round($price, 2);
$priceLen = Encoding::CalcAsciiLenForPrint($priceStr);
$result = $result . $quantityStr . str_repeat(" ", self::MAX_QUANTITY_CHAR_LEN80 - $quantityLen);
$result = $result . $priceStr . str_repeat(" ", self::MAX_PRICE_CHAR_LEN80 - $priceLen);
} else {
$result = $result . self::getFoodNameSplit80($foodName, $quantity, $price);
$result = mb_convert_encoding($result, "UTF-8");
}
return $result . "<BR>";
}
private static function getFoodNameSplit80($foodName, $quantity, $price): string
{
print_r($foodName);
$foodNames = str_split($foodName, self::LAST_ROW_MAX_NAME_CHAR_LEN80 * 3);
$resultTemp = "";
for ($i = 0; $i < count($foodNames); $i++) {
$foodNameTmp = $foodNames[$i];
if ($i == 0) {
$foodNameLen = Encoding::CalcGbkLenForPrint($foodNameTmp);
$mod = $foodNameLen % self::ROW_MAX_CHAR_LEN80;
$resultTemp = $resultTemp . $foodNameTmp;
$resultTemp = $resultTemp . str_repeat(" ", self::MAX_NAME_CHAR_LEN80 - $mod);
$quantityStr = '' . $quantity;
$quantityLen = Encoding::CalcAsciiLenForPrint($quantityStr);
$priceStr = '' . round($price, 2);
$priceLen = Encoding::CalcAsciiLenForPrint($priceStr);
$resultTemp = $resultTemp . $quantityStr . str_repeat(" ", self::MAX_QUANTITY_CHAR_LEN80 - $quantityLen);
$resultTemp = $resultTemp . $priceStr . str_repeat(" ", self::MAX_PRICE_CHAR_LEN80 - $priceLen);
} else {
$resultTemp = $resultTemp . $foodNameTmp . "<BR>";
}
}
return $resultTemp;
}
/**
* 格式化菜品列表用于58mm打印机
* 注意:默认字体排版,若是字体宽度倍大后不适用
* 58mm打印机一行可打印32个字符 汉子按照2个字符算
* 分3列 名称20字符一般用16字符4空格填充 数量6字符 单价6字符不足用英文空格填充 名称过长换行
*
* @param foodName 菜品名称
* @param quantity 数量
* @param price 价格
* @throws Exception
*/
public static function formatPrintOrderItem($foodName, $quantity, $price)
{
$orderNameEmpty = str_repeat(" ", self::MAX_NAME_CHAR_LEN);
$foodNameLen = Encoding::CalcGbkLenForPrint($foodName);
// print("foodNameLen=".$foodNameLen."\n");
$quantityStr = '' . $quantity;
$quantityLen = Encoding::CalcAsciiLenForPrint($quantityStr);
// print("quantityLen=".$quantityLen."\n");
$priceStr = '' . round($price, 2);
$priceLen = Encoding::CalcAsciiLenForPrint($priceStr);
// print("priceLen=".$priceLen);
$result = $foodName;
$mod = $foodNameLen % self::ROW_MAX_CHAR_LEN;
// print("mod=".$mod."\n");
if ($mod <= self::LAST_ROW_MAX_NAME_CHAR_LEN) {
// 保证各个列的宽度固定,不足部分,利用空格填充
//make sure all the column length fixed, fill with space if not enough
$result = $result . str_repeat(" ", self::MAX_NAME_CHAR_LEN - $mod);
} else {
// 另起新行
// new line
$result = $result . "<BR>";
$result = $result . $orderNameEmpty;
}
$result = $result . $quantityStr . str_repeat(" ", self::MAX_QUANTITY_CHAR_LEN - $quantityLen);
$result = $result . $priceStr . str_repeat(" ", self::MAX_PRICE_CHAR_LEN - $priceLen);
$result = $result . "<BR>";
return $result;
}
}
?>