Prechádzať zdrojové kódy

Merge branch 'sit' into uat-20260202

dujian 1 mesiac pred
rodič
commit
aa123755fd

+ 16 - 2
alien-dining/src/main/java/shop/alien/dining/controller/DiningController.java

@@ -6,6 +6,7 @@ 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.dining.service.DiningService;
 import shop.alien.dining.util.TokenUtil;
@@ -28,11 +29,24 @@ public class DiningController {
 
     private final DiningService diningService;
 
-    @ApiOperation(value = "获取点餐页面信息", notes = "获取店铺名称、桌号、就餐人数等信息")
+    @ApiOperation(value = "查询餐桌是否处于就餐中", notes = "免登录可调用,用于前端判断是否跳过选择用餐人数;根据 status=就餐中 且 diner_count 有值 判定为就餐中")
+    @GetMapping("/table-dining-status")
+    public R<TableDiningStatusVO> getTableDiningStatus(
+            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer 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 = "就餐人数", required = true) @RequestParam Integer dinerCount) {
+            @ApiParam(value = "就餐人数(首客必传;餐桌已就餐中时可省略,将使用已保存人数)") @RequestParam(required = false) Integer dinerCount) {
         try {
             // 从 token 获取用户信息
             Integer userId = TokenUtil.getCurrentUserId();

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

@@ -1,5 +1,6 @@
 package shop.alien.dining.service;
 
+import shop.alien.entity.store.vo.TableDiningStatusVO;
 import shop.alien.entity.store.vo.*;
 
 import java.util.List;
@@ -13,6 +14,14 @@ import java.util.List;
 public interface DiningService {
 
     /**
+     * 查询餐桌是否处于就餐中(就餐人数是否有数据),免登录可调用
+     *
+     * @param tableId 桌号ID
+     * @return 就餐状态(inDining、dinerCount)
+     */
+    TableDiningStatusVO getTableDiningStatus(Integer tableId);
+
+    /**
      * 获取点餐页面信息
      *
      * @param tableId 桌号ID

+ 38 - 4
alien-dining/src/main/java/shop/alien/dining/service/impl/DiningServiceImpl.java

@@ -46,6 +46,21 @@ public class DiningServiceImpl implements DiningService {
     private final shop.alien.dining.service.OrderLockService orderLockService;
 
     @Override
+    public TableDiningStatusVO getTableDiningStatus(Integer tableId) {
+        if (tableId == null) {
+            return new TableDiningStatusVO(null, false, null);
+        }
+        StoreTable table = storeTableMapper.selectById(tableId);
+        if (table == null) {
+            return new TableDiningStatusVO(tableId, false, null);
+        }
+        boolean inDining = Integer.valueOf(1).equals(table.getStatus())
+                && table.getDinerCount() != null && table.getDinerCount() > 0;
+        Integer dinerCount = inDining ? table.getDinerCount() : null;
+        return new TableDiningStatusVO(tableId, inDining, dinerCount);
+    }
+
+    @Override
     public DiningPageInfoVO getDiningPageInfo(Integer tableId, Integer dinerCount) {
         log.info("获取点餐页面信息, tableId={}, dinerCount={}", tableId, dinerCount);
         StoreTable table = storeTableMapper.selectById(tableId);
@@ -58,6 +73,23 @@ public class DiningServiceImpl implements DiningService {
             throw new RuntimeException("门店不存在");
         }
 
+        // 第一个用户:传入用餐人数时,将餐桌置为就餐中并保存就餐人数
+        if (dinerCount != null && dinerCount > 0) {
+            table.setStatus(1); // 就餐中
+            table.setDinerCount(dinerCount);
+            storeTableMapper.updateById(table);
+            log.info("首客选桌并填写用餐人数, tableId={}, dinerCount={}, 餐桌状态已置为就餐中", tableId, dinerCount);
+        } else {
+            // 第二个及后续用户:若餐桌已就餐中且表内已有就餐人数,直接使用
+            if (Integer.valueOf(1).equals(table.getStatus()) && table.getDinerCount() != null && table.getDinerCount() > 0) {
+                dinerCount = table.getDinerCount();
+                log.info("餐桌已就餐中,使用已保存的就餐人数, tableId={}, dinerCount={}", tableId, dinerCount);
+            } else {
+                // 餐桌空闲且未传就餐人数时要求必填
+                throw new RuntimeException("请选择用餐人数");
+            }
+        }
+
         DiningPageInfoVO vo = new DiningPageInfoVO();
         vo.setStoreName(storeInfo.getStoreName());
         vo.setTableNumber(table.getTableNumber());
@@ -291,8 +323,10 @@ public class DiningServiceImpl implements DiningService {
     public OrderConfirmVO getOrderConfirmInfo(Integer tableId, Integer dinerCount, Integer userId) {
         log.info("获取订单确认页面信息, tableId={}, dinerCount={}, userId={}", tableId, dinerCount, userId);
 
-        // 获取点餐页面信息
+        // 获取点餐页面信息(就餐中且未传人数时,内部会使用桌台已保存的就餐人数)
         DiningPageInfoVO pageInfo = getDiningPageInfo(tableId, dinerCount);
+        int effectiveDinerCount = pageInfo.getDinerCount() != null && pageInfo.getDinerCount() > 0
+                ? pageInfo.getDinerCount() : (dinerCount != null ? dinerCount : 0);
 
         // 获取购物车
         CartDTO cart = cartService.getCart(tableId);
@@ -304,7 +338,7 @@ public class DiningServiceImpl implements DiningService {
         OrderConfirmVO vo = new OrderConfirmVO();
         vo.setStoreName(pageInfo.getStoreName());
         vo.setTableNumber(pageInfo.getTableNumber());
-        vo.setDinerCount(dinerCount);
+        vo.setDinerCount(pageInfo.getDinerCount() != null ? pageInfo.getDinerCount() : dinerCount);
         // 联系电话和备注由前端传入,这里不设置默认值
         vo.setItems(cart.getItems());
         vo.setTotalAmount(cart.getTotalAmount());
@@ -314,8 +348,8 @@ public class DiningServiceImpl implements DiningService {
         // 计算餐具费(默认1元/人)
         BigDecimal tablewareUnitPrice = new BigDecimal("1.00");
         BigDecimal tablewareFee = BigDecimal.ZERO;
-        if (dinerCount != null && dinerCount > 0) {
-            tablewareFee = tablewareUnitPrice.multiply(BigDecimal.valueOf(dinerCount));
+        if (effectiveDinerCount > 0) {
+            tablewareFee = tablewareUnitPrice.multiply(BigDecimal.valueOf(effectiveDinerCount));
         }
         vo.setTablewareFee(tablewareFee);
         vo.setTablewareUnitPrice(tablewareUnitPrice);

+ 6 - 1
alien-dining/src/main/java/shop/alien/dining/service/impl/StoreOrderServiceImpl.java

@@ -542,7 +542,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         // 清除优惠券使用标记
         cartService.clearCouponUsed(order.getTableId());
 
-        // 更新桌号状态(检查购物车是否为空,如果为空则设为空闲)
+        // 更新桌号状态(检查购物车是否为空,如果为空则设为空闲并清空就餐人数
         StoreTable table = storeTableMapper.selectById(order.getTableId());
         if (table != null) {
             table.setCurrentOrderId(null);
@@ -550,6 +550,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
             CartDTO cart = cartService.getCart(order.getTableId());
             if (cart.getItems() == null || cart.getItems().isEmpty()) {
                 table.setStatus(0); // 空闲
+                table.setDinerCount(null);
             } else {
                 // 购物车还有商品,保持当前状态或设为就餐中
                 table.setStatus(1); // 就餐中
@@ -936,6 +937,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         if (table != null) {
             table.setCurrentOrderId(null);
             table.setStatus(0); // 空闲
+            table.setDinerCount(null);
             storeTableMapper.updateById(table);
         }
 
@@ -969,6 +971,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         if (table != null) {
             table.setCurrentOrderId(null);
             table.setStatus(0); // 空闲
+            table.setDinerCount(null);
             storeTableMapper.updateById(table);
         }
 
@@ -1245,6 +1248,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
                 .set(StoreTable::getCartItemCount, 0)
                 .set(StoreTable::getCartTotalAmount, BigDecimal.ZERO)
                 .set(StoreTable::getStatus, 0)  // 空闲
+                .set(StoreTable::getDinerCount, null)  // 清空就餐人数
                 .set(StoreTable::getUpdatedTime, new Date());
         Integer userId = TokenUtil.getCurrentUserId();
         if (userId != null) {
@@ -1303,6 +1307,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
                 .set(StoreTable::getCartItemCount, 0)
                 .set(StoreTable::getCartTotalAmount, BigDecimal.ZERO)
                 .set(StoreTable::getStatus, 0)  // 空闲
+                .set(StoreTable::getDinerCount, null)  // 清空就餐人数
                 .set(StoreTable::getUpdatedTime, new Date());
         Integer userId = TokenUtil.getCurrentUserId();
         if (userId != null) {

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

@@ -57,6 +57,10 @@ public class StoreTable {
     @TableField("status")
     private Integer status;
 
+    @ApiModelProperty(value = "当前就餐人数(就餐中时由首客填写,后续用户共用)")
+    @TableField("diner_count")
+    private Integer dinerCount;
+
     @ApiModelProperty(value = "备注")
     @TableField("remark")
     private String remark;

+ 32 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/TableDiningStatusVO.java

@@ -0,0 +1,32 @@
+package shop.alien.entity.store.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 餐桌是否处于就餐中(免登录查询)VO
+ *
+ * @author system
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(value = "TableDiningStatusVO", description = "餐桌就餐状态(是否就餐中、就餐人数)")
+public class TableDiningStatusVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "桌号ID")
+    private Integer tableId;
+
+    @ApiModelProperty(value = "是否处于就餐中(true=就餐中且已有就餐人数数据)")
+    private Boolean inDining;
+
+    @ApiModelProperty(value = "当前就餐人数,非就餐中时为null")
+    private Integer dinerCount;
+}

+ 16 - 2
alien-store/src/main/java/shop/alien/store/controller/DiningServiceController.java

@@ -49,13 +49,27 @@ public class DiningServiceController {
 
     // ==================== 点餐相关接口 ====================
 
-    @ApiOperation(value = "获取点餐页面信息", notes = "获取店铺名称、桌号、就餐人数等信息")
+    @ApiOperation(value = "查询餐桌是否处于就餐中", notes = "免登录可调用,返回 inDining、dinerCount,供前端判断是否跳过选择用餐人数")
+    @ApiOperationSupport(order = 0)
+    @GetMapping("/table-dining-status")
+    public R<TableDiningStatusVO> getTableDiningStatus(
+            @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId) {
+        try {
+            log.info("查询餐桌就餐状态: tableId={}", tableId);
+            return diningServiceFeign.getTableDiningStatus(tableId);
+        } catch (Exception e) {
+            log.error("查询餐桌就餐状态失败: {}", e.getMessage(), e);
+            return R.fail("查询餐桌就餐状态失败: " + e.getMessage());
+        }
+    }
+
+    @ApiOperation(value = "获取点餐页面信息", notes = "首客选桌时传就餐人数;餐桌已就餐中时可不传就餐人数,将使用已保存人数")
     @ApiOperationSupport(order = 1)
     @GetMapping("/page-info")
     public R<DiningPageInfoVO> getDiningPageInfo(
             HttpServletRequest request,
             @ApiParam(value = "桌号ID", required = true) @RequestParam Integer tableId,
-            @ApiParam(value = "就餐人数", required = true) @RequestParam Integer dinerCount) {
+            @ApiParam(value = "就餐人数(首客必传;餐桌已就餐中时可省略)") @RequestParam(required = false) Integer dinerCount) {
         try {
             String authorization = getAuthorization(request);
             log.info("获取点餐页面信息: tableId={}, dinerCount={}", tableId, dinerCount);

+ 11 - 2
alien-store/src/main/java/shop/alien/store/feign/DiningServiceFeign.java

@@ -27,18 +27,27 @@ public interface DiningServiceFeign {
     // ==================== 点餐相关接口 ====================
 
     /**
+     * 查询餐桌是否处于就餐中(免登录可调用)
+     *
+     * @param tableId 桌号ID
+     * @return R.data 为 TableDiningStatusVO(inDining、dinerCount)
+     */
+    @GetMapping("/store/dining/table-dining-status")
+    R<TableDiningStatusVO> getTableDiningStatus(@RequestParam("tableId") Integer tableId);
+
+    /**
      * 获取点餐页面信息
      *
      * @param authorization 请求头 Authorization,供 dining 解析当前用户
      * @param tableId       桌号ID
-     * @param dinerCount    就餐人数
+     * @param dinerCount    就餐人数(首客必传;餐桌已就餐中时可省略)
      * @return R.data 为 DiningPageInfoVO
      */
     @GetMapping("/store/dining/page-info")
     R<DiningPageInfoVO> getDiningPageInfo(
             @RequestHeader(value = "Authorization", required = false) String authorization,
             @RequestParam("tableId") Integer tableId,
-            @RequestParam("dinerCount") Integer dinerCount);
+            @RequestParam(value = "dinerCount", required = false) Integer dinerCount);
 
     /**
      * 搜索菜品

+ 21 - 6
alien-store/src/main/java/shop/alien/store/service/impl/CommonCommentServiceImpl.java

@@ -195,7 +195,7 @@ public class CommonCommentServiceImpl extends ServiceImpl<CommonCommentMapper, C
 
         Integer i = commonCommentMapper.selectCount(queryWrapper);
         map.put("commentCount", i);
-        getOtherDataWithSourceType(sourceId, sourceType, userId, map);
+        getOtherDataWithSourceType(sourceId, sourceType, userId, userType, map);
         return map;
     }
 
@@ -263,7 +263,7 @@ public class CommonCommentServiceImpl extends ServiceImpl<CommonCommentMapper, C
     }
 
 
-    private void getOtherDataWithSourceType(Integer sourceId, Integer sourceType, String userId, Map<String, Object> map) {
+    private void getOtherDataWithSourceType(Integer sourceId, Integer sourceType, String userId, String userType, Map<String, Object> map) {
         if ( sourceType == CommentSourceTypeEnum.DYNAMIC_COMMENT.getType() ) {
             // 1.计算分析数和喜欢数
             LifeUserDynamics lifeUserDynamics = lifeUserDynamicsMapper.selectOne(new QueryWrapper<LifeUserDynamics>().eq("id", sourceId));
@@ -277,11 +277,26 @@ public class CommonCommentServiceImpl extends ServiceImpl<CommonCommentMapper, C
             // 2.查询商家头像 TODO -> 动态发布的时候id不应该用Store_phone的格式,来不及重构动态的位置,后续等有缘人吧
             StoreUser storeUser = storeUserMapper.selectOne(new QueryWrapper<StoreUser>().eq("phone", lifeUserDynamics.getPhoneId().split("_")[1]));
             map.put("userImage",storeUser.getHeadImg()!= null?storeUser.getHeadImg():"");
-            LifeUser lifeUser = lifeUserMapper.selectById(userId);
+            String fansId = "";
+            int fansType = 1;
+            if ("user".equals(userType)) {
+                LifeUser lifeUser = lifeUserMapper.selectById(userId);
+                if (lifeUser != null) {
+                    fansId = "user_".concat(lifeUser.getUserPhone());
+                    fansType = 1;
+                }
+            } else {
+                StoreUser currentStoreUser = storeUserMapper.selectById(userId);
+                if (currentStoreUser != null) {
+                    fansId = "store_".concat(currentStoreUser.getPhone());
+                    fansType = 2;
+                }
+            }
+
             // 3.查询当前用户是否喜欢
             LifeLikeRecord lifeLikeRecord = lifeLikeRecordMapper.selectOne(new QueryWrapper<LifeLikeRecord>()
                     .eq("type", CommonConstant.LIKE_TYPE_DYNAMICS)
-                    .eq("dianzan_id", "user_".concat(lifeUser.getUserPhone()))
+                    .eq("dianzan_id", fansId)
                     .eq("huifu_id", sourceId)
                     .eq("delete_flag", 0));
             if(null != lifeLikeRecord){
@@ -292,8 +307,8 @@ public class CommonCommentServiceImpl extends ServiceImpl<CommonCommentMapper, C
             // 4.查询当前登录人是否关注了动态发布者
 
             LifeFans lifeFans = lifeFansMapper.selectOne(new QueryWrapper<LifeFans>().eq("followed_id", lifeUserDynamics.getPhoneId())
-                    .eq("fans_id", "user_".concat(lifeUser.getUserPhone()))
-                    .eq("fans_type", 1)
+                    .eq("fans_id", fansId)
+                    .eq("fans_type", fansType)
                     .last("limit 1"));
             if(null != lifeFans){
                 map.put("isFans",1);

+ 1 - 1
alien-store/src/main/java/shop/alien/store/service/impl/StoreStaffConfigServiceImpl.java

@@ -1594,7 +1594,7 @@ public class StoreStaffConfigServiceImpl implements StoreStaffConfigService {
                         titleStaffList.add(staff);
                     }
                 }
-
+                titleStaffList.sort((x,y)->y.getTopTime().compareTo(x.getTopTime()));
                 groupVo.setStaffList(titleStaffList);
                 result.add(groupVo);
             }

+ 2 - 2
alien-store/src/main/java/shop/alien/store/service/impl/WeChatMiniProgramQrCodeServiceImpl.java

@@ -294,7 +294,7 @@ public class WeChatMiniProgramQrCodeServiceImpl implements WeChatMiniProgramQrCo
         String ossPath = String.format("qrcode/table/%d_%d_%d.png", 
                 storeId, tableId, System.currentTimeMillis());
 
-        // 生成二维码并上传
-        return generateQrCodeAndUpload(scene, null, 430, ossPath);
+        // 生成二维码并上传,扫码后打开指定页面
+        return generateQrCodeAndUpload(scene, "pages/index/index", 430, ossPath);
     }
 }

+ 2 - 0
订单系统完整表结构.sql

@@ -178,6 +178,8 @@ CREATE TABLE IF NOT EXISTS `store_order_detail` (
 --   ADD COLUMN `current_coupon_id` int(11) DEFAULT NULL COMMENT '当前使用的优惠券ID' AFTER `current_order_id`,
 --   ADD COLUMN `cart_item_count` int(11) DEFAULT '0' COMMENT '购物车商品数量' AFTER `current_coupon_id`,
 --   ADD COLUMN `cart_total_amount` decimal(10,2) DEFAULT '0.00' COMMENT '购物车总金额' AFTER `cart_item_count`;
+-- 就餐人数(首客选桌时填写,就餐中时后续用户共用;结账/清桌后清空):
+-- ALTER TABLE `store_table` ADD COLUMN `diner_count` int(11) DEFAULT NULL COMMENT '当前就餐人数' AFTER `status`;
 
 -- 新增索引(如果表已存在,请执行以下SQL):
 -- ALTER TABLE `store_table`