add contract for order parse

This commit is contained in:
2026-03-05 09:47:22 +08:00
parent 947c868cd4
commit d93fdee203
5 changed files with 49 additions and 92 deletions
@@ -21,7 +21,7 @@ use InvalidArgumentException;
* Shopee 订单解析器
*
* 继承 AbstractOrderParse,实现 Shopee 平台特定的订单解析逻辑
* 实现 OrderContract 契约中定义的 parseOrderItems 方法
* 通过 AbstractOrderParse 自动满足 OrderContract 契约
*/
class Order extends AbstractOrderParse
{
@@ -110,11 +110,6 @@ class Order extends AbstractOrderParse
dump($record);
$_origin_order_item = $record['item_list']; // 'item_list' 为来自 shopee 原始数据的 订单子项信息
// 解析订单子项数据,传入 platform_order_id(实现 OrderContract 契约方法)
$order_items = $this->parseOrderItems($_origin_order_item, $record['order_sn']);
// 根据实际业务需求映射其他字段
// 映射每条原始数据到 Order Model 可用的数组格式
// @attention 此处业务决定了 电商平台数据 和 数据仓库 之间的映射关系
@@ -164,50 +159,6 @@ class Order extends AbstractOrderParse
});
}
/**
* 解析订单子项数据(实现 OrderContract 契约方法)
*
* Shopee API 文档:https://open.shopee.com/documents/v2/v2.order.get_order_detail?module=94&type=1
*
* @param array $order_items Shopee 原始订单子项数组
* @param string $platform_order_id 平台订单 ID (order_sn)
* @return array 解析后的订单子项数据数组
*/
public function parseOrderItems(array $order_items, string $platform_order_id): array
{
$parsed_items = [];
foreach ($order_items as $item) {
// 价格和数量
$original_price = (float)($item['model_original_price'] ?? 0);
$discounted_price = (float)($item['model_discounted_price'] ?? $original_price);
$quantity = (int)($item['model_quantity_purchased'] ?? 1);
// SKU: 优先使用 model_sku(变体SKU),如果为空则使用 item_sku(商品SKU
$sku = !empty($item['model_sku']) ? $item['model_sku'] : ($item['item_sku'] ?? '');
$parsed_items[] = [
'company_id' => $this->getCompany()->id,
'platform_id' => 25,
'store_id' => $this->getStore()->id,
'platform_order_id' => $platform_order_id, // 平台订单 ID(从 order_sn 传入)
'sub_order_id' => (string)$item['order_item_id'], // 使用 order_item_id 作为订单子项的唯一标识
'sub_order_type_id' => 0,
'product_id' => 0, // 需要根据 platform_product_id 匹配,暂设为 0
'platform_product_id' => (string)$item['item_id'], // Shopee 商品 ID
'product_sku' => $sku,
'product_barcode' => '',
'unit_price' => $discounted_price, // 实际成交单价(折扣后)
'quantity' => $quantity,
'discount' => ($original_price - $discounted_price) * $quantity, // 总折扣金额
'total' => $discounted_price * $quantity, // 总金额 = 折扣价 × 数量
'ext' => null, // 原始信息已在 Order.raw 中记录,此处留空
];
}
return $parsed_items;
}
/**
* 获取唯一键字段(对应数据库唯一索引)
*
@@ -500,10 +451,10 @@ class Order extends AbstractOrderParse
'product_sku' => $item['model_sku'] ?? $item['item_sku'] ?? null,
// @attention @TODO 需要对 运营侧的产品维护做进一步规范
'product_barcode' => null,
'unit_price' => $item['model_original_price'],
'quantity' => $item['model_quantity_purchased'],
'discount' => $item['model_original_price'] - $item['model_quantity_purchased'] ?? 0,
'total' => $item['model_quantity_purchased'],
'unit_price' => (float)($item['model_discounted_price'] ?? $item['model_original_price'] ?? 0),
'quantity' => (int)($item['model_quantity_purchased'] ?? 1),
'discount' => ((float)($item['model_original_price'] ?? 0) - (float)($item['model_discounted_price'] ?? $item['model_original_price'] ?? 0)) * (int)($item['model_quantity_purchased'] ?? 1),
'total' => (float)($item['model_discounted_price'] ?? $item['model_original_price'] ?? 0) * (int)($item['model_quantity_purchased'] ?? 1),
// @attention 扩展字段,用来存储其他信息
'ext' => null,
'created_date' => $parent_order_created_date,