deploy: auto commit repo-root changes 2026-07-05 12:33:57
This commit is contained in:
@@ -2,77 +2,34 @@
|
||||
|
||||
namespace app\api\controller;
|
||||
|
||||
use app\common\service\ai\AiService;
|
||||
use app\common\model\match\MatchEvent;
|
||||
use app\common\model\match\MatchHistory;
|
||||
use app\common\model\match\MatchRecent;
|
||||
use app\common\model\article\Article;
|
||||
use app\common\enum\YesNoEnum;
|
||||
use app\common\model\ai\AiUnlock;
|
||||
use app\common\service\ai\AiAnalysisRequestService;
|
||||
|
||||
class AiController extends BaseApiController
|
||||
{
|
||||
public array $notNeedLogin = ['matchPredict', 'articleAnalysis'];
|
||||
public array $notNeedLogin = [];
|
||||
|
||||
/**
|
||||
* AI分析统一入口
|
||||
*/
|
||||
public function analyze()
|
||||
{
|
||||
$type = $this->request->get('type/s', '');
|
||||
$params = $this->request->get();
|
||||
$result = AiAnalysisRequestService::analyze($type, $params, $this->userId);
|
||||
return $this->respondAnalysis($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 赛事AI预测
|
||||
*/
|
||||
public function matchPredict()
|
||||
{
|
||||
$matchId = $this->request->get('match_id/d');
|
||||
if (empty($matchId)) {
|
||||
return $this->fail('参数缺失');
|
||||
}
|
||||
|
||||
$cacheKey = 'ai_match_predict_' . $matchId;
|
||||
$cached = cache($cacheKey);
|
||||
if ($cached) {
|
||||
$cached['from_cache'] = true;
|
||||
return $this->data($cached);
|
||||
}
|
||||
|
||||
$match = MatchEvent::where('id', $matchId)->where('is_show', 1)->findOrEmpty();
|
||||
if ($match->isEmpty()) {
|
||||
return $this->fail('赛事不存在');
|
||||
}
|
||||
$data = $match->toArray();
|
||||
|
||||
$homeTeam = $data['home_team'];
|
||||
$awayTeam = $data['away_team'];
|
||||
|
||||
// 组装分析数据
|
||||
$matchData = [
|
||||
'match_info' => [
|
||||
'home_team' => $homeTeam,
|
||||
'away_team' => $awayTeam,
|
||||
'league' => $data['league_name'] ?? '',
|
||||
'match_time' => date('Y-m-d H:i', $data['match_time'] ?? time()),
|
||||
'status' => $data['status'] ?? 0,
|
||||
],
|
||||
'head_to_head' => MatchHistory::where(function ($query) use ($homeTeam, $awayTeam) {
|
||||
$query->where([['home_team', '=', $homeTeam], ['away_team', '=', $awayTeam]])
|
||||
->whereOr([['home_team', '=', $awayTeam], ['away_team', '=', $homeTeam]]);
|
||||
})->order('match_time desc')->limit(5)->select()->toArray(),
|
||||
'home_recent' => MatchRecent::where('team_name', $homeTeam)
|
||||
->order('match_time desc')->limit(5)->select()->toArray(),
|
||||
'away_recent' => MatchRecent::where('team_name', $awayTeam)
|
||||
->order('match_time desc')->limit(5)->select()->toArray(),
|
||||
];
|
||||
|
||||
$result = AiService::predictMatch($matchId, $matchData, $this->userId);
|
||||
if (!$result['success']) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败');
|
||||
}
|
||||
|
||||
$responseData = [
|
||||
'analysis' => $result['data'],
|
||||
'from_cache' => false,
|
||||
'match_info' => $matchData['match_info'],
|
||||
];
|
||||
|
||||
cache($cacheKey, $responseData, 6 * 3600);
|
||||
|
||||
return $this->data($responseData);
|
||||
$result = AiAnalysisRequestService::analyzeMatchFull(
|
||||
$this->request->get('match_id/d'),
|
||||
$this->userId
|
||||
);
|
||||
return $this->respondAnalysis($result);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -80,73 +37,12 @@ class AiController extends BaseApiController
|
||||
*/
|
||||
public function matchPredictSection()
|
||||
{
|
||||
$matchId = $this->request->get('match_id/d');
|
||||
$section = $this->request->get('section/s', '');
|
||||
if (empty($matchId) || empty($section)) {
|
||||
return $this->fail('参数缺失');
|
||||
}
|
||||
|
||||
if (!$this->userId) {
|
||||
return $this->fail('请先登录', [], 0, 401);
|
||||
}
|
||||
|
||||
// 解锁检查:只有本人解锁过的才免费,其他人的缓存不算
|
||||
$isUnlocked = AiUnlock::isUnlocked($this->userId, $matchId);
|
||||
if (!$isUnlocked) {
|
||||
if ($section === 'prediction') {
|
||||
$unlockResult = AiUnlock::unlock($this->userId, $matchId);
|
||||
if (!$unlockResult['ok']) {
|
||||
return $this->fail($unlockResult['msg']);
|
||||
}
|
||||
} else {
|
||||
return $this->fail('请先解锁该赛事分析');
|
||||
}
|
||||
}
|
||||
|
||||
$match = MatchEvent::where('id', $matchId)->where('is_show', 1)->findOrEmpty();
|
||||
if ($match->isEmpty()) {
|
||||
return $this->fail('赛事不存在');
|
||||
}
|
||||
$data = $match->toArray();
|
||||
|
||||
$homeTeam = $data['home_team'];
|
||||
$awayTeam = $data['away_team'];
|
||||
|
||||
$matchData = [
|
||||
'match_info' => [
|
||||
'home_team' => $homeTeam,
|
||||
'away_team' => $awayTeam,
|
||||
'league' => $data['league_name'] ?? '',
|
||||
'match_time' => date('Y-m-d H:i', $data['match_time'] ?? time()),
|
||||
'status' => $data['status'] ?? 0,
|
||||
'home_score' => $data['home_score'] ?? 0,
|
||||
'away_score' => $data['away_score'] ?? 0,
|
||||
'home_odds' => $data['home_odds'] ?? 0,
|
||||
'draw_odds' => $data['draw_odds'] ?? 0,
|
||||
'away_odds' => $data['away_odds'] ?? 0,
|
||||
],
|
||||
'head_to_head' => MatchHistory::where(function ($query) use ($homeTeam, $awayTeam) {
|
||||
$query->where([['home_team', '=', $homeTeam], ['away_team', '=', $awayTeam]])
|
||||
->whereOr([['home_team', '=', $awayTeam], ['away_team', '=', $homeTeam]]);
|
||||
})->order('match_time desc')->limit(5)->select()->toArray(),
|
||||
'home_recent' => MatchRecent::where('team_name', $homeTeam)
|
||||
->order('match_time desc')->limit(5)->select()->toArray(),
|
||||
'away_recent' => MatchRecent::where('team_name', $awayTeam)
|
||||
->order('match_time desc')->limit(5)->select()->toArray(),
|
||||
];
|
||||
|
||||
$result = AiService::predictMatchSection($matchId, $section, $matchData, $this->userId);
|
||||
if (!$result['success']) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败');
|
||||
}
|
||||
|
||||
return $this->data([
|
||||
'section' => $section,
|
||||
'data' => $result['data'],
|
||||
'from_cache' => $result['from_cache'] ?? false,
|
||||
'match_info' => $matchData['match_info'],
|
||||
'remain_count' => AiUnlock::getRemainCount($this->userId),
|
||||
]);
|
||||
$result = AiAnalysisRequestService::analyzeMatchSection(
|
||||
$this->request->get('match_id/d'),
|
||||
$this->request->get('section/s', ''),
|
||||
$this->userId
|
||||
);
|
||||
return $this->respondAnalysis($result);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -154,25 +50,11 @@ class AiController extends BaseApiController
|
||||
*/
|
||||
public function articleAnalysis()
|
||||
{
|
||||
$articleId = $this->request->get('article_id/d');
|
||||
if (empty($articleId)) {
|
||||
return $this->fail('参数缺失');
|
||||
}
|
||||
|
||||
$article = Article::where(['id' => $articleId, 'is_show' => YesNoEnum::YES])->findOrEmpty();
|
||||
if ($article->isEmpty()) {
|
||||
return $this->fail('文章不存在');
|
||||
}
|
||||
|
||||
$articleData = $article->toArray();
|
||||
$result = AiService::analyzeArticle($articleId, $articleData, $this->userId);
|
||||
if (!$result['success']) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败');
|
||||
}
|
||||
return $this->data([
|
||||
'analysis' => $result['data'],
|
||||
'from_cache' => $result['from_cache'] ?? false,
|
||||
]);
|
||||
$result = AiAnalysisRequestService::analyzeArticle(
|
||||
$this->request->get('article_id/d'),
|
||||
$this->userId
|
||||
);
|
||||
return $this->respondAnalysis($result);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -180,28 +62,11 @@ class AiController extends BaseApiController
|
||||
*/
|
||||
public function userCredibility()
|
||||
{
|
||||
$targetUserId = $this->request->get('user_id/d');
|
||||
if (empty($targetUserId)) {
|
||||
return $this->fail('参数缺失');
|
||||
}
|
||||
|
||||
// 组装用户数据(简化版,后续可扩展)
|
||||
$userData = [
|
||||
'user_id' => $targetUserId,
|
||||
'register_days' => 30,
|
||||
'post_count' => 0,
|
||||
'comment_count' => 0,
|
||||
'like_received' => 0,
|
||||
];
|
||||
|
||||
$result = AiService::analyzeCredibility($targetUserId, $userData, $this->userId);
|
||||
if (!$result['success']) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败');
|
||||
}
|
||||
return $this->data([
|
||||
'analysis' => $result['data'],
|
||||
'from_cache' => $result['from_cache'] ?? false,
|
||||
]);
|
||||
$result = AiAnalysisRequestService::analyzeUserCredibility(
|
||||
$this->request->get('user_id/d'),
|
||||
$this->userId
|
||||
);
|
||||
return $this->respondAnalysis($result);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -209,23 +74,12 @@ class AiController extends BaseApiController
|
||||
*/
|
||||
public function lotteryAnalysis()
|
||||
{
|
||||
$type = $this->request->get('type', 'ssq');
|
||||
|
||||
// 简化版彩票数据
|
||||
$lotteryData = [
|
||||
'lottery_type' => $type,
|
||||
'recent_draws' => [],
|
||||
'description' => $type === 'ssq' ? '双色球' : '大乐透',
|
||||
];
|
||||
|
||||
$result = AiService::analyzeLottery($lotteryData, $this->userId);
|
||||
if (!$result['success']) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败');
|
||||
$params = $this->request->get();
|
||||
if (empty($params['code']) && !empty($params['type'])) {
|
||||
$params['code'] = $params['type'];
|
||||
}
|
||||
return $this->data([
|
||||
'analysis' => $result['data'],
|
||||
'from_cache' => $result['from_cache'] ?? false,
|
||||
]);
|
||||
$result = AiAnalysisRequestService::analyze('lottery', $params, $this->userId);
|
||||
return $this->respondAnalysis($result);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -244,4 +98,16 @@ class AiController extends BaseApiController
|
||||
'remain_count' => $remain,
|
||||
]);
|
||||
}
|
||||
|
||||
private function respondAnalysis(array $result)
|
||||
{
|
||||
if (empty($result['success'])) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败', [
|
||||
'remain_count' => $result['remain_count'] ?? null,
|
||||
]);
|
||||
}
|
||||
|
||||
unset($result['success'], $result['error'], $result['code']);
|
||||
return $this->data($result);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ use app\common\model\user\User;
|
||||
use app\common\model\ai\AiAnalysis;
|
||||
use app\common\enum\user\AccountLogEnum;
|
||||
use app\common\logic\AccountLogLogic;
|
||||
use app\common\service\ai\AiAnalysisRequestService;
|
||||
use app\common\service\ai\AiService;
|
||||
use app\common\service\ai\KbSyncService;
|
||||
use app\common\service\chat\PrivateChatService;
|
||||
@@ -585,56 +586,20 @@ class CommunityController extends BaseApiController
|
||||
|
||||
public function aiAnalysis()
|
||||
{
|
||||
try {
|
||||
$postId = $this->request->get('post_id/d', 0);
|
||||
if ($postId <= 0) {
|
||||
return $this->fail('参数缺失');
|
||||
}
|
||||
$result = AiAnalysisRequestService::analyzePost(
|
||||
$this->request->get('post_id/d', 0),
|
||||
$this->userId,
|
||||
$this->request->get('force/d', 0) === 1
|
||||
);
|
||||
|
||||
$post = CommunityPost::where('id', $postId)->where('status', 1)->findOrEmpty();
|
||||
if ($post->isEmpty()) {
|
||||
return $this->fail('帖子不存在');
|
||||
}
|
||||
|
||||
$data = $post->toArray();
|
||||
$ext = is_array($data['ext'] ?? null) ? $data['ext'] : (json_decode((string) ($data['ext'] ?? ''), true) ?: []);
|
||||
$tags = $this->getPostTags($postId);
|
||||
$isTrumpPost = $this->isTrumpPost($tags);
|
||||
$isLiuhePost = $this->isLiuhePost($tags, $ext);
|
||||
if ($isTrumpPost) {
|
||||
return $this->fail('特朗普帖子仅支持翻译');
|
||||
}
|
||||
if (!$isLiuhePost) {
|
||||
return $this->fail('该帖子类型无需AI分析');
|
||||
}
|
||||
|
||||
$analysis = $this->ensureLiuheAnalysisContent($post, $ext);
|
||||
if (!$analysis['success']) {
|
||||
return $this->fail($analysis['error'] ?? '图片分析失败');
|
||||
}
|
||||
$ext = $analysis['ext'];
|
||||
$data['tags'] = array_values($tags);
|
||||
$data['ext'] = $ext;
|
||||
if (!empty($ext['translated_content'])) {
|
||||
$data['translated_content'] = (string) $ext['translated_content'];
|
||||
}
|
||||
if (!empty($ext['lottery_analysis_content'])) {
|
||||
$data['lottery_analysis_content'] = (string) $ext['lottery_analysis_content'];
|
||||
}
|
||||
|
||||
$force = $this->request->get('force/d', 0) === 1;
|
||||
$result = AiService::analyzePost($postId, $data, $this->userId, true, $force);
|
||||
if (!$result['success']) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败');
|
||||
}
|
||||
|
||||
return $this->data([
|
||||
'analysis' => $result['data'],
|
||||
'from_cache' => $result['from_cache'] ?? false,
|
||||
if (empty($result['success'])) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败', [
|
||||
'remain_count' => $result['remain_count'] ?? null,
|
||||
]);
|
||||
} catch (\Throwable $e) {
|
||||
return $this->fail('AI分析异常: ' . $e->getMessage());
|
||||
}
|
||||
|
||||
unset($result['success'], $result['error'], $result['code']);
|
||||
return $this->data($result);
|
||||
}
|
||||
|
||||
public function aiAnalysisResult()
|
||||
|
||||
@@ -10,11 +10,11 @@ use app\common\model\lottery\LotteryDrawResult;
|
||||
use app\common\model\lottery\LotteryAiAnalysis;
|
||||
use app\common\model\lottery\LotteryNumberMapping;
|
||||
use app\common\model\lottery\LotteryRegion;
|
||||
use app\common\service\ai\AiService;
|
||||
use app\common\service\ai\AiAnalysisRequestService;
|
||||
|
||||
class LotteryController extends BaseApiController
|
||||
{
|
||||
public array $notNeedLogin = ['categoryList', 'regionList', 'drawList', 'drawDetail', 'latestDraw', 'aiPredict', 'gameList', 'latestDrawResult', 'drawResultList', 'aiHistory', 'aiHotCold', 'aiTrend', 'aiStats', 'aiColorZodiac', 'aiAnalysisHistory'];
|
||||
public array $notNeedLogin = ['categoryList', 'regionList', 'drawList', 'drawDetail', 'latestDraw', 'gameList', 'latestDrawResult', 'drawResultList', 'aiHistory', 'aiAnalysisHistory'];
|
||||
|
||||
/**
|
||||
* 彩种游戏列表(一级分类 + 二级彩种)
|
||||
@@ -341,87 +341,7 @@ class LotteryController extends BaseApiController
|
||||
*/
|
||||
public function aiPredict()
|
||||
{
|
||||
$categoryId = $this->request->get('category_id/d', 0);
|
||||
$code = $this->request->get('code', '');
|
||||
|
||||
// 支持两种查找方式:category_id(旧表)或 code(新表)
|
||||
if (!empty($code)) {
|
||||
$game = LotteryGame::where('code', $code)->findOrEmpty();
|
||||
if ($game->isEmpty()) {
|
||||
return $this->fail('彩种不存在');
|
||||
}
|
||||
|
||||
$recentDraws = LotteryDrawResult::where('code', $code)
|
||||
->where('draw_code', '<>', '')
|
||||
->order('draw_time desc, issue desc')
|
||||
->limit(30)
|
||||
->field('issue,draw_time,draw_code')
|
||||
->select()
|
||||
->toArray();
|
||||
|
||||
foreach ($recentDraws as &$d) {
|
||||
$d['numbers'] = $d['draw_code'] ? explode(',', $d['draw_code']) : [];
|
||||
}
|
||||
|
||||
$lotteryData = [
|
||||
'lottery_type' => $code,
|
||||
'lottery_name' => $game['name'],
|
||||
'draw_rule' => $game['template'] ?? '',
|
||||
'recent_draws' => $recentDraws,
|
||||
];
|
||||
|
||||
$result = AiService::analyzeLottery($lotteryData, $this->userId);
|
||||
if (!$result['success']) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败');
|
||||
}
|
||||
return $this->data([
|
||||
'analysis' => $result['data'],
|
||||
'from_cache' => $result['from_cache'] ?? false,
|
||||
'category_name' => $game['name'],
|
||||
]);
|
||||
}
|
||||
|
||||
if (empty($categoryId)) {
|
||||
return $this->fail('参数缺失');
|
||||
}
|
||||
|
||||
$category = LotteryCategory::where('id', $categoryId)->findOrEmpty();
|
||||
if ($category->isEmpty()) {
|
||||
return $this->fail('彩种不存在');
|
||||
}
|
||||
|
||||
// 获取最近30期已开奖数据
|
||||
$recentDraws = LotteryDraw::where('category_id', $categoryId)
|
||||
->where('status', 1)
|
||||
->where('is_show', 1)
|
||||
->order('draw_date desc, period desc')
|
||||
->limit(30)
|
||||
->field('period,draw_date,numbers,special_number,zodiac,color')
|
||||
->select()
|
||||
->toArray();
|
||||
|
||||
foreach ($recentDraws as &$d) {
|
||||
$d['numbers'] = is_string($d['numbers']) ? json_decode($d['numbers'], true) : $d['numbers'];
|
||||
$d['zodiac'] = is_string($d['zodiac']) ? json_decode($d['zodiac'], true) : $d['zodiac'];
|
||||
$d['color'] = is_string($d['color']) ? json_decode($d['color'], true) : $d['color'];
|
||||
}
|
||||
|
||||
$lotteryData = [
|
||||
'lottery_type' => $category['code'],
|
||||
'lottery_name' => $category['name'],
|
||||
'draw_rule' => $category['draw_rule'],
|
||||
'recent_draws' => $recentDraws,
|
||||
];
|
||||
|
||||
$result = AiService::analyzeLottery($lotteryData, $this->userId);
|
||||
if (!$result['success']) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败');
|
||||
}
|
||||
return $this->data([
|
||||
'analysis' => $result['data'],
|
||||
'from_cache' => $result['from_cache'] ?? false,
|
||||
'category_name' => $category['name'],
|
||||
]);
|
||||
return $this->respondAnalysis(AiAnalysisRequestService::analyzeLotteryOverview($this->request->get(), $this->userId));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -465,29 +385,7 @@ class LotteryController extends BaseApiController
|
||||
*/
|
||||
public function aiHotCold()
|
||||
{
|
||||
$code = $this->request->get('code', '');
|
||||
if (empty($code)) {
|
||||
return $this->fail('参数缺失');
|
||||
}
|
||||
|
||||
$game = LotteryGame::where('code', $code)->findOrEmpty();
|
||||
if ($game->isEmpty()) {
|
||||
return $this->fail('彩种不存在');
|
||||
}
|
||||
|
||||
$recentDraws = $this->getRecentDrawCodes($code, 30);
|
||||
$lotteryData = [
|
||||
'lottery_type' => $code,
|
||||
'lottery_name' => $game['name'],
|
||||
'draw_rule' => $game['template'] ?? '',
|
||||
'recent_draws' => $recentDraws,
|
||||
];
|
||||
|
||||
$result = AiService::analyzeLotteryModule($lotteryData, 'hot_cold', $this->userId);
|
||||
if (!$result['success']) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败');
|
||||
}
|
||||
return $this->data($result['data']);
|
||||
return $this->respondLotteryModule('hot_cold');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -495,29 +393,7 @@ class LotteryController extends BaseApiController
|
||||
*/
|
||||
public function aiTrend()
|
||||
{
|
||||
$code = $this->request->get('code', '');
|
||||
if (empty($code)) {
|
||||
return $this->fail('参数缺失');
|
||||
}
|
||||
|
||||
$game = LotteryGame::where('code', $code)->findOrEmpty();
|
||||
if ($game->isEmpty()) {
|
||||
return $this->fail('彩种不存在');
|
||||
}
|
||||
|
||||
$recentDraws = $this->getRecentDrawCodes($code, 30);
|
||||
$lotteryData = [
|
||||
'lottery_type' => $code,
|
||||
'lottery_name' => $game['name'],
|
||||
'draw_rule' => $game['template'] ?? '',
|
||||
'recent_draws' => $recentDraws,
|
||||
];
|
||||
|
||||
$result = AiService::analyzeLotteryModule($lotteryData, 'trend', $this->userId);
|
||||
if (!$result['success']) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败');
|
||||
}
|
||||
return $this->data($result['data']);
|
||||
return $this->respondLotteryModule('trend');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -525,29 +401,7 @@ class LotteryController extends BaseApiController
|
||||
*/
|
||||
public function aiStats()
|
||||
{
|
||||
$code = $this->request->get('code', '');
|
||||
if (empty($code)) {
|
||||
return $this->fail('参数缺失');
|
||||
}
|
||||
|
||||
$game = LotteryGame::where('code', $code)->findOrEmpty();
|
||||
if ($game->isEmpty()) {
|
||||
return $this->fail('彩种不存在');
|
||||
}
|
||||
|
||||
$recentDraws = $this->getRecentDrawCodes($code, 30);
|
||||
$lotteryData = [
|
||||
'lottery_type' => $code,
|
||||
'lottery_name' => $game['name'],
|
||||
'draw_rule' => $game['template'] ?? '',
|
||||
'recent_draws' => $recentDraws,
|
||||
];
|
||||
|
||||
$result = AiService::analyzeLotteryModule($lotteryData, 'stats', $this->userId);
|
||||
if (!$result['success']) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败');
|
||||
}
|
||||
return $this->data($result['data']);
|
||||
return $this->respondLotteryModule('stats');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -555,42 +409,7 @@ class LotteryController extends BaseApiController
|
||||
*/
|
||||
public function aiColorZodiac()
|
||||
{
|
||||
$code = $this->request->get('code', '');
|
||||
if (empty($code)) {
|
||||
return $this->fail('参数缺失');
|
||||
}
|
||||
|
||||
$game = LotteryGame::where('code', $code)->findOrEmpty();
|
||||
if ($game->isEmpty()) {
|
||||
return $this->fail('彩种不存在');
|
||||
}
|
||||
|
||||
if (($game['template'] ?? '') !== 'HK6') {
|
||||
return $this->fail('该彩种不支持波色生肖分析');
|
||||
}
|
||||
|
||||
$recentDraws = $this->getRecentDrawCodes($code, 30);
|
||||
|
||||
$year = (int) date('Y');
|
||||
$colorMap = LotteryNumberMapping::getMapByType($year, LotteryNumberMapping::TYPE_COLOR);
|
||||
$zodiacMap = LotteryNumberMapping::getMapByType($year, LotteryNumberMapping::TYPE_ZODIAC);
|
||||
|
||||
$lotteryData = [
|
||||
'lottery_type' => $code,
|
||||
'lottery_name' => $game['name'],
|
||||
'draw_rule' => $game['template'] ?? '',
|
||||
'recent_draws' => $recentDraws,
|
||||
'number_mapping' => [
|
||||
'color' => $colorMap,
|
||||
'zodiac' => $zodiacMap,
|
||||
],
|
||||
];
|
||||
|
||||
$result = AiService::analyzeLotteryModule($lotteryData, 'color_zodiac', $this->userId);
|
||||
if (!$result['success']) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败');
|
||||
}
|
||||
return $this->data($result['data']);
|
||||
return $this->respondLotteryModule('color_zodiac');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -638,4 +457,36 @@ class LotteryController extends BaseApiController
|
||||
|
||||
return $this->data($result);
|
||||
}
|
||||
|
||||
private function respondLotteryModule(string $module)
|
||||
{
|
||||
$result = AiAnalysisRequestService::analyzeLotteryModule(
|
||||
$this->request->get('code', ''),
|
||||
$module,
|
||||
$this->userId
|
||||
);
|
||||
if (empty($result['success'])) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败', [
|
||||
'remain_count' => $result['remain_count'] ?? null,
|
||||
]);
|
||||
}
|
||||
|
||||
$data = is_array($result['data'] ?? null) ? $result['data'] : [];
|
||||
$data['remain_count'] = $result['remain_count'] ?? 0;
|
||||
$data['unlocked'] = $result['unlocked'] ?? true;
|
||||
$data['charged'] = $result['charged'] ?? false;
|
||||
return $this->data($data);
|
||||
}
|
||||
|
||||
private function respondAnalysis(array $result)
|
||||
{
|
||||
if (empty($result['success'])) {
|
||||
return $this->fail($result['error'] ?? 'AI分析失败', [
|
||||
'remain_count' => $result['remain_count'] ?? null,
|
||||
]);
|
||||
}
|
||||
|
||||
unset($result['success'], $result['error'], $result['code']);
|
||||
return $this->data($result);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user