296 lines
8.1 KiB
PHP
296 lines
8.1 KiB
PHP
<?php
|
|
/**
|
|
* This service file is part of item.
|
|
*
|
|
* @author ctexthuang
|
|
* @contact ctexthuang@qq.com
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Service\Admin\Catering\Print;
|
|
|
|
use App\Exception\ErrException;
|
|
use App\Lib\Print\YlyBasicsLib;
|
|
use App\Model\Printer;
|
|
use Hyperf\Di\Annotation\Inject;
|
|
use Psr\Container\ContainerExceptionInterface;
|
|
use Psr\Container\NotFoundExceptionInterface;
|
|
use function Hyperf\Config\config;
|
|
|
|
class YlyPrintService implements PrintOrderInterface
|
|
{
|
|
/**
|
|
* 打印数据
|
|
* @var array
|
|
*/
|
|
public array $data;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
public int $printId;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private string $token;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private string $machineCode;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private string $content;
|
|
|
|
/**
|
|
* @var YlyBasicsLib
|
|
*/
|
|
#[Inject]
|
|
protected YlyBasicsLib $ylyBasicsLib;
|
|
|
|
/**
|
|
* @var Printer
|
|
*/
|
|
#[Inject]
|
|
protected Printer $printerModel;
|
|
|
|
/**
|
|
* @return void
|
|
* @throws ContainerExceptionInterface
|
|
* @throws NotFoundExceptionInterface
|
|
*/
|
|
public function handle(): void
|
|
{
|
|
//加入打印机验证 orderOptionCateringLogModel
|
|
$printInfo = $this->printerModel->where('id',$this->printId)->first();
|
|
|
|
if (empty($printInfo)) throw new ErrException('打印机不存在-1');
|
|
|
|
if (empty($printInfo->code_value) || $printInfo->code_value == '') throw new ErrException('打印机不存在-2');
|
|
|
|
$this->token = $this->ylyBasicsLib->selfAppAccredit();
|
|
$this->machineCode = $printInfo->code_value;
|
|
}
|
|
|
|
/**
|
|
* @return true
|
|
* @throws ContainerExceptionInterface
|
|
* @throws NotFoundExceptionInterface
|
|
*/
|
|
public function printList(): true
|
|
{
|
|
$this->checkOrderData();
|
|
|
|
$this->buildOrderContent();
|
|
|
|
$this->ylyBasicsLib->printTextRequest($this->token,$this->machineCode,$this->content);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @return void
|
|
*/
|
|
private function checkOrderData(): void
|
|
{
|
|
if (empty($this->data)) throw new ErrException('打印商品数据不存在');
|
|
|
|
if (
|
|
empty($this->data['pickup_code']) ||
|
|
empty($this->data['driver_num']) ||
|
|
empty($this->data['site_order']) ||
|
|
empty($this->data['site_text']) ||
|
|
empty($this->data['sku']) ||
|
|
empty($this->data['order_sno']) ||
|
|
empty($this->data['username']) ||
|
|
empty($this->data['mobile']) ||
|
|
empty($this->data['date']) ||
|
|
empty($this->data['heapsort'])
|
|
) throw new ErrException('打印数据丢失');
|
|
}
|
|
|
|
/**
|
|
* @return void
|
|
*/
|
|
private function buildOrderContent(): void
|
|
{
|
|
//重置数据
|
|
$this->content = '';
|
|
|
|
//设置高度
|
|
$this->content .= "<PH>100,1</PH>";
|
|
//设置宽度
|
|
$this->content .= "<PW>048</PW>";
|
|
|
|
$this->content .= "\n";
|
|
$this->content .= "\n";
|
|
|
|
//取餐号
|
|
$this->content .= "<FS3><CA>{$this->data['pickup_code']}</CA></FS3>\n";
|
|
|
|
//司机号码 - 线路顺序
|
|
$this->content .= "<FS><CA>线路:{$this->data['driver_num']}-{$this->data['site_order']}</CA></FS>\n";
|
|
|
|
//配送点
|
|
$this->content .= "<FS><CA>配送点:{$this->data['site_text']}</CA></FS>\n";
|
|
|
|
// 表头
|
|
$this->content .= "--------------------------------\n";
|
|
|
|
//菜品表格
|
|
$codeNum = [];
|
|
foreach ($this->data['sku'] as $one) {
|
|
for ($i = 0;$i < $one['num'];$i++) {
|
|
$codeNum[] = $one['code_num'];
|
|
}
|
|
}
|
|
sort($codeNum);
|
|
$goodsArr = array_chunk($codeNum,3,true);
|
|
foreach ($goodsArr as $one) {
|
|
$one = array_values($one);
|
|
switch (count($one)) {
|
|
case 1:
|
|
$this->content .= "<FS4><CA>{$one[0]}</CA></FS4>\n";
|
|
break;
|
|
case 2:
|
|
$this->content .= "<FS4><CA>{$one[0]}.{$one[1]}</CA></FS4>\n";
|
|
break;
|
|
case 3:
|
|
$this->content .= "<FS4><CA>{$one[0]}.{$one[1]}.{$one[2]}</CA></FS4>\n";
|
|
break;
|
|
}
|
|
}
|
|
|
|
//下面分割符号
|
|
$this->content .= "--------------------------------\n";
|
|
|
|
//订单号 截取订单号
|
|
$last8Chars = substr($this->data['order_sno'], strlen($this->data['order_sno']) - 8, 8);
|
|
$this->content .= "<LR2>订单尾号,{$last8Chars}</LR2>";
|
|
|
|
//用户昵称
|
|
$this->content .= "<LR2>用户昵称,{$this->data['username']}</LR2>";
|
|
|
|
//手机尾号
|
|
$last4Chars = substr($this->data['mobile'], strlen($this->data['mobile']) - 4, 4);
|
|
$this->content .= "<LR2>手机尾号,{$last4Chars}</LR2>";
|
|
|
|
//套餐日期
|
|
$this->content .= "<LR2>套餐日期,{$this->data['date']}</LR2>";
|
|
|
|
//生产日期
|
|
$productionTime = $this->data['date'].config('print.yly.production_time');
|
|
$this->content .= "<LR2>生产日期,$productionTime</LR2>";
|
|
|
|
//保质期
|
|
$contentEdibleTimeTips = config('print.yly.content_edible_time_tips');
|
|
$this->content .= "<LR2>保质期,$contentEdibleTimeTips</LR2>";
|
|
|
|
$this->content .= "<FS3><CA>{$this->data['heapsort']}</CA></FS3>";
|
|
}
|
|
|
|
/**
|
|
* @return true
|
|
* @throws ContainerExceptionInterface
|
|
* @throws NotFoundExceptionInterface
|
|
*/
|
|
public function printSingleOrder(): true
|
|
{
|
|
return $this->printList();
|
|
}
|
|
|
|
/**
|
|
* @return void
|
|
* @throws ContainerExceptionInterface
|
|
* @throws NotFoundExceptionInterface
|
|
*/
|
|
public function printCancel(): void
|
|
{
|
|
$this->ylyBasicsLib->cancelRequest($this->token,$this->machineCode);
|
|
}
|
|
|
|
/**
|
|
* @return true
|
|
* @throws ContainerExceptionInterface
|
|
* @throws NotFoundExceptionInterface
|
|
*/
|
|
public function printBoxLabel(): true
|
|
{
|
|
$this->checkBoxLabelData();
|
|
|
|
$this->buildBoxContent();
|
|
|
|
$this->ylyBasicsLib->printTextRequest($this->token,$this->machineCode,$this->content);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @return void
|
|
*/
|
|
private function checkBoxLabelData(): void
|
|
{
|
|
if (empty($this->data)) throw new ErrException('打印标签数据不存在');
|
|
|
|
if (
|
|
empty($this->data['driver_num']) ||
|
|
empty($this->data['site_order']) ||
|
|
empty($this->data['site_text']) ||
|
|
empty($this->data['copies_num']) ||
|
|
empty($this->data['driver_name']) ||
|
|
empty($this->data['current_num']) ||
|
|
empty($this->data['date_text'])
|
|
) throw new ErrException('打印数据丢失');
|
|
}
|
|
|
|
/**
|
|
* @return void
|
|
*/
|
|
private function buildBoxContent(): void
|
|
{
|
|
// 重置
|
|
$this->content = '';
|
|
|
|
//设置高度
|
|
$this->content .= "<PH>100,1</PH>";
|
|
//设置宽度
|
|
$this->content .= "<PW>048</PW>";
|
|
|
|
//上下居中
|
|
$this->content .= "\n";
|
|
$this->content .= "\n";
|
|
$this->content .= "\n";
|
|
$this->content .= "\n";
|
|
$this->content .= "\n";
|
|
$this->content .= "\n";
|
|
$this->content .= "\n";
|
|
|
|
// 司机号码 - 线路顺序
|
|
$this->content .= "<FS3><CA>线路:{$this->data['driver_num']}-{$this->data['site_order']}</CA></FS3>\n";
|
|
$this->content .= "\n";
|
|
|
|
// 总量
|
|
$this->content .= "<FS><CA>总份数:{$this->data['copies_num']}</CA></FS>\n";
|
|
$this->content .= "\n";
|
|
|
|
// 箱数
|
|
$currentNum = str_pad($this->data['current_num'], 2, '0', STR_PAD_LEFT);
|
|
$this->content .= "<FS2><CA>箱数:$currentNum</CA></FS2>\n";
|
|
$this->content .= "\n";
|
|
|
|
// 配送点
|
|
$this->content .= "<FS><CA>配送司机: {$this->data['driver_name']}</CA></FS>\n";
|
|
$this->content .= "\n";
|
|
|
|
// 配送点
|
|
$this->content .= "<FS><CA>配送点: {$this->data['site_text']}</CA></FS>\n";
|
|
$this->content .= "\n";
|
|
|
|
// 套餐日期
|
|
$this->content .= "<FS3><CA>{$this->data['date_text']}</CA></FS3>\n";
|
|
}
|
|
} |