100 lines
2.3 KiB
PHP
100 lines
2.3 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
declare(strict_types=1);
|
||
|
|
|
||
|
|
namespace App\Platform\Tmall\Producer;
|
||
|
|
|
||
|
|
use Hyperf\Amqp\Annotation\Producer;
|
||
|
|
use Hyperf\Amqp\Message\ProducerMessage;
|
||
|
|
|
||
|
|
#[Producer]
|
||
|
|
class OrderProducer extends ProducerMessage
|
||
|
|
{
|
||
|
|
/**
|
||
|
|
* Exchange 名称
|
||
|
|
*/
|
||
|
|
protected string $exchange = 'tmall.exchange';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Routing key
|
||
|
|
*/
|
||
|
|
protected string|array $routingKey = 'order.tmall';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* VHost
|
||
|
|
*/
|
||
|
|
protected string $vhost = 'dataflow';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 消息持久化
|
||
|
|
*/
|
||
|
|
protected array $properties = [
|
||
|
|
'delivery_mode' => 2, // 持久化消息
|
||
|
|
];
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 构造消息
|
||
|
|
*
|
||
|
|
* @param array $data 订单数据
|
||
|
|
* @return string
|
||
|
|
*/
|
||
|
|
public function __construct(array $data = [])
|
||
|
|
{
|
||
|
|
if (!empty($data)) {
|
||
|
|
$this->payload = $this->buildMessage($data);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 构建消息格式
|
||
|
|
*
|
||
|
|
* @param array $data 原始订单数据
|
||
|
|
* @return array
|
||
|
|
*/
|
||
|
|
protected function buildMessage(array $data): array
|
||
|
|
{
|
||
|
|
// 根据 RabbitMQ.md 中定义的消息格式规范
|
||
|
|
return [
|
||
|
|
'message_id' => $this->generateMessageId($data),
|
||
|
|
'timestamp' => date('c'), // ISO 8601 格式
|
||
|
|
'platform' => 'tmall',
|
||
|
|
'data_type' => 'order',
|
||
|
|
'metadata' => [
|
||
|
|
'platform_id' => $data['platform_id'] ?? null,
|
||
|
|
'company_id' => $data['company_id'] ?? null,
|
||
|
|
'store_id' => $data['store_id'] ?? null,
|
||
|
|
'source_system' => 'tmall-open-api',
|
||
|
|
'retry_count' => 0,
|
||
|
|
'data_version' => $data['data_version'] ?? time(),
|
||
|
|
],
|
||
|
|
'data' => $data['raw_data'],
|
||
|
|
];
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 生成消息ID
|
||
|
|
*
|
||
|
|
* 格式: {prefix}#{app_id}#{company_id}#{platform_id}#{store_id}#{entity_type}#{entity_id}
|
||
|
|
*
|
||
|
|
* @param array $data
|
||
|
|
* @return string
|
||
|
|
*/
|
||
|
|
protected function generateMessageId(array $data): string
|
||
|
|
{
|
||
|
|
$company_id = $data['company_id'];
|
||
|
|
$platform_id = $data['platform_id'];
|
||
|
|
$store_id = $data['store_id'];
|
||
|
|
$entity_type = 'order';
|
||
|
|
$unique_id = $data['unique_id'];
|
||
|
|
|
||
|
|
return sprintf(
|
||
|
|
'%s#%s#%s#%s#%s',
|
||
|
|
$company_id,
|
||
|
|
$platform_id,
|
||
|
|
$store_id,
|
||
|
|
$entity_type,
|
||
|
|
$unique_id
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|