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<Member> updateList = new ArrayList<>();
|
List<Member> 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<String> memberIds = list.stream().map(Member::getId).collect(Collectors.toList());
|
if (CollectionUtils.isNotEmpty(memberIds)) {
|
List<MemberAddress> 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<String, MemberAddress> 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("执行完成:会员地址同步完成");
|
}
|
|
}
|