From 2d53554241065ae5b2bdf98b2f63363285c76c7c Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期一, 22 十二月 2025 10:39:42 +0800
Subject: [PATCH] feat:小程序端获取个人信息接口增加推广码生成

---
 ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/WxQrCodeUtil.java             |   75 +++++++++++++++++++++++++
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/UserIndexController.java   |   30 +++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/model/TAppUser.java                    |   10 +++
 ruoyi-system/src/main/java/com/ruoyi/system/enums/UserTypeEnum.java                |   23 +++++++
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/contstant/RedisConstant.java           |    8 ++
 6 files changed, 145 insertions(+), 2 deletions(-)

diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/UserIndexController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/UserIndexController.java
index a903d00..984d969 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/UserIndexController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/UserIndexController.java
@@ -4,17 +4,25 @@
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.system.contstant.RedisConstant;
 import com.ruoyi.system.dto.UpdatePhoneDto;
 import com.ruoyi.system.dto.UpdateUserDto;
+import com.ruoyi.system.enums.UserTypeEnum;
 import com.ruoyi.system.model.TAppUser;
 import com.ruoyi.system.service.TAppUserService;
 import com.ruoyi.system.service.TCommissionTransactionFlowService;
+import com.ruoyi.system.utils.wx.WxQrCodeUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.*;
+
+import java.util.Objects;
 
 /**
  * 个人中心相关接口
@@ -29,14 +37,34 @@
     private final TAppUserService tAppUserService;
     private final TokenService tokenService;
     private final TCommissionTransactionFlowService commissionTransactionFlowService;
+    private final WxQrCodeUtil wxQrCodeUtil;
+    private final RedisTemplate redisTemplate;
 
     @ApiOperation(value = "个人中心--用户信息",response = TAppUser.class)
     @GetMapping(value = "/getUserInfo")
     public R<TAppUser> getUserInfo() {
         Integer userId = tokenService.getLoginUserApplet().getUserId();
         TAppUser appUser = tAppUserService.getById(userId);
+        if (!appUser.getUserType().equals(UserTypeEnum.VISITOR.getCode())) {
+            Object cache = redisTemplate.opsForValue().get(RedisConstant.APP_USER_WX_IMG + appUser.getId());
+            if (Objects.isNull(cache)) {
+                if (StringUtils.isNotBlank(appUser.getCode())) {
+                    // 获取推广码
+                    String qrCodeBase64 = null;
+                    try {
+                        qrCodeBase64 = wxQrCodeUtil.getQrCodeBase64(appUser.getCode(), 2, RedisConstant.APP_USER_WX_IMG + appUser.getId());
+                    } catch (Exception e) {
+                        log.error("生成推广二维码失败,用户ID:{}", appUser.getId(), e);
+                    }
+                    appUser.setPromotionQrCode(qrCodeBase64);
 
-        return R.ok();
+                }
+            } else {
+                appUser.setPromotionQrCode(cache.toString());
+            }
+        }
+        //todo 查询预估积分
+        return R.ok(appUser);
     }
 
     @ApiOperation(value = "个人中心--修改手机号")
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index b911aa1..59ac191 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -176,6 +176,7 @@
             }
             // 手机号相同但openId为空的情况
             sysAppUser.setOpenid(openid);
+            sysAppUser.setPhone(appletUserDecodeData.getPhoneNumber());
             appUserService.updateById(sysAppUser);
         }
         LoginUserApplet loginUserApplet = new LoginUserApplet();
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/contstant/RedisConstant.java b/ruoyi-system/src/main/java/com/ruoyi/system/contstant/RedisConstant.java
new file mode 100644
index 0000000..0c8001d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/contstant/RedisConstant.java
@@ -0,0 +1,8 @@
+package com.ruoyi.system.contstant;
+
+public interface RedisConstant {
+    // 股东
+    String ADMIN_WX_IMG = "ADMIN_WX_IMG";
+    // 营销员/合伙人
+    String APP_USER_WX_IMG = "APP_USER_WX_IMG";
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/enums/UserTypeEnum.java b/ruoyi-system/src/main/java/com/ruoyi/system/enums/UserTypeEnum.java
new file mode 100644
index 0000000..f1b09da
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/enums/UserTypeEnum.java
@@ -0,0 +1,23 @@
+package com.ruoyi.system.enums;
+
+import lombok.Getter;
+import lombok.AllArgsConstructor;
+@Getter
+@AllArgsConstructor
+public enum UserTypeEnum {
+	VISITOR(1, "游客"),
+	SALESMAN(2, "营销员"),
+	PARTNER(3, "合伙人");
+
+	private final Integer code;
+	private final String desc;
+
+	public static UserTypeEnum getEnumByCode(Integer code) {
+		for (UserTypeEnum e : UserTypeEnum.values()) {
+			if (e.code.equals(code)) {
+				return e;
+			}
+		}
+		return null;
+	}
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TAppUser.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TAppUser.java
index 3693c55..cbcfa97 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TAppUser.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TAppUser.java
@@ -71,7 +71,7 @@
     @ApiModelProperty(value = "微信openid")
     @TableField("openid")
     private String openid;
-
+// 1:游客;2:营销员;3:合伙人;
     @ApiModelProperty(value = "角色(1=游客,2=营销员,3=合伙人)")
     @TableField("user_type")
     private Integer userType;
@@ -80,6 +80,10 @@
     @TableField("create_time")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "历史累计积分")
+    @TableField("total_accumulative_integral")
+    private Integer totalAccumulativeIntegral;
 
     @ApiModelProperty(value = "累计积分")
     @TableField("accumulative_integral")
@@ -113,4 +117,8 @@
     @TableField("referrer_sys_user_id")
     private Integer referrerSysUserId;
 
+    @ApiModelProperty(value = "当月预估积分")
+    @TableField(exist = false)
+    private Integer estimatedMonthlyIntegral;
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/WxQrCodeUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/WxQrCodeUtil.java
new file mode 100644
index 0000000..3efadd0
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/WxQrCodeUtil.java
@@ -0,0 +1,75 @@
+package com.ruoyi.system.utils.wx;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.icbc.api.internal.util.internal.util.fastjson.JSON;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.text.MessageFormat;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class WxQrCodeUtil {
+
+    @Value("${wx.url}")
+    private String ACCESS_TOKEN_URL;
+
+    @Value("${wx.conf.secretId}")
+    private String memberAppSecret;
+
+    @Value("${wx.conf.appId}")
+    private String wxAppId;
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    private String getAccessToken() {
+        Object o = redisTemplate.opsForValue().get("accessToken");
+        if (o != null) {
+            return o.toString();
+        }
+        String requestUrl = MessageFormat.format(ACCESS_TOKEN_URL, wxAppId, memberAppSecret);
+        String respBody = restTemplate.getForEntity(requestUrl, String.class).getBody();
+        JSONObject jsonObject = JSONObject.parseObject(respBody);
+        String string = jsonObject.getString("access_token");
+        redisTemplate.opsForValue().set("accessToken", string, 5000, TimeUnit.SECONDS);
+        return string;
+    }
+
+    /**
+     *
+     * @param code 推荐码
+     * @param type 推荐人类型 1:股东 2:营销员/合伙人
+     * @param cacheKey 缓存key
+     * @return
+     */
+
+    public String getQrCodeBase64(String code, Integer type, String cacheKey){
+        String accessToken = getAccessToken();
+        String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
+        Map<String, Object> param = new HashMap<>();
+        param.put("page", "pages/home/home");
+        param.put("width", 430); // 二维码尺寸
+        param.put("scene", "code=" + code + "&type=" + type); // 二维码尺寸
+        param.put("env_version", "trial"); // 二维码尺寸
+        HttpRequest post = HttpUtil.createPost(url);
+        post.body(JSON.toJSONString(param));
+
+        byte[] result = post.execute().bodyBytes();
+        // base64
+        String img = Base64.getEncoder().encodeToString(result);
+        // 后台用户的小程序码
+        redisTemplate.opsForValue().set(cacheKey, img);
+        return img;
+    }
+}

--
Gitblit v1.7.1