feat(hjf): 公排入队可配置,默认关闭时同步发放积分奖励

- 新增 hjf_queue_pool_enable(迁移 SQL),后台公排配置读写统一为该键
- Pay 监听:关闭公排时同步执行等级检查与 PointsRewardServices::reward,开启时仍派发 HjfOrderPayJob
- PointsRewardServices: bcInc 增量传 string,避免 PHP 类型错误
- hjf:patch-rewards 补偿命令补充等级检查与正确的幂等条件
- uniapp vue.config.js 本地 API 代理调整(H5 开发)
- docs/issues-0323-1 更新

Made-with: Cursor
This commit is contained in:
apple
2026-03-25 07:38:12 +08:00
parent d0cd7e4667
commit 6e5bbee71d
7 changed files with 75 additions and 24 deletions

View File

@@ -3,7 +3,9 @@ declare(strict_types=1);
namespace app\command;
use app\services\agent\AgentLevelServices;
use app\services\hjf\PointsRewardServices;
use app\services\user\UserServices;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
@@ -57,21 +59,22 @@ class HjfPatchMissingRewards extends Command
/** @var PointsRewardServices $pointsService */
$pointsService = app()->make(PointsRewardServices::class);
/** @var AgentLevelServices $agentLevelServices */
$agentLevelServices = app()->make(AgentLevelServices::class);
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
$patched = 0;
$skipped = 0;
foreach ($orders as $order) {
// 幂等检查points_release_log 中是否已有 reward_direct/reward_umbrella 记录
$hasRewardLog = Db::name('points_release_log')
->where('order_id', $order['order_id'])
->where('type', 'reward_direct')
->whereIn('type', ['reward_direct', 'reward_umbrella'])
->count();
$hasRewardBill = Db::name('user_bill')
->where('link_id', $order['id'])
->where('type', 'hjf_frozen_direct')
->count();
if ($hasRewardLog > 0 || $hasRewardBill > 0) {
if ($hasRewardLog > 0) {
$skipped++;
$output->writeln(sprintf(' [SKIP] 订单 #%d (%s) 已有积分奖励记录', $order['id'], $order['order_id']));
continue;
@@ -93,11 +96,23 @@ class HjfPatchMissingRewards extends Command
}
try {
$pointsService->reward((int)$order['uid'], (string)$order['order_id'], (int)$order['id']);
$uid = (int)$order['uid'];
// 先执行等级升级检查,确保积分奖励使用正确的 agent_level
$userCacheInfo = $userServices->getUserCacheInfo($uid);
$spreadUid = $userCacheInfo ? (int)($userCacheInfo['spread_uid'] ?? 0) : (int)$order['spread_uid'];
$twoSpreadUid = 0;
if ($spreadUid > 0 && $oneUserInfo = $userServices->getUserCacheInfo($spreadUid)) {
$twoSpreadUid = $userServices->getSpreadUid($spreadUid, $oneUserInfo, false);
}
$uids = array_values(array_filter(array_unique([$uid, $spreadUid, $twoSpreadUid])));
$agentLevelServices->checkUserLevelFinish($uid, $uids);
// 发放积分奖励PointsRewardServices 内部已做幂等检查)
$pointsService->reward($uid, (string)$order['order_id'], (int)$order['id']);
$patched++;
$output->writeln(sprintf(
' [PATCHED] 订单 #%d (%s) 已补发积分奖励',
$order['id'], $order['order_id']
' [PATCHED] 订单 #%d (%s) uid=%d 等级检查+积分奖励已补发',
$order['id'], $order['order_id'], $uid
));
} catch (\Throwable $e) {
$output->writeln(sprintf(