diff --git a/pro_v3.5.1/app/jobs/hjf/HjfOrderPayJob.php b/pro_v3.5.1/app/jobs/hjf/HjfOrderPayJob.php index 1555eb3a..d3fa42c7 100644 --- a/pro_v3.5.1/app/jobs/hjf/HjfOrderPayJob.php +++ b/pro_v3.5.1/app/jobs/hjf/HjfOrderPayJob.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace app\jobs\hjf; use app\services\agent\AgentLevelServices; -use app\services\hjf\PointsRewardServices; use app\services\hjf\QueuePoolServices; use app\services\user\UserServices; use crmeb\basic\BaseJobs; @@ -17,12 +16,14 @@ use think\facade\Log; * * 触发时机:Pay 监听器检测到 is_queue_goods=1 时派发。 * - * 执行流程(改造复用版): + * 执行流程: * 1. 调用 QueuePoolServices::enqueue() 将订单写入公排池 - * 2. 调用 PointsRewardServices::reward() 沿推荐链发放级差积分 - * 3. 调用 AgentLevelServices::checkUserLevelFinish() 检查升级 + * 2. 调用 AgentLevelServices::checkUserLevelFinish() 检查升级 * (复用 CRMEB 分销等级升级流程,已支持 HJF 任务类型 6/7/8) * + * 注意:积分奖励(直推/伞下)由 StoreOrderTakeServices::grantFrozenPointsByBrokerage + * 在佣金发放时同步调用 PointsRewardServices::reward(),不在此 Job 中重复执行。 + * * Class HjfOrderPayJob * @package app\jobs\hjf */ @@ -46,14 +47,8 @@ class HjfOrderPayJob extends BaseJobs return false; } - try { - /** @var PointsRewardServices $pointsServices */ - $pointsServices = app()->make(PointsRewardServices::class); - $pointsServices->reward($uid, $orderId); - Log::info("[HjfOrderPay] 积分奖励发放完成 uid={$uid} orderId={$orderId}"); - } catch (\Throwable $e) { - Log::error("[HjfOrderPay] 积分奖励失败 uid={$uid} orderId={$orderId}: " . $e->getMessage()); - } + // 注意:积分奖励(PointsRewardServices::reward)已由 StoreOrderTakeServices::grantFrozenPointsByBrokerage + // 在佣金发放时同步调用,此处不再重复调用,避免双重发放 frozen_points。 try { /** @var UserServices $userServices */ diff --git a/pro_v3.5.1/app/services/order/StoreOrderTakeServices.php b/pro_v3.5.1/app/services/order/StoreOrderTakeServices.php index d7884fcf..a2fd1824 100644 --- a/pro_v3.5.1/app/services/order/StoreOrderTakeServices.php +++ b/pro_v3.5.1/app/services/order/StoreOrderTakeServices.php @@ -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()); } }