p_ysk/extend/workermans/model/Shopping.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;
}
}
}