fix order item fail to save
This commit is contained in:
@@ -12,7 +12,6 @@ use Hyperf\Amqp\Message\ConsumerMessage;
|
||||
use Hyperf\Amqp\Result;
|
||||
use Hyperf\Amqp\Producer;
|
||||
use PhpAmqpLib\Message\AMQPMessage;
|
||||
use Hyperf\Di\Annotation\Inject;
|
||||
use Hyperf\DbConnection\Db;
|
||||
use App\Model\OrderItem;
|
||||
use Exception;
|
||||
@@ -186,6 +185,7 @@ class OrderConsumer extends ConsumerMessage
|
||||
|
||||
// 在数据库事务中尝试对 $entityMapResult 中的元素进行持久化,如果没有问题, 则返回 ACK,否则这是 NACK 且 回滚事务。
|
||||
return Result::ACK;
|
||||
|
||||
} catch (Throwable $error) {
|
||||
dump("=== Error Caught ===");
|
||||
dump("Error: " . $error->getMessage());
|
||||
@@ -322,6 +322,14 @@ class OrderConsumer extends ConsumerMessage
|
||||
*/
|
||||
protected function processOrderItems(array $items_by_platform_order_id): void
|
||||
{
|
||||
dump('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
|
||||
|
||||
dump('processOrderItems');
|
||||
dump($items_by_platform_order_id);
|
||||
|
||||
dump('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
|
||||
|
||||
|
||||
if (empty($items_by_platform_order_id)) {
|
||||
dump('No order items to process');
|
||||
return;
|
||||
@@ -331,16 +339,11 @@ class OrderConsumer extends ConsumerMessage
|
||||
$all_items_to_upsert = [];
|
||||
$item_sub_order_ids_by_platform_order_id = []; // 记录每个平台订单的新子项 ID 列表
|
||||
|
||||
foreach ($items_by_platform_order_id as $platform_order_id => $items) {
|
||||
$sub_order_ids = [];
|
||||
|
||||
foreach ($items as $item) {
|
||||
// order_id 已由 formatOrderItemsFromRaw 通过 idMapping 填充
|
||||
$all_items_to_upsert[] = $item;
|
||||
$sub_order_ids[] = $item['sub_order_id'];
|
||||
}
|
||||
|
||||
$item_sub_order_ids_by_platform_order_id[$platform_order_id] = $sub_order_ids;
|
||||
foreach ($items_by_platform_order_id as $item) {
|
||||
$platform_order_id = $item['platform_order_id'];
|
||||
// order_id 已由 formatOrderItemsFromRaw 通过 idMapping 填充
|
||||
$all_items_to_upsert[] = $item;
|
||||
$item_sub_order_ids_by_platform_order_id[$platform_order_id] = $item['sub_order_id'];
|
||||
}
|
||||
|
||||
if (empty($all_items_to_upsert)) {
|
||||
@@ -378,6 +381,7 @@ class OrderConsumer extends ConsumerMessage
|
||||
// 4. 批量删除不在新数据中的旧 OrderItem(完全同步策略)
|
||||
// 利用 hypertable 按 created_date 分区的特性,确保删除条件包含 created_date 以触发分区裁剪
|
||||
// 此部分业务应该很少被调用,订单子项新增或删减的情况很少见
|
||||
|
||||
$this->deleteObsoleteOrderItems($all_items_to_upsert);
|
||||
|
||||
dump("Order items processing completed");
|
||||
@@ -405,9 +409,10 @@ class OrderConsumer extends ConsumerMessage
|
||||
$new_item_keys = []; // 集合 B
|
||||
|
||||
foreach ($new_items as $item) {
|
||||
// 统一格式化为 Y-m-d H:i:s(不带时区),确保与数据库查询结果匹配
|
||||
$created_date = $item['created_date'] instanceof \DateTimeInterface
|
||||
? $item['created_date']->format('Y-m-d H:i:sP')
|
||||
: $item['created_date'];
|
||||
? $item['created_date']->format('Y-m-d H:i:s')
|
||||
: (new \DateTime($item['created_date']))->format('Y-m-d H:i:s');
|
||||
|
||||
// 订单级别的键(用于限定查询范围)
|
||||
$order_key = sprintf('%d|%s|%s', $item['store_id'], $item['platform_order_id'], $created_date);
|
||||
@@ -448,9 +453,10 @@ class OrderConsumer extends ConsumerMessage
|
||||
$created_dates_to_delete = [];
|
||||
|
||||
foreach ($existing_items as $existing) {
|
||||
// 统一格式化为 Y-m-d H:i:s(不带时区),与新数据保持一致
|
||||
$existing_created_date = $existing->created_date instanceof \DateTimeInterface
|
||||
? $existing->created_date->format('Y-m-d H:i:sP')
|
||||
: (string) $existing->created_date;
|
||||
? $existing->created_date->format('Y-m-d H:i:s')
|
||||
: (new \DateTime((string) $existing->created_date))->format('Y-m-d H:i:s');
|
||||
|
||||
$existing_key = sprintf(
|
||||
'%d|%s|%s|%s',
|
||||
@@ -467,6 +473,7 @@ class OrderConsumer extends ConsumerMessage
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 4. 批量删除(利用 hypertable 主键 (id, created_date) 进行高效删除)
|
||||
if (!empty($ids_to_delete)) {
|
||||
$deleted = OrderItem::query()
|
||||
|
||||
Reference in New Issue
Block a user