chore(addon/kefu):优化代码

This commit is contained in:
2025-12-11 10:59:42 +08:00
parent c63fce1ce8
commit c8cf3cde16

View File

@@ -20,22 +20,22 @@ class Kefu extends BaseApi
if (!request()->isPost()) { if (!request()->isPost()) {
return $this->response($this->error('请求方式错误仅支持POST请求')); return $this->response($this->error('请求方式错误仅支持POST请求'));
} }
$start_time = microtime(true); $start_time = microtime(true);
// (必选) 获取站点ID和会员ID可以通过事件数据传递 // (必选) 获取站点ID和会员ID可以通过事件数据传递
$site_id = $this->params['uniacid'] ?? $this->site_id; // 使用 uniacid, 方便以后迁移而且uniacid 是唯一的, site_id 不是同时被params给过滤了 $site_id = $this->params['uniacid'] ?? $this->site_id; // 使用 uniacid, 方便以后迁移而且uniacid 是唯一的, site_id 不是同时被params给过滤了
// 检查site_id 如果 < 1, 则返回错误 // 检查site_id 如果 < 1, 则返回错误
if ($site_id < 1) { if ($site_id < 1) {
return $this->response($this->error('缺少关键参数站点ID')); return $this->response($this->error('缺少关键参数站点ID'));
} }
// 验证事件是否存在 // 验证事件是否存在
if (!hasEvent('KefuHealthCheck')) { if (!hasEvent('KefuHealthCheck')) {
return $this->response($this->error('智能客服插件未成功注册事件')); return $this->response($this->error('智能客服插件未成功注册事件'));
} }
// 准备事件数据 // 准备事件数据
$event_data = [ $event_data = [
'check_id' => uniqid('health_', true), 'check_id' => uniqid('health_', true),
@@ -55,7 +55,7 @@ class Kefu extends BaseApi
try { try {
// 触发健康检查事件 // 触发健康检查事件
$result = event('KefuHealthCheck', $event_data, true); $result = event('KefuHealthCheck', $event_data, true);
// 汇总检查结果 // 汇总检查结果
$health_summary = [ $health_summary = [
'status' => 'healthy', 'status' => 'healthy',
@@ -69,13 +69,13 @@ class Kefu extends BaseApi
'warnings' => [], 'warnings' => [],
'errors' => [] 'errors' => []
]; ];
if (is_array($result) && !empty($result)) { if (is_array($result) && !empty($result)) {
foreach ($result as $check_result) { foreach ($result as $check_result) {
if (isset($check_result['component'])) { if (isset($check_result['component'])) {
$health_summary['components'][$check_result['component']] = $check_result; $health_summary['components'][$check_result['component']] = $check_result;
$health_summary['total_checks']++; $health_summary['total_checks']++;
if ($check_result['status'] === 'healthy') { if ($check_result['status'] === 'healthy') {
$health_summary['passed_checks']++; $health_summary['passed_checks']++;
} else { } else {
@@ -93,10 +93,10 @@ class Kefu extends BaseApi
} }
} }
} }
// 计算总体响应时间 // 计算总体响应时间
$health_summary['response_time_ms'] = round((microtime(true) - $start_time) * 1000, 2); $health_summary['response_time_ms'] = round((microtime(true) - $start_time) * 1000, 2);
// 如果没有任何检查结果,进行基础检查 // 如果没有任何检查结果,进行基础检查
if ($health_summary['total_checks'] === 0) { if ($health_summary['total_checks'] === 0) {
$health_summary['components']['basic'] = [ $health_summary['components']['basic'] = [
@@ -112,7 +112,7 @@ class Kefu extends BaseApi
$health_summary['total_checks'] = 1; $health_summary['total_checks'] = 1;
$health_summary['passed_checks'] = 1; $health_summary['passed_checks'] = 1;
} }
// 根据检查结果确定HTTP状态码 // 根据检查结果确定HTTP状态码
$http_code = 200; $http_code = 200;
if ($health_summary['status'] === 'unhealthy') { if ($health_summary['status'] === 'unhealthy') {
@@ -120,13 +120,13 @@ class Kefu extends BaseApi
} elseif ($health_summary['status'] === 'warning') { } elseif ($health_summary['status'] === 'warning') {
$http_code = 200; // Still OK but with warnings $http_code = 200; // Still OK but with warnings
} }
return $this->response([ return $this->response([
'code' => 0, 'code' => 0,
'message' => $health_summary['status'], 'message' => $health_summary['status'],
'data' => $health_summary 'data' => $health_summary
], $http_code); ], $http_code);
} catch (\Exception $e) { } catch (\Exception $e) {
return $this->response([ return $this->response([
'code' => -1, 'code' => -1,
@@ -152,11 +152,11 @@ class Kefu extends BaseApi
if (!request()->isPost()) { if (!request()->isPost()) {
return $this->response($this->error('请求方式错误仅支持POST请求')); return $this->response($this->error('请求方式错误仅支持POST请求'));
} }
// (可选获取站点ID和会员ID可以通过事件数据传递 // (可选获取站点ID和会员ID可以通过事件数据传递
$site_id = $this->params['uniacid'] ?? $this->site_id; $site_id = $this->params['uniacid'] ?? $this->site_id;
$member_id = $this->params['member_id'] ?? $this->member_id; $member_id = $this->params['member_id'] ?? $this->member_id;
$token = $this->params['token'] ?? $this->token; $token = $this->params['token'] ?? $this->token;
// 验证事件是否存在 // 验证事件是否存在
if (!hasEvent('KefuGetInfo')) { if (!hasEvent('KefuGetInfo')) {
@@ -178,14 +178,14 @@ class Kefu extends BaseApi
// 触发获取配置信息事件 // 触发获取配置信息事件
$result = event('KefuGetInfo', $event_data, true); $result = event('KefuGetInfo', $event_data, true);
// 处理事件结果 // 处理事件结果
$response = [ $response = [
'code' => 0, 'code' => 0,
'message' => 'success', 'message' => 'success',
'data' => [] 'data' => []
]; ];
if (is_array($result) && !empty($result)) { if (is_array($result) && !empty($result)) {
foreach ($result as $res) { foreach ($result as $res) {
if (isset($res['code']) && $res['code'] < 0) { if (isset($res['code']) && $res['code'] < 0) {
@@ -210,7 +210,7 @@ class Kefu extends BaseApi
private function getClientIp() private function getClientIp()
{ {
$ip = ''; $ip = '';
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR']; $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_X_REAL_IP']) && !empty($_SERVER['HTTP_X_REAL_IP'])) { } elseif (isset($_SERVER['HTTP_X_REAL_IP']) && !empty($_SERVER['HTTP_X_REAL_IP'])) {
@@ -218,13 +218,13 @@ class Kefu extends BaseApi
} elseif (isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR'])) { } elseif (isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR']; $ip = $_SERVER['REMOTE_ADDR'];
} }
// 处理多个IP的情况X-Forwarded-For可能包含多个IP // 处理多个IP的情况X-Forwarded-For可能包含多个IP
if (strpos($ip, ',') !== false) { if (strpos($ip, ',') !== false) {
$ips = explode(',', $ip); $ips = explode(',', $ip);
$ip = trim($ips[0]); $ip = trim($ips[0]);
} }
return $ip; return $ip;
} }
@@ -237,7 +237,7 @@ class Kefu extends BaseApi
if (!request()->isPost()) { if (!request()->isPost()) {
return $this->response($this->error('请求方式错误仅支持POST请求')); return $this->response($this->error('请求方式错误仅支持POST请求'));
} }
// 获取请求参数 // 获取请求参数
$conversation_id = $this->params['conversation_id'] ?? ''; $conversation_id = $this->params['conversation_id'] ?? '';
$user_id = $this->params['user_id'] ?? $this->member_id; $user_id = $this->params['user_id'] ?? $this->member_id;
@@ -245,7 +245,7 @@ class Kefu extends BaseApi
// (可选获取站点ID和会员ID可以通过事件数据传递 // (可选获取站点ID和会员ID可以通过事件数据传递
$site_id = $this->params['uniacid'] ?? $this->site_id; // 使用 uniacid, 方便以后迁移而且uniacid 是唯一的, site_id 不是同时被params给过滤了 $site_id = $this->params['uniacid'] ?? $this->site_id; // 使用 uniacid, 方便以后迁移而且uniacid 是唯一的, site_id 不是同时被params给过滤了
$member_id = $this->params['member_id'] ?? $this->member_id; $member_id = $this->params['member_id'] ?? $this->member_id;
$token = $this->params['token'] ?? $this->token; $token = $this->params['token'] ?? $this->token;
// 验证参数conversation_id 和 user_id 至少需要一个) // 验证参数conversation_id 和 user_id 至少需要一个)
if (empty($conversation_id) && empty($user_id)) { if (empty($conversation_id) && empty($user_id)) {
@@ -262,21 +262,21 @@ class Kefu extends BaseApi
$event_data = [ $event_data = [
'conversation_id' => $conversation_id, 'conversation_id' => $conversation_id,
'user_id' => $user_id, 'user_id' => $user_id,
'site_id' =>$site_id, 'site_id' => $site_id,
'member_id' => $member_id, 'member_id' => $member_id,
'token' => $token, 'token' => $token,
]; ];
// 触发清除会话事件 // 触发清除会话事件
$result = event('KefuClearConversation', $event_data, true); $result = event('KefuClearConversation', $event_data, true);
// 处理事件结果 // 处理事件结果
$response = [ $response = [
'code' => 0, 'code' => 0,
'message' => 'success', 'message' => 'success',
'data' => [] 'data' => []
]; ];
if (is_array($result) && !empty($result)) { if (is_array($result) && !empty($result)) {
foreach ($result as $res) { foreach ($result as $res) {
if (isset($res['code']) && $res['code'] < 0) { if (isset($res['code']) && $res['code'] < 0) {
@@ -294,7 +294,7 @@ class Kefu extends BaseApi
return $this->response($this->error('请求失败:' . $e->getMessage())); return $this->response($this->error('请求失败:' . $e->getMessage()));
} }
} }
/** /**
* 智能客服聊天接口 * 智能客服聊天接口
* @return \think\response\Json|array|bool|string|void * @return \think\response\Json|array|bool|string|void
@@ -305,11 +305,11 @@ class Kefu extends BaseApi
$isPost = request()->isPost(); $isPost = request()->isPost();
$isGet = request()->isGet(); $isGet = request()->isGet();
$isEventSource = $isGet && request()->header('Accept') === 'text/event-stream'; $isEventSource = $isGet && request()->header('Accept') === 'text/event-stream';
if (!$isPost && !$isEventSource) { if (!$isPost && !$isEventSource) {
return $this->response($this->error('请求方式错误仅支持POST或EventSource请求')); return $this->response($this->error('请求方式错误仅支持POST或EventSource请求'));
} }
// 获取请求参数 // 获取请求参数
// 对于GET请求需要单独获取参数因为BaseApi的构造函数可能没有正确处理GET参数 // 对于GET请求需要单独获取参数因为BaseApi的构造函数可能没有正确处理GET参数
// response_mode 响应模式streaming流式、blocking阻塞默认streaming // response_mode 响应模式streaming流式、blocking阻塞默认streaming
@@ -326,7 +326,7 @@ class Kefu extends BaseApi
$stream = $this->params['stream'] ?? false; $stream = $this->params['stream'] ?? false;
$response_mode = $this->params['response_mode'] ?? 'streaming'; $response_mode = $this->params['response_mode'] ?? 'streaming';
} }
// 确保stream参数正确处理字符串'false'和'0' // 确保stream参数正确处理字符串'false'和'0'
if (is_string($stream)) { if (is_string($stream)) {
$stream = filter_var($stream, FILTER_VALIDATE_BOOLEAN); $stream = filter_var($stream, FILTER_VALIDATE_BOOLEAN);
@@ -335,7 +335,7 @@ class Kefu extends BaseApi
// (可选获取站点ID和会员ID可以通过事件数据传递 // (可选获取站点ID和会员ID可以通过事件数据传递
$site_id = $this->params['uniacid'] ?? $this->site_id; // 使用 uniacid, 方便以后迁移而且uniacid 是唯一的, site_id 不是同时被params给过滤了 $site_id = $this->params['uniacid'] ?? $this->site_id; // 使用 uniacid, 方便以后迁移而且uniacid 是唯一的, site_id 不是同时被params给过滤了
$member_id = $this->params['member_id'] ?? $this->member_id; $member_id = $this->params['member_id'] ?? $this->member_id;
$token = $this->params['token'] ?? $this->token; $token = $this->params['token'] ?? $this->token;
// 验证参数 // 验证参数
if (empty($query)) { if (empty($query)) {
@@ -357,7 +357,7 @@ class Kefu extends BaseApi
'user_id' => $user_id, 'user_id' => $user_id,
'conversation_id' => $conversation_id, 'conversation_id' => $conversation_id,
'stream' => $enable_stream, 'stream' => $enable_stream,
'site_id' =>$site_id, 'site_id' => $site_id,
'member_id' => $member_id, 'member_id' => $member_id,
'token' => $token, 'token' => $token,
]; ];
@@ -368,35 +368,17 @@ class Kefu extends BaseApi
header('Cache-Control: no-cache'); header('Cache-Control: no-cache');
header('Connection: keep-alive'); header('Connection: keep-alive');
header('X-Accel-Buffering: no'); // 禁用Nginx缓冲 header('X-Accel-Buffering: no'); // 禁用Nginx缓冲
// 触发事件,让监听器处理流式响应 // 触发事件,让监听器处理流式响应
event('KefuChat', $event_data); event('KefuChat', $event_data, true);
// 流式响应需要终止脚本执行避免输出额外内容导致EventSource错误 // 流式响应需要终止脚本执行避免输出额外内容导致EventSource错误
exit; exit;
} else { } else {
// 触发智能客服聊天事件(非流式) // 触发智能客服聊天事件(非流式)
$result = event('KefuChat', $event_data); $result = event('KefuChat', $event_data, true);
// 处理事件结果
$response = [
'code' => 0,
'message' => 'success',
'data' => []
];
if (is_array($result) && !empty($result)) {
foreach ($result as $res) {
if (isset($res['code']) && $res['code'] < 0) {
$response = $res;
break;
}
if (isset($res['data'])) {
$response['data'] = array_merge($response['data'], $res['data']);
}
}
}
return $this->response($response); // 处理事件结果
return $this->response($result);
} }
} catch (\Exception $e) { } catch (\Exception $e) {
return $this->response($this->error('请求失败:' . $e->getMessage())); return $this->response($this->error('请求失败:' . $e->getMessage()));
@@ -413,7 +395,7 @@ class Kefu extends BaseApi
if (!request()->isPost()) { if (!request()->isPost()) {
return $this->response($this->error('请求方式错误仅支持POST请求')); return $this->response($this->error('请求方式错误仅支持POST请求'));
} }
// 获取请求参数 // 获取请求参数
$conversation_id = $this->params['conversation_id'] ?? ''; $conversation_id = $this->params['conversation_id'] ?? '';
$user_id = $this->params['user_id'] ?? $this->member_id; $user_id = $this->params['user_id'] ?? $this->member_id;
@@ -423,11 +405,11 @@ class Kefu extends BaseApi
// (可选获取站点ID和会员ID可以通过事件数据传递 // (可选获取站点ID和会员ID可以通过事件数据传递
$site_id = $this->params['uniacid'] ?? $this->site_id; // 使用 uniacid, 方便以后迁移而且uniacid 是唯一的, site_id 不是同时被params给过滤了 $site_id = $this->params['uniacid'] ?? $this->site_id; // 使用 uniacid, 方便以后迁移而且uniacid 是唯一的, site_id 不是同时被params给过滤了
$member_id = $this->params['member_id'] ?? $this->member_id; $member_id = $this->params['member_id'] ?? $this->member_id;
$token = $this->params['token'] ?? $this->token; $token = $this->params['token'] ?? $this->token;
// 验证参数conversation_id 和 user_id 至少需要一个) // 验证参数conversation_id 和 user_id 至少需要一个)
if (empty($conversation_id) && empty($user_id)) { if (empty($conversation_id)) {
return $this->response($this->error('会话ID或用户ID不能为空')); return $this->response($this->error('会话ID不能为空'));
} }
try { try {
@@ -437,34 +419,16 @@ class Kefu extends BaseApi
'user_id' => $user_id, 'user_id' => $user_id,
'limit' => $limit, 'limit' => $limit,
'offset' => $offset, 'offset' => $offset,
'site_id' =>$site_id, 'site_id' => $site_id,
'member_id' => $member_id, 'member_id' => $member_id,
'token' => $token, 'token' => $token,
]; ];
// 触发获取历史消息事件 // 触发获取历史消息事件
$result = event('KefuGetHistory', $event_data, true); $result = event('KefuGetHistory', $event_data, true);
// 处理事件结果
$response = [
'code' => 0,
'message' => 'success',
'data' => []
];
if (is_array($result) && !empty($result)) {
foreach ($result as $res) {
if (isset($res['code']) && $res['code'] < 0) {
$response = $res;
break;
}
if (isset($res['data'])) {
$response['data'] = array_merge($response['data'], $res['data']);
}
}
}
return $this->response($response); // 处理事件结果
return $this->response($result);
} catch (\Exception $e) { } catch (\Exception $e) {
return $this->response($this->error('请求失败:' . $e->getMessage())); return $this->response($this->error('请求失败:' . $e->getMessage()));
} }