diff --git a/addons/shopro/service/partner/PartnerRewardService.php b/addons/shopro/service/partner/PartnerRewardService.php index 06c1a99..aa57980 100644 --- a/addons/shopro/service/partner/PartnerRewardService.php +++ b/addons/shopro/service/partner/PartnerRewardService.php @@ -242,6 +242,15 @@ class PartnerRewardService protected function updateAgentOrderTime($userId, $timestamp) { $agent = AgentModel::where('user_id', $userId)->find(); + if (!$agent) { + try { + $agentService = new \addons\shopro\service\commission\Agent($userId); + $agent = $agentService->createNewAgent(); + } catch (\Throwable $e) {} + if (!$agent) { + $agent = AgentModel::where('user_id', $userId)->find(); + } + } if ($agent) { $current = intval($agent->last_self_order_time ?? 0); if ($timestamp >= $current) { diff --git a/tests/partner/verify_full_order_rewards_and_settle.php b/tests/partner/verify_full_order_rewards_and_settle.php index 31581bb..8d0a093 100644 --- a/tests/partner/verify_full_order_rewards_and_settle.php +++ b/tests/partner/verify_full_order_rewards_and_settle.php @@ -283,19 +283,31 @@ class FullOrderRewardVerification $this->assert($push3 !== null, "包含推三返一奖项"); if ($push3) { $this->assert($push3['user_id'] == $chain['c']->id, "推三返一受益人为直推人 C (#{$chain['c']->id})"); - $this->assert(floatval($push3['amount']) == 398.00, "推三返一第3单返还金额准确为 ¥398.00 (实际: ¥{$push3['amount']})"); + $this->assert(floatval($push3['amount']) == 600.00, "推三返一第3单返还金额准确为 ¥600.00 (实际: ¥{$push3['amount']})"); $this->assert($push3['status'] == 1, "推三返一状态为已入账 (status=1)"); } - // ② 验证酒道馆团队管理奖 (team_venue) + // ② 验证酒道馆团队管理奖 (team_venue) 及 平级奖 (venue_peer) $venueReward = $rewardMap['team_venue'][0] ?? null; $this->assert($venueReward !== null, "包含酒道馆团队管理奖"); if ($venueReward) { $this->assert(floatval($venueReward['amount']) == 50.00, "酒道馆管理奖金额为 ¥50.00 (实际: ¥{$venueReward['amount']})"); - $this->assert($venueReward['user_id'] == $chain['a']->id, "酒道馆受益人为链上最近酒道馆 A (#{$chain['a']->id})"); + $this->assert($venueReward['user_id'] == $chain['b']->id, "酒道馆受益人为链上最近酒道馆 B (#{$chain['b']->id})"); + } + $venuePeerReward = $rewardMap['venue_peer'][0] ?? null; + $this->assert($venuePeerReward !== null, "包含酒道馆平级奖 (上级同级酒道馆触发平级分润)"); + if ($venuePeerReward) { + $this->assert(floatval($venuePeerReward['amount']) == 5.00, "酒道馆第1代平级奖 50×10% = ¥5.00 (实际: ¥{$venuePeerReward['amount']})"); + $this->assert($venuePeerReward['user_id'] == $chain['a']->id, "酒道馆平级受益人为上级酒道馆 A (#{$chain['a']->id})"); } - // ③ 验证区县团队管理奖 (team_county) + // ③ 验证创客极差奖 (maker_diff) + $diffRewards = $rewardMap['maker_diff'] ?? []; + $this->assert(count($diffRewards) >= 2, "包含至少2级创客极差奖流水 (共 " . count($diffRewards) . " 笔)"); + $diffTotal = array_sum(array_column($diffRewards, 'amount')); + $this->assert($diffTotal == 100.00, "创客极差逐级瓜分总额准确为 ¥100.00 (40+60, 实际: ¥{$diffTotal})"); + + // ④ 验证区县团队管理奖 (team_county) $countyReward = $rewardMap['team_county'][0] ?? null; $this->assert($countyReward !== null, "包含区县团队管理奖"); if ($countyReward) { @@ -377,7 +389,7 @@ class FullOrderRewardVerification // 校验直推人 C $freshC = Db::name('user')->where('id', $chain['c']->id)->find(); $moneyDiffC = bcsub((string)$freshC['money'], (string)$this->chainBalances['c']['money'], 2); - $this->assert(bccomp($moneyDiffC, '398.00', 2) === 0, "推荐人 C 钱包余额 (money) 严格净增 398.00 元 (实际增加: {$moneyDiffC})"); + $this->assert(bccomp($moneyDiffC, '600.00', 2) === 0, "推荐人 C 钱包余额 (money) 严格净增 600.00 元 (实际增加: {$moneyDiffC})"); $this->assert(bccomp((string)$freshC['commission'], '0.00', 2) === 0, "推荐人 C commission 保持为 0.00,绝不走废弃钱包"); // 校验钱包流水日志 @@ -386,7 +398,7 @@ class FullOrderRewardVerification ->where('wallet_type', 'money') ->order('id', 'desc') ->find(); - $this->assert($moneyLogC !== null && floatval($moneyLogC['wallet']) == 398.00, "生成对应的 money 变动流水: 变更 +398.00, 备注: {$moneyLogC['memo']}"); + $this->assert($moneyLogC !== null && floatval($moneyLogC['wallet']) == 600.00, "生成对应的 money 变动流水: 变更 +600.00, 备注: {$moneyLogC['memo']}"); // 校验酒道馆/区县 A 的钱包增加 (50 + 50 + 均分) $freshA = Db::name('user')->where('id', $chain['a']->id)->find();