From 52358cd76aee8d5f7edc54e177b6eab0d1f58533 Mon Sep 17 00:00:00 2001
From: zhujie <leon.zhu@cloudroam.com.cn>
Date: 星期五, 11 四月 2025 17:31:06 +0800
Subject: [PATCH] 邀请功能

---
 src/main/java/com/mzl/flower/service/system/UserService.java |  165 ++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 108 insertions(+), 57 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 3d25276..502000a 100644
--- a/src/main/java/com/mzl/flower/service/system/UserService.java
+++ b/src/main/java/com/mzl/flower/service/system/UserService.java
@@ -13,10 +13,13 @@
 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;
@@ -40,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;
@@ -88,6 +92,10 @@
 
     @Autowired
     private CustomerPointMapper customerPointMapper;
+
+    @Autowired
+    private CustomerMapper customerMapper;
+
     @Autowired
     private StationService stationService;
 
@@ -95,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);
@@ -110,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);
@@ -125,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);
@@ -146,7 +154,7 @@
             wechat.setSessionKey(sessionKey);
             wechat.setRealName(dto.getRealName());
             wechatMapper.insert(wechat);
-        }else{
+        } else {
             wechat.setOpenId(openId);
             wechat.setUnionId(unionId);
             wechat.setSessionKey(sessionKey);
@@ -158,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("用户不存在");
         }
 
@@ -175,7 +182,7 @@
 
         //获取用户信息
         User user = getUserById(userId);
-        if(user == null){
+        if (user == null) {
             throw new ValidationException("用户不存在");
         }
         result.setLoginName(user.getLoginName());
@@ -194,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());
@@ -223,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>()
@@ -247,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);
     }
 
@@ -259,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);
 
@@ -269,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());
@@ -283,6 +290,7 @@
 
     /**
      * 新增用户
+     *
      * @param dto
      * @return
      */
@@ -293,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("账号已存在");
         }
 
@@ -316,7 +324,7 @@
         addRole(dto.getRoleIds(), user.getId());
 
         //添加或更新员工信息
-        addEmployee(dto.getEmployeeDTO(),user.getId());
+        addEmployee(dto.getEmployeeDTO(), user.getId());
         return user;
     }
 
@@ -324,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);
@@ -374,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);
             }
         }
@@ -385,6 +393,7 @@
 
     /**
      * 更新用户
+     *
      * @param dto
      */
     public void updateUser(UpdateUserDTO dto) {
@@ -395,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));
             //给用户添加角色
@@ -407,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) {
@@ -433,7 +442,7 @@
         }
     }
 
-    public void deleteUser(String id){
+    public void deleteUser(String id) {
         User user = getUserById(id);
         user.setDeleted(true);
         user.update(SecurityUtils.getUserId());
@@ -447,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("原密码错误,无权修改");
             }
         }
@@ -461,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());
@@ -505,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
@@ -522,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;
@@ -531,11 +541,11 @@
 
     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{
+                try {
                     // 其次查找当前loginName是prephonenume的,userType是customer的用户存在不存在
                     if (StringUtils.isEmpty(dto.getPurePhoneNumber()) && StringUtils.isEmpty(dto.getPhoneNumber())) {
                         throw new ValidationException("微信获取的电话号码为空!无法注册");
@@ -572,7 +582,7 @@
                     BindWechatDTO wechatDTO = new BindWechatDTO();
                     wechatDTO.setRealName(dto.getPurePhoneNumber());
                     bindWechat(user.getId(), dto.getOpenId(), dto.getUnionId(), dto.getSessionKey(), wechatDTO);
-                }finally {
+                } finally {
                     lock.unlock();
                 }
             }
@@ -605,6 +615,10 @@
                     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());
@@ -621,6 +635,12 @@
                         // 注册商户信息
                         UpdateCustomerDTO updateCustomerDTO = new UpdateCustomerDTO();
                         updateCustomerDTO.setUserId(user.getId());
+                        updateCustomerDTO.setRegesterCode(dto.getIntevailCode());
+                        //有效邀请码注册成功后赠送1天会员
+                        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));
 
@@ -628,6 +648,8 @@
                         updateCustomerDTO.setCover("https://hmy-flower.oss-cn-shanghai.aliyuncs.com/8f/8f205ea4618b4ce48d5bd204ae73f075tmp_f0c47a66148245dc17d74563c5939e764273ba583619664d.jpg");
                         customerService.addOrUpdateCustomer(updateCustomerDTO);
 
+                        //邀请会员权益
+                        intervialUser(dto.getIntevailCode());
                         return user;
                     }
                 } finally {
@@ -640,5 +662,34 @@
         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