package cn.lili.job; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberAddress; import cn.lili.modules.member.mapper.MemberAddressMapper; import cn.lili.modules.member.mapper.MemberMapper; import cn.lili.modules.member.service.MemberService; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.RequiredArgsConstructor; import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * lmk-shop-java * 会员相关任务 * @author : zxl * @date : 2025-09-04 16:49 **/ @Component @RequiredArgsConstructor public class MemberJob { private final MemberMapper memberMapper; private final MemberService memberService; private final MemberAddressMapper memberAddressMapper; /** * 每日任务同步用户地址 * * @throws Exception */ @XxlJob("everyDayExecuteJobHandlerAsyncMemberAddress") public void everyDayExecuteJobHandlerAsyncMemberAddress() throws Exception { XxlJobHelper.log("开始执行每日任务:会员地址同步"); List updateList = new ArrayList<>(); List list = new LambdaQueryChainWrapper<>(memberMapper) // 查询region为空的记录 .and(wrapper -> wrapper .isNull(Member::getRegion) // region 为 NULL .or() // 或者 .eq(Member::getRegion, "") // region 为空字符串 ) .and(wrapper -> wrapper .isNull(Member::getRegionId) // region_id 为 NULL .or() // 或者 .eq(Member::getRegionId, "") // region_id 为空字符串 ) .eq(Member::getDeleteFlag,Boolean.FALSE) .list(); if (CollectionUtils.isNotEmpty(list)) { List memberIds = list.stream().map(Member::getId).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(memberIds)) { List addresses = new LambdaQueryChainWrapper<>(memberAddressMapper) .in(MemberAddress::getMemberId, memberIds) // 查询指定 memberIds 的地址 .eq(MemberAddress::getDeleteFlag, Boolean.FALSE) // 逻辑删除字段,假设 0 表示未删除 .orderByDesc(MemberAddress::getIsDefault) // 优先返回默认地址(is_default=1 的排在前面) .orderByDesc(MemberAddress::getCreateTime) // 然后按时间降序排列 .list(); Map firstAddressByMember = addresses.stream() .collect(Collectors.toMap( MemberAddress::getMemberId, address -> address, (existing, replacement) -> existing // 如果已有该 member 的地址,保留第一个(由于排序,第一个就是优先级最高的) )); for (Member member : list) { MemberAddress address = firstAddressByMember.get(member.getId()); if (address != null) { member.setRegion(address.getConsigneeAddressPath()); member.setRegionId(address.getConsigneeAddressIdPath()); updateList.add(member); } else { // 可选:处理无地址的情况(如日志记录、跳过更新等) XxlJobHelper.log("会员{}没有对应的地址记录,不更新region信息", member.getId()); } } System.out.println("打印需要修改的集合--------------------"); System.out.println(updateList); memberService.updateBatchById(list); } } // 修改 XxlJobHelper.log("执行完成:会员地址同步完成"); } }