文件
Henglianshutong/addons/shopro/job/PartnerSettle.php

76 行
2.9 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace addons\shopro\job;
use think\queue\Job;
use think\Db;
use think\exception\HttpResponseException;
use addons\shopro\service\partner\PartnerRewardService;
class PartnerSettle extends BaseJob
{
public function order(Job $job, $payload)
{
try {
$orderId = $payload['order_id'] ?? 0;
if ($orderId) {
Db::transaction(function () use ($orderId) {
(new PartnerRewardService())->settleOrder($orderId);
});
}
$job->delete();
} catch (HttpResponseException $e) {
$data = $e->getResponse()->getData();
$message = $data ? ($data['msg'] ?? '') : $e->getMessage();
format_log_error($e, 'PartnerSettle.HttpResponseException', $message);
$this->handleFailure($job, $orderId, $message);
} catch (\Throwable $e) {
$message = $e->getMessage();
format_log_error($e, 'PartnerSettle', $message);
$this->handleFailure($job, $orderId, $message);
}
}
/**
* 生产级失败与阶梯重试处理,达到上限时持久化标记到订单 ext 并写入告警
*/
protected function handleFailure(Job $job, $orderId, $errorMessage)
{
$attempts = $job->attempts();
$maxAttempts = 5;
if ($attempts >= $maxAttempts) {
\think\Log::record("[PartnerSettle CRITICAL] 订单 ID:{$orderId} 收益结算连续失败 {$attempts} 次已达上限: {$errorMessage}", 'error');
if ($orderId) {
try {
$freshOrder = Db::name('shopro_order')->where('id', $orderId)->find();
if ($freshOrder) {
$ext = is_array($freshOrder['ext']) ? $freshOrder['ext'] : (json_decode($freshOrder['ext'] ?? '', true) ?: []);
$ext['reward_settle_failed'] = 1;
$ext['reward_settle_error'] = mb_substr($errorMessage, 0, 500);
$ext['reward_settle_failed_time'] = time();
$ext['reward_settle_attempts'] = $attempts;
Db::name('shopro_order')->where('id', $orderId)->update([
'ext' => json_encode($ext, JSON_UNESCAPED_UNICODE),
]);
}
} catch (\Throwable $ex) {
\think\Log::record("[PartnerSettle] 记录订单 {$orderId} 结算失败标记异常: " . $ex->getMessage(), 'error');
}
}
$this->failed([
'job' => 'PartnerSettle@order',
'order_id' => $orderId,
'error' => $errorMessage,
'attempts' => $attempts,
'failed_time' => time(),
]);
$job->delete();
} else {
// 阶梯式延迟重试:5s, 10s, 15s, 20s
$delay = min(60, $attempts * 5);
$job->release($delay);
}
}
}