381 lines
17 KiB
PHP
381 lines
17 KiB
PHP
<?php
|
||
|
||
namespace plugin\webman\gateway;
|
||
|
||
use ba\Random;
|
||
use extend\workermans\model\Base;
|
||
use GatewayWorker\Lib\Gateway;
|
||
use support\Redis;
|
||
use Workerman\Timer;
|
||
use extend\workermans\model\Cashier;
|
||
use extend\workermans\model\Manage;
|
||
use extend\workermans\model\Onboc;
|
||
use extend\workermans\model\Pad;
|
||
use extend\workermans\model\RedisInit;
|
||
use extend\workermans\model\Shopping;
|
||
use support\think\Db;
|
||
|
||
class Events
|
||
{
|
||
public static function onWorkerStart($worker)
|
||
{
|
||
// $url = 'http://127.0.0.1:8686/?method=sendToUid&account=101¶ms={"data_type":"order","order_id":"2541"}';
|
||
// $url = 'https://sockets.sxczgkj.com/s/account/overview';
|
||
// 开启内部通讯接口。便于内部通讯
|
||
// $http_worker = new Worker('http://127.0.0.1:8686');
|
||
// $http_worker->reusePort = true;
|
||
// $http_worker->onMessage = function (TcpConnection $connection, Request $request) {
|
||
// $method = $request->get('method');
|
||
// $account = $request->get('account');
|
||
// $params = $request->get('params');
|
||
// if (method_exists(Gateway::class, $method)) {
|
||
// call_user_func_array([Gateway::class, $method], [$account, $params]);
|
||
// Log::info('打印8686收到消息-->' . $params);
|
||
// $params_arr = json_decode($params, true);
|
||
// // 如果是订单打印并且通过uid推送, 保存redis
|
||
// if($params_arr['operate_type'] == 'order_print' && $method == 'sendToUid') {
|
||
// $result = Redis::get($params_arr['send_id']);
|
||
// if($result) {
|
||
// $msg_id_arr = json_decode($result, true);
|
||
// $msg_id_arr_c = count($msg_id_arr);
|
||
// $msg_id_arr[$msg_id_arr_c] = $params_arr;
|
||
// $result_n = json_encode($msg_id_arr);
|
||
// Base::setredis_new($result_n, $params_arr['send_id']);
|
||
// }else {
|
||
// $params_arr_n[] = $params_arr;
|
||
// print_r('数组-------->' . json_encode($params_arr_n)) . "\r\n";
|
||
// Base::setredis_new(json_encode($params_arr_n), $params_arr['send_id']);
|
||
// }
|
||
// }
|
||
//
|
||
// return $connection->send('ok');
|
||
// }
|
||
// return $connection->send('fail');
|
||
// };
|
||
// $http_worker->listen();
|
||
if($worker->id == 1) {
|
||
print_r('定时器');
|
||
// 启动定时器 定时器处理消息回执/在线列表
|
||
$_SESSION['auth_timer_id'] = Timer::add(10, function (){
|
||
Base::geteventredis_new();
|
||
});
|
||
}
|
||
}
|
||
|
||
public static function onConnect($client_id)
|
||
{
|
||
print_r('连接--我是' . $client_id . "\r\n");
|
||
Base::add_log_file('当前在线连接总数:' . Gateway::getAllClientCount());
|
||
Base::add_total_number($client_id, null, 'total');
|
||
}
|
||
|
||
public static function onWebSocketConnect($client_id, $data)
|
||
{
|
||
|
||
}
|
||
|
||
public static function onMessage($client_id, $message)
|
||
{
|
||
$m = $message;
|
||
$message = json_decode($message, true);
|
||
if(empty($message['type'])) {
|
||
Gateway::sendToClient($client_id, json_encode(['msg' => '收到了']));
|
||
return;
|
||
}
|
||
if($message['type'] == 'ping_interval') {
|
||
// 记录心跳
|
||
if(!empty($message['set'])) {
|
||
switch ($message['set']) {
|
||
case 'onboc':
|
||
Base::add_log_file($m, 'onboc', true);
|
||
break;
|
||
case 'manage':
|
||
Base::add_log_file($m, 'manage', true);
|
||
break;
|
||
case 'shopping':
|
||
Base::add_log_file($m, 'shopping', true);
|
||
break;
|
||
case 'cashier':
|
||
Base::add_log_file($m, 'cashier', true);
|
||
break;
|
||
case 'pad':
|
||
Base::add_log_file($m, 'pad', true);
|
||
break;
|
||
default:
|
||
Base::add_log_file($m, 'other', true);
|
||
}
|
||
}
|
||
Gateway::sendToClient($client_id, json_encode(['msg' => 'ok', 'msg_id' => 'ping_interval']));
|
||
return;
|
||
}
|
||
$type = $message['type'];
|
||
if(!empty($message['is_temporary']) && (empty($message['product_name']))) {
|
||
Gateway::sendToClient($client_id, json_encode(['msg' => '临时菜请添加菜名']));
|
||
return;
|
||
}
|
||
|
||
if(!empty($message['operate_type'])) {
|
||
|
||
// 限时折扣修改
|
||
if($message['operate_type'] == 'time_discount_save') {
|
||
// 桌码
|
||
if(empty($message['table_code']) || empty($message['shop_id'])) {
|
||
Gateway::sendToClient($client_id, json_encode(['msg' => '桌码或shop_id不能为空']));
|
||
return;
|
||
}
|
||
$redis_str = Base::get_shopping_save_uid($message['shop_id'], $message['table_code']) . ':time_discount';
|
||
if(empty($message['data'])) {
|
||
$res = Redis::del($redis_str);
|
||
}else {
|
||
$res = Redis::set($redis_str, json_encode($message['data']));
|
||
// 将桌号存入redis 以便及时删除
|
||
$time_discount_info = Redis::get('time_discount:info');
|
||
if($time_discount_info) {
|
||
$arr_time_discount_info = explode(',', $time_discount_info);
|
||
if(!in_array($redis_str, $arr_time_discount_info)) {
|
||
$time_discount_info = array_merge($arr_time_discount_info, [$redis_str]);
|
||
Redis::set('time_discount:info', implode(',', $time_discount_info));
|
||
}
|
||
}else {
|
||
Redis::set('time_discount:info', $redis_str);
|
||
}
|
||
}
|
||
$snd_data = [
|
||
'msg' => '折扣修改',
|
||
'operate_type' => $message['operate_type'],
|
||
'msg_id' => '',
|
||
'type' => 'time_discount',
|
||
'status' => $res,
|
||
'data' => $message['data'],
|
||
];
|
||
Gateway::sendToClient($client_id, json_encode($snd_data));
|
||
return;
|
||
}elseif ($message['operate_type'] == 'time_discount_get') {
|
||
// 桌码
|
||
if(empty($message['table_code']) || empty($message['shop_id'])) {
|
||
Gateway::sendToClient($client_id, json_encode(['msg' => '桌码或shop_id不能为空']));
|
||
return;
|
||
}
|
||
$redis_str = Base::get_shopping_save_uid($message['shop_id'], $message['table_code']) . ':time_discount';
|
||
// 限时折扣获取
|
||
$snd_data = [
|
||
'msg' => '折扣获取',
|
||
'operate_type' => $message['operate_type'],
|
||
'msg_id' => '',
|
||
'type' => 'time_discount',
|
||
'status' => 1,
|
||
'data' => Redis::get($redis_str),
|
||
];
|
||
Gateway::sendToClient($client_id, json_encode($snd_data));
|
||
return;
|
||
}
|
||
}
|
||
|
||
// 只在初始化的时候绑定
|
||
if(!empty($message['operate_type']) && $message['operate_type'] == 'init') {
|
||
// 添加在线客户端数量
|
||
Base::add_total_number($client_id, $type);
|
||
if(!empty($message['shop_id'])) {
|
||
if(!empty($message['table_code'])) {
|
||
// 绑定shopid和table_code 便于推送多端购物车同步 和 锁单
|
||
$group = Base::get_shopping_save_uid($message['shop_id'], $message['table_code']);
|
||
if(!empty($_SESSION[$client_id])) {
|
||
// 绑定之前,必须先删除此client_id下的其他分组
|
||
Gateway::leaveGroup($client_id, $_SESSION[$client_id]);
|
||
}
|
||
Gateway::joinGroup($client_id, $group);
|
||
$_SESSION[$client_id] = $group;
|
||
}
|
||
// 绑定shopid推送商品更新信息
|
||
Gateway::joinGroup($client_id, 'product_update' . $message['shop_id']);
|
||
}
|
||
}
|
||
if(!empty($message['operate_type']) && in_array($message['operate_type'], ['add', 'cleanup', 'batch', 'pay_lock', 'search_pay_lock', 'pay_unlock']) && empty($message['table_code'])) {
|
||
Gateway::sendToClient($client_id, json_encode(['msg' => 'table_code必传']));
|
||
return;
|
||
}
|
||
|
||
// 清空历史订单
|
||
if(!empty($message['operate_type']) && $message['operate_type'] == 'clearOrder') {
|
||
$status = 1;
|
||
$s_id = base::get_shopping_send_id($message);
|
||
$rand = 'clearOrder' . Random::build();
|
||
$snd_data = [
|
||
'msg' => '历史订单清除',
|
||
'operate_type' => 'clearOrder',
|
||
'msg_id' => $rand,
|
||
'type' => 'clearOrder',
|
||
'status' => $status,
|
||
'data' => [
|
||
'table_code' => $message['table_code'],
|
||
]
|
||
];
|
||
base::$shop_id = $message['shop_id'];
|
||
base::$client_id = $client_id;
|
||
base::gateway_query('sendToUid', [$s_id, json_encode($snd_data)]);
|
||
return;
|
||
}
|
||
// 如果是新增或者编辑,查询库存够不够
|
||
if ((!empty($message['operate_type']) && ($message['operate_type'] == 'add' || $message['operate_type'] == 'edit')) && (!empty($message['product_id']) && !empty($message['shop_id']) && !empty($message['number']))) {
|
||
$gate_way = GateWay::class;
|
||
$number = $message['number'];
|
||
try {
|
||
Redis::select(3);
|
||
$red_number = Redis::get('shop:' . $message['shop_id'] . ':product-stock:' . $message['product_id']);
|
||
}catch (\Exception $e) {
|
||
print_r( "Redis 错误: " . $e->getMessage() . "\r\n");
|
||
}
|
||
print_r('库存数量-->' . $red_number . "\r\n" . date('Y-m-d H:i:s'));
|
||
if(is_numeric($red_number)) {
|
||
// 起售数量和库存之间的处理
|
||
if(!empty($message['suitNum']) && $message['suitNum'] > 1) {
|
||
if($red_number < $message['suitNum']) {
|
||
$snd_data = [
|
||
'msg' => '此商品库存不足起售数量',
|
||
'operate_type' => $message['operate_type'],
|
||
'msg_id' => 'no_suit_num' . Random::build(),
|
||
'type' => 'no_suit_num',
|
||
'data_type' => 'cart',
|
||
'id' => $message['id'],
|
||
'product_id' => $message['product_id'],
|
||
'status' => 0,
|
||
'data' => []
|
||
];
|
||
print_r('此商品库存不足起售数量' . "\r\n" . date('Y-m-d H:i:s'));
|
||
$gate_way::sendToClient($client_id, json_encode($snd_data));
|
||
return;
|
||
}
|
||
}
|
||
$data = [];
|
||
// 如果是编辑,拿到已有数量
|
||
if($message['operate_type'] == 'edit' && !empty($message['id'])) {
|
||
$data = Db::query("
|
||
SELECT * FROM `tb_cashier_cart` WHERE
|
||
`id`={$message['id']}");
|
||
if($data) {
|
||
// 如果编辑数量 小于已有数量并且大于库存数量 直接改成库存数量
|
||
if($number < $data[0]['number'] && $number > $red_number) {
|
||
$number = $red_number;
|
||
$message['number'] = $red_number;
|
||
}
|
||
}
|
||
}
|
||
$d_data = false;
|
||
$product = Db::query("
|
||
SELECT * FROM `tb_product` WHERE
|
||
`id`={$message['product_id']}");
|
||
// 如果是套餐商品, 拿到商品总数量
|
||
if(!empty($message['goods_type']) && $message['goods_type'] == 'package') {
|
||
if($product) {
|
||
if($product[0]['group_type'] == 1) {
|
||
$d_data = true;
|
||
}
|
||
}
|
||
}
|
||
if($product) {
|
||
if($product[0]['type'] == 'sku') {
|
||
if($data) {
|
||
if($message['number'] > $data[0]['number']) {
|
||
$d_data = true;
|
||
}
|
||
}
|
||
if(!empty($message['operate_type']) && $message['operate_type'] == 'add') {
|
||
$d_data = true;
|
||
}
|
||
}
|
||
}
|
||
if($d_data) {
|
||
$data_number = Db::query("
|
||
SELECT SUM(number) number FROM `tb_cashier_cart` WHERE
|
||
`shop_id`={$message['shop_id']} AND
|
||
`product_id`={$message['product_id']} AND
|
||
`table_code`='{$message['table_code']}'
|
||
");
|
||
if($data_number) {
|
||
print_r('已有数量' . $data_number[0]['number'] . "\r\n" . date('Y-m-d H:i:s'));
|
||
$number += $data_number[0]['number'];
|
||
if($data && $number > $data[0]['number']) {
|
||
$number -= $data[0]['number'];
|
||
}
|
||
}
|
||
}
|
||
print_r('实际数量' . $number . "\r\n" . date('Y-m-d H:i:s'));
|
||
if($red_number < $number) {
|
||
$snd_data = [
|
||
'msg' => '此商品库存不足',
|
||
'operate_type' => $message['operate_type'],
|
||
'msg_id' => 'out_of_stock' . Random::build(),
|
||
'type' => 'out_of_stock',
|
||
'id' => !empty($message['id'])?$message['id']:'',
|
||
'data_type' => 'cart',
|
||
'status' => 0,
|
||
'data' => []
|
||
];
|
||
$gate_way::sendToClient($client_id, json_encode($snd_data));
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
if(!empty($type)) {
|
||
switch ($type) {
|
||
// 收银机
|
||
case 'cashier':
|
||
Base::add_log_file($m, 'cashier');
|
||
// 商户账号(ID)
|
||
if(!empty($message['account']) && !empty($message['shop_id']) && $message['operate_type']){
|
||
Cashier::handles($client_id, $message);
|
||
}
|
||
break;
|
||
// pad
|
||
case 'pad':
|
||
Base::add_log_file($m, 'pad');
|
||
// 商户账号(ID)
|
||
if(!empty($message['account']) && !empty($message['shop_id']) && $message['operate_type']){
|
||
Pad::handles($client_id, $message);
|
||
}
|
||
break;
|
||
// 购物车
|
||
case 'shopping':
|
||
Base::add_log_file($m, 'shopping');
|
||
// 桌码ID 和 商户ID 必须同时存在
|
||
if(!empty($message['shop_id']) && $message['operate_type']) {
|
||
Shopping::handles($client_id, $message);
|
||
}
|
||
break;
|
||
// 管理端小程序代客下单
|
||
case 'onboc':
|
||
Base::add_log_file($m, 'onboc');
|
||
// 商户账号(ID)
|
||
if(!empty($message['account']) && !empty($message['shop_id']) && $message['operate_type']){
|
||
Onboc::handles($client_id, $message);
|
||
}
|
||
break;
|
||
// PC管理端代客下单
|
||
case 'manage':
|
||
Base::add_log_file($m, 'manage');
|
||
// 商户账号(ID)
|
||
if(!empty($message['account']) && !empty($message['shop_id']) && $message['operate_type']){
|
||
Manage::handles($client_id, $message);
|
||
}
|
||
break;
|
||
// 消息回执
|
||
case 'receipt':
|
||
if(!empty($message['msg_id']) && $message['msg_id'] != 'ping_interval') {
|
||
Base::delredis_new($client_id, $message['msg_id']);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
public static function onClose($client_id)
|
||
{
|
||
// print_r('session----' . json_encode($_SESSION, JSON_UNESCAPED_UNICODE) , "\r\n");
|
||
// Timer::del($_SESSION['auth_timer_id']);
|
||
Base::add_log_file('关闭-当前在线连接总数:' . Gateway::getAllClientCount());
|
||
Base::add_total_number($client_id);
|
||
$_SESSION[$client_id] = '';
|
||
}
|
||
|
||
}
|