Przeglądaj źródła

Merge remote-tracking branch 'origin/dev-1.2.0' into dev-1.2.0

LiRong 3 miesięcy temu
rodzic
commit
ca243f70a9

+ 7 - 0
leromro-common/src/main/java/com/leromro/common/core/domain/model/LoginBody.java

@@ -42,12 +42,19 @@ public class LoginBody
      */
     private Long referrerId;
 
+    /**
+     * 推荐二维码版本,没有传入默认为1
+     */
+    private Integer referrerQrCodeVersion;
+
     /**
      * 用户当前经度
      * @return
      */
     private Double longitude;
 
+
+
     /**
      * 用户当前纬度
      * @return

+ 72 - 0
leromro-common/src/main/java/com/leromro/common/utils/WeChatMiniProgramUtil.java

@@ -13,6 +13,11 @@ import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.nio.charset.StandardCharsets;
 import java.util.Base64;
@@ -113,6 +118,15 @@ public class WeChatMiniProgramUtil {
         return response;
     }
 
+    /**
+     * 生成小程序码并在底部加上指定文字
+     */
+    public String generateQrCodeWithText(String scene, String page, String footerText) throws Exception {
+        byte[] qrCodeBytes = generateUnlimitedQrCode(scene, page);
+        return addTextToQrCode(qrCodeBytes, footerText, "微软雅黑", 18, Color.BLACK);
+    }
+
+
     /**
      * 生成不限制数量的小程序码(返回base64)
      */
@@ -157,6 +171,64 @@ public class WeChatMiniProgramUtil {
         return body;
     }
 
+    /**
+     * 在小程序码图片底部添加指定文字(带白色背景)
+     *
+     * @param imageBytes 原始图片字节流
+     * @param text       要添加的文字
+     * @param fontName   字体名称,如 "微软雅黑"
+     * @param fontSize   字号大小
+     * @param color      文字颜色
+     * @return 处理后的小程序码图片(Base64)
+     */
+    public String addTextToQrCode(byte[] imageBytes, String text, String fontName, int fontSize, Color color) throws Exception {
+        // 加载原始图片
+        BufferedImage originalImage = ImageIO.read(new ByteArrayInputStream(imageBytes));
+
+        // 底部留白高度
+        int bottomPadding = 40;
+
+        // 创建新图片,扩展高度以容纳文字和白底背景
+        BufferedImage newImage = new BufferedImage(
+                originalImage.getWidth(),
+                originalImage.getHeight() + bottomPadding,
+                BufferedImage.TYPE_INT_RGB // 使用 RGB 模式确保背景非透明
+        );
+
+        Graphics2D g = newImage.createGraphics();
+
+        // 抗锯齿设置
+        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+        // 绘制原图
+        g.drawImage(originalImage, 0, 0, null);
+
+        // 设置字体样式和颜色
+        Font font = new Font(fontName, Font.BOLD, fontSize);
+        g.setFont(font);
+        g.setColor(color);
+
+        // 填充一个白色矩形作为文字背景
+        g.setColor(Color.WHITE); // 白色背景
+        g.fillRect(0, originalImage.getHeight(), originalImage.getWidth(), bottomPadding);
+
+        // 绘制黑色文字
+        g.setColor(color); // 设置文字颜色,如 Color.BLACK
+        FontMetrics metrics = g.getFontMetrics();
+        int x = (originalImage.getWidth() - metrics.stringWidth(text)) / 2;
+        int y = originalImage.getHeight() + bottomPadding - 10;
+
+        // 绘制文字
+        g.drawString(text, x, y);
+
+        g.dispose();
+
+        // 输出为 Base64
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        ImageIO.write(newImage, "PNG", os);
+        return Base64.getEncoder().encodeToString(os.toByteArray());
+    }
+
     /**
      * 获取用户 session_key(用于解密用户信息)
      */

+ 1 - 1
leromro-core/src/main/java/com/leromro/core/controller/InviteUserController.java

@@ -107,7 +107,7 @@ public class InviteUserController extends BaseController
      */
     @ApiOperation("生成小程序用户邀请二维码")
     @GetMapping("/getInviteQrCode")
-    public R<String> getInviteQrCode(@RequestParam String referrerType, @RequestParam String referrerId,@RequestParam(required = false) String page){
+    public R<String> getInviteQrCode(@RequestParam String referrerType, @RequestParam Long referrerId,@RequestParam(required = false) String page){
         // 获取邀请二维码
         String qrCode = inviteUserService.getInviteQrCode(referrerType,referrerId,page);
         return R.ok(qrCode);

+ 1 - 1
leromro-core/src/main/java/com/leromro/core/service/IInviteUserService.java

@@ -81,5 +81,5 @@ public interface IInviteUserService extends IService<InviteUser>
      * @param page
      * @return
      */
-    String getInviteQrCode(String referrerType, String referrerId, String page);
+    String getInviteQrCode(String referrerType, Long referrerId, String page);
 }

+ 24 - 2
leromro-core/src/main/java/com/leromro/core/service/impl/InviteUserServiceImpl.java

@@ -162,6 +162,15 @@ public class InviteUserServiceImpl extends ServiceImpl<InviteUserMapper, InviteU
             return;
         }
 
+        // 如果当前是区域公司或服务中心的二维码,且没有二维码版本号,则说明是第一个版本的二维码,第一个版本二维码存的是用户id,通过用户id获取用户所属部门id,推荐id改为部门id
+        if (loginBody.getReferrerQrCodeVersion() == null
+                && (ReferrerTypeEnum.AREA_COMPANY.getCode().equals(referrerType)
+                || ReferrerTypeEnum.SERVICE_CENTRE.getCode().equals(referrerType))) {
+            // 获取推荐者用户信息
+            SysUser referrerUserInfo = iSysUserService.getById(referrerId);
+            referrerId = referrerUserInfo.getDeptId();
+        }
+
         // 保存用户推荐信息
         SysUser paramForUpdateUser = new SysUser();
         if(ReferrerTypeEnum.USER.getCode().equals(referrerType)){
@@ -265,11 +274,24 @@ public class InviteUserServiceImpl extends ServiceImpl<InviteUserMapper, InviteU
     }
 
     @Override
-    public String getInviteQrCode(String referrerType, String referrerId, String page) {
+    public String getInviteQrCode(String referrerType, Long referrerId, String page) {
+        /**
+         * 获取推荐者名称
+         */
+        String referrerName = null;
+        if(ReferrerTypeEnum.USER.getCode().equals(referrerType)){
+            SysUser referrerUserInfo = iSysUserService.selectUserById(referrerId);
+            referrerName = referrerUserInfo.getNickName();
+        }else{
+            SysDept referrerUserAreaInfo = sysDeptServiceImpl.selectDeptById(referrerId);
+            referrerName = referrerUserAreaInfo.getDeptName();
+        }
         // 获取邀请二维码
         String qrCode = null;
+        String footerText = "金邻助家("+referrerName+")";
         try {
-            qrCode = weChatMiniProgramUtil.generateUnlimitedQrCodeToBase64(referrerType+":"+referrerId, page);
+            // 参数说明(referrerType+":"+referrerId+":2"),最后一个2标识当前二维码版本
+            qrCode = weChatMiniProgramUtil.generateQrCodeWithText(referrerType+":"+referrerId+":2", page,footerText);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }