zhujie
10 天以前 19428a49b4c07b14097615d48a7a72dbf941c4e7
src/main/java/com/mzl/flower/service/system/UserService.java
@@ -8,13 +8,18 @@
import com.mzl.flower.constant.Constants;
import com.mzl.flower.dto.request.BindWechatDTO;
import com.mzl.flower.dto.request.CreateWechatUserDTO;
import com.mzl.flower.dto.request.UserLoginDTO;
import com.mzl.flower.dto.request.UserPhoneLoginDTO;
import com.mzl.flower.dto.request.customer.UpdateCustomerDTO;
import com.mzl.flower.dto.request.system.*;
import com.mzl.flower.dto.response.current.CurrentUserDTO;
import com.mzl.flower.dto.response.customer.CustomerDTO;
import com.mzl.flower.dto.response.system.*;
import com.mzl.flower.entity.customer.Customer;
import com.mzl.flower.entity.point.CustomerPoint;
import com.mzl.flower.entity.system.*;
import com.mzl.flower.enums.TrueOrFalseEnum;
import com.mzl.flower.mapper.customer.CustomerMapper;
import com.mzl.flower.mapper.point.CustomerPointMapper;
import com.mzl.flower.mapper.system.*;
import com.mzl.flower.service.customer.CustomerService;
@@ -38,6 +43,7 @@
import org.springframework.util.ObjectUtils;
import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -86,6 +92,10 @@
    @Autowired
    private CustomerPointMapper customerPointMapper;
    @Autowired
    private CustomerMapper customerMapper;
    @Autowired
    private StationService stationService;
@@ -93,14 +103,14 @@
    RedissonClient redissonClient;
    public User findUserByOpenId(String openId, String sessionKey, String unionId
            , String imgUrl, String nickname,String userType){
            , String imgUrl, String nickname, String userType) {
        List<String> userTypes = new ArrayList<>();
        userTypes.add(userType);
        List<User> userList = userMapper.getByOpenID(openId,userTypes);
        if(CollectionUtils.isEmpty(userList)){
        List<User> userList = userMapper.getByOpenID(openId, userTypes);
        if (CollectionUtils.isEmpty(userList)) {
            throw new ValidationException("请注册账号后至\"个人中心-绑定微信\"后再使用微信登录");
        }
        User user=userList.get(0);
        User user = userList.get(0);
//        user.setNickName(nickname);
        user.setNickName(user.getLoginName());
        user.setPicture(imgUrl);
@@ -108,8 +118,8 @@
        userMapper.updateById(user);
        UserWechat wechat = wechatMapper.selectOne(new LambdaQueryWrapper<UserWechat>()
                .eq(UserWechat::getOpenId, openId)
                .eq(UserWechat::getUserId,user.getId()));
        if(wechat == null){
                .eq(UserWechat::getUserId, user.getId()));
        if (wechat == null) {
            throw new ValidationException("请至\"个人中心-绑定微信\"后再使用微信登录");
        }
        wechat.setOpenId(openId);
@@ -123,19 +133,19 @@
        // 查看微信是否已经绑定过用户
        User user = userMapper.selectById(userId);
        if(ObjectUtils.isEmpty(user)){
        if (ObjectUtils.isEmpty(user)) {
            throw new ValidationException("当前用户不存在");
        }
        List<User> userList=wechatMapper.selectUserByOpenId(openId,user.getType());
        if(!CollectionUtils.isEmpty(userList)){
        List<User> userList = wechatMapper.selectUserByOpenId(openId, user.getType());
        if (!CollectionUtils.isEmpty(userList)) {
            throw new ValidationException("该微信已绑定其他账号");
        }
        UserWechat wechat = wechatMapper.selectOne(new LambdaQueryWrapper<UserWechat>()
                .eq(UserWechat::getUserId,userId));
        if(wechat == null){
                .eq(UserWechat::getUserId, userId));
        if (wechat == null) {
            wechat = new UserWechat();
            wechat.setId(UUIDGenerator.getUUID());
            wechat.setUserId(userId);
@@ -144,7 +154,7 @@
            wechat.setSessionKey(sessionKey);
            wechat.setRealName(dto.getRealName());
            wechatMapper.insert(wechat);
        }else{
        } else {
            wechat.setOpenId(openId);
            wechat.setUnionId(unionId);
            wechat.setSessionKey(sessionKey);
@@ -156,10 +166,9 @@
    }
    public User getUserByThirdId(String thirdId){
    public User getUserByThirdId(String thirdId) {
        User u = userMapper.selectOne(new QueryWrapper<User>().eq("third_id", thirdId));
        if(u == null){
        if (u == null) {
            throw new ValidationException("用户不存在");
        }
@@ -173,7 +182,7 @@
        //获取用户信息
        User user = getUserById(userId);
        if(user == null){
        if (user == null) {
            throw new ValidationException("用户不存在");
        }
        result.setLoginName(user.getLoginName());
@@ -192,16 +201,16 @@
        //根据用户角色获取用户菜单
        List<MenuTreeDTO> menus = null;
        if(Constants.USER_TYPE.admin.name().equals(user.getType())){
        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())){
        } else if (Constants.USER_TYPE.partner.name().equals(user.getType())) {
            menus = partnerMenuMapper.selectListOrderBySeq();
        }
        if(menus != null) {
        if (menus != null) {
            for (MenuTreeDTO menu : menus) {
                menu.setPath(menu.getMenuHref());
                menu.setName(menu.getMenuName());
@@ -221,22 +230,22 @@
//        result.setMenuList(menuList);
        result.setId(userId);
        if(Constants.USER_TYPE.customer.name().equals(user.getType())){
        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){
            if (customerPoint == null) {
                result.setCurrentPoint(0);
            }else{
                Integer currentPoint =customerPoint.getTotalPoint()-customerPoint.getUsedPoint()-customerPoint.getExpiredPoint()-customerPoint.getDeductionPoint();
                result.setCurrentPoint(currentPoint>=0?currentPoint: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())){
        } else if (Constants.USER_TYPE.supplier.name().equals(user.getType())) {
            result.setSupplierDTO(supplierService.getCurrentSupplier());
        }else if(Constants.USER_TYPE.partner.name().equals(user.getType())){
        } else if (Constants.USER_TYPE.partner.name().equals(user.getType())) {
            result.setPartnerDTO(partnerService.getCurrentPartner());
        }else if (Constants.USER_TYPE.admin.name().equals(user.getType())){
        } else if (Constants.USER_TYPE.admin.name().equals(user.getType())) {
            result.setMainWarehouse(stationService.getMainWarehouse(user.getId()));
        }
        result.setBindWechat(wechatMapper.selectCount(new LambdaQueryWrapper<UserWechat>()
@@ -245,11 +254,11 @@
        return result;
    }
    public User getUserById(String id){
    public User getUserById(String id) {
        return userMapper.selectById(id);
    }
    public User loginUser(String username){
    public User loginUser(String username) {
        return userMapper.loginUser(username);
    }
@@ -257,7 +266,7 @@
        return userMapper.getActiveUser(loginName, userTypes);
    }
    public void updateUserInfo(UserInfoDTO dto){
    public void updateUserInfo(UserInfoDTO dto) {
        String id = SecurityUtils.getUserId();
        User user = getUserById(id);
@@ -267,7 +276,7 @@
        String tel = dto.getTel();
        if (StringUtils.isEmpty(user.getTel()) || !user.getTel().equals(tel)) {
            User u = findByLoginName(tel, userTypes);
            if(u != null){
            if (u != null) {
                throw new ValidationException("手机号已存在");
            }
            user.setTel(dto.getTel());
@@ -281,6 +290,7 @@
    /**
     * 新增用户
     *
     * @param dto
     * @return
     */
@@ -291,13 +301,13 @@
        String tel = dto.getTel();
        User u = findByLoginName(tel, userTypes);
        if(u != null){
        if (u != null) {
            throw new ValidationException("手机号已存在");
        }
        String loginName = dto.getLoginName();
        u = findByLoginName(loginName, userTypes);
        if(u != null){
        if (u != null) {
            throw new ValidationException("账号已存在");
        }
@@ -314,7 +324,7 @@
        addRole(dto.getRoleIds(), user.getId());
        //添加或更新员工信息
        addEmployee(dto.getEmployeeDTO(),user.getId());
        addEmployee(dto.getEmployeeDTO(), user.getId());
        return user;
    }
@@ -322,12 +332,12 @@
        Employee employee = employeeMapper.selectOne(new LambdaQueryWrapper<Employee>().eq(Employee::getUserId, userId));
        if (employee == null) {
            employee = new Employee();
            BeanUtils.copyProperties(dto,employee);
            BeanUtils.copyProperties(dto, employee);
            employee.setUserId(userId);
            employee.create(SecurityUtils.getUserId());
            employeeMapper.insert(employee);
        }else {
            BeanUtils.copyProperties(dto,employee);
        } else {
            BeanUtils.copyProperties(dto, employee);
            employee.setUserId(userId);
            employee.update(SecurityUtils.getUserId());
            employeeMapper.updateById(employee);
@@ -372,9 +382,9 @@
            String roleDesc = userMapper.selectUserRoleDesc(id);
            result.setRoleDesc(roleDesc);
            Employee employee = employeeMapper.selectOne(new LambdaQueryWrapper<Employee>().eq(Employee::getUserId, id));
            if(employee!=null){
            if (employee != null) {
                EmployeeDTO employeeDTO = new EmployeeDTO();
                BeanUtils.copyProperties(employee,employeeDTO);
                BeanUtils.copyProperties(employee, employeeDTO);
                result.setEmployeeDTO(employeeDTO);
            }
        }
@@ -383,6 +393,7 @@
    /**
     * 更新用户
     *
     * @param dto
     */
    public void updateUser(UpdateUserDTO dto) {
@@ -393,11 +404,11 @@
            user.setPassword(passwordEncoder.encode(dto.getPassword()));
        }
        BeanUtils.copyProperties(dto, user,"loginName", "tel", "password", "type");
        BeanUtils.copyProperties(dto, user, "loginName", "tel", "password", "type");
        user.update(SecurityUtils.getUserId());
        userMapper.updateById(user);
        if(Constants.USER_TYPE.admin.name().equals(user.getType())) {
        if (Constants.USER_TYPE.admin.name().equals(user.getType())) {
            //删除用户的角色信息
            userRoleMapper.delete(new QueryWrapper<UserRole>().eq("user_id", id));
            //给用户添加角色
@@ -405,22 +416,22 @@
        }
        //添加或更新员工信息
        addEmployee(dto.getEmployeeDTO(),user.getId());
        addEmployee(dto.getEmployeeDTO(), user.getId());
    }
    private void checkAndSetUserLoginInfo(User user, String tel, String loginName){
    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){
            if (u != null) {
                throw new ValidationException("手机号已存在");
            }
            user.setTel(tel);
        }
        if(StringUtils.isNotEmpty(loginName)) {
        if (StringUtils.isNotEmpty(loginName)) {
            if (StringUtils.isEmpty(user.getLoginName()) || !user.getLoginName().equals(loginName)) {
                User u = findByLoginName(loginName, userTypes);
                if (u != null) {
@@ -431,7 +442,7 @@
        }
    }
    public void deleteUser(String id){
    public void deleteUser(String id) {
        User user = getUserById(id);
        user.setDeleted(true);
        user.update(SecurityUtils.getUserId());
@@ -445,11 +456,11 @@
        userMapper.updateById(user);
    }
    public void changePassword(ChangePasswordDTO dto){
    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())){
        if (StringUtils.isNotBlank(dto.getOldPassword())) {
            if (!passwordEncoder.matches(dto.getOldPassword(), user.getPassword())) {
                throw new ValidationException("原密码错误,无权修改");
            }
        }
@@ -459,7 +470,7 @@
        userMapper.updateById(user);
    }
    public void setUserStatus(String id, String status){
    public void setUserStatus(String id, String status) {
        User user = getUserById(id);
        user.setStatus(status);
        user.update(SecurityUtils.getUserId());
@@ -503,14 +514,15 @@
    public List<User> getVipGradeUserList(String getVipGrade) {
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(User::getDeleted, TrueOrFalseEnum.FALSE.isFlag())
                .eq(User::getVipGrade,getVipGrade);
                .eq(User::getVipGrade, getVipGrade);
        return userMapper.selectList(queryWrapper);
    }
    /**
     * 查看微信是否已经存在用户
     *
     * @param openId
     * @param sessionKey
     * @param unionId
@@ -520,8 +532,8 @@
    public User getExistUserByOpenId(String openId, String sessionKey, String unionId, String userType) {
        List<String> userTypes = new ArrayList<>();
        userTypes.add(userType);
        List<User> userList = userMapper.getByOpenID(openId,userTypes);
        if(!CollectionUtils.isEmpty(userList)){
        List<User> userList = userMapper.getByOpenID(openId, userTypes);
        if (!CollectionUtils.isEmpty(userList)) {
            return userList.get(0);
        }
        return null;
@@ -529,47 +541,48 @@
    public void registWxUser(CreateWechatUserDTO dto) {
        String RETISTER_KEY = "%s_%s";
        RLock lock = redissonClient.getLock(String.format(RETISTER_KEY,dto.getPurePhoneNumber(),dto.getUserType()));
        RLock lock = redissonClient.getLock(String.format(RETISTER_KEY, dto.getPurePhoneNumber(), dto.getUserType()));
        try {
            // 获取锁,最多等待 10 秒,锁自动释放时间 30 秒
            if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
                try{
                // 其次查找当前loginName是prephonenume的,userType是customer的用户存在不存在
                if (StringUtils.isEmpty(dto.getPurePhoneNumber()) && StringUtils.isEmpty(dto.getPhoneNumber())) {
                    throw new ValidationException("微信获取的电话号码为空!无法注册");
                }
                // 1:查看用户存在不存在
                List<String> userTypes = new ArrayList<>();
                userTypes.add(dto.getUserType());
                User user = findByLoginName(dto.getPurePhoneNumber(), userTypes);
                if (ObjectUtils.isEmpty(user)) {
                    // 是新用户,需要注册
                    user = new User();
                    user.setId(UUIDGenerator.getUUID());
                    user.setLoginName(dto.getPurePhoneNumber());
                    user.setTel(dto.getPurePhoneNumber());
                    user.setNickName(dto.getPurePhoneNumber());
                    user.setPassword(passwordEncoder.encode("12345678"));
                    user.setType(dto.getUserType());
                    user.setStatus(Constants.STATUS_ACTIVE);
                    user.setIsSys(Constants.N);
                    user.create();
                    userMapper.insert(user);
                    // 注册商户信息
                    UpdateCustomerDTO updateCustomerDTO = new UpdateCustomerDTO();
                    updateCustomerDTO.setUserId(user.getId());
                    if (StringUtils.isNotBlank(dto.getPurePhoneNumber())) {
                        updateCustomerDTO.setName("花满芫-" + dto.getPurePhoneNumber().substring(dto.getPurePhoneNumber().length() - 4));
                try {
                    // 其次查找当前loginName是prephonenume的,userType是customer的用户存在不存在
                    if (StringUtils.isEmpty(dto.getPurePhoneNumber()) && StringUtils.isEmpty(dto.getPhoneNumber())) {
                        throw new ValidationException("微信获取的电话号码为空!无法注册");
                    }
                    customerService.addOrUpdateCustomer(updateCustomerDTO);
                }
                    // 1:查看用户存在不存在
                    List<String> userTypes = new ArrayList<>();
                    userTypes.add(dto.getUserType());
                    User user = findByLoginName(dto.getPurePhoneNumber(), userTypes);
                    if (ObjectUtils.isEmpty(user)) {
                        // 是新用户,需要注册
                        user = new User();
                        user.setId(UUIDGenerator.getUUID());
                        user.setLoginName(dto.getPurePhoneNumber());
                        user.setTel(dto.getPurePhoneNumber());
                        user.setNickName(dto.getPurePhoneNumber());
                        user.setPassword(passwordEncoder.encode("12345678"));
                        user.setType(dto.getUserType());
                        user.setStatus(Constants.STATUS_ACTIVE);
                        user.setIsSys(Constants.N);
                        user.create();
                        userMapper.insert(user);
                BindWechatDTO wechatDTO = new BindWechatDTO();
                wechatDTO.setRealName(dto.getPurePhoneNumber());
                bindWechat(user.getId(), dto.getOpenId(), dto.getUnionId(), dto.getSessionKey(), wechatDTO);
                }finally {
                        // 注册商户信息
                        UpdateCustomerDTO updateCustomerDTO = new UpdateCustomerDTO();
                        updateCustomerDTO.setUserId(user.getId());
                        if (StringUtils.isNotBlank(dto.getPurePhoneNumber())) {
                            updateCustomerDTO.setName("花满芫-" + dto.getPurePhoneNumber().substring(dto.getPurePhoneNumber().length() - 4));
                        }
                        updateCustomerDTO.setIsMember(true);  // 会员
                        customerService.addOrUpdateCustomer(updateCustomerDTO);
                    }
                    BindWechatDTO wechatDTO = new BindWechatDTO();
                    wechatDTO.setRealName(dto.getPurePhoneNumber());
                    bindWechat(user.getId(), dto.getOpenId(), dto.getUnionId(), dto.getSessionKey(), wechatDTO);
                } finally {
                    lock.unlock();
                }
            }
@@ -586,4 +599,98 @@
    }
    public User registPhoneUser(UserPhoneLoginDTO dto) {
        String RETISTER_KEY = "%s_%s";
        RLock lock = redissonClient.getLock(String.format(RETISTER_KEY, dto.getUsername(), dto.getUserType()));
        try {
            // 获取锁,最多等待 10 秒,锁自动释放时间 30 秒
            if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
                try {
                    // 其次查找当前loginName是prephonenume的,userType是customer的用户存在不存在
                    if (StringUtils.isEmpty(dto.getUsername()) && StringUtils.isEmpty(dto.getUsername())) {
                        throw new ValidationException("电话号码为空!无法注册");
                    }
                    // 1:查看用户存在不存在
                    List<String> userTypes = new ArrayList<>();
                    userTypes.add(dto.getUserType());
                    User user = findByLoginName(dto.getUsername(), userTypes);
                    if (ObjectUtils.isEmpty(user)) {
                        //验证邀请码
                        if (StringUtils.isNotEmpty(dto.getIntevailCode()) && customerService.checkCode(dto.getIntevailCode())) {
                            throw new ValidationException("无效邀请码");
                        }
                        // 是新用户,需要注册
                        user = new User();
                        user.setId(UUIDGenerator.getUUID());
                        user.setLoginName(dto.getUsername());
                        user.setTel(dto.getUsername());
                        user.setNickName(dto.getUsername());
                        user.setPassword(passwordEncoder.encode("12345678"));
                        user.setType(dto.getUserType());
                        user.setStatus(Constants.STATUS_ACTIVE);
                        user.setIsSys(Constants.N);
                        user.create();
                        userMapper.insert(user);
                        // 注册商户信息
                        UpdateCustomerDTO updateCustomerDTO = new UpdateCustomerDTO();
                        updateCustomerDTO.setUserId(user.getId());
                        updateCustomerDTO.setRegesterCode(dto.getIntevailCode());
                        //有效邀请码注册成功后赠送1天会员
                        updateCustomerDTO.setIsMember(false);
                        if (!customerService.checkCode(dto.getIntevailCode())) {
                            updateCustomerDTO.setIsMember(true);
                            updateCustomerDTO.setMemberOvertime(LocalDateTime.now().plusDays(1));
                        }
                        if (StringUtils.isNotBlank(dto.getUsername())) {
                            updateCustomerDTO.setName("智信-" + dto.getUsername().substring(dto.getUsername().length() - 4));
                        }
                        updateCustomerDTO.setCover("https://hmy-flower.oss-cn-shanghai.aliyuncs.com/8f/8f205ea4618b4ce48d5bd204ae73f075tmp_f0c47a66148245dc17d74563c5939e764273ba583619664d.jpg");
                        customerService.addOrUpdateCustomer(updateCustomerDTO);
                        //邀请会员权益
                        intervialUser(dto.getIntevailCode());
                        return user;
                    }
                } finally {
                    lock.unlock();
                }
            }
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return null;
    }
    //邀请成功增加用户权益
    private void intervialUser(String code) {
        //按照该邀请码下已有邀请人数做相应的会员有效期增加
        Integer InvitatCount = customerMapper.getInvitatCountByCode(code);
        //根据邀请码查找对应的邀请人员
        //1人-3天,3人-15天,5人-30天
        Customer customerByCode = customerMapper.findCustomerByInvitationCode(code);
        if (!ObjectUtils.isEmpty(customerByCode)) {
            LocalDateTime memberOvertime = customerByCode.getMemberOvertime();
            if (!customerByCode.getIsMember()) {
                memberOvertime = LocalDateTime.now();
            }
            switch (InvitatCount) {
                case 1:
                    memberOvertime = memberOvertime.plusDays(3);
                    break;
                case 3:
                    memberOvertime = memberOvertime.plusDays(15);
                    break;
                case 5:
                    memberOvertime = memberOvertime.plusDays(30);
                    break;
            }
            customerByCode.setIsMember(true);
            customerByCode.setMemberOvertime(memberOvertime);
            customerService.updateMemberInfo(customerByCode);
        }
    }
}