From 24a1e3e34889fad5fe4631396f4525c1dbb66a05 Mon Sep 17 00:00:00 2001 From: tianyongbao Date: Sat, 18 Apr 2026 16:06:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E7=BB=99=E8=AE=BE=E5=A4=87=E5=85=85?= =?UTF-8?q?=E5=80=BC=EF=BC=8C=E5=8E=BB=E6=8E=89=E8=AE=BE=E5=A4=87=E5=BD=92?= =?UTF-8?q?=E5=B1=9E=E7=94=A8=E6=88=B7=E9=99=90=E5=88=B6=EF=BC=8C=E5=85=81?= =?UTF-8?q?=E8=AE=B8=E7=BB=99=E5=AD=90=E8=B4=A6=E5=8F=B7=E5=85=85=E5=80=BC?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PayOrderBusinessServiceImpl.java | 50 ++++++++++++++++--- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/intc-modules/intc-weixin/src/main/java/com/intc/weixin/service/impl/PayOrderBusinessServiceImpl.java b/intc-modules/intc-weixin/src/main/java/com/intc/weixin/service/impl/PayOrderBusinessServiceImpl.java index 45a7a5f..d6361ed 100644 --- a/intc-modules/intc-weixin/src/main/java/com/intc/weixin/service/impl/PayOrderBusinessServiceImpl.java +++ b/intc-modules/intc-weixin/src/main/java/com/intc/weixin/service/impl/PayOrderBusinessServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.intc.common.core.exception.ServiceException; +import com.intc.common.tenant.helper.TenantHelper; import com.intc.fishery.constant.DefineDeviceWarnCode; import com.intc.fishery.domain.Device; import com.intc.fishery.domain.PayDevice; @@ -24,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; /** * 支付订单业务服务实现 @@ -54,14 +56,50 @@ public class PayOrderBusinessServiceImpl implements PayOrderBusinessService { throw new ServiceException("支付选项不存在"); } - // 2. 验证设备归属 - List devices = deviceMapper.selectList( - new LambdaQueryWrapper() - .in(Device::getId, deviceIds) - .eq(Device::getUserId, userId) + // 2. 去重设备ID(防止前端传入重复ID导致 size 不匹配) + List uniqueDeviceIds = deviceIds.stream().distinct().collect(Collectors.toList()); + if (uniqueDeviceIds.size() != deviceIds.size()) { + log.warn("设备ID列表存在重复,原始数量={},去重后数量={}", deviceIds.size(), uniqueDeviceIds.size()); + } + + // 3. 验证设备归属(忽略租户过滤,因为设备可能由IOT模块写入,租户ID可能不一致) + List devices = TenantHelper.ignore(() -> + deviceMapper.selectList( + new LambdaQueryWrapper() + .in(Device::getId, uniqueDeviceIds) +// .eq(Device::getUserId, userId) + ) ); - if (devices == null || devices.size() != deviceIds.size()) { + if (devices == null || devices.size() != uniqueDeviceIds.size()) { + // 诊断日志:定位具体缺失的设备 + Set foundIds = devices != null + ? devices.stream().map(Device::getId).collect(Collectors.toSet()) + : Collections.emptySet(); + List missingIds = uniqueDeviceIds.stream() + .filter(id -> !foundIds.contains(id)) + .collect(Collectors.toList()); + log.error("设备归属验证失败: userId={}, 请求设备数={}, 找到设备数={}, 缺失设备ID={}", + userId, uniqueDeviceIds.size(), devices != null ? devices.size() : 0, missingIds); + + // 进一步诊断:检查缺失设备是否存在于数据库(不限制userId) + if (!missingIds.isEmpty()) { + List existDevices = TenantHelper.ignore(() -> + deviceMapper.selectList( + new LambdaQueryWrapper() + .in(Device::getId, missingIds) + ) + ); + if (existDevices != null && !existDevices.isEmpty()) { + for (Device d : existDevices) { + log.error("设备存在但不属于当前用户: deviceId={}, deviceUserId={}, currentUserId={}, tenantId={}", + d.getId(), d.getUserId(), userId, d.getTenantId()); + } + } else { + log.error("设备在数据库中不存在: missingIds={}", missingIds); + } + } + throw new ServiceException("部分设备不存在或无权限操作"); }