|
@@ -18,6 +18,10 @@ import com.alipay.api.response.AlipayUserInfoShareResponse;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
+import com.github.binarywang.utils.qrcode.MatrixToImageWriter;
|
|
|
|
|
+import com.google.zxing.BarcodeFormat;
|
|
|
|
|
+import com.google.zxing.common.BitMatrix;
|
|
|
|
|
+import com.google.zxing.qrcode.QRCodeWriter;
|
|
|
import com.ruoyi.common.constant.Constants;
|
|
import com.ruoyi.common.constant.Constants;
|
|
|
import com.ruoyi.common.core.domain.PageQuery;
|
|
import com.ruoyi.common.core.domain.PageQuery;
|
|
|
import com.ruoyi.common.core.page.TableDataInfo;
|
|
import com.ruoyi.common.core.page.TableDataInfo;
|
|
@@ -29,14 +33,12 @@ import com.ruoyi.common.utils.IOSToeknUtils;
|
|
|
import com.ruoyi.common.utils.ShareCodeUtils;
|
|
import com.ruoyi.common.utils.ShareCodeUtils;
|
|
|
import com.ruoyi.common.utils.SmsSend;
|
|
import com.ruoyi.common.utils.SmsSend;
|
|
|
import com.ruoyi.common.utils.StringUtils;
|
|
import com.ruoyi.common.utils.StringUtils;
|
|
|
|
|
+import com.ruoyi.common.utils.redis.RedisUtils;
|
|
|
import com.ruoyi.common.utils.rest.RestUtil;
|
|
import com.ruoyi.common.utils.rest.RestUtil;
|
|
|
import com.ruoyi.user.domain.User;
|
|
import com.ruoyi.user.domain.User;
|
|
|
import com.ruoyi.user.domain.UserThirdIdentity;
|
|
import com.ruoyi.user.domain.UserThirdIdentity;
|
|
|
import com.ruoyi.user.domain.bo.*;
|
|
import com.ruoyi.user.domain.bo.*;
|
|
|
-import com.ruoyi.user.domain.vo.UserBindingVo;
|
|
|
|
|
-import com.ruoyi.user.domain.vo.UserLoginVo;
|
|
|
|
|
-import com.ruoyi.user.domain.vo.UserStatisticsVo;
|
|
|
|
|
-import com.ruoyi.user.domain.vo.UserVo;
|
|
|
|
|
|
|
+import com.ruoyi.user.domain.vo.*;
|
|
|
import com.ruoyi.user.enums.IntegralBillType;
|
|
import com.ruoyi.user.enums.IntegralBillType;
|
|
|
import com.ruoyi.user.enums.UserThirdType;
|
|
import com.ruoyi.user.enums.UserThirdType;
|
|
|
import com.ruoyi.user.exception.UserExceptionEnum;
|
|
import com.ruoyi.user.exception.UserExceptionEnum;
|
|
@@ -50,6 +52,10 @@ import lombok.RequiredArgsConstructor;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
|
|
+import javax.imageio.ImageIO;
|
|
|
|
|
+import java.awt.image.BufferedImage;
|
|
|
|
|
+import java.io.ByteArrayOutputStream;
|
|
|
|
|
+import java.io.IOException;
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
|
|
|
|
@@ -611,6 +617,72 @@ public class UserServiceImpl implements IUserService {
|
|
|
this.baseMapper.updateById(user);
|
|
this.baseMapper.updateById(user);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public MemberCodeVo generateMemberCode(Long userId, Boolean isRefresh) {
|
|
|
|
|
+ String userKey = Constants.USER_MEMBER + userId;
|
|
|
|
|
+ String codeKeyPrefix = Constants.MEMBER_CODE;
|
|
|
|
|
+ if (isRefresh) {
|
|
|
|
|
+ // 清除旧的映射关系
|
|
|
|
|
+ String oldCode = RedisUtils.getCacheObject(userKey);
|
|
|
|
|
+ if (StringUtils.isNotBlank(oldCode)) {
|
|
|
|
|
+ RedisUtils.deleteObject(codeKeyPrefix + oldCode);
|
|
|
|
|
+ }
|
|
|
|
|
+ RedisUtils.deleteObject(userKey);
|
|
|
|
|
+ }
|
|
|
|
|
+ String code = RedisUtils.getCacheObject(userKey);
|
|
|
|
|
+ if (StringUtils.isBlank(code)) {
|
|
|
|
|
+ code = generateUniqueMemberCode(userId);
|
|
|
|
|
+ RedisUtils.setCacheObject(userKey, code);
|
|
|
|
|
+ RedisUtils.setCacheObject(codeKeyPrefix + code, userId);
|
|
|
|
|
+ }
|
|
|
|
|
+ MemberCodeVo vo = new MemberCodeVo();
|
|
|
|
|
+ vo.setCode(code);
|
|
|
|
|
+ vo.setQrUrl(generateQr(code));
|
|
|
|
|
+ return vo;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String generateUniqueMemberCode(Long userId) {
|
|
|
|
|
+ //生成唯一码 用户不会重复 6-8位
|
|
|
|
|
+ String userIdPart = String.valueOf(userId);
|
|
|
|
|
+ if (userIdPart.length() < 4) {
|
|
|
|
|
+ userIdPart = String.format("%04d", userId); // 补0凑4位(如123 → 0123)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ userIdPart = userIdPart.substring(userIdPart.length() - 4); // 取后4位
|
|
|
|
|
+ }
|
|
|
|
|
+ // 2. 处理时间戳(取后4位,不足4位补0)
|
|
|
|
|
+ String timePart = String.valueOf(System.currentTimeMillis());
|
|
|
|
|
+ timePart = timePart.substring(timePart.length() - 4);
|
|
|
|
|
+ if (timePart.length() < 4) {
|
|
|
|
|
+ timePart = String.format("%04d", Long.parseLong(timePart)); // 补0凑4位(如123 → 0123)
|
|
|
|
|
+ }
|
|
|
|
|
+ String randomPart = String.valueOf((int)(Math.random() * 1000));
|
|
|
|
|
+ // 3. 拼接为12位会员码
|
|
|
|
|
+ return userIdPart + timePart + randomPart;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String generateQr(String memberCode) {
|
|
|
|
|
+ QRCodeWriter writer = new QRCodeWriter();
|
|
|
|
|
+ ByteArrayOutputStream outputStream = null;
|
|
|
|
|
+ try {
|
|
|
|
|
+ BitMatrix bitMatrix = writer.encode(memberCode, BarcodeFormat.QR_CODE, 300, 300);
|
|
|
|
|
+ BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
|
|
|
|
|
+
|
|
|
|
|
+ outputStream = new ByteArrayOutputStream();
|
|
|
|
|
+ ImageIO.write(image, "png", outputStream);
|
|
|
|
|
+ return "data:image/png;base64," + Base64.getEncoder().encodeToString(outputStream.toByteArray());
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ if (outputStream != null) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ outputStream.close();
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ // 静默关闭,不影响主流程
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 获取微信OpenId
|
|
* 获取微信OpenId
|
|
|
*
|
|
*
|