fix(hjf): 保单商品多份购买分润计算全链路修复

- 公排入队:按件数拆分为 N 条独立记录,每条单份金额,逐条触发退款检测
- 周期佣金:位次统计改为按报单商品总件数(cart_num 之和),而非订单数
- 分销等级任务:type 6/7 订单数统计改为按 cart_num 累计保单商品份数
- 推荐返佣与积分奖励:验证 cart_num 倍乘逻辑正确

Made-with: Cursor
This commit is contained in:
panchengyong
2026-04-06 02:40:01 +08:00
parent fb89fbbacb
commit 364d5333d7
4 changed files with 93 additions and 42 deletions

View File

@@ -34,11 +34,44 @@ class HjfOrderPayJob extends BaseJobs
public function doJob(int $uid, string $orderId, float $amount = 3600.00): bool
{
// 先查订单与购物车,计算报单商品总件数(公排入队 + 积分奖励共用)
$orderRow = Db::name('store_order')
->where('order_id', $orderId)
->where('is_queue_goods', 1)
->field('id,uid,is_queue_goods')
->find();
$queueQty = 1;
if ($orderRow) {
try {
$cartRows = Db::name('store_order_cart_info')
->where('oid', (int)$orderRow['id'])
->column('cart_info');
$qtySum = 0;
foreach ($cartRows as $row) {
$item = is_string($row) ? json_decode($row, true) : $row;
if (!empty($item['productInfo']['is_queue_goods'])) {
$qtySum += (int)($item['cart_num'] ?? 1);
}
}
if ($qtySum > 0) {
$queueQty = $qtySum;
}
} catch (\Throwable $qe) {
Log::warning("[HjfOrderPay] 计算报单商品数量异常使用默认值1: " . $qe->getMessage());
}
}
// PRD §3.1.2:一次购买多份时,拆分为多个独立记录分别进入公排池
$unitAmount = $queueQty > 1 ? round($amount / $queueQty, 2) : $amount;
try {
/** @var QueuePoolServices $queueServices */
$queueServices = app()->make(QueuePoolServices::class);
$queueServices->enqueue($uid, $orderId, $amount);
Log::info("[HjfOrderPay] 公排入队成功 uid={$uid} orderId={$orderId}");
for ($i = 0; $i < $queueQty; $i++) {
$subOrderId = $queueQty > 1 ? $orderId . '-' . ($i + 1) : $orderId;
$queueServices->enqueue($uid, $subOrderId, $unitAmount);
}
Log::info("[HjfOrderPay] 公排入队成功 uid={$uid} orderId={$orderId} qty={$queueQty} unitAmount={$unitAmount}");
} catch (ValidateException $e) {
Log::warning("[HjfOrderPay] 入队被锁,延迟重试 uid={$uid} orderId={$orderId}: " . $e->getMessage());
static::dispatchSece(5, [$uid, $orderId, $amount]);
@@ -77,40 +110,15 @@ class HjfOrderPayJob extends BaseJobs
}
// 等级升级完成后发放积分奖励(确保使用升级后的 agent_level
try {
$orderRow = Db::name('store_order')
->where('order_id', $orderId)
->where('is_queue_goods', 1)
->field('id,uid,is_queue_goods')
->find();
if ($orderRow) {
// fsgx B3计算订单中报单商品的总数量积分按数量倍乘
$queueQty = 1;
try {
$cartRows = Db::name('store_order_cart_info')
->where('oid', (int)$orderRow['id'])
->column('cart_info');
$qtySum = 0;
foreach ($cartRows as $row) {
$item = is_string($row) ? json_decode($row, true) : $row;
if (!empty($item['productInfo']['is_queue_goods'])) {
$qtySum += (int)($item['cart_num'] ?? 1);
}
}
if ($qtySum > 0) {
$queueQty = $qtySum;
}
} catch (\Throwable $qe) {
Log::warning("[HjfOrderPay] 计算报单商品数量异常使用默认值1: " . $qe->getMessage());
}
if ($orderRow) {
try {
/** @var PointsRewardServices $pointsService */
$pointsService = app()->make(PointsRewardServices::class);
$pointsService->reward($uid, $orderId, (int)$orderRow['id'], $preUpgradeLevels, $queueQty);
Log::info("[HjfOrderPay] 积分奖励发放完成 uid={$uid} orderId={$orderId} qty={$queueQty}");
} catch (\Throwable $e) {
Log::error("[HjfOrderPay] 积分奖励发放失败 uid={$uid} orderId={$orderId}: " . $e->getMessage());
}
} catch (\Throwable $e) {
Log::error("[HjfOrderPay] 积分奖励发放失败 uid={$uid} orderId={$orderId}: " . $e->getMessage());
}
return true;