diff --git a/src/main/java/com/rj/config/MybatisPlusConfig.java b/src/main/java/com/rj/config/MybatisPlusConfig.java index 3ed8300..9261343 100644 --- a/src/main/java/com/rj/config/MybatisPlusConfig.java +++ b/src/main/java/com/rj/config/MybatisPlusConfig.java @@ -61,6 +61,7 @@ public class MybatisPlusConfig { ignoreTables.add("menu"); // 菜单表(不需要租户隔离) ignoreTables.add("ai_prompts"); // AI 提示词全局配置,表无 tenant_id 字段 ignoreTables.add("lb_third_integration_config"); // 每租户一条,按 tenant_id 显式查询,不走插件自动拼接 + ignoreTables.add("lb_buy_account"); // 抢单账号跨租户管理;分页/批量抢单按记录 tenant_id 业务处理 return new TenantLineHandler() { diff --git a/src/main/java/com/rj/mapper/LbBuyAccountMapper.java b/src/main/java/com/rj/mapper/LbBuyAccountMapper.java index 126acd7..821f74f 100644 --- a/src/main/java/com/rj/mapper/LbBuyAccountMapper.java +++ b/src/main/java/com/rj/mapper/LbBuyAccountMapper.java @@ -5,13 +5,29 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.rj.entity.LbBuyAccount; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import java.time.LocalDateTime; +import java.util.List; @Mapper public interface LbBuyAccountMapper extends BaseMapper { + /** + * 按主键批量查询;跳过多租户拦截,避免 rushBuyByIds 因当前租户上下文过滤查不到账号。 + */ + @InterceptorIgnore(tenantLine = "true") + @Select(""" + + """) + List selectByIdsIgnoreTenant(@Param("ids") List ids); + /** * 按主键更新抢单结果与时间;跳过多租户拦截,避免批量抢单 worker 线程无租户上下文导致更新 0 行。 */ diff --git a/src/main/java/com/rj/service/impl/LbBuyAccountServiceImpl.java b/src/main/java/com/rj/service/impl/LbBuyAccountServiceImpl.java index 7bed786..52b0e1a 100644 --- a/src/main/java/com/rj/service/impl/LbBuyAccountServiceImpl.java +++ b/src/main/java/com/rj/service/impl/LbBuyAccountServiceImpl.java @@ -143,12 +143,12 @@ public class LbBuyAccountServiceImpl } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (tenantId != null && !tenantId.trim().isEmpty()) { - queryWrapper.eq(LbBuyAccount::getTenantId, tenantId.trim()); - } - if (tenantName != null && !tenantName.trim().isEmpty()) { - queryWrapper.like(LbBuyAccount::getTenantName, tenantName.trim()); - } +// if (tenantId != null && !tenantId.trim().isEmpty()) { +// queryWrapper.eq(LbBuyAccount::getTenantId, tenantId.trim()); +// } +// if (tenantName != null && !tenantName.trim().isEmpty()) { +// queryWrapper.like(LbBuyAccount::getTenantName, tenantName.trim()); +// } if (loginAccount != null && !loginAccount.trim().isEmpty()) { queryWrapper.like(LbBuyAccount::getLoginAccount, loginAccount.trim()); } @@ -223,7 +223,7 @@ public class LbBuyAccountServiceImpl return result; } - List accounts = this.listByIds(normalizedIds); + List accounts = baseMapper.selectByIdsIgnoreTenant(normalizedIds); Map accountMap = new LinkedHashMap<>(); for (LbBuyAccount account : accounts) { if (account != null && account.getId() != null) { diff --git a/src/main/java/com/rj/service/impl/LbPurchaseApplyServiceImpl.java b/src/main/java/com/rj/service/impl/LbPurchaseApplyServiceImpl.java index 934fc35..d1943e8 100644 --- a/src/main/java/com/rj/service/impl/LbPurchaseApplyServiceImpl.java +++ b/src/main/java/com/rj/service/impl/LbPurchaseApplyServiceImpl.java @@ -13,13 +13,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.databind.ObjectMapper; import com.rj.dto.hxr.HxrAdminUserApiContext; import com.rj.dto.hxr.HxrUserRow; -import com.rj.entity.LbDailyUserTrade; import com.rj.entity.LbDailyUserTradeReport; import com.rj.entity.LbOrderRow; import com.rj.entity.LbPurchaseApply; import com.rj.entity.LbUser; import com.rj.util.IsoWorkdayUtils; -import com.rj.mapper.LbDailyUserTradeMapper; import com.rj.mapper.LbDailyUserTradeReportMapper; import com.rj.mapper.LbOrderRowMapper; import com.rj.mapper.LbPurchaseApplyMapper; @@ -67,9 +65,6 @@ public class LbPurchaseApplyServiceImpl @Autowired private LbDailyUserTradeReportMapper lbDailyUserTradeReportMapper; - @Autowired - private LbDailyUserTradeMapper lbDailyUserTradeMapper; - @Autowired private HxrAdminUserService hxrAdminUserService; @@ -1025,7 +1020,7 @@ public class LbPurchaseApplyServiceImpl } HxrAdminUserApiContext apiContext = apiContextOpt.get(); - Set tradeMatchedNicknames = ctx.tradeMatchedNicknames(); + Set tradeMatchedApplyPhones = ctx.tradeMatchedApplyPhones(); List> details = new ArrayList<>(); int ok = 0; int fail = 0; @@ -1037,7 +1032,7 @@ public class LbPurchaseApplyServiceImpl one.put("applyUserName", applyUserName); String phone = row.getColleaguePhone() != null ? row.getColleaguePhone().trim() : ""; one.put("colleaguePhone", phone); - String skipReason = colleagueVipSkipReason(row, tradeMatchedNicknames); + String skipReason = colleagueVipSkipReason(row, tradeMatchedApplyPhones); if (skipReason != null) { one.put("success", false); one.put("message", skipReason); @@ -1118,7 +1113,7 @@ public class LbPurchaseApplyServiceImpl List exportRows = new ArrayList<>(); for (LbPurchaseApply row : ctx.rows()) { - if (colleagueVipSkipReason(row, ctx.tradeMatchedNicknames()) == null) { + if (colleagueVipSkipReason(row, ctx.tradeMatchedApplyPhones()) == null) { exportRows.add(row); } } @@ -1187,7 +1182,7 @@ public class LbPurchaseApplyServiceImpl private record ColleagueVipContext( String validationError, List rows, - Set tradeMatchedNicknames) {} + Set tradeMatchedApplyPhones) {} private ColleagueVipContext resolveColleagueVipContext( LocalDate applyDateStart, LocalDate applyDateEnd, String tenantId) { @@ -1210,36 +1205,46 @@ public class LbPurchaseApplyServiceImpl rows = List.of(); } - Set applyUserNames = new HashSet<>(); + Set applyPhones = new HashSet<>(); for (LbPurchaseApply row : rows) { - if (row.getColleagueName() != null && !row.getColleagueName().trim().isEmpty() - && row.getApplyUser() != null && !row.getApplyUser().trim().isEmpty()) { - applyUserNames.add(row.getApplyUser().trim()); + String applyPhone = trimToNull(row.getApplyPhone()); + if (applyPhone != null) { + applyPhones.add(applyPhone); } } - Set tradeMatchedNicknames = new HashSet<>(); - if (!applyUserNames.isEmpty()) { - LambdaQueryWrapper tradeQuery = new LambdaQueryWrapper<>(); - tradeQuery.eq(LbDailyUserTrade::getTenantId, tenantId.trim()) - .in(LbDailyUserTrade::getNickname, applyUserNames) - .select(LbDailyUserTrade::getNickname); - List matchedTrades = lbDailyUserTradeMapper.selectList(tradeQuery); - for (LbDailyUserTrade trade : matchedTrades) { - if (trade.getNickname() != null && !trade.getNickname().trim().isEmpty()) { - tradeMatchedNicknames.add(trade.getNickname().trim()); + Set tradeMatchedApplyPhones = new HashSet<>(); + if (!applyPhones.isEmpty()) { + String buyTimeStart = applyDateStart.atStartOfDay().format(ORDER_DAY_TIME_FMT); + String buyTimeEnd = applyDateEnd.atTime(23, 59, 59).format(ORDER_DAY_TIME_FMT); + LambdaQueryWrapper orderQuery = new LambdaQueryWrapper<>(); + orderQuery.eq(LbOrderRow::getTenantId, tenantId.trim()) + .eq(LbOrderRow::getDataType, ORDER_DATA_TYPE_DETAIL) + .ge(LbOrderRow::getBuyTime, buyTimeStart) + .le(LbOrderRow::getBuyTime, buyTimeEnd) + .in(LbOrderRow::getBuyerPhone, applyPhones) + .isNotNull(LbOrderRow::getPayTime) + .select(LbOrderRow::getBuyerPhone); + List orderRows = lbOrderRowMapper.selectList(orderQuery); + if (orderRows != null) { + for (LbOrderRow orderRow : orderRows) { + + String buyerPhone = trimToNull(orderRow.getBuyerPhone()); + if (buyerPhone != null) { + tradeMatchedApplyPhones.add(buyerPhone); + } } } } - return new ColleagueVipContext(null, rows, tradeMatchedNicknames); + return new ColleagueVipContext(null, rows, tradeMatchedApplyPhones); } - private static String colleagueVipSkipReason(LbPurchaseApply row, Set tradeMatchedNicknames) { - String applyUserName = row.getApplyUser() != null ? row.getApplyUser().trim() : ""; - if (applyUserName.isEmpty()) { - return "colleague_name 为空,跳过"; + private static String colleagueVipSkipReason(LbPurchaseApply row, Set tradeMatchedApplyPhones) { + String applyPhone = row.getApplyPhone() != null ? row.getApplyPhone().trim() : ""; + if (applyPhone.isEmpty()) { + return "apply_phone 为空,跳过"; } - if (!tradeMatchedNicknames.contains(applyUserName)) { - return "申请人姓名在 lb_daily_user_trade 中未找到 ,说明今天没进货 ,推荐人不能享受特权,跳过开通特权"; + if (!tradeMatchedApplyPhones.contains(applyPhone)) { + return "申请人手机号在 lb_order_row(buyer_phone)中未找到已支付订单,说明未进货,推荐人不能享受特权,跳过开通特权"; } String phone = row.getColleaguePhone() != null ? row.getColleaguePhone().trim() : ""; if (phone.isEmpty()) {