You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
393 lines
15 KiB
393 lines
15 KiB
<?php
|
|
// +----------------------------------------------------------------------
|
|
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
|
// +----------------------------------------------------------------------
|
|
// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
|
|
// +----------------------------------------------------------------------
|
|
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
|
// +----------------------------------------------------------------------
|
|
// | Author: CRMEB Team <admin@crmeb.com>
|
|
// +----------------------------------------------------------------------
|
|
declare (strict_types=1);
|
|
|
|
namespace app\services\activity\collage;
|
|
|
|
use app\jobs\notice\PrintJob;
|
|
use app\services\activity\table\TableQrcodeServices;
|
|
use app\services\BaseServices;
|
|
use app\dao\activity\collage\UserCollageCodeDao;
|
|
use app\services\message\SystemPrinterServices;
|
|
use app\services\order\StoreOrderCartInfoServices;
|
|
use app\services\system\config\ConfigServices;
|
|
use crmeb\services\printer\Printer;
|
|
use think\exception\ValidateException;
|
|
use app\services\other\CategoryServices;
|
|
use crmeb\services\SystemConfigService;
|
|
use crmeb\utils\Arr;
|
|
use think\facade\Log;
|
|
|
|
/**
|
|
*
|
|
* Class UserCollageCodeServices
|
|
* @package app\services\activity\collage
|
|
* @mixin UserCollageCodeDao
|
|
*/
|
|
class UserCollageCodeServices extends BaseServices
|
|
{
|
|
|
|
/**
|
|
* UserCollageCodeServices constructor.
|
|
* @param UserCollageCodeDao $dao
|
|
*/
|
|
public function __construct(UserCollageCodeDao $dao)
|
|
{
|
|
$this->dao = $dao;
|
|
}
|
|
|
|
/**
|
|
* 验证拼单是否开启
|
|
* @return bool
|
|
*/
|
|
public function checkCollageStatus()
|
|
{
|
|
//门店是否开启
|
|
if (!sys_config('store_func_status', 1)) {
|
|
return false;
|
|
}
|
|
//桌码是否开启
|
|
if (!sys_config('store_splicing_switch', 1)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 验证桌码功能是否开启
|
|
* @return bool
|
|
*/
|
|
public function checkTabldeCodeStatus(int $store_id)
|
|
{
|
|
//门店是否开启
|
|
if (!sys_config('store_func_status', 1)) {
|
|
return false;
|
|
}
|
|
//桌码是否开启
|
|
if (!store_config($store_id, 'store_code_switch', 1)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 拼单、桌码状态
|
|
* @param $id
|
|
* @return array|\think\Model|null
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
* @throws \think\db\exception\DbException
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
*/
|
|
public function collageStatus($id)
|
|
{
|
|
return $this->dao->get($id, ['status']);
|
|
}
|
|
|
|
/**
|
|
* 记录发起拼单
|
|
* @param int $uid
|
|
* @param int $store_id
|
|
* @param int $address_id
|
|
* @param int $shipping_type
|
|
* @return \crmeb\basic\BaseModel|\think\Model
|
|
*/
|
|
public function setUserCollage(int $uid, int $store_id, int $address_id, int $shipping_type)
|
|
{
|
|
if ($this->dao->be(['uid' => $uid, 'type' => 9, 'store_id' => $store_id, 'address_id' => $address_id, 'shipping_type' => $shipping_type, 'status' => [0, 1]])) throw new ValidateException('您已在拼单中,不能再次拼单!');
|
|
$data = [
|
|
'uid' => $uid,
|
|
'type' => 9,
|
|
'store_id' => $store_id,
|
|
'address_id' => $address_id,
|
|
'shipping_type' => $shipping_type,
|
|
'add_time' => time()
|
|
];
|
|
$res = $this->dao->save($data);
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* 获取拼单/桌码信息
|
|
* @param array $where
|
|
* @param string|null $field
|
|
* @param array $with
|
|
* @return array|\think\Model|null
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
* @throws \think\db\exception\DbException
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
*/
|
|
public function getUserCollage(array $where, ?string $field = '*', array $with = [])
|
|
{
|
|
|
|
return $this->dao->getOne($where, $field, $with);
|
|
}
|
|
|
|
/**
|
|
* 修改拼单
|
|
* @param int $id
|
|
* @param array $where
|
|
* @return mixed
|
|
*/
|
|
public function userUpdate(int $id, array $where)
|
|
{
|
|
return $this->dao->update($id, $where);
|
|
}
|
|
|
|
/**
|
|
* 记录桌码
|
|
* @param int $uid
|
|
* @param int $store_id
|
|
* @param int $qrcode_id
|
|
* @param int $number
|
|
* @return bool|\crmeb\basic\BaseModel|\think\Model
|
|
*/
|
|
public function setUserTableCode(int $uid, int $store_id, int $qrcode_id, int $number)
|
|
{
|
|
//1=>合并结账 2=>单独结账
|
|
$store_checkout_method = store_config($store_id, 'store_checkout_method', 1);
|
|
if ($store_checkout_method == 1) {
|
|
$where = ['store_id' => $store_id, 'qrcode_id' => $qrcode_id, 'checkout_method' => $store_checkout_method, 'type' => 10, 'status' => [0, 1]];
|
|
} else {
|
|
$where = ['uid' => $uid, 'store_id' => $store_id, 'qrcode_id' => $qrcode_id, 'checkout_method' => $store_checkout_method, 'type' => 10, 'status' => [0, 1]];
|
|
}
|
|
$table = $this->dao->getOne($where);
|
|
if ($table) return $table;
|
|
$max = $this->dao->getMaxSerialNumber(['store_id' => $store_id, 'type' => 10]);
|
|
$data = [
|
|
'uid' => $uid,
|
|
'type' => 10,
|
|
'store_id' => $store_id,
|
|
'checkout_method' => $store_checkout_method,
|
|
'qrcode_id' => $qrcode_id,
|
|
'number_diners' => $number,
|
|
'serial_number' => $max ? '00' . ($max + 1) : '001',
|
|
'add_time' => time()
|
|
];
|
|
return $this->dao->save($data);
|
|
}
|
|
|
|
/**
|
|
* 检查是否换桌 code 0 :换桌 1 :未换桌 2:无记录
|
|
* @param int $uid
|
|
* @param int $store_id
|
|
* @param int $qrcode_id
|
|
* @param int $store_checkout_method
|
|
* @return array|int[]
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
* @throws \think\db\exception\DbException
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
*/
|
|
public function isUserChangingTables(int $uid, int $store_id, int $qrcode_id, int $store_checkout_method)
|
|
{
|
|
$where = ['store_id' => $store_id, 'uid' => $uid, 'checkout_method' => $store_checkout_method, 'type' => 10, 'status' => [0, 1]];
|
|
$whereTo = ['store_id' => $store_id, 'qrcode_id' => $qrcode_id, 'checkout_method' => $store_checkout_method, 'type' => 10, 'status' => [0, 1]];
|
|
$table = $this->dao->getOne($where);
|
|
$table1 = $this->dao->getOne($whereTo);
|
|
if ($table) {
|
|
if ($table['qrcode_id'] != $qrcode_id) {
|
|
return ['code' => 0, 'tableId' => $table['id']];
|
|
} else {
|
|
return ['code' => 1, 'tableId' => $table['id']];
|
|
}
|
|
} else {
|
|
if ($store_checkout_method == 1) {
|
|
/** @var UserCollagePartakeServices $partakeService */
|
|
$partakeService = app()->make(UserCollagePartakeServices::class);
|
|
$partake_where = ['uid' => $uid, 'store_id' => $store_id, 'status' => 1];
|
|
$partake = $partakeService->getMaxTime($partake_where);
|
|
if (!$partake) {
|
|
return ['code' => 2, 'tableId' => $table1 ? $table1['id'] : 0];
|
|
}
|
|
$table2 = $this->dao->get($partake['collate_code_id']);
|
|
if (!$table2) {
|
|
return ['code' => 2, 'tableId' => $table1 ? $table1['id'] : 0];
|
|
}
|
|
if (in_array($table2['status'], [0, 1])) {
|
|
if ($table2['qrcode_id'] != $qrcode_id) {
|
|
return ['code' => 0, 'tableId' => $table2['id']];
|
|
} else {
|
|
return ['code' => 1, 'tableId' => $table2['id']];
|
|
}
|
|
} else {
|
|
return ['code' => 2, 'tableId' => $table1 ? $table1['id'] : 0];
|
|
}
|
|
} else {
|
|
return ['code' => 1, 'tableId' => 0];
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 更换座位 处理原有商品
|
|
* @param int $tableId
|
|
* @param int $y_tableId
|
|
* @return bool
|
|
*/
|
|
public function userChangingTables(int $tableId, int $y_tableId)
|
|
{
|
|
/** @var UserCollagePartakeServices $partakeService */
|
|
$partakeService = app()->make(UserCollagePartakeServices::class);
|
|
$res = $partakeService->update(['collate_code_id' => $y_tableId], ['collate_code_id' => $tableId]);
|
|
$table = $this->dao->get($y_tableId);
|
|
/** @var TableQrcodeServices $qrcodeService */
|
|
$qrcodeService = app()->make(TableQrcodeServices::class);
|
|
$res1 = $qrcodeService->update($table['qrcode_id'], ['is_use' => 0, 'eat_number' => 0, 'order_time' => 0]);
|
|
$res2 = $this->dao->update($tableId, ['number_diners' => $table['number_diners']]);
|
|
$res3 = $this->dao->delete($y_tableId);
|
|
return $res && $res1 && $res2 && $res3;
|
|
}
|
|
|
|
/**
|
|
* 桌码订单
|
|
* @param array $where
|
|
* @return array
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
* @throws \think\db\exception\DbException
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
*/
|
|
public function getStoreTableCodeList(array $where, array $field = ['*'])
|
|
{
|
|
[$page, $limit] = $this->getPageValue();
|
|
$data = $this->dao->searchTableCodeList($where, $field, $page, $limit, ['qrcode', 'orderId']);
|
|
$count = $this->dao->count($where);
|
|
/** @var UserCollagePartakeServices $partakeService */
|
|
$partakeService = app()->make(UserCollagePartakeServices::class);
|
|
foreach ($data as $key => &$datum) {
|
|
$datum['qrcode']['category'] = [];
|
|
if (isset($datum['qrcode']['cate_id']) && $datum['qrcode']['cate_id']) {
|
|
/** @var CategoryServices $categoryService */
|
|
$categoryService = app()->make(CategoryServices::class);
|
|
$datum['qrcode']['category'] = $categoryService->get((int)$datum['qrcode']['cate_id'], ['name']);
|
|
} else {
|
|
$datum['qrcode']['category'] = ['name' => '已删除'];
|
|
$datum['qrcode']['table_number'] = '';
|
|
}
|
|
$dataPartake = $partakeService->getCashierTablePartakeProduct(['collate_code_id' => $datum['id'], 'status' => 1], '', ['productInfo']);
|
|
$datum['cartList'] = $dataPartake['cart'] ?? [];
|
|
$datum['sum_price'] = $dataPartake['sum_price'] ?? 0;
|
|
$datum['cart_num'] = $dataPartake['cart_num'] ?? 0;
|
|
}
|
|
return compact('data', 'count');
|
|
}
|
|
|
|
/**
|
|
* 确认下单
|
|
* @param int $tableId
|
|
* @param int $store_id
|
|
* @return bool
|
|
*/
|
|
public function userTablePlaceOrder(int $tableId, int $store_id)
|
|
{
|
|
$this->dao->update($tableId, ['status' => 1]);
|
|
/** @var UserCollagePartakeServices $partakeService */
|
|
$partakeService = app()->make(UserCollagePartakeServices::class);
|
|
$partakeService->update(['collate_code_id' => $tableId], ['is_settle' => 1]);
|
|
|
|
PrintJob::dispatch('tableDoJob', [$tableId, $store_id, 1]);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 桌码、拼单长期未操作取消桌码、拼单记录
|
|
* @return bool|void
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
* @throws \think\db\exception\DbException
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
*/
|
|
public function tableCodeNotOperating(int $type = 10)
|
|
{
|
|
$where = ['type' => $type, 'status' => [0, 1]];
|
|
$list = $this->dao->searchTableCodeList($where);
|
|
//系统预设取消订单时间段
|
|
$keyValue = ['table_code_not_operating_time', 'collate_not_operating_time'];
|
|
//获取配置
|
|
$systemValue = SystemConfigService::more($keyValue);
|
|
//格式化数据
|
|
$systemValue = Arr::setValeTime($keyValue, is_array($systemValue) ? $systemValue : []);
|
|
$table_code_not_operating_time = $systemValue['table_code_not_operating_time'];
|
|
$collate_not_operating_time = $systemValue['collate_not_operating_time'];
|
|
$not_operating_time = $type == 10 ? $table_code_not_operating_time : $collate_not_operating_time;
|
|
/** @var UserCollagePartakeServices $partakeService */
|
|
$partakeService = app()->make(UserCollagePartakeServices::class);
|
|
$not_operating_time = (int)bcmul((string)$not_operating_time, '3600', 0);
|
|
foreach ($list as $key => $item) {
|
|
if ((strtotime($item['add_time']) + $not_operating_time) < time()) {
|
|
try {
|
|
$this->transaction(function () use ($item, $partakeService) {
|
|
//修改记录状态
|
|
$res = $this->dao->update($item['id'], ['status' => -1]);
|
|
$res = $res && $partakeService->update(['collate_code_id' => $item['id']], ['status' => 0]);
|
|
});
|
|
} catch (\Throwable $e) {
|
|
$msg = $type == 10 ? '桌码长期未操作取消桌码记录失败' : '拼单长期未操作取消拼单记录失败';
|
|
Log::error($msg . ',失败原因:' . $e->getMessage(), $e->getTrace());
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 桌码打印订单
|
|
* @param int $tableId
|
|
* @param int $store_id
|
|
* @param int $print_event
|
|
* @param int $is_print
|
|
* @return bool
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
* @throws \think\db\exception\DbException
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
*/
|
|
public function tablePrint(int $tableId, int $store_id, int $print_event = -1, int $is_print = 0)
|
|
{
|
|
$table = $this->dao->get($tableId);
|
|
if (!$table || $table['status'] == -1) {
|
|
throw new ValidateException('桌码已取消');
|
|
}
|
|
/** @var UserCollagePartakeServices $partakeService */
|
|
$partakeService = app()->make(UserCollagePartakeServices::class);
|
|
if ($table['oid']) {//下单后
|
|
/** @var StoreOrderCartInfoServices $cartServices */
|
|
$cartServices = app()->make(StoreOrderCartInfoServices::class);
|
|
$product = $cartServices->getCartInfoPrintProduct((int)$table['oid']);
|
|
} else {
|
|
$product = $partakeService->getCartInfoPrintProduct($table->toArray(), $is_print);
|
|
}
|
|
if (!$product) {
|
|
return true;
|
|
}
|
|
$partakeService->update(['collate_code_id' => $tableId, 'is_print' => 0], ['is_print' => 1]);
|
|
/** @var $systemPrinterServices */
|
|
$systemPrinterServices = app()->make(SystemPrinterServices::class);
|
|
$printerList = $systemPrinterServices->getValidPrinter(1, $store_id, $print_event,'id,name,print_num,plat_type');
|
|
if ($printerList) {//存在设置有效打印机
|
|
foreach ($printerList as $print) {
|
|
/** @var ConfigServices $configServices */
|
|
$configServices = app()->make(ConfigServices::class);
|
|
[$switch, $name, $configData] = $configServices->getPrintingConfig(1, $store_id, (int)$print['id'], (int)$print['plat_type']);
|
|
foreach ($configData as $value) {
|
|
if (!$value) {
|
|
throw new ValidateException('请先配置小票打印开发者');
|
|
}
|
|
}
|
|
$name = $configServices->getPrinterType((int)$print['plat_type']);
|
|
$printer = new Printer($name, $configData);
|
|
$configData['print_num'] = $print['print_num'];
|
|
$printer->setPrinterTableContent([
|
|
'name' => sys_config('site_name'),
|
|
'tableInfo' => is_object($table) ? $table->toArray() : $table,
|
|
'product' => $product
|
|
])->startPrinter();
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|