package com.fdkankan.fusion.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fdkankan.fusion.common.PageInfo; import com.fdkankan.fusion.common.enums.IdPreEnum; import com.fdkankan.fusion.common.util.IdUtils; import com.fdkankan.fusion.httpClient.response.FdkkLoginVo; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fdkankan.fusion.common.ResultCode; import com.fdkankan.fusion.common.util.RedisKeyUtil; import com.fdkankan.fusion.entity.*; import com.fdkankan.fusion.exception.BusinessException; import com.fdkankan.fusion.httpClient.client.FdKKClient; import com.fdkankan.fusion.httpClient.request.FdkkLoginRequest; import com.fdkankan.fusion.httpClient.response.FdkkResponse; import com.fdkankan.fusion.mapper.ITmUserMapper; import com.fdkankan.fusion.response.UserAddRequest; import com.fdkankan.fusion.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.redis.util.RedisUtil; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** *

* 用户信息表 服务实现类 *

* * @author * @since 2023-07-28 */ @Service public class TmUserServiceImpl extends ServiceImpl implements ITmUserService { @Autowired ITmPermissionService tmPermissionService; @Autowired ITmUserRoleService tmUserRoleService; @Autowired ITmRoleService tmRoleService; @Autowired ITmRolePermissionService tmRolePermissionService; @Autowired ITmDepartmentService tmDepartmentService; @Autowired ITmCameraService tmCameraService; @Autowired FdKKClient fdKKClient; @Autowired RedisUtil redisUtil; @Override public void setRoleAndPermToRedis(TmUser tmUser) { String redisKeyMenu = String.format(RedisKeyUtil.MANAGE_PERM_USER, tmUser.getId()); String redisKeyRole = String.format(RedisKeyUtil.MANAGE_ROLE_USER, tmUser.getId()); List userRoles = tmUserRoleService.getByUserId(tmUser.getId()); if(CollectionUtil.isEmpty(userRoles)){ throw new BusinessException(ResultCode.NOT_ROLE); } List roleIds = userRoles.stream().map(TmUserRole::getRoleId).collect(Collectors.toList()); List tmRoles = tmRoleService.listByIds(roleIds); if(CollectionUtil.isEmpty(tmRoles)){ throw new BusinessException(ResultCode.NOT_ROLE); } List roleKeys = tmRoles.stream().map(TmRole::getRoleKey).collect(Collectors.toList()); List tmRolePermissions = tmRolePermissionService.getByRoleIds(roleIds); if(CollectionUtil.isEmpty(tmRolePermissions)){ throw new BusinessException(ResultCode.NOT_PERMISSION); } List permIds = tmRolePermissions.stream().map(TmRolePermission::getPermissionId).collect(Collectors.toList()); List tmPermissions = tmPermissionService.listByIds(permIds); if(CollectionUtil.isEmpty(tmPermissions)){ throw new BusinessException(ResultCode.NOT_PERMISSION); } List permsList = tmPermissions.stream().map(TmPermission::getPerms).collect(Collectors.toList()); tmUser.setPermsList(permsList); tmUser.setRoleList(roleKeys); tmUser.setRoleIdList(roleIds); TmDepartment tmDepartment = tmDepartmentService.getById(tmUser.getDeptId()); if(tmDepartment !=null){ tmUser.setDeptName(tmDepartment.getName()); tmUser.setDeptLevel(tmDepartment.getDeptType()); } redisUtil.set(redisKeyMenu, JSONArray.toJSONString(permsList),RedisKeyUtil.tokenTime); redisUtil.set(redisKeyRole,JSONArray.toJSONString(roleKeys),RedisKeyUtil.tokenTime); } @Override public TmUser getByUserName(String phoneNum) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(TmUser::getUserName,phoneNum); return this.getOne(wrapper); } @Override public void addUser(UserAddRequest param) { if (!StringUtils.isNoneBlank(param.getUserName(), param.getNickName(), param.getRoleId(), param.getPassword(),param.getDeptId())) { throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS); } TmUser tmUser = this.getByUserName(param.getUserName()); if(tmUser != null){ throw new BusinessException(ResultCode.USER_EXIST); } TmRole role = tmRoleService.getById(param.getRoleId()); if(role == null){ throw new BusinessException(ResultCode.NOT_ROLE); } TmDepartment tmDepartment = tmDepartmentService.getById(param.getDeptId()); if(tmDepartment == null){ throw new BusinessException(ResultCode.NOT_DEPT); } FdkkLoginRequest request = new FdkkLoginRequest(param.getUserName(),param.getPassword(),param.getPassword()); FdkkResponse fdkkResponse = fdKKClient.fdkkRegister(request); if(fdkkResponse.getCode() == 0 ){ this.addNewUser(param,role); return; } if(fdkkResponse.getCode() == 3008 ){ this.addNewUser(param,role); throw new BusinessException(ResultCode.USER_IS_REGISTER); } throw new BusinessException(fdkkResponse.getCode(),fdkkResponse.getMsg()); } private void addNewUser(UserAddRequest param,TmRole tmRole) { TmUser tmUser = new TmUser(); String id = IdUtils.genId(IdPreEnum.USER_PRE.getPre()); tmUser.setId(id); tmUser.setDeptId(param.getDeptId()); tmUser.setUserName(param.getUserName()); tmUser.setNickName(param.getNickName()); tmUser.setCreatorId((String) StpUtil.getLoginId()); this.save(tmUser); tmUserRoleService.add(id,tmRole.getId()); } @Override public void editUser(UserAddRequest param) { if (!StringUtils.isNoneBlank( param.getId())) { throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS); } TmUser tmUser = this.getById(param.getId()); if(tmUser == null){ throw new BusinessException(ResultCode.USER_NOT_EXIST); } if(param.getDeptId() != null && !tmUser.getDeptId().equals(param.getDeptId())){ List cameras = tmCameraService.getByUserId(tmUser.getId()); if(CollectionUtil.isNotEmpty(cameras)){ throw new BusinessException(ResultCode.USER_HAVE_CAMERA); } } LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(TmUser::getId,param.getId()); if(StringUtils.isNotBlank(param.getDeptId())){ wrapper.set(TmUser::getDeptId,param.getDeptId()); } if(StringUtils.isNotBlank(param.getNickName())){ wrapper.set(TmUser::getNickName,param.getNickName()); } this.update(wrapper); if(StringUtils.isNotBlank(param.getRoleId())){ tmUserRoleService.updateByUserId(param.getId(),param.getRoleId()); this.setRoleAndPermToRedis(tmUser); } } @Override public void changePassword(UserAddRequest param) { if(StringUtils.isBlank(param.getUserName()) || StringUtils.isBlank(param.getPassword()) || StringUtils.isBlank(param.getConfirmPwd()) || StringUtils.isBlank(param.getCode())){ throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS); } TmUser tmUser = this.getByUserName(param.getUserName()); if(tmUser == null){ throw new BusinessException(ResultCode.USER_NOT_EXIST); } if (!StringUtils.equals(param.getPassword(), param.getConfirmPwd())) { throw new BusinessException(ResultCode.USER_PASSWORD_ERROR); } FdkkLoginRequest request = new FdkkLoginRequest(param.getUserName(),param.getPassword(),param.getConfirmPwd(),param.getCode()); FdkkResponse fdkkResponse = fdKKClient.fdkkChangePassword(request); if(fdkkResponse.getCode() != 0){ throw new BusinessException(fdkkResponse.getCode(),fdkkResponse.getMsg()); } } @Override public FdkkResponse getMsgAuthCode(String phoneNum) { if(StringUtils.isBlank(phoneNum)){ throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS); } TmUser tmUser = this.getByUserName(phoneNum); if(tmUser == null){ throw new BusinessException(ResultCode.USER_NOT_EXIST); } FdkkLoginRequest request = new FdkkLoginRequest(phoneNum); FdkkResponse fdkkResponse = fdKKClient.fdkkGetMsgAuthCode(request); if(fdkkResponse.getCode() != 0){ throw new BusinessException(fdkkResponse.getCode(),fdkkResponse.getMsg()); } return fdkkResponse; } @Override public void changeStatus(UserAddRequest param) { if(StringUtils.isBlank(param.getId()) || param.getStatus() == null){ throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS); } LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(TmUser::getId,param.getId()); wrapper.set(TmUser::getStatus,param.getStatus()); this.update(wrapper); if(redisUtil.hasKey(String.format(RedisKeyUtil.fusionLoginUser, param.getId()))){ String value = redisUtil.get(String.format(RedisKeyUtil.fusionLoginUser, param.getId())); FdkkLoginVo fdkkLoginVo = JSONObject.parseObject(value,FdkkLoginVo.class); fdkkLoginVo.getTmUser().setStatus(param.getStatus()); redisUtil.set(String.format(RedisKeyUtil.fusionLoginUser, param.getId()),JSONObject.toJSONString(fdkkLoginVo)); } } @Override public void delUser(UserAddRequest param) { if(StringUtils.isBlank(param.getId())){ throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS); } List cameras = tmCameraService.getByUserId(param.getId()); if(CollectionUtil.isNotEmpty(cameras)){ tmCameraService.unBind(cameras); } String redisKey = String.format(RedisKeyUtil.fusionLoginUser,param.getId()); if(redisUtil.hasKey(redisKey)){ FdkkLoginVo fdkkLoginVo = JSONObject.parseObject(redisUtil.get(redisKey), FdkkLoginVo.class); redisUtil.del(String.format(RedisKeyUtil.fusionLoginToken,fdkkLoginVo.getToken())); redisUtil.del(String.format(RedisKeyUtil.fdToken,fdkkLoginVo.getFdToken())); redisUtil.del(redisKey); } this.removeById(param.getId()); } @Override public List getByDeptId(String deptId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(TmUser::getDeptId,deptId); return this.list(wrapper); } @Override public TmUser getLoginUser() { String userId = (String) StpUtil.getLoginId(); return this.getById(userId); } @Override public PageInfo pageList(String userName,String nickName, String deptId, Integer status, Long pageNum, Long pageSize) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if(StringUtils.isNotBlank(userName)){ wrapper.like(TmUser::getUserName,userName); } if(StringUtils.isNotBlank(nickName)){ wrapper.like(TmUser::getNickName,nickName); } if(status != null){ wrapper.eq(TmUser::getStatus,status); } List deptIds = tmDepartmentService.getDeptIds(); if(StringUtils.isNotBlank(deptId)){ deptIds = tmDepartmentService.getSonByDeptIdAndDeptIds(deptIds,deptId); } wrapper.in(TmUser::getDeptId,deptIds); wrapper.orderByDesc(TmUser::getCreateTime); Page page = this.page(new Page<>(pageNum, pageSize), wrapper); Set deptIdSet = page.getRecords().stream().map(TmUser::getDeptId).collect(Collectors.toSet()); HashMap map = tmDepartmentService.getMapByDeptIds(deptIdSet); Set userIds = page.getRecords().stream().map(TmUser::getId).collect(Collectors.toSet()); HashMap roleMap = tmRoleService.getMapByUserIds(userIds); for (TmUser record : page.getRecords()) { TmDepartment tmDepartment = map.get(record.getDeptId()); if(tmDepartment != null){ record.setDeptName(tmDepartment.getName()); } TmRole tmRole = roleMap.get(record.getId()); if(tmRole !=null){ record.setRoleId(tmRole.getId()); record.setRoleKey(tmRole.getRoleKey()); record.setRoleName(tmRole.getRoleName()); } } return PageInfo.PageInfo(page); } @Override public Object getUserListSelect(String deptId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if(StringUtils.isNotBlank(deptId)){ wrapper.eq(TmUser::getDeptId,deptId); } List deptIds = tmDepartmentService.getDeptIds(); if(deptIds.size() <=0){ deptIds.add("not-dept"); } wrapper.in(TmUser::getDeptId,deptIds); return this.list(wrapper); } @Override public HashMap getByIds(Set createorIds) { HashMap map = new HashMap<>(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.in(TmUser::getId,createorIds); List list = this.list(wrapper); for (TmUser tmUser : list) { map.put(tmUser.getId(),tmUser); } return map; } @Override public List getLikeNickName(String searchKey) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.like(TmUser::getNickName,searchKey); return this.list(wrapper); } @Override public HashMap getByCamera(List records) { HashMap userMap = new HashMap<>(); HashMap map = new HashMap<>(); List userIds = records.stream().map(TmCamera::getUserId).collect(Collectors.toList()); if(userIds.size() >0){ List tmUsers = this.listByIds(userIds); tmUsers.forEach(entity ->userMap.put(entity.getId(),entity)); for (TmCamera record : records) { map.put(record.getCameraSn().toUpperCase(),userMap.get(record.getUserId())); } } return map; } @Override public List getByDeptIds(List deptIds) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.in(TmUser::getDeptId,deptIds); return this.list(wrapper); } }