fix(ticket): 本地化调整工单时间线状态标签翻译
- 将工单时间线中的状态标签改为调用多语言翻译接口 - 新增多语言文件中对应时间线标签的翻译词条 - 统一使用请求中的本地语言环境渲染时间线标签 - 优化代理信用额度校验,抽取公共方法requireProfile - 抛出更精确的校验异常信息,区分缺失和额度超出情况
This commit is contained in:
@@ -71,44 +71,47 @@ final class TicketItemShowController extends Controller
|
|||||||
: null;
|
: null;
|
||||||
|
|
||||||
$timeline = [];
|
$timeline = [];
|
||||||
|
$locale = $request->lotteryLocale();
|
||||||
if ($order?->created_at !== null) {
|
if ($order?->created_at !== null) {
|
||||||
$timeline[] = [
|
$timeline[] = [
|
||||||
'code' => 'placed',
|
'code' => 'placed',
|
||||||
'label' => '已下注',
|
'label' => trans('api.ticket_timeline_placed', [], $locale),
|
||||||
'time' => $order->created_at->toIso8601String(),
|
'time' => $order->created_at->toIso8601String(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if ($betTxn?->created_at !== null) {
|
if ($betTxn?->created_at !== null) {
|
||||||
$timeline[] = [
|
$timeline[] = [
|
||||||
'code' => 'deducted',
|
'code' => 'deducted',
|
||||||
'label' => '已扣款',
|
'label' => trans('api.ticket_timeline_deducted', [], $locale),
|
||||||
'time' => $betTxn->created_at->toIso8601String(),
|
'time' => $betTxn->created_at->toIso8601String(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if ($drawPayload !== null && $draw?->current_result_version !== null) {
|
if ($drawPayload !== null && $draw?->current_result_version !== null) {
|
||||||
$timeline[] = [
|
$timeline[] = [
|
||||||
'code' => 'draw_published',
|
'code' => 'draw_published',
|
||||||
'label' => '开奖结果已发布',
|
'label' => trans('api.ticket_timeline_draw_published', [], $locale),
|
||||||
'time' => $draw->draw_time?->toIso8601String() ?? $draw->updated_at?->toIso8601String(),
|
'time' => $draw->draw_time?->toIso8601String() ?? $draw->updated_at?->toIso8601String(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if ($settlementBatch?->started_at !== null) {
|
if ($settlementBatch?->started_at !== null) {
|
||||||
$timeline[] = [
|
$timeline[] = [
|
||||||
'code' => 'settlement_started',
|
'code' => 'settlement_started',
|
||||||
'label' => '结算开始',
|
'label' => trans('api.ticket_timeline_settlement_started', [], $locale),
|
||||||
'time' => $settlementBatch->started_at->toIso8601String(),
|
'time' => $settlementBatch->started_at->toIso8601String(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if ($item->settled_at !== null) {
|
if ($item->settled_at !== null) {
|
||||||
$timeline[] = [
|
$timeline[] = [
|
||||||
'code' => 'settled',
|
'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(),
|
'time' => $item->settled_at->toIso8601String(),
|
||||||
];
|
];
|
||||||
} elseif ($payoutTxn?->created_at !== null) {
|
} elseif ($payoutTxn?->created_at !== null) {
|
||||||
$timeline[] = [
|
$timeline[] = [
|
||||||
'code' => 'settled',
|
'code' => 'settled',
|
||||||
'label' => '已派彩',
|
'label' => trans('api.ticket_timeline_paid_out', [], $locale),
|
||||||
'time' => $payoutTxn->created_at->toIso8601String(),
|
'time' => $payoutTxn->created_at->toIso8601String(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,12 +27,7 @@ final class CreditAllocationValidator
|
|||||||
|
|
||||||
$this->allocatedSync->syncForAgent($parent);
|
$this->allocatedSync->syncForAgent($parent);
|
||||||
|
|
||||||
$profile = AgentProfile::query()->where('agent_node_id', $parent->id)->first();
|
$profile = $this->requireProfile($parent->id, 'parent_profile_required');
|
||||||
if ($profile === null) {
|
|
||||||
throw ValidationException::withMessages([
|
|
||||||
'credit_limit' => ['parent_profile_required'],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$available = max(0, (int) $profile->credit_limit - (int) $profile->allocated_credit);
|
$available = max(0, (int) $profile->credit_limit - (int) $profile->allocated_credit);
|
||||||
$floor = $isNewChild ? 0 : max(0, $previousChildLimit);
|
$floor = $isNewChild ? 0 : max(0, $previousChildLimit);
|
||||||
@@ -49,12 +44,7 @@ final class CreditAllocationValidator
|
|||||||
{
|
{
|
||||||
$this->allocatedSync->syncForAgent($parent);
|
$this->allocatedSync->syncForAgent($parent);
|
||||||
|
|
||||||
$profile = AgentProfile::query()->where('agent_node_id', $parent->id)->first();
|
$profile = $this->requireProfile($parent->id, 'parent_profile_required');
|
||||||
if ($profile === null) {
|
|
||||||
throw ValidationException::withMessages([
|
|
||||||
'credit_limit' => ['parent_profile_required'],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$available = max(0, (int) $profile->credit_limit - (int) $profile->allocated_credit);
|
$available = max(0, (int) $profile->credit_limit - (int) $profile->allocated_credit);
|
||||||
if ($additionalCredit > $available) {
|
if ($additionalCredit > $available) {
|
||||||
@@ -85,12 +75,7 @@ final class CreditAllocationValidator
|
|||||||
|
|
||||||
$this->allocatedSync->syncForAgent($agent);
|
$this->allocatedSync->syncForAgent($agent);
|
||||||
|
|
||||||
$profile = AgentProfile::query()->where('agent_node_id', $agent->id)->first();
|
$profile = $this->requireProfile($agent->id, 'agent_profile_required');
|
||||||
if ($profile === null) {
|
|
||||||
throw ValidationException::withMessages([
|
|
||||||
'credit_limit' => ['agent_profile_required'],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$available = max(0, (int) $profile->credit_limit - (int) $profile->allocated_credit);
|
$available = max(0, (int) $profile->credit_limit - (int) $profile->allocated_credit);
|
||||||
if ($additionalCredit > $available) {
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,12 @@ return [
|
|||||||
'draw_result_exists' => 'This draw already has result data and cannot be edited or deleted.',
|
'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).',
|
'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.',
|
'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.',
|
'too_many_requests' => 'Too many requests. Please try again later.',
|
||||||
'server_error' => 'Something went wrong. Please try again later.',
|
'server_error' => 'Something went wrong. Please try again later.',
|
||||||
'jackpot_manual_burst_failed' => 'Manual jackpot burst failed: :reason',
|
'jackpot_manual_burst_failed' => 'Manual jackpot burst failed: :reason',
|
||||||
|
|||||||
@@ -18,6 +18,12 @@ return [
|
|||||||
'draw_result_exists' => 'यस ड्रमा नतिजा छ, सम्पादन/मेटाउन मिल्दैन।',
|
'draw_result_exists' => 'यस ड्रमा नतिजा छ, सम्पादन/मेटाउन मिल्दैन।',
|
||||||
'settlement_not_approved' => 'सेटलमेन्ट ब्याच पेमेन्टका लागि स्वीकृत छैन (status र review_status दुवै approved हुनुपर्छ)।',
|
'settlement_not_approved' => 'सेटलमेन्ट ब्याच पेमेन्टका लागि स्वीकृत छैन (status र review_status दुवै approved हुनुपर्छ)।',
|
||||||
'not_found' => 'अनुरोध गरिएको स्रोत फेला परेन।',
|
'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' => 'धेरै अनुरोधहरू। कृपया पछि प्रयास गर्नुहोस्।',
|
'too_many_requests' => 'धेरै अनुरोधहरू। कृपया पछि प्रयास गर्नुहोस्।',
|
||||||
'server_error' => 'केही गडबड भयो। कृपया पछि प्रयास गर्नुहोस्।',
|
'server_error' => 'केही गडबड भयो। कृपया पछि प्रयास गर्नुहोस्।',
|
||||||
'jackpot_manual_burst_failed' => 'म्यानुअल ज्याकपोट बर्स्ट असफल: :reason',
|
'jackpot_manual_burst_failed' => 'म्यानुअल ज्याकपोट बर्स्ट असफल: :reason',
|
||||||
|
|||||||
@@ -18,6 +18,12 @@ return [
|
|||||||
'draw_result_exists' => '该期已有开奖结果,不能编辑或删除。',
|
'draw_result_exists' => '该期已有开奖结果,不能编辑或删除。',
|
||||||
'settlement_not_approved' => '结算批次尚未审核通过,无法派彩(需 status 与 review_status 均为 approved)。',
|
'settlement_not_approved' => '结算批次尚未审核通过,无法派彩(需 status 与 review_status 均为 approved)。',
|
||||||
'not_found' => '请求的资源不存在。',
|
'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' => '请求过于频繁,请稍后再试。',
|
'too_many_requests' => '请求过于频繁,请稍后再试。',
|
||||||
'server_error' => '服务暂时不可用,请稍后再试。',
|
'server_error' => '服务暂时不可用,请稍后再试。',
|
||||||
'jackpot_manual_burst_failed' => '手动爆池失败::reason',
|
'jackpot_manual_burst_failed' => '手动爆池失败::reason',
|
||||||
|
|||||||
Reference in New Issue
Block a user