diff --git a/.workbuddy/memory/2026-04-21.md b/.workbuddy/memory/2026-04-21.md new file mode 100644 index 0000000..7bb7332 --- /dev/null +++ b/.workbuddy/memory/2026-04-21.md @@ -0,0 +1,18 @@ +# 2026-04-21 日志 + +## WxLoginController.getOrderQRCodeUnlimited 修复(完整) + +### 根因 +1. `extractTenantIdFromScene` 通过 `selectByIdIgnoreTenant` 反查用户获取 tenantId,userId=35280 在多租户下有2条记录 → `TooManyResultsException` +2. 异常被 catch 后 fallback 到默认租户 10550,Redis 中无 `mp-weixin:10550` 缓存 → 最终失败 +3. 第 452 行 `website.getRunning().equals(2)` 存在 NPE 风险 + +### 修复内容 +- **后端 WxLoginController**: scene 格式改为 `uid_userId_tenantId`,优先从 scene 直接解析 tenantId;兼容旧 `uid_userId` 格式时改用 `selectList` 避免多条记录异常 +- **后端 UserMapper/UserService**: `selectByIdIgnoreTenant` 返回类型从 `User` 改为 `List`;新增 `listByIdIgnoreTenant` 方法 +- **后端 NPE 修复**: `website.getRunning().equals(2)` → `website != null && Integer.valueOf(2).equals(website.getRunning())` +- **前端 3 个 vue**: scene 从 `uid_${userId}` 改为 `uid_${userId}_${tenantId}`(从 tenantStore.company.tenantId 获取) + - shopDealerUser/index.vue + - shopDealerUserShop/index.vue + - shopDealerUserDelivery/index.vue + diff --git a/src/main/java/com/gxwebsoft/common/system/controller/WxLoginController.java b/src/main/java/com/gxwebsoft/common/system/controller/WxLoginController.java index 9ed476a..533bb03 100644 --- a/src/main/java/com/gxwebsoft/common/system/controller/WxLoginController.java +++ b/src/main/java/com/gxwebsoft/common/system/controller/WxLoginController.java @@ -40,6 +40,7 @@ import java.io.File; import java.io.IOException; import java.time.Instant; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit; @@ -449,7 +450,7 @@ public class WxLoginController extends BaseController { // 判断应用运行状态 final CmsWebsite website = cmsWebsiteService.getByTenantId(tenantId); - if(website.getRunning().equals(2)){ + if(website != null && Integer.valueOf(2).equals(website.getRunning())){ map.put("check_path",false); map.put("env_version","trial"); } @@ -725,26 +726,43 @@ public class WxLoginController extends BaseController { /** * 从scene参数中提取租户ID - * scene格式可能是: uid_33103 或其他包含用户ID的格式 + * scene格式: uid_userId_tenantId(优先)或 uid_userId(兼容旧格式) */ private Integer extractTenantIdFromScene(String scene) { try { System.out.println("解析scene参数: " + scene); - // 如果scene包含uid_前缀,提取用户ID if (scene != null && scene.startsWith("uid_")) { - String userIdStr = scene.substring(4); // 去掉"uid_"前缀 - Integer userId = Integer.parseInt(userIdStr); - System.out.println("userId = " + userId); + String content = scene.substring(4); // 去掉"uid_"前缀 - // 根据用户ID查询用户信息,获取租户ID - User user = userService.getByIdIgnoreTenant(userId); - System.out.println("user = " + user); - if (user != null) { - System.out.println("从用户ID " + userId + " 获取到租户ID: " + user.getTenantId()); - return user.getTenantId(); - } else { - System.err.println("未找到用户ID: " + userId); + // 优先解析 uid_userId_tenantId 格式 + String[] parts = content.split("_"); + if (parts.length >= 2) { + try { + Integer tenantId = Integer.parseInt(parts[1]); + System.out.println("从scene直接解析到tenantId = " + tenantId); + return tenantId; + } catch (NumberFormatException e) { + System.err.println("scene中tenantId格式异常: " + parts[1]); + } + } + + // 兼容旧格式 uid_userId:根据用户ID查询租户ID + if (parts.length == 1) { + Integer userId = Integer.parseInt(parts[0]); + System.out.println("userId = " + userId); + try { + List users = userService.listByIdIgnoreTenant(userId); + System.out.println("查询到用户数量 = " + (users != null ? users.size() : 0)); + if (users != null && !users.isEmpty()) { + System.out.println("从用户ID " + userId + " 获取到租户ID: " + users.get(0).getTenantId()); + return users.get(0).getTenantId(); + } else { + System.err.println("未找到用户ID: " + userId); + } + } catch (Exception ex) { + System.err.println("查询用户异常: " + ex.getMessage()); + } } } diff --git a/src/main/java/com/gxwebsoft/common/system/mapper/UserMapper.java b/src/main/java/com/gxwebsoft/common/system/mapper/UserMapper.java index 41c8be0..53b114d 100644 --- a/src/main/java/com/gxwebsoft/common/system/mapper/UserMapper.java +++ b/src/main/java/com/gxwebsoft/common/system/mapper/UserMapper.java @@ -60,7 +60,7 @@ public interface UserMapper extends BaseMapper { * @return User */ @InterceptorIgnore(tenantLine = "true") - User selectByIdIgnoreTenant(@Param("userId") Integer userId); + List selectByIdIgnoreTenant(@Param("userId") Integer userId); @InterceptorIgnore(tenantLine = "true") List pageAdminByPhone(@Param("param") UserParam param); diff --git a/src/main/java/com/gxwebsoft/common/system/service/UserService.java b/src/main/java/com/gxwebsoft/common/system/service/UserService.java index 2230d94..427c471 100644 --- a/src/main/java/com/gxwebsoft/common/system/service/UserService.java +++ b/src/main/java/com/gxwebsoft/common/system/service/UserService.java @@ -117,6 +117,11 @@ public interface UserService extends IService, UserDetailsService { */ User getByIdIgnoreTenant(Integer userId); + /** + * 根据用户ID查询用户列表(忽略租户隔离) + */ + List listByIdIgnoreTenant(Integer userId); + List pageAdminByPhone(UserParam param); List listByAlert(); diff --git a/src/main/java/com/gxwebsoft/common/system/service/impl/UserServiceImpl.java b/src/main/java/com/gxwebsoft/common/system/service/impl/UserServiceImpl.java index b321832..c120579 100644 --- a/src/main/java/com/gxwebsoft/common/system/service/impl/UserServiceImpl.java +++ b/src/main/java/com/gxwebsoft/common/system/service/impl/UserServiceImpl.java @@ -2,6 +2,9 @@ package com.gxwebsoft.common.system.service.impl; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; + +import java.util.Collections; +import java.util.List; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -224,6 +227,15 @@ public class UserServiceImpl extends ServiceImpl implements Us if (userId == null) { return null; } + List users = baseMapper.selectByIdIgnoreTenant(userId); + return users != null && !users.isEmpty() ? users.get(0) : null; + } + + @Override + public List listByIdIgnoreTenant(Integer userId) { + if (userId == null) { + return Collections.emptyList(); + } return baseMapper.selectByIdIgnoreTenant(userId); } diff --git a/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java b/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java index 5a157d9..fceae4c 100644 --- a/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java @@ -878,7 +878,8 @@ public class GltTicketOrderServiceImpl extends ServiceImpl sysUsers = userMapper.selectByIdIgnoreTenant(riderId); + User sysUser = (sysUsers != null && !sysUsers.isEmpty()) ? sysUsers.get(0) : null; if (sysUser != null) { newDealerUser.setRealName(sysUser.getRealName() != null ? sysUser.getRealName() : sysUser.getNickname()); newDealerUser.setMobile(sysUser.getPhone()); diff --git a/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java b/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java index 25b2b37..1197fab 100644 --- a/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java +++ b/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java @@ -620,7 +620,8 @@ public class DealerOrderSettlement10584Task { newDealerUser.setTotalMoney(BigDecimal.ZERO); // 尽量补齐基础信息,避免表字段 NOT NULL 导致插入失败(插入失败会让门店分佣“找到了人但入不了账”)。 try { - User sysUser = userMapper.selectByIdIgnoreTenant(dealerUserId); + List sysUsers = userMapper.selectByIdIgnoreTenant(dealerUserId); + User sysUser = (sysUsers != null && !sysUsers.isEmpty()) ? sysUsers.get(0) : null; if (sysUser != null) { newDealerUser.setRealName(sysUser.getRealName() != null ? sysUser.getRealName() : sysUser.getNickname()); newDealerUser.setMobile(sysUser.getPhone());