fix order item fail to save

This commit is contained in:
2026-02-02 15:13:46 +08:00
parent 033bebe11e
commit 39ef3acc1f
2 changed files with 85 additions and 25 deletions
+22 -15
View File
@@ -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()