feat: 重构注单控制器以复用共享筛选逻辑

新增 TicketItemListFilters trait,用于封装注单列表的通用筛选逻辑。
更新 AdminPlayerTicketItemsIndexController、AdminTicketItemIndexController 与 TicketItemsIndexController,统一使用新的注单编号搜索与订单日期范围筛选方法,提升代码复用性与可读性。
增强 AdminRiskPoolManualStatusController:支持发布手动停售状态变更通知。
优化 RiskPoolService 与 TicketWalletService:钱包资金变动后实时通知余额更新。
更新测试用例,确保重构后功能行为保持一致。
This commit is contained in:
2026-05-26 17:14:19 +08:00
parent 36e50383ba
commit 618201f980
12 changed files with 408 additions and 84 deletions

View File

@@ -0,0 +1,59 @@
<?php
namespace App\Support;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
/**
* 注项列表共用筛选:号码/订单号搜索、按开奖时区日界筛选下单时间。
*/
trait TicketItemListFilters
{
protected function applyTicketItemNumberSearch(Builder $query, string $number): void
{
$number = trim($number);
if ($number === '') {
return;
}
$query->where(function (Builder $q) use ($number): void {
$q->where('ticket_items.original_number', 'like', '%'.$number.'%')
->orWhere('ticket_items.normalized_number', 'like', '%'.$number.'%')
->orWhere('ticket_items.ticket_no', 'like', '%'.$number.'%')
->orWhereHas('order', fn (Builder $order) => $order->where('order_no', 'like', '%'.$number.'%'));
});
}
protected function applyOrderPlacedDateRange(Builder $query, ?string $startDate, ?string $endDate): void
{
if (is_string($startDate) && $startDate !== '') {
$fromUtc = $this->scheduleDateStartUtc($startDate);
$query->whereHas('order', fn (Builder $q) => $q->where('created_at', '>=', $fromUtc));
}
if (is_string($endDate) && $endDate !== '') {
$toUtc = $this->scheduleDateEndUtc($endDate);
$query->whereHas('order', fn (Builder $q) => $q->where('created_at', '<=', $toUtc));
}
}
private function scheduleTimezone(): string
{
return (string) config('lottery.draw.timezone', 'UTC');
}
private function scheduleDateStartUtc(string $ymd): Carbon
{
return Carbon::createFromFormat('Y-m-d', $ymd, $this->scheduleTimezone())
->startOfDay()
->utc();
}
private function scheduleDateEndUtc(string $ymd): Carbon
{
return Carbon::createFromFormat('Y-m-d', $ymd, $this->scheduleTimezone())
->endOfDay()
->utc();
}
}