74 lines
2.6 KiB
PHP
74 lines
2.6 KiB
PHP
|
|
<?php
|
|||
|
|
// +----------------------------------------------------------------------
|
|||
|
|
// | 范氏国香 fsgx — 待释放积分每日释放服务
|
|||
|
|
// +----------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
namespace app\services\hjf;
|
|||
|
|
|
|||
|
|
use app\dao\user\UserDao;
|
|||
|
|
use app\services\BaseServices;
|
|||
|
|
use app\services\user\UserBillServices;
|
|||
|
|
use think\facade\Db;
|
|||
|
|
use think\facade\Log;
|
|||
|
|
|
|||
|
|
class FrozenPointsReleaseServices extends BaseServices
|
|||
|
|
{
|
|||
|
|
/**
|
|||
|
|
* 每日将所有用户 frozen_points 的 0.4‰ 转入 available_points
|
|||
|
|
* 由定时任务 fsgx_release_points(每日执行)触发
|
|||
|
|
* @return bool
|
|||
|
|
*/
|
|||
|
|
public function dailyRelease(): bool
|
|||
|
|
{
|
|||
|
|
// 分批处理,避免一次性大量更新
|
|||
|
|
$page = 1;
|
|||
|
|
$limit = 200;
|
|||
|
|
$releaseRatio = 0.0004; // 0.4‰
|
|||
|
|
|
|||
|
|
/** @var UserBillServices $billServices */
|
|||
|
|
$billServices = app()->make(UserBillServices::class);
|
|||
|
|
|
|||
|
|
while (true) {
|
|||
|
|
$users = Db::name('user')
|
|||
|
|
->where('frozen_points', '>', 0)
|
|||
|
|
->field('uid, frozen_points, available_points')
|
|||
|
|
->limit($limit)
|
|||
|
|
->page($page)
|
|||
|
|
->select()
|
|||
|
|
->toArray();
|
|||
|
|
|
|||
|
|
if (empty($users)) break;
|
|||
|
|
|
|||
|
|
foreach ($users as $user) {
|
|||
|
|
try {
|
|||
|
|
$releaseAmount = (int)floor($user['frozen_points'] * $releaseRatio);
|
|||
|
|
if ($releaseAmount <= 0) continue;
|
|||
|
|
|
|||
|
|
Db::name('user')->where('uid', $user['uid'])->update([
|
|||
|
|
'frozen_points' => max(0, $user['frozen_points'] - $releaseAmount),
|
|||
|
|
'available_points' => $user['available_points'] + $releaseAmount,
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
// 记录积分变动日志
|
|||
|
|
$newBalance = $user['available_points'] + $releaseAmount;
|
|||
|
|
$billServices->income('frozen_points_release', $user['uid'], [
|
|||
|
|
'number' => $releaseAmount,
|
|||
|
|
'mark' => date('Y-m-d') . ' 每日积分释放(待释放积分的0.4‰)',
|
|||
|
|
'balance' => $newBalance,
|
|||
|
|
'type' => 'integral',
|
|||
|
|
'title' => '积分释放',
|
|||
|
|
'pm' => 1,
|
|||
|
|
], $newBalance, 0);
|
|||
|
|
} catch (\Throwable $e) {
|
|||
|
|
Log::error('fsgx dailyRelease uid=' . $user['uid'] . ' error: ' . $e->getMessage());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (count($users) < $limit) break;
|
|||
|
|
$page++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|