mitao
9 天以前 fad1b886464f52e88dd9b99a62b9cd89fd5bb8c2
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
package com.panzhihua.sangeshenbian.service.impl;
 
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.panzhihua.common.exceptions.ServiceException;
import com.panzhihua.common.model.vos.LoginUserInfoVO;
import com.panzhihua.common.redis.RedisUtils;
import com.panzhihua.sangeshenbian.model.dto.UserIdentityDTO;
import com.panzhihua.sangeshenbian.model.entity.PartyMember;
import com.panzhihua.sangeshenbian.model.entity.SystemUser;
import com.panzhihua.sangeshenbian.model.entity.SystemUserLevel;
import com.panzhihua.sangeshenbian.service.IPartyMemberService;
import com.panzhihua.sangeshenbian.service.ISystemUserLevelService;
import com.panzhihua.sangeshenbian.service.ISystemUserService;
import com.panzhihua.sangeshenbian.service.IdentityInformationService;
import com.panzhihua.sangeshenbian.warpper.IdentityInformation;
import com.panzhihua.sangeshenbian.warpper.PermissionsVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
 
@RequiredArgsConstructor
@Service
public class IdentityInformationServiceImpl implements IdentityInformationService {
    private final ISystemUserService systemUserService;
    private final IPartyMemberService partyMemberService;
    private final RedisUtils redisUtils;
    private final ISystemUserLevelService systemUserLevelService;
 
    @Override
    public IdentityInformation getIdentityInformation(LoginUserInfoVO loginUserInfo) {
        String phone = loginUserInfo.getPhone();
        // 获取党员信息
        PartyMember partyMember = partyMemberService.getOne(new LambdaQueryWrapper<PartyMember>()
                .eq(PartyMember::getPhone, phone)
                .eq(PartyMember::getDelFlag, 0));
 
        // 获取管理员信息
        SystemUser systemUser = systemUserService.lambdaQuery()
                .eq(SystemUser::getPhone, phone)
                .last("LIMIT 1")
                .ne(SystemUser::getStatus, 3)
                .one();
        // 获取身份
        UserIdentityDTO userIdentityDTO = (UserIdentityDTO) redisUtils.get("identity:" + phone);
        // 权限列表
        List<PermissionsVO> permissions = new ArrayList<>();
 
        IdentityInformation identityInformationVO = new IdentityInformation();
        identityInformationVO.setPartyMember(partyMember);
        identityInformationVO.setSystemUser(systemUser);
 
        // 获取提示内容是否确认
        Integer isConfirm = (Integer) redisUtils.get("confirmContent:" + phone);
        identityInformationVO.setIsConfirmContent(isConfirm != null && isConfirm == 1);
 
        // 获取当前身份
        if (userIdentityDTO == null){
            handleSystemUserLevelId(phone, systemUser, 2, identityInformationVO, partyMember);
        }else {
            Integer identity = userIdentityDTO.getIdentity();
            identityInformationVO.setIdentity(identity);
            if (identity == 1 && (partyMember == null || partyMember.getAuditStatus() != 1)){
                identityInformationVO.setIdentity(null);
                redisUtils.remove("identity:" + phone);
            }else if (identity == 2 && systemUser == null){
                identityInformationVO.setIdentity(null);
                redisUtils.remove("identity:" + phone);
            }else if (identity == 2){
                Integer levelId = userIdentityDTO.getLevelId();
                //验证账号所属层级
                SystemUserLevel userLevel = systemUserLevelService.getById(levelId);
                if (Objects.isNull(userLevel)) {
                    handleSystemUserLevelId(phone, systemUser, identity, identityInformationVO,partyMember);
                } else {
                    identityInformationVO.setLevelId(levelId);
                    identityInformationVO.setSuperviseFlag(userLevel.getSuperviseFlag());
                    identityInformationVO.setIdentity(identity);
                    identityInformationVO.setSystemUserLevel(userLevel);
                }
            }
        }
 
 
 
        // 获取是否冻结
        if (identityInformationVO.getIdentity() != null) {
            if (identityInformationVO.getIdentity() == 1) {
                identityInformationVO.setIsFrozen(partyMember != null && partyMember.getFreezeStatus() == 1);
            } else if (identityInformationVO.getIdentity() == 2) {
                identityInformationVO.setIsFrozen(systemUser != null && systemUser.getStatus() == 2);
            }
        } else {
            identityInformationVO.setIsFrozen(false);
        }
 
        // 是否认证党员
        identityInformationVO.setIsPartymember(partyMember != null && partyMember.getAuditStatus().equals(1));
        // 是否确认党员信息
        identityInformationVO.setIsConfirm(partyMember != null && partyMember.getIsConfirm() == 1);
        // 党员审核状态
        identityInformationVO.setAuditStatus(partyMember == null ? null : partyMember.getAuditStatus());
 
        // 封装管理员信息
        if (systemUser != null) {
            List<SystemUserLevel> userLevels = systemUserLevelService.getListBySystemUserId(systemUser.getId());
            for (SystemUserLevel userLevel : userLevels) {
                Integer accountLevel = userLevel.getLevel();
                String districts = userLevel.getDistricts();
                String street = userLevel.getStreet();
                String community = userLevel.getCommunity();
                PermissionsVO adminPermissions = new PermissionsVO();
                adminPermissions.setIdentity(2);
                adminPermissions.setIsFrozen(systemUser.getStatus() == 2);
                adminPermissions.setLevelId(userLevel.getId());
                if (accountLevel == 1) {
                    adminPermissions.setName(String.format("%s%s", "攀枝花市", "管理员"));
                } else if (accountLevel == 2) {
                    adminPermissions.setName(String.format("%s%s", districts, "管理员"));
                } else if (accountLevel == 3) {
                    adminPermissions.setName(String.format("%s%s%s", districts, street, "管理员"));
                } else if (accountLevel == 4) {
                    adminPermissions.setName(String.format("%s%s%s%s", districts, street, community, "管理员"));
                } else {
                    adminPermissions.setName("未知");
                }
                permissions.add(adminPermissions);
            }
        }
 
        // 封装党员信息
        if (partyMember != null && partyMember.getAuditStatus().equals(1)) {
            PermissionsVO partyMemberPermissions = new PermissionsVO();
            partyMemberPermissions.setIdentity(1);
            partyMemberPermissions.setName(String.format("%s%s", partyMember.getCommunity(), "党员"));
            partyMemberPermissions.setIsFrozen(partyMember.getFreezeStatus() == 1);
            permissions.add(partyMemberPermissions);
        }
        identityInformationVO.setPermissions(permissions);
        return identityInformationVO;
    }
 
    /**
     * 处理管理员所属层级
     * @param phone
     * @param systemUser
     * @param identity
     * @param identityInformationVO
     */
    private void handleSystemUserLevelId(String phone, SystemUser systemUser, Integer identity,
                                         IdentityInformation identityInformationVO, PartyMember partyMember) {
        // 情况1:系统用户存在
        if (Objects.nonNull(systemUser)) {
            Optional<SystemUserLevel> levelOptional = systemUserLevelService.getByLevelByUserId(systemUser.getId());
            if (levelOptional.isPresent()) {
                // 系统用户有关联的用户级别
                SystemUserLevel userLevel = levelOptional.get();
 
                // 设置用户身份信息为系统用户身份
                identityInformationVO.setIdentity(identity);
                identityInformationVO.setLevelId(userLevel.getId());
                identityInformationVO.setSuperviseFlag(userLevel.getSuperviseFlag());
                identityInformationVO.setSystemUserLevel(userLevel);
 
                // 存储到Redis
                UserIdentityDTO build = UserIdentityDTO.builder()
                        .identity(identity)
                        .levelId(userLevel.getId())
                        .build();
                redisUtils.set("identity:" + phone, build);
            } else if (partyMember != null && partyMember.getAuditStatus() == 1) {
                // 系统用户无关联级别,但是有党员身份且审核通过
                identityInformationVO.setIdentity(1);
 
                UserIdentityDTO build = UserIdentityDTO.builder()
                        .identity(1)
                        .build();
                redisUtils.set("identity:" + phone, build);
            } else {
                // 系统用户无关联级别,也没有党员身份,清除身份信息
                redisUtils.remove("identity:" + phone);
            }
        } else if (partyMember != null && partyMember.getAuditStatus() == 1) {
            // 情况2:不是系统用户,但是党员身份且审核通过
            identityInformationVO.setIdentity(1);
 
            UserIdentityDTO build = UserIdentityDTO.builder()
                    .identity(1)
                    .build();
            redisUtils.set("identity:" + phone, build);
        } else {
            // 情况3:既不是系统用户也不是审核通过的党员,清除身份信息
            redisUtils.remove("identity:" + phone);
        }
    }
 
 
    @Override
    public IdentityInformation getCurrentIdentityInformation(LoginUserInfoVO loginUserInfo) {
        IdentityInformation identityInformation = getIdentityInformation(loginUserInfo);
        Boolean isFrozen = identityInformation.getIsFrozen();
        if (isFrozen) {
            throw new ServiceException("您的账号已被冻结,请联系管理员");
        }
        List<PermissionsVO> permissions = identityInformation.getPermissions();
        if (CollectionUtil.isEmpty(permissions) || Objects.isNull(identityInformation.getIdentity())){
            throw new ServiceException("请先完成认证");
        }
 
        SystemUser systemUser = identityInformation.getSystemUser();
        if (identityInformation.getIdentity() == 2 && Objects.isNull(systemUser)) {
            throw new ServiceException("管理员信息不存在");
        }
        SystemUserLevel systemUserLevel = identityInformation.getSystemUserLevel();
        if (identityInformation.getIdentity() == 2&&Objects.isNull(systemUserLevel)) {
            throw new ServiceException("管理员所属层级不存在");
        }
        PartyMember partyMember = identityInformation.getPartyMember();
        if (identityInformation.getIdentity() == 1 && Objects.isNull(partyMember)) {
            throw new ServiceException("党员信息不存在");
        }
        return identityInformation;
    }
}