320 lines
14 KiB
PHP
320 lines
14 KiB
PHP
<?php
|
|
|
|
namespace extend\workermans\model;
|
|
|
|
use Exception;
|
|
use ba\Random;
|
|
use support\Redis;
|
|
use support\think\Db;
|
|
use GatewayWorker\Lib\Gateway;
|
|
use support\Log;
|
|
|
|
/**
|
|
* 购物车
|
|
*/
|
|
class Shopping extends Base
|
|
{
|
|
|
|
/**
|
|
* @param string $client_id
|
|
* @param array $message
|
|
* @return void
|
|
*/
|
|
public static function handles(string $client_id, array $message):void
|
|
{
|
|
self::$client_id = $client_id;
|
|
self::$shop_id = $message['shop_id'];
|
|
// 验证 shop_id 和 table_code 是否存在
|
|
$shop = Db::query("
|
|
SELECT * FROM `tb_shop_info` WHERE
|
|
`id`={$message['shop_id']}
|
|
");
|
|
if (!$shop) {
|
|
self::gateway_query('sendToClient', [$client_id, json_encode(['msg' => '商户信息不存在'])]);
|
|
return;
|
|
}
|
|
|
|
if(!empty($message['new_table_code'])) {
|
|
$table_code = $message['new_table_code'];
|
|
}else {
|
|
$table_code = $message['table_code'];
|
|
}
|
|
|
|
// $table = Db::query("
|
|
// SELECT * FROM `tb_shop_table` WHERE
|
|
// `table_code`= '{$table_code}'
|
|
// ");
|
|
// if (!$table) {
|
|
// self::gateway_query('sendToClient', [$client_id, json_encode(['msg' => '桌台信息不存在'])]);
|
|
// return;
|
|
// }
|
|
if(empty($message['table_code'])) {
|
|
$message['table_code'] = 'PRO' . Random::build('numeric');
|
|
}
|
|
// 处理购物车数据
|
|
switch ($message['operate_type']) {
|
|
// 初始化购物车
|
|
case 'init':
|
|
// 商户ID 和桌码ID
|
|
$table_code = self::get_shopping_send_id($message);
|
|
// 绑定桌码和 client_id
|
|
Gateway::bindUid($client_id, $table_code);
|
|
$rand = 'shopping_init' . Random::build();
|
|
$car = Db::query("
|
|
SELECT * FROM `tb_cashier_cart` WHERE
|
|
`shop_id`={$message['shop_id']} AND
|
|
`table_code`='{$message['table_code']}'
|
|
");
|
|
// 限时折扣
|
|
$redis_str = Base::get_shopping_save_uid($message['shop_id'], $message['table_code']) . ':time_discount';
|
|
$time_dis_info = Redis::get($redis_str);
|
|
if($time_dis_info) {
|
|
$time_dis_info = json_decode($time_dis_info, true);
|
|
}else {
|
|
$time_dis_info = null;
|
|
}
|
|
$snd_data = [
|
|
'msg' => '购物车初始化',
|
|
'operate_type' => 'init',
|
|
'msg_id' => $rand,
|
|
'type' => 'shopping',
|
|
'table_code' => $message['table_code'],
|
|
'data' => $car,
|
|
'time_dis_info' => $time_dis_info,
|
|
];
|
|
self::gateway_query('sendToClient', [$client_id, json_encode($snd_data)]);
|
|
break;
|
|
// 新增
|
|
case 'add':
|
|
|
|
if(
|
|
!empty($message['product_id']) &&
|
|
!empty($message['sku_id']) &&
|
|
!empty($message['number'])
|
|
) {
|
|
// 查询购物车是否有重复的商品,有则新增,无则累加 (有赠送品的除外)
|
|
try {
|
|
if(empty($message['goods_type']) || $message['goods_type'] != 'package') {
|
|
$car = Db::query("
|
|
SELECT * FROM `tb_cashier_cart` WHERE
|
|
`shop_id`={$message['shop_id']} AND
|
|
`sku_id`={$message['sku_id']} AND
|
|
`product_id`={$message['product_id']} AND
|
|
`table_code`='{$message['table_code']}'
|
|
");
|
|
}else {
|
|
// 如果是套餐商品,直接新增
|
|
$car[0] = [];
|
|
}
|
|
if(empty($car[0])) {
|
|
if($message['number'] <= 0) {
|
|
self::gateway_query('sendToClient', [$client_id, json_encode(['msg' => '数量不合法'])]);
|
|
return;
|
|
}
|
|
$res = $res_id = self::add_data($message);
|
|
}else {
|
|
$car = $car[0];
|
|
$res_id = $car['id'];
|
|
|
|
// 如果是新增套餐商品,硬新增
|
|
if(!empty($message['pro_group_info'])) {
|
|
$res = $res_id = self::add_data($message);
|
|
}else {
|
|
// 是赠品,新增
|
|
if($car['is_gift'] == 1) {
|
|
// 如果原本的也是赠送的,则修改数量
|
|
if(!empty($message['is_gift']) && $message['is_gift'] == 1) {
|
|
$res = self::savenumber($car, $message);
|
|
}else {
|
|
$res = $res_id = self::add_data($message);
|
|
}
|
|
}else {
|
|
// 如新增的也是赠送的
|
|
if(!empty($message['is_gift']) && $message['is_gift'] == 1) {
|
|
$res = $res_id = self::add_data($message);
|
|
}else {
|
|
$res = self::savenumber($car, $message);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if($res) {
|
|
$status = 1;
|
|
}else {
|
|
$status = 0;
|
|
}
|
|
|
|
$rand = 'shopping_add' . Random::build();
|
|
$data = Db::query("
|
|
SELECT * FROM `tb_cashier_cart` WHERE
|
|
`id`={$res_id}");
|
|
// 向此桌码下面的 client_id 发送消息
|
|
$snd_data = [
|
|
'msg' => '购物车新增',
|
|
'operate_type' => 'add',
|
|
'msg_id' => $rand,
|
|
'type' => 'shopping',
|
|
'status' => $status,
|
|
'data' => $data[0]
|
|
];
|
|
$s_id = self::get_shopping_send_id($message);
|
|
self::gateway_query('sendToUid', [$s_id, json_encode($snd_data)]);
|
|
}catch (Exception $e){
|
|
Log::info('新增购物车时[error]->>>>>' . $e->getMessage());
|
|
}
|
|
}
|
|
break;
|
|
// 修改
|
|
case 'edit':
|
|
if (empty($message['id'])) {
|
|
self::gateway_query('sendToClient', [$client_id, json_encode(['msg' => '购物车ID必传'])]);
|
|
return;
|
|
}
|
|
try {
|
|
$data = Db::query("
|
|
SELECT * FROM `tb_cashier_cart` WHERE
|
|
`id`={$message['id']}");
|
|
if(!$data) {
|
|
self::gateway_query('sendToClient', [$client_id, json_encode(['msg' => '购物车不存在, 请检查购物车ID是否正确'])]);
|
|
return;
|
|
}
|
|
// $message['number'] += $data[0]['number'];
|
|
$message_edit = [
|
|
'number' => $message['number'],
|
|
'id' => $message['id'],
|
|
];
|
|
$res = self::edit_data($message_edit);
|
|
$s_id = self::get_shopping_send_id($message);
|
|
$rand = 'shopping_edit' . Random::build();
|
|
if($res) {
|
|
$status = 1;
|
|
$data = Db::query("
|
|
SELECT * FROM `tb_cashier_cart` WHERE
|
|
`id`={$message['id']}");
|
|
}else {
|
|
$status = 0;
|
|
}
|
|
$snd_data = [
|
|
'msg' => '购物车修改',
|
|
'operate_type' => 'edit',
|
|
'msg_id' => $rand,
|
|
'type' => 'shopping',
|
|
'status' => $status,
|
|
'data' => $data[0]
|
|
];
|
|
self::gateway_query('sendToUid', [$s_id, json_encode($snd_data)]);
|
|
}catch (Exception $e) {
|
|
Log::info('修改购物车时[error]->>>>>' . $e->getMessage());
|
|
}
|
|
break;
|
|
// 删除
|
|
case 'del':
|
|
if (empty($message['id'])) {
|
|
self::gateway_query('sendToClient', [$client_id, json_encode(['msg' => '购物车ID不存在'])]);
|
|
return;
|
|
}
|
|
$data = Db::query("
|
|
SELECT * FROM `tb_cashier_cart` WHERE
|
|
`id`={$message['id']}");
|
|
if (empty($data)) {
|
|
self::gateway_query('sendToClient', [$client_id, json_encode(['msg' => '数据不存在'])]);
|
|
return;
|
|
}
|
|
try {
|
|
$res = Db::table('tb_cashier_cart')->where('id', $message['id'])->delete();
|
|
if($res) {
|
|
$status = 1;
|
|
}else {
|
|
$status = 0;
|
|
}
|
|
$s_id = self::get_shopping_send_id($message);
|
|
$rand = 'shopping_del' . Random::build();
|
|
$snd_data = [
|
|
'msg' => '购物车删除',
|
|
'operate_type' => 'del',
|
|
'msg_id' => $rand,
|
|
'type' => 'shopping',
|
|
'status' => $status,
|
|
'data' => $data[0]
|
|
];
|
|
self::gateway_query('sendToUid', [$s_id, json_encode($snd_data)]);
|
|
}catch (\Exception $e) {
|
|
Log::info('删除购物车时[error]->>>>>' . $e->getMessage());
|
|
}
|
|
break;
|
|
// 清除
|
|
case 'cleanup':
|
|
try {
|
|
$res = Db::table('tb_cashier_cart')->where('table_code', $message['table_code'])->delete();
|
|
if($res) {
|
|
$status = 1;
|
|
}else {
|
|
$status = 0;
|
|
}
|
|
$status = 1;
|
|
$s_id = self::get_shopping_send_id($message);
|
|
$rand = 'shopping_cleanup' . Random::build();
|
|
$snd_data = [
|
|
'msg' => '购物车清除',
|
|
'operate_type' => 'cleanup',
|
|
'msg_id' => $rand,
|
|
'type' => 'shopping',
|
|
'status' => $status,
|
|
'data' => [
|
|
'table_code' => $message['table_code'],
|
|
]
|
|
];
|
|
self::gateway_query('sendToUid', [$s_id, json_encode($snd_data)]);
|
|
}catch (Exception $e) {
|
|
Log::info('删除购物车时[error]->>>>>' . $e->getMessage());
|
|
}
|
|
break;
|
|
// 批量操作(打包与不打包)
|
|
case 'batch':
|
|
try {
|
|
if (!isset($message['is_pack'])) {
|
|
self::gateway_query('sendToClient', [$client_id, json_encode(['msg' => 'is_pack必填'])]);
|
|
return;
|
|
}
|
|
$data = Db::query("
|
|
SELECT * FROM `tb_cashier_cart` WHERE
|
|
`table_code`= '{$message['table_code']}'");
|
|
if(!$data) {
|
|
self::gateway_query('sendToClient', [$client_id, json_encode(['msg' => '桌码不存在'])]);
|
|
return;
|
|
}
|
|
$res = self::batch($message);
|
|
if($res) {
|
|
$status = 1;
|
|
}else {
|
|
$status = 0;
|
|
}
|
|
$rand = 'shopping_batch' . Random::build();
|
|
$snd_data = [
|
|
'msg' => '购物车批量操作',
|
|
'operate_type' => 'batch',
|
|
'msg_id' => $rand,
|
|
'status' => $status,
|
|
'type' => 'shopping',
|
|
'data' => []
|
|
];
|
|
self::gateway_query('sendToClient', [$client_id, json_encode($snd_data)]);
|
|
}catch (Exception $e) {
|
|
Log::info('打包购物车时[error]->>>>>' . $e->getMessage());
|
|
}
|
|
break;
|
|
// 锁单
|
|
case 'pay_lock':
|
|
self::paylock($client_id, $message);
|
|
break;
|
|
// 解锁
|
|
case 'pay_unlock':
|
|
self::payunlock($client_id, $message);
|
|
break;
|
|
// 查询是否锁单
|
|
case 'search_pay_lock':
|
|
self::searchpaylock($client_id, $message);
|
|
break;
|
|
}
|
|
}
|
|
} |