Przeglądaj źródła

Merge remote-tracking branch 'origin/sit-new-checkstand' into sit-new-checkstand

# Conflicts:
#	alien-entity/src/main/java/shop/alien/entity/store/vo/StoreBookingTableVo.java
刘云鑫 2 tygodni temu
rodzic
commit
d32f5c628f
100 zmienionych plików z 1860 dodań i 4461 usunięć
  1. 0 17
      alien-dining/doc/wechat-store-tables-ddl.sql
  2. 10 10
      alien-dining/src/main/java/shop/alien/dining/config/CartWebSocketProcess.java
  3. 25 6
      alien-dining/src/main/java/shop/alien/dining/controller/DiningController.java
  4. 1 1
      alien-dining/src/main/java/shop/alien/dining/controller/PaymentController.java
  5. 15 15
      alien-dining/src/main/java/shop/alien/dining/controller/StoreInfoController.java
  6. 56 58
      alien-dining/src/main/java/shop/alien/dining/controller/StoreOrderController.java
  7. 11 11
      alien-dining/src/main/java/shop/alien/dining/service/CartService.java
  8. 2 2
      alien-dining/src/main/java/shop/alien/dining/service/DiningService.java
  9. 14 0
      alien-dining/src/main/java/shop/alien/dining/service/DiningWalkInReservationService.java
  10. 10 10
      alien-dining/src/main/java/shop/alien/dining/service/StoreInfoService.java
  11. 19 21
      alien-dining/src/main/java/shop/alien/dining/service/StoreOrderService.java
  12. 147 147
      alien-dining/src/main/java/shop/alien/dining/service/impl/CartServiceImpl.java
  13. 67 71
      alien-dining/src/main/java/shop/alien/dining/service/impl/DiningServiceImpl.java
  14. 101 0
      alien-dining/src/main/java/shop/alien/dining/service/impl/DiningWalkInReservationServiceImpl.java
  15. 2 2
      alien-dining/src/main/java/shop/alien/dining/service/impl/OrderLockServiceImpl.java
  16. 59 59
      alien-dining/src/main/java/shop/alien/dining/service/impl/StoreInfoServiceImpl.java
  17. 256 245
      alien-dining/src/main/java/shop/alien/dining/service/impl/StoreOrderServiceImpl.java
  18. 1 1
      alien-dining/src/main/java/shop/alien/dining/strategy/payment/PaymentStrategy.java
  19. 27 27
      alien-dining/src/main/java/shop/alien/dining/strategy/payment/impl/WeChatPaymentMininProgramStrategyImpl.java
  20. 4 0
      alien-entity/src/main/java/shop/alien/entity/store/StoreOrder.java
  21. 4 0
      alien-entity/src/main/java/shop/alien/entity/store/StorePrice.java
  22. 8 0
      alien-entity/src/main/java/shop/alien/entity/store/StoreTable.java
  23. 1 1
      alien-entity/src/main/java/shop/alien/entity/store/UserReservation.java
  24. 3 0
      alien-entity/src/main/java/shop/alien/entity/store/dto/CreateOrderDTO.java
  25. 54 0
      alien-entity/src/main/java/shop/alien/entity/store/dto/DiningWalkInReservationDTO.java
  26. 3 0
      alien-entity/src/main/java/shop/alien/entity/store/dto/StoreBookingTableBatchDTO.java
  27. 1 1
      alien-entity/src/main/java/shop/alien/entity/store/dto/UserReservationDTO.java
  28. 0 32
      alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatAddCartItemDTO.java
  29. 0 34
      alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatCartDTO.java
  30. 0 51
      alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatCartItemDTO.java
  31. 0 26
      alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatChangeTableDTO.java
  32. 0 47
      alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatCreateOrderDTO.java
  33. 0 23
      alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatStoreInfoWithHomepageCuisinesDTO.java
  34. 0 22
      alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatUpdateOrderCouponDTO.java
  35. 3 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/OrderDetailWithChangeLogVO.java
  36. 3 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/OrderInfoVO.java
  37. 10 1
      alien-entity/src/main/java/shop/alien/entity/store/vo/StoreBookingTableVo.java
  38. 41 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/StoreProductSelectVo.java
  39. 1 1
      alien-entity/src/main/java/shop/alien/entity/store/vo/StoreReservationListVo.java
  40. 1 1
      alien-entity/src/main/java/shop/alien/entity/store/vo/UserReservationVo.java
  41. 0 30
      alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatCategoryWithCuisinesVO.java
  42. 0 50
      alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderChangeLogBatchVO.java
  43. 0 48
      alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderChangeLogItemVO.java
  44. 0 66
      alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderConfirmVO.java
  45. 0 33
      alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderCuisineItemVO.java
  46. 0 74
      alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderDetailWithChangeLogVO.java
  47. 0 105
      alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderInfoVO.java
  48. 0 65
      alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderSettlementVO.java
  49. 0 31
      alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderSuccessVO.java
  50. 0 25
      alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatStoreOrderPageVO.java
  51. 0 99
      alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreCart.java
  52. 0 88
      alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreCouponUsage.java
  53. 0 143
      alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreCuisine.java
  54. 0 66
      alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreCuisineCategory.java
  55. 0 69
      alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreCuisineCombo.java
  56. 0 141
      alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreOrder.java
  57. 0 120
      alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreOrderChangeLog.java
  58. 0 108
      alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreOrderDetail.java
  59. 0 76
      alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreOrderLock.java
  60. 0 177
      alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStorePaymentConfig.java
  61. 0 98
      alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreTable.java
  62. 0 78
      alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreTableLog.java
  63. 1 1
      alien-entity/src/main/java/shop/alien/mapper/StoreReservationMapper.java
  64. 1 1
      alien-entity/src/main/java/shop/alien/mapper/UserReservationMapper.java
  65. 0 10
      alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreCartMapper.java
  66. 0 10
      alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreCouponUsageMapper.java
  67. 0 10
      alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreCuisineCategoryMapper.java
  68. 0 10
      alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreCuisineComboMapper.java
  69. 0 10
      alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreCuisineMapper.java
  70. 0 10
      alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreOrderChangeLogMapper.java
  71. 0 10
      alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreOrderDetailMapper.java
  72. 0 10
      alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreOrderLockMapper.java
  73. 0 10
      alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreOrderMapper.java
  74. 0 10
      alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStorePaymentConfigMapper.java
  75. 0 10
      alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreTableLogMapper.java
  76. 0 10
      alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreTableMapper.java
  77. 2 1
      alien-entity/src/main/resources/mapper/StoreBookingTableMapper.xml
  78. 1 0
      alien-entity/src/main/resources/mapper/StoreReservationMapper.xml
  79. 1 0
      alien-entity/src/main/resources/mapper/UserReservationMapper.xml
  80. 31 0
      alien-job/src/main/java/shop/alien/job/store/ReservationDiningFinishedDelayJob.java
  81. 158 0
      alien-job/src/main/java/shop/alien/job/store/ReservationDiningFinishedDelayService.java
  82. 1 1
      alien-job/src/main/java/shop/alien/job/store/ReservationTimeoutJob.java
  83. 0 26
      alien-store/src/main/java/shop/alien/store/annotation/OperationLog.java
  84. 0 22
      alien-store/src/main/java/shop/alien/store/aspect/DiningOperationLogAspect.java
  85. 0 48
      alien-store/src/main/java/shop/alien/store/controller/DiningCollectController.java
  86. 0 307
      alien-store/src/main/java/shop/alien/store/controller/DiningController.java
  87. 0 188
      alien-store/src/main/java/shop/alien/store/controller/DiningCouponController.java
  88. 0 60
      alien-store/src/main/java/shop/alien/store/controller/DiningFileUploadController.java
  89. 57 59
      alien-store/src/main/java/shop/alien/store/controller/DiningServiceController.java
  90. 0 188
      alien-store/src/main/java/shop/alien/store/controller/DiningUserController.java
  91. 38 4
      alien-store/src/main/java/shop/alien/store/controller/PaymentController.java
  92. 9 1
      alien-store/src/main/java/shop/alien/store/controller/StoreBookingTableController.java
  93. 0 108
      alien-store/src/main/java/shop/alien/store/controller/StoreInfoController.java
  94. 0 578
      alien-store/src/main/java/shop/alien/store/controller/StoreOrderController.java
  95. 98 7
      alien-store/src/main/java/shop/alien/store/controller/StoreProductDiscountController.java
  96. 25 5
      alien-store/src/main/java/shop/alien/store/controller/StoreReservationController.java
  97. 4 3
      alien-store/src/main/java/shop/alien/store/controller/StoreServiceFeeRuleController.java
  98. 149 0
      alien-store/src/main/java/shop/alien/store/controller/dining/DiningCouponPathProxyController.java
  99. 116 0
      alien-store/src/main/java/shop/alien/store/controller/dining/DiningUserPathProxyController.java
  100. 208 0
      alien-store/src/main/java/shop/alien/store/controller/dining/StoreDiningPathProxyController.java

+ 0 - 17
alien-dining/doc/wechat-store-tables-ddl.sql

@@ -1,17 +0,0 @@
--- 小程序点餐专用表:与 APP 共库不同表,除用户/门店主数据(store_info)/优惠券定义外独立维护。
--- MySQL 5.7+:CREATE TABLE ... LIKE 复制列定义与索引;请在低峰执行并做好备份。
-
-CREATE TABLE IF NOT EXISTS wechat_store_table LIKE store_table;
-CREATE TABLE IF NOT EXISTS wechat_store_cuisine LIKE store_cuisine;
-CREATE TABLE IF NOT EXISTS wechat_store_cuisine_category LIKE store_cuisine_category;
-CREATE TABLE IF NOT EXISTS wechat_store_cuisine_combo LIKE store_cuisine_combo;
-CREATE TABLE IF NOT EXISTS wechat_store_cart LIKE store_cart;
-CREATE TABLE IF NOT EXISTS wechat_store_order LIKE store_order;
-CREATE TABLE IF NOT EXISTS wechat_store_order_detail LIKE store_order_detail;
-CREATE TABLE IF NOT EXISTS wechat_store_order_lock LIKE store_order_lock;
-CREATE TABLE IF NOT EXISTS wechat_store_table_log LIKE store_table_log;
-CREATE TABLE IF NOT EXISTS wechat_store_order_change_log LIKE store_order_change_log;
-CREATE TABLE IF NOT EXISTS wechat_store_coupon_usage LIKE store_coupon_usage;
-CREATE TABLE IF NOT EXISTS wechat_store_payment_config LIKE store_payment_config;
-
--- 上线后需将小程序侧菜单/桌台等基础数据同步或录入到 wechat_* 表(与 APP 侧无数据互通)。

+ 10 - 10
alien-dining/src/main/java/shop/alien/dining/config/CartWebSocketProcess.java

@@ -7,8 +7,8 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.stereotype.Component;
 import shop.alien.dining.service.CartService;
-import shop.alien.entity.store.dto.wechat.WechatAddCartItemDTO;
-import shop.alien.entity.store.dto.wechat.WechatCartDTO;
+import shop.alien.entity.store.dto.AddCartItemDTO;
+import shop.alien.entity.store.dto.CartDTO;
 
 import javax.websocket.*;
 import javax.websocket.server.PathParam;
@@ -79,7 +79,7 @@ public class CartWebSocketProcess implements ApplicationContextAware {
 
             // 发送当前购物车数据
             try {
-                WechatCartDTO cart = cartService.getCart(tableId);
+                CartDTO cart = cartService.getCart(tableId);
                 sendMessage(createMessage("cart_update", "购物车数据", cart));
             } catch (Exception e) {
                 log.error("获取购物车数据失败, tableId={}", tableId, e);
@@ -178,14 +178,14 @@ public class CartWebSocketProcess implements ApplicationContextAware {
                 return;
             }
 
-            WechatAddCartItemDTO dto = new WechatAddCartItemDTO();
+            AddCartItemDTO dto = new AddCartItemDTO();
             dto.setTableId(tableId);
             dto.setCuisineId(data.getInteger("cuisineId"));
             dto.setQuantity(data.getInteger("quantity"));
             dto.setRemark(data.getString("remark"));
 
             // 调用服务添加商品
-            WechatCartDTO cart = cartService.addItem(dto);
+            CartDTO cart = cartService.addItem(dto);
 
             // 推送更新给该桌号的所有连接
             pushCartUpdateToAll(tableId, cart);
@@ -219,7 +219,7 @@ public class CartWebSocketProcess implements ApplicationContextAware {
             }
 
             // 调用服务更新数量
-            WechatCartDTO cart = cartService.updateItemQuantity(tableId, cuisineId, quantity);
+            CartDTO cart = cartService.updateItemQuantity(tableId, cuisineId, quantity);
 
             // 推送更新给该桌号的所有连接
             pushCartUpdateToAll(tableId, cart);
@@ -251,7 +251,7 @@ public class CartWebSocketProcess implements ApplicationContextAware {
             }
 
             // 调用服务删除商品
-            WechatCartDTO cart = cartService.removeItem(tableId, cuisineId);
+            CartDTO cart = cartService.removeItem(tableId, cuisineId);
 
             // 推送更新给该桌号的所有连接
             pushCartUpdateToAll(tableId, cart);
@@ -274,7 +274,7 @@ public class CartWebSocketProcess implements ApplicationContextAware {
             cartService.clearCart(tableId);
 
             // 创建空的购物车对象
-            WechatCartDTO cart = new WechatCartDTO();
+            CartDTO cart = new CartDTO();
             cart.setTableId(tableId);
             cart.setItems(java.util.Collections.emptyList());
             cart.setTotalAmount(java.math.BigDecimal.ZERO);
@@ -295,7 +295,7 @@ public class CartWebSocketProcess implements ApplicationContextAware {
     /**
      * 推送购物车更新给该桌号的所有连接
      */
-    private void pushCartUpdateToAll(Integer tableId, WechatCartDTO cart) {
+    private void pushCartUpdateToAll(Integer tableId, CartDTO cart) {
         ConcurrentHashMap<String, CartWebSocketProcess> tableConnections = connections.get(tableId);
         if (tableConnections != null && !tableConnections.isEmpty()) {
             tableConnections.forEach((connId, ws) -> {
@@ -359,7 +359,7 @@ public class CartWebSocketProcess implements ApplicationContextAware {
     /**
      * 静态方法:推送购物车更新(供外部调用,如HTTP接口)
      */
-    public static void pushCartUpdate(Integer tableId, WechatCartDTO cart) {
+    public static void pushCartUpdate(Integer tableId, CartDTO cart) {
         ConcurrentHashMap<String, CartWebSocketProcess> tableConnections = connections.get(tableId);
         if (tableConnections != null && !tableConnections.isEmpty()) {
             String message = createStaticMessage("cart_update", "购物车更新", cart);

+ 25 - 6
alien-dining/src/main/java/shop/alien/dining/controller/DiningController.java

@@ -6,13 +6,14 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
+import shop.alien.entity.store.dto.DiningWalkInReservationDTO;
 import shop.alien.entity.store.vo.TableDiningStatusVO;
 import shop.alien.entity.store.vo.*;
-import shop.alien.entity.store.vo.wechat.WechatOrderConfirmVO;
-import shop.alien.entity.store.vo.wechat.WechatOrderSettlementVO;
 import shop.alien.dining.service.DiningService;
+import shop.alien.dining.service.DiningWalkInReservationService;
 import shop.alien.dining.util.TokenUtil;
 
+import javax.validation.Valid;
 import java.util.List;
 
 /**
@@ -30,6 +31,24 @@ import java.util.List;
 public class DiningController {
 
     private final DiningService diningService;
+    private final DiningWalkInReservationService diningWalkInReservationService;
+
+    @ApiOperation(value = "提交到店就餐信息", notes = "选完人数并填写姓名/电话/时段后调用:写入 user_reservation,状态为已到店(2),并关联当前桌;返回预约ID,下单时 CreateOrderDTO.userReservationId 传入该值")
+    @PostMapping("/walk-in/reservation")
+    public R<Integer> createWalkInReservation(@Valid @RequestBody DiningWalkInReservationDTO dto) {
+        log.info("DiningController.createWalkInReservation?tableId={}", dto != null ? dto.getTableId() : null);
+        try {
+            Integer userId = TokenUtil.getCurrentUserId();
+            if (userId == null) {
+                return R.fail("用户未登录");
+            }
+            Integer id = diningWalkInReservationService.createWalkInReservation(dto, userId);
+            return R.data(id);
+        } catch (Exception e) {
+            log.error("提交到店就餐信息失败: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
 
     @ApiOperation(value = "查询餐桌是否处于就餐中", notes = "免登录可调用,用于前端判断是否跳过选择用餐人数。就餐中(status=1)、加餐(status=3) 均视为就餐状态,且 diner_count 有值 时 inDining=true")
     @GetMapping("/table-dining-status")
@@ -169,7 +188,7 @@ public class DiningController {
 
     @ApiOperation(value = "获取订单确认页面信息", notes = "获取订单确认页面的所有信息")
     @GetMapping("/order/confirm")
-    public R<WechatOrderConfirmVO> getOrderConfirmInfo(
+    public R<OrderConfirmVO> getOrderConfirmInfo(
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
             @ApiParam(value = "就餐人数", required = true) @RequestParam Integer dinerCount) {
         log.info("DiningController.getOrderConfirmInfo?tableId={}, dinerCount={}", tableId, dinerCount);
@@ -179,7 +198,7 @@ public class DiningController {
             if (userId == null) {
                 return R.fail("用户未登录");
             }
-            WechatOrderConfirmVO vo = diningService.getOrderConfirmInfo(tableId, dinerCount, userId);
+            OrderConfirmVO vo = diningService.getOrderConfirmInfo(tableId, dinerCount, userId);
             return R.data(vo);
         } catch (Exception e) {
             log.error("获取订单确认页面信息失败: {}", e.getMessage(), e);
@@ -249,7 +268,7 @@ public class DiningController {
 
     @ApiOperation(value = "获取订单结算确认页面信息", notes = "获取订单结算确认页面的所有信息")
     @GetMapping("/order/settlement")
-    public R<WechatOrderSettlementVO> getOrderSettlementInfo(
+    public R<shop.alien.entity.store.vo.OrderSettlementVO> getOrderSettlementInfo(
             @ApiParam(value = "订单ID", required = true) @RequestParam Integer orderId) {
         log.info("DiningController.getOrderSettlementInfo?orderId={}", orderId);
         try {
@@ -258,7 +277,7 @@ public class DiningController {
             if (userId == null) {
                 return R.fail("用户未登录");
             }
-            WechatOrderSettlementVO vo = diningService.getOrderSettlementInfo(orderId, userId);
+            shop.alien.entity.store.vo.OrderSettlementVO vo = diningService.getOrderSettlementInfo(orderId, userId);
             return R.data(vo);
         } catch (Exception e) {
             log.error("获取订单结算确认页面信息失败: {}", e.getMessage(), e);

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

@@ -44,7 +44,7 @@ public class PaymentController {
             @ApiImplicitParam(name = "payType", value = "支付类型(alipay:支付宝, wechatPay:微信支付)", required = true, paramType = "query", dataType = "String"),
             @ApiImplicitParam(name = "payer", value = "支付用户", required = true, paramType = "query", dataType = "String"),
             @ApiImplicitParam(name = "orderNo", value = "订单号", required = true, paramType = "query", dataType = "String"),
-            @ApiImplicitParam(name = "storeId", value = "店铺ID,用于从 MySQL 获取该店铺支付配置(WechatStorePaymentConfig)", required = true, paramType = "query", dataType = "Integer"),
+            @ApiImplicitParam(name = "storeId", value = "店铺ID,用于从 MySQL 获取该店铺支付配置(StorePaymentConfig)", required = true, paramType = "query", dataType = "Integer"),
             @ApiImplicitParam(name ="couponId", value = "优惠券Id"),
             @ApiImplicitParam(name = "payerId", value = "payerId"),
             @ApiImplicitParam(name = "tablewareFee", value = "餐具费"),

+ 15 - 15
alien-dining/src/main/java/shop/alien/dining/controller/StoreInfoController.java

@@ -5,11 +5,11 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
-import shop.alien.entity.store.wechat.WechatStoreCuisine;
-import shop.alien.entity.store.wechat.WechatStoreCuisineCategory;
-import shop.alien.entity.store.wechat.WechatStoreTable;
-import shop.alien.entity.store.dto.wechat.WechatStoreInfoWithHomepageCuisinesDTO;
-import shop.alien.entity.store.vo.wechat.WechatCategoryWithCuisinesVO;
+import shop.alien.entity.store.StoreCuisine;
+import shop.alien.entity.store.StoreCuisineCategory;
+import shop.alien.entity.store.StoreTable;
+import shop.alien.entity.store.dto.StoreInfoWithHomepageCuisinesDTO;
+import shop.alien.entity.store.vo.CategoryWithCuisinesVO;
 import shop.alien.dining.service.StoreInfoService;
 
 import java.util.List;
@@ -32,14 +32,14 @@ public class StoreInfoController {
 
     @ApiOperation(value = "根据门店ID查询桌号列表", notes = "查询指定门店下的所有桌号")
     @GetMapping("/tables")
-    public R<List<WechatStoreTable>> getTablesByStoreId(
+    public R<List<StoreTable>> getTablesByStoreId(
             @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId) {
         log.info("StoreInfoController.getTablesByStoreId?storeId={}", storeId);
         try {
             if (storeId == null) {
                 return R.fail("门店ID不能为空");
             }
-            List<WechatStoreTable> tables = storeInfoService.getTablesByStoreId(storeId);
+            List<StoreTable> tables = storeInfoService.getTablesByStoreId(storeId);
             return R.data(tables);
         } catch (Exception e) {
             log.error("查询桌号列表失败: {}", e.getMessage(), e);
@@ -49,14 +49,14 @@ public class StoreInfoController {
 
     @ApiOperation(value = "根据门店ID查询菜品种类列表", notes = "查询指定门店下的所有菜品种类")
     @GetMapping("/categories")
-    public R<List<WechatStoreCuisineCategory>> getCategoriesByStoreId(
+    public R<List<StoreCuisineCategory>> getCategoriesByStoreId(
             @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId) {
         log.info("StoreInfoController.getCategoriesByStoreId?storeId={}", storeId);
         try {
             if (storeId == null) {
                 return R.fail("门店ID不能为空");
             }
-            List<WechatStoreCuisineCategory> categories = storeInfoService.getCategoriesByStoreId(storeId);
+            List<StoreCuisineCategory> categories = storeInfoService.getCategoriesByStoreId(storeId);
             return R.data(categories);
         } catch (Exception e) {
             log.error("查询菜品种类列表失败: {}", e.getMessage(), e);
@@ -66,7 +66,7 @@ public class StoreInfoController {
 
     @ApiOperation(value = "根据门店ID查询菜品种类及各类别下菜品", notes = "一次返回所有菜品种类及每个分类下的菜品列表;可选 keyword 按菜品名称模糊查询。返回中 category 与 /store/info/categories 单条结构一致,cuisines 与 /store/info/cuisines 返回结构一致,保证字段完整一致。")
     @GetMapping("/categories-with-cuisines")
-    public R<List<WechatCategoryWithCuisinesVO>> getCategoriesWithCuisinesByStoreId(
+    public R<List<CategoryWithCuisinesVO>> getCategoriesWithCuisinesByStoreId(
             @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId,
             @ApiParam(value = "菜品名称模糊查询关键词(可选)") @RequestParam(required = false) String keyword) {
         log.info("StoreInfoController.getCategoriesWithCuisinesByStoreId?storeId={}, keyword={}", storeId, keyword);
@@ -74,7 +74,7 @@ public class StoreInfoController {
             if (storeId == null) {
                 return R.fail("门店ID不能为空");
             }
-            List<WechatCategoryWithCuisinesVO> list = storeInfoService.getCategoriesWithCuisinesByStoreId(storeId, keyword);
+            List<CategoryWithCuisinesVO> list = storeInfoService.getCategoriesWithCuisinesByStoreId(storeId, keyword);
             return R.data(list);
         } catch (Exception e) {
             log.error("查询菜品种类及菜品失败: {}", e.getMessage(), e);
@@ -101,14 +101,14 @@ public class StoreInfoController {
 
     @ApiOperation(value = "根据菜品种类ID查询菜品信息列表", notes = "查询指定分类下的所有菜品信息")
     @GetMapping("/cuisines")
-    public R<List<WechatStoreCuisine>> getCuisinesByCategoryId(
+    public R<List<StoreCuisine>> getCuisinesByCategoryId(
             @ApiParam(value = "菜品种类ID", required = true) @RequestParam Integer categoryId) {
         log.info("StoreInfoController.getCuisinesByCategoryId?categoryId={}", categoryId);
         try {
             if (categoryId == null) {
                 return R.fail("菜品种类ID不能为空");
             }
-            List<WechatStoreCuisine> cuisines = storeInfoService.getCuisinesByCategoryId(categoryId);
+            List<StoreCuisine> cuisines = storeInfoService.getCuisinesByCategoryId(categoryId);
             return R.data(cuisines);
         } catch (Exception e) {
             log.error("查询菜品信息列表失败: {}", e.getMessage(), e);
@@ -118,14 +118,14 @@ public class StoreInfoController {
 
     @ApiOperation(value = "根据商铺ID查询店铺信息和首页展示美食价目表", notes = "查询店铺信息和当前店铺绑定的首页展示美食价目表信息")
     @GetMapping("/detail/{storeId}")
-    public R<WechatStoreInfoWithHomepageCuisinesDTO> getStoreInfoWithHomepageCuisines(
+    public R<StoreInfoWithHomepageCuisinesDTO> getStoreInfoWithHomepageCuisines(
             @ApiParam(value = "商铺ID", required = true) @PathVariable Integer storeId) {
         log.info("StoreInfoController.getStoreInfoWithHomepageCuisines?storeId={}", storeId);
         try {
             if (storeId == null) {
                 return R.fail("商铺ID不能为空");
             }
-            WechatStoreInfoWithHomepageCuisinesDTO result = storeInfoService.getStoreInfoWithHomepageCuisines(storeId);
+            StoreInfoWithHomepageCuisinesDTO result = storeInfoService.getStoreInfoWithHomepageCuisines(storeId);
             return R.data(result);
         } catch (Exception e) {
             log.error("查询店铺信息和首页展示美食价目表失败: {}", e.getMessage(), e);

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

@@ -16,19 +16,17 @@ import shop.alien.dining.service.StoreOrderService;
 import shop.alien.dining.util.TokenUtil;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.*;
-import shop.alien.entity.store.wechat.*;
-import shop.alien.entity.store.dto.wechat.WechatAddCartItemDTO;
-import shop.alien.entity.store.dto.wechat.WechatCartDTO;
-import shop.alien.entity.store.dto.wechat.WechatChangeTableDTO;
-import shop.alien.entity.store.dto.wechat.WechatCreateOrderDTO;
-import shop.alien.entity.store.dto.wechat.WechatUpdateOrderCouponDTO;
-import shop.alien.entity.store.vo.wechat.WechatOrderChangeLogBatchVO;
-import shop.alien.entity.store.vo.wechat.WechatOrderInfoVO;
-import shop.alien.entity.store.vo.wechat.WechatOrderDetailWithChangeLogVO;
-import shop.alien.entity.store.vo.wechat.WechatStoreOrderPageVO;
-import shop.alien.entity.store.vo.wechat.WechatOrderSuccessVO;
+import shop.alien.entity.store.dto.AddCartItemDTO;
+import shop.alien.entity.store.dto.CartDTO;
+import shop.alien.entity.store.dto.ChangeTableDTO;
+import shop.alien.entity.store.dto.CreateOrderDTO;
+import shop.alien.entity.store.vo.OrderChangeLogBatchVO;
+import shop.alien.entity.store.vo.OrderInfoVO;
+import shop.alien.entity.store.vo.OrderDetailWithChangeLogVO;
+import shop.alien.entity.store.vo.StoreOrderPageVO;
 import shop.alien.mapper.StoreInfoMapper;
-import shop.alien.mapper.wechat.*;
+import shop.alien.mapper.StoreOrderDetailMapper;
+import shop.alien.mapper.StoreTableMapper;
 
 import javax.validation.Valid;
 import java.util.List;
@@ -50,20 +48,20 @@ public class StoreOrderController {
     private final StoreOrderService orderService;
     private final CartService cartService;
     private final SseService sseService;
-    private final WechatStoreOrderDetailMapper orderDetailMapper;
-    private final WechatStoreTableMapper storeTableMapper;
+    private final StoreOrderDetailMapper orderDetailMapper;
+    private final StoreTableMapper storeTableMapper;
     private final StoreInfoMapper storeInfoMapper;
 
     @ApiOperation(value = "获取购物车", notes = "根据桌号ID获取购物车信息")
     @GetMapping("/cart/{tableId}")
-    public R<WechatCartDTO> getCart(@ApiParam(value = "桌号ID", required = true) @PathVariable Integer tableId) {
+    public R<CartDTO> getCart(@ApiParam(value = "桌号ID", required = true) @PathVariable Integer tableId) {
         log.info("StoreOrderController.getCart?tableId={}", tableId);
         try {
             // 验证 token
             if (!TokenUtil.hasValidToken()) {
                 return R.fail("用户未登录");
             }
-            WechatCartDTO cart = cartService.getCart(tableId);
+            CartDTO cart = cartService.getCart(tableId);
             return R.data(cart);
         } catch (Exception e) {
             log.error("获取购物车失败: {}", e.getMessage(), e);
@@ -73,14 +71,14 @@ public class StoreOrderController {
 
     @ApiOperation(value = "添加商品到购物车", notes = "添加商品到购物车,并推送SSE和WebSocket消息")
     @PostMapping("/cart/add")
-    public R<WechatCartDTO> addCartItem(@Valid @RequestBody WechatAddCartItemDTO dto) {
+    public R<CartDTO> addCartItem(@Valid @RequestBody AddCartItemDTO dto) {
         log.info("StoreOrderController.addCartItem?dto={}", dto);
         try {
             // 验证 token(用户信息在 CartService 中从 token 获取)
             if (!TokenUtil.hasValidToken()) {
                 return R.fail("用户未登录");
             }
-            WechatCartDTO cart = cartService.addItem(dto);
+            CartDTO cart = cartService.addItem(dto);
             // 推送购物车更新消息(SSE)
             sseService.pushCartUpdate(dto.getTableId(), cart);
             // 推送购物车更新消息(WebSocket)
@@ -94,7 +92,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "更新购物车商品数量", notes = "更新购物车中商品的数量,并推送SSE和WebSocket消息")
     @PutMapping("/cart/update")
-    public R<WechatCartDTO> updateCartItem(
+    public R<CartDTO> updateCartItem(
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
             @ApiParam(value = "菜品ID", required = true) @RequestParam Integer cuisineId,
             @ApiParam(value = "数量", required = true) @RequestParam Integer quantity) {
@@ -104,7 +102,7 @@ public class StoreOrderController {
             if (!TokenUtil.hasValidToken()) {
                 return R.fail("用户未登录");
             }
-            WechatCartDTO cart = cartService.updateItemQuantity(tableId, cuisineId, quantity);
+            CartDTO cart = cartService.updateItemQuantity(tableId, cuisineId, quantity);
             // 推送购物车更新消息(SSE)
             sseService.pushCartUpdate(tableId, cart);
             // 推送购物车更新消息(WebSocket)
@@ -118,7 +116,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "删除购物车商品", notes = "从购物车中删除商品,并推送SSE和WebSocket消息")
     @DeleteMapping("/cart/remove")
-    public R<WechatCartDTO> removeCartItem(
+    public R<CartDTO> removeCartItem(
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
             @ApiParam(value = "菜品ID", required = true) @RequestParam Integer cuisineId) {
         log.info("StoreOrderController.removeCartItem?tableId={}, cuisineId={}", tableId, cuisineId);
@@ -127,7 +125,7 @@ public class StoreOrderController {
             if (!TokenUtil.hasValidToken()) {
                 return R.fail("用户未登录");
             }
-            WechatCartDTO cart = cartService.removeItem(tableId, cuisineId);
+            CartDTO cart = cartService.removeItem(tableId, cuisineId);
             // 推送购物车更新消息(SSE)
             sseService.pushCartUpdate(tableId, cart);
             // 推送购物车更新消息(WebSocket)
@@ -141,7 +139,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "清空购物车", notes = "清空购物车中所有商品(保留餐具和已下单商品),并推送SSE和WebSocket消息")
     @DeleteMapping("/cart/clear")
-    public R<WechatCartDTO> clearCart(
+    public R<CartDTO> clearCart(
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
         log.info("StoreOrderController.clearCart?tableId={}", tableId);
         try {
@@ -154,7 +152,7 @@ public class StoreOrderController {
             cartService.clearCart(tableId);
             
             // 获取清空后的购物车(包含保留的餐具和已下单商品)
-            WechatCartDTO cart = cartService.getCart(tableId);
+            CartDTO cart = cartService.getCart(tableId);
             
             // 推送购物车更新消息(SSE)
             sseService.pushCartUpdate(tableId, cart);
@@ -170,7 +168,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "设置用餐人数", notes = "设置用餐人数,自动添加或更新餐具到购物车")
     @PostMapping("/cart/set-diner-count")
-    public R<WechatCartDTO> setDinerCount(
+    public R<CartDTO> setDinerCount(
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
             @ApiParam(value = "用餐人数", required = true) @RequestParam Integer dinerCount) {
         log.info("StoreOrderController.setDinerCount?tableId={}, dinerCount={}", tableId, dinerCount);
@@ -182,7 +180,7 @@ public class StoreOrderController {
             if (dinerCount == null || dinerCount <= 0) {
                 return R.fail("用餐人数必须大于0");
             }
-            WechatCartDTO cart = cartService.setDinerCount(tableId, dinerCount);
+            CartDTO cart = cartService.setDinerCount(tableId, dinerCount);
             // 推送购物车更新消息(SSE)
             sseService.pushCartUpdate(tableId, cart);
             // 推送购物车更新消息(WebSocket)
@@ -196,7 +194,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "更新餐具数量", notes = "更新购物车中餐具的数量,并推送SSE和WebSocket消息。餐具数量为0或未传时不往购物车加餐具(0会移除已有餐具项)")
     @PutMapping("/cart/update-tableware")
-    public R<WechatCartDTO> updateTablewareQuantity(
+    public R<CartDTO> updateTablewareQuantity(
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
             @ApiParam(value = "餐具数量,0或未传则不往购物车加餐具") @RequestParam(required = false) Integer quantity) {
         log.info("StoreOrderController.updateTablewareQuantity?tableId={}, quantity={}", tableId, quantity);
@@ -210,16 +208,16 @@ public class StoreOrderController {
             }
             // 餐具数量为 0 或 null 时不往购物车加餐具:0 则移除已有餐具项,null 则直接返回当前购物车
             if (quantity == null) {
-                WechatCartDTO cart = cartService.getCart(tableId);
+                CartDTO cart = cartService.getCart(tableId);
                 sseService.pushCartUpdate(tableId, cart);
                 return R.data(cart);
             }
             if (quantity == 0) {
-                WechatCartDTO cart = cartService.updateTablewareQuantity(tableId, 0);
+                CartDTO cart = cartService.updateTablewareQuantity(tableId, 0);
                 sseService.pushCartUpdate(tableId, cart);
                 return R.data(cart);
             }
-            WechatCartDTO cart = cartService.updateTablewareQuantity(tableId, quantity);
+            CartDTO cart = cartService.updateTablewareQuantity(tableId, quantity);
             // 推送购物车更新消息(SSE)
             sseService.pushCartUpdate(tableId, cart);
             // 推送购物车更新消息(WebSocket)
@@ -233,7 +231,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "创建订单(下单)", notes = "从购物车创建订单,不立即支付。备注:创建/更新时传入,更新订单(加餐)时为覆盖")
     @PostMapping("/create")
-    public R<WechatOrderSuccessVO> createOrder(@Valid @RequestBody WechatCreateOrderDTO dto) {
+    public R<shop.alien.entity.store.vo.OrderSuccessVO> createOrder(@Valid @RequestBody CreateOrderDTO dto) {
         log.info("StoreOrderController.createOrder?dto={}", dto);
         try {
             // 验证 token(用户信息在 StoreOrderService 中从 token 获取)
@@ -247,10 +245,10 @@ public class StoreOrderController {
 
             // 设置不立即支付
             dto.setImmediatePay(0);
-            WechatStoreOrder order = orderService.createOrder(dto);
+            StoreOrder order = orderService.createOrder(dto);
 
             // 转换为OrderSuccessVO
-            WechatOrderSuccessVO vo = new WechatOrderSuccessVO();
+            shop.alien.entity.store.vo.OrderSuccessVO vo = new shop.alien.entity.store.vo.OrderSuccessVO();
             vo.setOrderId(order.getId());
             vo.setOrderNo(order.getOrderNo());
             vo.setTableNumber(order.getTableNumber());
@@ -283,7 +281,7 @@ public class StoreOrderController {
                 return R.fail("用户未登录");
             }
             
-            WechatStoreOrder order = orderService.getOrderById(orderId);
+            StoreOrder order = orderService.getOrderById(orderId);
             if (order == null) {
                 return R.fail("订单不存在");
             }
@@ -331,7 +329,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "查询订单详情", notes = "根据订单ID查询订单详情,包含订单基本信息和按批次分组的变更记录,用于展示每次下单/加餐都加了什么商品")
     @GetMapping("/detail/{orderId}")
-    public R<WechatOrderDetailWithChangeLogVO> getOrderDetail(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
+    public R<OrderDetailWithChangeLogVO> getOrderDetail(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
         log.info("StoreOrderController.getOrderDetail?orderId={}", orderId);
         try {
             // 从 token 获取用户信息
@@ -339,7 +337,7 @@ public class StoreOrderController {
             if (userId == null) {
                 return R.fail("用户未登录");
             }
-            WechatOrderDetailWithChangeLogVO orderDetail = orderService.getOrderDetailWithChangeLog(orderId);
+            OrderDetailWithChangeLogVO orderDetail = orderService.getOrderDetailWithChangeLog(orderId);
             return R.data(orderDetail);
         } catch (Exception e) {
             log.error("查询订单详情失败: {}", e.getMessage(), e);
@@ -349,7 +347,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "查询订单明细", notes = "根据订单ID查询订单明细列表")
     @GetMapping("/detail/list/{orderId}")
-    public R<List<WechatStoreOrderDetail>> getOrderDetailList(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
+    public R<List<StoreOrderDetail>> getOrderDetailList(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
         log.info("StoreOrderController.getOrderDetailList?orderId={}", orderId);
         try {
             // 从 token 获取用户信息
@@ -357,12 +355,12 @@ public class StoreOrderController {
             if (userId == null) {
                 return R.fail("用户未登录");
             }
-            com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<WechatStoreOrderDetail> wrapper =
+            com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<StoreOrderDetail> wrapper =
                     new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<>();
-            wrapper.eq(WechatStoreOrderDetail::getOrderId, orderId);
-            wrapper.eq(WechatStoreOrderDetail::getDeleteFlag, 0);
-            wrapper.orderByDesc(WechatStoreOrderDetail::getCreatedTime);
-            List<WechatStoreOrderDetail> details = orderDetailMapper.selectList(wrapper);
+            wrapper.eq(StoreOrderDetail::getOrderId, orderId);
+            wrapper.eq(StoreOrderDetail::getDeleteFlag, 0);
+            wrapper.orderByDesc(StoreOrderDetail::getCreatedTime);
+            List<StoreOrderDetail> details = orderDetailMapper.selectList(wrapper);
             return R.data(details);
         } catch (Exception e) {
             log.error("查询订单明细失败: {}", e.getMessage(), e);
@@ -372,7 +370,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "查询订单信息", notes = "根据订单ID查询订单完整信息(包含订单基本信息、菜品清单、价格明细)")
     @GetMapping("/info/{orderId}")
-    public R<WechatOrderInfoVO> getOrderInfo(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
+    public R<OrderInfoVO> getOrderInfo(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
         log.info("StoreOrderController.getOrderInfo?orderId={}", orderId);
         try {
             // 从 token 获取用户信息
@@ -380,7 +378,7 @@ public class StoreOrderController {
             if (userId == null) {
                 return R.fail("用户未登录");
             }
-            WechatOrderInfoVO orderInfo = orderService.getOrderInfo(orderId);
+            OrderInfoVO orderInfo = orderService.getOrderInfo(orderId);
             return R.data(orderInfo);
         } catch (Exception e) {
             log.error("查询订单信息失败: {}", e.getMessage(), e);
@@ -390,7 +388,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "查询订单变更记录", notes = "根据订单ID查询订单的所有变更记录(按批次分组),用于展示每次下单/加餐都加了什么商品")
     @GetMapping("/change-log/{orderId}")
-    public R<List<WechatOrderChangeLogBatchVO>> getOrderChangeLogs(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
+    public R<List<OrderChangeLogBatchVO>> getOrderChangeLogs(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
         log.info("StoreOrderController.getOrderChangeLogs?orderId={}", orderId);
         try {
             // 从 token 获取用户信息
@@ -398,7 +396,7 @@ public class StoreOrderController {
             if (userId == null) {
                 return R.fail("用户未登录");
             }
-            List<WechatOrderChangeLogBatchVO> changeLogs = orderService.getOrderChangeLogs(orderId);
+            List<OrderChangeLogBatchVO> changeLogs = orderService.getOrderChangeLogs(orderId);
             return R.data(changeLogs);
         } catch (Exception e) {
             log.error("查询订单变更记录失败: {}", e.getMessage(), e);
@@ -409,7 +407,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "分页查询订单列表", notes = "分页查询订单列表,包含订单中的菜品数量、菜品名称、菜品图片。支持按订单编号或菜品名称搜索(限15字)")
     @GetMapping("/page")
-    public R<IPage<WechatStoreOrderPageVO>> getOrderPage(
+    public R<IPage<StoreOrderPageVO>> getOrderPage(
             @ApiParam(value = "页码", required = true) @RequestParam(defaultValue = "1") Long current,
             @ApiParam(value = "每页数量", required = true) @RequestParam(defaultValue = "10") Long size,
             @ApiParam(value = "门店ID") @RequestParam(required = false) Integer storeId,
@@ -423,8 +421,8 @@ public class StoreOrderController {
             if (userId == null) {
                 return R.fail("用户未登录");
             }
-            Page<WechatStoreOrder> page = new Page<>(current, size);
-            IPage<WechatStoreOrderPageVO> result = orderService.getOrderPageWithCuisines(page, storeId, tableId, orderStatus, keyword);
+            Page<StoreOrder> page = new Page<>(current, size);
+            IPage<StoreOrderPageVO> result = orderService.getOrderPageWithCuisines(page, storeId, tableId, orderStatus, keyword);
             return R.data(result);
         } catch (Exception e) {
             log.error("分页查询订单列表失败: {}", e.getMessage(), e);
@@ -434,7 +432,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "查询我的订单", notes = "通过标识查询我的未支付订单或历史订单,包含订单中的菜品数量、菜品名称、菜品图片。type: 0或unpaid-未支付订单, 1或history-历史订单")
     @GetMapping("/my-orders")
-    public R<IPage<WechatStoreOrderPageVO>> getMyOrders(
+    public R<IPage<StoreOrderPageVO>> getMyOrders(
             @ApiParam(value = "页码", required = true) @RequestParam(defaultValue = "1") Long current,
             @ApiParam(value = "每页数量", required = true) @RequestParam(defaultValue = "10") Long size,
             @ApiParam(value = "订单类型(0或unpaid:未支付订单, 1或history:历史订单)", required = true) @RequestParam String type) {
@@ -445,8 +443,8 @@ public class StoreOrderController {
             if (userId == null) {
                 return R.fail("用户未登录");
             }
-            Page<WechatStoreOrder> page = new Page<>(current, size);
-            IPage<WechatStoreOrderPageVO> result = orderService.getMyOrdersWithCuisines(page, type);
+            Page<StoreOrder> page = new Page<>(current, size);
+            IPage<StoreOrderPageVO> result = orderService.getMyOrdersWithCuisines(page, type);
             return R.data(result);
         } catch (Exception e) {
             log.error("查询我的订单失败: {}", e.getMessage(), e);
@@ -456,7 +454,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "换桌", notes = "换桌并迁移购物车、未完成的订单以及其他关联表数据")
     @PostMapping("/change-table")
-    public R<WechatCartDTO> changeTable(@Valid @RequestBody WechatChangeTableDTO dto) {
+    public R<CartDTO> changeTable(@Valid @RequestBody ChangeTableDTO dto) {
         log.info("StoreOrderController.changeTable?dto={}", dto);
         try {
             // 从 token 获取用户信息
@@ -466,7 +464,7 @@ public class StoreOrderController {
             }
 
             // 调用Service层处理换桌业务逻辑
-            WechatCartDTO cart = orderService.changeTable(dto.getFromTableId(), dto.getToTableId(), dto.getChangeReason(), userId);
+            CartDTO cart = orderService.changeTable(dto.getFromTableId(), dto.getToTableId(), dto.getChangeReason(), userId);
 
             return R.data(cart);
         } catch (Exception e) {
@@ -525,7 +523,7 @@ public class StoreOrderController {
 
     @ApiOperation(value = "更新订单优惠券", notes = "重新选择优惠券")
     @PostMapping("/update-coupon")
-    public R<WechatStoreOrder> updateOrderCoupon(@Valid @RequestBody WechatUpdateOrderCouponDTO dto) {
+    public R<StoreOrder> updateOrderCoupon(@Valid @RequestBody shop.alien.entity.store.dto.UpdateOrderCouponDTO dto) {
         log.info("StoreOrderController.updateOrderCoupon?dto={}", dto);
         try {
             // 从 token 获取用户信息
@@ -533,7 +531,7 @@ public class StoreOrderController {
             if (userId == null) {
                 return R.fail("用户未登录");
             }
-            WechatStoreOrder order = orderService.updateOrderCoupon(dto.getOrderId(), dto.getCouponId());
+            StoreOrder order = orderService.updateOrderCoupon(dto.getOrderId(), dto.getCouponId());
             return R.data(order);
         } catch (Exception e) {
             log.error("更新订单优惠券失败: {}", e.getMessage(), e);
@@ -554,14 +552,14 @@ public class StoreOrderController {
             boolean result = orderService.resetTable(tableId);
             if (result) {
                 // 推送购物车更新消息(清空购物车)
-                WechatCartDTO emptyCart = new WechatCartDTO();
+                CartDTO emptyCart = new CartDTO();
                 emptyCart.setTableId(tableId);
                 emptyCart.setItems(java.util.Collections.emptyList());
                 emptyCart.setTotalAmount(java.math.BigDecimal.ZERO);
                 emptyCart.setTotalQuantity(0);
                 
                 // 查询桌号信息
-                WechatStoreTable table = storeTableMapper.selectById(tableId);
+                StoreTable table = storeTableMapper.selectById(tableId);
                 if (table != null) {
                     emptyCart.setTableNumber(table.getTableNumber());
                     emptyCart.setStoreId(table.getStoreId());

+ 11 - 11
alien-dining/src/main/java/shop/alien/dining/service/CartService.java

@@ -1,7 +1,7 @@
 package shop.alien.dining.service;
 
-import shop.alien.entity.store.dto.wechat.WechatAddCartItemDTO;
-import shop.alien.entity.store.dto.wechat.WechatCartDTO;
+import shop.alien.entity.store.dto.AddCartItemDTO;
+import shop.alien.entity.store.dto.CartDTO;
 
 /**
  * 购物车服务接口
@@ -17,7 +17,7 @@ public interface CartService {
      * @param tableId 桌号ID
      * @return 购物车信息
      */
-    WechatCartDTO getCart(Integer tableId);
+    CartDTO getCart(Integer tableId);
 
     /**
      * 添加商品到购物车
@@ -25,7 +25,7 @@ public interface CartService {
      * @param dto 添加购物车商品DTO
      * @return 购物车信息
      */
-    WechatCartDTO addItem(WechatAddCartItemDTO dto);
+    CartDTO addItem(AddCartItemDTO dto);
 
     /**
      * 更新购物车商品数量
@@ -35,7 +35,7 @@ public interface CartService {
      * @param quantity  数量
      * @return 购物车信息
      */
-    WechatCartDTO updateItemQuantity(Integer tableId, Integer cuisineId, Integer quantity);
+    CartDTO updateItemQuantity(Integer tableId, Integer cuisineId, Integer quantity);
 
     /**
      * 删除购物车商品
@@ -44,7 +44,7 @@ public interface CartService {
      * @param cuisineId 菜品ID
      * @return 购物车信息
      */
-    WechatCartDTO removeItem(Integer tableId, Integer cuisineId);
+    CartDTO removeItem(Integer tableId, Integer cuisineId);
 
     /**
      * 清空购物车
@@ -60,7 +60,7 @@ public interface CartService {
      * @param toTableId   目标桌号ID
      * @return 迁移后的购物车信息
      */
-    WechatCartDTO migrateCart(Integer fromTableId, Integer toTableId);
+    CartDTO migrateCart(Integer fromTableId, Integer toTableId);
 
     /**
      * 检查桌号是否已使用优惠券
@@ -92,7 +92,7 @@ public interface CartService {
      * @param dinerCount 用餐人数
      * @return 购物车信息
      */
-    WechatCartDTO setDinerCount(Integer tableId, Integer dinerCount);
+    CartDTO setDinerCount(Integer tableId, Integer dinerCount);
 
     /**
      * 更新餐具数量
@@ -101,7 +101,7 @@ public interface CartService {
      * @param quantity 餐具数量
      * @return 购物车信息
      */
-    WechatCartDTO updateTablewareQuantity(Integer tableId, Integer quantity);
+    CartDTO updateTablewareQuantity(Integer tableId, Integer quantity);
 
     /**
      * 锁定购物车商品数量(下单时调用,将当前数量锁定,不允许减少或删除)
@@ -109,7 +109,7 @@ public interface CartService {
      * @param tableId 桌号ID
      * @return 购物车信息
      */
-    WechatCartDTO lockCartItems(Integer tableId);
+    CartDTO lockCartItems(Integer tableId);
 
     /**
      * 解锁购物车商品数量(取消订单时调用,清除已下单数量,允许重新下单)
@@ -117,5 +117,5 @@ public interface CartService {
      * @param tableId 桌号ID
      * @return 购物车信息
      */
-    WechatCartDTO unlockCartItems(Integer tableId);
+    CartDTO unlockCartItems(Integer tableId);
 }

+ 2 - 2
alien-dining/src/main/java/shop/alien/dining/service/DiningService.java

@@ -87,7 +87,7 @@ public interface DiningService {
      * @param userId 用户ID
      * @return 订单确认页面信息
      */
-    shop.alien.entity.store.vo.wechat.WechatOrderConfirmVO getOrderConfirmInfo(Integer tableId, Integer dinerCount, Integer userId);
+    OrderConfirmVO getOrderConfirmInfo(Integer tableId, Integer dinerCount, Integer userId);
 
     /**
      * 锁定订单(防止多人同时下单)
@@ -121,7 +121,7 @@ public interface DiningService {
      * @param userId 用户ID
      * @return 订单结算确认页面信息
      */
-    shop.alien.entity.store.vo.wechat.WechatOrderSettlementVO getOrderSettlementInfo(Integer orderId, Integer userId);
+    shop.alien.entity.store.vo.OrderSettlementVO getOrderSettlementInfo(Integer orderId, Integer userId);
 
     /**
      * 锁定订单结算(防止多人同时结算)

+ 14 - 0
alien-dining/src/main/java/shop/alien/dining/service/DiningWalkInReservationService.java

@@ -0,0 +1,14 @@
+package shop.alien.dining.service;
+
+import shop.alien.entity.store.dto.DiningWalkInReservationDTO;
+
+/**
+ * 点餐到店填写的预约(无预订订单,状态直接已到店)
+ */
+public interface DiningWalkInReservationService {
+
+    /**
+     * 创建预约并关联当前桌位,状态为已到店(2),返回 user_reservation.id 供下单绑定
+     */
+    Integer createWalkInReservation(DiningWalkInReservationDTO dto, Integer userId);
+}

+ 10 - 10
alien-dining/src/main/java/shop/alien/dining/service/StoreInfoService.java

@@ -1,10 +1,10 @@
 package shop.alien.dining.service;
 
-import shop.alien.entity.store.wechat.WechatStoreCuisine;
-import shop.alien.entity.store.wechat.WechatStoreCuisineCategory;
-import shop.alien.entity.store.wechat.WechatStoreTable;
-import shop.alien.entity.store.dto.wechat.WechatStoreInfoWithHomepageCuisinesDTO;
-import shop.alien.entity.store.vo.wechat.WechatCategoryWithCuisinesVO;
+import shop.alien.entity.store.StoreCuisine;
+import shop.alien.entity.store.StoreCuisineCategory;
+import shop.alien.entity.store.StoreTable;
+import shop.alien.entity.store.dto.StoreInfoWithHomepageCuisinesDTO;
+import shop.alien.entity.store.vo.CategoryWithCuisinesVO;
 
 import java.util.List;
 
@@ -22,7 +22,7 @@ public interface StoreInfoService {
      * @param storeId 门店ID
      * @return 桌号列表
      */
-    List<WechatStoreTable> getTablesByStoreId(Integer storeId);
+    List<StoreTable> getTablesByStoreId(Integer storeId);
 
     /**
      * 根据门店ID查询菜品种类列表
@@ -30,7 +30,7 @@ public interface StoreInfoService {
      * @param storeId 门店ID
      * @return 菜品种类列表
      */
-    List<WechatStoreCuisineCategory> getCategoriesByStoreId(Integer storeId);
+    List<StoreCuisineCategory> getCategoriesByStoreId(Integer storeId);
 
     /**
      * 根据菜品种类ID查询菜品信息列表
@@ -38,7 +38,7 @@ public interface StoreInfoService {
      * @param categoryId 菜品种类ID
      * @return 菜品信息列表
      */
-    List<WechatStoreCuisine> getCuisinesByCategoryId(Integer categoryId);
+    List<StoreCuisine> getCuisinesByCategoryId(Integer categoryId);
 
     /**
      * 根据门店ID查询菜品种类及每个分类下的菜品列表(一次返回种类+菜品)
@@ -47,7 +47,7 @@ public interface StoreInfoService {
      * @param keyword 菜品名称模糊查询关键词(可选,为空则不按名称筛选)
      * @return 菜品种类及下属菜品列表
      */
-    List<WechatCategoryWithCuisinesVO> getCategoriesWithCuisinesByStoreId(Integer storeId, String keyword);
+    List<CategoryWithCuisinesVO> getCategoriesWithCuisinesByStoreId(Integer storeId, String keyword);
 
     /**
      * 删除菜品种类:仅逻辑删除分类并解除菜品与该分类的绑定关系,价目表(菜品)本身不改动
@@ -63,5 +63,5 @@ public interface StoreInfoService {
      * @param storeId 商铺ID
      * @return 店铺信息和首页展示美食价目表信息
      */
-    WechatStoreInfoWithHomepageCuisinesDTO getStoreInfoWithHomepageCuisines(Integer storeId);
+    StoreInfoWithHomepageCuisinesDTO getStoreInfoWithHomepageCuisines(Integer storeId);
 }

+ 19 - 21
alien-dining/src/main/java/shop/alien/dining/service/StoreOrderService.java

@@ -3,13 +3,11 @@ package shop.alien.dining.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
-import shop.alien.entity.store.wechat.WechatStoreOrder;
-import shop.alien.entity.store.dto.wechat.WechatCartDTO;
-import shop.alien.entity.store.dto.wechat.WechatCreateOrderDTO;
-import shop.alien.entity.store.vo.wechat.WechatOrderChangeLogBatchVO;
-import shop.alien.entity.store.vo.wechat.WechatOrderInfoVO;
-import shop.alien.entity.store.vo.wechat.WechatOrderDetailWithChangeLogVO;
-import shop.alien.entity.store.vo.wechat.WechatStoreOrderPageVO;
+import shop.alien.entity.store.StoreOrder;
+import shop.alien.entity.store.dto.CreateOrderDTO;
+import shop.alien.entity.store.vo.OrderChangeLogBatchVO;
+import shop.alien.entity.store.vo.OrderInfoVO;
+import shop.alien.entity.store.vo.StoreOrderPageVO;
 
 import java.util.List;
 
@@ -19,7 +17,7 @@ import java.util.List;
  * @author system
  * @since 2025-01-XX
  */
-public interface StoreOrderService extends IService<WechatStoreOrder> {
+public interface StoreOrderService extends IService<StoreOrder> {
 
     /**
      * 创建订单
@@ -27,7 +25,7 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param dto 创建订单DTO
      * @return 订单信息
      */
-    WechatStoreOrder createOrder(WechatCreateOrderDTO dto);
+    StoreOrder createOrder(CreateOrderDTO dto);
 
     /**
      * 支付订单
@@ -36,7 +34,7 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param payType 支付方式
      * @return 订单信息
      */
-    WechatStoreOrder payOrder(Integer orderId, Integer payType);
+    StoreOrder payOrder(Integer orderId, Integer payType);
 
     /**
      * 取消订单
@@ -52,7 +50,7 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param orderNo 订单号
      * @return 订单信息
      */
-    WechatStoreOrder getOrderByOrderNo(String orderNo);
+    StoreOrder getOrderByOrderNo(String orderNo);
 
     /**
      * 根据ID查询订单
@@ -60,7 +58,7 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param orderId 订单ID
      * @return 订单信息
      */
-    WechatStoreOrder getOrderById(Integer orderId);
+    StoreOrder getOrderById(Integer orderId);
 
     /**
      * 分页查询订单列表
@@ -72,7 +70,7 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param keyword  搜索关键词(订单编号或菜品名称,限15字)
      * @return 订单分页列表
      */
-    IPage<WechatStoreOrder> getOrderPage(Page<WechatStoreOrder> page, Integer storeId, Integer tableId, Integer orderStatus, String keyword);
+    IPage<StoreOrder> getOrderPage(Page<StoreOrder> page, Integer storeId, Integer tableId, Integer orderStatus, String keyword);
 
     /**
      * 分页查询订单列表(包含菜品信息)
@@ -84,7 +82,7 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param keyword  搜索关键词(订单编号或菜品名称,限15字)
      * @return 订单分页列表(包含菜品信息)
      */
-    IPage<WechatStoreOrderPageVO> getOrderPageWithCuisines(Page<WechatStoreOrder> page, Integer storeId, Integer tableId, Integer orderStatus, String keyword);
+    IPage<StoreOrderPageVO> getOrderPageWithCuisines(Page<StoreOrder> page, Integer storeId, Integer tableId, Integer orderStatus, String keyword);
 
     /**
      * 完成订单(支付完成后调用)
@@ -109,7 +107,7 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param couponId 优惠券ID(可为空,表示不使用优惠券)
      * @return 订单信息
      */
-    WechatStoreOrder updateOrderCoupon(Integer orderId, Integer couponId);
+    StoreOrder updateOrderCoupon(Integer orderId, Integer couponId);
 
     /**
      * 管理员重置餐桌(删除购物车数据、未支付/已取消的订单数据,并重置餐桌表)
@@ -126,7 +124,7 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param orderId 订单ID
      * @return 订单信息
      */
-    WechatOrderInfoVO getOrderInfo(Integer orderId);
+    OrderInfoVO getOrderInfo(Integer orderId);
 
     /**
      * 查询订单的所有变更记录(按批次分组)
@@ -134,7 +132,7 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param orderId 订单ID
      * @return 变更记录批次列表
      */
-    List<WechatOrderChangeLogBatchVO> getOrderChangeLogs(Integer orderId);
+    List<OrderChangeLogBatchVO> getOrderChangeLogs(Integer orderId);
 
     /**
      * 查询订单详情(包含订单基本信息和按批次分组的变更记录)
@@ -142,7 +140,7 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param orderId 订单ID
      * @return 订单详情(包含变更记录)
      */
-    WechatOrderDetailWithChangeLogVO getOrderDetailWithChangeLog(Integer orderId);
+    shop.alien.entity.store.vo.OrderDetailWithChangeLogVO getOrderDetailWithChangeLog(Integer orderId);
 
     /**
      * 支付完成后重置餐桌(保留订单数据,只重置餐桌绑定关系)
@@ -158,7 +156,7 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param type 订单类型(0或"unpaid":未支付订单, 1或"history":历史订单)
      * @return 订单分页列表
      */
-    IPage<WechatStoreOrder> getMyOrders(Page<WechatStoreOrder> page, String type);
+    IPage<StoreOrder> getMyOrders(Page<StoreOrder> page, String type);
 
     /**
      * 查询我的订单(包含菜品信息)
@@ -167,7 +165,7 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param type 订单类型(0或"unpaid":未支付订单, 1或"history":历史订单)
      * @return 订单分页列表(包含菜品信息)
      */
-    IPage<WechatStoreOrderPageVO> getMyOrdersWithCuisines(Page<WechatStoreOrder> page, String type);
+    IPage<StoreOrderPageVO> getMyOrdersWithCuisines(Page<StoreOrder> page, String type);
 
     /**
      * 换桌时迁移所有关联数据(订单、订单变更记录、优惠券使用记录等)
@@ -187,5 +185,5 @@ public interface StoreOrderService extends IService<WechatStoreOrder> {
      * @param userId       操作用户ID
      * @return 迁移后的购物车信息
      */
-    WechatCartDTO changeTable(Integer fromTableId, Integer toTableId, String changeReason, Integer userId);
+    shop.alien.entity.store.dto.CartDTO changeTable(Integer fromTableId, Integer toTableId, String changeReason, Integer userId);
 }

+ 147 - 147
alien-dining/src/main/java/shop/alien/dining/service/impl/CartServiceImpl.java

@@ -9,19 +9,19 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 import shop.alien.dining.config.BaseRedisService;
 import shop.alien.dining.service.CartService;
-import shop.alien.entity.store.wechat.WechatStoreCart;
-import shop.alien.entity.store.wechat.WechatStoreCouponUsage;
-import shop.alien.entity.store.wechat.WechatStoreCuisine;
+import shop.alien.entity.store.StoreCart;
+import shop.alien.entity.store.StoreCouponUsage;
+import shop.alien.entity.store.StoreCuisine;
 import shop.alien.entity.store.StoreInfo;
-import shop.alien.entity.store.wechat.WechatStoreTable;
-import shop.alien.entity.store.dto.wechat.WechatAddCartItemDTO;
-import shop.alien.entity.store.dto.wechat.WechatCartDTO;
-import shop.alien.entity.store.dto.wechat.WechatCartItemDTO;
-import shop.alien.mapper.wechat.WechatStoreCartMapper;
-import shop.alien.mapper.wechat.WechatStoreCouponUsageMapper;
-import shop.alien.mapper.wechat.WechatStoreCuisineMapper;
+import shop.alien.entity.store.StoreTable;
+import shop.alien.entity.store.dto.AddCartItemDTO;
+import shop.alien.entity.store.dto.CartDTO;
+import shop.alien.entity.store.dto.CartItemDTO;
+import shop.alien.mapper.StoreCartMapper;
+import shop.alien.mapper.StoreCouponUsageMapper;
+import shop.alien.mapper.StoreCuisineMapper;
 import shop.alien.mapper.StoreInfoMapper;
-import shop.alien.mapper.wechat.WechatStoreTableMapper;
+import shop.alien.mapper.StoreTableMapper;
 import shop.alien.dining.util.TokenUtil;
 
 import java.math.BigDecimal;
@@ -44,8 +44,8 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor
 public class CartServiceImpl implements CartService {
 
-    private static final String CART_KEY_PREFIX = "wechat:cart:table:";
-    private static final String COUPON_USED_KEY_PREFIX = "wechat:coupon:used:table:";
+    private static final String CART_KEY_PREFIX = "cart:table:";
+    private static final String COUPON_USED_KEY_PREFIX = "coupon:used:table:";
     private static final int CART_EXPIRE_SECONDS = 24 * 60 * 60; // 24小时过期
 
     // 异步写入数据库的线程池(专门用于购物车数据库写入)
@@ -56,23 +56,23 @@ public class CartServiceImpl implements CartService {
     });
 
     private final BaseRedisService baseRedisService;
-    private final WechatStoreTableMapper storeTableMapper;
-    private final WechatStoreCuisineMapper storeCuisineMapper;
-    private final WechatStoreCartMapper storeCartMapper;
-    private final WechatStoreCouponUsageMapper storeCouponUsageMapper;
+    private final StoreTableMapper storeTableMapper;
+    private final StoreCuisineMapper storeCuisineMapper;
+    private final StoreCartMapper storeCartMapper;
+    private final StoreCouponUsageMapper storeCouponUsageMapper;
     private final StoreInfoMapper storeInfoMapper;
 
     @Override
-    public WechatCartDTO getCart(Integer tableId) {
+    public CartDTO getCart(Integer tableId) {
         log.info("获取购物车, tableId={}", tableId);
         String cartKey = CART_KEY_PREFIX + tableId;
         String cartJson = baseRedisService.getString(cartKey);
 
-        WechatCartDTO cart = new WechatCartDTO();
+        CartDTO cart = new CartDTO();
         cart.setTableId(tableId);
 
         // 查询桌号信息
-        WechatStoreTable table = storeTableMapper.selectById(tableId);
+        StoreTable table = storeTableMapper.selectById(tableId);
         if (table != null) {
             cart.setTableNumber(table.getTableNumber());
             cart.setStoreId(table.getStoreId());
@@ -81,15 +81,15 @@ public class CartServiceImpl implements CartService {
         if (StringUtils.hasText(cartJson)) {
             try {
                 JSONObject cartObj = JSON.parseObject(cartJson);
-                List<WechatCartItemDTO> items = cartObj.getList("items", WechatCartItemDTO.class);
+                List<CartItemDTO> items = cartObj.getList("items", CartItemDTO.class);
                 if (items != null) {
                     cart.setItems(items);
                     // 计算总金额和总数量
                     BigDecimal totalAmount = items.stream()
-                            .map(WechatCartItemDTO::getSubtotalAmount)
+                            .map(CartItemDTO::getSubtotalAmount)
                             .reduce(BigDecimal.ZERO, BigDecimal::add);
                     Integer totalQuantity = items.stream()
-                            .mapToInt(WechatCartItemDTO::getQuantity)
+                            .mapToInt(CartItemDTO::getQuantity)
                             .sum();
                     cart.setTotalAmount(totalAmount);
                     cart.setTotalQuantity(totalQuantity);
@@ -115,30 +115,30 @@ public class CartServiceImpl implements CartService {
     /**
      * 从数据库加载购物车
      */
-    private WechatCartDTO loadCartFromDatabase(Integer tableId) {
+    private CartDTO loadCartFromDatabase(Integer tableId) {
         log.info("从数据库加载购物车, tableId={}", tableId);
-        WechatCartDTO cart = new WechatCartDTO();
+        CartDTO cart = new CartDTO();
         cart.setTableId(tableId);
         cart.setItems(new ArrayList<>());
         cart.setTotalAmount(BigDecimal.ZERO);
         cart.setTotalQuantity(0);
 
         // 查询桌号信息
-        WechatStoreTable table = storeTableMapper.selectById(tableId);
+        StoreTable table = storeTableMapper.selectById(tableId);
         if (table != null) {
             cart.setTableNumber(table.getTableNumber());
             cart.setStoreId(table.getStoreId());
         }
 
         // 从数据库查询购物车数据
-        LambdaQueryWrapper<WechatStoreCart> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStoreCart::getTableId, tableId);
-        wrapper.eq(WechatStoreCart::getDeleteFlag, 0);
-        List<WechatStoreCart> cartList = storeCartMapper.selectList(wrapper);
+        LambdaQueryWrapper<StoreCart> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreCart::getTableId, tableId);
+        wrapper.eq(StoreCart::getDeleteFlag, 0);
+        List<StoreCart> cartList = storeCartMapper.selectList(wrapper);
 
         if (cartList != null && !cartList.isEmpty()) {
-            List<WechatCartItemDTO> items = cartList.stream().map(cartItem -> {
-                WechatCartItemDTO item = new WechatCartItemDTO();
+            List<CartItemDTO> items = cartList.stream().map(cartItem -> {
+                CartItemDTO item = new CartItemDTO();
                 item.setCuisineId(cartItem.getCuisineId());
                 item.setCuisineName(cartItem.getCuisineName());
                 item.setCuisineImage(cartItem.getCuisineImage());
@@ -154,10 +154,10 @@ public class CartServiceImpl implements CartService {
 
             cart.setItems(items);
             BigDecimal totalAmount = items.stream()
-                    .map(WechatCartItemDTO::getSubtotalAmount)
+                    .map(CartItemDTO::getSubtotalAmount)
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             Integer totalQuantity = items.stream()
-                    .mapToInt(WechatCartItemDTO::getQuantity)
+                    .mapToInt(CartItemDTO::getQuantity)
                     .sum();
             cart.setTotalAmount(totalAmount);
             cart.setTotalQuantity(totalQuantity);
@@ -170,16 +170,16 @@ public class CartServiceImpl implements CartService {
     }
 
     @Override
-    public WechatCartDTO addItem(WechatAddCartItemDTO dto) {
+    public CartDTO addItem(AddCartItemDTO dto) {
         log.info("添加商品到购物车, dto={}", dto);
         // 验证桌号
-        WechatStoreTable table = storeTableMapper.selectById(dto.getTableId());
+        StoreTable table = storeTableMapper.selectById(dto.getTableId());
         if (table == null) {
             throw new RuntimeException("桌号不存在");
         }
 
         // 验证菜品
-        WechatStoreCuisine cuisine = storeCuisineMapper.selectById(dto.getCuisineId());
+        StoreCuisine cuisine = storeCuisineMapper.selectById(dto.getCuisineId());
         if (cuisine == null) {
             throw new RuntimeException("菜品不存在");
         }
@@ -192,11 +192,11 @@ public class CartServiceImpl implements CartService {
         String userPhone = TokenUtil.getCurrentUserPhone();
 
         // 获取购物车
-        WechatCartDTO cart = getCart(dto.getTableId());
+        CartDTO cart = getCart(dto.getTableId());
 
         // 查找是否已存在该商品
-        List<WechatCartItemDTO> items = cart.getItems();
-        WechatCartItemDTO existingItem = items.stream()
+        List<CartItemDTO> items = cart.getItems();
+        CartItemDTO existingItem = items.stream()
                 .filter(item -> item.getCuisineId().equals(dto.getCuisineId()))
                 .findFirst()
                 .orElse(null);
@@ -220,7 +220,7 @@ public class CartServiceImpl implements CartService {
             }
         } else {
             // 添加新商品
-            WechatCartItemDTO newItem = new WechatCartItemDTO();
+            CartItemDTO newItem = new CartItemDTO();
             newItem.setCuisineId(cuisine.getId());
             newItem.setCuisineName(cuisine.getName());
             newItem.setCuisineType(cuisine.getCuisineType());
@@ -237,10 +237,10 @@ public class CartServiceImpl implements CartService {
 
         // 重新计算总金额和总数量
         BigDecimal totalAmount = items.stream()
-                .map(WechatCartItemDTO::getSubtotalAmount)
+                .map(CartItemDTO::getSubtotalAmount)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
         Integer totalQuantity = items.stream()
-                .mapToInt(WechatCartItemDTO::getQuantity)
+                .mapToInt(CartItemDTO::getQuantity)
                 .sum();
         cart.setTotalAmount(totalAmount);
         cart.setTotalQuantity(totalQuantity);
@@ -252,7 +252,7 @@ public class CartServiceImpl implements CartService {
     }
 
     @Override
-    public WechatCartDTO updateItemQuantity(Integer tableId, Integer cuisineId, Integer quantity) {
+    public CartDTO updateItemQuantity(Integer tableId, Integer cuisineId, Integer quantity) {
         log.info("更新购物车商品数量, tableId={}, cuisineId={}, quantity={}", tableId, cuisineId, quantity);
         
         // 如果数量为0或小于0,删除该商品
@@ -261,9 +261,9 @@ public class CartServiceImpl implements CartService {
             return removeItem(tableId, cuisineId);
         }
 
-        WechatCartDTO cart = getCart(tableId);
-        List<WechatCartItemDTO> items = cart.getItems();
-        WechatCartItemDTO item = items.stream()
+        CartDTO cart = getCart(tableId);
+        List<CartItemDTO> items = cart.getItems();
+        CartItemDTO item = items.stream()
                 .filter(i -> i.getCuisineId().equals(cuisineId))
                 .findFirst()
                 .orElse(null);
@@ -284,10 +284,10 @@ public class CartServiceImpl implements CartService {
 
             // 重新计算总金额和总数量
             BigDecimal totalAmount = items.stream()
-                    .map(WechatCartItemDTO::getSubtotalAmount)
+                    .map(CartItemDTO::getSubtotalAmount)
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             Integer totalQuantity = items.stream()
-                    .mapToInt(WechatCartItemDTO::getQuantity)
+                    .mapToInt(CartItemDTO::getQuantity)
                     .sum();
             cart.setTotalAmount(totalAmount);
             cart.setTotalQuantity(totalQuantity);
@@ -298,7 +298,7 @@ public class CartServiceImpl implements CartService {
             log.info("商品不在购物车中,自动添加, tableId={}, cuisineId={}, quantity={}", tableId, cuisineId, quantity);
             
             // 验证菜品
-            WechatStoreCuisine cuisine = storeCuisineMapper.selectById(cuisineId);
+            StoreCuisine cuisine = storeCuisineMapper.selectById(cuisineId);
             if (cuisine == null) {
                 throw new RuntimeException("菜品不存在");
             }
@@ -311,7 +311,7 @@ public class CartServiceImpl implements CartService {
             String userPhone = TokenUtil.getCurrentUserPhone();
 
             // 创建新的购物车商品项
-            WechatCartItemDTO newItem = new WechatCartItemDTO();
+            CartItemDTO newItem = new CartItemDTO();
             newItem.setCuisineId(cuisine.getId());
             newItem.setCuisineName(cuisine.getName());
             newItem.setCuisineType(cuisine.getCuisineType());
@@ -326,10 +326,10 @@ public class CartServiceImpl implements CartService {
 
             // 重新计算总金额和总数量
             BigDecimal totalAmount = items.stream()
-                    .map(WechatCartItemDTO::getSubtotalAmount)
+                    .map(CartItemDTO::getSubtotalAmount)
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             Integer totalQuantity = items.stream()
-                    .mapToInt(WechatCartItemDTO::getQuantity)
+                    .mapToInt(CartItemDTO::getQuantity)
                     .sum();
             cart.setTotalAmount(totalAmount);
             cart.setTotalQuantity(totalQuantity);
@@ -343,13 +343,13 @@ public class CartServiceImpl implements CartService {
     }
 
     @Override
-    public WechatCartDTO removeItem(Integer tableId, Integer cuisineId) {
+    public CartDTO removeItem(Integer tableId, Integer cuisineId) {
         log.info("删除购物车商品, tableId={}, cuisineId={}", tableId, cuisineId);
-        WechatCartDTO cart = getCart(tableId);
-        List<WechatCartItemDTO> items = cart.getItems();
+        CartDTO cart = getCart(tableId);
+        List<CartItemDTO> items = cart.getItems();
         
         // 检查是否有已下单数量,如果有则不允许删除
-        WechatCartItemDTO item = items.stream()
+        CartItemDTO item = items.stream()
                 .filter(i -> i.getCuisineId().equals(cuisineId))
                 .findFirst()
                 .orElse(null);
@@ -365,10 +365,10 @@ public class CartServiceImpl implements CartService {
 
         // 重新计算总金额和总数量
         BigDecimal totalAmount = items.stream()
-                .map(WechatCartItemDTO::getSubtotalAmount)
+                .map(CartItemDTO::getSubtotalAmount)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
         Integer totalQuantity = items.stream()
-                .mapToInt(WechatCartItemDTO::getQuantity)
+                .mapToInt(CartItemDTO::getQuantity)
                 .sum();
         cart.setTotalAmount(totalAmount);
         cart.setTotalQuantity(totalQuantity);
@@ -382,8 +382,8 @@ public class CartServiceImpl implements CartService {
         log.info("清空购物车(保留已下单商品), tableId={}", tableId);
         
         // 获取购物车
-        WechatCartDTO cart = getCart(tableId);
-        List<WechatCartItemDTO> items = cart.getItems();
+        CartDTO cart = getCart(tableId);
+        List<CartItemDTO> items = cart.getItems();
         
         if (items == null || items.isEmpty()) {
             log.info("购物车为空,无需清空, tableId={}", tableId);
@@ -391,13 +391,13 @@ public class CartServiceImpl implements CartService {
         }
         
         // 分离已下单的商品、未下单的商品和餐具
-        List<WechatCartItemDTO> orderedItems = new ArrayList<>(); // 已下单的商品(保留,数量恢复为已下单数量)
+        List<CartItemDTO> orderedItems = new ArrayList<>(); // 已下单的商品(保留,数量恢复为已下单数量)
         List<Integer> orderedCuisineIds = new ArrayList<>(); // 已下单的商品ID列表
-        List<WechatCartItemDTO> unorderedItems = new ArrayList<>(); // 未下单的商品(删除)
-        WechatCartItemDTO tablewareItem = null; // 餐具项(始终保留)
+        List<CartItemDTO> unorderedItems = new ArrayList<>(); // 未下单的商品(删除)
+        CartItemDTO tablewareItem = null; // 餐具项(始终保留)
         boolean hasChanges = false; // 是否有变化(需要更新)
         
-        for (WechatCartItemDTO item : items) {
+        for (CartItemDTO item : items) {
             // 餐具始终保留,不清空
             if (TABLEWARE_CUISINE_ID.equals(item.getCuisineId())) {
                 tablewareItem = item;
@@ -449,10 +449,10 @@ public class CartServiceImpl implements CartService {
             cart.setItems(orderedItems);
             // 重新计算总金额和总数量(只计算保留的商品,数量已恢复为已下单数量)
             BigDecimal totalAmount = orderedItems.stream()
-                    .map(WechatCartItemDTO::getSubtotalAmount)
+                    .map(CartItemDTO::getSubtotalAmount)
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             Integer totalQuantity = orderedItems.stream()
-                    .mapToInt(WechatCartItemDTO::getQuantity)
+                    .mapToInt(CartItemDTO::getQuantity)
                     .sum();
             cart.setTotalAmount(totalAmount);
             cart.setTotalQuantity(totalQuantity);
@@ -469,19 +469,19 @@ public class CartServiceImpl implements CartService {
             
             // 2. 从数据库中逻辑删除未下单的商品(排除餐具)
             if (!unorderedItems.isEmpty()) {
-                LambdaQueryWrapper<WechatStoreCart> wrapper = new LambdaQueryWrapper<>();
-                wrapper.eq(WechatStoreCart::getTableId, tableId);
-                wrapper.eq(WechatStoreCart::getDeleteFlag, 0);
+                LambdaQueryWrapper<StoreCart> wrapper = new LambdaQueryWrapper<>();
+                wrapper.eq(StoreCart::getTableId, tableId);
+                wrapper.eq(StoreCart::getDeleteFlag, 0);
                 // 排除餐具(cuisineId = -1)
-                wrapper.ne(WechatStoreCart::getCuisineId, TABLEWARE_CUISINE_ID);
+                wrapper.ne(StoreCart::getCuisineId, TABLEWARE_CUISINE_ID);
                 if (!orderedCuisineIds.isEmpty()) {
                     // 排除已下单的商品ID(包括餐具)
-                    wrapper.notIn(WechatStoreCart::getCuisineId, orderedCuisineIds);
+                    wrapper.notIn(StoreCart::getCuisineId, orderedCuisineIds);
                 }
-                List<WechatStoreCart> cartListToDelete = storeCartMapper.selectList(wrapper);
+                List<StoreCart> cartListToDelete = storeCartMapper.selectList(wrapper);
                 if (cartListToDelete != null && !cartListToDelete.isEmpty()) {
                     List<Integer> cartIds = cartListToDelete.stream()
-                            .map(WechatStoreCart::getId)
+                            .map(StoreCart::getId)
                             .collect(Collectors.toList());
                     // 使用 deleteBatchIds 进行逻辑删除(MyBatis-Plus 会自动处理 @TableLogic)
                     storeCartMapper.deleteBatchIds(cartIds);
@@ -496,7 +496,7 @@ public class CartServiceImpl implements CartService {
             }
             
             // 4. 更新桌号表的购物车统计
-            WechatStoreTable table = storeTableMapper.selectById(tableId);
+            StoreTable table = storeTableMapper.selectById(tableId);
             if (table != null) {
                 table.setCartItemCount(totalQuantity);
                 table.setCartTotalAmount(totalAmount);
@@ -511,24 +511,24 @@ public class CartServiceImpl implements CartService {
     }
 
     @Override
-    public WechatCartDTO migrateCart(Integer fromTableId, Integer toTableId) {
+    public CartDTO migrateCart(Integer fromTableId, Integer toTableId) {
         log.info("迁移购物车, fromTableId={}, toTableId={}", fromTableId, toTableId);
         // 获取原购物车
-        WechatCartDTO fromCart = getCart(fromTableId);
+        CartDTO fromCart = getCart(fromTableId);
 
         // 验证目标桌号
-        WechatStoreTable toTable = storeTableMapper.selectById(toTableId);
+        StoreTable toTable = storeTableMapper.selectById(toTableId);
         if (toTable == null) {
             throw new RuntimeException("目标桌号不存在");
         }
 
         // 获取目标购物车
-        WechatCartDTO toCart = getCart(toTableId);
+        CartDTO toCart = getCart(toTableId);
 
         // 合并购物车(如果目标桌号已有商品,则合并)
-        List<WechatCartItemDTO> mergedItems = new ArrayList<>(toCart.getItems());
-        for (WechatCartItemDTO fromItem : fromCart.getItems()) {
-            WechatCartItemDTO existingItem = mergedItems.stream()
+        List<CartItemDTO> mergedItems = new ArrayList<>(toCart.getItems());
+        for (CartItemDTO fromItem : fromCart.getItems()) {
+            CartItemDTO existingItem = mergedItems.stream()
                     .filter(item -> item.getCuisineId().equals(fromItem.getCuisineId()))
                     .findFirst()
                     .orElse(null);
@@ -556,10 +556,10 @@ public class CartServiceImpl implements CartService {
 
         // 重新计算总金额和总数量
         BigDecimal totalAmount = mergedItems.stream()
-                .map(WechatCartItemDTO::getSubtotalAmount)
+                .map(CartItemDTO::getSubtotalAmount)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
         Integer totalQuantity = mergedItems.stream()
-                .mapToInt(WechatCartItemDTO::getQuantity)
+                .mapToInt(CartItemDTO::getQuantity)
                 .sum();
         toCart.setTotalAmount(totalAmount);
         toCart.setTotalQuantity(totalQuantity);
@@ -593,13 +593,13 @@ public class CartServiceImpl implements CartService {
         }
 
         // Redis中没有,查数据库
-        LambdaQueryWrapper<WechatStoreCouponUsage> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStoreCouponUsage::getTableId, tableId);
-        wrapper.eq(WechatStoreCouponUsage::getDeleteFlag, 0);
-        wrapper.in(WechatStoreCouponUsage::getUsageStatus, 0, 1, 2); // 已标记使用、已下单、已支付
-        wrapper.orderByDesc(WechatStoreCouponUsage::getCreatedTime);
+        LambdaQueryWrapper<StoreCouponUsage> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreCouponUsage::getTableId, tableId);
+        wrapper.eq(StoreCouponUsage::getDeleteFlag, 0);
+        wrapper.in(StoreCouponUsage::getUsageStatus, 0, 1, 2); // 已标记使用、已下单、已支付
+        wrapper.orderByDesc(StoreCouponUsage::getCreatedTime);
         wrapper.last("LIMIT 1");
-        WechatStoreCouponUsage usage = storeCouponUsageMapper.selectOne(wrapper);
+        StoreCouponUsage usage = storeCouponUsageMapper.selectOne(wrapper);
         return usage != null;
     }
 
@@ -610,22 +610,22 @@ public class CartServiceImpl implements CartService {
         baseRedisService.setString(couponUsedKey, String.valueOf(couponId), (long) CART_EXPIRE_SECONDS);
 
         // 保存到数据库
-        WechatStoreTable table = storeTableMapper.selectById(tableId);
+        StoreTable table = storeTableMapper.selectById(tableId);
         if (table == null) {
             log.warn("桌号不存在, tableId={}", tableId);
             return;
         }
 
         // 检查是否已存在
-        LambdaQueryWrapper<WechatStoreCouponUsage> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStoreCouponUsage::getTableId, tableId);
-        wrapper.eq(WechatStoreCouponUsage::getCouponId, couponId);
-        wrapper.eq(WechatStoreCouponUsage::getDeleteFlag, 0);
-        WechatStoreCouponUsage existing = storeCouponUsageMapper.selectOne(wrapper);
+        LambdaQueryWrapper<StoreCouponUsage> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreCouponUsage::getTableId, tableId);
+        wrapper.eq(StoreCouponUsage::getCouponId, couponId);
+        wrapper.eq(StoreCouponUsage::getDeleteFlag, 0);
+        StoreCouponUsage existing = storeCouponUsageMapper.selectOne(wrapper);
 
         if (existing == null) {
             Date now = new Date();
-            WechatStoreCouponUsage usage = new WechatStoreCouponUsage();
+            StoreCouponUsage usage = new StoreCouponUsage();
             usage.setTableId(tableId);
             usage.setStoreId(table.getStoreId());
             usage.setCouponId(couponId);
@@ -651,21 +651,21 @@ public class CartServiceImpl implements CartService {
         baseRedisService.delete(couponUsedKey);
 
         // 更新数据库(逻辑删除未下单的记录,使用 MyBatis-Plus 的 deleteBatchIds)
-        LambdaQueryWrapper<WechatStoreCouponUsage> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStoreCouponUsage::getTableId, tableId);
-        wrapper.eq(WechatStoreCouponUsage::getDeleteFlag, 0);
-        wrapper.eq(WechatStoreCouponUsage::getUsageStatus, 0); // 只删除已标记使用但未下单的
-        List<WechatStoreCouponUsage> usageList = storeCouponUsageMapper.selectList(wrapper);
+        LambdaQueryWrapper<StoreCouponUsage> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreCouponUsage::getTableId, tableId);
+        wrapper.eq(StoreCouponUsage::getDeleteFlag, 0);
+        wrapper.eq(StoreCouponUsage::getUsageStatus, 0); // 只删除已标记使用但未下单的
+        List<StoreCouponUsage> usageList = storeCouponUsageMapper.selectList(wrapper);
         if (usageList != null && !usageList.isEmpty()) {
             List<Integer> usageIds = usageList.stream()
-                    .map(WechatStoreCouponUsage::getId)
+                    .map(StoreCouponUsage::getId)
                     .collect(Collectors.toList());
             // 使用 deleteBatchIds 进行逻辑删除(MyBatis-Plus 会自动处理 @TableLogic)
             storeCouponUsageMapper.deleteBatchIds(usageIds);
         }
 
         // 更新桌号表的优惠券ID
-        WechatStoreTable table = storeTableMapper.selectById(tableId);
+        StoreTable table = storeTableMapper.selectById(tableId);
         if (table != null) {
             table.setCurrentCouponId(null);
             storeTableMapper.updateById(table);
@@ -703,7 +703,7 @@ public class CartServiceImpl implements CartService {
     }
 
     @Override
-    public WechatCartDTO setDinerCount(Integer tableId, Integer dinerCount) {
+    public CartDTO setDinerCount(Integer tableId, Integer dinerCount) {
         log.info("设置用餐人数, tableId={}, dinerCount={}", tableId, dinerCount);
         
         if (dinerCount == null || dinerCount <= 0) {
@@ -711,14 +711,14 @@ public class CartServiceImpl implements CartService {
         }
 
         // 获取购物车
-        WechatCartDTO cart = getCart(tableId);
-        List<WechatCartItemDTO> items = cart.getItems();
+        CartDTO cart = getCart(tableId);
+        List<CartItemDTO> items = cart.getItems();
 
         // 获取门店ID和餐具单价
         Integer storeId = cart.getStoreId();
         if (storeId == null) {
             // 如果购物车中没有门店ID,从桌号获取
-            WechatStoreTable table = storeTableMapper.selectById(tableId);
+            StoreTable table = storeTableMapper.selectById(tableId);
             if (table != null) {
                 storeId = table.getStoreId();
             }
@@ -728,7 +728,7 @@ public class CartServiceImpl implements CartService {
         // 商铺未设置餐具费时,不往购物车加餐具;若已有餐具项则移除
         if (tablewareUnitPrice == null || tablewareUnitPrice.compareTo(BigDecimal.ZERO) <= 0) {
             log.info("门店未设置餐具费, storeId={},设置就餐人数时不添加餐具", storeId);
-            WechatCartItemDTO existing = items.stream()
+            CartItemDTO existing = items.stream()
                     .filter(item -> TABLEWARE_CUISINE_ID.equals(item.getCuisineId()))
                     .findFirst()
                     .orElse(null);
@@ -737,7 +737,7 @@ public class CartServiceImpl implements CartService {
             }
         } else {
             // 查找是否已存在餐具项
-            WechatCartItemDTO tablewareItem = items.stream()
+            CartItemDTO tablewareItem = items.stream()
                     .filter(item -> TABLEWARE_CUISINE_ID.equals(item.getCuisineId()))
                     .findFirst()
                     .orElse(null);
@@ -754,7 +754,7 @@ public class CartServiceImpl implements CartService {
                 tablewareItem.setUnitPrice(tablewareUnitPrice);
                 tablewareItem.setSubtotalAmount(tablewareUnitPrice.multiply(BigDecimal.valueOf(dinerCount)));
             } else {
-                WechatCartItemDTO newTablewareItem = new WechatCartItemDTO();
+                CartItemDTO newTablewareItem = new CartItemDTO();
                 newTablewareItem.setCuisineId(TABLEWARE_CUISINE_ID);
                 newTablewareItem.setCuisineName(TABLEWARE_NAME);
                 newTablewareItem.setCuisineType(0);
@@ -770,10 +770,10 @@ public class CartServiceImpl implements CartService {
 
         // 重新计算总金额和总数量
         BigDecimal totalAmount = items.stream()
-                .map(WechatCartItemDTO::getSubtotalAmount)
+                .map(CartItemDTO::getSubtotalAmount)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
         Integer totalQuantity = items.stream()
-                .mapToInt(WechatCartItemDTO::getQuantity)
+                .mapToInt(CartItemDTO::getQuantity)
                 .sum();
         cart.setTotalAmount(totalAmount);
         cart.setTotalQuantity(totalQuantity);
@@ -785,7 +785,7 @@ public class CartServiceImpl implements CartService {
     }
 
     @Override
-    public WechatCartDTO updateTablewareQuantity(Integer tableId, Integer quantity) {
+    public CartDTO updateTablewareQuantity(Integer tableId, Integer quantity) {
         log.info("更新餐具数量, tableId={}, quantity={}", tableId, quantity);
         
         if (quantity == null || quantity < 0) {
@@ -798,13 +798,13 @@ public class CartServiceImpl implements CartService {
         }
 
         // 获取购物车
-        WechatCartDTO cart = getCart(tableId);
-        List<WechatCartItemDTO> items = cart.getItems();
+        CartDTO cart = getCart(tableId);
+        List<CartItemDTO> items = cart.getItems();
 
         // 获取门店ID和餐具单价
         Integer storeId = cart.getStoreId();
         if (storeId == null) {
-            WechatStoreTable table = storeTableMapper.selectById(tableId);
+            StoreTable table = storeTableMapper.selectById(tableId);
             if (table != null) {
                 storeId = table.getStoreId();
             }
@@ -814,17 +814,17 @@ public class CartServiceImpl implements CartService {
         // 商铺未设置餐具费(单价为0或未配置)时,不往购物车加餐具;若已有餐具项则移除
         if (tablewareUnitPrice == null || tablewareUnitPrice.compareTo(BigDecimal.ZERO) <= 0) {
             log.info("门店未设置餐具费, storeId={},不添加餐具到购物车", storeId);
-            WechatCartItemDTO existing = items.stream()
+            CartItemDTO existing = items.stream()
                     .filter(item -> TABLEWARE_CUISINE_ID.equals(item.getCuisineId()))
                     .findFirst()
                     .orElse(null);
             if (existing != null) {
                 items.remove(existing);
                 BigDecimal totalAmount = items.stream()
-                        .map(WechatCartItemDTO::getSubtotalAmount)
+                        .map(CartItemDTO::getSubtotalAmount)
                         .reduce(BigDecimal.ZERO, BigDecimal::add);
                 Integer totalQuantity = items.stream()
-                        .mapToInt(WechatCartItemDTO::getQuantity)
+                        .mapToInt(CartItemDTO::getQuantity)
                         .sum();
                 cart.setTotalAmount(totalAmount);
                 cart.setTotalQuantity(totalQuantity);
@@ -834,7 +834,7 @@ public class CartServiceImpl implements CartService {
         }
 
         // 查找餐具项
-        WechatCartItemDTO tablewareItem = items.stream()
+        CartItemDTO tablewareItem = items.stream()
                 .filter(item -> TABLEWARE_CUISINE_ID.equals(item.getCuisineId()))
                 .findFirst()
                 .orElse(null);
@@ -844,7 +844,7 @@ public class CartServiceImpl implements CartService {
             Integer userId = TokenUtil.getCurrentUserId();
             String userPhone = TokenUtil.getCurrentUserPhone();
             
-            tablewareItem = new WechatCartItemDTO();
+            tablewareItem = new CartItemDTO();
             tablewareItem.setCuisineId(TABLEWARE_CUISINE_ID);
             tablewareItem.setCuisineName(TABLEWARE_NAME);
             tablewareItem.setCuisineType(0); // 0表示餐具
@@ -869,10 +869,10 @@ public class CartServiceImpl implements CartService {
 
         // 重新计算总金额和总数量
         BigDecimal totalAmount = items.stream()
-                .map(WechatCartItemDTO::getSubtotalAmount)
+                .map(CartItemDTO::getSubtotalAmount)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
         Integer totalQuantity = items.stream()
-                .mapToInt(WechatCartItemDTO::getQuantity)
+                .mapToInt(CartItemDTO::getQuantity)
                 .sum();
         cart.setTotalAmount(totalAmount);
         cart.setTotalQuantity(totalQuantity);
@@ -884,12 +884,12 @@ public class CartServiceImpl implements CartService {
     }
 
     @Override
-    public WechatCartDTO lockCartItems(Integer tableId) {
+    public CartDTO lockCartItems(Integer tableId) {
         log.info("锁定购物车商品数量(设置已下单数量), tableId={}", tableId);
         
         // 获取购物车
-        WechatCartDTO cart = getCart(tableId);
-        List<WechatCartItemDTO> items = cart.getItems();
+        CartDTO cart = getCart(tableId);
+        List<CartItemDTO> items = cart.getItems();
         
         if (items == null || items.isEmpty()) {
             log.warn("购物车为空,无需锁定, tableId={}", tableId);
@@ -898,7 +898,7 @@ public class CartServiceImpl implements CartService {
         
         // 遍历所有商品,将当前数量设置为已下单数量
         boolean hasChanges = false;
-        for (WechatCartItemDTO item : items) {
+        for (CartItemDTO item : items) {
             Integer currentQuantity = item.getQuantity();
             Integer lockedQuantity = item.getLockedQuantity();
             
@@ -928,12 +928,12 @@ public class CartServiceImpl implements CartService {
     }
 
     @Override
-    public WechatCartDTO unlockCartItems(Integer tableId) {
+    public CartDTO unlockCartItems(Integer tableId) {
         log.info("解锁购物车商品数量(清除已下单数量), tableId={}", tableId);
         
         // 获取购物车
-        WechatCartDTO cart = getCart(tableId);
-        List<WechatCartItemDTO> items = cart.getItems();
+        CartDTO cart = getCart(tableId);
+        List<CartItemDTO> items = cart.getItems();
         
         if (items == null || items.isEmpty()) {
             log.info("购物车为空,无需解锁, tableId={}", tableId);
@@ -942,7 +942,7 @@ public class CartServiceImpl implements CartService {
         
         // 遍历所有商品,清除已下单数量(lockedQuantity)
         boolean hasChanges = false;
-        for (WechatCartItemDTO item : items) {
+        for (CartItemDTO item : items) {
             if (item.getLockedQuantity() != null && item.getLockedQuantity() > 0) {
                 // 清除已下单数量,允许重新下单
                 item.setLockedQuantity(null);
@@ -966,7 +966,7 @@ public class CartServiceImpl implements CartService {
      * 保存购物车到Redis和数据库(优化后的双写策略)
      * Redis同步写入(保证实时性),数据库异步批量写入(提高性能)
      */
-    private void saveCart(WechatCartDTO cart) {
+    private void saveCart(CartDTO cart) {
         // 1. 同步保存到Redis(保证实时性)
         saveCartToRedis(cart);
 
@@ -983,7 +983,7 @@ public class CartServiceImpl implements CartService {
     /**
      * 保存购物车到Redis
      */
-    private void saveCartToRedis(WechatCartDTO cart) {
+    private void saveCartToRedis(CartDTO cart) {
         String cartKey = CART_KEY_PREFIX + cart.getTableId();
         String cartJson = JSON.toJSONString(cart);
         baseRedisService.setString(cartKey, cartJson, (long) CART_EXPIRE_SECONDS);
@@ -993,19 +993,19 @@ public class CartServiceImpl implements CartService {
      * 保存购物车到数据库(优化后的批量操作版本)
      * 使用批量逻辑删除和批量插入,提高性能
      */
-    private void saveCartToDatabase(WechatCartDTO cart) {
+    private void saveCartToDatabase(CartDTO cart) {
         try {
             Date now = new Date();
             Integer userId = TokenUtil.getCurrentUserId();
 
             // 1. 批量逻辑删除该桌号的所有购物车记录(使用 MyBatis-Plus 的 deleteBatchIds)
-            LambdaQueryWrapper<WechatStoreCart> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(WechatStoreCart::getTableId, cart.getTableId())
-                    .eq(WechatStoreCart::getDeleteFlag, 0);
-            List<WechatStoreCart> existingCartList = storeCartMapper.selectList(queryWrapper);
+            LambdaQueryWrapper<StoreCart> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(StoreCart::getTableId, cart.getTableId())
+                    .eq(StoreCart::getDeleteFlag, 0);
+            List<StoreCart> existingCartList = storeCartMapper.selectList(queryWrapper);
             if (existingCartList != null && !existingCartList.isEmpty()) {
                 List<Integer> cartIds = existingCartList.stream()
-                        .map(WechatStoreCart::getId)
+                        .map(StoreCart::getId)
                         .collect(Collectors.toList());
                 // 使用 deleteBatchIds 进行逻辑删除(MyBatis-Plus 会自动处理 @TableLogic)
                 storeCartMapper.deleteBatchIds(cartIds);
@@ -1013,9 +1013,9 @@ public class CartServiceImpl implements CartService {
 
             // 2. 批量插入新的购物车记录
             if (cart.getItems() != null && !cart.getItems().isEmpty()) {
-                List<WechatStoreCart> cartList = new ArrayList<>(cart.getItems().size());
-                for (WechatCartItemDTO item : cart.getItems()) {
-                    WechatStoreCart storeCart = new WechatStoreCart();
+                List<StoreCart> cartList = new ArrayList<>(cart.getItems().size());
+                for (CartItemDTO item : cart.getItems()) {
+                    StoreCart storeCart = new StoreCart();
                     storeCart.setTableId(cart.getTableId());
                     storeCart.setStoreId(cart.getStoreId());
                     storeCart.setCuisineId(item.getCuisineId());
@@ -1038,7 +1038,7 @@ public class CartServiceImpl implements CartService {
                 // 批量插入(如果数量较少,直接循环插入;如果数量较多,可以考虑分批插入)
                 if (cartList.size() <= 50) {
                     // 小批量直接插入
-                    for (WechatStoreCart storeCart : cartList) {
+                    for (StoreCart storeCart : cartList) {
                         storeCartMapper.insert(storeCart);
                     }
                 } else {
@@ -1046,8 +1046,8 @@ public class CartServiceImpl implements CartService {
                     int batchSize = 50;
                     for (int i = 0; i < cartList.size(); i += batchSize) {
                         int end = Math.min(i + batchSize, cartList.size());
-                        List<WechatStoreCart> batch = cartList.subList(i, end);
-                        for (WechatStoreCart storeCart : batch) {
+                        List<StoreCart> batch = cartList.subList(i, end);
+                        for (StoreCart storeCart : batch) {
                             storeCartMapper.insert(storeCart);
                         }
                     }
@@ -1055,7 +1055,7 @@ public class CartServiceImpl implements CartService {
             }
 
             // 3. 更新桌号表的购物车统计
-            WechatStoreTable table = storeTableMapper.selectById(cart.getTableId());
+            StoreTable table = storeTableMapper.selectById(cart.getTableId());
             if (table != null) {
                 table.setCartItemCount(cart.getTotalQuantity());
                 table.setCartTotalAmount(cart.getTotalAmount());

+ 67 - 71
alien-dining/src/main/java/shop/alien/dining/service/impl/DiningServiceImpl.java

@@ -7,14 +7,10 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 import shop.alien.entity.store.*;
-import shop.alien.entity.store.wechat.*;
-import shop.alien.entity.store.dto.wechat.WechatCartDTO;
-import shop.alien.entity.store.dto.wechat.WechatCartItemDTO;
+import shop.alien.entity.store.dto.CartDTO;
+import shop.alien.entity.store.dto.CartItemDTO;
 import shop.alien.entity.store.vo.*;
-import shop.alien.entity.store.vo.wechat.WechatOrderConfirmVO;
-import shop.alien.entity.store.vo.wechat.WechatOrderSettlementVO;
 import shop.alien.mapper.*;
-import shop.alien.mapper.wechat.*;
 import shop.alien.dining.config.BaseRedisService;
 import shop.alien.dining.service.CartService;
 import shop.alien.dining.service.DiningService;
@@ -35,18 +31,18 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor
 public class DiningServiceImpl implements DiningService {
 
-    private final WechatStoreTableMapper storeTableMapper;
+    private final StoreTableMapper storeTableMapper;
     private final StoreInfoMapper storeInfoMapper;
-    private final WechatStoreCuisineMapper storeCuisineMapper;
-    private final WechatStoreCuisineCategoryMapper storeCuisineCategoryMapper;
-    private final WechatStoreCuisineComboMapper storeCuisineComboMapper;
-    private final WechatStoreOrderDetailMapper storeOrderDetailMapper;
+    private final StoreCuisineMapper storeCuisineMapper;
+    private final StoreCuisineCategoryMapper storeCuisineCategoryMapper;
+    private final StoreCuisineComboMapper storeCuisineComboMapper;
+    private final StoreOrderDetailMapper storeOrderDetailMapper;
     private final LifeDiscountCouponMapper lifeDiscountCouponMapper;
     private final LifeDiscountCouponUserMapper lifeDiscountCouponUserMapper;
     private final CartService cartService;
     private final BaseRedisService baseRedisService;
     private final shop.alien.dining.service.StoreOrderService storeOrderService;
-    private final WechatStoreOrderMapper storeOrderMapper;
+    private final shop.alien.mapper.StoreOrderMapper storeOrderMapper;
     private final shop.alien.dining.service.OrderLockService orderLockService;
 
     @Override
@@ -54,7 +50,7 @@ public class DiningServiceImpl implements DiningService {
         if (tableId == null) {
             return new TableDiningStatusVO(null, false, null);
         }
-        WechatStoreTable table = storeTableMapper.selectById(tableId);
+        StoreTable table = storeTableMapper.selectById(tableId);
         if (table == null) {
             return new TableDiningStatusVO(tableId, false, null);
         }
@@ -69,7 +65,7 @@ public class DiningServiceImpl implements DiningService {
     @Override
     public DiningPageInfoVO getDiningPageInfo(Integer tableId, Integer dinerCount) {
         log.info("获取点餐页面信息, tableId={}, dinerCount={}", tableId, dinerCount);
-        WechatStoreTable table = storeTableMapper.selectById(tableId);
+        StoreTable table = storeTableMapper.selectById(tableId);
         if (table == null) {
             throw new RuntimeException("桌号不存在");
         }
@@ -115,16 +111,16 @@ public class DiningServiceImpl implements DiningService {
             keyword = keyword.substring(0, 10);
         }
 
-        LambdaQueryWrapper<WechatStoreCuisine> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStoreCuisine::getStoreId, storeId);
-        wrapper.eq(WechatStoreCuisine::getDeleteFlag, 0);
-        wrapper.eq(WechatStoreCuisine::getShelfStatus, 1); // 只查询上架的
+        LambdaQueryWrapper<StoreCuisine> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreCuisine::getStoreId, storeId);
+        wrapper.eq(StoreCuisine::getDeleteFlag, 0);
+        wrapper.eq(StoreCuisine::getShelfStatus, 1); // 只查询上架的
         if (StringUtils.hasText(keyword)) {
-            wrapper.like(WechatStoreCuisine::getName, keyword);
+            wrapper.like(StoreCuisine::getName, keyword);
         }
-        wrapper.orderByDesc(WechatStoreCuisine::getCreatedTime);
+        wrapper.orderByDesc(StoreCuisine::getCreatedTime);
 
-        List<WechatStoreCuisine> cuisines = storeCuisineMapper.selectList(wrapper);
+        List<StoreCuisine> cuisines = storeCuisineMapper.selectList(wrapper);
         return convertToCuisineListVO(cuisines, tableId);
     }
 
@@ -139,21 +135,21 @@ public class DiningServiceImpl implements DiningService {
             size = 12;
         }
 
-        LambdaQueryWrapper<WechatStoreCuisine> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStoreCuisine::getStoreId, storeId);
-        wrapper.eq(WechatStoreCuisine::getDeleteFlag, 0);
-        wrapper.eq(WechatStoreCuisine::getShelfStatus, 1); // 只查询上架的
+        LambdaQueryWrapper<StoreCuisine> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreCuisine::getStoreId, storeId);
+        wrapper.eq(StoreCuisine::getDeleteFlag, 0);
+        wrapper.eq(StoreCuisine::getShelfStatus, 1); // 只查询上架的
         if (categoryId != null) {
             // 这里假设菜品表有category_id字段,如果没有需要关联查询
-            // wrapper.eq(WechatStoreCuisine::getCategoryId, categoryId);
+            // wrapper.eq(StoreCuisine::getCategoryId, categoryId);
         }
-        wrapper.orderByDesc(WechatStoreCuisine::getCreatedTime);
+        wrapper.orderByDesc(StoreCuisine::getCreatedTime);
 
         // 分页查询
         int offset = (page - 1) * size;
         wrapper.last("LIMIT " + offset + ", " + size);
 
-        List<WechatStoreCuisine> cuisines = storeCuisineMapper.selectList(wrapper);
+        List<StoreCuisine> cuisines = storeCuisineMapper.selectList(wrapper);
         return convertToCuisineListVO(cuisines, tableId);
     }
 
@@ -161,7 +157,7 @@ public class DiningServiceImpl implements DiningService {
     public CuisineDetailVO getCuisineDetail(Integer cuisineId, Integer tableId) {
         log.info("获取菜品详情, cuisineId={}, tableId={}", cuisineId, tableId);
 
-        WechatStoreCuisine cuisine = storeCuisineMapper.selectById(cuisineId);
+        StoreCuisine cuisine = storeCuisineMapper.selectById(cuisineId);
         if (cuisine == null) {
             throw new RuntimeException("菜品不存在");
         }
@@ -197,22 +193,22 @@ public class DiningServiceImpl implements DiningService {
         vo.setMonthlySales(getMonthlySales(cuisineId));
 
         // 获取购物车数量
-        WechatCartDTO cart = cartService.getCart(tableId);
+        CartDTO cart = cartService.getCart(tableId);
         if (cart.getItems() != null) {
-            Optional<WechatCartItemDTO> cartItem = cart.getItems().stream()
+            Optional<CartItemDTO> cartItem = cart.getItems().stream()
                     .filter(item -> item.getCuisineId().equals(cuisineId))
                     .findFirst();
-            vo.setCartQuantity(cartItem.map(WechatCartItemDTO::getQuantity).orElse(0));
+            vo.setCartQuantity(cartItem.map(CartItemDTO::getQuantity).orElse(0));
         } else {
             vo.setCartQuantity(0);
         }
 
         // 如果是套餐,获取套餐包含的菜品
         if (cuisine.getCuisineType() != null && cuisine.getCuisineType() == 2) {
-            LambdaQueryWrapper<WechatStoreCuisineCombo> comboWrapper = new LambdaQueryWrapper<>();
-            comboWrapper.eq(WechatStoreCuisineCombo::getCid, cuisineId);
-            comboWrapper.eq(WechatStoreCuisineCombo::getDeleteFlag, 0);
-            List<WechatStoreCuisineCombo> combos = storeCuisineComboMapper.selectList(comboWrapper);
+            LambdaQueryWrapper<StoreCuisineCombo> comboWrapper = new LambdaQueryWrapper<>();
+            comboWrapper.eq(StoreCuisineCombo::getCid, cuisineId);
+            comboWrapper.eq(StoreCuisineCombo::getDeleteFlag, 0);
+            List<StoreCuisineCombo> combos = storeCuisineComboMapper.selectList(comboWrapper);
 
             List<CuisineComboItemVO> comboItems = combos.stream().map(combo -> {
                 CuisineComboItemVO item = new CuisineComboItemVO();
@@ -220,7 +216,7 @@ public class DiningServiceImpl implements DiningService {
                 item.setQuantity(combo.getSnum());
                 item.setCategory(combo.getCategory());
                 // 查询菜品名称
-                WechatStoreCuisine comboCuisine = storeCuisineMapper.selectById(combo.getSid());
+                StoreCuisine comboCuisine = storeCuisineMapper.selectById(combo.getSid());
                 if (comboCuisine != null) {
                     item.setCuisineName(comboCuisine.getName());
                 }
@@ -326,7 +322,7 @@ public class DiningServiceImpl implements DiningService {
     }
 
     @Override
-    public WechatOrderConfirmVO getOrderConfirmInfo(Integer tableId, Integer dinerCount, Integer userId) {
+    public OrderConfirmVO getOrderConfirmInfo(Integer tableId, Integer dinerCount, Integer userId) {
         log.info("获取订单确认页面信息, tableId={}, dinerCount={}, userId={}", tableId, dinerCount, userId);
 
         // 获取点餐页面信息(就餐中且未传人数时,内部会使用桌台已保存的就餐人数)
@@ -335,26 +331,26 @@ public class DiningServiceImpl implements DiningService {
                 ? pageInfo.getDinerCount() : (dinerCount != null ? dinerCount : 0);
 
         // 获取购物车
-        WechatCartDTO cart = cartService.getCart(tableId);
+        CartDTO cart = cartService.getCart(tableId);
 
         // 为购物车项补全菜品标签(购物车从 DB 加载时可能无 tags)
-        List<WechatCartItemDTO> items = cart.getItems();
+        List<CartItemDTO> items = cart.getItems();
         if (items != null && !items.isEmpty()) {
             Set<Integer> cuisineIds = items.stream()
-                    .map(WechatCartItemDTO::getCuisineId)
+                    .map(CartItemDTO::getCuisineId)
                     .filter(Objects::nonNull)
                     .collect(Collectors.toSet());
             if (!cuisineIds.isEmpty()) {
-                List<WechatStoreCuisine> cuisines = storeCuisineMapper.selectBatchIds(new ArrayList<>(cuisineIds));
+                List<StoreCuisine> cuisines = storeCuisineMapper.selectBatchIds(new ArrayList<>(cuisineIds));
                 Map<Integer, String> tagsMap = new HashMap<>();
                 if (cuisines != null) {
-                    for (WechatStoreCuisine c : cuisines) {
+                    for (StoreCuisine c : cuisines) {
                         if (c.getTags() != null) {
                             tagsMap.put(c.getId(), c.getTags());
                         }
                     }
                 }
-                for (WechatCartItemDTO item : items) {
+                for (CartItemDTO item : items) {
                     if (item.getCuisineId() != null && item.getTags() == null) {
                         item.setTags(tagsMap.get(item.getCuisineId()));
                     }
@@ -366,7 +362,7 @@ public class DiningServiceImpl implements DiningService {
         Integer lockUserId = orderLockService.checkOrderLock(tableId);
         boolean isLocked = lockUserId != null && !lockUserId.equals(userId);
 
-        WechatOrderConfirmVO vo = new WechatOrderConfirmVO();
+        OrderConfirmVO vo = new OrderConfirmVO();
         vo.setStoreName(pageInfo.getStoreName());
         vo.setTableNumber(pageInfo.getTableNumber());
         vo.setDinerCount(pageInfo.getDinerCount() != null ? pageInfo.getDinerCount() : dinerCount);
@@ -458,18 +454,18 @@ public class DiningServiceImpl implements DiningService {
     /**
      * 转换为菜品列表VO
      */
-    private List<CuisineListVO> convertToCuisineListVO(List<WechatStoreCuisine> cuisines, Integer tableId) {
+    private List<CuisineListVO> convertToCuisineListVO(List<StoreCuisine> cuisines, Integer tableId) {
         // 获取购物车
-        WechatCartDTO cart = cartService.getCart(tableId);
+        CartDTO cart = cartService.getCart(tableId);
         Map<Integer, Integer> cartQuantityMap = new HashMap<>();
         if (cart.getItems() != null) {
             cartQuantityMap = cart.getItems().stream()
-                    .collect(Collectors.toMap(WechatCartItemDTO::getCuisineId, WechatCartItemDTO::getQuantity));
+                    .collect(Collectors.toMap(CartItemDTO::getCuisineId, CartItemDTO::getQuantity));
         }
 
         // 批量查询月售数量
         Map<Integer, Integer> monthlySalesMap = new HashMap<>();
-        for (WechatStoreCuisine cuisine : cuisines) {
+        for (StoreCuisine cuisine : cuisines) {
             monthlySalesMap.put(cuisine.getId(), getMonthlySales(cuisine.getId()));
         }
 
@@ -512,16 +508,16 @@ public class DiningServiceImpl implements DiningService {
             Date monthStart = calendar.getTime();
 
             // 查询订单明细中该菜品的销售数量
-            LambdaQueryWrapper<WechatStoreOrderDetail> wrapper = new LambdaQueryWrapper<>();
-            wrapper.eq(WechatStoreOrderDetail::getCuisineId, cuisineId);
-            wrapper.eq(WechatStoreOrderDetail::getDeleteFlag, 0);
-            wrapper.ge(WechatStoreOrderDetail::getCreatedTime, monthStart);
+            LambdaQueryWrapper<StoreOrderDetail> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(StoreOrderDetail::getCuisineId, cuisineId);
+            wrapper.eq(StoreOrderDetail::getDeleteFlag, 0);
+            wrapper.ge(StoreOrderDetail::getCreatedTime, monthStart);
             // 只统计已支付的订单
-            wrapper.inSql(WechatStoreOrderDetail::getOrderId,
-                    "SELECT id FROM wechat_store_order WHERE pay_status = 1 AND delete_flag = 0");
+            wrapper.inSql(StoreOrderDetail::getOrderId,
+                    "SELECT id FROM store_order WHERE pay_status = 1 AND delete_flag = 0");
 
-            List<WechatStoreOrderDetail> details = storeOrderDetailMapper.selectList(wrapper);
-            return details.stream().mapToInt(WechatStoreOrderDetail::getQuantity).sum();
+            List<StoreOrderDetail> details = storeOrderDetailMapper.selectList(wrapper);
+            return details.stream().mapToInt(StoreOrderDetail::getQuantity).sum();
         } catch (Exception e) {
             log.error("获取月售数量失败, cuisineId={}", cuisineId, e);
             return 0;
@@ -529,32 +525,32 @@ public class DiningServiceImpl implements DiningService {
     }
 
     @Override
-    public WechatOrderSettlementVO getOrderSettlementInfo(Integer orderId, Integer userId) {
+    public shop.alien.entity.store.vo.OrderSettlementVO getOrderSettlementInfo(Integer orderId, Integer userId) {
         log.info("获取订单结算确认页面信息, orderId={}, userId={}", orderId, userId);
 
         // 查询订单
-        shop.alien.entity.store.wechat.WechatStoreOrder order = storeOrderService.getOrderById(orderId);
+        shop.alien.entity.store.StoreOrder order = storeOrderService.getOrderById(orderId);
         if (order == null) {
             throw new RuntimeException("订单不存在");
         }
 
         // 查询订单明细
-        LambdaQueryWrapper<shop.alien.entity.store.wechat.WechatStoreOrderDetail> detailWrapper = new LambdaQueryWrapper<>();
-        detailWrapper.eq(shop.alien.entity.store.wechat.WechatStoreOrderDetail::getOrderId, orderId);
-        detailWrapper.eq(shop.alien.entity.store.wechat.WechatStoreOrderDetail::getDeleteFlag, 0);
-        detailWrapper.orderByDesc(shop.alien.entity.store.wechat.WechatStoreOrderDetail::getCreatedTime);
-        List<shop.alien.entity.store.wechat.WechatStoreOrderDetail> details = storeOrderDetailMapper.selectList(detailWrapper);
+        LambdaQueryWrapper<shop.alien.entity.store.StoreOrderDetail> detailWrapper = new LambdaQueryWrapper<>();
+        detailWrapper.eq(shop.alien.entity.store.StoreOrderDetail::getOrderId, orderId);
+        detailWrapper.eq(shop.alien.entity.store.StoreOrderDetail::getDeleteFlag, 0);
+        detailWrapper.orderByDesc(shop.alien.entity.store.StoreOrderDetail::getCreatedTime);
+        List<shop.alien.entity.store.StoreOrderDetail> details = storeOrderDetailMapper.selectList(detailWrapper);
 
         // 批量查询菜品标签
         Set<Integer> cuisineIds = details.stream()
-                .map(shop.alien.entity.store.wechat.WechatStoreOrderDetail::getCuisineId)
+                .map(shop.alien.entity.store.StoreOrderDetail::getCuisineId)
                 .filter(Objects::nonNull)
                 .collect(Collectors.toSet());
         Map<Integer, String> cuisineIdToTags = new HashMap<>();
         if (!cuisineIds.isEmpty()) {
-            List<WechatStoreCuisine> cuisines = storeCuisineMapper.selectBatchIds(new ArrayList<>(cuisineIds));
+            List<StoreCuisine> cuisines = storeCuisineMapper.selectBatchIds(new ArrayList<>(cuisineIds));
             if (cuisines != null) {
-                for (WechatStoreCuisine c : cuisines) {
+                for (StoreCuisine c : cuisines) {
                     if (c.getTags() != null) {
                         cuisineIdToTags.put(c.getId(), c.getTags());
                     }
@@ -562,10 +558,10 @@ public class DiningServiceImpl implements DiningService {
             }
         }
 
-        // 转换为 WechatCartItemDTO(含菜品标签)
+        // 转换为CartItemDTO(含菜品标签)
         Map<Integer, String> finalTagsMap = cuisineIdToTags;
-        List<WechatCartItemDTO> items = details.stream().map(detail -> {
-            WechatCartItemDTO item = new WechatCartItemDTO();
+        List<shop.alien.entity.store.dto.CartItemDTO> items = details.stream().map(detail -> {
+            shop.alien.entity.store.dto.CartItemDTO item = new shop.alien.entity.store.dto.CartItemDTO();
             item.setCuisineId(detail.getCuisineId());
             item.setCuisineName(detail.getCuisineName());
             item.setCuisineType(detail.getCuisineType());
@@ -587,7 +583,7 @@ public class DiningServiceImpl implements DiningService {
         Integer lockUserId = orderLockService.checkSettlementLock(orderId);
         boolean isLocked = lockUserId != null && !lockUserId.equals(userId);
 
-        WechatOrderSettlementVO vo = new WechatOrderSettlementVO();
+        shop.alien.entity.store.vo.OrderSettlementVO vo = new shop.alien.entity.store.vo.OrderSettlementVO();
         vo.setOrderId(order.getId());
         vo.setOrderNo(order.getOrderNo());
         vo.setStoreName(storeInfo != null ? storeInfo.getStoreName() : null);

+ 101 - 0
alien-dining/src/main/java/shop/alien/dining/service/impl/DiningWalkInReservationServiceImpl.java

@@ -0,0 +1,101 @@
+package shop.alien.dining.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+import shop.alien.dining.service.DiningWalkInReservationService;
+import shop.alien.entity.store.StoreTable;
+import shop.alien.entity.store.UserReservation;
+import shop.alien.entity.store.UserReservationTable;
+import shop.alien.entity.store.dto.DiningWalkInReservationDTO;
+import shop.alien.mapper.StoreTableMapper;
+import shop.alien.mapper.UserReservationMapper;
+import shop.alien.mapper.UserReservationTableMapper;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
+import java.util.concurrent.ThreadLocalRandom;
+
+/**
+ * 点餐流程:填写就餐信息 → 仅写 user_reservation + user_reservation_table,状态已到店,不产生 user_reservation_order
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class DiningWalkInReservationServiceImpl extends ServiceImpl<UserReservationMapper, UserReservation>
+        implements DiningWalkInReservationService {
+
+    private final StoreTableMapper storeTableMapper;
+    private final UserReservationTableMapper userReservationTableMapper;
+
+    private static final int STATUS_ARRIVED = 2;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Integer createWalkInReservation(DiningWalkInReservationDTO dto, Integer userId) {
+        if (userId == null) {
+            throw new RuntimeException("用户未登录");
+        }
+        StoreTable table = storeTableMapper.selectById(dto.getTableId());
+        if (table == null) {
+            throw new RuntimeException("桌号不存在");
+        }
+
+        Date reservationDate = dto.getReservationDate();
+        if (reservationDate == null) {
+            ZoneId shanghai = ZoneId.of("Asia/Shanghai");
+            reservationDate = Date.from(LocalDate.now(shanghai).atStartOfDay(shanghai).toInstant());
+        }
+
+        Date now = new Date();
+        UserReservation entity = new UserReservation();
+        entity.setReservationNo(generateReservationNo());
+        entity.setUserId(userId);
+        entity.setStoreId(table.getStoreId());
+        entity.setReservationDate(reservationDate);
+        entity.setStartTime(trimOrNull(dto.getStartTime()));
+        entity.setEndTime(trimOrNull(dto.getEndTime()));
+        entity.setGuestCount(dto.getGuestCount());
+        entity.setCategoryId(table.getCategoryId());
+        entity.setStatus(STATUS_ARRIVED);
+        entity.setActualArrivalTime(now);
+        entity.setRemark(trimOrNull(dto.getRemark()));
+        entity.setReservationUserName(trimOrNull(dto.getReservationUserName()));
+        entity.setReservationUserGender(dto.getReservationUserGender());
+        entity.setReservationUserPhone(trimOrNull(dto.getReservationUserPhone()));
+        entity.setCreatedUserId(userId);
+        entity.setUpdatedUserId(userId);
+        entity.setCreatedTime(now);
+        entity.setUpdatedTime(now);
+
+        this.save(entity);
+
+        UserReservationTable link = new UserReservationTable();
+        link.setReservationId(entity.getId());
+        link.setTableId(table.getId());
+        link.setSort(0);
+        link.setCreatedUserId(userId);
+        link.setUpdatedUserId(userId);
+        userReservationTableMapper.insert(link);
+
+        log.info("点餐到店预约已创建 reservationId={} tableId={} userId={} status=已到店",
+                entity.getId(), table.getId(), userId);
+        return entity.getId();
+    }
+
+    private static String trimOrNull(String s) {
+        if (!StringUtils.hasText(s)) {
+            return null;
+        }
+        String t = s.trim();
+        return t.isEmpty() ? null : t;
+    }
+
+    private static String generateReservationNo() {
+        return "RV" + System.currentTimeMillis() + ThreadLocalRandom.current().nextInt(1000, 9999);
+    }
+}

+ 2 - 2
alien-dining/src/main/java/shop/alien/dining/service/impl/OrderLockServiceImpl.java

@@ -18,8 +18,8 @@ import shop.alien.dining.service.OrderLockService;
 @RequiredArgsConstructor
 public class OrderLockServiceImpl implements OrderLockService {
 
-    private static final String ORDER_LOCK_KEY_PREFIX = "wechat:order:lock:table:";
-    private static final String SETTLEMENT_LOCK_KEY_PREFIX = "wechat:settlement:lock:order:";
+    private static final String ORDER_LOCK_KEY_PREFIX = "order:lock:table:";
+    private static final String SETTLEMENT_LOCK_KEY_PREFIX = "settlement:lock:order:";
     private static final int ORDER_LOCK_EXPIRE_SECONDS = 300; // 5分钟过期
 
     private final BaseRedisService baseRedisService;

+ 59 - 59
alien-dining/src/main/java/shop/alien/dining/service/impl/StoreInfoServiceImpl.java

@@ -5,16 +5,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-import shop.alien.entity.store.wechat.WechatStoreCuisine;
-import shop.alien.entity.store.wechat.WechatStoreCuisineCategory;
+import shop.alien.entity.store.StoreCuisine;
+import shop.alien.entity.store.StoreCuisineCategory;
 import shop.alien.entity.store.StoreInfo;
-import shop.alien.entity.store.wechat.WechatStoreTable;
-import shop.alien.entity.store.dto.wechat.WechatStoreInfoWithHomepageCuisinesDTO;
-import shop.alien.entity.store.vo.wechat.WechatCategoryWithCuisinesVO;
-import shop.alien.mapper.wechat.WechatStoreCuisineCategoryMapper;
-import shop.alien.mapper.wechat.WechatStoreCuisineMapper;
+import shop.alien.entity.store.StoreTable;
+import shop.alien.entity.store.dto.StoreInfoWithHomepageCuisinesDTO;
+import shop.alien.entity.store.vo.CategoryWithCuisinesVO;
+import shop.alien.mapper.StoreCuisineCategoryMapper;
+import shop.alien.mapper.StoreCuisineMapper;
 import shop.alien.mapper.StoreInfoMapper;
-import shop.alien.mapper.wechat.WechatStoreTableMapper;
+import shop.alien.mapper.StoreTableMapper;
 import shop.alien.dining.service.StoreInfoService;
 import org.apache.commons.lang3.StringUtils;
 
@@ -33,55 +33,55 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor
 public class StoreInfoServiceImpl implements StoreInfoService {
 
-    private final WechatStoreTableMapper storeTableMapper;
-    private final WechatStoreCuisineCategoryMapper storeCuisineCategoryMapper;
-    private final WechatStoreCuisineMapper storeCuisineMapper;
+    private final StoreTableMapper storeTableMapper;
+    private final StoreCuisineCategoryMapper storeCuisineCategoryMapper;
+    private final StoreCuisineMapper storeCuisineMapper;
     private final StoreInfoMapper storeInfoMapper;
 
     @Override
-    public List<WechatStoreTable> getTablesByStoreId(Integer storeId) {
+    public List<StoreTable> getTablesByStoreId(Integer storeId) {
         log.info("根据门店ID查询桌号列表, storeId={}", storeId);
         
-        LambdaQueryWrapper<WechatStoreTable> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStoreTable::getStoreId, storeId);
-        wrapper.eq(WechatStoreTable::getDeleteFlag, 0);
-        wrapper.orderByAsc(WechatStoreTable::getTableNumber);
+        LambdaQueryWrapper<StoreTable> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreTable::getStoreId, storeId);
+        wrapper.eq(StoreTable::getDeleteFlag, 0);
+        wrapper.orderByAsc(StoreTable::getTableNumber);
         
         return storeTableMapper.selectList(wrapper);
     }
 
     @Override
-    public List<WechatStoreCuisineCategory> getCategoriesByStoreId(Integer storeId) {
+    public List<StoreCuisineCategory> getCategoriesByStoreId(Integer storeId) {
         log.info("根据门店ID查询菜品种类列表, storeId={}", storeId);
         
-        LambdaQueryWrapper<WechatStoreCuisineCategory> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStoreCuisineCategory::getStoreId, storeId);
-        wrapper.eq(WechatStoreCuisineCategory::getDeleteFlag, 0);
-        wrapper.eq(WechatStoreCuisineCategory::getStatus, 1); // 只查询启用的分类
-        wrapper.orderByAsc(WechatStoreCuisineCategory::getSort); // 按排序字段排序
+        LambdaQueryWrapper<StoreCuisineCategory> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreCuisineCategory::getStoreId, storeId);
+        wrapper.eq(StoreCuisineCategory::getDeleteFlag, 0);
+        wrapper.eq(StoreCuisineCategory::getStatus, 1); // 只查询启用的分类
+        wrapper.orderByAsc(StoreCuisineCategory::getSort); // 按排序字段排序
         
         return storeCuisineCategoryMapper.selectList(wrapper);
     }
 
     @Override
-    public List<WechatStoreCuisine> getCuisinesByCategoryId(Integer categoryId) {
+    public List<StoreCuisine> getCuisinesByCategoryId(Integer categoryId) {
         log.info("根据菜品种类ID查询菜品信息列表, categoryId={}", categoryId);
         
         // 先查询分类信息,获取 storeId
-        WechatStoreCuisineCategory category = storeCuisineCategoryMapper.selectById(categoryId);
+        StoreCuisineCategory category = storeCuisineCategoryMapper.selectById(categoryId);
         if (category == null) {
             log.warn("菜品种类不存在, categoryId={}", categoryId);
             return new java.util.ArrayList<>();
         }
         
         // 查询该门店下所有上架的菜品(与 getCategoriesWithCuisinesByStoreId 中 cuisines 查询条件、排序一致)
-        LambdaQueryWrapper<WechatStoreCuisine> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStoreCuisine::getStoreId, category.getStoreId());
-        wrapper.eq(WechatStoreCuisine::getDeleteFlag, 0);
-        wrapper.eq(WechatStoreCuisine::getShelfStatus, 1); // 只查询上架的菜品
-        wrapper.orderByAsc(WechatStoreCuisine::getId); // 与 categories-with-cuisines 中 cuisines 顺序一致
+        LambdaQueryWrapper<StoreCuisine> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreCuisine::getStoreId, category.getStoreId());
+        wrapper.eq(StoreCuisine::getDeleteFlag, 0);
+        wrapper.eq(StoreCuisine::getShelfStatus, 1); // 只查询上架的菜品
+        wrapper.orderByAsc(StoreCuisine::getId); // 与 categories-with-cuisines 中 cuisines 顺序一致
         
-        List<WechatStoreCuisine> allCuisines = storeCuisineMapper.selectList(wrapper);
+        List<StoreCuisine> allCuisines = storeCuisineMapper.selectList(wrapper);
         
         // 过滤出包含该分类ID的菜品
         // categoryIds 是 JSON 数组格式,如:[1,2,3]
@@ -106,37 +106,37 @@ public class StoreInfoServiceImpl implements StoreInfoService {
     }
 
     @Override
-    public List<WechatCategoryWithCuisinesVO> getCategoriesWithCuisinesByStoreId(Integer storeId, String keyword) {
+    public List<CategoryWithCuisinesVO> getCategoriesWithCuisinesByStoreId(Integer storeId, String keyword) {
         log.info("根据门店ID查询菜品种类及下属菜品, storeId={}, keyword={}", storeId, keyword);
-        List<WechatStoreCuisineCategory> categories = getCategoriesByStoreId(storeId);
+        List<StoreCuisineCategory> categories = getCategoriesByStoreId(storeId);
         if (categories == null || categories.isEmpty()) {
             return new ArrayList<>();
         }
         // 与 getCuisinesByCategoryId 相同的查询条件与排序,保证 cuisines 字段与 /store/info/cuisines 一致
-        LambdaQueryWrapper<WechatStoreCuisine> cuisineWrapper = new LambdaQueryWrapper<>();
-        cuisineWrapper.eq(WechatStoreCuisine::getStoreId, storeId);
-        cuisineWrapper.eq(WechatStoreCuisine::getDeleteFlag, 0);
-        cuisineWrapper.eq(WechatStoreCuisine::getShelfStatus, 1);
-        cuisineWrapper.orderByAsc(WechatStoreCuisine::getId);
-        List<WechatStoreCuisine> allCuisines = storeCuisineMapper.selectList(cuisineWrapper);
+        LambdaQueryWrapper<StoreCuisine> cuisineWrapper = new LambdaQueryWrapper<>();
+        cuisineWrapper.eq(StoreCuisine::getStoreId, storeId);
+        cuisineWrapper.eq(StoreCuisine::getDeleteFlag, 0);
+        cuisineWrapper.eq(StoreCuisine::getShelfStatus, 1);
+        cuisineWrapper.orderByAsc(StoreCuisine::getId);
+        List<StoreCuisine> allCuisines = storeCuisineMapper.selectList(cuisineWrapper);
         if (allCuisines == null) {
             allCuisines = new ArrayList<>();
         }
         boolean filterByName = StringUtils.isNotBlank(keyword);
         String keywordLower = filterByName ? keyword.trim().toLowerCase() : null;
-        List<WechatCategoryWithCuisinesVO> result = new ArrayList<>();
-        for (WechatStoreCuisineCategory category : categories) {
+        List<CategoryWithCuisinesVO> result = new ArrayList<>();
+        for (StoreCuisineCategory category : categories) {
             Integer categoryId = category.getId();
-            List<WechatStoreCuisine> cuisines = allCuisines.stream()
+            List<StoreCuisine> cuisines = allCuisines.stream()
                     .filter(c -> belongsToCategory(c, categoryId))
                     .filter(c -> !filterByName || (c.getName() != null && c.getName().toLowerCase().contains(keywordLower)))
                     .collect(Collectors.toList());
-            result.add(new WechatCategoryWithCuisinesVO(category, cuisines));
+            result.add(new CategoryWithCuisinesVO(category, cuisines));
         }
         return result;
     }
 
-    private boolean belongsToCategory(WechatStoreCuisine cuisine, Integer categoryId) {
+    private boolean belongsToCategory(StoreCuisine cuisine, Integer categoryId) {
         String categoryIdsStr = cuisine.getCategoryIds();
         if (StringUtils.isBlank(categoryIdsStr)) {
             return false;
@@ -156,19 +156,19 @@ public class StoreInfoServiceImpl implements StoreInfoService {
             log.warn("删除菜品种类失败:分类ID为空");
             return false;
         }
-        WechatStoreCuisineCategory category = storeCuisineCategoryMapper.selectById(categoryId);
+        StoreCuisineCategory category = storeCuisineCategoryMapper.selectById(categoryId);
         if (category == null) {
             log.warn("删除菜品种类失败:分类不存在, categoryId={}", categoryId);
             return false;
         }
         Integer storeId = category.getStoreId();
         // 1. 解除绑定:将该分类ID从所有关联菜品的 category_ids 中移除,价目表菜品其它字段不变
-        LambdaQueryWrapper<WechatStoreCuisine> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStoreCuisine::getStoreId, storeId);
-        wrapper.eq(WechatStoreCuisine::getDeleteFlag, 0);
-        List<WechatStoreCuisine> allCuisines = storeCuisineMapper.selectList(wrapper);
+        LambdaQueryWrapper<StoreCuisine> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreCuisine::getStoreId, storeId);
+        wrapper.eq(StoreCuisine::getDeleteFlag, 0);
+        List<StoreCuisine> allCuisines = storeCuisineMapper.selectList(wrapper);
         if (allCuisines != null) {
-            for (WechatStoreCuisine cuisine : allCuisines) {
+            for (StoreCuisine cuisine : allCuisines) {
                 if (!belongsToCategory(cuisine, categoryId)) {
                     continue;
                 }
@@ -205,7 +205,7 @@ public class StoreInfoServiceImpl implements StoreInfoService {
     }
 
     @Override
-    public WechatStoreInfoWithHomepageCuisinesDTO getStoreInfoWithHomepageCuisines(Integer storeId) {
+    public StoreInfoWithHomepageCuisinesDTO getStoreInfoWithHomepageCuisines(Integer storeId) {
         log.info("根据商铺ID查询店铺信息和首页展示美食价目表, storeId={}", storeId);
         
         // 1. 查询店铺信息
@@ -215,21 +215,21 @@ public class StoreInfoServiceImpl implements StoreInfoService {
         }
         
         // 2. 查询首页展示的美食价目表(is_homepage_display = 1,上架状态 = 1,审核通过 = 1)
-        LambdaQueryWrapper<WechatStoreCuisine> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStoreCuisine::getStoreId, storeId);
-        wrapper.eq(WechatStoreCuisine::getDeleteFlag, 0);
-        wrapper.eq(WechatStoreCuisine::getIsHomepageDisplay, 1); // 首页展示
-        wrapper.eq(WechatStoreCuisine::getShelfStatus, 1); // 上架状态
-        wrapper.eq(WechatStoreCuisine::getStatus, 1); // 审核通过
-        wrapper.orderByDesc(WechatStoreCuisine::getCreatedTime); // 按创建时间倒序
+        LambdaQueryWrapper<StoreCuisine> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreCuisine::getStoreId, storeId);
+        wrapper.eq(StoreCuisine::getDeleteFlag, 0);
+        wrapper.eq(StoreCuisine::getIsHomepageDisplay, 1); // 首页展示
+        wrapper.eq(StoreCuisine::getShelfStatus, 1); // 上架状态
+        wrapper.eq(StoreCuisine::getStatus, 1); // 审核通过
+        wrapper.orderByDesc(StoreCuisine::getCreatedTime); // 按创建时间倒序
         
-        List<WechatStoreCuisine> homepageCuisines = storeCuisineMapper.selectList(wrapper);
+        List<StoreCuisine> homepageCuisines = storeCuisineMapper.selectList(wrapper);
         if (homepageCuisines == null) {
             homepageCuisines = new ArrayList<>();
         }
         
         // 3. 构建返回DTO
-        WechatStoreInfoWithHomepageCuisinesDTO dto = new WechatStoreInfoWithHomepageCuisinesDTO();
+        StoreInfoWithHomepageCuisinesDTO dto = new StoreInfoWithHomepageCuisinesDTO();
         dto.setStoreInfo(storeInfo);
         dto.setHomepageCuisines(homepageCuisines);
         

Plik diff jest za duży
+ 256 - 245
alien-dining/src/main/java/shop/alien/dining/service/impl/StoreOrderServiceImpl.java


+ 1 - 1
alien-dining/src/main/java/shop/alien/dining/strategy/payment/PaymentStrategy.java

@@ -19,7 +19,7 @@ public interface PaymentStrategy {
      * @param subject 订单标题
      * @param payer 支付者 openid
      * @param orderNo 订单号
-     * @param storeId 店铺ID,本系统调用时必传,用于获取 WechatStorePaymentConfig
+     * @param storeId 店铺ID,本系统调用时必传,用于获取 StorePaymentConfig
      * @return 预支付订单信息
      * @throws Exception 生成异常
      */

+ 27 - 27
alien-dining/src/main/java/shop/alien/dining/strategy/payment/impl/WeChatPaymentMininProgramStrategyImpl.java

@@ -24,10 +24,10 @@ import shop.alien.dining.util.WXPayUtility;
 import shop.alien.dining.util.WeChatPayUtil;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.LifeDiscountCouponUser;
-import shop.alien.entity.store.wechat.WechatStoreOrder;
-import shop.alien.entity.store.wechat.WechatStorePaymentConfig;
+import shop.alien.entity.store.StoreOrder;
+import shop.alien.entity.store.StorePaymentConfig;
 import shop.alien.mapper.LifeDiscountCouponUserMapper;
-import shop.alien.mapper.wechat.WechatStorePaymentConfigMapper;
+import shop.alien.mapper.StorePaymentConfigMapper;
 import shop.alien.util.common.constant.DiscountCouponEnum;
 import shop.alien.util.common.constant.PaymentEnum;
 
@@ -85,7 +85,7 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
     private String searchOrderByOutTradeNoPath;
 
     private final StoreOrderService storeOrderService;
-    private final WechatStorePaymentConfigMapper storePaymentConfigMapper;
+    private final StorePaymentConfigMapper storePaymentConfigMapper;
     private final LifeDiscountCouponUserMapper lifeDiscountCouponUserMapper;
     private final ObjectMapper objectMapper;
 
@@ -95,25 +95,25 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
     /**
      * 根据店铺ID从 MySQL 获取支付配置(本系统内部调用时使用)
      */
-    private WechatStorePaymentConfig getConfigByStoreId(Integer storeId) {
+    private StorePaymentConfig getConfigByStoreId(Integer storeId) {
         if (storeId == null) {
             return null;
         }
-        LambdaQueryWrapper<WechatStorePaymentConfig> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStorePaymentConfig::getStoreId, storeId);
+        LambdaQueryWrapper<StorePaymentConfig> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StorePaymentConfig::getStoreId, storeId);
         return storePaymentConfigMapper.selectOne(wrapper);
     }
 
     /**
      * 根据微信支付公钥序列号获取支付配置(外部回调如支付通知时使用,通过请求头 Wechatpay-Serial 判断)
      */
-    private WechatStorePaymentConfig getConfigByWechatPayPublicKeyId(String wechatPayPublicKeyId) {
+    private StorePaymentConfig getConfigByWechatPayPublicKeyId(String wechatPayPublicKeyId) {
         if (!StringUtils.hasText(wechatPayPublicKeyId)) {
             return null;
         }
-        LambdaQueryWrapper<WechatStorePaymentConfig> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(WechatStorePaymentConfig::getWechatPayPublicKeyId, wechatPayPublicKeyId);
-        List<WechatStorePaymentConfig> storePaymentConfigs = storePaymentConfigMapper.selectList(wrapper);
+        LambdaQueryWrapper<StorePaymentConfig> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StorePaymentConfig::getWechatPayPublicKeyId, wechatPayPublicKeyId);
+        List<StorePaymentConfig> storePaymentConfigs = storePaymentConfigMapper.selectList(wrapper);
         if (storePaymentConfigs.isEmpty()) {
             return null;
         }
@@ -121,9 +121,9 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
     }
 
     /**
-     * 从 WechatStorePaymentConfig 加载商户私钥
+     * 从 StorePaymentConfig 加载商户私钥
      */
-    private PrivateKey loadPrivateKeyFromConfig(WechatStorePaymentConfig config) {
+    private PrivateKey loadPrivateKeyFromConfig(StorePaymentConfig config) {
         if (config == null) {
             return null;
         }
@@ -138,9 +138,9 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
     }
 
     /**
-     * 从 WechatStorePaymentConfig 加载微信支付公钥
+     * 从 StorePaymentConfig 加载微信支付公钥
      */
-    private PublicKey loadPublicKeyFromConfig(WechatStorePaymentConfig config) {
+    private PublicKey loadPublicKeyFromConfig(StorePaymentConfig config) {
         if (config == null) {
             return null;
         }
@@ -161,7 +161,7 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
             log.warn("createPrePayOrder 缺少 storeId,无法获取支付配置");
             return R.fail("店铺ID不能为空");
         }
-        WechatStorePaymentConfig config = getConfigByStoreId(storeId);
+        StorePaymentConfig config = getConfigByStoreId(storeId);
         if (config == null) {
             log.warn("未找到店铺支付配置 storeId={}", storeId);
             return R.fail("未找到该店铺的微信支付配置");
@@ -193,7 +193,7 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
         request.payer.openid = payer;
 
         String wechatOutTradeNo = orderNo;
-        WechatStoreOrder storeOrder = storeOrderService.getOrderByOrderNo(orderNo);
+        StoreOrder storeOrder = storeOrderService.getOrderByOrderNo(orderNo);
         log.info("createPrePayOrder, orderNo: {}, storeOrder: {}", orderNo, storeOrder);
         if (storeOrder != null ) {
             log.info("createPrePayOrder, orderNo: {}, storeOrder: {}", orderNo, storeOrder);
@@ -284,7 +284,7 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
             return R.success("OK");
         }
 
-        WechatStorePaymentConfig config = getConfigByWechatPayPublicKeyId(serial);
+        StorePaymentConfig config = getConfigByWechatPayPublicKeyId(serial);
         if (config == null) {
             log.warn("微信支付回调:未找到公钥序列号对应的店铺配置 serial={}", serial);
             return R.fail("未找到对应支付配置");
@@ -306,7 +306,7 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
 
         if (sign.verify(signatureBytes)) {
             final String notifyDataCopy = notifyData;
-            final WechatStorePaymentConfig configCopy = config;
+            final StorePaymentConfig configCopy = config;
             CompletableFuture.runAsync(() -> processNotifyBusiness(notifyDataCopy, configCopy));
             return R.success("OK");
         } else {
@@ -318,7 +318,7 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
      * 异步处理回调业务:解密并更新订单状态(文档建议应答后再处理业务,避免超时)
      * @param config 已通过 Wechatpay-Serial 解析得到的店铺支付配置,内含 apiV3Key
      */
-    private void processNotifyBusiness(String notifyData, WechatStorePaymentConfig config) {
+    private void processNotifyBusiness(String notifyData, StorePaymentConfig config) {
         try {
             if (config == null || !StringUtils.hasText(config.getApiV3Key())) {
                 log.warn("微信支付回调:无可用 apiV3Key 无法解密");
@@ -346,9 +346,9 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
             String tradeState = jsonObject.getString("trade_state");
             if ("SUCCESS".equals(tradeState)) {
                 String outTradeNo = jsonObject.getString("out_trade_no");
-                WechatStoreOrder storeOrder = storeOrderService.getOne(new QueryWrapper<WechatStoreOrder>().eq("order_no", outTradeNo));
+                StoreOrder storeOrder = storeOrderService.getOne(new QueryWrapper<StoreOrder>().eq("order_no", outTradeNo));
                 if (storeOrder == null && StringUtils.hasText(outTradeNo)) {
-                    storeOrder = storeOrderService.getOne(new QueryWrapper<WechatStoreOrder>().eq("pay_trade_no", outTradeNo));
+                    storeOrder = storeOrderService.getOne(new QueryWrapper<StoreOrder>().eq("pay_trade_no", outTradeNo));
                 }
                 if (storeOrder != null && storeOrder.getPayStatus() != 1) {
                     storeOrder.setPayStatus(1);
@@ -395,7 +395,7 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
         if (storeId == null) {
             return R.fail("店铺ID不能为空");
         }
-        WechatStorePaymentConfig config = getConfigByStoreId(storeId);
+        StorePaymentConfig config = getConfigByStoreId(storeId);
         if (config == null) {
             return R.fail("未找到该店铺的微信支付配置");
         }
@@ -417,7 +417,7 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
     }
 
     public DirectAPIv3QueryResponse searchOrderRun(QueryByWxTradeNoRequest request,
-                                                   WechatStorePaymentConfig config,
+                                                   StorePaymentConfig config,
                                                    PrivateKey privateKey,
                                                    PublicKey wechatPayPublicKey) {
         String uri = searchOrderByOutTradeNoPath;
@@ -467,7 +467,7 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
         if (storeId == null) {
             return R.fail("店铺ID不能为空");
         }
-        WechatStorePaymentConfig config = getConfigByStoreId(storeId);
+        StorePaymentConfig config = getConfigByStoreId(storeId);
         if (config == null) {
             return R.fail("未找到该店铺的微信支付配置");
         }
@@ -540,7 +540,7 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
     }
 
     public Refund doSearchRefundRecordByOutRefundNo(QueryByOutRefundNoRequest request,
-                                                   WechatStorePaymentConfig config,
+                                                   StorePaymentConfig config,
                                                    PrivateKey privateKey,
                                                    PublicKey wechatPayPublicKey) {
         String uri = searchRefundStatusByOutRefundNoPath;
@@ -568,7 +568,7 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
     }
 
     public DirectAPIv3JsapiPrepayResponse doCreatePrePayOrder(DirectAPIv3JsapiPrepayRequest request,
-                                                             WechatStorePaymentConfig config,
+                                                             StorePaymentConfig config,
                                                              PrivateKey privateKey) {
         String uri = prePayPath;
         String reqBody = WXPayUtility.toJson(request);

+ 4 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreOrder.java

@@ -38,6 +38,10 @@ public class StoreOrder {
     @TableField("table_id")
     private Integer tableId;
 
+    @ApiModelProperty(value = "关联用户预约ID(user_reservation.id,散客订单为空)")
+    @TableField("user_reservation_id")
+    private Integer userReservationId;
+
     @ApiModelProperty(value = "桌号")
     @TableField("table_number")
     private String tableNumber;

+ 4 - 0
alien-entity/src/main/java/shop/alien/entity/store/StorePrice.java

@@ -35,6 +35,10 @@ public class StorePrice {
     @TableField("name")
     private String name;
 
+    @ApiModelProperty(value = "分类ids(JSON数组,如:[1,2,3])")
+    @TableField("category_ids")
+    private String categoryIds;
+
     @ApiModelProperty(value = "总价")
     @TableField("total_price")
     private BigDecimal totalPrice;

+ 8 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreTable.java

@@ -61,10 +61,18 @@ public class StoreTable {
     @TableField("qrcode_url")
     private String qrcodeUrl;
 
+    @ApiModelProperty(value = "APP扫码二维码URL(内容为门店ID+桌号JSON,非微信太阳码)")
+    @TableField("app_qrcode_url")
+    private String appQrcodeUrl;
+
     @ApiModelProperty(value = "状态(0:空闲, 1:就餐中, 2:其他, 3:加餐)")
     @TableField("status")
     private Integer status;
 
+    @ApiModelProperty(value = "类型(1:美食,2:通用)")
+    @TableField("type")
+    private Integer type;
+
     @ApiModelProperty(value = "当前就餐人数(就餐中时由首客填写,后续用户共用)")
     @TableField("diner_count")
     private Integer dinerCount;

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

@@ -57,7 +57,7 @@ public class UserReservation {
     @TableField("category_id")
     private Integer categoryId;
 
-    @ApiModelProperty(value = "预约状态 0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时")
+    @ApiModelProperty(value = "预约状态 0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时 5:用餐结束")
     @TableField("status")
     private Integer status;
 

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

@@ -20,6 +20,9 @@ public class CreateOrderDTO {
     @NotNull(message = "桌号ID不能为空")
     private Integer tableId;
 
+    @ApiModelProperty(value = "关联用户预约ID(user_reservation.id,从预订到店扫码等场景传入;散客不传)")
+    private Integer userReservationId;
+
     @ApiModelProperty(value = "就餐人数")
     private Integer dinerCount;
 

+ 54 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/DiningWalkInReservationDTO.java

@@ -0,0 +1,54 @@
+package shop.alien.entity.store.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.Date;
+
+/**
+ * 点餐场景:选完人数后填写「就餐信息」,落到 user_reservation(状态已到店),不与 user_reservation_order 关联。
+ */
+@Data
+@ApiModel(value = "DiningWalkInReservationDTO", description = "点餐-到店就餐信息(写入预约表)")
+public class DiningWalkInReservationDTO {
+
+    @ApiModelProperty(value = "桌号ID(store_table.id)", required = true)
+    @NotNull(message = "桌号ID不能为空")
+    private Integer tableId;
+
+    @ApiModelProperty(value = "就餐/预约人数", required = true)
+    @NotNull(message = "人数不能为空")
+    @Min(value = 1, message = "人数至少为1")
+    private Integer guestCount;
+
+    @ApiModelProperty(value = "预约日期,不传则默认当天(上海时区)")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date reservationDate;
+
+    @ApiModelProperty(value = "开始时间 HH:mm", required = true)
+    @NotBlank(message = "开始时间不能为空")
+    private String startTime;
+
+    @ApiModelProperty(value = "结束时间 HH:mm,可次日,选填")
+    private String endTime;
+
+    @ApiModelProperty(value = "就餐人姓名")
+    private String reservationUserName;
+
+    @ApiModelProperty(value = "性别 0:男 1:女")
+    private String reservationUserGender;
+
+    @ApiModelProperty(value = "手机号", required = true)
+    @NotBlank(message = "手机号不能为空")
+    private String reservationUserPhone;
+
+    @ApiModelProperty(value = "备注,限30字")
+    @Size(max = 30, message = "备注不超过30字")
+    private String remark;
+}

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/StoreBookingTableBatchDTO.java

@@ -22,6 +22,9 @@ public class StoreBookingTableBatchDTO {
     @ApiModelProperty(value = "分类ID(关联store_booking_category表)", required = true)
     private Integer categoryId;
 
+    @ApiModelProperty(value = "类型(1:美食,2:通用),不传默认1")
+    private Integer type;
+
     @ApiModelProperty(value = "桌号列表", required = true)
     private List<TableItem> tables;
 

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

@@ -42,7 +42,7 @@ public class UserReservationDTO {
     @ApiModelProperty(value = "偏好区域/分类ID(如大厅/包间)")
     private Integer categoryId;
 
-    @ApiModelProperty(value = "预约状态 0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时")
+    @ApiModelProperty(value = "预约状态 0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时 5:用餐结束")
     private Integer status;
 
     @ApiModelProperty(value = "备注")

+ 0 - 32
alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatAddCartItemDTO.java

@@ -1,32 +0,0 @@
-package shop.alien.entity.store.dto.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Positive;
-
-/**
- * 小程序点餐-添加购物车商品(自 {@link shop.alien.entity.store.dto.AddCartItemDTO} 复制)
- */
-@Data
-@ApiModel(value = "WechatAddCartItemDTO", description = "小程序添加购物车商品")
-public class WechatAddCartItemDTO {
-
-    @ApiModelProperty(value = "桌号ID", required = true)
-    @NotNull(message = "桌号ID不能为空")
-    private Integer tableId;
-
-    @ApiModelProperty(value = "菜品ID", required = true)
-    @NotNull(message = "菜品ID不能为空")
-    private Integer cuisineId;
-
-    @ApiModelProperty(value = "数量", required = true)
-    @NotNull(message = "数量不能为空")
-    @Positive(message = "数量必须大于0")
-    private Integer quantity;
-
-    @ApiModelProperty(value = "备注")
-    private String remark;
-}

+ 0 - 34
alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatCartDTO.java

@@ -1,34 +0,0 @@
-package shop.alien.entity.store.dto.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * 小程序点餐-购物车(字段自 {@link shop.alien.entity.store.dto.CartDTO} 复制)
- */
-@Data
-@ApiModel(value = "WechatCartDTO", description = "小程序点餐购物车")
-public class WechatCartDTO {
-
-    @ApiModelProperty(value = "桌号ID")
-    private Integer tableId;
-
-    @ApiModelProperty(value = "桌号")
-    private String tableNumber;
-
-    @ApiModelProperty(value = "门店ID")
-    private Integer storeId;
-
-    @ApiModelProperty(value = "购物车商品列表")
-    private List<WechatCartItemDTO> items;
-
-    @ApiModelProperty(value = "总金额")
-    private BigDecimal totalAmount;
-
-    @ApiModelProperty(value = "商品总数量")
-    private Integer totalQuantity;
-}

+ 0 - 51
alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatCartItemDTO.java

@@ -1,51 +0,0 @@
-package shop.alien.entity.store.dto.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-
-/**
- * 小程序点餐-购物车商品项(字段自 {@link shop.alien.entity.store.dto.CartItemDTO} 复制,可独立演进)
- */
-@Data
-@ApiModel(value = "WechatCartItemDTO", description = "小程序点餐购物车商品项")
-public class WechatCartItemDTO {
-
-    @ApiModelProperty(value = "菜品ID")
-    private Integer cuisineId;
-
-    @ApiModelProperty(value = "菜品名称")
-    private String cuisineName;
-
-    @ApiModelProperty(value = "菜品类型(1:单品, 2:套餐)")
-    private Integer cuisineType;
-
-    @ApiModelProperty(value = "菜品图片")
-    private String cuisineImage;
-
-    @ApiModelProperty(value = "单价")
-    private BigDecimal unitPrice;
-
-    @ApiModelProperty(value = "数量")
-    private Integer quantity;
-
-    @ApiModelProperty(value = "已下单数量(下单时锁定的数量,不允许减少或删除)")
-    private Integer lockedQuantity;
-
-    @ApiModelProperty(value = "小计金额")
-    private BigDecimal subtotalAmount;
-
-    @ApiModelProperty(value = "添加该菜品的用户ID")
-    private Integer addUserId;
-
-    @ApiModelProperty(value = "添加该菜品的用户手机号")
-    private String addUserPhone;
-
-    @ApiModelProperty(value = "备注")
-    private String remark;
-
-    @ApiModelProperty(value = "菜品标签(JSON数组,如:[\"招牌菜\",\"推荐\"])")
-    private String tags;
-}

+ 0 - 26
alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatChangeTableDTO.java

@@ -1,26 +0,0 @@
-package shop.alien.entity.store.dto.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-
-/**
- * 小程序点餐-换桌(自 {@link shop.alien.entity.store.dto.ChangeTableDTO} 复制)
- */
-@Data
-@ApiModel(value = "WechatChangeTableDTO", description = "小程序换桌")
-public class WechatChangeTableDTO {
-
-    @ApiModelProperty(value = "原桌号ID", required = true)
-    @NotNull(message = "原桌号ID不能为空")
-    private Integer fromTableId;
-
-    @ApiModelProperty(value = "目标桌号ID", required = true)
-    @NotNull(message = "目标桌号ID不能为空")
-    private Integer toTableId;
-
-    @ApiModelProperty(value = "换桌原因")
-    private String changeReason;
-}

+ 0 - 47
alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatCreateOrderDTO.java

@@ -1,47 +0,0 @@
-package shop.alien.entity.store.dto.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-import java.math.BigDecimal;
-
-/**
- * 小程序点餐-创建订单 DTO(自 {@link shop.alien.entity.store.dto.CreateOrderDTO} 复制)
- */
-@Data
-@ApiModel(value = "WechatCreateOrderDTO", description = "小程序创建订单")
-public class WechatCreateOrderDTO {
-
-    @ApiModelProperty(value = "桌号ID", required = true)
-    @NotNull(message = "桌号ID不能为空")
-    private Integer tableId;
-
-    @ApiModelProperty(value = "就餐人数")
-    private Integer dinerCount;
-
-    @ApiModelProperty(value = "优惠券ID(可选,不选择优惠券时传 null 或不传此字段)")
-    private Integer couponId;
-
-    @ApiModelProperty(value = "订单总金额(前端传参,不做后台校验)")
-    private BigDecimal totalAmount;
-
-    @ApiModelProperty(value = "餐具费(前端传参,不做后台校验)")
-    private BigDecimal tablewareFee;
-
-    @ApiModelProperty(value = "优惠金额(前端传参,不做后台校验)")
-    private BigDecimal discountAmount;
-
-    @ApiModelProperty(value = "实付金额(前端传参,不做后台校验)")
-    private BigDecimal payAmount;
-
-    @ApiModelProperty(value = "联系电话")
-    private String contactPhone;
-
-    @ApiModelProperty(value = "备注(限30字)。创建/更新订单时传入;更新订单(加餐)时为覆盖,不拼接")
-    private String remark;
-
-    @ApiModelProperty(value = "是否立即支付(0:否,创建订单但不支付; 1:是,创建订单并支付)")
-    private Integer immediatePay;
-}

+ 0 - 23
alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatStoreInfoWithHomepageCuisinesDTO.java

@@ -1,23 +0,0 @@
-package shop.alien.entity.store.dto.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import shop.alien.entity.store.StoreInfo;
-import shop.alien.entity.store.wechat.WechatStoreCuisine;
-
-import java.util.List;
-
-/**
- * 小程序点餐-店铺信息和首页展示美食价目表(自 {@link shop.alien.entity.store.dto.StoreInfoWithHomepageCuisinesDTO} 复制,价目表为 {@link WechatStoreCuisine})
- */
-@Data
-@ApiModel(value = "WechatStoreInfoWithHomepageCuisinesDTO", description = "小程序-店铺信息和首页展示美食价目表")
-public class WechatStoreInfoWithHomepageCuisinesDTO {
-
-    @ApiModelProperty(value = "店铺信息")
-    private StoreInfo storeInfo;
-
-    @ApiModelProperty(value = "首页展示的美食价目表列表(WechatStoreCuisine)")
-    private List<WechatStoreCuisine> homepageCuisines;
-}

+ 0 - 22
alien-entity/src/main/java/shop/alien/entity/store/dto/wechat/WechatUpdateOrderCouponDTO.java

@@ -1,22 +0,0 @@
-package shop.alien.entity.store.dto.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-
-/**
- * 小程序点餐-更新订单优惠券(自 {@link shop.alien.entity.store.dto.UpdateOrderCouponDTO} 复制)
- */
-@Data
-@ApiModel(value = "WechatUpdateOrderCouponDTO", description = "小程序更新订单优惠券")
-public class WechatUpdateOrderCouponDTO {
-
-    @ApiModelProperty(value = "订单ID", required = true)
-    @NotNull(message = "订单ID不能为空")
-    private Integer orderId;
-
-    @ApiModelProperty(value = "优惠券ID(可为空,表示不使用优惠券)")
-    private Integer couponId;
-}

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/OrderDetailWithChangeLogVO.java

@@ -30,6 +30,9 @@ public class OrderDetailWithChangeLogVO {
     @ApiModelProperty(value = "桌号")
     private String tableNumber;
 
+    @ApiModelProperty(value = "关联用户预约ID(user_reservation.id)")
+    private Integer userReservationId;
+
     @ApiModelProperty(value = "就餐人数")
     private Integer dinerCount;
 

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/OrderInfoVO.java

@@ -49,6 +49,9 @@ public class OrderInfoVO {
     @ApiModelProperty(value = "桌号")
     private String tableNumber;
 
+    @ApiModelProperty(value = "关联用户预约ID(user_reservation.id)")
+    private Integer userReservationId;
+
     @ApiModelProperty(value = "就餐人数")
     private Integer dinerCount;
 

+ 10 - 1
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreBookingTableVo.java

@@ -6,7 +6,6 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.util.Date;
-import java.util.List;
 
 /**
  * 预订服务桌号VO(包含分类名称)
@@ -36,12 +35,19 @@ public class StoreBookingTableVo {
     @ApiModelProperty(value = "座位数")
     private Integer seatingCapacity;
 
+    @JsonProperty("seating_capacity")
+    @ApiModelProperty(value = "座位数(下划线字段)")
+    private Integer seatingCapacitySnake;
+
     @ApiModelProperty(value = "桌状态(0:空闲 1:就餐中/已开台 2:其他 3:加餐);存在已到店(status=2)的预约时置为 1")
     private Integer status;
 
     @ApiModelProperty(value = "当前已到店预约ID(无已到店预约时为 null)")
     private Integer currentReservationId;
 
+    @ApiModelProperty(value = "类型(1:美食,2:通用)")
+    private Integer type;
+
     @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
     private Integer deleteFlag;
 
@@ -64,4 +70,7 @@ public class StoreBookingTableVo {
 
     @ApiModelProperty(value = "该桌关联的预约信息列表(同一桌多条预约时聚合;无预约为空列表)")
     private List<UserReservationVo> reservations;
+
+    @ApiModelProperty(value = "APP桌码二维码URL")
+    private String appQrcodeUrl;
 }

+ 41 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreProductSelectVo.java

@@ -0,0 +1,41 @@
+package shop.alien.entity.store.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@ApiModel(value = "StoreProductSelectVo", description = "菜品选择列表VO")
+public class StoreProductSelectVo {
+
+    @ApiModelProperty("主键ID")
+    private Integer id;
+
+    @ApiModelProperty("门店ID")
+    private Integer storeId;
+
+    @ApiModelProperty("类型: 1美食 2其他")
+    private Integer type;
+
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("价格")
+    private BigDecimal totalPrice;
+
+    @ApiModelProperty("图片")
+    private String images;
+
+    @ApiModelProperty("分类ID原始字符串")
+    private String categoryIds;
+
+    @ApiModelProperty("分类ID列表")
+    private List<Integer> categoryIdList;
+
+    @ApiModelProperty("分类名称列表")
+    private List<String> categoryNames;
+}
+

+ 1 - 1
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreReservationListVo.java

@@ -67,7 +67,7 @@ public class StoreReservationListVo {
     @ApiModelProperty(value = "取消原因(商家端取消)")
     private String reason;
 
-    @ApiModelProperty(value = "预约状态 0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时")
+    @ApiModelProperty(value = "预约状态 0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时 5:用餐结束")
     private Integer status;
 
     @ApiModelProperty(value = "状态文本(待使用、已完成、退款等)")

+ 1 - 1
alien-entity/src/main/java/shop/alien/entity/store/vo/UserReservationVo.java

@@ -45,7 +45,7 @@ public class UserReservationVo {
     @ApiModelProperty(value = "偏好区域/分类ID")
     private Integer categoryId;
 
-    @ApiModelProperty(value = "预约状态 0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时")
+    @ApiModelProperty(value = "预约状态 0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时 5:用餐结束")
     private Integer status;
 
     @ApiModelProperty(value = "实际到店时间")

+ 0 - 30
alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatCategoryWithCuisinesVO.java

@@ -1,30 +0,0 @@
-package shop.alien.entity.store.vo.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import shop.alien.entity.store.wechat.WechatStoreCuisine;
-import shop.alien.entity.store.wechat.WechatStoreCuisineCategory;
-
-import java.util.List;
-
-/**
- * 小程序点餐-菜品种类及其下属菜品 VO(自 {@link shop.alien.entity.store.vo.CategoryWithCuisinesVO} 复制,使用 wechat 实体类型)
- * <p>
- * category 与 GET /store/info/categories 单条字段一致(WechatStoreCuisineCategory);cuisines 与 GET /store/info/cuisines 列表元素一致(WechatStoreCuisine)。
- * </p>
- */
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-@ApiModel(value = "WechatCategoryWithCuisinesVO", description = "小程序-菜品种类及该分类下的菜品列表")
-public class WechatCategoryWithCuisinesVO {
-
-    @ApiModelProperty(value = "菜品种类信息(WechatStoreCuisineCategory)")
-    private WechatStoreCuisineCategory category;
-
-    @ApiModelProperty(value = "该分类下的菜品列表(WechatStoreCuisine)")
-    private List<WechatStoreCuisine> cuisines;
-}

+ 0 - 50
alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderChangeLogBatchVO.java

@@ -1,50 +0,0 @@
-package shop.alien.entity.store.vo.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-
-/**
- * 小程序点餐-订单变更记录批次(自 {@link shop.alien.entity.store.vo.OrderChangeLogBatchVO} 复制)
- */
-@Data
-@ApiModel(value = "WechatOrderChangeLogBatchVO", description = "小程序订单变更记录批次")
-public class WechatOrderChangeLogBatchVO {
-
-    @ApiModelProperty(value = "批次号")
-    private String batchNo;
-
-    @ApiModelProperty(value = "操作类型(1:首次下单, 3:更新订单)")
-    private Integer operationType;
-
-    @ApiModelProperty(value = "操作类型文本")
-    private String operationTypeText;
-
-    @ApiModelProperty(value = "操作时间")
-    private Date operationTime;
-
-    @ApiModelProperty(value = "操作人ID")
-    private Integer operatorUserId;
-
-    @ApiModelProperty(value = "操作人手机号")
-    private String operatorUserPhone;
-
-    @ApiModelProperty(value = "备注(该批次对应的备注,如下单/更新订单时的备注)")
-    private String remark;
-
-    @ApiModelProperty(value = "该批次商品数量变化总和")
-    private Integer totalQuantityChange;
-
-    @ApiModelProperty(value = "该批次金额变化总和")
-    private BigDecimal totalAmountChange;
-
-    @ApiModelProperty(value = "该批次商品数量")
-    private Integer itemCount;
-
-    @ApiModelProperty(value = "该批次的商品明细列表")
-    private List<WechatOrderChangeLogItemVO> items;
-}

+ 0 - 48
alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderChangeLogItemVO.java

@@ -1,48 +0,0 @@
-package shop.alien.entity.store.vo.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-
-/**
- * 小程序点餐-订单变更记录商品项(自 {@link shop.alien.entity.store.vo.OrderChangeLogItemVO} 复制)
- */
-@Data
-@ApiModel(value = "WechatOrderChangeLogItemVO", description = "小程序订单变更记录商品项")
-public class WechatOrderChangeLogItemVO {
-
-    @ApiModelProperty(value = "菜品ID")
-    private Integer cuisineId;
-
-    @ApiModelProperty(value = "菜品名称")
-    private String cuisineName;
-
-    @ApiModelProperty(value = "菜品类型(1:单品, 2:套餐)")
-    private Integer cuisineType;
-
-    @ApiModelProperty(value = "菜品图片")
-    private String cuisineImage;
-
-    @ApiModelProperty(value = "单价")
-    private BigDecimal unitPrice;
-
-    @ApiModelProperty(value = "数量变化(新增的数量,正数表示增加,负数表示减少)")
-    private Integer quantityChange;
-
-    @ApiModelProperty(value = "变化前数量")
-    private Integer quantityBefore;
-
-    @ApiModelProperty(value = "变化后数量")
-    private Integer quantityAfter;
-
-    @ApiModelProperty(value = "金额变化")
-    private BigDecimal amountChange;
-
-    @ApiModelProperty(value = "备注")
-    private String remark;
-
-    @ApiModelProperty(value = "菜品标签(JSON数组,如:[\"招牌菜\",\"推荐\"])")
-    private String tags;
-}

+ 0 - 66
alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderConfirmVO.java

@@ -1,66 +0,0 @@
-package shop.alien.entity.store.vo.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import shop.alien.entity.store.dto.wechat.WechatCartItemDTO;
-import shop.alien.entity.store.vo.AvailableCouponVO;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * 小程序点餐-订单确认页(自 {@link shop.alien.entity.store.vo.OrderConfirmVO} 复制,购物车项为 {@link WechatCartItemDTO})
- */
-@Data
-@ApiModel(value = "WechatOrderConfirmVO", description = "小程序订单确认页面")
-public class WechatOrderConfirmVO {
-
-    @ApiModelProperty(value = "店铺名称")
-    private String storeName;
-
-    @ApiModelProperty(value = "桌号")
-    private String tableNumber;
-
-    @ApiModelProperty(value = "就餐人数")
-    private Integer dinerCount;
-
-    @ApiModelProperty(value = "联系电话")
-    private String contactPhone;
-
-    @ApiModelProperty(value = "备注(限30字)")
-    private String remark;
-
-    @ApiModelProperty(value = "购物车商品列表")
-    private List<WechatCartItemDTO> items;
-
-    @ApiModelProperty(value = "菜品总价")
-    private BigDecimal totalAmount;
-
-    @ApiModelProperty(value = "餐具费")
-    private BigDecimal tablewareFee;
-
-    @ApiModelProperty(value = "餐具费单价")
-    private BigDecimal tablewareUnitPrice;
-
-    @ApiModelProperty(value = "优惠券ID")
-    private Integer couponId;
-
-    @ApiModelProperty(value = "优惠券名称")
-    private String couponName;
-
-    @ApiModelProperty(value = "优惠金额")
-    private BigDecimal discountAmount;
-
-    @ApiModelProperty(value = "应付金额(菜品总价+餐具费-优惠券)")
-    private BigDecimal payAmount;
-
-    @ApiModelProperty(value = "可用优惠券列表")
-    private List<AvailableCouponVO> availableCoupons;
-
-    @ApiModelProperty(value = "是否已锁定(有人正在下单)")
-    private Boolean isLocked;
-
-    @ApiModelProperty(value = "锁定用户ID")
-    private Integer lockUserId;
-}

+ 0 - 33
alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderCuisineItemVO.java

@@ -1,33 +0,0 @@
-package shop.alien.entity.store.vo.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-
-/**
- * 小程序点餐-订单菜品项(自 {@link shop.alien.entity.store.vo.OrderCuisineItemVO} 复制)
- */
-@Data
-@ApiModel(value = "WechatOrderCuisineItemVO", description = "小程序订单菜品项")
-public class WechatOrderCuisineItemVO {
-
-    @ApiModelProperty(value = "菜品ID")
-    private Integer cuisineId;
-
-    @ApiModelProperty(value = "菜品名称")
-    private String cuisineName;
-
-    @ApiModelProperty(value = "菜品图片")
-    private String cuisineImage;
-
-    @ApiModelProperty(value = "数量")
-    private Integer quantity;
-
-    @ApiModelProperty(value = "单价")
-    private BigDecimal unitPrice;
-
-    @ApiModelProperty(value = "菜品标签(JSON数组,如:[\"招牌菜\",\"推荐\"])")
-    private String tags;
-}

+ 0 - 74
alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderDetailWithChangeLogVO.java

@@ -1,74 +0,0 @@
-package shop.alien.entity.store.vo.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-
-/**
- * 小程序点餐-订单详情含变更记录(自 {@link shop.alien.entity.store.vo.OrderDetailWithChangeLogVO} 复制)
- */
-@Data
-@ApiModel(value = "WechatOrderDetailWithChangeLogVO", description = "小程序订单详情(含变更记录)")
-public class WechatOrderDetailWithChangeLogVO {
-
-    @ApiModelProperty(value = "订单ID")
-    private Integer orderId;
-
-    @ApiModelProperty(value = "订单号")
-    private String orderNo;
-
-    @ApiModelProperty(value = "店铺名称")
-    private String storeName;
-
-    @ApiModelProperty(value = "桌号")
-    private String tableNumber;
-
-    @ApiModelProperty(value = "就餐人数")
-    private Integer dinerCount;
-
-    @ApiModelProperty(value = "联系电话")
-    private String contactPhone;
-
-    @ApiModelProperty(value = "备注")
-    private String remark;
-
-    @ApiModelProperty(value = "菜品总价")
-    private BigDecimal totalAmount;
-
-    @ApiModelProperty(value = "餐具费")
-    private BigDecimal tablewareFee;
-
-    @ApiModelProperty(value = "优惠券ID")
-    private Integer couponId;
-
-    @ApiModelProperty(value = "优惠券名称")
-    private String couponName;
-
-    @ApiModelProperty(value = "优惠金额")
-    private BigDecimal discountAmount;
-
-    @ApiModelProperty(value = "应付金额")
-    private BigDecimal payAmount;
-
-    @ApiModelProperty(value = "订单状态(0:待支付, 1:已支付, 2:已取消, 3:已完成)")
-    private Integer orderStatus;
-
-    @ApiModelProperty(value = "支付状态(0:未支付, 1:已支付, 2:已退款)")
-    private Integer payStatus;
-
-    @ApiModelProperty(value = "支付方式(1:微信, 2:支付宝, 3:现金)")
-    private Integer payType;
-
-    @ApiModelProperty(value = "创建时间")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "支付时间")
-    private Date payTime;
-
-    @ApiModelProperty(value = "订单变更记录批次列表")
-    private List<WechatOrderChangeLogBatchVO> changeLogBatches;
-}

+ 0 - 105
alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderInfoVO.java

@@ -1,105 +0,0 @@
-package shop.alien.entity.store.vo.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import shop.alien.entity.store.dto.wechat.WechatCartItemDTO;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-
-/**
- * 小程序点餐-订单信息(自 {@link shop.alien.entity.store.vo.OrderInfoVO} 复制)
- */
-@Data
-@ApiModel(value = "WechatOrderInfoVO", description = "小程序订单信息")
-public class WechatOrderInfoVO {
-
-    @ApiModelProperty(value = "订单ID")
-    private Integer orderId;
-
-    @ApiModelProperty(value = "订单号")
-    private String orderNo;
-
-    @ApiModelProperty(value = "店铺名称")
-    private String storeName;
-
-    @ApiModelProperty(value = "店铺ID")
-    private Integer storeId;
-
-    @ApiModelProperty(value = "门店电话")
-    private String storeTel;
-
-    @ApiModelProperty(value = "门店地址")
-    private String storeAddress;
-
-    @ApiModelProperty(value = "门店简介")
-    private String storeBlurb;
-
-    @ApiModelProperty(value = "门店类型(1:中餐, 2:烧烤, 3:饮品, 4:甜点, 5:火锅, 6:宵夜, 7:西餐, 8:轻食, 9:水果)")
-    private String storeType;
-
-    @ApiModelProperty(value = "营业状态(-1:注销中, 0:正常营业, 1:暂停营业, 2:筹建中, 99:永久关门)")
-    private Integer businessStatus;
-
-    @ApiModelProperty(value = "桌号")
-    private String tableNumber;
-
-    @ApiModelProperty(value = "就餐人数")
-    private Integer dinerCount;
-
-    @ApiModelProperty(value = "联系电话")
-    private String contactPhone;
-
-    @ApiModelProperty(value = "备注")
-    private String remark;
-
-    @ApiModelProperty(value = "菜品清单")
-    private List<WechatCartItemDTO> items;
-
-    @ApiModelProperty(value = "菜品总价")
-    private BigDecimal totalAmount;
-
-    @ApiModelProperty(value = "餐具费")
-    private BigDecimal tablewareFee;
-
-    @ApiModelProperty(value = "优惠券ID")
-    private Integer couponId;
-
-    @ApiModelProperty(value = "优惠券名称")
-    private String couponName;
-
-    @ApiModelProperty(value = "优惠券类型:1-满减券,2-折扣券")
-    private Integer couponType;
-
-    @ApiModelProperty(value = "折扣率(0-100,用于折扣券,例如80表示8折)")
-    private BigDecimal discountRate;
-
-    @ApiModelProperty(value = "面值(用于满减券)")
-    private BigDecimal nominalValue;
-
-    @ApiModelProperty(value = "最低消费")
-    private BigDecimal minimumSpendingAmount;
-
-    @ApiModelProperty(value = "优惠金额")
-    private BigDecimal discountAmount;
-
-    @ApiModelProperty(value = "应付金额")
-    private BigDecimal payAmount;
-
-    @ApiModelProperty(value = "订单状态(0:待支付, 1:已支付, 2:已取消, 3:已完成)")
-    private Integer orderStatus;
-
-    @ApiModelProperty(value = "支付状态(0:未支付, 1:已支付, 2:已退款)")
-    private Integer payStatus;
-
-    @ApiModelProperty(value = "支付方式(1:微信, 2:支付宝, 3:现金)")
-    private Integer payType;
-
-    @ApiModelProperty(value = "创建时间")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "支付时间")
-    private Date payTime;
-}

+ 0 - 65
alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderSettlementVO.java

@@ -1,65 +0,0 @@
-package shop.alien.entity.store.vo.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import shop.alien.entity.store.dto.wechat.WechatCartItemDTO;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * 小程序点餐-结算确认页(自 {@link shop.alien.entity.store.vo.OrderSettlementVO} 复制)
- */
-@Data
-@ApiModel(value = "WechatOrderSettlementVO", description = "小程序订单结算确认页面")
-public class WechatOrderSettlementVO {
-
-    @ApiModelProperty(value = "订单ID")
-    private Integer orderId;
-
-    @ApiModelProperty(value = "订单号")
-    private String orderNo;
-
-    @ApiModelProperty(value = "店铺名称")
-    private String storeName;
-
-    @ApiModelProperty(value = "桌号")
-    private String tableNumber;
-
-    @ApiModelProperty(value = "就餐人数")
-    private Integer dinerCount;
-
-    @ApiModelProperty(value = "联系电话")
-    private String contactPhone;
-
-    @ApiModelProperty(value = "备注")
-    private String remark;
-
-    @ApiModelProperty(value = "菜品清单")
-    private List<WechatCartItemDTO> items;
-
-    @ApiModelProperty(value = "菜品总价")
-    private BigDecimal totalAmount;
-
-    @ApiModelProperty(value = "餐具费")
-    private BigDecimal tablewareFee;
-
-    @ApiModelProperty(value = "优惠券ID")
-    private Integer couponId;
-
-    @ApiModelProperty(value = "优惠券名称")
-    private String couponName;
-
-    @ApiModelProperty(value = "优惠金额")
-    private BigDecimal discountAmount;
-
-    @ApiModelProperty(value = "应付金额")
-    private BigDecimal payAmount;
-
-    @ApiModelProperty(value = "是否已锁定(有人正在结算)")
-    private Boolean isLocked;
-
-    @ApiModelProperty(value = "锁定用户ID")
-    private Integer lockUserId;
-}

+ 0 - 31
alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatOrderSuccessVO.java

@@ -1,31 +0,0 @@
-package shop.alien.entity.store.vo.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-/**
- * 小程序点餐-下单成功页(自 {@link shop.alien.entity.store.vo.OrderSuccessVO} 复制)
- */
-@Data
-@ApiModel(value = "WechatOrderSuccessVO", description = "小程序下单成功")
-public class WechatOrderSuccessVO {
-
-    @ApiModelProperty(value = "订单ID")
-    private Integer orderId;
-
-    @ApiModelProperty(value = "订单号")
-    private String orderNo;
-
-    @ApiModelProperty(value = "店铺名称")
-    private String storeName;
-
-    @ApiModelProperty(value = "桌号")
-    private String tableNumber;
-
-    @ApiModelProperty(value = "就餐人数")
-    private Integer dinerCount;
-
-    @ApiModelProperty(value = "订单状态(0:待支付, 1:已支付, 2:已取消, 3:已完成)")
-    private Integer orderStatus;
-}

+ 0 - 25
alien-entity/src/main/java/shop/alien/entity/store/vo/wechat/WechatStoreOrderPageVO.java

@@ -1,25 +0,0 @@
-package shop.alien.entity.store.vo.wechat;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import shop.alien.entity.store.wechat.WechatStoreOrder;
-
-import java.util.List;
-
-/**
- * 小程序点餐-订单分页 VO(自 {@link shop.alien.entity.store.vo.StoreOrderPageVO} 拆分,订单实体为 {@link WechatStoreOrder})
- */
-@Data
-@ApiModel(value = "WechatStoreOrderPageVO", description = "小程序订单分页(含菜品)")
-public class WechatStoreOrderPageVO {
-
-    @ApiModelProperty(value = "订单信息")
-    private WechatStoreOrder order;
-
-    @ApiModelProperty(value = "门店名称")
-    private String storeName;
-
-    @ApiModelProperty(value = "订单菜品列表")
-    private List<WechatOrderCuisineItemVO> cuisineItems;
-}

+ 0 - 99
alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreCart.java

@@ -1,99 +0,0 @@
-package shop.alien.entity.store.wechat;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-/**
- * 购物车表
- *
- * @author system
- * @since 2025-01-XX
- */
-@Data
-@JsonInclude
-@TableName("wechat_store_cart")
-@ApiModel(value = "WechatStoreCart对象", description = "购物车表")
-public class WechatStoreCart {
-
-    @ApiModelProperty(value = "主键ID")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "桌号ID")
-    @TableField("table_id")
-    private Integer tableId;
-
-    @ApiModelProperty(value = "门店ID")
-    @TableField("store_id")
-    private Integer storeId;
-
-    @ApiModelProperty(value = "菜品ID")
-    @TableField("cuisine_id")
-    private Integer cuisineId;
-
-    @ApiModelProperty(value = "菜品名称")
-    @TableField("cuisine_name")
-    private String cuisineName;
-
-    @ApiModelProperty(value = "菜品图片")
-    @TableField("cuisine_image")
-    private String cuisineImage;
-
-    @ApiModelProperty(value = "单价")
-    @TableField("unit_price")
-    private BigDecimal unitPrice;
-
-    @ApiModelProperty(value = "数量")
-    @TableField("quantity")
-    private Integer quantity;
-
-    @ApiModelProperty(value = "已下单数量(下单时锁定的数量,不允许减少或删除)")
-    @TableField("locked_quantity")
-    private Integer lockedQuantity;
-
-    @ApiModelProperty(value = "小计金额")
-    @TableField("subtotal_amount")
-    private BigDecimal subtotalAmount;
-
-    @ApiModelProperty(value = "添加该菜品的用户ID")
-    @TableField("add_user_id")
-    private Integer addUserId;
-
-    @ApiModelProperty(value = "添加该菜品的用户手机号")
-    @TableField("add_user_phone")
-    private String addUserPhone;
-
-    @ApiModelProperty(value = "备注")
-    @TableField("remark")
-    private String remark;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "创建人ID")
-    @TableField("created_user_id")
-    private Integer createdUserId;
-
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedTime;
-
-    @ApiModelProperty(value = "修改人ID")
-    @TableField("updated_user_id")
-    private Integer updatedUserId;
-}

+ 0 - 88
alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreCouponUsage.java

@@ -1,88 +0,0 @@
-package shop.alien.entity.store.wechat;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-/**
- * 优惠券使用记录表
- *
- * @author system
- * @since 2025-01-XX
- */
-@Data
-@JsonInclude
-@TableName("wechat_store_coupon_usage")
-@ApiModel(value = "WechatStoreCouponUsage对象", description = "优惠券使用记录表")
-public class WechatStoreCouponUsage {
-
-    @ApiModelProperty(value = "主键ID")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "桌号ID")
-    @TableField("table_id")
-    private Integer tableId;
-
-    @ApiModelProperty(value = "门店ID")
-    @TableField("store_id")
-    private Integer storeId;
-
-    @ApiModelProperty(value = "订单ID(下单时关联)")
-    @TableField("order_id")
-    private Integer orderId;
-
-    @ApiModelProperty(value = "优惠券ID")
-    @TableField("coupon_id")
-    private Integer couponId;
-
-    @ApiModelProperty(value = "优惠券名称")
-    @TableField("coupon_name")
-    private String couponName;
-
-    @ApiModelProperty(value = "优惠金额")
-    @TableField("discount_amount")
-    private BigDecimal discountAmount;
-
-    @ApiModelProperty(value = "使用状态(0:已标记使用, 1:已下单, 2:已支付, 3:已取消)")
-    @TableField("usage_status")
-    private Integer usageStatus;
-
-    @ApiModelProperty(value = "换桌前的桌号ID(如果是换桌迁移)")
-    @TableField("from_table_id")
-    private Integer fromTableId;
-
-    @ApiModelProperty(value = "换桌迁移时间")
-    @TableField("migrate_time")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date migrateTime;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "创建人ID")
-    @TableField("created_user_id")
-    private Integer createdUserId;
-
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedTime;
-
-    @ApiModelProperty(value = "修改人ID")
-    @TableField("updated_user_id")
-    private Integer updatedUserId;
-}

+ 0 - 143
alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreCuisine.java

@@ -1,143 +0,0 @@
-package shop.alien.entity.store.wechat;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-/**
- * 美食价目表
- *
- * @author auto-generated
- * @since 2025-01-01
- */
-@Data
-@JsonInclude
-@TableName("wechat_store_cuisine")
-@ApiModel(value = "WechatStoreCuisine对象", description = "美食价目表")
-public class WechatStoreCuisine {
-
-    @ApiModelProperty(value = "主键")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "商户id")
-    @TableField("store_id")
-    private Integer storeId;
-
-    @ApiModelProperty(value = "美食类型: 1-单品,2-套餐")
-    @TableField("cuisine_type")
-    private Integer cuisineType;
-
-    @ApiModelProperty(value = "菜品分类ids(JSON数组,如:[1,2,3])")
-    @TableField("category_ids")
-    private String categoryIds;
-
-    @ApiModelProperty(value = "菜名")
-    @TableField("name")
-    private String name;
-
-    @ApiModelProperty(value = "总价")
-    @TableField("total_price")
-    private BigDecimal totalPrice;
-
-    @ApiModelProperty(value = "首页展示(0:否, 1:是)")
-    @TableField("is_homepage_display")
-    private Integer isHomepageDisplay;
-
-    @ApiModelProperty(value = "菜品标签(JSON数组,如:[\"招牌菜\",\"推荐\"])")
-    @TableField("tags")
-    private String tags;
-
-    @ApiModelProperty(value = "菜品短评")
-    @TableField("dish_review")
-    private String dishReview;
-
-    @ApiModelProperty(value = "图片列表,最多 9 张 URL")
-    @TableField("images")
-    private String images;
-
-    @ApiModelProperty(value = "图文详情-图片")
-    @TableField("image_content")
-    private String imageContent;
-
-    @ApiModelProperty(value = "菜品原料json(原料名称:name,所需重量:height,成本价:cost,推荐价格:suggest)")
-    @TableField("raw_json")
-    private String rawJson;
-
-    @ApiModelProperty(value = "图文详情-文字")
-    @TableField("detail_content")
-    private String detailContent;
-
-    @ApiModelProperty(value = "菜品描述")
-    @TableField("description")
-    private String description;
-
-    @ApiModelProperty(value = "补充说明")
-    @TableField("extra_note")
-    private String extraNote;
-
-    @ApiModelProperty(value = "是否需要预约:0=否,1=是")
-    @TableField("need_reserve")
-    private Integer needReserve;
-
-    @ApiModelProperty(value = "预约规则")
-    @TableField("reserve_rule")
-    private String reserveRule;
-
-    @ApiModelProperty(value = "适用人数")
-    @TableField("people_limit")
-    private String peopleLimit;
-
-    @ApiModelProperty(value = "使用规则")
-    @TableField("usage_rule")
-    private String usageRule;
-
-    @ApiModelProperty(value = "状态:0-待审核 1-审核通过 2-审核拒绝")
-    @TableField("status")
-    private Integer status;
-
-    @ApiModelProperty(value = "上下架状态:1-上架,2-下架")
-    @TableField("shelf_status")
-    private Integer shelfStatus;
-
-    @ApiModelProperty(value = "拒绝原因(审核失败原因)")
-    @TableField("rejection_reason")
-    private String rejectionReason;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建人")
-    @TableField(value = "created_user_id", fill = FieldFill.INSERT)
-    private Integer createdUserId;
-
-    @ApiModelProperty(value = "更新人")
-    @TableField(value = "updated_user_id", fill = FieldFill.UPDATE)
-    private Integer updatedUserId;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "更新时间")
-    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedTime;
-
-    @ApiModelProperty(value = "AI审核时间")
-    @TableField(value = "audit_time")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date auditTime;
-
-}
-
-

+ 0 - 66
alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreCuisineCategory.java

@@ -1,66 +0,0 @@
-package shop.alien.entity.store.wechat;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.Date;
-
-/**
- * 菜品分类表
- *
- * @author system
- * @since 2025-01-XX
- */
-@Data
-@JsonInclude
-@TableName("wechat_store_cuisine_category")
-@ApiModel(value = "WechatStoreCuisineCategory对象", description = "菜品分类表")
-public class WechatStoreCuisineCategory {
-
-    @ApiModelProperty(value = "主键ID")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "门店ID")
-    @TableField("store_id")
-    private Integer storeId;
-
-    @ApiModelProperty(value = "分类名称")
-    @TableField("category_name")
-    private String categoryName;
-
-    @ApiModelProperty(value = "状态(0:禁用, 1:启用)")
-    @TableField("status")
-    private Integer status;
-
-    @ApiModelProperty(value = "排序")
-    @TableField("sort")
-    private Integer sort;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "创建人ID")
-    @TableField("created_user_id")
-    private Integer createdUserId;
-
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedTime;
-
-    @ApiModelProperty(value = "修改人ID")
-    @TableField("updated_user_id")
-    private Integer updatedUserId;
-}

+ 0 - 69
alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreCuisineCombo.java

@@ -1,69 +0,0 @@
-package shop.alien.entity.store.wechat;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.Date;
-
-/**
- * 美食套餐表(辅助详情查询)
- *
- * @author auto-generated
- * @since 2025-01-01
- */
-@Data
-@JsonInclude
-@TableName("wechat_store_cuisine_combo")
-@ApiModel(value = "WechatStoreCuisineCombo对象", description = "美食套餐表(辅助详情查询)")
-public class WechatStoreCuisineCombo {
-
-    @ApiModelProperty(value = "主键")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "单品id")
-    @TableField("sid")
-    private Integer sid;
-
-    @ApiModelProperty(value = "套餐id")
-    @TableField("cid")
-    private Integer cid;
-
-    @ApiModelProperty(value = "套餐包含该单品的数量")
-    @TableField("snum")
-    private Integer snum;
-
-    @ApiModelProperty(value = "类别")
-    @TableField("category")
-    private String category;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建人")
-    @TableField(value = "created_user_id", fill = FieldFill.INSERT)
-    private Integer createdUserId;
-
-    @ApiModelProperty(value = "更新人")
-    @TableField(value = "updated_user_id", fill = FieldFill.UPDATE)
-    private Integer updatedUserId;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "更新时间")
-    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedTime;
-}
-
-
-

+ 0 - 141
alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreOrder.java

@@ -1,141 +0,0 @@
-package shop.alien.entity.store.wechat;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-/**
- * 订单表
- *
- * @author system
- * @since 2025-01-XX
- */
-@Data
-@JsonInclude
-@TableName("wechat_store_order")
-@ApiModel(value = "WechatStoreOrder对象", description = "订单表")
-public class WechatStoreOrder {
-
-    @ApiModelProperty(value = "主键ID")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "订单号")
-    @TableField("order_no")
-    private String orderNo;
-
-    @ApiModelProperty(value = "门店ID")
-    @TableField("store_id")
-    private Integer storeId;
-
-    @ApiModelProperty(value = "桌号ID")
-    @TableField("table_id")
-    private Integer tableId;
-
-    @ApiModelProperty(value = "桌号")
-    @TableField("table_number")
-    private String tableNumber;
-
-    @ApiModelProperty(value = "就餐人数")
-    @TableField("diner_count")
-    private Integer dinerCount;
-
-    @ApiModelProperty(value = "支付用户ID")
-    @TableField("pay_user_id")
-    private Integer payUserId;
-
-    @ApiModelProperty(value = "支付用户手机号")
-    @TableField("pay_user_phone")
-    private String payUserPhone;
-
-    @ApiModelProperty(value = "联系电话")
-    @TableField("contact_phone")
-    private String contactPhone;
-
-    @ApiModelProperty(value = "餐具费")
-    @TableField("tableware_fee")
-    private BigDecimal tablewareFee;
-
-    @ApiModelProperty(value = "订单状态(0:待支付, 1:已支付, 2:已取消, 3:已完成)")
-    @TableField("order_status")
-    private Integer orderStatus;
-
-    @ApiModelProperty(value = "订单总金额")
-    @TableField("total_amount")
-    private BigDecimal totalAmount;
-
-    @ApiModelProperty(value = "优惠券ID")
-    @TableField("coupon_id")
-    private Integer couponId;
-
-    @ApiModelProperty(value = "当前使用的优惠券ID(用于换桌场景)")
-    @TableField("current_coupon_id")
-    private Integer currentCouponId;
-
-    @ApiModelProperty(value = "优惠金额")
-    @TableField("discount_amount")
-    private BigDecimal discountAmount;
-
-    @ApiModelProperty(value = "锁定用户ID(下单或结算时锁定)")
-    @TableField("lock_user_id")
-    private Integer lockUserId;
-
-    @ApiModelProperty(value = "锁定过期时间")
-    @TableField("lock_expire_time")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date lockExpireTime;
-
-    @ApiModelProperty(value = "实付金额")
-    @TableField("pay_amount")
-    private BigDecimal payAmount;
-
-    @ApiModelProperty(value = "支付方式(1:微信, 2:支付宝, 3:现金)")
-    @TableField("pay_type")
-    private Integer payType;
-
-    @ApiModelProperty(value = "支付状态(0:未支付, 1:已支付, 2:已退款)")
-    @TableField("pay_status")
-    private Integer payStatus;
-
-    @ApiModelProperty(value = "支付时间")
-    @TableField("pay_time")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date payTime;
-
-    @ApiModelProperty(value = "支付交易号")
-    @TableField("pay_trade_no")
-    private String payTradeNo;
-
-    @ApiModelProperty(value = "备注")
-    @TableField("remark")
-    private String remark;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "创建人ID")
-    @TableField("created_user_id")
-    private Integer createdUserId;
-
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedTime;
-
-    @ApiModelProperty(value = "修改人ID")
-    @TableField("updated_user_id")
-    private Integer updatedUserId;
-}

+ 0 - 120
alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreOrderChangeLog.java

@@ -1,120 +0,0 @@
-package shop.alien.entity.store.wechat;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-/**
- * 订单变更记录表(记录每次下单/更新订单的商品变化)
- *
- * @author system
- * @since 2025-02-02
- */
-@Data
-@JsonInclude
-@TableName("wechat_store_order_change_log")
-@ApiModel(value = "WechatStoreOrderChangeLog对象", description = "订单变更记录表")
-public class WechatStoreOrderChangeLog {
-
-    @ApiModelProperty(value = "主键ID")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "订单ID")
-    @TableField("order_id")
-    private Integer orderId;
-
-    @ApiModelProperty(value = "订单号")
-    @TableField("order_no")
-    private String orderNo;
-
-    @ApiModelProperty(value = "批次号(同一时间点的操作使用同一批次号,用于分组展示)")
-    @TableField("batch_no")
-    private String batchNo;
-
-    @ApiModelProperty(value = "操作类型(1:首次下单, 3:更新订单)")
-    @TableField("operation_type")
-    private Integer operationType;
-
-    @ApiModelProperty(value = "菜品ID")
-    @TableField("cuisine_id")
-    private Integer cuisineId;
-
-    @ApiModelProperty(value = "菜品名称")
-    @TableField("cuisine_name")
-    private String cuisineName;
-
-    @ApiModelProperty(value = "菜品类型(1:单品, 2:套餐)")
-    @TableField("cuisine_type")
-    private Integer cuisineType;
-
-    @ApiModelProperty(value = "菜品图片")
-    @TableField("cuisine_image")
-    private String cuisineImage;
-
-    @ApiModelProperty(value = "单价")
-    @TableField("unit_price")
-    private BigDecimal unitPrice;
-
-    @ApiModelProperty(value = "数量变化(新增的数量,正数表示增加,负数表示减少)")
-    @TableField("quantity_change")
-    private Integer quantityChange;
-
-    @ApiModelProperty(value = "变化前数量(用于展示变化前后对比)")
-    @TableField("quantity_before")
-    private Integer quantityBefore;
-
-    @ApiModelProperty(value = "变化后数量(用于展示变化前后对比)")
-    @TableField("quantity_after")
-    private Integer quantityAfter;
-
-    @ApiModelProperty(value = "金额变化(新增的金额)")
-    @TableField("amount_change")
-    private BigDecimal amountChange;
-
-    @ApiModelProperty(value = "操作时间")
-    @TableField("operation_time")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date operationTime;
-
-    @ApiModelProperty(value = "操作人ID")
-    @TableField("operator_user_id")
-    private Integer operatorUserId;
-
-    @ApiModelProperty(value = "操作人手机号")
-    @TableField("operator_user_phone")
-    private String operatorUserPhone;
-
-    @ApiModelProperty(value = "备注")
-    @TableField("remark")
-    private String remark;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "创建人ID")
-    @TableField("created_user_id")
-    private Integer createdUserId;
-
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedTime;
-
-    @ApiModelProperty(value = "修改人ID")
-    @TableField("updated_user_id")
-    private Integer updatedUserId;
-}

+ 0 - 108
alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreOrderDetail.java

@@ -1,108 +0,0 @@
-package shop.alien.entity.store.wechat;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-/**
- * 订单明细表
- *
- * @author system
- * @since 2025-01-XX
- */
-@Data
-@JsonInclude
-@TableName("wechat_store_order_detail")
-@ApiModel(value = "WechatStoreOrderDetail对象", description = "订单明细表")
-public class WechatStoreOrderDetail {
-
-    @ApiModelProperty(value = "主键ID")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "订单ID")
-    @TableField("order_id")
-    private Integer orderId;
-
-    @ApiModelProperty(value = "订单号")
-    @TableField("order_no")
-    private String orderNo;
-
-    @ApiModelProperty(value = "菜品ID")
-    @TableField("cuisine_id")
-    private Integer cuisineId;
-
-    @ApiModelProperty(value = "菜品名称")
-    @TableField("cuisine_name")
-    private String cuisineName;
-
-    @ApiModelProperty(value = "菜品类型(1:单品, 2:套餐)")
-    @TableField("cuisine_type")
-    private Integer cuisineType;
-
-    @ApiModelProperty(value = "菜品图片")
-    @TableField("cuisine_image")
-    private String cuisineImage;
-
-    @ApiModelProperty(value = "单价")
-    @TableField("unit_price")
-    private BigDecimal unitPrice;
-
-    @ApiModelProperty(value = "数量")
-    @TableField("quantity")
-    private Integer quantity;
-
-    @ApiModelProperty(value = "小计金额")
-    @TableField("subtotal_amount")
-    private BigDecimal subtotalAmount;
-
-    @ApiModelProperty(value = "添加该菜品的用户ID")
-    @TableField("add_user_id")
-    private Integer addUserId;
-
-    @ApiModelProperty(value = "添加该菜品的用户手机号")
-    @TableField("add_user_phone")
-    private String addUserPhone;
-
-    @ApiModelProperty(value = "是否加餐(0:初始下单, 1:加餐)")
-    @TableField("is_add_dish")
-    private Integer isAddDish;
-
-    @ApiModelProperty(value = "加餐时间")
-    @TableField("add_dish_time")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date addDishTime;
-
-    @ApiModelProperty(value = "备注")
-    @TableField("remark")
-    private String remark;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "创建人ID")
-    @TableField("created_user_id")
-    private Integer createdUserId;
-
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedTime;
-
-    @ApiModelProperty(value = "修改人ID")
-    @TableField("updated_user_id")
-    private Integer updatedUserId;
-}

+ 0 - 76
alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreOrderLock.java

@@ -1,76 +0,0 @@
-package shop.alien.entity.store.wechat;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.Date;
-
-/**
- * 订单锁定记录表
- *
- * @author system
- * @since 2025-01-XX
- */
-@Data
-@JsonInclude
-@TableName("wechat_store_order_lock")
-@ApiModel(value = "WechatStoreOrderLock对象", description = "订单锁定记录表")
-public class WechatStoreOrderLock {
-
-    @ApiModelProperty(value = "主键ID")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "桌号ID(下单锁定)")
-    @TableField("table_id")
-    private Integer tableId;
-
-    @ApiModelProperty(value = "订单ID(结算锁定)")
-    @TableField("order_id")
-    private Integer orderId;
-
-    @ApiModelProperty(value = "锁定类型(1:下单锁定, 2:结算锁定)")
-    @TableField("lock_type")
-    private Integer lockType;
-
-    @ApiModelProperty(value = "锁定用户ID")
-    @TableField("lock_user_id")
-    private Integer lockUserId;
-
-    @ApiModelProperty(value = "锁定用户手机号")
-    @TableField("lock_user_phone")
-    private String lockUserPhone;
-
-    @ApiModelProperty(value = "锁定过期时间")
-    @TableField("lock_expire_time")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date lockExpireTime;
-
-    @ApiModelProperty(value = "锁定状态(0:已释放, 1:锁定中)")
-    @TableField("lock_status")
-    private Integer lockStatus;
-
-    @ApiModelProperty(value = "释放时间")
-    @TableField("release_time")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date releaseTime;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedTime;
-}

+ 0 - 177
alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStorePaymentConfig.java

@@ -1,177 +0,0 @@
-package shop.alien.entity.store.wechat;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-import shop.alien.util.typehandler.BlobByteArrayTypeHandler;
-
-import java.util.Date;
-
-/**
- * 支付配置表(支付宝等)
- *
- * @author system
- */
-@Data
-@JsonInclude
-@TableName("wechat_store_payment_config")
-@ApiModel(value = "WechatStorePaymentConfig对象", description = "支付配置表")
-public class WechatStorePaymentConfig {
-
-    @ApiModelProperty(value = "主键")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "店铺ID")
-    @TableField("store_id")
-    private Integer storeId;
-
-    @ApiModelProperty(value = "店铺用户id")
-    @TableField("store_user_id")
-    private Integer storeUserId;
-
-    @ApiModelProperty(value = "应用ID")
-    @TableField("app_id")
-    private String appId;
-
-    @ApiModelProperty(value = "应用私钥")
-    @TableField("app_secret_cert")
-    private String appSecretCert;
-
-    @ApiModelProperty(value = "应用公钥证书文件(存储文件内容)(支付宝)BLOB,原样存取不经过字符编码")
-    @TableField(value = "app_public_cert", typeHandler = BlobByteArrayTypeHandler.class)
-    private byte[] appPublicCert;
-
-    @ApiModelProperty(value = "应用公钥证书路径")
-    @TableField("app_public_cert_path")
-    private String appPublicCertPath;
-
-    @ApiModelProperty(value = "应用公钥证书文件名称")
-    @TableField("app_public_cert_name")
-    private String appPublicCertName;
-
-    @ApiModelProperty(value = "支付宝公钥证书文件(存储文件内容)(支付宝)BLOB,原样存取不经过字符编码")
-    @TableField(value = "alipay_public_cert", typeHandler = BlobByteArrayTypeHandler.class)
-    private byte[] alipayPublicCert;
-
-    @ApiModelProperty(value = "支付宝公钥证书路径")
-    @TableField("alipay_public_cert_path")
-    private String alipayPublicCertPath;
-
-    @ApiModelProperty(value = "支付宝公钥证书文件名称")
-    @TableField("alipay_public_cert_name")
-    private String alipayPublicCertName;
-
-    @ApiModelProperty(value = "支付宝根证书文件(存储文件内容)(支付宝)BLOB,原样存取不经过字符编码")
-    @TableField(value = "alipay_root_cert", typeHandler = BlobByteArrayTypeHandler.class)
-    private byte[] alipayRootCert;
-
-    @ApiModelProperty(value = "支付宝根证书路径")
-    @TableField("alipay_root_cert_path")
-    private String alipayRootCertPath;
-
-    @ApiModelProperty(value = "支付宝根证书文件名称")
-    @TableField("alipay_root_cert_name")
-    private String alipayRootCertName;
-
-    @ApiModelProperty(value = "微信appId")
-    @TableField("wechat_app_id")
-    private String wechatAppId;
-
-    @ApiModelProperty(value = "微信支付mini appId")
-    @TableField("wechat_mini_app_id")
-    private String wechatMiniAppId;
-
-    @ApiModelProperty(value = "微信mchId")
-    @TableField("wechat_mch_id")
-    private String wechatMchId;
-
-    @ApiModelProperty(value = "微信商户API证书序列号")
-    @TableField("merchant_serial_number")
-    private String merchantSerialNumber;
-
-    @ApiModelProperty(value = "微信商户的 APIv3 Key")
-    @TableField("api_v3_key")
-    private String apiV3Key;
-
-    @ApiModelProperty(value = "微信支付公钥ID")
-    @TableField("wechat_pay_public_key_id")
-    private String wechatPayPublicKeyId;
-
-    @ApiModelProperty(value = "微信私钥路径")
-    @TableField("wechat_private_key_path")
-    private String wechatPrivateKeyPath;
-
-    @ApiModelProperty(value = "微信私钥文件名")
-    @TableField("wechat_private_key_name")
-    private String wechatPrivateKeyName;
-
-    @ApiModelProperty(value = "微信私钥文件(存储文件内容)BLOB,原样存取不经过字符编码")
-    @TableField(value = "wechat_private_key_file", typeHandler = BlobByteArrayTypeHandler.class)
-    private byte[] wechatPrivateKeyFile;
-
-    @ApiModelProperty(value = "微信公钥路径")
-    @TableField("wechat_pay_public_key_file_path")
-    private String wechatPayPublicKeyFilePath;
-
-    @ApiModelProperty(value = "微信公钥文件名")
-    @TableField("wechat_pay_public_key_file_name")
-    private String wechatPayPublicKeyFileName;
-
-    @ApiModelProperty(value = "微信公钥文件(存储文件内容)BLOB,原样存取不经过字符编码")
-    @TableField(value = "wechat_pay_public_key_file", typeHandler = BlobByteArrayTypeHandler.class)
-    private byte[] wechatPayPublicKeyFile;
-
-    @ApiModelProperty(value = "收款银行卡号")
-    @TableField("bank_card_no")
-    private String bankCardNo;
-
-    @ApiModelProperty(value = "开户银行名称")
-    @TableField("bank_name")
-    private String bankName;
-
-    @ApiModelProperty(value = "商家微信 appid")
-    @TableField("store_wechat_id")
-    private String storeWechatId;
-
-    @ApiModelProperty(value = "商家微信名称")
-    @TableField("store_wechat_name")
-    private String storeWechatName;
-
-    @ApiModelProperty(value = "商家支付宝 appid")
-    @TableField("store_ali_id")
-    private String storeAliId;
-
-    @ApiModelProperty(value = "商家支付宝名称")
-    @TableField("store_ali_name")
-    private String storeAliName;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "创建人ID")
-    @TableField("created_user_id")
-    private Integer createdUserId;
-
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date updatedTime;
-
-    @ApiModelProperty(value = "修改人ID")
-    @TableField("updated_user_id")
-    private Integer updatedUserId;
-}

+ 0 - 98
alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreTable.java

@@ -1,98 +0,0 @@
-package shop.alien.entity.store.wechat;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.Date;
-
-/**
- * 桌号表
- *
- * @author system
- * @since 2025-01-XX
- */
-@Data
-@JsonInclude
-@TableName("wechat_store_table")
-@ApiModel(value = "WechatStoreTable对象", description = "桌号表")
-public class WechatStoreTable {
-
-    @ApiModelProperty(value = "主键ID")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "门店ID")
-    @TableField("store_id")
-    private Integer storeId;
-
-    @ApiModelProperty(value = "桌号")
-    @TableField("table_number")
-    private String tableNumber;
-
-    @ApiModelProperty(value = "分类ID(关联store_booking_category表)")
-    @TableField("category_id")
-    private Integer categoryId;
-
-    @ApiModelProperty(value = "座位数")
-    @TableField("seating_capacity")
-    private Integer seatingCapacity;
-
-    @ApiModelProperty(value = "当前进行中的订单ID(订单结账或取消后清空)")
-    @TableField("current_order_id")
-    private Integer currentOrderId;
-
-    @ApiModelProperty(value = "当前使用的优惠券ID")
-    @TableField("current_coupon_id")
-    private Integer currentCouponId;
-
-    @ApiModelProperty(value = "购物车商品数量(缓存)")
-    @TableField("cart_item_count")
-    private Integer cartItemCount;
-
-    @ApiModelProperty(value = "购物车总金额(缓存)")
-    @TableField("cart_total_amount")
-    private java.math.BigDecimal cartTotalAmount;
-
-    @ApiModelProperty(value = "二维码URL")
-    @TableField("qrcode_url")
-    private String qrcodeUrl;
-
-    @ApiModelProperty(value = "状态(0:空闲, 1:就餐中, 2:其他, 3:加餐)")
-    @TableField("status")
-    private Integer status;
-
-    @ApiModelProperty(value = "当前就餐人数(就餐中时由首客填写,后续用户共用)")
-    @TableField("diner_count")
-    private Integer dinerCount;
-
-    @ApiModelProperty(value = "备注")
-    @TableField("remark")
-    private String remark;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "创建人ID")
-    @TableField("created_user_id")
-    private Integer createdUserId;
-
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedTime;
-
-    @ApiModelProperty(value = "修改人ID")
-    @TableField("updated_user_id")
-    private Integer updatedUserId;
-}

+ 0 - 78
alien-entity/src/main/java/shop/alien/entity/store/wechat/WechatStoreTableLog.java

@@ -1,78 +0,0 @@
-package shop.alien.entity.store.wechat;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.Date;
-
-/**
- * 桌号换桌记录表
- *
- * @author system
- * @since 2025-01-XX
- */
-@Data
-@JsonInclude
-@TableName("wechat_store_table_log")
-@ApiModel(value = "WechatStoreTableLog对象", description = "桌号换桌记录表")
-public class WechatStoreTableLog {
-
-    @ApiModelProperty(value = "主键ID")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
-    @ApiModelProperty(value = "门店ID")
-    @TableField("store_id")
-    private Integer storeId;
-
-    @ApiModelProperty(value = "订单ID")
-    @TableField("order_id")
-    private Integer orderId;
-
-    @ApiModelProperty(value = "原桌号ID")
-    @TableField("from_table_id")
-    private Integer fromTableId;
-
-    @ApiModelProperty(value = "原桌号")
-    @TableField("from_table_number")
-    private String fromTableNumber;
-
-    @ApiModelProperty(value = "目标桌号ID")
-    @TableField("to_table_id")
-    private Integer toTableId;
-
-    @ApiModelProperty(value = "目标桌号")
-    @TableField("to_table_number")
-    private String toTableNumber;
-
-    @ApiModelProperty(value = "换桌原因")
-    @TableField("change_reason")
-    private String changeReason;
-
-    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
-    @TableField("delete_flag")
-    @TableLogic
-    private Integer deleteFlag;
-
-    @ApiModelProperty(value = "创建时间")
-    @TableField(value = "created_time", fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createdTime;
-
-    @ApiModelProperty(value = "创建人ID")
-    @TableField("created_user_id")
-    private Integer createdUserId;
-
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updatedTime;
-
-    @ApiModelProperty(value = "修改人ID")
-    @TableField("updated_user_id")
-    private Integer updatedUserId;
-}

+ 1 - 1
alien-entity/src/main/java/shop/alien/mapper/StoreReservationMapper.java

@@ -20,7 +20,7 @@ public interface StoreReservationMapper extends BaseMapper<UserReservation> {
      * 查询商家端预约信息列表
      *
      * @param storeId    门店ID(必填)
-     * @param status     预约状态(可选,0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时)
+     * @param status     预约状态(可选,0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时 5:用餐结束
      * @param dateFrom   预约日期起(可选)
      * @param dateTo     预约日期止(可选)
      * @param orderStatus 订单状态(可选,0:待支付 1:待使用 2:已完成 3:已过期 4:已取消 5:已关闭 6:退款中 7:已退款 8:商家预订)

+ 1 - 1
alien-entity/src/main/java/shop/alien/mapper/UserReservationMapper.java

@@ -20,7 +20,7 @@ public interface UserReservationMapper extends BaseMapper<UserReservation> {
      * 查询商家端预约信息列表
      *
      * @param storeId    门店ID(必填)
-     * @param status     预约状态(可选,0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时)
+     * @param status     预约状态(可选,0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时 5:用餐结束
      * @param dateFrom   预约日期起(可选)
      * @param dateTo     预约日期止(可选)
      * @param orderStatus 订单状态(可选,0:待支付 1:待使用 2:已完成 3:已过期 4:已取消 5:已关闭 6:退款中 7:已退款 8:商家预订)

+ 0 - 10
alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreCartMapper.java

@@ -1,10 +0,0 @@
-package shop.alien.mapper.wechat;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.wechat.WechatStoreCart;
-
-/**
- * 小程序点餐专用表 WechatStoreCart Mapper(与 APP 侧物理表隔离)
- */
-public interface WechatStoreCartMapper extends BaseMapper<WechatStoreCart> {
-}

+ 0 - 10
alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreCouponUsageMapper.java

@@ -1,10 +0,0 @@
-package shop.alien.mapper.wechat;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.wechat.WechatStoreCouponUsage;
-
-/**
- * 小程序点餐专用表 WechatStoreCouponUsage Mapper(与 APP 侧物理表隔离)
- */
-public interface WechatStoreCouponUsageMapper extends BaseMapper<WechatStoreCouponUsage> {
-}

+ 0 - 10
alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreCuisineCategoryMapper.java

@@ -1,10 +0,0 @@
-package shop.alien.mapper.wechat;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.wechat.WechatStoreCuisineCategory;
-
-/**
- * 小程序点餐专用表 WechatStoreCuisineCategory Mapper(与 APP 侧物理表隔离)
- */
-public interface WechatStoreCuisineCategoryMapper extends BaseMapper<WechatStoreCuisineCategory> {
-}

+ 0 - 10
alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreCuisineComboMapper.java

@@ -1,10 +0,0 @@
-package shop.alien.mapper.wechat;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.wechat.WechatStoreCuisineCombo;
-
-/**
- * 小程序点餐专用表 WechatStoreCuisineCombo Mapper(与 APP 侧物理表隔离)
- */
-public interface WechatStoreCuisineComboMapper extends BaseMapper<WechatStoreCuisineCombo> {
-}

+ 0 - 10
alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreCuisineMapper.java

@@ -1,10 +0,0 @@
-package shop.alien.mapper.wechat;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.wechat.WechatStoreCuisine;
-
-/**
- * 小程序点餐专用表 WechatStoreCuisine Mapper(与 APP 侧物理表隔离)
- */
-public interface WechatStoreCuisineMapper extends BaseMapper<WechatStoreCuisine> {
-}

+ 0 - 10
alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreOrderChangeLogMapper.java

@@ -1,10 +0,0 @@
-package shop.alien.mapper.wechat;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.wechat.WechatStoreOrderChangeLog;
-
-/**
- * 小程序点餐专用表 WechatStoreOrderChangeLog Mapper(与 APP 侧物理表隔离)
- */
-public interface WechatStoreOrderChangeLogMapper extends BaseMapper<WechatStoreOrderChangeLog> {
-}

+ 0 - 10
alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreOrderDetailMapper.java

@@ -1,10 +0,0 @@
-package shop.alien.mapper.wechat;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.wechat.WechatStoreOrderDetail;
-
-/**
- * 小程序点餐专用表 WechatStoreOrderDetail Mapper(与 APP 侧物理表隔离)
- */
-public interface WechatStoreOrderDetailMapper extends BaseMapper<WechatStoreOrderDetail> {
-}

+ 0 - 10
alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreOrderLockMapper.java

@@ -1,10 +0,0 @@
-package shop.alien.mapper.wechat;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.wechat.WechatStoreOrderLock;
-
-/**
- * 小程序点餐专用表 WechatStoreOrderLock Mapper(与 APP 侧物理表隔离)
- */
-public interface WechatStoreOrderLockMapper extends BaseMapper<WechatStoreOrderLock> {
-}

+ 0 - 10
alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreOrderMapper.java

@@ -1,10 +0,0 @@
-package shop.alien.mapper.wechat;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.wechat.WechatStoreOrder;
-
-/**
- * 小程序点餐专用表 WechatStoreOrder Mapper(与 APP 侧物理表隔离)
- */
-public interface WechatStoreOrderMapper extends BaseMapper<WechatStoreOrder> {
-}

+ 0 - 10
alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStorePaymentConfigMapper.java

@@ -1,10 +0,0 @@
-package shop.alien.mapper.wechat;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.wechat.WechatStorePaymentConfig;
-
-/**
- * 小程序点餐专用表 WechatStorePaymentConfig Mapper(与 APP 侧物理表隔离)
- */
-public interface WechatStorePaymentConfigMapper extends BaseMapper<WechatStorePaymentConfig> {
-}

+ 0 - 10
alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreTableLogMapper.java

@@ -1,10 +0,0 @@
-package shop.alien.mapper.wechat;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.wechat.WechatStoreTableLog;
-
-/**
- * 小程序点餐专用表 WechatStoreTableLog Mapper(与 APP 侧物理表隔离)
- */
-public interface WechatStoreTableLogMapper extends BaseMapper<WechatStoreTableLog> {
-}

+ 0 - 10
alien-entity/src/main/java/shop/alien/mapper/wechat/WechatStoreTableMapper.java

@@ -1,10 +0,0 @@
-package shop.alien.mapper.wechat;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import shop.alien.entity.store.wechat.WechatStoreTable;
-
-/**
- * 小程序点餐专用表 WechatStoreTable Mapper(与 APP 侧物理表隔离)
- */
-public interface WechatStoreTableMapper extends BaseMapper<WechatStoreTable> {
-}

+ 2 - 1
alien-entity/src/main/resources/mapper/StoreBookingTableMapper.xml

@@ -9,6 +9,7 @@
         <result column="category_id" property="categoryId" />
         <result column="table_number" property="tableNumber" />
         <result column="seating_capacity" property="seatingCapacity" />
+        <result column="type" property="type" />
         <result column="delete_flag" property="deleteFlag" />
         <result column="created_time" property="createdTime" />
         <result column="created_user_id" property="createdUserId" />
@@ -18,7 +19,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, store_id, category_id, table_number, seating_capacity, 
+        id, store_id, category_id, table_number, seating_capacity, type,
         delete_flag, created_time, created_user_id, updated_time, updated_user_id
     </sql>
 

+ 1 - 0
alien-entity/src/main/resources/mapper/StoreReservationMapper.xml

@@ -69,6 +69,7 @@
                 WHEN 2 THEN '已完成'
                 WHEN 3 THEN '已取消'
                 WHEN 4 THEN '未到店'
+                WHEN 5 THEN '用餐结束'
                 ELSE '未知'
             END AS status_text,
             uro.refund_amount,

+ 1 - 0
alien-entity/src/main/resources/mapper/UserReservationMapper.xml

@@ -145,6 +145,7 @@
                 WHEN 2 THEN '已完成'
                 WHEN 3 THEN '已取消'
                 WHEN 4 THEN '未到店'
+                WHEN 5 THEN '用餐结束'
                 ELSE '未知'
             END AS status_text,
             uro.refund_amount,

+ 31 - 0
alien-job/src/main/java/shop/alien/job/store/ReservationDiningFinishedDelayJob.java

@@ -0,0 +1,31 @@
+package shop.alien.job.store;
+
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * 点餐支付成功后延迟 20 分钟,由定时任务将「已到店」预约更新为「用餐结束」。
+ * <p>请在 XXL-JOB 控制台配置执行器任务,JobHandler 名称为 {@code reservationDiningFinishedDelayJob},
+ * 建议调度周期 1~5 分钟。</p>
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class ReservationDiningFinishedDelayJob {
+
+    private final ReservationDiningFinishedDelayService reservationDiningFinishedDelayService;
+
+    @XxlJob("reservationDiningFinishedDelayJob")
+    public void reservationDiningFinishedDelayJob() {
+        log.info("【定时任务】点餐支付延迟标记用餐结束:开始执行");
+        try {
+            int n = reservationDiningFinishedDelayService.processEligibleOrders();
+            log.info("【定时任务】点餐支付延迟标记用餐结束:执行完成,本次更新预约条数={}", n);
+        } catch (Exception e) {
+            log.error("【定时任务】点餐支付延迟标记用餐结束:执行异常", e);
+            throw e;
+        }
+    }
+}

+ 158 - 0
alien-job/src/main/java/shop/alien/job/store/ReservationDiningFinishedDelayService.java

@@ -0,0 +1,158 @@
+package shop.alien.job.store;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.store.StoreOrder;
+import shop.alien.entity.store.UserReservation;
+import shop.alien.entity.store.UserReservationTable;
+import shop.alien.mapper.StoreOrderMapper;
+import shop.alien.mapper.UserReservationMapper;
+import shop.alien.mapper.UserReservationTableMapper;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.stream.Collectors;
+
+/**
+ * 点餐订单支付成功后,延迟将「已到店」预约改为「用餐结束」,由定时任务触发(非支付回调即时更新)。
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ReservationDiningFinishedDelayService {
+
+    private final StoreOrderMapper storeOrderMapper;
+    private final UserReservationTableMapper userReservationTableMapper;
+    private final UserReservationMapper userReservationMapper;
+
+    /** 支付成功起算延迟多少分钟后再把预约置为用餐结束 */
+    private static final int DELAY_MINUTES = 20;
+    /** 仅扫描近 N 天内已支付订单,避免历史数据全表扫描 */
+    private static final int PAY_TIME_LOOKBACK_DAYS = 30;
+
+    private static final int USER_RES_STATUS_ARRIVED = 2;
+    private static final int USER_RES_STATUS_DINING_FINISHED = 5;
+
+    /**
+     * 处理:已支付超过 {@link #DELAY_MINUTES} 分钟、且未在历史窗口之外的 store_order。
+     * 若订单含 {@code user_reservation_id},直接更新该预约(须门店一致且状态为已到店);
+     * 否则沿用桌位+「预约日=支付日」推断(兼容旧数据与散客未绑预约订单)。
+     *
+     * @return 本次成功更新的预约条数
+     */
+    public int processEligibleOrders() {
+        Date now = new Date();
+        TimeZone shanghai = TimeZone.getTimeZone("Asia/Shanghai");
+        Calendar cal = Calendar.getInstance(shanghai);
+        cal.setTime(now);
+        cal.add(Calendar.MINUTE, -DELAY_MINUTES);
+        Date cutoff = cal.getTime();
+
+        cal.setTime(now);
+        cal.add(Calendar.DAY_OF_MONTH, -PAY_TIME_LOOKBACK_DAYS);
+        Date oldest = cal.getTime();
+
+        List<StoreOrder> orders = storeOrderMapper.selectList(
+                new LambdaQueryWrapper<StoreOrder>()
+                        .eq(StoreOrder::getPayStatus, 1)
+                        .eq(StoreOrder::getDeleteFlag, 0)
+                        .isNotNull(StoreOrder::getPayTime)
+                        .isNotNull(StoreOrder::getStoreId)
+                        .and(w -> w.isNotNull(StoreOrder::getUserReservationId)
+                                .or()
+                                .isNotNull(StoreOrder::getTableId))
+                        .le(StoreOrder::getPayTime, cutoff)
+                        .ge(StoreOrder::getPayTime, oldest));
+
+        if (orders == null || orders.isEmpty()) {
+            return 0;
+        }
+
+        SimpleDateFormat dayFmt = new SimpleDateFormat("yyyy-MM-dd");
+        dayFmt.setTimeZone(shanghai);
+
+        int updated = 0;
+        for (StoreOrder order : orders) {
+            try {
+                if (order.getPayTime() == null) {
+                    continue;
+                }
+                if (order.getUserReservationId() != null) {
+                    updated += finishReservationByOrderBinding(order, now);
+                } else if (order.getTableId() != null) {
+                    String payDayStr = dayFmt.format(order.getPayTime());
+                    updated += syncUserReservationDiningFinished(
+                            order.getStoreId(), order.getTableId(), payDayStr, now, dayFmt);
+                }
+            } catch (Exception e) {
+                log.warn("延迟标记用餐结束失败 orderId={} err={}", order.getId(), e.getMessage());
+            }
+        }
+        return updated;
+    }
+
+    /** 订单已绑定 user_reservation_id:仅校验门店与已到店状态后置为用餐结束 */
+    private int finishReservationByOrderBinding(StoreOrder order, Date now) {
+        UserReservation r = userReservationMapper.selectById(order.getUserReservationId());
+        if (r == null || r.getStoreId() == null || !r.getStoreId().equals(order.getStoreId())) {
+            return 0;
+        }
+        if (r.getStatus() == null || r.getStatus() != USER_RES_STATUS_ARRIVED) {
+            return 0;
+        }
+        r.setStatus(USER_RES_STATUS_DINING_FINISHED);
+        r.setUpdatedTime(now);
+        userReservationMapper.updateById(r);
+        log.info("延迟任务:按订单绑定更新预约为用餐结束 reservationId={} orderId={}",
+                order.getUserReservationId(), order.getId());
+        return 1;
+    }
+
+    private int syncUserReservationDiningFinished(Integer storeId, Integer storeTableId,
+                                                  String reservationDayYyyyMmDd, Date now,
+                                                  SimpleDateFormat dayFmt) {
+        List<UserReservationTable> links = userReservationTableMapper.selectList(
+                new LambdaQueryWrapper<UserReservationTable>()
+                        .eq(UserReservationTable::getTableId, storeTableId)
+                        .eq(UserReservationTable::getDeleteFlag, 0));
+        if (links == null || links.isEmpty()) {
+            return 0;
+        }
+        Set<Integer> reservationIds = links.stream()
+                .map(UserReservationTable::getReservationId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toCollection(LinkedHashSet::new));
+
+        int n = 0;
+        for (Integer reservationId : reservationIds) {
+            UserReservation r = userReservationMapper.selectById(reservationId);
+            if (r == null || r.getStoreId() == null || !r.getStoreId().equals(storeId)) {
+                continue;
+            }
+            if (r.getStatus() == null || r.getStatus() != USER_RES_STATUS_ARRIVED) {
+                continue;
+            }
+            if (r.getReservationDate() == null) {
+                continue;
+            }
+            if (!reservationDayYyyyMmDd.equals(dayFmt.format(r.getReservationDate()))) {
+                continue;
+            }
+            r.setStatus(USER_RES_STATUS_DINING_FINISHED);
+            r.setUpdatedTime(now);
+            userReservationMapper.updateById(r);
+            n++;
+            log.info("延迟任务:预约已更新为用餐结束 reservationId={} tableId={} matchDay={}",
+                    reservationId, storeTableId, reservationDayYyyyMmDd);
+        }
+        return n;
+    }
+}

+ 1 - 1
alien-job/src/main/java/shop/alien/job/store/ReservationTimeoutJob.java

@@ -11,7 +11,7 @@ import shop.alien.job.feign.AlienStoreFeign;
  * 预订未到店超时定时任务
  * retain_position_flag=1:start_time + retention_duration(分钟)早于当前时间;
  * 否则仅 start_time 早于当前时间;且 user_reservation_order 为「待使用」的预订:
- * - user_reservation.status 置为 4(未到店超时)
+ * - user_reservation.status 置为 4(未到店超时;不处理用餐结束 5
  * - user_reservation_order.order_status 置为 3(已过期)
  */
 @Slf4j

+ 0 - 26
alien-store/src/main/java/shop/alien/store/annotation/OperationLog.java

@@ -1,26 +0,0 @@
-package shop.alien.store.annotation;
-
-import java.lang.annotation.*;
-
-/**
- * 操作日志注解
- *
- * @author ssk
- * @version 1.0
- * @date 2024/12/4
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-public @interface OperationLog {
-    /**
-     * 操作描述
-     */
-    String value() default "";
-
-    /**
-     * 操作类型
-     */
-    String type() default "";
-}
-

+ 0 - 22
alien-store/src/main/java/shop/alien/store/aspect/DiningOperationLogAspect.java

@@ -1,22 +0,0 @@
-package shop.alien.store.aspect;
-
-import lombok.extern.slf4j.Slf4j;
-import org.aspectj.lang.JoinPoint;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Before;
-import org.springframework.stereotype.Component;
-import shop.alien.store.annotation.OperationLog;
-
-/**
- * 点餐模块操作日志切面(与 store 全局 OperationLogAspect 区分 Bean 名)
- */
-@Slf4j
-@Aspect
-@Component
-public class DiningOperationLogAspect {
-
-    @Before("@annotation(operationLog)")
-    public void before(JoinPoint joinPoint, OperationLog operationLog) {
-        log.info("操作日志: {}", operationLog.value());
-    }
-}

+ 0 - 48
alien-store/src/main/java/shop/alien/store/controller/DiningCollectController.java

@@ -1,48 +0,0 @@
-package shop.alien.store.controller;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiOperationSupport;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiSort;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
-import shop.alien.entity.result.R;
-import shop.alien.entity.store.LifeCollect;
-import shop.alien.store.service.DiningCollectService;
-
-/**
- * 点餐模块-收藏控制器(Feign 调 store,供小程序使用)
- *
- * @author ssk
- * @version 1.0
- * @date 2025/01/XX
- */
-@Slf4j
-@Api(tags = {"微信点餐-收藏(用户端)"})
-@ApiSort(4)
-@CrossOrigin
-@RestController
-@RequestMapping("/dining/collect")
-@RequiredArgsConstructor
-public class DiningCollectController {
-
-    private final DiningCollectService diningCollectService;
-
-    /**
-     * 添加收藏
-     */
-    @ApiOperation(value = "添加收藏", notes = "添加收藏,支持收藏店铺、商品等")
-    @ApiOperationSupport(order = 1)
-    @PostMapping("/addCollect")
-    public R<Boolean> addCollect(@ApiParam(value = "收藏对象", required = true) @RequestBody LifeCollect lifeCollect) {
-        log.info("DiningCollectController.addCollect?lifeCollect={}", lifeCollect);
-        try {
-            return diningCollectService.addCollect(lifeCollect);
-        } catch (Exception e) {
-            log.error("添加收藏失败: {}", e.getMessage(), e);
-            return R.fail("添加收藏失败: " + e.getMessage());
-        }
-    }
-}

+ 0 - 307
alien-store/src/main/java/shop/alien/store/controller/DiningController.java

@@ -1,307 +0,0 @@
-package shop.alien.store.controller;
-
-import io.swagger.annotations.*;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.*;
-import shop.alien.entity.result.R;
-import shop.alien.entity.store.vo.TableDiningStatusVO;
-import shop.alien.entity.store.vo.*;
-import shop.alien.store.service.DiningService;
-import shop.alien.store.util.TokenUtil;
-
-import java.util.List;
-
-/**
- * 点餐控制器
- *
- * @author system
- * @since 2025-01-XX
- */
-@Slf4j
-@Api(tags = {"小程序-点餐管理"})
-@CrossOrigin
-@RestController
-@RequestMapping("/store/dining")
-@RequiredArgsConstructor
-public class DiningController {
-
-    private final DiningService diningService;
-
-    @ApiOperation(value = "查询餐桌是否处于就餐中", notes = "免登录可调用,用于前端判断是否跳过选择用餐人数。就餐中(status=1)、加餐(status=3) 均视为就餐状态,且 diner_count 有值 时 inDining=true")
-    @GetMapping("/table-dining-status")
-    public R<TableDiningStatusVO> getTableDiningStatus(
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
-        log.info("DiningController.getTableDiningStatus?tableId={}", tableId);
-        try {
-            TableDiningStatusVO vo = diningService.getTableDiningStatus(tableId);
-            return R.data(vo);
-        } catch (Exception e) {
-            log.error("查询餐桌就餐状态失败: {}", e.getMessage(), e);
-            return R.fail("查询餐桌就餐状态失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "获取点餐页面信息", notes = "首客选桌时传就餐人数,餐桌置为就餐中并保存人数;后续用户选同一桌可不传就餐人数,将使用表中已保存人数")
-    @GetMapping("/page-info")
-    public R<DiningPageInfoVO> getDiningPageInfo(
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
-            @ApiParam(value = "就餐人数(首客必传;餐桌已就餐中时可省略,将使用已保存人数)") @RequestParam(required = false) Integer dinerCount) {
-        log.info("DiningController.getDiningPageInfo?tableId={}, dinerCount={}", tableId, dinerCount);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            DiningPageInfoVO vo = diningService.getDiningPageInfo(tableId, dinerCount);
-            return R.data(vo);
-        } catch (Exception e) {
-            log.error("获取点餐页面信息失败: {}", e.getMessage(), e);
-            return R.fail("获取点餐页面信息失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "搜索菜品", notes = "模糊搜索菜品,关键词限10字")
-    @GetMapping("/search")
-    public R<List<CuisineListVO>> searchCuisines(
-            @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId,
-            @ApiParam(value = "搜索关键词", required = false) @RequestParam(required = false) String keyword,
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
-        log.info("DiningController.searchCuisines?storeId={}, keyword={}, tableId={}", storeId, keyword, tableId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            // 限制关键词长度
-            if (StringUtils.hasText(keyword) && keyword.length() > 10) {
-                keyword = keyword.substring(0, 10);
-            }
-            List<CuisineListVO> list = diningService.searchCuisines(storeId, keyword, tableId);
-            return R.data(list);
-        } catch (Exception e) {
-            log.error("搜索菜品失败: {}", e.getMessage(), e);
-            return R.fail("搜索菜品失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "根据分类获取菜品列表", notes = "分页获取菜品列表,默认每页12条")
-    @GetMapping("/cuisines")
-    public R<List<CuisineListVO>> getCuisinesByCategory(
-            @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId,
-            @ApiParam(value = "分类ID", required = false) @RequestParam(required = false) Integer categoryId,
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
-            @ApiParam(value = "页码", required = false) @RequestParam(defaultValue = "1") Integer page,
-            @ApiParam(value = "每页数量", required = false) @RequestParam(defaultValue = "12") Integer size) {
-        log.info("DiningController.getCuisinesByCategory?storeId={}, categoryId={}, tableId={}, page={}, size={}", storeId, categoryId, tableId, page, size);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            List<CuisineListVO> list = diningService.getCuisinesByCategory(storeId, categoryId, tableId, page, size);
-            return R.data(list);
-        } catch (Exception e) {
-            log.error("获取菜品列表失败: {}", e.getMessage(), e);
-            return R.fail("获取菜品列表失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "获取菜品详情", notes = "获取菜品详细信息,包含图片列表、月售数量等")
-    @GetMapping("/cuisine/{cuisineId}")
-    public R<CuisineDetailVO> getCuisineDetail(
-            @ApiParam(value = "菜品ID", required = true) @PathVariable Integer cuisineId,
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
-        log.info("DiningController.getCuisineDetail?cuisineId={}, tableId={}", cuisineId, tableId);
-        try {
-            CuisineDetailVO vo = diningService.getCuisineDetail(cuisineId, tableId);
-            
-            return R.data(vo);
-        } catch (Exception e) {
-            log.error("获取菜品详情失败: {}", e.getMessage(), e);
-            return R.fail("获取菜品详情失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "获取可领取的优惠券列表", notes = "获取用户可领取的优惠券")
-    @GetMapping("/coupons/available")
-    public R<List<AvailableCouponVO>> getAvailableCoupons(
-            @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId) {
-        log.info("DiningController.getAvailableCoupons?storeId={}", storeId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            List<AvailableCouponVO> list = diningService.getAvailableCoupons(storeId, userId);
-            return R.data(list);
-        } catch (Exception e) {
-            log.error("获取可领取优惠券列表失败: {}", e.getMessage(), e);
-            return R.fail("获取可领取优惠券列表失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "领取优惠券", notes = "用户领取优惠券")
-    @PostMapping("/coupon/receive")
-    public R<Boolean> receiveCoupon(
-            @ApiParam(value = "优惠券ID", required = true) @RequestParam Integer couponId) {
-        log.info("DiningController.receiveCoupon?couponId={}", couponId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            boolean result = diningService.receiveCoupon(couponId, userId);
-            return R.data(result);
-        } catch (Exception e) {
-            log.error("领取优惠券失败: {}", e.getMessage(), e);
-            return R.fail("领取优惠券失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "获取订单确认页面信息", notes = "获取订单确认页面的所有信息")
-    @GetMapping("/order/confirm")
-    public R<OrderConfirmVO> getOrderConfirmInfo(
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
-            @ApiParam(value = "就餐人数", required = true) @RequestParam Integer dinerCount) {
-        log.info("DiningController.getOrderConfirmInfo?tableId={}, dinerCount={}", tableId, dinerCount);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            OrderConfirmVO vo = diningService.getOrderConfirmInfo(tableId, dinerCount, userId);
-            return R.data(vo);
-        } catch (Exception e) {
-            log.error("获取订单确认页面信息失败: {}", e.getMessage(), e);
-            return R.fail("获取订单确认页面信息失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "锁定订单", notes = "锁定订单,防止多人同时下单")
-    @PostMapping("/order/lock")
-    public R<Boolean> lockOrder(
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
-        log.info("DiningController.lockOrder?tableId={}", tableId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            boolean result = diningService.lockOrder(tableId, userId);
-            if (!result) {
-                return R.fail("订单已被其他用户锁定,无法下单");
-            }
-            return R.data(true);
-        } catch (Exception e) {
-            log.error("锁定订单失败: {}", e.getMessage(), e);
-            return R.fail("锁定订单失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "解锁订单", notes = "解锁订单")
-    @PostMapping("/order/unlock")
-    public R<Boolean> unlockOrder(
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
-        log.info("DiningController.unlockOrder?tableId={}", tableId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            diningService.unlockOrder(tableId, userId);
-            return R.data(true);
-        } catch (Exception e) {
-            log.error("解锁订单失败: {}", e.getMessage(), e);
-            return R.fail("解锁订单失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "检查订单锁定状态", notes = "检查订单是否被锁定")
-    @GetMapping("/order/check-lock")
-    public R<Integer> checkOrderLock(
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
-        log.info("DiningController.checkOrderLock?tableId={}", tableId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            Integer lockUserId = diningService.checkOrderLock(tableId);
-            return R.data(lockUserId);
-        } catch (Exception e) {
-            log.error("检查订单锁定状态失败: {}", e.getMessage(), e);
-            return R.fail("检查订单锁定状态失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "获取订单结算确认页面信息", notes = "获取订单结算确认页面的所有信息")
-    @GetMapping("/order/settlement")
-    public R<shop.alien.entity.store.vo.OrderSettlementVO> getOrderSettlementInfo(
-            @ApiParam(value = "订单ID", required = true) @RequestParam Integer orderId) {
-        log.info("DiningController.getOrderSettlementInfo?orderId={}", orderId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            shop.alien.entity.store.vo.OrderSettlementVO vo = diningService.getOrderSettlementInfo(orderId, userId);
-            return R.data(vo);
-        } catch (Exception e) {
-            log.error("获取订单结算确认页面信息失败: {}", e.getMessage(), e);
-            return R.fail("获取订单结算确认页面信息失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "锁定订单结算", notes = "锁定订单结算,防止多人同时结算")
-    @PostMapping("/order/settlement/lock")
-    public R<Boolean> lockSettlement(
-            @ApiParam(value = "订单ID", required = true) @RequestParam Integer orderId) {
-        log.info("DiningController.lockSettlement?orderId={}", orderId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            boolean result = diningService.lockSettlement(orderId, userId);
-            if (!result) {
-                return R.fail("订单已被其他用户锁定,无法结算");
-            }
-            return R.data(true);
-        } catch (Exception e) {
-            log.error("锁定订单结算失败: {}", e.getMessage(), e);
-            return R.fail("锁定订单结算失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "解锁订单结算", notes = "解锁订单结算")
-    @PostMapping("/order/settlement/unlock")
-    public R<Boolean> unlockSettlement(
-            @ApiParam(value = "订单ID", required = true) @RequestParam Integer orderId) {
-        log.info("DiningController.unlockSettlement?orderId={}", orderId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            diningService.unlockSettlement(orderId, userId);
-            return R.data(true);
-        } catch (Exception e) {
-            log.error("解锁订单结算失败: {}", e.getMessage(), e);
-            return R.fail("解锁订单结算失败: " + e.getMessage());
-        }
-    }
-}

+ 0 - 188
alien-store/src/main/java/shop/alien/store/controller/DiningCouponController.java

@@ -1,188 +0,0 @@
-package shop.alien.store.controller;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiOperationSupport;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiSort;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
-import shop.alien.entity.result.R;
-import shop.alien.entity.store.vo.LifeDiscountCouponVo;
-import shop.alien.store.service.DiningCouponService;
-
-import javax.servlet.http.HttpServletRequest;
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 点餐模块-优惠券控制器(Feign 调 store,供小程序:我的优惠券/详情/选券)
- *
- * @author ssk
- * @version 1.0
- * @date 2025/1/29
- */
-@Slf4j
-@Api(tags = {"微信点餐-优惠券(用户端)"})
-@ApiSort(3)
-@CrossOrigin
-@RestController
-@RequestMapping({"/dining/coupon"})
-@RequiredArgsConstructor
-public class DiningCouponController {
-
-    private final DiningCouponService diningCouponService;
-
-    /**
-     * 获取该用户所有的优惠券列表
-     */
-    @ApiOperation("获取该用户所有的优惠券列表。couponType=1仅满减券,couponType=2仅折扣券,不传返回全部优惠券")
-    @ApiOperationSupport(order = 9)
-    @GetMapping("/getUserCouponList")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "page", value = "分页页数", dataType = "Integer", paramType = "query", required = false),
-            @ApiImplicitParam(name = "size", value = "分页条数", dataType = "Integer", paramType = "query", required = false),
-            @ApiImplicitParam(name = "tabType", value = "分页类型(0:全部(未使用),1:即将过期,2:已使用,3:已过期)", dataType = "String", paramType = "query", required = true),
-            @ApiImplicitParam(name = "type", value = "券类型(不传:优惠券+代金券都返回,1:仅优惠券查 life_discount_coupon,4:仅代金券查 life_coupon)", dataType = "Integer", paramType = "query", required = false),
-            @ApiImplicitParam(name = "couponType", value = "优惠券类型:1=仅满减券,2=仅折扣券,不传=全部优惠券(可选,仅当type不为4时有效)", dataType = "Integer", paramType = "query", required = false),
-            @ApiImplicitParam(name = "storeId", value = "商铺ID,可为空,传则仅返回该商铺的优惠券", dataType = "String", paramType = "query", required = false),
-            @ApiImplicitParam(name = "storeName", value = "商铺名称模糊查询,可为空", dataType = "String", paramType = "query", required = false)
-    })
-    public R<List<LifeDiscountCouponVo>> getUserCouponList(
-            HttpServletRequest request,
-            @RequestParam(value = "page", defaultValue = "1") int page,
-            @RequestParam(value = "size", defaultValue = "10") int size,
-            @RequestParam("tabType") String tabType,
-            @RequestParam(value = "type", required = false) Integer type,
-            @RequestParam(value = "couponType", required = false) Integer couponType,
-            @RequestParam(value = "storeId", required = false) String storeId,
-            @RequestParam(value = "storeName", required = false) String storeName) {
-        log.info("DiningCouponController.getUserCouponList?page={}, size={}, tabType={}, type={}, couponType={}, storeId={}, storeName={}", page, size, tabType, type, couponType, storeId, storeName);
-        String authorization = request.getHeader("Authorization");
-        return diningCouponService.getUserCouponList(authorization, page, size, tabType, type, couponType, storeId, storeName);
-    }
-
-    /**
-     * 根据优惠券 id 获取优惠券详情(规则、门槛等)
-     */
-    @ApiOperation(value = "获取优惠券详情", notes = "需登录,请求头带 Authorization。counponId 与 store 接口拼写一致")
-    @GetMapping("/detail")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "counponId", value = "优惠券id", dataType = "String", paramType = "query", required = true)
-    })
-    public R<LifeDiscountCouponVo> getCounponDetailById(
-            HttpServletRequest request,
-            @RequestParam("counponId") String counponId) {
-        log.info("DiningCouponController.getCounponDetailById?counponId={}", counponId);
-        String authorization = request.getHeader("Authorization");
-        return diningCouponService.getCounponDetailById(authorization, counponId);
-    }
-
-    /**
-     * 获取该门店下用户可用/不可用优惠券列表(用于购物车/下单选券,按金额区分)
-     */
-    @ApiOperation(value = "获取门店可用优惠券列表", notes = "需登录。按 storeId+amount 返回可用券与不可用券及原因(满减门槛等)。couponType=1仅满减券,couponType=2仅折扣券,不传返回全部优惠券")
-    @GetMapping("/storeUsableList")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "String", paramType = "query", required = true),
-            @ApiImplicitParam(name = "amount", value = "当前消费金额(满减门槛)", dataType = "BigDecimal", paramType = "query", required = true),
-            @ApiImplicitParam(name = "couponType", value = "优惠券类型:1=仅满减券,2=仅折扣券,不传=全部优惠券(可选)", dataType = "Integer", paramType = "query", required = false)
-    })
-    public R<Map<String, Object>> getStoreUserUsableCouponList(
-            HttpServletRequest request,
-            @RequestParam("storeId") String storeId,
-            @RequestParam("amount") BigDecimal amount,
-            @ApiParam(value = "优惠券类型:1=仅满减券,2=仅折扣券,不传=全部优惠券") @RequestParam(value = "couponType", required = false) Integer couponType) {
-        log.info("DiningCouponController.getStoreUserUsableCouponList?storeId={}, amount={}, couponType={}", storeId, amount, couponType);
-        String authorization = request.getHeader("Authorization");
-        return diningCouponService.getStoreUserUsableCouponList(authorization, storeId, amount, couponType);
-    }
-
-    /**
-     * 查询用户拥有的优惠券(按符合支付条件优先,其次优惠力度大的优先)
-     */
-    @ApiOperation(value = "查询用户拥有的优惠券", notes = "需登录。查询用户拥有的优惠券,排序:符合支付条件的优先,其次优惠力度大的优先")
-    @GetMapping("/userOwned")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "storeId", value = "门店ID(可选,如果提供则只查询该门店的优惠券)", dataType = "String", paramType = "query", required = false),
-            @ApiImplicitParam(name = "amount", value = "当前消费金额(用于判断是否符合支付条件)", dataType = "BigDecimal", paramType = "query", required = false)
-    })
-    public R<List<LifeDiscountCouponVo>> getUserOwnedCoupons(
-            @ApiParam(value = "门店ID(可选)") @RequestParam(required = false) String storeId,
-            @ApiParam(value = "当前消费金额(可选,用于判断是否符合支付条件)") @RequestParam(required = false) BigDecimal amount) {
-        log.info("DiningCouponController.getUserOwnedCoupons?storeId={}, amount={}", storeId, amount);
-        return diningCouponService.getUserOwnedCoupons(storeId, amount);
-    }
-
-    /**
-     * 获取该用户该店铺优惠券列表
-     */
-    @ApiOperation(value = "获取该用户该店铺优惠券列表", notes = "需登录,请求头带 Authorization。couponType=1仅满减券,couponType=2仅折扣券,不传返回全部优惠券")
-    @ApiOperationSupport(order = 7)
-    @GetMapping("/getStoreUserCouponList")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "storeId", value = "商户id", dataType = "String", paramType = "query", required = true),
-            @ApiImplicitParam(name = "couponType", value = "优惠券类型:1=仅满减券,2=仅折扣券,不传=全部优惠券(可选)", dataType = "Integer", paramType = "query", required = false)
-    })
-    public R<List<LifeDiscountCouponVo>> getStoreUserCouponList(
-            HttpServletRequest request,
-            @ApiParam(value = "商户id", required = true) @RequestParam("storeId") String storeId,
-            @ApiParam(value = "优惠券类型:1=仅满减券,2=仅折扣券,不传=全部优惠券") @RequestParam(value = "couponType", required = false) Integer couponType) {
-        log.info("DiningCouponController.getStoreUserCouponList?storeId={}, couponType={}", storeId, couponType);
-        String authorization = request.getHeader("Authorization");
-        return diningCouponService.getStoreUserCouponList(authorization, storeId, couponType);
-    }
-
-    /**
-     * 查询用户目前所拥有的优惠券(可通过商铺ID进行查询)
-     */
-    @ApiOperation(value = "查询用户目前所拥有的优惠券", notes = "需登录。查询用户目前所拥有的优惠券(未使用且未过期),可通过商铺ID进行筛选。couponType=1仅满减券,couponType=2仅折扣券,不传返回全部优惠券")
-    @ApiOperationSupport(order = 8)
-    @GetMapping("/userOwnedByStore")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "storeId", value = "商铺ID(可选,如果提供则只查询该商铺的优惠券)", dataType = "String", paramType = "query", required = false),
-            @ApiImplicitParam(name = "couponType", value = "优惠券类型:1=仅满减券,2=仅折扣券,不传=全部优惠券(可选)", dataType = "Integer", paramType = "query", required = false)
-    })
-    public R<List<LifeDiscountCouponVo>> getUserOwnedCouponsByStore(
-            @ApiParam(value = "商铺ID(可选)") @RequestParam(required = false) String storeId,
-            @ApiParam(value = "优惠券类型:1=仅满减券,2=仅折扣券,不传=全部优惠券") @RequestParam(value = "couponType", required = false) Integer couponType) {
-        log.info("DiningCouponController.getUserOwnedCouponsByStore?storeId={}, couponType={}", storeId, couponType);
-        return diningCouponService.getUserOwnedCouponsByStore(storeId, couponType);
-    }
-
-    /**
-     * 获取该店铺所有优惠券(分页), 好友优惠券
-     */
-    @ApiOperation(value = "获取该店铺所有优惠券(分页)", notes = "需登录,请求头带 Authorization。couponType=1仅满减券,couponType=2仅折扣券,不传返回全部优惠券。tab: 0:全部,1:进行中,2:已结束,3:草稿,4:未开始,5:已下架,6:已清库")
-    @ApiOperationSupport(order = 10)
-    @GetMapping("/getStoreAllCouponList")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "page", value = "页码", dataType = "int", paramType = "query", required = false),
-            @ApiImplicitParam(name = "size", value = "每页条数", dataType = "int", paramType = "query", required = false),
-            @ApiImplicitParam(name = "storeId", value = "商户id", dataType = "String", paramType = "query", required = true),
-            @ApiImplicitParam(name = "couponName", value = "优惠券名称", dataType = "String", paramType = "query", required = false),
-            @ApiImplicitParam(name = "tab", value = "分页类型(0:全部,1:进行中,2:已结束,3:草稿,4:未开始,5:已下架,6:已清库)", dataType = "String", paramType = "query", required = true),
-            @ApiImplicitParam(name = "couponsFromType", value = "查询类型(1:我的优惠券,2:好友的优惠券)", dataType = "int", paramType = "query", required = false),
-            @ApiImplicitParam(name = "couponStatus", value = "优惠券状态(0:草稿,1:正式)", dataType = "int", paramType = "query", required = false),
-            @ApiImplicitParam(name = "couponType", value = "优惠券类型:1=仅满减券,2=仅折扣券,不传=全部优惠券(可选)", dataType = "Integer", paramType = "query", required = false)
-    })
-    public R<IPage<LifeDiscountCouponVo>> getStoreAllCouponList(
-            HttpServletRequest request,
-            @ApiParam(value = "页码", defaultValue = "1") @RequestParam(value = "page", defaultValue = "1") int page,
-            @ApiParam(value = "每页条数", defaultValue = "10") @RequestParam(value = "size", defaultValue = "10") int size,
-            @ApiParam(value = "商户id", required = true) @RequestParam("storeId") String storeId,
-            @ApiParam(value = "优惠券名称") @RequestParam(value = "couponName", required = false) String couponName,
-            @ApiParam(value = "分页类型(0:全部,1:进行中,2:已结束,3:草稿,4:未开始,5:已下架,6:已清库)", required = true) @RequestParam("tab") String tab,
-            @ApiParam(value = "查询类型(1:我的优惠券,2:好友的优惠券)", defaultValue = "1") @RequestParam(value = "couponsFromType", defaultValue = "1") int couponsFromType,
-            @ApiParam(value = "优惠券状态(0:草稿,1:正式)", defaultValue = "1") @RequestParam(value = "couponStatus", defaultValue = "1", required = false) int couponStatus,
-            @ApiParam(value = "优惠券类型:1=仅满减券,2=仅折扣券,不传=全部优惠券") @RequestParam(value = "couponType", required = false) Integer couponType) {
-        log.info("DiningCouponController.getStoreAllCouponList?page={}, size={}, storeId={}, couponName={}, tab={}, couponsFromType={}, couponStatus={}, couponType={}", page, size, storeId, couponName, tab, couponsFromType, couponStatus, couponType);
-        String authorization = request.getHeader("Authorization");
-        return diningCouponService.getStoreAllCouponList(authorization, page, size, storeId, couponName, tab, couponsFromType, couponStatus, couponType);
-    }
-}

+ 0 - 60
alien-store/src/main/java/shop/alien/store/controller/DiningFileUploadController.java

@@ -1,60 +0,0 @@
-package shop.alien.store.controller;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiOperationSupport;
-import io.swagger.annotations.ApiSort;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-import shop.alien.entity.result.R;
-import shop.alien.store.feign.AlienStoreFeign;
-
-/**
- * 点餐模块-文件上传控制器
- *
- * @author ssk
- * @version 1.0
- * @date 2025/01/XX
- */
-@Slf4j
-@Api(tags = {"小程序-文件上传"})
-@ApiSort(10)
-@CrossOrigin
-@RestController
-@RequestMapping("/dining/file")
-@RequiredArgsConstructor
-public class DiningFileUploadController {
-
-    private final AlienStoreFeign alienStoreFeign;
-
-    /**
-     * 上传图片到OSS(单个文件上传,支持图片、视频或PDF)
-     *
-     * @param file 文件对象
-     * @return R.data 为文件路径(String)
-     */
-    @ApiOperation(value = "上传图片到OSS", notes = "支持图片、视频或PDF文件上传,返回OSS文件路径")
-    @ApiOperationSupport(order = 1)
-    @PostMapping("/upload")
-    public R<String> upload(@RequestParam("file") MultipartFile file) {
-        log.info("DiningFileUploadController.upload?fileName={}", file != null ? file.getOriginalFilename() : null);
-        try {
-            if (file == null || file.isEmpty()) {
-                return R.fail("文件不能为空");
-            }
-            R<String> result = alienStoreFeign.uploadFile(file);
-            if (result.isSuccess()) {
-                log.info("文件上传成功,OSS路径:{}", result.getData());
-                return result;
-            } else {
-                log.error("文件上传失败:{}", result.getMsg());
-                return R.fail("文件上传失败:" + result.getMsg());
-            }
-        } catch (Exception e) {
-            log.error("文件上传异常:{}", e.getMessage(), e);
-            return R.fail("文件上传异常:" + e.getMessage());
-        }
-    }
-}

+ 57 - 59
alien-store/src/main/java/shop/alien/store/controller/DiningServiceController.java

@@ -9,19 +9,22 @@ import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import shop.alien.entity.result.R;
-import shop.alien.entity.store.StoreOrder;
 import shop.alien.entity.store.StoreTable;
 import shop.alien.entity.store.dto.CartDTO;
 import shop.alien.entity.store.dto.ChangeTableDTO;
 import shop.alien.entity.store.vo.*;
-import shop.alien.store.service.StoreOrderService;
-import shop.alien.store.util.TokenUtil;
+import shop.alien.store.feign.DiningServiceFeign;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
 /**
- * APP 点餐聚合接口(原通过 Feign 调用 alien-dining,现与本模块 controller/service 同目录)。
+ * 点餐服务 Controller
+ * 供前端调用 alien-dining 模块的接口
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2025/01/XX
  */
 @Slf4j
 @Api(tags = {"点餐服务接口"})
@@ -32,13 +35,11 @@ import java.util.List;
 @RequiredArgsConstructor
 public class DiningServiceController {
 
-    private final DiningController diningController;
-    private final StoreOrderController storeOrderController;
-    private final StoreInfoController storeInfoController;
-    private final DiningUserController diningUserController;
-    private final DiningFileUploadController diningFileUploadController;
-    private final StoreOrderService storeOrderService;
+    private final DiningServiceFeign diningServiceFeign;
 
+    /**
+     * 从请求头获取 Authorization token
+     */
     private String getAuthorization(HttpServletRequest request) {
         String authorization = request.getHeader("Authorization");
         if (authorization == null || authorization.isEmpty()) {
@@ -47,6 +48,8 @@ public class DiningServiceController {
         return authorization;
     }
 
+    // ==================== 点餐相关接口 ====================
+
     @ApiOperation(value = "查询餐桌是否处于就餐中", notes = "免登录可调用,返回 inDining、dinerCount,供前端判断是否跳过选择用餐人数")
     @ApiOperationSupport(order = 0)
     @GetMapping("/table-dining-status")
@@ -54,7 +57,7 @@ public class DiningServiceController {
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
         try {
             log.info("查询餐桌就餐状态: tableId={}", tableId);
-            return diningController.getTableDiningStatus(tableId);
+            return diningServiceFeign.getTableDiningStatus(tableId);
         } catch (Exception e) {
             log.error("查询餐桌就餐状态失败: {}", e.getMessage(), e);
             return R.fail("查询餐桌就餐状态失败: " + e.getMessage());
@@ -69,9 +72,9 @@ public class DiningServiceController {
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
             @ApiParam(value = "就餐人数(首客必传;餐桌已就餐中时可省略)") @RequestParam(required = false) Integer dinerCount) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("获取点餐页面信息: tableId={}, dinerCount={}", tableId, dinerCount);
-            return diningController.getDiningPageInfo(tableId, dinerCount);
+            return diningServiceFeign.getDiningPageInfo(authorization, tableId, dinerCount);
         } catch (Exception e) {
             log.error("获取点餐页面信息失败: {}", e.getMessage(), e);
             return R.fail("获取点餐页面信息失败: " + e.getMessage());
@@ -87,9 +90,9 @@ public class DiningServiceController {
             @ApiParam(value = "搜索关键词", required = true) @RequestParam String keyword,
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("搜索菜品: storeId={}, keyword={}, tableId={}", storeId, keyword, tableId);
-            return diningController.searchCuisines(storeId, keyword, tableId);
+            return diningServiceFeign.searchCuisines(authorization, storeId, keyword, tableId);
         } catch (Exception e) {
             log.error("搜索菜品失败: {}", e.getMessage(), e);
             return R.fail("搜索菜品失败: " + e.getMessage());
@@ -104,13 +107,13 @@ public class DiningServiceController {
             @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId,
             @ApiParam(value = "分类ID(可为空,查询所有)") @RequestParam(required = false) Integer categoryId,
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
-            @ApiParam(value = "页码", defaultValue = "1") @RequestParam(defaultValue = "1") Integer pageParam,
-            @ApiParam(value = "每页数量", defaultValue = "12") @RequestParam(defaultValue = "12") Integer sizeParam) {
+            @ApiParam(value = "页码", defaultValue = "1") @RequestParam(defaultValue = "1") Integer page,
+            @ApiParam(value = "每页数量", defaultValue = "12") @RequestParam(defaultValue = "12") Integer size) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("根据分类获取菜品列表: storeId={}, categoryId={}, tableId={}, page={}, size={}",
-                    storeId, categoryId, tableId, pageParam, sizeParam);
-            return diningController.getCuisinesByCategory(storeId, categoryId, tableId, pageParam, sizeParam);
+                    storeId, categoryId, tableId, page, size);
+            return diningServiceFeign.getCuisinesByCategory(authorization, storeId, categoryId, tableId, page, size);
         } catch (Exception e) {
             log.error("根据分类获取菜品列表失败: {}", e.getMessage(), e);
             return R.fail("根据分类获取菜品列表失败: " + e.getMessage());
@@ -125,9 +128,9 @@ public class DiningServiceController {
             @ApiParam(value = "菜品ID", required = true) @PathVariable Integer cuisineId,
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("获取菜品详情: cuisineId={}, tableId={}", cuisineId, tableId);
-            return diningController.getCuisineDetail(cuisineId, tableId);
+            return diningServiceFeign.getCuisineDetail(authorization, cuisineId, tableId);
         } catch (Exception e) {
             log.error("获取菜品详情失败: {}", e.getMessage(), e);
             return R.fail("获取菜品详情失败: " + e.getMessage());
@@ -141,15 +144,17 @@ public class DiningServiceController {
             HttpServletRequest request,
             @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("获取可领取的优惠券列表: storeId={}", storeId);
-            return diningController.getAvailableCoupons(storeId);
+            return diningServiceFeign.getAvailableCoupons(authorization, storeId);
         } catch (Exception e) {
             log.error("获取可领取的优惠券列表失败: {}", e.getMessage(), e);
             return R.fail("获取可领取的优惠券列表失败: " + e.getMessage());
         }
     }
 
+    // ==================== 订单相关接口 ====================
+
     @ApiOperation(value = "获取购物车", notes = "根据桌号ID获取购物车信息")
     @ApiOperationSupport(order = 6)
     @GetMapping("/order/cart/{tableId}")
@@ -157,9 +162,9 @@ public class DiningServiceController {
             HttpServletRequest request,
             @ApiParam(value = "桌号ID", required = true) @PathVariable Integer tableId) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("获取购物车: tableId={}", tableId);
-            return storeOrderController.getCart(tableId);
+            return diningServiceFeign.getCart(authorization, tableId);
         } catch (Exception e) {
             log.error("获取购物车失败: {}", e.getMessage(), e);
             return R.fail("获取购物车失败: " + e.getMessage());
@@ -173,9 +178,9 @@ public class DiningServiceController {
             HttpServletRequest request,
             @ApiParam(value = "换桌参数(原桌号ID、目标桌号ID、换桌原因)", required = true) @RequestBody ChangeTableDTO dto) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("换桌: fromTableId={}, toTableId={}, changeReason={}", dto.getFromTableId(), dto.getToTableId(), dto.getChangeReason());
-            return storeOrderController.changeTable(dto);
+            return diningServiceFeign.changeTable(authorization, dto);
         } catch (Exception e) {
             log.error("换桌失败: {}", e.getMessage(), e);
             return R.fail("换桌失败: " + e.getMessage());
@@ -189,9 +194,9 @@ public class DiningServiceController {
             HttpServletRequest request,
             @ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("获取订单详情: orderId={}", orderId);
-            return storeOrderController.getOrderDetail(orderId);
+            return diningServiceFeign.getOrderDetail(authorization, orderId);
         } catch (Exception e) {
             log.error("获取订单详情失败: {}", e.getMessage(), e);
             return R.fail("获取订单详情失败: " + e.getMessage());
@@ -207,15 +212,9 @@ public class DiningServiceController {
             @ApiParam(value = "每页数量", defaultValue = "10") @RequestParam(defaultValue = "10") Integer size,
             @ApiParam(value = "订单状态(可选)") @RequestParam(required = false) Integer status) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("获取订单列表: page={}, size={}, status={}", page, size, status);
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            Page<StoreOrder> p = new Page<>(page, size);
-            IPage<StoreOrderPageVO> data = storeOrderService.getOrderPageWithCuisines(p, null, null, status, null);
-            return R.data(data);
+            return diningServiceFeign.getOrderList(authorization, page, size, status);
         } catch (Exception e) {
             log.error("获取订单列表失败: {}", e.getMessage(), e);
             return R.fail("获取订单列表失败: " + e.getMessage());
@@ -234,10 +233,12 @@ public class DiningServiceController {
             @ApiParam(value = "订单状态(0:待支付, 1:已支付, 2:已取消, 3:已完成)") @RequestParam(required = false) Integer orderStatus,
             @ApiParam(value = "搜索关键词(订单编号或菜品名称,限15字)") @RequestParam(required = false) String keyword) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("分页查询订单列表: current={}, size={}, storeId={}, tableId={}, orderStatus={}, keyword={}",
                     current, size, storeId, tableId, orderStatus, keyword);
-            return storeOrderController.getOrderPage(current, size, storeId, tableId, orderStatus, keyword);
+            R<Page<StoreOrderPageVO>> result = diningServiceFeign.getOrderPage(authorization, current, size, storeId, tableId, orderStatus, keyword);
+            // 将 Page 转换为 IPage 返回(Page 实现了 IPage 接口,可以直接返回)
+            return R.data(result.getData());
         } catch (Exception e) {
             log.error("分页查询订单列表失败: {}", e.getMessage(), e);
             return R.fail("分页查询订单列表失败: " + e.getMessage());
@@ -251,9 +252,9 @@ public class DiningServiceController {
             HttpServletRequest request,
             @ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("查询订单变更记录: orderId={}", orderId);
-            return storeOrderController.getOrderChangeLogs(orderId);
+            return diningServiceFeign.getOrderChangeLogs(authorization, orderId);
         } catch (Exception e) {
             log.error("查询订单变更记录失败: {}", e.getMessage(), e);
             return R.fail("查询订单变更记录失败: " + e.getMessage());
@@ -267,38 +268,33 @@ public class DiningServiceController {
             HttpServletRequest request,
             @ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("商家手动完成订单: orderId={}", orderId);
-            return storeOrderController.completeOrderByMerchant(orderId);
+            return diningServiceFeign.completeOrderByMerchant(authorization, orderId);
         } catch (Exception e) {
             log.error("商家手动完成订单失败: {}", e.getMessage(), e);
             return R.fail("商家手动完成订单失败: " + e.getMessage());
         }
     }
 
+    // ==================== 用户相关接口 ====================
+
     @ApiOperation(value = "获取用户信息", notes = "获取当前登录用户的详细信息(从token中获取用户ID)")
     @ApiOperationSupport(order = 9)
     @GetMapping("/user/info")
     public R<Object> getUserInfo(HttpServletRequest request) {
         try {
-            getAuthorization(request);
+            String authorization = getAuthorization(request);
             log.info("获取用户信息");
-            R<?> inner = diningUserController.getUserInfo();
-            if (inner == null) {
-                return R.fail("获取用户信息失败");
-            }
-            if (!inner.isSuccess()) {
-                return R.fail(inner.getMsg());
-            }
-            @SuppressWarnings("unchecked")
-            R<Object> out = (R<Object>) (R<?>) inner;
-            return out;
+            return diningServiceFeign.getUserInfo(authorization);
         } catch (Exception e) {
             log.error("获取用户信息失败: {}", e.getMessage(), e);
             return R.fail("获取用户信息失败: " + e.getMessage());
         }
     }
 
+    // ==================== 门店信息接口 ====================
+
     @ApiOperation(value = "根据门店ID查询桌号列表", notes = "查询指定门店下的所有桌号")
     @ApiOperationSupport(order = 10)
     @GetMapping("/store/tables")
@@ -306,7 +302,7 @@ public class DiningServiceController {
             @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId) {
         try {
             log.info("根据门店ID查询桌号列表: storeId={}", storeId);
-            return storeInfoController.getTablesByStoreId(storeId);
+            return diningServiceFeign.getTablesByStoreId(storeId);
         } catch (Exception e) {
             log.error("根据门店ID查询桌号列表失败: {}", e.getMessage(), e);
             return R.fail("根据门店ID查询桌号列表失败: " + e.getMessage());
@@ -321,7 +317,7 @@ public class DiningServiceController {
             @ApiParam(value = "菜品名称模糊查询关键词(可选)") @RequestParam(required = false) String keyword) {
         try {
             log.info("根据门店ID查询菜品种类及菜品: storeId={}, keyword={}", storeId, keyword);
-            return storeInfoController.getCategoriesWithCuisinesByStoreId(storeId, keyword);
+            return diningServiceFeign.getCategoriesWithCuisinesByStoreId(storeId, keyword);
         } catch (Exception e) {
             log.error("查询菜品种类及菜品失败: {}", e.getMessage(), e);
             return R.fail("查询菜品种类及菜品失败: " + e.getMessage());
@@ -335,13 +331,15 @@ public class DiningServiceController {
             @ApiParam(value = "菜品种类ID", required = true) @PathVariable Integer categoryId) {
         try {
             log.info("删除菜品种类: categoryId={}", categoryId);
-            return storeInfoController.deleteCategory(categoryId);
+            return diningServiceFeign.deleteCategory(categoryId);
         } catch (Exception e) {
             log.error("删除菜品种类失败: {}", e.getMessage(), e);
             return R.fail("删除菜品种类失败: " + e.getMessage());
         }
     }
 
+    // ==================== 文件上传接口 ====================
+
     @ApiOperation(value = "上传图片到OSS", notes = "支持图片、视频或PDF文件上传,返回OSS文件路径")
     @ApiOperationSupport(order = 11)
     @PostMapping(value = "/file/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@@ -352,7 +350,7 @@ public class DiningServiceController {
                 return R.fail("文件不能为空");
             }
             log.info("上传文件: fileName={}, size={}", file.getOriginalFilename(), file.getSize());
-            return diningFileUploadController.upload(file);
+            return diningServiceFeign.uploadFile(file);
         } catch (Exception e) {
             log.error("上传文件失败: {}", e.getMessage(), e);
             return R.fail("上传文件失败: " + e.getMessage());

+ 0 - 188
alien-store/src/main/java/shop/alien/store/controller/DiningUserController.java

@@ -1,188 +0,0 @@
-package shop.alien.store.controller;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiSort;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
-import shop.alien.entity.result.R;
-import shop.alien.store.dto.ChangePhoneDto;
-import shop.alien.store.dto.UserProfileUpdateDto;
-import shop.alien.store.dto.VerifyTokenDto;
-import shop.alien.store.dto.WeChatLoginDto;
-import shop.alien.store.service.DiningUserService;
-import shop.alien.store.util.TokenUtil;
-import shop.alien.store.vo.DiningUserVo;
-import shop.alien.store.vo.TokenVerifyVo;
-import org.apache.commons.lang3.StringUtils;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
-
-/**
- * 点餐用户控制器
- *
- * @author ssk
- * @version 1.0
- * @date 2024/12/4
- */
-@Slf4j
-@Api(tags = {"微信点餐-登录(用户端)"})
-@ApiSort(2)
-@CrossOrigin
-@RestController
-@RequestMapping("/dining/user")
-@RequiredArgsConstructor
-public class DiningUserController {
-
-    private final DiningUserService diningUserService;
-
-    @ApiOperation(value = "微信小程序登录", notes = "标准流程:1. 前端调用 wx.login() 获取 code;2. 后端调用 jscode2session 获取 openid;3. 可选:通过 wx.getPhoneNumber() 获取 phoneCode 绑定手机号")
-    @PostMapping("/wechatLogin")
-    public R<DiningUserVo> wechatLogin(@Valid @RequestBody WeChatLoginDto loginDto, HttpServletRequest request) {
-        log.info("微信小程序登录: code={}, phoneCode={}",
-                loginDto.getCode(),
-                loginDto.getPhoneCode());
-
-        String macIp = getClientIp(request);
-        DiningUserVo userVo = diningUserService.wechatLogin(
-                loginDto.getCode(),
-                loginDto.getPhoneCode(),
-                macIp);
-        if (userVo == null) {
-            return R.fail("登录失败,请检查 code 是否有效(code 有效期5分钟,仅能使用一次)");
-        }
-        return R.data(userVo);
-    }
-
-    @ApiOperation(value = "获取用户信息", notes = "获取当前登录用户的详细信息(从token中获取用户ID)")
-    @GetMapping("/getUserInfo")
-    public R<DiningUserVo> getUserInfo() {
-        // 从 token 获取当前用户ID
-        Integer userId = TokenUtil.getCurrentUserId();
-        if (userId == null) {
-            return R.fail("用户未登录");
-        }
-
-        log.info("获取用户信息: userId={}", userId);
-
-        DiningUserVo userVo = diningUserService.getUserInfo(userId.longValue());
-        if (userVo == null) {
-            return R.fail("用户不存在或状态异常");
-        }
-        return R.data(userVo);
-    }
-
-    @ApiOperation(value = "更新用户个人信息", notes = "登录后完善资料,支持更新昵称、头像、性别、生日等(从token中获取用户ID)")
-    @PostMapping("/updateProfile")
-    public R<DiningUserVo> updateProfile(@Valid @RequestBody UserProfileUpdateDto dto) {
-        // 从 token 获取当前用户ID
-        Integer userId = TokenUtil.getCurrentUserId();
-        if (userId == null) {
-            return R.fail("用户未登录");
-        }
-
-        // 使用 token 中的用户ID,忽略 DTO 中的 userId(防止用户修改其他用户的信息)
-        dto.setUserId(userId.longValue());
-        log.info("更新用户个人信息: userId={}", userId);
-
-        DiningUserVo userVo = diningUserService.updateProfile(dto);
-        if (userVo == null) {
-            return R.fail("更新失败,用户不存在");
-        }
-        return R.data(userVo);
-    }
-
-    @ApiOperation(value = "更换手机号", notes = "校验验证码后更新 user_phone,成功后需重新登录(从token中获取用户ID)")
-    @PostMapping("/changePhone")
-    public R<DiningUserVo> changePhone(@Valid @RequestBody ChangePhoneDto dto) {
-        // 从 token 获取当前用户ID
-        Integer userId = TokenUtil.getCurrentUserId();
-        if (userId == null) {
-            return R.fail("用户未登录");
-        }
-
-        // 使用 token 中的用户ID,忽略 DTO 中的 userId(防止用户修改其他用户的手机号)
-        dto.setUserId(userId.longValue());
-        log.info("更换手机号: userId={}, newPhone={}", userId, dto.getNewPhone());
-
-        DiningUserVo userVo = diningUserService.changePhone(dto);
-        if (userVo == null) {
-            return R.fail("更换失败,请检查验证码或用户状态");
-        }
-        return R.data(userVo);
-    }
-
-    @ApiOperation(value = "校验Token", notes = "验证Token是否有效,支持从请求头Authorization或请求体获取Token")
-    @PostMapping("/verifyToken")
-    public R<TokenVerifyVo> verifyToken(@RequestBody(required = false) VerifyTokenDto dto, HttpServletRequest request) {
-        // 优先从请求体获取 token,如果没有则从请求头获取
-        String token = null;
-        if (dto != null && StringUtils.isNotBlank(dto.getToken())) {
-            token = dto.getToken();
-        } else {
-            // 从请求头获取
-            token = request.getHeader("Authorization");
-        }
-
-        if (StringUtils.isBlank(token)) {
-            return R.fail("Token 不能为空,请通过请求头 Authorization 或请求体传递");
-        }
-
-        log.info("校验Token: token={}", token.length() > 20 ? token.substring(0, 20) + "****" : token);
-
-        TokenVerifyVo verifyVo = diningUserService.verifyToken(token);
-        if (verifyVo == null) {
-            return R.fail("Token 校验失败");
-        }
-
-        if (verifyVo.getValid()) {
-            return R.data(verifyVo);
-        } else {
-            return R.fail(verifyVo.getReason() != null ? verifyVo.getReason() : "Token 无效");
-        }
-    }
-
-    @ApiOperation(value = "解析Token(调试用)", notes = "解析Token内容,用于调试,返回Token中的所有用户信息")
-    @PostMapping("/parseToken")
-    public R<com.alibaba.fastjson.JSONObject> parseToken(@RequestBody(required = false) VerifyTokenDto dto, HttpServletRequest request) {
-        // 优先从请求体获取 token,如果没有则从请求头获取
-        String token = null;
-        if (dto != null && StringUtils.isNotBlank(dto.getToken())) {
-            token = dto.getToken();
-        } else {
-            // 从请求头获取
-            token = request.getHeader("Authorization");
-        }
-
-        if (StringUtils.isBlank(token)) {
-            return R.fail("Token 不能为空");
-        }
-
-        log.info("DiningUserController.parseToken?token={}", token.length() > 20 ? token.substring(0, 20) + "****" : token);
-        com.alibaba.fastjson.JSONObject userInfo = shop.alien.store.util.TokenUtil.parseToken(token);
-        if (userInfo == null) {
-            return R.fail("Token 解析失败,请查看日志获取详细信息");
-        }
-
-        return R.data(userInfo);
-    }
-
-    /**
-     * 获取客户端IP地址
-     */
-    private String getClientIp(HttpServletRequest request) {
-        String ip = request.getHeader("X-Forwarded-For");
-        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
-            ip = request.getHeader("Proxy-Client-IP");
-        }
-        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
-            ip = request.getHeader("WL-Proxy-Client-IP");
-        }
-        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
-            ip = request.getRemoteAddr();
-        }
-        return ip;
-    }
-}

+ 38 - 4
alien-store/src/main/java/shop/alien/store/controller/PaymentController.java

@@ -10,10 +10,13 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import shop.alien.entity.result.R;
+import shop.alien.store.feign.DiningServiceFeign;
 import shop.alien.store.strategy.payment.PaymentStrategyFactory;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -30,18 +33,43 @@ import java.util.Map;
 public class PaymentController {
 
     private final PaymentStrategyFactory paymentStrategyFactory;
+    private final DiningServiceFeign diningServiceFeign;
 
+    private static String authHeader(HttpServletRequest request) {
+        String h = request.getHeader("Authorization");
+        if (h == null || h.isEmpty()) {
+            h = request.getHeader("authorization");
+        }
+        return h;
+    }
 
     @ApiOperation("创建预支付订单")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "price", value = "订单金额", required = true, paramType = "query", dataType = "String"),
             @ApiImplicitParam(name = "subject", value = "订单标题", required = true, paramType = "query", dataType = "String"),
-            @ApiImplicitParam(name = "payType", value = "支付类型(alipay:支付宝, wechatPay:微信支付)", required = true, paramType = "query", dataType = "String")
+            @ApiImplicitParam(name = "payType", value = "支付类型(alipay:支付宝, wechatPay:微信支付, wechatPayMininProgram:微信小程序点餐)", required = true, paramType = "query", dataType = "String")
     })
     @RequestMapping("/prePay")
-    public R prePay(String price, String subject, String payType) {
-        log.info("PaymentController:prePay, price: {}, subject: {}, payType: {}", price, subject, payType);
+    public R prePay(
+            HttpServletRequest request,
+            @RequestParam String price,
+            @RequestParam String subject,
+            @RequestParam String payType,
+            @RequestParam(required = false) String payer,
+            @RequestParam(required = false) String orderNo,
+            @RequestParam(required = false) Integer storeId,
+            @RequestParam(required = false) Integer couponId,
+            @RequestParam(required = false) Integer payerId,
+            @RequestParam(required = false) String tablewareFee,
+            @RequestParam(required = false) String discountAmount,
+            @RequestParam(required = false) String payAmount) {
+        log.info("PaymentController:prePay, price: {}, subject: {}, payType: {}, orderNo: {}, storeId: {}", price, subject, payType, orderNo, storeId);
         try {
+            if ("wechatPayMininProgram".equals(payType) && storeId != null && orderNo != null && payer != null) {
+                return diningServiceFeign.prePay(
+                        authHeader(request), price, subject, payType, payer, orderNo, storeId,
+                        couponId, payerId, tablewareFee, discountAmount, payAmount);
+            }
             return paymentStrategyFactory.getStrategy(payType).createPrePayOrder(price, subject);
         } catch (Exception e) {
             return R.fail(e.getMessage());
@@ -65,8 +93,14 @@ public class PaymentController {
      * @return 订单状态信息
      */
     @RequestMapping("/searchOrderByOutTradeNoPath")
-    public R searchOrderByOutTradeNoPath(String transactionId, String payType) {
+    public R searchOrderByOutTradeNoPath(
+            @RequestParam String transactionId,
+            @RequestParam String payType,
+            @RequestParam(required = false) Integer storeId) {
         try {
+            if ("wechatPayMininProgram".equals(payType) && storeId != null) {
+                return diningServiceFeign.searchOrderByOutTradeNoPath(transactionId, payType, storeId);
+            }
             return paymentStrategyFactory.getStrategy(payType).searchOrderByOutTradeNoPath(transactionId);
         } catch (Exception e) {
             return R.fail(e.getMessage());

+ 9 - 1
alien-store/src/main/java/shop/alien/store/controller/StoreBookingTableController.java

@@ -101,6 +101,9 @@ public class StoreBookingTableController {
 
     @ApiOperationSupport(order = 3)
     @ApiOperation("新增预订服务桌号(支持批量添加)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "type", value = "类型(1:美食,2:通用),不传默认1", dataType = "Integer", paramType = "body", required = false)
+    })
     @PostMapping("/add")
     public R<String> addTable(@RequestBody StoreBookingTableBatchDTO dto) {
         log.info("StoreBookingTableController.addTable?dto={}", dto);
@@ -126,7 +129,12 @@ public class StoreBookingTableController {
                     })
                     .collect(java.util.stream.Collectors.toList());
 
-            boolean result = storeBookingTableService.batchAddTables(dto.getStoreId(), dto.getCategoryId(), tables);
+            Integer type = dto.getType() == null ? 1 : dto.getType();
+            if (type != 1 && type != 2) {
+                return R.fail("type参数不合法");
+            }
+
+            boolean result = storeBookingTableService.batchAddTables(dto.getStoreId(), dto.getCategoryId(), type, tables);
             if (result) {
                 // 批量创建成功后,异步生成小程序二维码
                 List<String> tableNumbers = tables.stream()

+ 0 - 108
alien-store/src/main/java/shop/alien/store/controller/StoreInfoController.java

@@ -21,7 +21,6 @@ import org.springframework.web.multipart.MultipartRequest;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.dto.StoreInfoDto;
-import shop.alien.entity.store.dto.StoreInfoWithHomepageCuisinesDTO;
 import shop.alien.entity.store.vo.*;
 import shop.alien.entity.storePlatform.StoreLicenseHistory;
 import shop.alien.mapper.*;
@@ -83,9 +82,6 @@ public class StoreInfoController {
     private final PerformanceListService performanceListService;
     private final SportsEquipmentFacilityService sportsEquipmentFacilityService;
 
-    /** 点餐(扫码)侧门店桌台/菜品分类查询,见 {@link ScanOrderStoreInfoService} */
-    private final ScanOrderStoreInfoService diningStoreInfoQueryService;
-
     @ApiOperation("获取所有门店")
     @ApiOperationSupport(order = 1)
     @GetMapping("/getAll")
@@ -1932,110 +1928,6 @@ public class StoreInfoController {
         }
     }
 
-    // —— 以下为原 alien-dining 迁移的扫码/点餐门店查询接口(统一挂到本 Controller,路径仍为 /store/info) ——
-
-    @ApiOperation(value = "根据门店ID查询桌号列表", notes = "查询指定门店下的所有桌号(点餐)")
-    @ApiOperationSupport(order = 900)
-    @GetMapping("/tables")
-    public R<List<StoreTable>> getTablesByStoreId(
-            @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId) {
-        log.info("StoreInfoController.getTablesByStoreId?storeId={}", storeId);
-        try {
-            if (storeId == null) {
-                return R.fail("门店ID不能为空");
-            }
-            return R.data(diningStoreInfoQueryService.getTablesByStoreId(storeId));
-        } catch (Exception e) {
-            log.error("查询桌号列表失败: {}", e.getMessage(), e);
-            return R.fail("查询桌号列表失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "根据门店ID查询菜品种类列表", notes = "查询指定门店下的所有菜品种类(点餐)")
-    @ApiOperationSupport(order = 901)
-    @GetMapping("/categories")
-    public R<List<StoreCuisineCategory>> getCategoriesByStoreId(
-            @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId) {
-        log.info("StoreInfoController.getCategoriesByStoreId?storeId={}", storeId);
-        try {
-            if (storeId == null) {
-                return R.fail("门店ID不能为空");
-            }
-            return R.data(diningStoreInfoQueryService.getCategoriesByStoreId(storeId));
-        } catch (Exception e) {
-            log.error("查询菜品种类列表失败: {}", e.getMessage(), e);
-            return R.fail("查询菜品种类列表失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "根据门店ID查询菜品种类及各类别下菜品", notes = "点餐;可选 keyword 按菜品名称模糊查询")
-    @ApiOperationSupport(order = 902)
-    @GetMapping("/categories-with-cuisines")
-    public R<List<CategoryWithCuisinesVO>> getCategoriesWithCuisinesByStoreId(
-            @ApiParam(value = "门店ID", required = true) @RequestParam Integer storeId,
-            @ApiParam(value = "菜品名称模糊查询关键词(可选)") @RequestParam(required = false) String keyword) {
-        log.info("StoreInfoController.getCategoriesWithCuisinesByStoreId?storeId={}, keyword={}", storeId, keyword);
-        try {
-            if (storeId == null) {
-                return R.fail("门店ID不能为空");
-            }
-            return R.data(diningStoreInfoQueryService.getCategoriesWithCuisinesByStoreId(storeId, keyword));
-        } catch (Exception e) {
-            log.error("查询菜品种类及菜品失败: {}", e.getMessage(), e);
-            return R.fail("查询菜品种类及菜品失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "删除菜品种类", notes = "点餐场景;仅删除绑定关系和菜品种类(逻辑删除)")
-    @ApiOperationSupport(order = 903)
-    @DeleteMapping("/category/{categoryId}")
-    public R<Boolean> deleteCategory(
-            @ApiParam(value = "菜品种类ID", required = true) @PathVariable Integer categoryId) {
-        log.info("StoreInfoController.deleteCategory?categoryId={}", categoryId);
-        try {
-            if (categoryId == null) {
-                return R.fail("菜品种类ID不能为空");
-            }
-            return R.data(diningStoreInfoQueryService.deleteCategory(categoryId));
-        } catch (Exception e) {
-            log.error("删除菜品种类失败: {}", e.getMessage(), e);
-            return R.fail("删除菜品种类失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "根据菜品种类ID查询菜品信息列表", notes = "点餐")
-    @ApiOperationSupport(order = 904)
-    @GetMapping("/cuisines")
-    public R<List<StoreCuisine>> getCuisinesByCategoryId(
-            @ApiParam(value = "菜品种类ID", required = true) @RequestParam Integer categoryId) {
-        log.info("StoreInfoController.getCuisinesByCategoryId?categoryId={}", categoryId);
-        try {
-            if (categoryId == null) {
-                return R.fail("菜品种类ID不能为空");
-            }
-            return R.data(diningStoreInfoQueryService.getCuisinesByCategoryId(categoryId));
-        } catch (Exception e) {
-            log.error("查询菜品信息列表失败: {}", e.getMessage(), e);
-            return R.fail("查询菜品信息列表失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "根据商铺ID查询店铺信息和首页展示美食价目表", notes = "点餐")
-    @ApiOperationSupport(order = 905)
-    @GetMapping("/detail/{storeId}")
-    public R<StoreInfoWithHomepageCuisinesDTO> getStoreInfoWithHomepageCuisines(
-            @ApiParam(value = "商铺ID", required = true) @PathVariable Integer storeId) {
-        log.info("StoreInfoController.getStoreInfoWithHomepageCuisines?storeId={}", storeId);
-        try {
-            if (storeId == null) {
-                return R.fail("商铺ID不能为空");
-            }
-            return R.data(diningStoreInfoQueryService.getStoreInfoWithHomepageCuisines(storeId));
-        } catch (Exception e) {
-            log.error("查询店铺信息和首页展示美食价目表失败: {}", e.getMessage(), e);
-            return R.fail("查询店铺信息和首页展示美食价目表失败: " + e.getMessage());
-        }
-    }
 
     /**
      * 店铺信息(包含商户头像)

+ 0 - 578
alien-store/src/main/java/shop/alien/store/controller/StoreOrderController.java

@@ -1,578 +0,0 @@
-package shop.alien.store.controller;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-import shop.alien.store.service.CartService;
-import shop.alien.store.service.SseService;
-import shop.alien.store.service.StoreOrderService;
-import shop.alien.store.util.TokenUtil;
-import shop.alien.entity.result.R;
-import shop.alien.entity.store.*;
-import shop.alien.entity.store.dto.AddCartItemDTO;
-import shop.alien.entity.store.dto.CartDTO;
-import shop.alien.entity.store.dto.ChangeTableDTO;
-import shop.alien.entity.store.dto.CreateOrderDTO;
-import shop.alien.entity.store.vo.OrderChangeLogBatchVO;
-import shop.alien.entity.store.vo.OrderInfoVO;
-import shop.alien.entity.store.vo.OrderDetailWithChangeLogVO;
-import shop.alien.entity.store.vo.StoreOrderPageVO;
-import shop.alien.mapper.StoreInfoMapper;
-import shop.alien.mapper.StoreOrderDetailMapper;
-import shop.alien.mapper.StoreTableMapper;
-
-import javax.validation.Valid;
-import java.util.List;
-
-/**
- * 订单管理控制器
- *
- * @author system
- * @since 2025-01-XX
- */
-@Slf4j
-@Api(tags = {"小程序-订单管理"})
-@CrossOrigin
-@RestController
-@RequestMapping("/store/order")
-@RequiredArgsConstructor
-public class StoreOrderController {
-
-    private final StoreOrderService orderService;
-    private final CartService cartService;
-    private final SseService sseService;
-    private final StoreOrderDetailMapper orderDetailMapper;
-    private final StoreTableMapper storeTableMapper;
-    private final StoreInfoMapper storeInfoMapper;
-
-    @ApiOperation(value = "获取购物车", notes = "根据桌号ID获取购物车信息")
-    @GetMapping("/cart/{tableId}")
-    public R<CartDTO> getCart(@ApiParam(value = "桌号ID", required = true) @PathVariable Integer tableId) {
-        log.info("StoreOrderController.getCart?tableId={}", tableId);
-        try {
-            // 验证 token
-            if (!TokenUtil.hasValidToken()) {
-                return R.fail("用户未登录");
-            }
-            CartDTO cart = cartService.getCart(tableId);
-            return R.data(cart);
-        } catch (Exception e) {
-            log.error("获取购物车失败: {}", e.getMessage(), e);
-            return R.fail("获取购物车失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "添加商品到购物车", notes = "添加商品到购物车,并推送SSE和WebSocket消息")
-    @PostMapping("/cart/add")
-    public R<CartDTO> addCartItem(@Valid @RequestBody AddCartItemDTO dto) {
-        log.info("StoreOrderController.addCartItem?dto={}", dto);
-        try {
-            // 验证 token(用户信息在 CartService 中从 token 获取)
-            if (!TokenUtil.hasValidToken()) {
-                return R.fail("用户未登录");
-            }
-            CartDTO cart = cartService.addItem(dto);
-            // 推送购物车更新消息(SSE)
-            sseService.pushCartUpdate(dto.getTableId(), cart);
-            // 推送购物车更新消息(WebSocket)
-//            CartWebSocketProcess.pushCartUpdate(dto.getTableId(), cart);
-            return R.data(cart);
-        } catch (Exception e) {
-            log.error("添加商品到购物车失败: {}", e.getMessage(), e);
-            return R.fail("添加商品到购物车失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "更新购物车商品数量", notes = "更新购物车中商品的数量,并推送SSE和WebSocket消息")
-    @PutMapping("/cart/update")
-    public R<CartDTO> updateCartItem(
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
-            @ApiParam(value = "菜品ID", required = true) @RequestParam Integer cuisineId,
-            @ApiParam(value = "数量", required = true) @RequestParam Integer quantity) {
-        log.info("StoreOrderController.updateCartItem?tableId={}, cuisineId={}, quantity={}", tableId, cuisineId, quantity);
-        try {
-            // 验证 token
-            if (!TokenUtil.hasValidToken()) {
-                return R.fail("用户未登录");
-            }
-            CartDTO cart = cartService.updateItemQuantity(tableId, cuisineId, quantity);
-            // 推送购物车更新消息(SSE)
-            sseService.pushCartUpdate(tableId, cart);
-            // 推送购物车更新消息(WebSocket)
-//            CartWebSocketProcess.pushCartUpdate(tableId, cart);
-            return R.data(cart);
-        } catch (Exception e) {
-            log.error("更新购物车商品数量失败: {}", e.getMessage(), e);
-            return R.fail("更新购物车商品数量失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "删除购物车商品", notes = "从购物车中删除商品,并推送SSE和WebSocket消息")
-    @DeleteMapping("/cart/remove")
-    public R<CartDTO> removeCartItem(
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
-            @ApiParam(value = "菜品ID", required = true) @RequestParam Integer cuisineId) {
-        log.info("StoreOrderController.removeCartItem?tableId={}, cuisineId={}", tableId, cuisineId);
-        try {
-            // 验证 token
-            if (!TokenUtil.hasValidToken()) {
-                return R.fail("用户未登录");
-            }
-            CartDTO cart = cartService.removeItem(tableId, cuisineId);
-            // 推送购物车更新消息(SSE)
-            sseService.pushCartUpdate(tableId, cart);
-            // 推送购物车更新消息(WebSocket)
-//            CartWebSocketProcess.pushCartUpdate(tableId, cart);
-            return R.data(cart);
-        } catch (Exception e) {
-            log.error("删除购物车商品失败: {}", e.getMessage(), e);
-            return R.fail("删除购物车商品失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "清空购物车", notes = "清空购物车中所有商品(保留餐具和已下单商品),并推送SSE和WebSocket消息")
-    @DeleteMapping("/cart/clear")
-    public R<CartDTO> clearCart(
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
-        log.info("StoreOrderController.clearCart?tableId={}", tableId);
-        try {
-            // 验证 token
-            if (!TokenUtil.hasValidToken()) {
-                return R.fail("用户未登录");
-            }
-            
-            // 清空购物车(会自动保留已下单的商品和餐具)
-            cartService.clearCart(tableId);
-            
-            // 获取清空后的购物车(包含保留的餐具和已下单商品)
-            CartDTO cart = cartService.getCart(tableId);
-            
-            // 推送购物车更新消息(SSE)
-            sseService.pushCartUpdate(tableId, cart);
-            // 推送购物车更新消息(WebSocket)
-//            CartWebSocketProcess.pushCartUpdate(tableId, cart);
-            
-            return R.data(cart);
-        } catch (Exception e) {
-            log.error("清空购物车失败: {}", e.getMessage(), e);
-            return R.fail("清空购物车失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "设置用餐人数", notes = "设置用餐人数,自动添加或更新餐具到购物车")
-    @PostMapping("/cart/set-diner-count")
-    public R<CartDTO> setDinerCount(
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
-            @ApiParam(value = "用餐人数", required = true) @RequestParam Integer dinerCount) {
-        log.info("StoreOrderController.setDinerCount?tableId={}, dinerCount={}", tableId, dinerCount);
-        try {
-            // 验证 token
-            if (!TokenUtil.hasValidToken()) {
-                return R.fail("用户未登录");
-            }
-            if (dinerCount == null || dinerCount <= 0) {
-                return R.fail("用餐人数必须大于0");
-            }
-            CartDTO cart = cartService.setDinerCount(tableId, dinerCount);
-            // 推送购物车更新消息(SSE)
-            sseService.pushCartUpdate(tableId, cart);
-            // 推送购物车更新消息(WebSocket)
-//            CartWebSocketProcess.pushCartUpdate(tableId, cart);
-            return R.data(cart);
-        } catch (Exception e) {
-            log.error("设置用餐人数失败: {}", e.getMessage(), e);
-            return R.fail("设置用餐人数失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "更新餐具数量", notes = "更新购物车中餐具的数量,并推送SSE和WebSocket消息。餐具数量为0或未传时不往购物车加餐具(0会移除已有餐具项)")
-    @PutMapping("/cart/update-tableware")
-    public R<CartDTO> updateTablewareQuantity(
-            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
-            @ApiParam(value = "餐具数量,0或未传则不往购物车加餐具") @RequestParam(required = false) Integer quantity) {
-        log.info("StoreOrderController.updateTablewareQuantity?tableId={}, quantity={}", tableId, quantity);
-        try {
-            // 验证 token
-            if (!TokenUtil.hasValidToken()) {
-                return R.fail("用户未登录");
-            }
-            if (quantity != null && quantity < 0) {
-                return R.fail("餐具数量不能小于0");
-            }
-            // 餐具数量为 0 或 null 时不往购物车加餐具:0 则移除已有餐具项,null 则直接返回当前购物车
-            if (quantity == null) {
-                CartDTO cart = cartService.getCart(tableId);
-                sseService.pushCartUpdate(tableId, cart);
-                return R.data(cart);
-            }
-            if (quantity == 0) {
-                CartDTO cart = cartService.updateTablewareQuantity(tableId, 0);
-                sseService.pushCartUpdate(tableId, cart);
-                return R.data(cart);
-            }
-            CartDTO cart = cartService.updateTablewareQuantity(tableId, quantity);
-            // 推送购物车更新消息(SSE)
-            sseService.pushCartUpdate(tableId, cart);
-            // 推送购物车更新消息(WebSocket)
-//            CartWebSocketProcess.pushCartUpdate(tableId, cart);
-            return R.data(cart);
-        } catch (Exception e) {
-            log.error("更新餐具数量失败: {}", e.getMessage(), e);
-            return R.fail("更新餐具数量失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "创建订单(下单)", notes = "从购物车创建订单,不立即支付。备注:创建/更新时传入,更新订单(加餐)时为覆盖")
-    @PostMapping("/create")
-    public R<shop.alien.entity.store.vo.OrderSuccessVO> createOrder(@Valid @RequestBody CreateOrderDTO dto) {
-        log.info("StoreOrderController.createOrder?dto={}", dto);
-        try {
-            // 验证 token(用户信息在 StoreOrderService 中从 token 获取)
-            if (!TokenUtil.hasValidToken()) {
-                return R.fail("用户未登录");
-            }
-            // 限制备注长度
-            if (dto.getRemark() != null && dto.getRemark().length() > 30) {
-                dto.setRemark(dto.getRemark().substring(0, 30));
-            }
-
-            // 设置不立即支付
-            dto.setImmediatePay(0);
-            StoreOrder order = orderService.createOrder(dto);
-
-            // 转换为OrderSuccessVO
-            shop.alien.entity.store.vo.OrderSuccessVO vo = new shop.alien.entity.store.vo.OrderSuccessVO();
-            vo.setOrderId(order.getId());
-            vo.setOrderNo(order.getOrderNo());
-            vo.setTableNumber(order.getTableNumber());
-            vo.setDinerCount(order.getDinerCount());
-            vo.setOrderStatus(order.getOrderStatus());
-
-            // 查询门店信息
-            StoreInfo storeInfo = storeInfoMapper.selectById(order.getStoreId());
-            vo.setStoreName(storeInfo != null ? storeInfo.getStoreName() : null);
-
-            // 推送订单创建消息
-            sseService.pushCartUpdate(dto.getTableId(), order);
-            return R.data(vo);
-        } catch (Exception e) {
-            log.error("创建订单失败: {}", e.getMessage(), e);
-            return R.fail("创建订单失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "支付订单", notes = "支付订单,支付成功后订单状态变为已支付(1),需要单独调用完成订单接口将订单状态改为已完成(3)")
-    @PostMapping("/pay/{orderId}")
-    public R<Object> payOrder(
-            @ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId,
-            @ApiParam(value = "支付方式(1:微信, 2:支付宝, 3:现金)", required = true) @RequestParam Integer payType) {
-        log.info("StoreOrderController.payOrder?orderId={}, payType={}", orderId, payType);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            
-            StoreOrder order = orderService.getOrderById(orderId);
-            if (order == null) {
-                return R.fail("订单不存在");
-            }
-
-            if (order.getOrderStatus() != 0) {
-                return R.fail("订单状态不正确,无法支付");
-            }
-
-            // 如果是微信支付,调用微信支付接口
-            if (payType == 1) {
-                // TODO: 调用微信支付接口,返回支付参数
-                // 这里需要集成微信支付SDK,返回支付参数给前端拉起支付
-                // 支付成功后通过回调接口更新订单状态
-                // 暂时先更新订单状态为已支付(实际应该等支付回调)
-                order = orderService.payOrder(orderId, payType);
-                return R.data(order);
-            } else {
-                // 其他支付方式(支付宝、现金)直接更新为已支付
-                order = orderService.payOrder(orderId, payType);
-                return R.data(order);
-            }
-        } catch (Exception e) {
-            log.error("支付订单失败: {}", e.getMessage(), e);
-            return R.fail("支付订单失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "取消订单", notes = "取消订单")
-    @PostMapping("/cancel/{orderId}")
-    public R<Boolean> cancelOrder(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
-        log.info("StoreOrderController.cancelOrder?orderId={}", orderId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            boolean result = orderService.cancelOrder(orderId);
-            return R.data(result);
-        } catch (Exception e) {
-            log.error("取消订单失败: {}", e.getMessage(), e);
-            return R.fail("取消订单失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "查询订单详情", notes = "根据订单ID查询订单详情,包含订单基本信息和按批次分组的变更记录,用于展示每次下单/加餐都加了什么商品")
-    @GetMapping("/detail/{orderId}")
-    public R<OrderDetailWithChangeLogVO> getOrderDetail(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
-        log.info("StoreOrderController.getOrderDetail?orderId={}", orderId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            OrderDetailWithChangeLogVO orderDetail = orderService.getOrderDetailWithChangeLog(orderId);
-            return R.data(orderDetail);
-        } catch (Exception e) {
-            log.error("查询订单详情失败: {}", e.getMessage(), e);
-            return R.fail("查询订单详情失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "查询订单明细", notes = "根据订单ID查询订单明细列表")
-    @GetMapping("/detail/list/{orderId}")
-    public R<List<StoreOrderDetail>> getOrderDetailList(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
-        log.info("StoreOrderController.getOrderDetailList?orderId={}", orderId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<StoreOrderDetail> wrapper =
-                    new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<>();
-            wrapper.eq(StoreOrderDetail::getOrderId, orderId);
-            wrapper.eq(StoreOrderDetail::getDeleteFlag, 0);
-            wrapper.orderByDesc(StoreOrderDetail::getCreatedTime);
-            List<StoreOrderDetail> details = orderDetailMapper.selectList(wrapper);
-            return R.data(details);
-        } catch (Exception e) {
-            log.error("查询订单明细失败: {}", e.getMessage(), e);
-            return R.fail("查询订单明细失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "查询订单信息", notes = "根据订单ID查询订单完整信息(包含订单基本信息、菜品清单、价格明细)")
-    @GetMapping("/info/{orderId}")
-    public R<OrderInfoVO> getOrderInfo(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
-        log.info("StoreOrderController.getOrderInfo?orderId={}", orderId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            OrderInfoVO orderInfo = orderService.getOrderInfo(orderId);
-            return R.data(orderInfo);
-        } catch (Exception e) {
-            log.error("查询订单信息失败: {}", e.getMessage(), e);
-            return R.fail("查询订单信息失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "查询订单变更记录", notes = "根据订单ID查询订单的所有变更记录(按批次分组),用于展示每次下单/加餐都加了什么商品")
-    @GetMapping("/change-log/{orderId}")
-    public R<List<OrderChangeLogBatchVO>> getOrderChangeLogs(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
-        log.info("StoreOrderController.getOrderChangeLogs?orderId={}", orderId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            List<OrderChangeLogBatchVO> changeLogs = orderService.getOrderChangeLogs(orderId);
-            return R.data(changeLogs);
-        } catch (Exception e) {
-            log.error("查询订单变更记录失败: {}", e.getMessage(), e);
-            return R.fail("查询订单变更记录失败: " + e.getMessage());
-        }
-    }
-
-
-    @ApiOperation(value = "分页查询订单列表", notes = "分页查询订单列表,包含订单中的菜品数量、菜品名称、菜品图片。支持按订单编号或菜品名称搜索(限15字)")
-    @GetMapping("/page")
-    public R<IPage<StoreOrderPageVO>> getOrderPage(
-            @ApiParam(value = "页码", required = true) @RequestParam(defaultValue = "1") Long current,
-            @ApiParam(value = "每页数量", required = true) @RequestParam(defaultValue = "10") Long size,
-            @ApiParam(value = "门店ID") @RequestParam(required = false) Integer storeId,
-            @ApiParam(value = "桌号ID") @RequestParam(required = false) Integer tableId,
-            @ApiParam(value = "订单状态:0=进行中(待支付+已支付),3=已完成") @RequestParam(required = false) Integer orderStatus,
-            @ApiParam(value = "搜索关键词(订单编号或菜品名称,限15字)") @RequestParam(required = false) String keyword) {
-        log.info("StoreOrderController.getOrderPage?current={}, size={}, storeId={}, tableId={}, orderStatus={}, keyword={}", current, size, storeId, tableId, orderStatus, keyword);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            Page<StoreOrder> page = new Page<>(current, size);
-            IPage<StoreOrderPageVO> result = orderService.getOrderPageWithCuisines(page, storeId, tableId, orderStatus, keyword);
-            return R.data(result);
-        } catch (Exception e) {
-            log.error("分页查询订单列表失败: {}", e.getMessage(), e);
-            return R.fail("分页查询订单列表失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "查询我的订单", notes = "通过标识查询我的未支付订单或历史订单,包含订单中的菜品数量、菜品名称、菜品图片。type: 0或unpaid-未支付订单, 1或history-历史订单")
-    @GetMapping("/my-orders")
-    public R<IPage<StoreOrderPageVO>> getMyOrders(
-            @ApiParam(value = "页码", required = true) @RequestParam(defaultValue = "1") Long current,
-            @ApiParam(value = "每页数量", required = true) @RequestParam(defaultValue = "10") Long size,
-            @ApiParam(value = "订单类型(0或unpaid:未支付订单, 1或history:历史订单)", required = true) @RequestParam String type) {
-        log.info("StoreOrderController.getMyOrders?current={}, size={}, type={}", current, size, type);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            Page<StoreOrder> page = new Page<>(current, size);
-            IPage<StoreOrderPageVO> result = orderService.getMyOrdersWithCuisines(page, type);
-            return R.data(result);
-        } catch (Exception e) {
-            log.error("查询我的订单失败: {}", e.getMessage(), e);
-            return R.fail("查询我的订单失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "换桌", notes = "换桌并迁移购物车、未完成的订单以及其他关联表数据")
-    @PostMapping("/change-table")
-    public R<CartDTO> changeTable(@Valid @RequestBody ChangeTableDTO dto) {
-        log.info("StoreOrderController.changeTable?dto={}", dto);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-
-            // 调用Service层处理换桌业务逻辑
-            CartDTO cart = orderService.changeTable(dto.getFromTableId(), dto.getToTableId(), dto.getChangeReason(), userId);
-
-            return R.data(cart);
-        } catch (Exception e) {
-            log.error("换桌失败: {}", e.getMessage(), e);
-            return R.fail("换桌失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "建立SSE连接", notes = "建立SSE连接,用于接收购物车更新消息")
-    @GetMapping(value = "/sse/{tableId}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
-    public SseEmitter createSseConnection(@ApiParam(value = "桌号ID", required = true) @PathVariable Integer tableId) {
-        // 验证 token
-        if (!TokenUtil.hasValidToken()) {
-            log.warn("建立SSE连接失败: 用户未登录, tableId={}", tableId);
-            return null;
-        }
-        log.info("建立SSE连接, tableId={}", tableId);
-        return sseService.createConnection(tableId);
-    }
-
-    @ApiOperation(value = "完成订单", notes = "完成订单,将已支付状态的订单改为已完成状态。订单状态:0-待支付,1-已支付,3-已完成。只有已支付状态的订单才能完成")
-    @PostMapping("/complete/{orderId}")
-    public R<Boolean> completeOrder(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
-        log.info("StoreOrderController.completeOrder?orderId={}", orderId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            boolean result = orderService.completeOrder(orderId);
-            return R.data(result);
-        } catch (Exception e) {
-            log.error("完成订单失败: {}", e.getMessage(), e);
-            return R.fail("完成订单失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "商家手动完成订单", notes = "供商家使用,手动点击完成订单。不校验订单是否处于已支付状态,直接将订单状态改为已完成。订单状态:0-待支付,1-已支付,2-已取消,3-已完成")
-    @PostMapping("/complete-by-merchant/{orderId}")
-    public R<Boolean> completeOrderByMerchant(@ApiParam(value = "订单ID", required = true) @PathVariable Integer orderId) {
-        log.info("StoreOrderController.completeOrderByMerchant?orderId={}", orderId);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            boolean result = orderService.completeOrderByMerchant(orderId);
-            return R.data(result);
-        } catch (Exception e) {
-            log.error("商家手动完成订单失败: {}", e.getMessage(), e);
-            return R.fail("商家手动完成订单失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "更新订单优惠券", notes = "重新选择优惠券")
-    @PostMapping("/update-coupon")
-    public R<StoreOrder> updateOrderCoupon(@Valid @RequestBody shop.alien.entity.store.dto.UpdateOrderCouponDTO dto) {
-        log.info("StoreOrderController.updateOrderCoupon?dto={}", dto);
-        try {
-            // 从 token 获取用户信息
-            Integer userId = TokenUtil.getCurrentUserId();
-            if (userId == null) {
-                return R.fail("用户未登录");
-            }
-            StoreOrder order = orderService.updateOrderCoupon(dto.getOrderId(), dto.getCouponId());
-            return R.data(order);
-        } catch (Exception e) {
-            log.error("更新订单优惠券失败: {}", e.getMessage(), e);
-            return R.fail("更新订单优惠券失败: " + e.getMessage());
-        }
-    }
-
-    @ApiOperation(value = "管理员重置餐桌", notes = "管理员重置餐桌:删除购物车数据、未支付/已取消的订单数据,并重置餐桌表初始化。已支付/已完成的订单会被保留,避免数据丢失")
-    @PostMapping("/admin/reset-table/{tableId}")
-    public R<Boolean> resetTable(@ApiParam(value = "餐桌ID", required = true) @PathVariable Integer tableId) {
-        log.info("StoreOrderController.resetTable?tableId={}", tableId);
-        try {
-            // TODO: 这里可以添加管理员权限验证
-            // if (!isAdmin(userId)) {
-            //     return R.fail("无权限执行此操作");
-            // }
-            
-            boolean result = orderService.resetTable(tableId);
-            if (result) {
-                // 推送购物车更新消息(清空购物车)
-                CartDTO emptyCart = new CartDTO();
-                emptyCart.setTableId(tableId);
-                emptyCart.setItems(java.util.Collections.emptyList());
-                emptyCart.setTotalAmount(java.math.BigDecimal.ZERO);
-                emptyCart.setTotalQuantity(0);
-                
-                // 查询桌号信息
-                StoreTable table = storeTableMapper.selectById(tableId);
-                if (table != null) {
-                    emptyCart.setTableNumber(table.getTableNumber());
-                    emptyCart.setStoreId(table.getStoreId());
-                }
-                
-                sseService.pushCartUpdate(tableId, emptyCart);
-                return R.data(true);
-            } else {
-                return R.fail("重置餐桌失败");
-            }
-        } catch (Exception e) {
-            log.error("重置餐桌失败: {}", e.getMessage(), e);
-            return R.fail("重置餐桌失败: " + e.getMessage());
-        }
-    }
-}

+ 98 - 7
alien-store/src/main/java/shop/alien/store/controller/StoreProductDiscountController.java

@@ -10,11 +10,21 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.StoreCuisine;
+import shop.alien.entity.store.StoreCuisineCategory;
+import shop.alien.entity.store.StorePrice;
 import shop.alien.entity.store.dto.StoreProductDiscountRuleSaveDto;
+import shop.alien.entity.store.vo.StoreProductSelectVo;
 import shop.alien.entity.store.vo.StoreProductDiscountRuleDetailVo;
 import shop.alien.entity.store.vo.StoreProductDiscountRuleListVo;
+import shop.alien.store.service.StoreCuisineCategoryService;
 import shop.alien.store.service.StoreCuisineService;
 import shop.alien.store.service.StoreProductDiscountService;
+import shop.alien.store.service.StorePriceService;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Api(tags = {"门店-菜品优惠"})
@@ -25,12 +35,15 @@ public class StoreProductDiscountController {
 
 	private final StoreProductDiscountService discountService;
 	private final StoreCuisineService storeCuisineService;
+	private final StorePriceService storePriceService;
+	private final StoreCuisineCategoryService storeCuisineCategoryService;
 
 	@ApiOperation("菜品列表(支持按名称模糊查询)")
 	@GetMapping("/productList")
-	public R<IPage<StoreCuisine>> productList(
+	public R<IPage<StoreProductSelectVo>> productList(
 			@RequestParam Integer storeId,
 			@RequestParam(required = false) String name,
+			@RequestParam(required = false) String type,
 			@RequestParam(defaultValue = "1") Integer pageNum,
 			@RequestParam(defaultValue = "10") Integer pageSize) {
 		if (storeId == null) {
@@ -38,14 +51,39 @@ public class StoreProductDiscountController {
 		}
 		int pn = pageNum == null || pageNum < 1 ? 1 : pageNum;
 		int ps = pageSize == null || pageSize < 1 ? 10 : pageSize;
-		Page<StoreCuisine> page = new Page<>(pn, ps);
-		LambdaQueryWrapper<StoreCuisine> wrapper = new LambdaQueryWrapper<>();
-		wrapper.eq(StoreCuisine::getStoreId, storeId);
+		String typeValue = StringUtils.hasText(type) ? type.trim() : "1";
+		if (!"1".equals(typeValue) && !"2".equals(typeValue)) {
+			return R.fail("type参数不合法,仅支持1(美食)或2(其他)");
+		}
+		Map<Integer, String> categoryNameMap = storeCuisineCategoryService.getCategoryList(storeId)
+				.stream()
+				.collect(Collectors.toMap(StoreCuisineCategory::getId, StoreCuisineCategory::getCategoryName, (a, b) -> a));
+
+		if ("1".equals(typeValue)) {
+			Page<StoreCuisine> page = new Page<>(pn, ps);
+			LambdaQueryWrapper<StoreCuisine> wrapper = new LambdaQueryWrapper<>();
+			wrapper.eq(StoreCuisine::getStoreId, storeId);
+			if (StringUtils.hasText(name)) {
+				wrapper.like(StoreCuisine::getName, name.trim());
+			}
+			wrapper.orderByDesc(StoreCuisine::getUpdatedTime);
+			IPage<StoreCuisine> cuisinePage = storeCuisineService.page(page, wrapper);
+			Page<StoreProductSelectVo> result = new Page<>(pn, ps, cuisinePage.getTotal());
+			result.setRecords(cuisinePage.getRecords().stream().map(item -> toProductSelectVo(item, categoryNameMap)).collect(Collectors.toList()));
+			return R.data(result);
+		}
+
+		Page<StorePrice> page = new Page<>(pn, ps);
+		LambdaQueryWrapper<StorePrice> wrapper = new LambdaQueryWrapper<>();
+		wrapper.eq(StorePrice::getStoreId, storeId);
 		if (StringUtils.hasText(name)) {
-			wrapper.like(StoreCuisine::getName, name.trim());
+			wrapper.like(StorePrice::getName, name.trim());
 		}
-		wrapper.orderByDesc(StoreCuisine::getUpdatedTime);
-		return R.data(storeCuisineService.page(page, wrapper));
+		wrapper.orderByDesc(StorePrice::getUpdatedTime);
+		IPage<StorePrice> pricePage = storePriceService.page(page, wrapper);
+		Page<StoreProductSelectVo> result = new Page<>(pn, ps, pricePage.getTotal());
+		result.setRecords(pricePage.getRecords().stream().map(item -> toProductSelectVo(item, categoryNameMap)).collect(Collectors.toList()));
+		return R.data(result);
 	}
 
 	@ApiOperation("优惠规则列表")
@@ -96,5 +134,58 @@ public class StoreProductDiscountController {
 		int count = discountService.autoCloseExpiredCustomRules();
 		return R.data(count);
 	}
+
+	private StoreProductSelectVo toProductSelectVo(StoreCuisine item, Map<Integer, String> categoryNameMap) {
+		StoreProductSelectVo vo = new StoreProductSelectVo();
+		vo.setId(item.getId());
+		vo.setStoreId(item.getStoreId());
+		vo.setType(1);
+		vo.setName(item.getName());
+		vo.setTotalPrice(item.getTotalPrice());
+		vo.setImages(item.getImages());
+		vo.setCategoryIds(item.getCategoryIds());
+		List<Integer> categoryIdList = parseCategoryIds(item.getCategoryIds());
+		vo.setCategoryIdList(categoryIdList);
+		vo.setCategoryNames(categoryIdList.stream().map(categoryNameMap::get).filter(StringUtils::hasText).collect(Collectors.toList()));
+		return vo;
+	}
+
+	private StoreProductSelectVo toProductSelectVo(StorePrice item, Map<Integer, String> categoryNameMap) {
+		StoreProductSelectVo vo = new StoreProductSelectVo();
+		vo.setId(item.getId());
+		vo.setStoreId(item.getStoreId());
+		vo.setType(2);
+		vo.setName(item.getName());
+		vo.setTotalPrice(item.getTotalPrice());
+		vo.setImages(item.getImages());
+		vo.setCategoryIds(item.getCategoryIds());
+		List<Integer> categoryIdList = parseCategoryIds(item.getCategoryIds());
+		vo.setCategoryIdList(categoryIdList);
+		vo.setCategoryNames(categoryIdList.stream().map(categoryNameMap::get).filter(StringUtils::hasText).collect(Collectors.toList()));
+		return vo;
+	}
+
+	private List<Integer> parseCategoryIds(String categoryIds) {
+		if (!StringUtils.hasText(categoryIds)) {
+			return Collections.emptyList();
+		}
+		try {
+			String cleaned = categoryIds.trim()
+					.replace("[", "")
+					.replace("]", "")
+					.replace("\"", "");
+			if (!StringUtils.hasText(cleaned)) {
+				return Collections.emptyList();
+			}
+			return java.util.Arrays.stream(cleaned.split(","))
+					.map(String::trim)
+					.filter(StringUtils::hasText)
+					.map(Integer::valueOf)
+					.collect(Collectors.toList());
+		} catch (Exception e) {
+			log.warn("解析分类ID失败: {}", categoryIds, e);
+			return Collections.emptyList();
+		}
+	}
 }
 

+ 25 - 5
alien-store/src/main/java/shop/alien/store/controller/StoreReservationController.java

@@ -36,7 +36,7 @@ public class StoreReservationController {
     @ApiOperation("查询商家端预约信息列表")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "storeId", value = "门店ID", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "status", value = "预约状态(可选,0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时)", dataType = "Integer", paramType = "query", required = false),
+            @ApiImplicitParam(name = "status", value = "预约状态(可选,0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时 5:用餐结束)", dataType = "Integer", paramType = "query", required = false),
             @ApiImplicitParam(name = "dateFrom", value = "预约日期起 yyyy-MM-dd", dataType = "String", paramType = "query", required = false),
             @ApiImplicitParam(name = "dateTo", value = "预约日期止 yyyy-MM-dd", dataType = "String", paramType = "query", required = false),
             @ApiImplicitParam(name = "orderStatus", value = "订单状态(可选,0:待支付 1:待使用 2:已完成 3:已过期 4:已取消 5:已关闭 6:退款中 7:已退款 8:商家预订;不传则默认查询:待使用、已完成、已退款三种状态)", dataType = "Integer", paramType = "query", required = false),
@@ -189,6 +189,26 @@ public class StoreReservationController {
     }
 
     @ApiOperationSupport(order = 6)
+    @ApiOperation("商家端标记用餐结束")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "reservationId", value = "预约ID(须为已到店状态)", dataType = "Integer", paramType = "query", required = true)
+    })
+    @PostMapping("/finishDining")
+    public R<String> finishDining(@RequestParam Integer reservationId) {
+        log.info("StoreReservationController.finishDining?reservationId={}", reservationId);
+        if (reservationId == null) {
+            return R.fail("预约ID不能为空");
+        }
+        try {
+            boolean ok = storeReservationService.finishDiningByStore(reservationId);
+            return ok ? R.success("已标记为用餐结束") : R.fail("操作失败");
+        } catch (Exception e) {
+            log.error("商家端标记用餐结束失败", e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperationSupport(order = 7)
     @ApiOperation("商家端退款(预留)")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "reservationId", value = "预约ID", dataType = "Integer", paramType = "query", required = true)
@@ -214,7 +234,7 @@ public class StoreReservationController {
         }
     }
 
-    @ApiOperationSupport(order = 7)
+    @ApiOperationSupport(order = 8)
     @ApiOperation("通过预订设置ID查询线上预订营业时间")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "settingsId", value = "预订设置ID(store_booking_settings表的id)", dataType = "Integer", paramType = "query", required = true)
@@ -236,7 +256,7 @@ public class StoreReservationController {
         }
     }
 
-    @ApiOperationSupport(order = 8)
+    @ApiOperationSupport(order = 9)
     @ApiOperation("商家端主动退款(调用支付退款接口并发送通知和短信)")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "storeId", value = "门店ID", required = true, paramType = "query", dataType = "int"),
@@ -276,7 +296,7 @@ public class StoreReservationController {
         }
     }
 
-    @ApiOperationSupport(order = 9)
+    @ApiOperationSupport(order = 10)
     @ApiOperation("通过订单ID退款(根据订单自动带出门店、商户订单号、金额、支付方式,成功时发送通知和短信)")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "orderId", value = "预订订单ID(user_reservation_order.id)", required = true, paramType = "query", dataType = "int"),
@@ -300,7 +320,7 @@ public class StoreReservationController {
         }
     }
 
-    @ApiOperationSupport(order = 10)
+    @ApiOperationSupport(order = 11)
     @ApiOperation("发送订金退款短信和通知")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "reservationId", value = "预约ID", dataType = "Integer", paramType = "query", required = true)

+ 4 - 3
alien-store/src/main/java/shop/alien/store/controller/StoreServiceFeeRuleController.java

@@ -50,7 +50,7 @@ public class StoreServiceFeeRuleController {
 
     @ApiOperation("新建服务费")
     @PostMapping("/create")
-    public R<Integer> create(@RequestBody StoreServiceFeeRuleSaveDto dto) {
+    public R<List<Integer>> create(@RequestBody StoreServiceFeeRuleSaveDto dto) {
         return storeServiceFeeRuleService.createRule(dto);
     }
 
@@ -73,8 +73,9 @@ public class StoreServiceFeeRuleController {
     @GetMapping("/tableList")
     public R<List<StoreBookingTableVo>> tableList(
             @RequestParam Integer storeId,
-            @RequestParam(required = false) Integer categoryId) {
-        return storeServiceFeeRuleService.getTableList(storeId, categoryId);
+            @RequestParam(required = false) Integer categoryId,
+            @RequestParam(required = false) String name) {
+        return storeServiceFeeRuleService.getTableList(storeId, categoryId, name);
     }
 }
 

+ 149 - 0
alien-store/src/main/java/shop/alien/store/controller/dining/DiningCouponPathProxyController.java

@@ -0,0 +1,149 @@
+package shop.alien.store.controller.dining;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.vo.LifeDiscountCouponVo;
+import shop.alien.store.feign.DiningServiceFeign;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 与微信小程序一致 {@code /dining/coupon},透传 alien-dining。
+ */
+@Slf4j
+@Api(tags = {"APP/统一网关-点餐优惠券(与小程序路径一致)"})
+@CrossOrigin
+@RestController
+@RequestMapping("/dining/coupon")
+@RequiredArgsConstructor
+public class DiningCouponPathProxyController {
+
+    private final DiningServiceFeign diningServiceFeign;
+
+    private String auth(HttpServletRequest request) {
+        String h = request.getHeader("Authorization");
+        if (h == null || h.isEmpty()) {
+            h = request.getHeader("authorization");
+        }
+        return h;
+    }
+
+    @GetMapping("/getUserCouponList")
+    public R<List<LifeDiscountCouponVo>> getUserCouponList(
+            HttpServletRequest request,
+            @RequestParam(defaultValue = "1") int page,
+            @RequestParam(defaultValue = "10") int size,
+            @RequestParam String tabType,
+            @RequestParam(required = false) Integer type,
+            @RequestParam(required = false) Integer couponType,
+            @RequestParam(required = false) String storeId) {
+        try {
+            return diningServiceFeign.couponGetUserCouponList(auth(request), page, size, tabType, type, couponType, storeId);
+        } catch (Exception e) {
+            log.error("getUserCouponList: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @GetMapping("/detail")
+    public R<LifeDiscountCouponVo> getCounponDetailById(
+            HttpServletRequest request,
+            @RequestParam("counponId") String counponId) {
+        try {
+            return diningServiceFeign.couponGetDetail(auth(request), counponId);
+        } catch (Exception e) {
+            log.error("coupon detail: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @GetMapping("/storeUsableList")
+    public R<Map<String, Object>> getStoreUserUsableCouponList(
+            HttpServletRequest request,
+            @RequestParam String storeId,
+            @RequestParam BigDecimal amount,
+            @RequestParam(required = false) Integer couponType) {
+        try {
+            return diningServiceFeign.couponStoreUsableList(auth(request), storeId, amount, couponType);
+        } catch (Exception e) {
+            log.error("storeUsableList: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @GetMapping("/userOwned")
+    public R<List<LifeDiscountCouponVo>> getUserOwnedCoupons(
+            HttpServletRequest request,
+            @RequestParam(required = false) String storeId,
+            @RequestParam(required = false) BigDecimal amount) {
+        try {
+            return diningServiceFeign.couponUserOwned(auth(request), storeId, amount);
+        } catch (Exception e) {
+            log.error("userOwned: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @GetMapping("/getStoreUserCouponList")
+    public R<List<LifeDiscountCouponVo>> getStoreUserCouponList(
+            HttpServletRequest request,
+            @RequestParam String storeId,
+            @RequestParam(required = false) Integer couponType) {
+        try {
+            return diningServiceFeign.couponGetStoreUserCouponList(auth(request), storeId, couponType);
+        } catch (Exception e) {
+            log.error("getStoreUserCouponList: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @GetMapping("/userOwnedByStore")
+    public R<List<LifeDiscountCouponVo>> getUserOwnedCouponsByStore(
+            HttpServletRequest request,
+            @RequestParam(required = false) String storeId,
+            @RequestParam(required = false) Integer couponType) {
+        try {
+            return diningServiceFeign.couponUserOwnedByStore(auth(request), storeId, couponType);
+        } catch (Exception e) {
+            log.error("userOwnedByStore: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("门店全部优惠券分页")
+    @GetMapping("/getStoreAllCouponList")
+    public R<IPage<LifeDiscountCouponVo>> getStoreAllCouponList(
+            HttpServletRequest request,
+            @RequestParam(defaultValue = "1") int page,
+            @RequestParam(defaultValue = "10") int size,
+            @RequestParam String storeId,
+            @RequestParam(required = false) String couponName,
+            @RequestParam String tab,
+            @RequestParam(defaultValue = "1") int couponsFromType,
+            @RequestParam(defaultValue = "1") int couponStatus,
+            @RequestParam(required = false) Integer couponType) {
+        try {
+            R<Page<LifeDiscountCouponVo>> r = diningServiceFeign.couponGetStoreAllCouponList(
+                    auth(request), page, size, storeId, couponName, tab, couponsFromType, couponStatus, couponType);
+            if (r == null) {
+                return R.fail("服务无响应");
+            }
+            if (!R.isSuccess(r)) {
+                return R.fail(r.getMsg());
+            }
+            return R.data(r.getData());
+        } catch (Exception e) {
+            log.error("getStoreAllCouponList: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+}

+ 116 - 0
alien-store/src/main/java/shop/alien/store/controller/dining/DiningUserPathProxyController.java

@@ -0,0 +1,116 @@
+package shop.alien.store.controller.dining;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.store.feign.DiningServiceFeign;
+import shop.alien.store.feign.dto.DiningChangePhoneBody;
+import shop.alien.store.feign.dto.DiningProfileUpdateBody;
+import shop.alien.store.feign.dto.DiningVerifyTokenBody;
+import shop.alien.store.feign.dto.DiningWeChatLoginBody;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 与微信小程序一致 {@code /dining/user},透传 alien-dining。
+ */
+@Slf4j
+@Api(tags = {"APP/统一网关-点餐用户(与小程序路径一致)"})
+@CrossOrigin
+@RestController
+@RequestMapping("/dining/user")
+@RequiredArgsConstructor
+public class DiningUserPathProxyController {
+
+    private final DiningServiceFeign diningServiceFeign;
+
+    private String auth(HttpServletRequest request) {
+        String h = request.getHeader("Authorization");
+        if (h == null || h.isEmpty()) {
+            h = request.getHeader("authorization");
+        }
+        return h;
+    }
+
+    @ApiOperation("微信登录(小程序;APP 如需请走统一用户体系映射后再发 token)")
+    @PostMapping("/wechatLogin")
+    public R<Object> wechatLogin(@Valid @RequestBody DiningWeChatLoginBody body) {
+        try {
+            return diningServiceFeign.wechatLogin(body);
+        } catch (Exception e) {
+            log.error("wechatLogin: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("当前用户信息")
+    @GetMapping("/getUserInfo")
+    public R<Object> getUserInfo(HttpServletRequest request) {
+        try {
+            return diningServiceFeign.getUserInfo(auth(request));
+        } catch (Exception e) {
+            log.error("getUserInfo: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("更新资料")
+    @PostMapping("/updateProfile")
+    public R<Object> updateProfile(HttpServletRequest request, @Valid @RequestBody DiningProfileUpdateBody body) {
+        try {
+            return diningServiceFeign.updateProfile(auth(request), body);
+        } catch (Exception e) {
+            log.error("updateProfile: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("更换手机号")
+    @PostMapping("/changePhone")
+    public R<Object> changePhone(HttpServletRequest request, @Valid @RequestBody DiningChangePhoneBody body) {
+        try {
+            return diningServiceFeign.changePhone(auth(request), body);
+        } catch (Exception e) {
+            log.error("changePhone: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("校验 Token")
+    @PostMapping("/verifyToken")
+    public R<Object> verifyToken(HttpServletRequest request, @RequestBody(required = false) DiningVerifyTokenBody dto) {
+        try {
+            Map<String, String> body = null;
+            if (dto != null && dto.getToken() != null) {
+                body = new HashMap<>(2);
+                body.put("token", dto.getToken());
+            }
+            return diningServiceFeign.verifyToken(auth(request), body);
+        } catch (Exception e) {
+            log.error("verifyToken: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("解析 Token(调试)")
+    @PostMapping("/parseToken")
+    public R<Object> parseToken(HttpServletRequest request, @RequestBody(required = false) DiningVerifyTokenBody dto) {
+        try {
+            Map<String, String> body = null;
+            if (dto != null && dto.getToken() != null) {
+                body = new HashMap<>(2);
+                body.put("token", dto.getToken());
+            }
+            return diningServiceFeign.parseToken(auth(request), body);
+        } catch (Exception e) {
+            log.error("parseToken: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+}

+ 208 - 0
alien-store/src/main/java/shop/alien/store/controller/dining/StoreDiningPathProxyController.java

@@ -0,0 +1,208 @@
+package shop.alien.store.controller.dining;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.vo.*;
+import shop.alien.store.feign.DiningServiceFeign;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * 与微信小程序一致的路径前缀 {@code /store/dining},透传 alien-dining。
+ */
+@Slf4j
+@Api(tags = {"APP/统一网关-点餐(与小程序路径一致)"})
+@CrossOrigin
+@RestController
+@RequestMapping("/store/dining")
+@RequiredArgsConstructor
+public class StoreDiningPathProxyController {
+
+    private final DiningServiceFeign diningServiceFeign;
+
+    private String auth(HttpServletRequest request) {
+        String h = request.getHeader("Authorization");
+        if (h == null || h.isEmpty()) {
+            h = request.getHeader("authorization");
+        }
+        return h;
+    }
+
+    @ApiOperation("查询餐桌是否处于就餐中")
+    @GetMapping("/table-dining-status")
+    public R<TableDiningStatusVO> getTableDiningStatus(@RequestParam Integer tableId) {
+        try {
+            return diningServiceFeign.getTableDiningStatus(tableId);
+        } catch (Exception e) {
+            log.error("getTableDiningStatus: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("获取点餐页面信息")
+    @GetMapping("/page-info")
+    public R<DiningPageInfoVO> getDiningPageInfo(
+            HttpServletRequest request,
+            @RequestParam Integer tableId,
+            @RequestParam(required = false) Integer dinerCount) {
+        try {
+            return diningServiceFeign.getDiningPageInfo(auth(request), tableId, dinerCount);
+        } catch (Exception e) {
+            log.error("getDiningPageInfo: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("搜索菜品")
+    @GetMapping("/search")
+    public R<List<CuisineListVO>> searchCuisines(
+            HttpServletRequest request,
+            @RequestParam Integer storeId,
+            @RequestParam(required = false) String keyword,
+            @RequestParam Integer tableId) {
+        try {
+            return diningServiceFeign.searchCuisines(auth(request), storeId, keyword, tableId);
+        } catch (Exception e) {
+            log.error("searchCuisines: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("按分类获取菜品列表")
+    @GetMapping("/cuisines")
+    public R<List<CuisineListVO>> getCuisinesByCategory(
+            HttpServletRequest request,
+            @RequestParam Integer storeId,
+            @RequestParam(required = false) Integer categoryId,
+            @RequestParam Integer tableId,
+            @RequestParam(defaultValue = "1") Integer page,
+            @RequestParam(defaultValue = "12") Integer size) {
+        try {
+            return diningServiceFeign.getCuisinesByCategory(auth(request), storeId, categoryId, tableId, page, size);
+        } catch (Exception e) {
+            log.error("getCuisinesByCategory: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("菜品详情")
+    @GetMapping("/cuisine/{cuisineId}")
+    public R<CuisineDetailVO> getCuisineDetail(
+            HttpServletRequest request,
+            @PathVariable Integer cuisineId,
+            @RequestParam Integer tableId) {
+        try {
+            return diningServiceFeign.getCuisineDetail(auth(request), cuisineId, tableId);
+        } catch (Exception e) {
+            log.error("getCuisineDetail: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("可领取的优惠券列表")
+    @GetMapping("/coupons/available")
+    public R<List<AvailableCouponVO>> getAvailableCoupons(HttpServletRequest request, @RequestParam Integer storeId) {
+        try {
+            return diningServiceFeign.getAvailableCoupons(auth(request), storeId);
+        } catch (Exception e) {
+            log.error("getAvailableCoupons: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("领取优惠券")
+    @PostMapping("/coupon/receive")
+    public R<Boolean> receiveCoupon(HttpServletRequest request, @RequestParam Integer couponId) {
+        try {
+            return diningServiceFeign.receiveCoupon(auth(request), couponId);
+        } catch (Exception e) {
+            log.error("receiveCoupon: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("订单确认页信息")
+    @GetMapping("/order/confirm")
+    public R<OrderConfirmVO> getOrderConfirmInfo(
+            HttpServletRequest request,
+            @RequestParam Integer tableId,
+            @RequestParam Integer dinerCount) {
+        try {
+            return diningServiceFeign.getOrderConfirmInfo(auth(request), tableId, dinerCount);
+        } catch (Exception e) {
+            log.error("getOrderConfirmInfo: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("锁定订单(同桌防并发)")
+    @PostMapping("/order/lock")
+    public R<Boolean> lockOrder(HttpServletRequest request, @RequestParam Integer tableId) {
+        try {
+            return diningServiceFeign.lockOrder(auth(request), tableId);
+        } catch (Exception e) {
+            log.error("lockOrder: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("解锁订单")
+    @PostMapping("/order/unlock")
+    public R<Boolean> unlockOrder(HttpServletRequest request, @RequestParam Integer tableId) {
+        try {
+            return diningServiceFeign.unlockOrder(auth(request), tableId);
+        } catch (Exception e) {
+            log.error("unlockOrder: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("检查订单锁定状态")
+    @GetMapping("/order/check-lock")
+    public R<Integer> checkOrderLock(HttpServletRequest request, @RequestParam Integer tableId) {
+        try {
+            return diningServiceFeign.checkOrderLock(auth(request), tableId);
+        } catch (Exception e) {
+            log.error("checkOrderLock: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("结算页信息")
+    @GetMapping("/order/settlement")
+    public R<OrderSettlementVO> getOrderSettlementInfo(HttpServletRequest request, @RequestParam Integer orderId) {
+        try {
+            return diningServiceFeign.getOrderSettlementInfo(auth(request), orderId);
+        } catch (Exception e) {
+            log.error("getOrderSettlementInfo: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("结算锁定")
+    @PostMapping("/order/settlement/lock")
+    public R<Boolean> lockSettlement(HttpServletRequest request, @RequestParam Integer orderId) {
+        try {
+            return diningServiceFeign.lockSettlement(auth(request), orderId);
+        } catch (Exception e) {
+            log.error("lockSettlement: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @ApiOperation("结算解锁")
+    @PostMapping("/order/settlement/unlock")
+    public R<Boolean> unlockSettlement(HttpServletRequest request, @RequestParam Integer orderId) {
+        try {
+            return diningServiceFeign.unlockSettlement(auth(request), orderId);
+        } catch (Exception e) {
+            log.error("unlockSettlement: {}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
+}

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików