76 行
2.9 KiB
PHP
76 行
2.9 KiB
PHP
<?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);
|
||
}
|
||
}
|
||
}
|