From 9d355aa853c962fa64241ec07c7140e2ff077c27 Mon Sep 17 00:00:00 2001 From: kang Date: Thu, 2 Jul 2026 14:39:55 +0800 Subject: [PATCH] =?UTF-8?q?fix(ticket):=20=E6=9C=AC=E5=9C=B0=E5=8C=96?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=B7=A5=E5=8D=95=E6=97=B6=E9=97=B4=E7=BA=BF?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=87=E7=AD=BE=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将工单时间线中的状态标签改为调用多语言翻译接口 - 新增多语言文件中对应时间线标签的翻译词条 - 统一使用请求中的本地语言环境渲染时间线标签 - 优化代理信用额度校验,抽取公共方法requireProfile - 抛出更精确的校验异常信息,区分缺失和额度超出情况 --- .../V1/Ticket/TicketItemShowController.php | 15 +++++---- .../Agent/CreditAllocationValidator.php | 33 +++++++++---------- lang/en/api.php | 6 ++++ lang/ne/api.php | 6 ++++ lang/zh/api.php | 6 ++++ 5 files changed, 42 insertions(+), 24 deletions(-) diff --git a/app/Http/Controllers/Api/V1/Ticket/TicketItemShowController.php b/app/Http/Controllers/Api/V1/Ticket/TicketItemShowController.php index 325457d..3edfe76 100644 --- a/app/Http/Controllers/Api/V1/Ticket/TicketItemShowController.php +++ b/app/Http/Controllers/Api/V1/Ticket/TicketItemShowController.php @@ -71,44 +71,47 @@ final class TicketItemShowController extends Controller : null; $timeline = []; + $locale = $request->lotteryLocale(); if ($order?->created_at !== null) { $timeline[] = [ 'code' => 'placed', - 'label' => '已下注', + 'label' => trans('api.ticket_timeline_placed', [], $locale), 'time' => $order->created_at->toIso8601String(), ]; } if ($betTxn?->created_at !== null) { $timeline[] = [ 'code' => 'deducted', - 'label' => '已扣款', + 'label' => trans('api.ticket_timeline_deducted', [], $locale), 'time' => $betTxn->created_at->toIso8601String(), ]; } if ($drawPayload !== null && $draw?->current_result_version !== null) { $timeline[] = [ 'code' => 'draw_published', - 'label' => '开奖结果已发布', + 'label' => trans('api.ticket_timeline_draw_published', [], $locale), 'time' => $draw->draw_time?->toIso8601String() ?? $draw->updated_at?->toIso8601String(), ]; } if ($settlementBatch?->started_at !== null) { $timeline[] = [ 'code' => 'settlement_started', - 'label' => '结算开始', + 'label' => trans('api.ticket_timeline_settlement_started', [], $locale), 'time' => $settlementBatch->started_at->toIso8601String(), ]; } if ($item->settled_at !== null) { $timeline[] = [ 'code' => 'settled', - 'label' => $item->status === 'settled_win' ? '已派彩' : '已结算', + 'label' => $item->status === 'settled_win' + ? trans('api.ticket_timeline_paid_out', [], $locale) + : trans('api.ticket_timeline_settled', [], $locale), 'time' => $item->settled_at->toIso8601String(), ]; } elseif ($payoutTxn?->created_at !== null) { $timeline[] = [ 'code' => 'settled', - 'label' => '已派彩', + 'label' => trans('api.ticket_timeline_paid_out', [], $locale), 'time' => $payoutTxn->created_at->toIso8601String(), ]; } diff --git a/app/Services/Agent/CreditAllocationValidator.php b/app/Services/Agent/CreditAllocationValidator.php index 223be8d..e9c7f94 100644 --- a/app/Services/Agent/CreditAllocationValidator.php +++ b/app/Services/Agent/CreditAllocationValidator.php @@ -27,12 +27,7 @@ final class CreditAllocationValidator $this->allocatedSync->syncForAgent($parent); - $profile = AgentProfile::query()->where('agent_node_id', $parent->id)->first(); - if ($profile === null) { - throw ValidationException::withMessages([ - 'credit_limit' => ['parent_profile_required'], - ]); - } + $profile = $this->requireProfile($parent->id, 'parent_profile_required'); $available = max(0, (int) $profile->credit_limit - (int) $profile->allocated_credit); $floor = $isNewChild ? 0 : max(0, $previousChildLimit); @@ -49,12 +44,7 @@ final class CreditAllocationValidator { $this->allocatedSync->syncForAgent($parent); - $profile = AgentProfile::query()->where('agent_node_id', $parent->id)->first(); - if ($profile === null) { - throw ValidationException::withMessages([ - 'credit_limit' => ['parent_profile_required'], - ]); - } + $profile = $this->requireProfile($parent->id, 'parent_profile_required'); $available = max(0, (int) $profile->credit_limit - (int) $profile->allocated_credit); if ($additionalCredit > $available) { @@ -85,12 +75,7 @@ final class CreditAllocationValidator $this->allocatedSync->syncForAgent($agent); - $profile = AgentProfile::query()->where('agent_node_id', $agent->id)->first(); - if ($profile === null) { - throw ValidationException::withMessages([ - 'credit_limit' => ['agent_profile_required'], - ]); - } + $profile = $this->requireProfile($agent->id, 'agent_profile_required'); $available = max(0, (int) $profile->credit_limit - (int) $profile->allocated_credit); if ($additionalCredit > $available) { @@ -99,4 +84,16 @@ final class CreditAllocationValidator ]); } } + + private function requireProfile(int $agentNodeId, string $missingKey): AgentProfile + { + $profile = AgentProfile::query()->where('agent_node_id', $agentNodeId)->first(); + if ($profile === null) { + throw ValidationException::withMessages([ + 'credit_limit' => [$missingKey], + ]); + } + + return $profile; + } } diff --git a/lang/en/api.php b/lang/en/api.php index 93ad777..d2ff5d5 100644 --- a/lang/en/api.php +++ b/lang/en/api.php @@ -18,6 +18,12 @@ return [ 'draw_result_exists' => 'This draw already has result data and cannot be edited or deleted.', 'settlement_not_approved' => 'Settlement batch is not approved for payout (both status and review_status must be approved).', 'not_found' => 'The requested resource was not found.', + 'ticket_timeline_placed' => 'Bet placed', + 'ticket_timeline_deducted' => 'Stake deducted', + 'ticket_timeline_draw_published' => 'Draw result published', + 'ticket_timeline_settlement_started' => 'Settlement started', + 'ticket_timeline_settled' => 'Settled', + 'ticket_timeline_paid_out' => 'Paid out', 'too_many_requests' => 'Too many requests. Please try again later.', 'server_error' => 'Something went wrong. Please try again later.', 'jackpot_manual_burst_failed' => 'Manual jackpot burst failed: :reason', diff --git a/lang/ne/api.php b/lang/ne/api.php index 3f10136..ef064c2 100644 --- a/lang/ne/api.php +++ b/lang/ne/api.php @@ -18,6 +18,12 @@ return [ 'draw_result_exists' => 'यस ड्रमा नतिजा छ, सम्पादन/मेटाउन मिल्दैन।', 'settlement_not_approved' => 'सेटलमेन्ट ब्याच पेमेन्टका लागि स्वीकृत छैन (status र review_status दुवै approved हुनुपर्छ)।', 'not_found' => 'अनुरोध गरिएको स्रोत फेला परेन।', + 'ticket_timeline_placed' => 'बेट गरियो', + 'ticket_timeline_deducted' => 'रकम काटियो', + 'ticket_timeline_draw_published' => 'ड्र नतिजा प्रकाशित', + 'ticket_timeline_settlement_started' => 'सेटलमेन्ट सुरु', + 'ticket_timeline_settled' => 'सेटल भयो', + 'ticket_timeline_paid_out' => 'भुक्तानी भयो', 'too_many_requests' => 'धेरै अनुरोधहरू। कृपया पछि प्रयास गर्नुहोस्।', 'server_error' => 'केही गडबड भयो। कृपया पछि प्रयास गर्नुहोस्।', 'jackpot_manual_burst_failed' => 'म्यानुअल ज्याकपोट बर्स्ट असफल: :reason', diff --git a/lang/zh/api.php b/lang/zh/api.php index 495d51f..c52c6f7 100644 --- a/lang/zh/api.php +++ b/lang/zh/api.php @@ -18,6 +18,12 @@ return [ 'draw_result_exists' => '该期已有开奖结果,不能编辑或删除。', 'settlement_not_approved' => '结算批次尚未审核通过,无法派彩(需 status 与 review_status 均为 approved)。', 'not_found' => '请求的资源不存在。', + 'ticket_timeline_placed' => '已下注', + 'ticket_timeline_deducted' => '已扣款', + 'ticket_timeline_draw_published' => '开奖结果已发布', + 'ticket_timeline_settlement_started' => '结算开始', + 'ticket_timeline_settled' => '已结算', + 'ticket_timeline_paid_out' => '已派彩', 'too_many_requests' => '请求过于频繁,请稍后再试。', 'server_error' => '服务暂时不可用,请稍后再试。', 'jackpot_manual_burst_failed' => '手动爆池失败::reason',