package com.moral.api.service.impl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.api.entity.Group;
import com.moral.api.entity.Menu;
import com.moral.api.entity.Organization;
import com.moral.api.entity.ResponsibilityUnit;
import com.moral.api.entity.User;
import com.moral.api.entity.UserGroup;
import com.moral.api.entity.UserLog;
import com.moral.api.mapper.MenuMapper;
import com.moral.api.mapper.ResponsibilityUnitMapper;
import com.moral.api.mapper.UserGroupMapper;
import com.moral.api.mapper.UserLogMapper;
import com.moral.api.mapper.UserMapper;
import com.moral.api.pojo.bo.UserBO;
import com.moral.api.service.ResponsibilityUnitService;
import com.moral.api.service.UserService;
import com.moral.api.utils.OperationLogUtils;
import com.moral.constant.Constants;
import com.moral.constant.ResponseCodeEnum;
import com.moral.util.AESUtils;
import com.moral.util.ConvertUtils;
import com.moral.util.DateUtils;
import com.moral.util.MD5Utils;
import com.moral.util.RegexUtils;
import com.moral.util.TokenUtils;
import com.moral.util.WebUtils;
/**
*
* 用户表 服务实现类
*
*
* @author moral
* @since 2021-03-09
*/
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private MenuMapper menuMapper;
@Autowired
private UserGroupMapper userGroupMapper;
@Autowired
private UserLogMapper userLogMapper;
@Autowired
private OperationLogUtils operationLogUtils;
@Autowired
private ResponsibilityUnitService responsibilityUnitService;
@Value("${AES.KEY}")
private String AESKey;
@Override
public UserBO selectUserInfo(Map parameters) {
return userMapper.selectUserInfo(parameters);
}
@Override
public Map login(Map parameters) {
UserBO userBo = selectUserInfo(parameters);
Map result = new HashMap<>();
//校验账户
if (userBo == null) {
result.put("code", ResponseCodeEnum.ACCOUNT_NOT_EXIST.getCode());
result.put("msg", ResponseCodeEnum.ACCOUNT_NOT_EXIST.getMsg());
return result;
}
//校验密码
String password = parameters.get("password").toString();
//密码解密
password = AESUtils.decrypt(password, AESKey);
if (!MD5Utils.saltMD5Verify(password, userBo.getPassword())) {
result.put("code", ResponseCodeEnum.PASSWORD_INVALID.getCode());
result.put("msg", ResponseCodeEnum.PASSWORD_INVALID.getMsg());
return result;
}
//校验是否删除
if (Constants.DELETE.equals(userBo.getIsDelete())) {
result.put("code", ResponseCodeEnum.ACCOUNT_IS_DELETE.getCode());
result.put("msg", ResponseCodeEnum.ACCOUNT_IS_DELETE.getMsg());
return result;
}
//校验是否过期
if (userBo.getExpireTime() != null && userBo.getExpireTime().getTime() < System.currentTimeMillis()) {
result.put("code", ResponseCodeEnum.ACCOUNT_IS_EXPIRE.getCode());
result.put("msg", ResponseCodeEnum.ACCOUNT_IS_EXPIRE.getMsg());
return result;
}
//封装用户信息
Map userInfo = new LinkedHashMap<>();
//用户信息
userInfo.put("userId", userBo.getId());
userInfo.put("account", userBo.getAccount());
userInfo.put("userName", userBo.getUserName());
userInfo.put("email", userBo.getEmail());
userInfo.put("mobile", userBo.getMobile());
userInfo.put("unitId",userBo.getUnitId());
userInfo.put("wechat", userBo.getWechat());
userInfo.put("expireTime", DateUtils.dateToDateString(userBo.getExpireTime()));
userInfo.put("isAdmin", userBo.getIsAdmin());
//用户组织信息
Organization organization = userBo.getOrganization();
Map orgInfo = new LinkedHashMap<>();
orgInfo.put("id", userBo.getOrganizationId());
orgInfo.put("name", organization.getName());
orgInfo.put("locationLevelCode", organization.getLocationLevelCode());
orgInfo.put("expireTime", DateUtils.dateToDateString(organization.getExpireTime()));
userInfo.put("organization", orgInfo);
//用户组信息
Group group = userBo.getGroup();
Map groupMap = new LinkedHashMap<>();
userInfo.put("group", groupMap);
if (group != null) {
groupMap.put("id", group.getId());
groupMap.put("groupName", group.getGroupName());
userInfo.put("group", groupMap);
}
Map map = new HashMap<>();
map.put("userId", userBo.getId());
//用户菜单信息
userInfo.putAll(getMenus(map));
try {
//生成token,并存入redis
String token = TokenUtils.getToken(userBo.getId().toString(), userInfo);
result.put("token", token);
} catch (Exception e) {
log.error("token生成异常:" + e.getMessage());
result.put("code", ResponseCodeEnum.TOKEN_CREATE_ERROR.getCode());
result.put("msg", ResponseCodeEnum.TOKEN_CREATE_ERROR.getMsg());
return result;
}
//日志
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
UserLog userLog = new UserLog();
userLog.setType(Constants.LOGIN_OPERTATE_TYPE);
userLog.setIp(WebUtils.getIpAddr(request));
userLog.setOperateId(userBo.getId());
userLog.setOrganizationId(userBo.getOrganizationId());
userLog.setContent("登陆了用户:" + userBo.getAccount());
userLogMapper.insert(userLog);
return result;
}
@Override
public Map getCurrentUserInfo() {
Map userInfo = (Map) TokenUtils.getUserInfo();
return userInfo;
}
@Override
public Map getMenus(Map parameters) {
List