From 42beed5c9357cf0355dd95a55694f5e4acac75fd Mon Sep 17 00:00:00 2001 From: lkddi Date: Wed, 18 Mar 2026 21:03:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8B=A4=E5=8A=A1=E6=97=A5?= =?UTF-8?q?=E6=A6=9C=E5=9C=A8=E7=BA=BF=E6=97=B6=E9=95=BF=EF=BC=9ACASE=20WH?= =?UTF-8?q?EN=20=E5=AE=9E=E6=97=B6=E7=AE=97=20open=20session=20=E6=97=B6?= =?UTF-8?q?=E9=95=BF=EF=BC=9B=E5=85=B3=E9=97=AD=20stale=20=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=97=B6=E8=A1=A5=E7=AE=97=20duration=5Fseconds?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Commands/CloseStaleDutyLogs.php | 2 ++ app/Http/Controllers/DutyHallController.php | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/Console/Commands/CloseStaleDutyLogs.php b/app/Console/Commands/CloseStaleDutyLogs.php index a136105..4e98e20 100644 --- a/app/Console/Commands/CloseStaleDutyLogs.php +++ b/app/Console/Commands/CloseStaleDutyLogs.php @@ -50,6 +50,8 @@ class CloseStaleDutyLogs extends Command ->where('updated_at', '<=', $threshold) ->update([ 'logout_at' => DB::raw('NOW()'), + // 补算最终在线时长,避免日榜 SUM 使用过时的旧值 + 'duration_seconds' => DB::raw('GREATEST(0, TIMESTAMPDIFF(SECOND, login_at, NOW()))'), ]); if ($affected > 0) { diff --git a/app/Http/Controllers/DutyHallController.php b/app/Http/Controllers/DutyHallController.php index 910fa71..ab69b04 100644 --- a/app/Http/Controllers/DutyHallController.php +++ b/app/Http/Controllers/DutyHallController.php @@ -50,7 +50,17 @@ class DutyHallController extends Controller // ① 在线时长(position_duty_logs) $dutyQuery = PositionDutyLog::query() - ->selectRaw('user_id, SUM(duration_seconds) as total_seconds, COUNT(*) as checkin_count'); + ->selectRaw(' + user_id, + SUM( + CASE + WHEN logout_at IS NULL + THEN GREATEST(0, TIMESTAMPDIFF(SECOND, login_at, NOW())) + ELSE duration_seconds + END + ) as total_seconds, + COUNT(*) as checkin_count + '); // ② 管理操作(position_authority_logs,排除任命/撤销等人事操作) $authQuery = PositionAuthorityLog::query()