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) || ObjectUtils.isEmpty(deptId)) { return; } //新增 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.saveBatch(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; } }