feat(admin-frontend): 补齐活跃筛选与支付快照能力

新增用户管理“活跃状态”高级筛选,并在后端支持
activity_status 复合规则,支持按活跃与非活跃筛选用户。

补齐订单支付成功快照落库与后台展示,保存支付渠道、
支付方法、实付金额和支付 IP,并在订单详情中优先展示。

同时增强节点页在线/离线筛选与批量删除、仪表盘快捷入口,
并修复已关闭工单再次回复后自动重开的统一语义。

附带同步测试、迁移、CI 工作流命名及知识库记录
This commit is contained in:
yinjianm
2026-04-25 00:59:08 +08:00
parent 2218457237
commit c64badfc23
55 changed files with 2023 additions and 71 deletions
@@ -0,0 +1,51 @@
<?php
namespace Tests\Unit;
use App\Models\Ticket;
use App\Services\TicketService;
use PHPUnit\Framework\TestCase;
use ReflectionMethod;
class TicketServiceReplyStateTest extends TestCase
{
public function test_user_reply_reopens_closed_ticket_and_marks_waiting(): void
{
$ticket = new Ticket([
'user_id' => 1001,
'status' => Ticket::STATUS_CLOSED,
'reply_status' => Ticket::REPLY_STATUS_REPLIED,
'last_reply_user_id' => 2002,
]);
$this->applyReplyState($ticket, 1001);
$this->assertSame(Ticket::STATUS_OPENING, $ticket->status);
$this->assertSame(Ticket::REPLY_STATUS_WAITING, $ticket->reply_status);
$this->assertSame(1001, $ticket->last_reply_user_id);
}
public function test_admin_reply_reopens_closed_ticket_and_marks_replied(): void
{
$ticket = new Ticket([
'user_id' => 1001,
'status' => Ticket::STATUS_CLOSED,
'reply_status' => Ticket::REPLY_STATUS_WAITING,
'last_reply_user_id' => 1001,
]);
$this->applyReplyState($ticket, 3003);
$this->assertSame(Ticket::STATUS_OPENING, $ticket->status);
$this->assertSame(Ticket::REPLY_STATUS_REPLIED, $ticket->reply_status);
$this->assertSame(3003, $ticket->last_reply_user_id);
}
private function applyReplyState(Ticket $ticket, int $userId): void
{
$service = new TicketService();
$method = new ReflectionMethod(TicketService::class, 'applyReplyState');
$method->setAccessible(true);
$method->invoke($service, $ticket, $userId);
}
}