puhanshu
2022-01-12 10cc0db30a1be5377e4c09bce349014a667849b6
springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/service/impl/UserServiceImpl.java
@@ -2,6 +2,7 @@
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.util.ArrayList;
import java.util.Date;
@@ -9,11 +10,14 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import com.panzhihua.common.model.vos.community.microCommercialStreet.McsLoginUserInfoVO;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.BeanUtils;
@@ -38,6 +42,7 @@
import com.panzhihua.common.model.dtos.community.NoticeReadDTO;
import com.panzhihua.common.model.dtos.community.convenient.ConvenientMerchantDTO;
import com.panzhihua.common.model.dtos.community.convenient.DisableOrEnableConvenientMerchantDTO;
import com.panzhihua.common.model.dtos.community.microCommercialStreet.McsMerchantDTO;
import com.panzhihua.common.model.dtos.grid.EventGridMemberAddDTO;
import com.panzhihua.common.model.dtos.grid.EventGridMemberEditAdminDTO;
import com.panzhihua.common.model.dtos.grid.EventGridMemberEditStatusDTO;
@@ -81,6 +86,7 @@
import com.panzhihua.common.model.vos.user.UserPhoneVO;
import com.panzhihua.common.utlis.IdCard;
import com.panzhihua.common.utlis.SensitiveUtil;
import com.panzhihua.common.utlis.SmsUtil;
import com.panzhihua.common.utlis.Snowflake;
import com.panzhihua.common.utlis.StringUtils;
import com.panzhihua.common.utlis.WxUtil;
@@ -2799,4 +2805,157 @@
        BeanUtils.copyProperties(sysUserDO, loginUserInfoVO);
        return R.ok(loginUserInfoVO);
    }
    /**
     * 微商业街新增商家账号
     * @param mcsMerchantDTO
     * @return 商家用户id
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R addMcsMerchantUser(McsMerchantDTO mcsMerchantDTO) {
        SysUserDO sysUserDO;
        sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda()
                .eq(SysUserDO::getAccount, mcsMerchantDTO.getAccount()).eq(SysUserDO::getType, 11));
        if (nonNull(sysUserDO)) {
            return R.fail("账户已经存在");
        }
        // sys_user 表
        sysUserDO = new SysUserDO();
        String encode = new BCryptPasswordEncoder().encode(mcsMerchantDTO.getPassword());
        BeanUtils.copyProperties(mcsMerchantDTO, sysUserDO);
        sysUserDO.setAccount(mcsMerchantDTO.getAccount());
        sysUserDO.setType(11);
        sysUserDO.setAreaId(null);
        sysUserDO.setStatus(mcsMerchantDTO.getAccountStatus());
        sysUserDO.setPhone(mcsMerchantDTO.getPhone());
        sysUserDO.setPassword(encode);
        sysUserDO.setPlaintextPassword(mcsMerchantDTO.getPassword());
        try {
            userDao.insert(sysUserDO);
            McsLoginUserInfoVO loginUserInfoVO = new McsLoginUserInfoVO();
            BeanUtils.copyProperties(sysUserDO, loginUserInfoVO);
            return R.ok(loginUserInfoVO);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("修改数字商业街商家用户报错【{}】", e.getMessage());
            if (e.getMessage().contains("union_phone_type")) {
                return R.fail("手机号已存在");
            } else if (e.getMessage().contains("union_account_type")) {
                return R.fail("账户已经存在");
            }else if(e.getMessage().contains("23000")){
                return R.fail("手机号已存在");
            } else {
                return R.fail("账户或手机号已存在,请重新填写尝试");
            }
        }
    }
    /**
     * 微商业街修改商家账号
     * @param mcsMerchantDTO
     * @return
     */
    @Override
    public R putMcsMerchantUser(McsMerchantDTO mcsMerchantDTO) {
        SysUserDO sysUserDO = userDao.selectById(mcsMerchantDTO.getUserId());
        if (isNull(sysUserDO)) {
            return R.fail("用户不存在");
        }
        String account = mcsMerchantDTO.getAccount();
        String phone = mcsMerchantDTO.getPhone();
        Integer accountStatus = mcsMerchantDTO.getAccountStatus();
        if (isNotBlank(account)) {
            sysUserDO.setAccount(account);
        }
        if (isNotBlank(phone)) {
            sysUserDO.setPhone(phone);
        }
        if (nonNull(accountStatus)) {
            sysUserDO.setStatus(accountStatus);
        }
        try {
            userDao.updateById(sysUserDO);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("修改数字商业街商家用户报错【{}】", e.getMessage());
            if (e.getMessage().contains("union_phone_type")) {
                return R.fail("手机号已存在");
            } else if (e.getMessage().contains("union_account_type")) {
                return R.fail("账户已经存在");
            }else if(e.getMessage().contains("23000")){
                return R.fail("手机号已存在");
            } else {
                return R.fail("账户或手机号已存在,请重新填写尝试");
            }
        }
        return R.ok();
    }
    /**
     * 检查用户是否有效
     * @param userId
     * @param type
     * @return
     */
    @Override
    public Boolean checkUserIsValid(Long userId, Integer type) {
        SysUserDO sysUserDO = userDao.selectById(userId);
        if (isNull(sysUserDO) || sysUserDO.getStatus() != 1 || !sysUserDO.getType().equals(type)) {
            return false;
        }
        return true;
    }
    /**
     * 根据手机号、用户类型查询用户
     * @param phone
     * @param type
     * @return
     */
    @Override
    public R getSysUserByPhone(String phone, Integer type) {
        SysUserDO sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getPhone, phone).eq(SysUserDO::getType, type));
        McsLoginUserInfoVO loginUserInfoVO = null;
        if (nonNull(sysUserDO)) {
            loginUserInfoVO = new McsLoginUserInfoVO();
            BeanUtils.copyProperties(sysUserDO, loginUserInfoVO);
        }
        return R.ok(loginUserInfoVO);
    }
    /**
     * 发送验证码登录
     * @param phone 手机号
     * @param clientIP 用户ip
     * @param prefixKey redis Key 前缀
     * @param limit 获取次数限制
     * @param timeout 超次数获取时间等待
     * @return
     */
    @Override
    public R sendMessageCodeForLogin(String phone, String clientIP, String prefixKey, Integer limit, Integer timeout) {
        ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
        if (isNotBlank(clientIP)) {
            String redisKey = String.join("::", prefixKey, clientIP);
            Long increment = opsForValue.increment(redisKey, 1);
            if (increment > limit) {
                return R.fail("请求频繁,请稍后再试");
            }
            stringRedisTemplate.expire(redisKey, timeout, TimeUnit.SECONDS);
        }
        Random r = new Random();
        StringBuilder rs = new StringBuilder();
        for (int i = 0; i < 5; i++) {
            rs.append(r.nextInt(10));
        }
        String code = rs.toString();
        int result = SmsUtil.sendCode(phone, code);
        if (result == 1) {
            String codeKey = String.join("::", phone, code);
            opsForValue.set(codeKey, code, timeout, TimeUnit.SECONDS);
            return R.ok();
        }
        return R.fail();
    }
}