Эх сурвалжийг харах

perf: 补货单创建/更新明细批量插入,消除 N 次逐条 INSERT

- ReplenishmentOrderItemMapper 新增 insertBatch 方法
- createOrder/updateOrder 使用 insertBatch 替代循环 insert
- 20 条明细从 20 次 INSERT 降为 1 次

Co-Authored-By: Claude <noreply@anthropic.com>
skyline 1 өдөр өмнө
parent
commit
0b38a447ec

+ 14 - 0
haha-mapper/src/main/java/com/haha/mapper/ReplenishmentOrderItemMapper.java

@@ -2,6 +2,7 @@ package com.haha.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.haha.entity.ReplenishmentOrderItem;
+import org.apache.ibatis.annotations.Insert;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
@@ -25,4 +26,17 @@ public interface ReplenishmentOrderItemMapper extends BaseMapper<ReplenishmentOr
      */
     @Select("DELETE FROM t_replenishment_order_item WHERE order_id = #{orderId}")
     void deleteByOrderId(@Param("orderId") Long orderId);
+
+    /**
+     * 批量插入明细
+     */
+    @Insert("<script>" +
+            "INSERT INTO t_replenishment_order_item (order_id, device_id, product_id, product_code, product_name, " +
+            "planned_quantity, unit_price, total_price, shelf_num, position, create_time) VALUES " +
+            "<foreach collection='list' item='item' separator=','>" +
+            "(#{item.orderId}, #{item.deviceId}, #{item.productId}, #{item.productCode}, #{item.productName}, " +
+            "#{item.plannedQuantity}, #{item.unitPrice}, #{item.totalPrice}, #{item.shelfNum}, #{item.position}, #{item.createTime})" +
+            "</foreach>" +
+            "</script>")
+    int insertBatch(@Param("list") List<ReplenishmentOrderItem> items);
 }

+ 9 - 2
haha-service/src/main/java/com/haha/service/impl/ReplenishmentOrderServiceImpl.java

@@ -193,10 +193,13 @@ public class ReplenishmentOrderServiceImpl extends ServiceImpl<ReplenishmentOrde
 
         save(order);
 
+        // 批量设置 orderId + 批量插入(1 次 INSERT 替代 N 次逐条)
         for (ReplenishmentOrderItem item : items) {
             item.setOrderId(order.getId());
             item.setCreateTime(LocalDateTime.now());
-            orderItemMapper.insert(item);
+        }
+        if (!items.isEmpty()) {
+            orderItemMapper.insertBatch(items);
         }
 
         log.info("创建补货单: orderNo={}, deviceId={}, items={}", order.getOrderNo(), dto.getDeviceId(), items.size());
@@ -236,6 +239,7 @@ public class ReplenishmentOrderServiceImpl extends ServiceImpl<ReplenishmentOrde
 
             int totalQuantity = 0;
             BigDecimal totalAmount = BigDecimal.ZERO;
+            List<ReplenishmentOrderItem> newItems = new ArrayList<>();
 
             for (ReplenishmentOrderCreateDTO.ReplenishmentOrderItemDTO itemDto : dto.getItems()) {
                 ReplenishmentOrderItem item = new ReplenishmentOrderItem();
@@ -257,7 +261,10 @@ public class ReplenishmentOrderServiceImpl extends ServiceImpl<ReplenishmentOrde
                 }
                 totalQuantity += itemDto.getPlannedQuantity();
                 item.setCreateTime(LocalDateTime.now());
-                orderItemMapper.insert(item);
+                newItems.add(item);
+            }
+            if (!newItems.isEmpty()) {
+                orderItemMapper.insertBatch(newItems);
             }
 
             order.setTotalQuantity(totalQuantity);