diff --git a/app/Console/Commands/HandleNotice.php b/app/Console/Commands/HandleNotice.php index 8565a0a..aea025a 100644 --- a/app/Console/Commands/HandleNotice.php +++ b/app/Console/Commands/HandleNotice.php @@ -44,12 +44,13 @@ public function __construct() public function handle(): int { $chunk = $this->argument('chunk'); - $this->line('开始消息队列'); + $this->info('开始消息队列'); $res = apiRequest::api('/Notic/getNotics', []); if (!$res['result'] || $res['errCode'] != '0000') { $this->error('request err: ' . $res['desc'] ?? ''); return 1; } + $count = 0; $arr = $res['data']['notice_list'] ?? []; $typeIds = array_flip(range(1, 5)); while ($items = array_splice($arr, 0, $chunk)) { @@ -74,7 +75,6 @@ public function handle(): int 'notice_id' => $id, 'notice_type' => $data[$id]['type'], 'raw_content' => json_encode($data[$id]), - 'err_message' => '', 'created_at' => $time, ]; if (isset($typeIds[$data[$id]['type']])) { @@ -92,7 +92,9 @@ public function handle(): int \App\Jobs\notice::dispatch($type, $item); Log::info('添加 type' . $type . '的队列', $item); } + $count += count($queue); } + $this->info('添加了' . $count . '条记录'); return 0; } } diff --git a/app/Jobs/notice.php b/app/Jobs/notice.php index ffeee54..5f59935 100644 --- a/app/Jobs/notice.php +++ b/app/Jobs/notice.php @@ -23,6 +23,17 @@ class notice implements ShouldQueue public Client $client; + /** + * 计算重试任务之前要等待的秒数 + * + * @return array + */ + public function backoff(): array + { + return [1, 5, 10]; + } + + /** * Create a new job instance. */ @@ -33,6 +44,14 @@ public function __construct(public int $type, public mixed $data) public string $goodsUrl; + /** + * 处理失败作业 + */ + public function failed(Throwable $exception): void + { + // 向用户发送失败通知等... + } + /** * Execute the job. * @throws GuzzleException @@ -40,22 +59,29 @@ public function __construct(public int $type, public mixed $data) */ public function handle(): void { - Log::info('开始执行type' . $this->type . ' 的队列'); - switch ($this->type) { - case 1: - $this->addGoods(); - break; - case 2: - - case 3: - $this->changeProductState(); - break; - case 4: - case 5: - $this->changePrice(); - break; + Log::info('===========================开始执行type' . $this->type . ' 的队列============================'); + try { + switch ($this->type) { + case 1: + $this->addGoods(); + break; + case 2: + $this->updateGoods(); + break; + case 3: + $this->changeProductState(); + break; + case 4: + case 5: + $this->changePrice(); + break; + } + Log::info('===========================执行完成================================'); + } catch (Throwable $throwable) { + $this->fail($throwable); + Log::info('===========================执行出错================================'); + throw $throwable; } - Log::info('执行完成'); } /** @@ -67,7 +93,6 @@ public function addGoods(): void { $goods = $goodsItems = $noticeIds = []; $this->client = new Client(); - $apiToken = env('API_TOKEN'); $now = date('Y-m-d H:i:s'); $good = new Good(); $goodsItem = new GoodsItem(); @@ -86,7 +111,6 @@ public function addGoods(): void continue; } $product = apiRequest::apis($this->goodsUrl, $this->client, [ - 'token' => $apiToken, 'itemId' => $item['result']['itemId'], ]); if ($product['errCode'] != '0000') { @@ -115,13 +139,49 @@ public function addGoods(): void } }); } catch (Throwable $throwable) { - \App\Models\Notice::query()->whereIn('notice_id', $noticeIds) - ->update(['err_message' => $throwable->getMessage()]); Log::error('添加商品失败', [$throwable->getMessage(), $throwable->getFile(), $throwable->getTrace()]); throw $throwable; } } + public function updateGoods(): void + { + $this->client = new Client(); + $itemIds = $goods = $noticeIdMapItemId = []; + foreach ($this->data as $item) { + $noticeIdMapItemId[$item['result']['itemId']] = $item['notice_id']; + $product = apiRequest::apis($this->goodsUrl, $this->client, [ + 'itemId' => $item['result']['itemId'], + ]); + if ($product['errCode'] != '0000') { + throw new Exception('request item ' . $item['item_id'] . ' err:' . $product['desc'] ?? ''); + } + $product = $product['data']['product']; + $goods[$product['itemId']] = $product; + $itemIds[] = $product['itemId']; + } + + DB::transaction(function () use ($goods, $itemIds, $noticeIdMapItemId) { + $items = Good::query()->whereIn('itemid', $itemIds)->with('good_item')->get(); + $notices = []; + foreach ($items as $item) { + $item->fill($goods[$item->itemId]); + if ($item->isDirty()) { + $item->save(); + } + $item->good_item->fill($goods[$item->itemId]); + if ($item->good_item->isDirty()) { + $item->good_item->save(); + } + $notices[] = $noticeIdMapItemId[$item->itemId]; + } + \App\Models\Notice::query()->whereIn('notice_id', $notices) + ->update(['state', 3]); + }); + + + } + /** * @throws Throwable */ @@ -132,17 +192,17 @@ public function changeProductState(): void $idss[] = $item['notice_id']; $ids[$item['result']['state']][] = $item['result']['itemId']; } + $now = date('Y-m-d H:i:s'); try { - DB::transaction(function () use ($ids, $idss) { + DB::transaction(function () use ($ids, $idss, $now) { foreach ($ids as $state => $item) { - Good::query()->whereIn('itemid', $item)->update(['state' => $state]); + Good::query()->whereIn('itemid', $item)->update(['state' => $state, 'updated_at' => $now]); } \App\Models\Notice::query()->whereIn('notice_id', $idss) ->update(['state' => 3]); }); } catch (Throwable $throwable) { - \App\Models\Notice::query()->whereIn('notice_id', $idss) - ->update(['err_message' => $throwable->getMessage()]); + Log::error('修改状态失败', [$throwable->getMessage(), $throwable->getFile(), $throwable->getTrace()]); throw $throwable; } } @@ -155,9 +215,11 @@ public function changePrice(): void $updateData = array_column($this->data, 'result'); $priceType = [4 => 'sell_price', 5 => 'settle_price']; $tablePriceType = [4 => 'market_price', 5 => 'settlement']; - $updateData = array_map(function ($item) use ($priceType, $tablePriceType) { + $now = date('Y-m-d H:i:s'); + $updateData = array_map(function ($item) use ($priceType, $tablePriceType, $now) { $item[$tablePriceType[$this->type]] = $item[$priceType[$this->type]]; unset($item[$priceType[$this->type]]); + $item['updated_at'] = $now; return $item; }, $updateData); $ids = array_column($this->data, 'notice_id'); @@ -168,11 +230,9 @@ public function changePrice(): void ->update(['state' => 3]); }); } catch (Throwable $throwable) { - \App\Models\Notice::query()->whereIn('notice_id', $updateData) - ->update(['err_message' => $throwable->getMessage()]); + Log::error('修改价格失败', [$throwable->getMessage(), $throwable->getFile(), $throwable->getTrace()]); throw $throwable; } - } } diff --git a/database/migrations/2024_05_24_033401_create_notices_table.php b/database/migrations/2024_05_24_033401_create_notices_table.php index 09e2845..4d304fd 100644 --- a/database/migrations/2024_05_24_033401_create_notices_table.php +++ b/database/migrations/2024_05_24_033401_create_notices_table.php @@ -18,7 +18,6 @@ public function up() $table->integer('notice_id')->unique()->comment('通知id'); $table->integer('notice_type')->comment('通知type'); $table->text('raw_content')->comment('原始消息内容'); - $table->text('err_message')->comment('处理时错误信息'); $table->tinyInteger('state')->default(1)->comment('消息状态,1待消费,2消费进行中,3处理完成'); $table->timestamps(); });