dao = $dao; } /** * 执行今日积分释放(批量) * * @return array 统计:['processed' => int, 'total_released' => int] */ public function executeRelease(): array { $rate = (int)SystemConfigService::get('hjf_release_rate', 4); $releaseDate = date('Y-m-d'); $processed = 0; $totalReleased = 0; $page = 1; $limit = 200; do { $users = Db::table('eb_user') ->where('frozen_points', '>', 0) ->field('uid, frozen_points, available_points') ->page($page, $limit) ->select() ->toArray(); if (empty($users)) { break; } foreach ($users as $user) { $frozenBefore = (int)$user['frozen_points']; $releaseAmount = (int)bcdiv(bcmul((string)$frozenBefore, (string)$rate), '1000'); if ($releaseAmount <= 0) { continue; } $frozenAfter = $frozenBefore - $releaseAmount; $newAvailable = (int)$user['available_points'] + $releaseAmount; // 主更新:只更新积分字段,失败则跳过本用户 try { Db::table('eb_user')->where('uid', $user['uid'])->update([ 'frozen_points' => max(0, $frozenAfter), 'available_points' => $newAvailable, ]); $totalReleased += $releaseAmount; $processed++; } catch (\Throwable $e) { Log::error("[PointsRelease] uid={$user['uid']} 积分更新失败: " . $e->getMessage()); continue; } // 日志写入独立处理,失败不影响已提交的积分更新 try { Db::table('eb_points_release_log')->insert([ 'uid' => $user['uid'], 'points' => $releaseAmount, 'pm' => 1, 'type' => 'release', 'title' => '每日释放', 'mark' => "积分每日自动解冻,释放日期 {$releaseDate}", 'status' => 'released', 'release_date' => $releaseDate, 'add_time' => time(), ]); /** @var UserBillServices $billServices */ $billServices = app()->make(UserBillServices::class); $billServices->income( 'frozen_points_release', (int)$user['uid'], (int)$releaseAmount, $newAvailable, 0, 0, "积分每日自动解冻,释放日期 {$releaseDate}" ); } catch (\Throwable $e) { Log::warning("[PointsRelease] uid={$user['uid']} 日志写入失败(积分已释放): " . $e->getMessage()); } } $page++; } while (count($users) === $limit); Log::info("[PointsRelease] 完成,processed={$processed} total_released={$totalReleased}"); return [ 'processed' => $processed, 'total_released' => $totalReleased, 'release_date' => $releaseDate, ]; } }