fix(fsgx): 积分释放定时任务、佣金轮巡与 UniApp 体验
- PointsReleaseServices: 使用 Db::table 查询与更新,构造函数注入 UserDao;日志与账单独立 try/catch\n- SystemTimer: implement_timer 捕获后重新抛出异常,便于 run_now 返回错误\n- SystemTimerServices / 控制器: runNow 返回任务结果并在 API 中带回 result\n- StoreOrderCreateServices: 报单佣金位次修正与多件轮巡\n- UniApp: 佣金记录跳转 type=2、余额提现免手续费展示、状态页与资产页头部渐变与提现页一致\n- docs: 增加 fsgx-issues-0328-1 问题跟踪 Made-with: Cursor
This commit is contained in:
@@ -3,12 +3,10 @@ declare(strict_types=1);
|
||||
|
||||
namespace app\services\hjf;
|
||||
|
||||
use app\dao\hjf\PointsReleaseLogDao;
|
||||
use app\dao\user\UserDao;
|
||||
use app\services\BaseServices;
|
||||
use app\services\user\UserBillServices;
|
||||
use crmeb\services\SystemConfigService;
|
||||
use think\annotation\Inject;
|
||||
use think\facade\Db;
|
||||
use think\facade\Log;
|
||||
|
||||
@@ -24,14 +22,10 @@ use think\facade\Log;
|
||||
*/
|
||||
class PointsReleaseServices extends BaseServices
|
||||
{
|
||||
#[Inject]
|
||||
protected PointsReleaseLogDao $logDao;
|
||||
|
||||
#[Inject]
|
||||
protected UserDao $userDao;
|
||||
|
||||
#[Inject]
|
||||
protected UserBillServices $userBillServices;
|
||||
public function __construct(UserDao $dao)
|
||||
{
|
||||
$this->dao = $dao;
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行今日积分释放(批量)
|
||||
@@ -40,24 +34,21 @@ class PointsReleaseServices extends BaseServices
|
||||
*/
|
||||
public function executeRelease(): array
|
||||
{
|
||||
$rate = (int)SystemConfigService::get('hjf_release_rate', 4);
|
||||
$rate = (int)SystemConfigService::get('hjf_release_rate', 4);
|
||||
$releaseDate = date('Y-m-d');
|
||||
$processed = 0;
|
||||
$totalReleased = 0;
|
||||
|
||||
// 分批处理,每批 200 条,避免内存溢合
|
||||
$page = 1;
|
||||
$page = 1;
|
||||
$limit = 200;
|
||||
|
||||
do {
|
||||
$users = $this->userDao->selectList(
|
||||
['frozen_points' => ['>', 0]],
|
||||
'uid,frozen_points,available_points',
|
||||
$page,
|
||||
$limit,
|
||||
'uid',
|
||||
'asc'
|
||||
);
|
||||
$users = Db::table('eb_user')
|
||||
->where('frozen_points', '>', 0)
|
||||
->field('uid, frozen_points, available_points')
|
||||
->page($page, $limit)
|
||||
->select()
|
||||
->toArray();
|
||||
|
||||
if (empty($users)) {
|
||||
break;
|
||||
@@ -65,52 +56,56 @@ class PointsReleaseServices extends BaseServices
|
||||
|
||||
foreach ($users as $user) {
|
||||
$frozenBefore = (int)$user['frozen_points'];
|
||||
// 使用 bcmath 确保精度
|
||||
$releaseAmount = (int)bcdiv(bcmul((string)$frozenBefore, (string)$rate), '1000');
|
||||
|
||||
if ($releaseAmount <= 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$frozenAfter = $frozenBefore - $releaseAmount;
|
||||
$frozenAfter = $frozenBefore - $releaseAmount;
|
||||
$newAvailable = (int)$user['available_points'] + $releaseAmount;
|
||||
|
||||
// 主更新:只更新积分字段,失败则跳过本用户
|
||||
try {
|
||||
Db::transaction(function () use ($user, $releaseAmount, $frozenBefore, $frozenAfter, $releaseDate) {
|
||||
// 更新用户积分字段
|
||||
$this->userDao->update($user['uid'], [
|
||||
'frozen_points' => $frozenAfter,
|
||||
'available_points' => Db::raw('available_points + ' . $releaseAmount),
|
||||
], 'uid');
|
||||
|
||||
// 写 points_release_log(本次每日释放记录)
|
||||
$this->logDao->save([
|
||||
'uid' => $user['uid'],
|
||||
'points' => $releaseAmount,
|
||||
'pm' => 1,
|
||||
'type' => 'release',
|
||||
'title' => '每日释放',
|
||||
'mark' => "积分每日自动解冻,释放日期 {$releaseDate}",
|
||||
'status' => 'released',
|
||||
'release_date' => $releaseDate,
|
||||
]);
|
||||
|
||||
// 同步写入 eb_user_bill,使管理后台积分日志页面可见
|
||||
$integralBalance = (int)($this->userDao->value(['uid' => $user['uid']], 'integral') ?: 0);
|
||||
$this->userBillServices->income(
|
||||
'frozen_points_release',
|
||||
(int)$user['uid'],
|
||||
(int)$releaseAmount,
|
||||
$integralBalance,
|
||||
0,
|
||||
0,
|
||||
"积分每日自动解冻,释放日期 {$releaseDate}"
|
||||
);
|
||||
});
|
||||
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());
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,9 +115,9 @@ class PointsReleaseServices extends BaseServices
|
||||
Log::info("[PointsRelease] 完成,processed={$processed} total_released={$totalReleased}");
|
||||
|
||||
return [
|
||||
'processed' => $processed,
|
||||
'processed' => $processed,
|
||||
'total_released' => $totalReleased,
|
||||
'release_date' => $releaseDate,
|
||||
'release_date' => $releaseDate,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user