440 lines
20 KiB
PHP
440 lines
20 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':
|
|
$rand = 'shopping_init' . Random::build();
|
|
// 商户ID 和桌码ID
|
|
$table_code = self::get_shopping_send_id($message);
|
|
// 绑定桌码和 client_id
|
|
Gateway::bindUid($client_id, $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 {
|
|
if(!empty($message['time_dis_info'])) {
|
|
$time_dis_info = !is_array($message['time_dis_info'])?json_decode($message['time_dis_info'], true):$message['time_dis_info'];
|
|
}else {
|
|
$time_dis_info = null;
|
|
}
|
|
}
|
|
if(!empty($message['one_more_order'])) {
|
|
// 再来一单
|
|
if(empty($message['order_id']) || empty($message['user_id'])) {
|
|
Gateway::sendToClient($client_id, json_encode(['msg' => 'order_id 或 user_id 必传']));
|
|
return;
|
|
}
|
|
// 新增再来一单时先删除之前的数据
|
|
Db::name('tb_cashier_cart')->where([
|
|
'shop_id' => $message['shop_id'],
|
|
'user_id' => $message['user_id'],
|
|
])->delete();
|
|
$order_arr = Db::name('tb_order_detail')->where(['order_id' => $message['order_id']])->select()->toArray();
|
|
foreach ($order_arr as $k => $order) {
|
|
self::add_data([
|
|
'shop_id' => $message['shop_id'],
|
|
'sku_id' => $order['sku_id'],
|
|
'product_id' => $order['product_id'],
|
|
'number' => $order['num'],
|
|
'table_code' => $message['table_code'],
|
|
'product_name' => $order['product_name'],
|
|
'sku_name' => $order['sku_name'],
|
|
'product_type' => $order['product_type'],
|
|
'is_print' => $order['is_print'],
|
|
'user_id' => $message['user_id'],
|
|
'create_time' => d(),
|
|
]);
|
|
}
|
|
}
|
|
$car = Db::query("
|
|
SELECT * FROM `tb_cashier_cart` WHERE
|
|
`shop_id`={$message['shop_id']} AND
|
|
`table_code`='{$message['table_code']}'
|
|
");
|
|
$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'],
|
|
];
|
|
if(!empty($message['remark'])) {
|
|
$message_edit['remark'] = $message['remark'];
|
|
}
|
|
$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 'rottable':
|
|
if (empty($message['table_code']) || empty($message['new_table_code'])) {
|
|
self::gateway_query('sendToClient', [$client_id, json_encode(['msg' => '桌码或新桌码必填'])]);
|
|
return;
|
|
}
|
|
try {
|
|
$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;
|
|
}
|
|
|
|
// 查看目标桌有没有商品,有的话返回提示
|
|
// 参数第一次出发 is_hb 1 第一次触发 id_hb 2 第二次触发
|
|
if(!empty($message['is_hb'])) {
|
|
// 第一次触发
|
|
if($message['is_hb'] == 1) {
|
|
$y_product = Db::name('tb_cashier_cart')->where(['table_code' => $message['new_table_code'], 'shop_id' => $message['shop_id']])->find();
|
|
if($y_product) {
|
|
// 有商品,返回提示合并还是舍弃
|
|
Gateway::sendToClient($client_id, json_encode([
|
|
'msg' => '目标台桌存在其他商品,请选择合并还是舍弃',
|
|
'status' => 0,
|
|
'operate_type' => 'rottable_error',
|
|
'type' => 'shopping'
|
|
]));
|
|
return;
|
|
}
|
|
}elseif($message['is_hb'] == 2) {
|
|
// 第二次触发 现选择的是合并还是舍弃
|
|
if(!empty($message['give_up'])) {
|
|
// 如果是舍弃,直接删掉
|
|
Db::name('tb_cashier_cart')->where(['table_code' => $message['new_table_code'], 'shop_id' => $message['shop_id']])->delete();
|
|
}
|
|
}
|
|
}
|
|
$res = self::rottable($message);
|
|
if($res) {
|
|
$status = 1;
|
|
}else {
|
|
$status = 0;
|
|
}
|
|
$rand = 'shopping_edit' . Random::build();
|
|
$snd_data = [
|
|
'msg' => '购物车转桌',
|
|
'operate_type' => 'rottable',
|
|
'msg_id' => $rand,
|
|
'status' => $status,
|
|
'type' => 'shopping',
|
|
'data' => [
|
|
'table_code' => $message['table_code'],
|
|
'new_table_code' => $message['new_table_code'],
|
|
]
|
|
];
|
|
self::gateway_query('sendToClient', [$client_id, json_encode($snd_data)]);
|
|
}catch (\ba\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;
|
|
// 批量修改(历史订单与购物车)
|
|
case 'bulk_edit':
|
|
try {
|
|
if(empty($message['data']['history']) && empty($message['data']['cart'])) {
|
|
self::gateway_query('sendToClient', [$client_id, json_encode(['msg' => '数据结构错误'])]);
|
|
return;
|
|
}
|
|
$res = self::bulk_edit_data($message);
|
|
$rand = 'cashier_edit' . Random::build();
|
|
$snd_data = [
|
|
'msg' => '购物车修改',
|
|
'type' => 'shopping',
|
|
'status' => $res['status'],
|
|
'operate_type' => 'bulk_edit',
|
|
'data_type' => $res['data_type'],
|
|
'msg_id' => $rand,
|
|
'data' => []
|
|
];
|
|
self::gateway_query('sendToClient', [$client_id, json_encode($snd_data)]);
|
|
}catch (\ba\Exception $e) {
|
|
Log::info('修改购物车时[error]->>>>>' . $e->getMessage());
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
} |