p_ysk/plugin/webman/gateway/Events.php

375 lines
17 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace plugin\webman\gateway;
use ba\Random;
use extend\workermans\model\Base;
use GatewayWorker\Lib\Gateway;
use support\Redis;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Timer;
use Workerman\Worker;
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;
class Events
{
public static $redis = null;
public static $db = null;
public static function onWorkerStart($worker)
{
// $url = 'http://127.0.0.1:8686/?method=sendToUid&account=101&params={"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]);
$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(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($message['operate_type'] == 'time_discount_save') {
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) {
$time_discount_info .= $redis_str . ',';
Redis::set('time_discount:info', $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') {
// 限时折扣获取
$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 = Base::$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 = Base::$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 = Base::$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] = '';
}
}