陶杰
2024-12-31 dc885d07f9f62c60ac90dbd0c44c5fdbb0b00486
src/main/java/com/mzl/flower/service/system/UserService.java
@@ -7,12 +7,11 @@
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.CreateWechatUserDTO;
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.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.dto.response.system.*;
import com.mzl.flower.entity.point.CustomerPoint;
import com.mzl.flower.entity.system.*;
import com.mzl.flower.enums.TrueOrFalseEnum;
@@ -20,6 +19,7 @@
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.payment.RedisLockService;
import com.mzl.flower.service.point.CustomerPointService;
import com.mzl.flower.service.supplier.StationService;
import com.mzl.flower.service.supplier.SupplierService;
@@ -27,15 +27,21 @@
import com.mzl.flower.utils.UUIDGenerator;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
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 org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import javax.validation.constraints.NotBlank;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Service
@Transactional
@@ -83,6 +89,8 @@
    @Autowired
    private StationService stationService;
    @Autowired
    RedissonClient redissonClient;
    public User findUserByOpenId(String openId, String sessionKey, String unionId
            , String imgUrl, String nickname,String userType){
@@ -92,7 +100,8 @@
        if(user == null){
            throw new ValidationException("请注册账号后至\"个人中心-绑定微信\"后再使用微信登录");
        }
        user.setNickName(nickname);
//        user.setNickName(nickname);
        user.setNickName(user.getLoginName());
        user.setPicture(imgUrl);
        user.update(user.getId());
        userMapper.updateById(user);
@@ -483,4 +492,79 @@
                .eq(User::getVipGrade,getVipGrade);
        return userMapper.selectList(queryWrapper);
    }
    /**
     * 查看微信是否已经存在用户
     * @param openId
     * @param sessionKey
     * @param unionId
     * @param userType
     * @return
     */
    public User getExistUserByOpenId(String openId, String sessionKey, String unionId, String userType) {
        List<String> userTypes = new ArrayList<>();
        userTypes.add(userType);
        User user = userMapper.getByOpenID(openId,userTypes);
        return user;
    }
    public void registWxUser(CreateWechatUserDTO dto) {
        String RETISTER_KEY = "%s_%s";
        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));
                    }
                    customerService.addOrUpdateCustomer(updateCustomerDTO);
                }
                BindWechatDTO wechatDTO = new BindWechatDTO();
                wechatDTO.setRealName(dto.getPurePhoneNumber());
                bindWechat(user.getId(), dto.getOpenId(), dto.getUnionId(), dto.getSessionKey(), wechatDTO);
                }finally {
                    lock.unlock();
                }
            }
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
    public Page<UserListInfoDTO> searchUserInfos(SearchUserDTO dto, Page page) {
        List<UserListInfoDTO> result = userMapper.searchUserInfo(page, dto);
        page.setRecords(result);
        return page;
    }
}