peng
3 天以前 bdf04af3958fb7a61f3180aa1efb795ba8ac00d2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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("执行完成:会员地址同步完成");
    }
 
}