1. 整合交易流程:將 B600 (交易紀錄)、B601 (發票紀錄) 與 B602 (出貨紀錄) 整合為單一原子化的 MQTT 'finalize' 操作,確保資料一致性。 2. 實作非同步 Job:新增 ProcessTransactionFinalized Job 負責解析複合式 Payload 並寫入訂單、發票與出貨日誌。 3. 重構交易服務:更新 TransactionService 以支援同時處理訂單與發票資料,並修正產品 ID 驗證邏輯以避免外鍵衝突。 4. 更新技術文件:同步更新 api-docs.php 與 .agents/skills 中的 MQTT 規格,定義詳細的 finalize payload 結構與範例。 5. 優化文件 UI:改善 api-docs.blade.php 的描述渲染,支援換行符號以提升閱讀體驗。 6. 更新監聽指令:在 ListenMqttQueue 中加入 finalize 動作的處理分支並對接至新實作的 Job。
75 lines
2.1 KiB
PHP
75 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Jobs\Transaction;
|
|
|
|
use App\Models\Machine\Machine;
|
|
use App\Services\Transaction\TransactionService;
|
|
use Illuminate\Bus\Queueable;
|
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
use Illuminate\Foundation\Bus\Dispatchable;
|
|
use Illuminate\Queue\InteractsWithQueue;
|
|
use Illuminate\Queue\SerializesModels;
|
|
use Illuminate\Support\Facades\Log;
|
|
use App\Jobs\Machine\ProcessStateLog;
|
|
|
|
class ProcessTransactionFinalized implements ShouldQueue
|
|
{
|
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
|
|
|
protected $serialNo;
|
|
protected $payload;
|
|
|
|
/**
|
|
* Create a new job instance.
|
|
*/
|
|
public function __construct(string $serialNo, array $payload)
|
|
{
|
|
$this->serialNo = $serialNo;
|
|
$this->payload = $payload;
|
|
}
|
|
|
|
/**
|
|
* Execute the job.
|
|
*/
|
|
public function handle(TransactionService $transactionService): void
|
|
{
|
|
$machine = Machine::withoutGlobalScopes()->where('serial_no', $this->serialNo)->first();
|
|
|
|
if (!$machine) {
|
|
Log::warning("MQTT Transaction Finalized: Machine not found", ['serial_no' => $this->serialNo]);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
$data = $this->payload;
|
|
$data['serial_no'] = $this->serialNo;
|
|
|
|
$order = $transactionService->finalizeTransaction($data);
|
|
|
|
ProcessStateLog::dispatch(
|
|
$machine->id,
|
|
$machine->company_id,
|
|
"Transaction finalized: :id",
|
|
'info',
|
|
[
|
|
'id' => $order->order_no,
|
|
'flow_id' => $order->flow_id
|
|
],
|
|
'transaction'
|
|
);
|
|
|
|
Log::info("MQTT Transaction [finalize] processed successfully", [
|
|
'serial_no' => $this->serialNo,
|
|
'order_no' => $order->order_no
|
|
]);
|
|
|
|
} catch (\Exception $e) {
|
|
Log::error("Failed to process MQTT transaction finalized for machine {$this->serialNo}: " . $e->getMessage(), [
|
|
'payload' => $this->payload,
|
|
'exception' => $e
|
|
]);
|
|
throw $e;
|
|
}
|
|
}
|
|
}
|