From 3a819e4f668c15e8b77b188b322470da12bb7a43 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期五, 25 四月 2025 13:35:59 +0800 Subject: [PATCH] 会员管理 --- src/main/java/com/mzl/flower/service/system/UserService.java | 290 ++++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 200 insertions(+), 90 deletions(-) diff --git a/src/main/java/com/mzl/flower/service/system/UserService.java b/src/main/java/com/mzl/flower/service/system/UserService.java index 2f0febf..1a3835e 100644 --- a/src/main/java/com/mzl/flower/service/system/UserService.java +++ b/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,101 @@ } + 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(true); + updateCustomerDTO.setMemberOvertime(LocalDateTime.now().plusDays(180)); + //2025-04-25 注释掉,不启用这个功能 +// 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); + + //邀请会员权益 + //2025-04-25 注释掉,不启用这个功能 +// 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); + } + } + + } -- Gitblit v1.9.3