Jelajahi Sumber

生成订单时记录日志

lutong 2 bulan lalu
induk
melakukan
f9b2c3974a

+ 133 - 0
alien-dining/src/main/java/shop/alien/dining/service/impl/StoreOrderServiceImpl.java

@@ -292,6 +292,9 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
             orderDetailMapper.insert(detail);
         }
 
+        // 记录订单变更日志
+        recordOrderChangeLog(finalOrder.getId(), finalOrderNo, cart.getItems(), isUpdate ? 3 : 1, now, userId, userPhone);
+
         // 更新桌号的当前订单ID(如果是新订单才需要更新,更新订单时已经绑定了)
         if (!isUpdate) {
             table.setCurrentOrderId(finalOrder.getId());
@@ -469,7 +472,11 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         StoreOrderDetail existingDetail = orderDetailMapper.selectOne(detailWrapper);
 
         Date now = new Date();
+        Integer quantityBefore = 0; // 加餐前的数量(用于记录变更日志)
+        
         if (existingDetail != null) {
+            // 记录加餐前的数量
+            quantityBefore = existingDetail.getQuantity();
             // 更新数量
             existingDetail.setQuantity(existingDetail.getQuantity() + quantity);
             existingDetail.setSubtotalAmount(existingDetail.getUnitPrice()
@@ -487,6 +494,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
             orderDetailMapper.updateById(existingDetail);
         } else {
             // 添加新菜品(加餐)
+            quantityBefore = 0; // 新菜品,加餐前数量为0
             StoreOrderDetail detail = new StoreOrderDetail();
             detail.setOrderId(orderId);
             detail.setOrderNo(order.getOrderNo());
@@ -525,6 +533,24 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         order.setUpdatedUserId(userId);
         this.updateById(order);
 
+        // 记录加餐变更日志
+        List<shop.alien.entity.store.dto.CartItemDTO> addDishItems = new ArrayList<>();
+        shop.alien.entity.store.dto.CartItemDTO addDishItem = new shop.alien.entity.store.dto.CartItemDTO();
+        addDishItem.setCuisineId(cuisine.getId());
+        addDishItem.setCuisineName(cuisine.getName());
+        addDishItem.setCuisineType(cuisine.getCuisineType());
+        addDishItem.setCuisineImage(cuisine.getImages());
+        addDishItem.setUnitPrice(cuisine.getTotalPrice());
+        // 设置当前数量(加餐后的总数量)
+        addDishItem.setQuantity(quantityBefore + quantity);
+        // 设置已下单数量(加餐前的数量,用于计算变化)
+        addDishItem.setLockedQuantity(quantityBefore);
+        addDishItem.setSubtotalAmount(cuisine.getTotalPrice().multiply(BigDecimal.valueOf(quantity)));
+        addDishItem.setRemark(remark);
+        addDishItems.add(addDishItem);
+        
+        recordOrderChangeLog(orderId, order.getOrderNo(), addDishItems, 2, now, userId, userPhone);
+
         log.info("加餐成功, orderId={}", orderId);
         return order;
     }
@@ -951,6 +977,113 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
     }
 
     /**
+     * 记录订单变更日志
+     *
+     * @param orderId 订单ID
+     * @param orderNo 订单号
+     * @param items 商品列表
+     * @param operationType 操作类型(1:首次下单, 2:加餐, 3:更新订单)
+     * @param operationTime 操作时间
+     * @param userId 操作人ID
+     * @param userPhone 操作人手机号
+     */
+    private void recordOrderChangeLog(Integer orderId, String orderNo, List<shop.alien.entity.store.dto.CartItemDTO> items,
+                                      Integer operationType, Date operationTime, Integer userId, String userPhone) {
+        if (items == null || items.isEmpty()) {
+            log.warn("商品列表为空,不记录变更日志, orderId={}", orderId);
+            return;
+        }
+
+        // 生成批次号:ORDER{orderId}_{yyyyMMddHHmmss}
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+        String timestamp = sdf.format(operationTime);
+        String batchNo = "ORDER" + orderId + "_" + timestamp;
+
+        List<StoreOrderChangeLog> changeLogs = new ArrayList<>();
+
+        for (shop.alien.entity.store.dto.CartItemDTO item : items) {
+            Integer lockedQuantity = item.getLockedQuantity(); // 已下单数量
+            Integer currentQuantity = item.getQuantity(); // 当前数量
+            Integer quantityChange = 0; // 数量变化
+            Integer quantityBefore = 0; // 变化前数量
+            Integer quantityAfter = 0; // 变化后数量
+
+            if (operationType == 1) {
+                // 首次下单:记录所有商品
+                quantityBefore = 0;
+                quantityAfter = currentQuantity != null ? currentQuantity : 0;
+                quantityChange = quantityAfter;
+            } else if (operationType == 2) {
+                // 加餐:记录加餐的商品
+                quantityBefore = lockedQuantity != null ? lockedQuantity : 0;
+                quantityAfter = currentQuantity != null ? currentQuantity : 0;
+                quantityChange = quantityAfter - quantityBefore;
+            } else if (operationType == 3) {
+                // 更新订单:只记录新增的商品或数量增加的商品
+                if (lockedQuantity == null || lockedQuantity == 0) {
+                    // 新增商品
+                    quantityBefore = 0;
+                    quantityAfter = currentQuantity != null ? currentQuantity : 0;
+                    quantityChange = quantityAfter;
+                } else if (currentQuantity != null && currentQuantity > lockedQuantity) {
+                    // 数量增加
+                    quantityBefore = lockedQuantity;
+                    quantityAfter = currentQuantity;
+                    quantityChange = quantityAfter - quantityBefore;
+                } else {
+                    // 没有变化,跳过
+                    continue;
+                }
+            }
+
+            // 只记录有数量变化的商品
+            if (quantityChange == null || quantityChange == 0) {
+                continue;
+            }
+
+            // 计算金额变化
+            BigDecimal amountChange = item.getUnitPrice() != null
+                    ? item.getUnitPrice().multiply(BigDecimal.valueOf(quantityChange))
+                    : BigDecimal.ZERO;
+
+            StoreOrderChangeLog changeLog = new StoreOrderChangeLog();
+            changeLog.setOrderId(orderId);
+            changeLog.setOrderNo(orderNo);
+            changeLog.setBatchNo(batchNo);
+            changeLog.setOperationType(operationType);
+            changeLog.setCuisineId(item.getCuisineId());
+            changeLog.setCuisineName(item.getCuisineName());
+            changeLog.setCuisineType(item.getCuisineType());
+            changeLog.setCuisineImage(item.getCuisineImage());
+            changeLog.setUnitPrice(item.getUnitPrice());
+            changeLog.setQuantityChange(quantityChange);
+            changeLog.setQuantityBefore(quantityBefore);
+            changeLog.setQuantityAfter(quantityAfter);
+            changeLog.setAmountChange(amountChange);
+            changeLog.setOperationTime(operationTime);
+            changeLog.setOperatorUserId(userId);
+            changeLog.setOperatorUserPhone(userPhone);
+            changeLog.setRemark(item.getRemark());
+            changeLog.setCreatedUserId(userId);
+            changeLog.setCreatedTime(operationTime);
+            changeLog.setUpdatedTime(operationTime);
+
+            changeLogs.add(changeLog);
+        }
+
+        // 批量插入变更记录
+        if (!changeLogs.isEmpty()) {
+            for (StoreOrderChangeLog log : changeLogs) {
+                orderChangeLogMapper.insert(log);
+            }
+            log.info("记录订单变更日志完成, orderId={}, batchNo={}, operationType={}, itemCount={}",
+                    orderId, batchNo, operationType, changeLogs.size());
+        } else {
+            log.warn("没有需要记录的变更, orderId={}, operationType={}", orderId, operationType);
+        }
+    }
+
+    /**
      * 生成订单号
      */
     private String generateOrderNo() {