| 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.StationService; | 
| 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; | 
|     @Autowired | 
|     private StationService stationService; | 
|   | 
|   | 
|     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()-customerPoint.getDeductionPoint(); | 
|                 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()); | 
|         }else if (Constants.USER_TYPE.admin.name().equals(user.getType())){ | 
|             result.setMainWarehouse(stationService.getMainWarehouse(user.getId())); | 
|         } | 
|         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); | 
|     } | 
| } |