Browse Source

更新订单逻辑

lutong 1 month ago
parent
commit
3fa5f10898

+ 1 - 1
alien-dining/src/main/java/shop/alien/dining/controller/StoreOrderController.java

@@ -229,7 +229,7 @@ public class StoreOrderController {
         }
     }
 
-    @ApiOperation(value = "创建订单(下单)", notes = "从购物车创建订单,不立即支付")
+    @ApiOperation(value = "创建订单(下单)", notes = "从购物车创建订单,不立即支付。备注:创建/更新时传入,更新订单(加餐)时为覆盖")
     @PostMapping("/create")
     public R<shop.alien.entity.store.vo.OrderSuccessVO> createOrder(@Valid @RequestBody CreateOrderDTO dto) {
         log.info("StoreOrderController.createOrder?dto={}", dto);

+ 62 - 45
alien-dining/src/main/java/shop/alien/dining/service/impl/StoreOrderServiceImpl.java

@@ -186,7 +186,6 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         StoreOrder order = null;
         String orderNo = null;
         boolean isUpdate = false; // 是否是更新订单
-        boolean isFirstAddDish = false; // 是否是首次加餐(首次订单发生变化)
         
         // 检查桌号是否已绑定订单
         if (table.getCurrentOrderId() != null) {
@@ -199,15 +198,6 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
                 orderNo = order.getOrderNo(); // 使用原订单号
                 log.info("桌号已绑定订单,更新订单信息, orderId={}, orderNo={}", order.getId(), orderNo);
                 
-                // 在更新订单之前,检查订单明细中是否已经有 is_add_dish=1 的记录
-                // 如果没有,说明这是首次加餐(首次订单发生变化)
-                LambdaQueryWrapper<StoreOrderDetail> checkBeforeAddDishWrapper = new LambdaQueryWrapper<>();
-                checkBeforeAddDishWrapper.eq(StoreOrderDetail::getOrderId, order.getId())
-                        .eq(StoreOrderDetail::getDeleteFlag, 0)
-                        .eq(StoreOrderDetail::getIsAddDish, 1);
-                Integer addDishCountBefore = orderDetailMapper.selectCount(checkBeforeAddDishWrapper);
-                isFirstAddDish = (addDishCountBefore == null || addDishCountBefore == 0);
-                
                 // 更新订单信息(完全采用前端传参,不做金额校验)
                 order.setDinerCount(dto.getDinerCount());
                 order.setContactPhone(dto.getContactPhone());
@@ -283,7 +273,6 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         final StoreOrder finalOrder = order;
         final String finalOrderNo = orderNo;
         final boolean finalIsUpdate = isUpdate; // 用于 lambda 表达式
-        final boolean finalIsFirstAddDish = isFirstAddDish; // 用于后续判断
 
         // 更新优惠券使用记录状态为已下单
         if (dto.getCouponId() != null) {
@@ -391,21 +380,31 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         // 记录订单变更日志
         recordOrderChangeLog(finalOrder.getId(), finalOrderNo, cart.getItems(), finalIsUpdate ? 3 : 1, now, userId, userPhone);
 
-        // 更新桌号的当前订单ID和状态
+        // 更新桌号的当前订单ID和状态(显式用 LambdaUpdateWrapper 写入,避免 updateById 忽略更新)
+        // 约定:首次下单 → 餐桌状态=就餐中(1);后续下单(更新订单/加餐) → 餐桌状态=加餐(3)
+        Integer tableId = table.getId();
         if (!finalIsUpdate) {
-            // 新订单:设置订单ID,状态为就餐中(1)
-            table.setCurrentOrderId(finalOrder.getId());
-            table.setStatus(1); // 就餐中
-            storeTableMapper.updateById(table);
-        } else if (finalIsFirstAddDish) {
-            // 更新订单且是首次加餐:更新餐桌状态为加餐状态(3)
-            table.setStatus(3); // 加餐状态
-            table.setUpdatedTime(now);
+            // 首次下单:设置订单ID,餐桌状态为就餐中(1)
+            LambdaUpdateWrapper<StoreTable> newTableWrapper = new LambdaUpdateWrapper<>();
+            newTableWrapper.eq(StoreTable::getId, tableId)
+                    .set(StoreTable::getCurrentOrderId, finalOrder.getId())
+                    .set(StoreTable::getStatus, 1)
+                    .set(StoreTable::getUpdatedTime, now);
+            if (userId != null) {
+                newTableWrapper.set(StoreTable::getUpdatedUserId, userId);
+            }
+            storeTableMapper.update(null, newTableWrapper);
+        } else {
+            // 后续下单(更新订单/加餐):餐桌状态设为加餐(3)
+            LambdaUpdateWrapper<StoreTable> addDishTableWrapper = new LambdaUpdateWrapper<>();
+            addDishTableWrapper.eq(StoreTable::getId, tableId)
+                    .set(StoreTable::getStatus, 3)
+                    .set(StoreTable::getUpdatedTime, now);
             if (userId != null) {
-                table.setUpdatedUserId(userId);
+                addDishTableWrapper.set(StoreTable::getUpdatedUserId, userId);
             }
-            storeTableMapper.updateById(table);
-            log.info("首次加餐(通过更新订单),更新餐桌状态为加餐状态, tableId={}, orderId={}", table.getId(), finalOrder.getId());
+            storeTableMapper.update(null, addDishTableWrapper);
+            log.info("更新订单(加餐),设置餐桌状态为加餐, tableId={}, orderId={}", tableId, finalOrder.getId());
         }
 
         // 锁定购物车商品数量(禁止减少或删除已下单的商品)
@@ -544,20 +543,24 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         // 清除优惠券使用标记
         cartService.clearCouponUsed(order.getTableId());
 
-        // 更新桌号状态(检查购物车是否为空,如果为空则设为空闲并清空就餐人数)
-        StoreTable table = storeTableMapper.selectById(order.getTableId());
+        // 更新桌号状态:显式清空 currentOrderId(updateById 会忽略 null,必须用 LambdaUpdateWrapper)
+        Integer tableId = order.getTableId();
+        StoreTable table = storeTableMapper.selectById(tableId);
         if (table != null) {
-            table.setCurrentOrderId(null);
-            // 检查购物车是否为空,如果为空则设为空闲
-            CartDTO cart = cartService.getCart(order.getTableId());
+            LambdaUpdateWrapper<StoreTable> tableWrapper = new LambdaUpdateWrapper<>();
+            tableWrapper.eq(StoreTable::getId, tableId)
+                    .set(StoreTable::getCurrentOrderId, null)
+                    .set(StoreTable::getUpdatedTime, new Date());
+            CartDTO cart = cartService.getCart(tableId);
             if (cart.getItems() == null || cart.getItems().isEmpty()) {
-                table.setStatus(0); // 空闲
-                table.setDinerCount(null);
+                tableWrapper.set(StoreTable::getStatus, 0).set(StoreTable::getDinerCount, null);
             } else {
-                // 购物车还有商品,保持当前状态或设为就餐中
-                table.setStatus(1); // 就餐中
+                tableWrapper.set(StoreTable::getStatus, 1); // 就餐中
+            }
+            if (userId != null) {
+                tableWrapper.set(StoreTable::getUpdatedUserId, userId);
             }
-            storeTableMapper.updateById(table);
+            storeTableMapper.update(null, tableWrapper);
         }
 
         log.info("订单取消成功, orderId={}", orderId);
@@ -823,13 +826,20 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
 
         this.updateById(order);
 
-        // 更新桌号状态
-        StoreTable table = storeTableMapper.selectById(order.getTableId());
+        // 更新桌号状态:显式清空 currentOrderId(updateById 会忽略 null,必须用 LambdaUpdateWrapper)
+        Integer tableId = order.getTableId();
+        StoreTable table = storeTableMapper.selectById(tableId);
         if (table != null) {
-            table.setCurrentOrderId(null);
-            table.setStatus(0); // 空闲
-            table.setDinerCount(null);
-            storeTableMapper.updateById(table);
+            LambdaUpdateWrapper<StoreTable> tableWrapper = new LambdaUpdateWrapper<>();
+            tableWrapper.eq(StoreTable::getId, tableId)
+                    .set(StoreTable::getCurrentOrderId, null)
+                    .set(StoreTable::getStatus, 0)
+                    .set(StoreTable::getDinerCount, null)
+                    .set(StoreTable::getUpdatedTime, new Date());
+            if (userId != null) {
+                tableWrapper.set(StoreTable::getUpdatedUserId, userId);
+            }
+            storeTableMapper.update(null, tableWrapper);
         }
 
         log.info("订单完成成功, orderId={}", orderId);
@@ -857,13 +867,20 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
 
         this.updateById(order);
 
-        // 更新桌号状态
-        StoreTable table = storeTableMapper.selectById(order.getTableId());
+        // 更新桌号状态:显式清空 currentOrderId(updateById 会忽略 null,必须用 LambdaUpdateWrapper)
+        Integer tableId = order.getTableId();
+        StoreTable table = storeTableMapper.selectById(tableId);
         if (table != null) {
-            table.setCurrentOrderId(null);
-            table.setStatus(0); // 空闲
-            table.setDinerCount(null);
-            storeTableMapper.updateById(table);
+            LambdaUpdateWrapper<StoreTable> tableWrapper = new LambdaUpdateWrapper<>();
+            tableWrapper.eq(StoreTable::getId, tableId)
+                    .set(StoreTable::getCurrentOrderId, null)
+                    .set(StoreTable::getStatus, 0)
+                    .set(StoreTable::getDinerCount, null)
+                    .set(StoreTable::getUpdatedTime, new Date());
+            if (userId != null) {
+                tableWrapper.set(StoreTable::getUpdatedUserId, userId);
+            }
+            storeTableMapper.update(null, tableWrapper);
         }
 
         log.info("商家手动完成订单成功, orderId={}", orderId);

+ 1 - 1
alien-entity/src/main/java/shop/alien/entity/store/dto/CreateOrderDTO.java

@@ -41,7 +41,7 @@ public class CreateOrderDTO {
     @ApiModelProperty(value = "联系电话")
     private String contactPhone;
 
-    @ApiModelProperty(value = "备注(限30字)")
+    @ApiModelProperty(value = "备注(限30字)。创建/更新订单时传入;更新订单(加餐)时为覆盖,不拼接")
     private String remark;
 
     @ApiModelProperty(value = "是否立即支付(0:否,创建订单但不支付; 1:是,创建订单并支付)")