package com.mzl.flower.service.system;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.mzl.flower.config.exception.ValidationException;
|
import com.mzl.flower.config.security.SecurityUtils;
|
import com.mzl.flower.constant.Constants;
|
import com.mzl.flower.dto.request.BindWechatDTO;
|
import com.mzl.flower.dto.request.system.*;
|
import com.mzl.flower.dto.response.current.CurrentUserDTO;
|
import com.mzl.flower.dto.response.system.EmployeeDTO;
|
import com.mzl.flower.dto.response.system.MenuTreeDTO;
|
import com.mzl.flower.dto.response.system.UserDetailsDTO;
|
import com.mzl.flower.dto.response.system.UserListDTO;
|
import com.mzl.flower.entity.point.CustomerPoint;
|
import com.mzl.flower.entity.system.*;
|
import com.mzl.flower.enums.TrueOrFalseEnum;
|
import com.mzl.flower.mapper.point.CustomerPointMapper;
|
import com.mzl.flower.mapper.system.*;
|
import com.mzl.flower.service.customer.CustomerService;
|
import com.mzl.flower.service.partner.PartnerService;
|
import com.mzl.flower.service.point.CustomerPointService;
|
import com.mzl.flower.service.supplier.SupplierService;
|
import com.mzl.flower.utils.TreeBuilderUtil;
|
import com.mzl.flower.utils.UUIDGenerator;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.validation.constraints.NotBlank;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
@Service
|
@Transactional
|
@Slf4j
|
public class UserService {
|
|
@Autowired
|
private UserMapper userMapper;
|
|
@Autowired
|
private PasswordEncoder passwordEncoder;
|
|
@Autowired
|
private UserRoleMapper userRoleMapper;
|
|
@Autowired
|
private MenuMapper menuMapper;
|
|
@Autowired
|
private PartnerMenuMapper partnerMenuMapper;
|
|
@Autowired
|
private RoleMenuMapper roleMenuMapper;
|
|
@Autowired
|
private RoleService roleService;
|
|
@Autowired
|
private UserWechatMapper wechatMapper;
|
|
@Autowired
|
private SupplierService supplierService;
|
|
@Autowired
|
private PartnerService partnerService;
|
|
@Autowired
|
private CustomerService customerService;
|
|
@Autowired
|
private EmployeeMapper employeeMapper;
|
|
@Autowired
|
private CustomerPointMapper customerPointMapper;
|
|
|
public User findUserByOpenId(String openId, String sessionKey, String unionId
|
, String imgUrl, String nickname,String userType){
|
List<String> userTypes = new ArrayList<>();
|
userTypes.add(userType);
|
User user = userMapper.getByOpenID(openId,userTypes);
|
if(user == null){
|
throw new ValidationException("请注册账号后至\"个人中心-绑定微信\"后再使用微信登录");
|
}
|
user.setNickName(nickname);
|
user.setPicture(imgUrl);
|
user.update(user.getId());
|
userMapper.updateById(user);
|
UserWechat wechat = wechatMapper.selectOne(new LambdaQueryWrapper<UserWechat>()
|
.eq(UserWechat::getOpenId, openId)
|
.eq(UserWechat::getUserId,user.getId()));
|
if(wechat == null){
|
throw new ValidationException("请至\"个人中心-绑定微信\"后再使用微信登录");
|
}
|
wechat.setOpenId(openId);
|
wechat.setUnionId(unionId);
|
wechat.setSessionKey(sessionKey);
|
wechatMapper.updateById(wechat);
|
return user;
|
}
|
|
public void bindWechat(String userId, String openId, String unionId, String sessionKey, BindWechatDTO dto) {
|
UserWechat wechat = wechatMapper.selectOne(new LambdaQueryWrapper<UserWechat>()
|
.eq(UserWechat::getUserId,userId));
|
if(wechat == null){
|
wechat = new UserWechat();
|
wechat.setId(UUIDGenerator.getUUID());
|
wechat.setUserId(userId);
|
wechat.setOpenId(openId);
|
wechat.setUnionId(unionId);
|
wechat.setSessionKey(sessionKey);
|
wechat.setRealName(dto.getRealName());
|
wechatMapper.insert(wechat);
|
}else{
|
wechat.setOpenId(openId);
|
wechat.setUnionId(unionId);
|
wechat.setSessionKey(sessionKey);
|
wechat.setRealName(dto.getRealName());
|
wechatMapper.updateById(wechat);
|
}
|
}
|
|
|
|
public User getUserByThirdId(String thirdId){
|
User u = userMapper.selectOne(new QueryWrapper<User>().eq("third_id", thirdId));
|
if(u == null){
|
throw new ValidationException("用户不存在");
|
}
|
|
return u;
|
}
|
|
public CurrentUserDTO getCurrentUser() {
|
String userId = SecurityUtils.getUserId();
|
|
CurrentUserDTO result = new CurrentUserDTO();
|
|
//获取用户信息
|
User user = getUserById(userId);
|
if(user == null){
|
throw new ValidationException("用户不存在");
|
}
|
result.setLoginName(user.getLoginName());
|
result.setNickName(user.getNickName());
|
result.setTel(user.getTel());
|
result.setPicture(user.getPicture());
|
result.setType(user.getType());
|
|
//获取用户角色信息
|
List<String> roleIds = new ArrayList<>();
|
List<Role> roleList = roleService.getUserRoleList(userId);
|
for (Role role : roleList) {
|
roleIds.add(role.getId());
|
}
|
result.setRoles(roleIds);
|
|
//根据用户角色获取用户菜单
|
List<MenuTreeDTO> menus = null;
|
if(Constants.USER_TYPE.admin.name().equals(user.getType())){
|
if (roleIds.contains(Constants.ROLE_SYS_ADMIN)) {
|
menus = menuMapper.selectListOrderBySeq();
|
} else if (roleIds.size() > 0) {
|
menus = menuMapper.selectOperationList(roleIds);
|
}
|
}else if(Constants.USER_TYPE.partner.name().equals(user.getType())){
|
menus = partnerMenuMapper.selectListOrderBySeq();
|
}
|
if(menus != null) {
|
for (MenuTreeDTO menu : menus) {
|
menu.setPath(menu.getMenuHref());
|
menu.setName(menu.getMenuName());
|
menu.setLabel(menu.getMenuName());
|
}
|
menus = (List<MenuTreeDTO>) TreeBuilderUtil.buildListToTree(menus);
|
}
|
result.setMenus(menus);
|
|
// List<String> menuList = new ArrayList<>();
|
// if(roleIds.size() > 0){
|
// List<RoleMenu> ls = roleMenuMapper.selectList(new QueryWrapper<RoleMenu>().in("ROLE_ID", roleIds));
|
// for(RoleMenu rm : ls){
|
// menuList.add(rm.getMenuId());
|
// }
|
// }
|
// result.setMenuList(menuList);
|
result.setId(userId);
|
|
if(Constants.USER_TYPE.customer.name().equals(user.getType())){
|
result.setCustomerDTO(customerService.getCurrentCustomer());
|
//查询积分
|
CustomerPoint customerPoint = customerPointMapper.selectOne(new LambdaQueryWrapper<CustomerPoint>()
|
.eq(CustomerPoint::getUserId, userId));
|
if(customerPoint == null){
|
result.setCurrentPoint(0);
|
}else{
|
Integer currentPoint =customerPoint.getTotalPoint()-customerPoint.getUsedPoint()-customerPoint.getExpiredPoint();
|
result.setCurrentPoint(currentPoint>=0?currentPoint:0);
|
}
|
}else if(Constants.USER_TYPE.supplier.name().equals(user.getType())){
|
result.setSupplierDTO(supplierService.getCurrentSupplier());
|
}else if(Constants.USER_TYPE.partner.name().equals(user.getType())){
|
result.setPartnerDTO(partnerService.getCurrentPartner());
|
}
|
result.setBindWechat(wechatMapper.selectCount(new LambdaQueryWrapper<UserWechat>()
|
.eq(UserWechat::getUserId, userId)) > 0);
|
|
return result;
|
}
|
|
public User getUserById(String id){
|
return userMapper.selectById(id);
|
}
|
|
public User loginUser(String username){
|
return userMapper.loginUser(username);
|
}
|
|
public User findByLoginName(String loginName, List<String> userTypes) {
|
return userMapper.getActiveUser(loginName, userTypes);
|
}
|
|
public void updateUserInfo(UserInfoDTO dto){
|
String id = SecurityUtils.getUserId();
|
User user = getUserById(id);
|
|
List<String> userTypes = new ArrayList<>();
|
userTypes.add(user.getType());
|
|
String tel = dto.getTel();
|
if (StringUtils.isEmpty(user.getTel()) || !user.getTel().equals(tel)) {
|
User u = findByLoginName(tel, userTypes);
|
if(u != null){
|
throw new ValidationException("手机号已存在");
|
}
|
user.setTel(dto.getTel());
|
}
|
|
user.setPicture(dto.getPicture());
|
user.setNickName(dto.getNickName());
|
user.update(id);
|
userMapper.updateById(user);
|
}
|
|
/**
|
* 新增用户
|
* @param dto
|
* @return
|
*/
|
public User addUser(CreateUserDTO dto) {
|
String type = dto.getType();
|
List<String> userTypes = new ArrayList<>();
|
userTypes.add(type);
|
|
String tel = dto.getTel();
|
User u = findByLoginName(tel, userTypes);
|
if(u != null){
|
throw new ValidationException("手机号已存在");
|
}
|
|
String loginName = dto.getLoginName();
|
u = findByLoginName(loginName, userTypes);
|
if(u != null){
|
throw new ValidationException("账号已存在");
|
}
|
|
//添加用户
|
User user = new User();
|
BeanUtils.copyProperties(dto, user);
|
user.setId(UUIDGenerator.getUUID());
|
user.setPassword(passwordEncoder.encode(dto.getPassword()));
|
user.setIsSys(Constants.N);
|
user.create(SecurityUtils.getUserId());
|
userMapper.insert(user);
|
|
//给用户添加角色
|
addRole(dto.getRoleIds(), user.getId());
|
|
//添加或更新员工信息
|
addEmployee(dto.getEmployeeDTO(),user.getId());
|
return user;
|
}
|
|
private void addEmployee(AddEmployeeDTO dto, String userId) {
|
Employee employee = employeeMapper.selectOne(new LambdaQueryWrapper<Employee>().eq(Employee::getUserId, userId));
|
if (employee == null) {
|
employee = new Employee();
|
BeanUtils.copyProperties(dto,employee);
|
employee.setUserId(userId);
|
employee.create(SecurityUtils.getUserId());
|
employeeMapper.insert(employee);
|
}else {
|
BeanUtils.copyProperties(dto,employee);
|
employee.setUserId(userId);
|
employee.update(SecurityUtils.getUserId());
|
employeeMapper.updateById(employee);
|
}
|
}
|
|
private void addRole(List<String> roleIds, String userId) {
|
if (roleIds != null && roleIds.size() > 0) {
|
for (String roleId : roleIds) {
|
UserRole userRole = new UserRole();
|
userRole.setId(UUIDGenerator.getUUID());
|
userRole.setUserId(userId);
|
userRole.setRoleId(roleId);
|
userRoleMapper.insert(userRole);
|
}
|
}
|
}
|
|
public Page<UserListDTO> searchUser(SearchUserDTO dto, Page page) {
|
List<UserListDTO> result = userMapper.searchUser(page, dto);
|
|
page.setRecords(result);
|
return page;
|
}
|
|
public UserDetailsDTO getUserDetail(String id) {
|
//获取用户信息
|
User user = getUserById(id);
|
//获取用户的角色信息
|
List<UserRole> userRoles = userRoleMapper.selectList(
|
new QueryWrapper<UserRole>().eq("user_id", id)
|
);
|
List<String> roleIds = new ArrayList<>();
|
for (UserRole userRole : userRoles) {
|
roleIds.add(userRole.getRoleId());
|
}
|
|
UserDetailsDTO result = new UserDetailsDTO();
|
if (user != null) {
|
BeanUtils.copyProperties(user, result);
|
result.setRoleIds(roleIds);
|
String roleDesc = userMapper.selectUserRoleDesc(id);
|
result.setRoleDesc(roleDesc);
|
Employee employee = employeeMapper.selectOne(new LambdaQueryWrapper<Employee>().eq(Employee::getUserId, id));
|
if(employee!=null){
|
EmployeeDTO employeeDTO = new EmployeeDTO();
|
BeanUtils.copyProperties(employee,employeeDTO);
|
result.setEmployeeDTO(employeeDTO);
|
}
|
}
|
return result;
|
}
|
|
/**
|
* 更新用户
|
* @param dto
|
*/
|
public void updateUser(UpdateUserDTO dto) {
|
String id = dto.getId();
|
User user = getUserById(id);
|
checkAndSetUserLoginInfo(user, dto.getTel(), dto.getLoginName());
|
if (StringUtils.isNotBlank(dto.getPassword())) {
|
user.setPassword(passwordEncoder.encode(dto.getPassword()));
|
}
|
|
BeanUtils.copyProperties(dto, user,"loginName", "tel", "password", "type");
|
user.update(SecurityUtils.getUserId());
|
userMapper.updateById(user);
|
|
if(Constants.USER_TYPE.admin.name().equals(user.getType())) {
|
//删除用户的角色信息
|
userRoleMapper.delete(new QueryWrapper<UserRole>().eq("user_id", id));
|
//给用户添加角色
|
addRole(dto.getRoleIds(), id);
|
}
|
|
//添加或更新员工信息
|
addEmployee(dto.getEmployeeDTO(),user.getId());
|
}
|
|
private void checkAndSetUserLoginInfo(User user, String tel, String loginName){
|
List<String> userTypes = new ArrayList<>();
|
userTypes.add(user.getType());
|
|
if (StringUtils.isEmpty(user.getTel()) || !user.getTel().equals(tel)) {
|
User u = findByLoginName(tel, userTypes);
|
if(u != null){
|
throw new ValidationException("手机号已存在");
|
}
|
user.setTel(tel);
|
}
|
|
if(StringUtils.isNotEmpty(loginName)) {
|
if (StringUtils.isEmpty(user.getLoginName()) || !user.getLoginName().equals(loginName)) {
|
User u = findByLoginName(loginName, userTypes);
|
if (u != null) {
|
throw new ValidationException("用户名已存在");
|
}
|
user.setLoginName(loginName);
|
}
|
}
|
}
|
|
public void deleteUser(String id){
|
User user = getUserById(id);
|
user.setDeleted(true);
|
user.update(SecurityUtils.getUserId());
|
userMapper.updateById(user);
|
}
|
|
public void resetUserPassword(ResetUserPasswordDTO dto) {
|
User user = getUserById(dto.getUserId());
|
user.setPassword(passwordEncoder.encode(dto.getPassword()));
|
user.update(SecurityUtils.getUserId());
|
userMapper.updateById(user);
|
}
|
|
public void changePassword(ChangePasswordDTO dto){
|
String userId = SecurityUtils.getUserId();
|
User user = getUserById(userId);
|
if(StringUtils.isNotBlank(dto.getOldPassword())){
|
if(!passwordEncoder.matches(dto.getOldPassword(), user.getPassword())){
|
throw new ValidationException("原密码错误,无权修改");
|
}
|
}
|
|
user.setPassword(passwordEncoder.encode(dto.getPassword()));
|
user.update(SecurityUtils.getUserId());
|
userMapper.updateById(user);
|
}
|
|
public void setUserStatus(String id, String status){
|
User user = getUserById(id);
|
user.setStatus(status);
|
user.update(SecurityUtils.getUserId());
|
userMapper.updateById(user);
|
}
|
|
public List<MenuTreeDTO> getCurrentUserMenuTrue() {
|
String userId = SecurityUtils.getUserId();
|
//获取用户角色信息
|
List<String> roleIds = new ArrayList<>();
|
List<Role> roleList = roleService.getUserRoleList(userId);
|
for (Role role : roleList) {
|
roleIds.add(role.getId());
|
}
|
//根据用户角色获取用户菜单
|
List<MenuTreeDTO> menus = menuMapper.selectListOrderBySeq();
|
/*if (roleIds.contains(Constants.ROLE_SYS_ADMIN)) {
|
menus = menuMapper.selectListOrderBySeq();
|
} else if (roleIds != null && roleIds.size() > 0) {
|
menus = menuMapper.selectOperationList(roleIds);
|
}*/
|
|
if (menus != null) {
|
for (MenuTreeDTO menu : menus) {
|
menu.setPath(menu.getMenuHref());
|
menu.setName(menu.getMenuName());
|
menu.setLabel(menu.getMenuName());
|
|
}
|
menus = (List<MenuTreeDTO>) TreeBuilderUtil.buildListToTree(menus);
|
}
|
|
return menus;
|
}
|
|
public User findByTel(String tel, String userType) {
|
List<String> userTypes = new ArrayList<>();
|
userTypes.add(userType);
|
return userMapper.getActiveUser(tel, userTypes);
|
}
|
|
|
public List<User> getVipGradeUserList(String getVipGrade) {
|
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
|
queryWrapper.lambda().eq(User::getDeleted, TrueOrFalseEnum.FALSE.isFlag())
|
.eq(User::getVipGrade,getVipGrade);
|
return userMapper.selectList(queryWrapper);
|
}
|
}
|