fix(hjf): 保单商品多份购买分润计算全链路修复
- 公排入队:按件数拆分为 N 条独立记录,每条单份金额,逐条触发退款检测 - 周期佣金:位次统计改为按报单商品总件数(cart_num 之和),而非订单数 - 分销等级任务:type 6/7 订单数统计改为按 cart_num 累计保单商品份数 - 推荐返佣与积分奖励:验证 cart_num 倍乘逻辑正确 Made-with: Cursor
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user