package com.fdkankan.sale.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fdkankan.common.util.Base64Converter;
import com.fdkankan.common.util.SecurityUtil;
import com.fdkankan.redis.util.RedisUtil;
import com.fdkankan.sale.common.PageInfo;
import com.fdkankan.sale.common.ResultCode;
import com.fdkankan.sale.entity.RepairLog;
import com.fdkankan.sale.entity.SysRole;
import com.fdkankan.sale.entity.SysUser;
import com.fdkankan.sale.entity.User;
import com.fdkankan.sale.exception.BusinessException;
import com.fdkankan.sale.mapper.ISysUserMapper;
import com.fdkankan.sale.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.sale.vo.request.SysUserParam;
import com.fdkankan.sale.vo.response.ManageLoginResponse;
import com.fdkankan.sale.vo.response.RepairerVo;
import com.fdkankan.sale.vo.response.SysRoleVo;
import com.fdkankan.sale.vo.response.SysUserVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
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 2022-12-09
*/
@Service
public class SysUserServiceImpl extends ServiceImpl implements ISysUserService {
@Autowired
private ISysRoleService roleService;
@Autowired
private ISysMenuService sysMenuService;
@Autowired
private RedisUtil redisUtil;
@Autowired
private IRepairLogService repairLogService;
@Override
public SysUser getByUserName(String userName) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysUser::getUserName,userName);
List list = this.list(wrapper);
if(list == null || list.size() <=0){
return null;
}
return list.get(0);
}
@DS("db2")
public SysUser getByUserNameDb2(String userName) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysUser::getUserName,userName);
List list = this.list(wrapper);
if(list == null || list.size() <=0){
return null;
}
return list.get(0);
}
@Override
public ManageLoginResponse getUserByUserNameAndPassword(String userName, String password) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysUser::getUserName,userName)
.eq(SysUser::getPassword,password);
List list = this.list(wrapper);
if(list == null || list.size() <=0){
return null;
}
SysUser sysUser = list.get(0);
SysRole role = roleService.getById(sysUser.getRoleId());
ManageLoginResponse loginVO = new ManageLoginResponse();
BeanUtils.copyProperties(sysUser,loginVO);
loginVO.setRoleId(role.getId());
loginVO.setRoleName(role.getRoleName());
sysMenuService.setRoleAndMenuCache(role,sysUser);
return loginVO;
}
@Override
@DS("db1")
public void addOrUpdate(SysUser user,SysUserParam param) {
SysUser user2 = this.getByUserName(param.getUserName());
if(user2 !=null){
throw new BusinessException(ResultCode.USER_EXIST);
}
user.setManageId(user.getId());
user.setId(null);
user.setRoleId(param.getRoleId());
user.setCreateUserId(param.getCreateUserId());
user.setUpdateTime(null);
this.save(user);
}
@Override
public PageInfo pageList(SysUserParam param) {
Page page = this.getBaseMapper().pageList(new Page<>(param.getPageNum(),param.getPageSize()),param);
return PageInfo.PageInfo(page);
}
@Override
public HashMap groupByRoleId() {
HashMap map = new HashMap<>();
List roleVos = this.getBaseMapper().groupByRoleId();
for (SysRoleVo roleVo : roleVos) {
map.put(roleVo.getId(),roleVo.getAdminCount());
}
return map;
}
@Override
public HashMap getByIds(Set sysUserIds) {
HashMap map = new HashMap<>();
if(sysUserIds.size() >0){
List sysUsers = this.listByIds(sysUserIds);
sysUsers.forEach(entity-> map.put(entity.getId(),entity));
}
return map;
}
@Override
public void saveByRedisKey(String redisKey) {
String value = redisUtil.get(redisKey);
if(StringUtils.isBlank(value)){
return;
}
ManageLoginResponse manageLoginResponse = JSONObject.parseObject(value, ManageLoginResponse.class);
SysUser sysUser = this.getByManageId(manageLoginResponse.getId());
if(sysUser == null){
sysUser= new SysUser();
BeanUtils.copyProperties(manageLoginResponse,sysUser);
sysUser.setId(null);
sysUser.setRoleId(null);
sysUser.setManageId(manageLoginResponse.getId());
this.save(sysUser);
}
}
@Override
public SysUser getByManageId(Long userId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysUser::getManageId,userId);
return this.getOne(wrapper);
}
@Override
public HashMap getMapByIds(Set userIds) {
HashMap map = new HashMap<>();
if(userIds == null || userIds.size() <= 0){
return map;
}
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(SysUser::getId,userIds);
List list = this.list(wrapper);
list.forEach(entity -> map.put(entity.getId(),entity));
return map;
}
@Override
@DS("db2")
public Object allList(String userName) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
if(StringUtils.isNotBlank(userName)){
wrapper.like(SysUser::getUserName,userName);
}
wrapper.eq(SysUser::getStatus,1);
return this.list(wrapper);
}
@Override
public void setSaleNameAndRepairManName(List records) {
Set saleIds =records.stream().map(RepairerVo::getSaleId).collect(Collectors.toSet());
Set repairManIds =records.stream().map(RepairerVo::getRepairManId).collect(Collectors.toSet());
saleIds.addAll(repairManIds);
HashMap userHashMap = this.getMapByIds(saleIds);
for (RepairerVo record : records) {
if(record.getSaleId() != null && userHashMap.get(record.getSaleId()) !=null){
record.setSaleName(userHashMap.get(record.getSaleId()).getNickName());
}
if(record.getRepairManId() != null && userHashMap.get(record.getRepairManId()) !=null){
record.setRepairManName(userHashMap.get(record.getRepairManId()).getNickName());
}
}
}
@Override
public void delUser(Long id) {
List list = repairLogService.getBySysUserId(id);
HashMap statusMap = new HashMap<>();
for (RepairLog repairLog : list) {
if(statusMap.get(repairLog.getRepairId()) == null){
statusMap.put(repairLog.getRepairId(),repairLog.getRepairStatus());
}else {
Integer status = statusMap.get(repairLog.getRepairId());
if(repairLog.getRepairStatus() > status ){
statusMap.put(repairLog.getRepairId(),repairLog.getRepairStatus());
}
}
}
for (Integer maxStatus : statusMap.values()) {
if(maxStatus != null && maxStatus <11 ){
throw new BusinessException(ResultCode.DEL_USER_REPAIR);
}
}
this.removeById(id);
}
@Override
public void updateUser(SysUserParam param) {
if(param.getId() == null || param.getStatus() == null){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(SysUser::getId,param.getId());
wrapper.set(SysUser::getStatus,param.getStatus());
this.update(wrapper);
}
}