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] = ''; } }