Newer
Older
smartwell_demos / src / main / java / com / casic / service / impl / UserDataDelayReceiverImpl.java
chaizhuang on 25 Sep 2023 10 KB 达州变更修改
package com.casic.service.impl;

import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.casic.config.dto.RoleDto;
import com.casic.dao.UsersMapper;
import com.casic.enums.UserDataEnum;
import com.casic.missiles.core.shiro.ShiroKit;
import com.casic.model.User;
import com.casic.service.UserDataDelayReceiver;
import com.casic.util.HttpRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author cz
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class UserDataDelayReceiverImpl extends ServiceImpl<UsersMapper, User> implements UserDataDelayReceiver, UserDataEnum {

    @Value("${casic.device.appName}")
    private String appName;
    @Value("${casic.device.appUrl}")
    private String appUrl;

    /**
     * 1、获取授权人员的信息数据
     * 2、根据人员信息数据获取角色信息
     * 3、获取当前数据库的信息
     * 4、判别是否需要更新的和新增的用户
     * 5、
     */
    @Override
    public void saveNewUserData() {
        Map<String, String> roleMap = getLocalRoleData();
        Map<String, User> userMap = getLocalUserData(roleMap);
        doSaveNewUserData(userMap, roleMap);
    }

    /**
     * 获取用户源信息
     */
    private void doSaveNewUserData(Map<String, User> userMap, Map<String, String> roleMap) {
        //获取应用下的所有角色
        Map<String, List<String>> userListMap = getRoleCodes();
        //分为管理员列表和普通角色列表信息
        doGetUserDataSource(userListMap, ADMIN, userMap, roleMap);
        doGetUserDataSource(userListMap, MEMBER, userMap, roleMap);
    }

    private Map<String, String> getLocalRoleData() {
        List<RoleDto> roleMapList = this.baseMapper.getRolesByName();
        Map<String, String> roleMap = new HashMap<>();
        for (RoleDto role : roleMapList) {
            if (role.getName().contains(ADMIN)) {
                roleMap.put(String.valueOf(role.getId()), ADMIN);
            } else {
                roleMap.put(String.valueOf(role.getId()), MEMBER);
            }
        }
        return roleMap;
    }

    /**
     * 获取当前的用户信息列表
     */
    private Map<String, User> getLocalUserData(Map<String, String> roleMap) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<User>()
                .eq("is_sync", "1");
        List<User> localUserList = this.baseMapper.selectList(queryWrapper);
        //过滤
        localUserList = localUserList.stream()
                .filter(e -> roleMap.containsKey(e.getRoleId())).collect(Collectors.toList());
        //设置用户类型
        localUserList.forEach(
                localUser -> {
                    if (roleMap.containsKey(localUser.getRoleId())) {
                        localUser.setUserType(roleMap.get(localUser.getRoleId()));
                    }
                }
        );
        //userCode作为账号
        Map<String, User> userMap = localUserList.stream()
                .collect(
                        Collectors.toMap(User::getAccount, e -> e)
                );
        return userMap;
    }

    /**
     * 比较获取新的用户信息数据,比较直接更新
     */
    private void compareGetNewUserData(List<String> userCodeList, String key, Map<String, JSONArray> sourceMap, Map<String, User> userMap, Map<String, String> roleMap) {
        List<String> newUserCodeList = userCodeList.stream().filter(
                userCode -> !userMap.containsKey(userCode)).collect(Collectors.toList());
        List<String> editUserList = userCodeList.stream().filter(
                userCode -> userMap.containsKey(userCode) && !key.equals(userMap.get(userCode).getUserType())
        ).collect(Collectors.toList());
        Long deptId = this.baseMapper.getDeptIdByName();
        String roleId = null;
        for (Map.Entry<String, String> entry : roleMap.entrySet()) {
            if (entry.getValue().equals(key)) {
                roleId = entry.getKey();
            }
        }

        if (StringUtils.isEmpty(roleId)) {
            return;
        }
        if (ObjectUtils.isEmpty(deptId)) {
            for (Map.Entry<String, User> entry : userMap.entrySet()) {
                if (ObjectUtils.isEmpty(deptId) && ObjectUtils.isNotEmpty(entry.getValue().getDeptId())) {
                    deptId = (entry.getValue()).getDeptId();
                    break;
                }
            }
        }
        //新增
        doAddUser(newUserCodeList, sourceMap, String.valueOf(roleId), deptId);
        //更新
        doUpdateUser(editUserList, userMap, String.valueOf(roleId));
        return;
    }

    /**
     * 新增用户
     */
    private void doAddUser(List<String> newUserCodeList, Map<String, JSONArray> sourceUserMap, String roleId, Long deptId) {
        if (CollectionUtils.isEmpty(newUserCodeList)) {
            return;
        }
        List<User> users = new ArrayList<>();
        Map<String, Object> userMap = null;
        for (String userCode : newUserCodeList) {
            JSONArray userArray = sourceUserMap.get(userCode);
            if (ObjectUtils.isNotEmpty(userArray)) {
                userMap = userArray.stream().collect(
                        Collectors.toMap(e -> (String) ((JSONObject) e).get("name"), e -> ((JSONObject) e).get("value"))
                );
                User user = new User();
                user.setDeptId(deptId);
                user.setRoleId(roleId);
                populateUser(user, userMap);
                users.add(user);
            }
        }
        this.saveBatch(users);
    }

    private void populateUser(User user, Map<String, Object> userMap) {
        //涉及盐值的计算等操作
        user.setSyncId(String.valueOf((Integer) userMap.get("userId")));
        user.setAccount((String) userMap.get("userCode"));
        user.setSex((Integer) userMap.get("sex"));
        user.setName((String) userMap.get("userName"));
        //设置密码
        user.setPassword("111111");
        user.setSalt(ShiroKit.getRandomSalt(5));
        user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt()));
        user.setEmail((String) userMap.get("email"));
        user.setPhone((String) userMap.get("mobile"));
        user.setStatus("1");
        user.setIsSync(1);
        user.setDelFlag("0");
    }

    /**
     * 更新用户
     */
    private void doUpdateUser(List<String> editUserCodeList, Map<String, User> userMap, String roleId) {
        if (CollectionUtils.isEmpty(editUserCodeList)) {
            return;
        }
        List<User> users = new ArrayList<>();
        for (String editUser : editUserCodeList) {
            User user = userMap.get(editUser);
            if (ObjectUtils.isNotEmpty(user)) {
                user.setRoleId(roleId);

                users.add(user);
            }
        }
        this.updateBatchById(users);
    }

    /**
     * @param userListMap
     * @param key         用户或者管理员
     * @param userMap     现存的用户map列表
     */
    private void doGetUserDataSource(Map<String, List<String>> userListMap, String key, Map<String, User> userMap, Map<String, String> roleMap) {
        //获取管理员的信息
        List<String> roleList = userListMap.get(key);
        for (String userPath : roleList) {
            String userUrl = appUrl + FRAGMENT_PATH + appName + "/roles/" + userPath + "/allocatedUsers";
            Object roleObject = HttpRequest.sendGet(userUrl);
            JSONArray userList = ((JSONArray) ((JSONObject) roleObject).get("items"));
            List<String> userCodeList = new ArrayList<>();
            Map<String, JSONArray> sourceMap = new HashMap<>();
            for (Object user : userList) {
                JSONArray dataList = (JSONArray) ((JSONObject) user).get("data");
                String userCode = (String) ((JSONObject) dataList.stream().filter(e -> ((JSONObject) e).get("name").equals("userCode")).findFirst().get()).get("value");
                userCodeList.add(userCode);
                //和获取的用户列表进行比较管理员、userCode是否存在
                sourceMap.put(userCode, dataList);
            }
            compareGetNewUserData(userCodeList, key, sourceMap, userMap, roleMap);
        }
    }


    /**
     * 通过应用名称获取角色的类型
     *
     * @return
     */
    private Map<String, List<String>> getRoleCodes() {
        String rolesUrl = appUrl + FRAGMENT_PATH + appName + "/roles";
        Object roleObject = HttpRequest.sendGet(rolesUrl);
        JSONArray roleList = ((JSONArray) ((JSONObject) roleObject).get("items"));
        Map<String, List<String>> userListMap = new HashMap<>();
        List<String> adminList = new ArrayList<>();
        List<String> userList = new ArrayList<>();
        for (Object role : roleList) {
            JSONArray dataList = (JSONArray) ((JSONObject) role).get("data");
            String roleName = (String) ((JSONObject) dataList.stream().filter(e -> ((JSONObject) e).get("name").equals("roleName")).findFirst().get()).get("value");
            String roleCode = (String) ((JSONObject) dataList.stream().filter(e -> ((JSONObject) e).get("name").equals("roleCode")).findFirst().get()).get("value");
            if (roleName.contains(MEMBER)) {
                userList.add(roleCode);
            }
            if (roleName.contains(ADMIN)) {
                adminList.add(roleCode);
            }
        }
        userListMap.put(MEMBER, userList);
        userListMap.put(ADMIN, adminList);
        return userListMap;
    }
}