refactor(fsgx): 积分奖励改为按 eb_agent_level 直推/伞下配置值发放
- grantFrozenPointsByBrokerage: 移除「比例×佣金」换算,改为委托 PointsRewardServices::reward() 按 direct_reward_points / umbrella_reward_points 全链路发放 frozen_points - HjfOrderPayJob: 移除重复的 PointsRewardServices::reward() 调用, 避免同一笔订单双重发放;Job 仅保留公排入队与等级升级检查 Made-with: Cursor
This commit is contained in:
@@ -22,6 +22,7 @@ use app\services\BaseServices;
|
||||
use app\services\message\service\StoreServiceServices;
|
||||
use app\services\message\sms\SmsSendServices;
|
||||
use app\services\user\member\MemberCardServices;
|
||||
use app\services\hjf\PointsRewardServices;
|
||||
use app\services\user\UserBillServices;
|
||||
use app\services\user\UserBrokerageServices;
|
||||
use app\services\user\UserServices;
|
||||
@@ -307,41 +308,30 @@ class StoreOrderTakeServices extends BaseServices
|
||||
|
||||
|
||||
/**
|
||||
* fsgx: 佣金发放后,根据推荐人分销等级给予待释放积分奖励
|
||||
* 积分奖励规则:每获得1元佣金,发放100积分到 frozen_points(可在后台配置调整)
|
||||
* @param int $spreadUid 推荐人uid
|
||||
* @param string|float $brokeragePrice 本次佣金金额
|
||||
* @param array $orderInfo 订单信息
|
||||
* fsgx: 佣金发放后,按照 eb_agent_level 配置的「直推/伞下奖励积分」发放 frozen_points
|
||||
*
|
||||
* 积分奖励规则:
|
||||
* - 直推上级:获得其等级 direct_reward_points 配置的积分
|
||||
* - 更上级(伞下):按级差规则获得 umbrella_reward_points 积分
|
||||
* - 具体计算由 PointsRewardServices::reward() 统一实现,同 HjfOrderPayJob 逻辑保持一致
|
||||
*
|
||||
* @param int $spreadUid 直推上级uid(仅用于前置校验)
|
||||
* @param string|float $brokeragePrice 本次佣金金额(前置校验用)
|
||||
* @param array $orderInfo 订单信息(需含 uid、order_id)
|
||||
*/
|
||||
protected function grantFrozenPointsByBrokerage(int $spreadUid, $brokeragePrice, array $orderInfo): void
|
||||
{
|
||||
try {
|
||||
if ($spreadUid <= 0 || $brokeragePrice <= 0) return;
|
||||
/** @var UserServices $userServices */
|
||||
$userServices = app()->make(UserServices::class);
|
||||
$spreadUser = $userServices->get($spreadUid, ['uid', 'agent_level', 'frozen_points']);
|
||||
// 只有拥有分销等级(创客及以上 agent_level > 0)的用户才获得积分
|
||||
if (!$spreadUser || (int)($spreadUser['agent_level'] ?? 0) <= 0) return;
|
||||
// 积分换算:每1元佣金 → 100积分,可通过后台配置 brokerage_points_ratio 调整
|
||||
$pointsRatio = (int)sys_config('brokerage_points_ratio', 100);
|
||||
$points = (int)bcmul((string)$brokeragePrice, (string)$pointsRatio, 0);
|
||||
if ($points <= 0) return;
|
||||
// 写入 frozen_points
|
||||
$userServices->bcInc($spreadUid, 'frozen_points', $points, 'uid');
|
||||
// 写积分日志(使用 UserBill)
|
||||
/** @var \app\services\user\UserBillServices $userBillServices */
|
||||
$userBillServices = app()->make(\app\services\user\UserBillServices::class);
|
||||
$userBillServices->income('frozen_points_brokerage', $spreadUid, [
|
||||
'number' => $points,
|
||||
'mark' => '推荐佣金赠积分,订单号:' . ($orderInfo['order_id'] ?? ''),
|
||||
'balance' => (int)(($spreadUser['frozen_points'] ?? 0) + $points),
|
||||
'type' => 'integral',
|
||||
'title' => '推荐佣金',
|
||||
'pm' => 1,
|
||||
], (int)(($spreadUser['frozen_points'] ?? 0) + $points), $orderInfo['id'] ?? 0);
|
||||
$buyerUid = (int)($orderInfo['uid'] ?? 0);
|
||||
$orderId = (string)($orderInfo['order_id'] ?? '');
|
||||
if ($buyerUid <= 0 || $orderId === '') return;
|
||||
|
||||
/** @var PointsRewardServices $pointsServices */
|
||||
$pointsServices = app()->make(PointsRewardServices::class);
|
||||
$pointsServices->reward($buyerUid, $orderId);
|
||||
} catch (\Throwable $e) {
|
||||
// 积分发放失败不影响主流程
|
||||
\think\facade\Log::error('fsgx grantFrozenPointsByBrokerage error: ' . $e->getMessage());
|
||||
Log::error('fsgx grantFrozenPointsByBrokerage error: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user