From cd73e761a8d5b7fdb08fbe66ff84322e904f2a68 Mon Sep 17 00:00:00 2001 From: chen Date: Sat, 26 Sep 2026 14:25:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(partner):=20=E4=BF=AE=E5=A4=8Dpaid=5Ftime?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=99=A8=E6=97=B6=E9=97=B4=E6=88=B3=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E5=B9=B6=E5=AE=8C=E5=96=84=E4=B8=8A=E7=BA=BF=E5=89=8D?= =?UTF-8?q?=E6=94=B6=E7=9B=8A=E7=BB=88=E5=AE=A1=E9=AA=8C=E6=94=B6=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addons/shopro/listener/Partner.php | 10 +++++++++- addons/shopro/service/partner/PartnerRewardService.php | 10 +++++++++- tests/partner/verify_full_order_rewards_and_settle.php | 7 ++++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/addons/shopro/listener/Partner.php b/addons/shopro/listener/Partner.php index cedd682..7922ad5 100644 --- a/addons/shopro/listener/Partner.php +++ b/addons/shopro/listener/Partner.php @@ -39,7 +39,15 @@ class Partner $userId = $order['user_id'] ?? ($params['user']['id'] ?? 0); if ($userId) { // 自购与直推订单双向保活(自购更新买家,直推更新一级推荐人) - $paidTime = !empty($order['paid_time']) ? intval($order['paid_time']) : time(); + $rawPaid = is_object($order) ? ($order->getData('paid_time') ?: $order['paid_time']) : ($order['paid_time'] ?? null); + if (is_numeric($rawPaid) && intval($rawPaid) > 100000000) { + $paidTime = intval($rawPaid); + } elseif (!empty($rawPaid)) { + $parsed = strtotime((string)$rawPaid); + $paidTime = ($parsed && $parsed > 100000000) ? $parsed : time(); + } else { + $paidTime = time(); + } $service->touchOrderTimes($userId, $paidTime); } Queue::push('\addons\shopro\job\PartnerSettle@order', [ diff --git a/addons/shopro/service/partner/PartnerRewardService.php b/addons/shopro/service/partner/PartnerRewardService.php index c5d28c3..b6812f4 100644 --- a/addons/shopro/service/partner/PartnerRewardService.php +++ b/addons/shopro/service/partner/PartnerRewardService.php @@ -36,7 +36,15 @@ class PartnerRewardService $buyerId = intval($order['user_id']); // 确保双向保活已更新(即使钩子丢失或补偿场景也能准确刷新) - $paidTime = !empty($order['paid_time']) ? intval($order['paid_time']) : time(); + $rawPaid = is_object($order) ? ($order->getData('paid_time') ?: $order['paid_time']) : ($order['paid_time'] ?? null); + if (is_numeric($rawPaid) && intval($rawPaid) > 100000000) { + $paidTime = intval($rawPaid); + } elseif (!empty($rawPaid)) { + $parsed = strtotime((string)$rawPaid); + $paidTime = ($parsed && $parsed > 100000000) ? $parsed : time(); + } else { + $paidTime = time(); + } $this->touchOrderTimes($buyerId, $paidTime); $active = new ActiveService(); diff --git a/tests/partner/verify_full_order_rewards_and_settle.php b/tests/partner/verify_full_order_rewards_and_settle.php index bb2f3ee..41a8f29 100644 --- a/tests/partner/verify_full_order_rewards_and_settle.php +++ b/tests/partner/verify_full_order_rewards_and_settle.php @@ -345,7 +345,8 @@ class FullOrderRewardVerification $this->assert($attached['days_remaining'] == 30, "买家 D 剩余天数满额显示 30 天 (实际: {$attached['days_remaining']})"); // 校验到期时间戳:订单支付时刻 + 30 * 86400 (方案 A 精确顺延) - $paidTimestamp = is_numeric($order->paid_time) ? intval($order->paid_time) : strtotime($order->paid_time); + $rawPaidOrder = is_object($order) ? ($order->getData('paid_time') ?: $order['paid_time']) : ($order['paid_time'] ?? null); + $paidTimestamp = (is_numeric($rawPaidOrder) && intval($rawPaidOrder) > 100000000) ? intval($rawPaidOrder) : strtotime((string)$rawPaidOrder); $expectedExpire = $paidTimestamp + 30 * 86400; $this->assert($attached['expire_time'] == $expectedExpire, "到期时间戳精确顺延720小时,绝无零点截断 (实际: {$attached['expire_time']}, 期望: {$expectedExpire})"); @@ -395,12 +396,12 @@ class FullOrderRewardVerification $this->assert(bccomp((string)$freshC['commission'], '0.00', 2) === 0, "推荐人 C commission 保持为 0.00,绝不走废弃钱包"); // 校验钱包流水日志 - $moneyLogC = Db::name('user_wallet_log') + $moneyLogC = Db::name('shopro_user_wallet_log') ->where('user_id', $chain['c']->id) ->where('wallet_type', 'money') ->order('id', 'desc') ->find(); - $this->assert($moneyLogC !== null && floatval($moneyLogC['wallet']) == 600.00, "生成对应的 money 变动流水: 变更 +600.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();