Browse Source

分享成为会员海报等

caoliqin 5 days ago
parent
commit
1b975df711

+ 39 - 7
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -3,14 +3,18 @@ package com.fs.app.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.fs.app.annotation.Login;
+import com.fs.app.config.ImageStorageConfig;
 import com.fs.app.param.FsUserTagUpdateParam;
 import com.fs.app.param.FsUserUpdateParam;
+import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.exception.ServiceException;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyTagUserService;
 import com.fs.company.service.ICompanyUserService;
+import com.fs.course.param.newfs.FsUserCourseBeMemberImageParam;
 import com.fs.course.param.newfs.FsUserCourseBeMemberParam;
+import com.fs.course.service.IFsUserCourseService;
 import com.fs.course.vo.newfs.FsCourseAnalysisVO;
 import com.fs.store.param.h5.CourseAnalysisParam;
 import com.fs.store.domain.FsUser;
@@ -29,11 +33,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 @Slf4j
 @Api(tags = "用户会员相关接口")
@@ -41,7 +44,6 @@ import java.util.Objects;
 @RequestMapping("/app/fs/user")
 public class FsUserController extends AppBaseController {
 
-
     @Autowired
     private IFsUserService fsUserService;
 
@@ -50,9 +52,12 @@ public class FsUserController extends AppBaseController {
 
     @Autowired
     private ICompanyTagUserService companyTagUserService;
-//
-//    @Autowired
-//    private IQwTagService tagService;
+
+    @Autowired
+    private ImageStorageConfig imageConfig;
+
+    @Autowired
+    private IFsUserCourseService fsUserCourseService;
 
     @Login
     @PostMapping("/pageList")
@@ -279,4 +284,31 @@ public class FsUserController extends AppBaseController {
         return fsUserService.becomeMember(param);
     }
 
+    @Login
+    @PostMapping("/userImage")
+    @ApiOperation("生成分享会员海报")
+    public R createCourseImage(@RequestBody FsUserCourseBeMemberImageParam param) {
+        try {
+            //获取用户头像
+//            FsUser fsUser = fsUserService.selectFsUserById(param.getUserId());
+//            String url = "";
+//            if(fsUser != null) {
+//                url = fsUser.getAvatar();
+//            }
+            String path = imageConfig.getServerPath();
+            InputStream inputStream = fsUserCourseService.handleImage("", path);
+
+            // todo 为了给客户演示,生成会员的封面暂时随便找的课程封面,如果后期要修改的话就调整
+            String backgroundImagePath = "https://cos.his.cdwjyyh.com/fs/20240914/250af4b0041b46d1a36a34af1d5ccd54.jpg";
+            String base64Image = fsUserCourseService.createUserImageQR(param.getRealLink(), backgroundImagePath, inputStream, "png", param.getCompanyUserId());
+            // 返回Base64编码的图片字符串
+            Map<String, Object> map = new HashMap<>();
+            map.put("url", base64Image);
+            return R.ok().put("posterImage", map);
+        } catch (Exception e) {
+            log.error("生成海报失败,param:{}", param);
+            return R.error("生成海报失败!");
+        }
+    }
+
 }

+ 4 - 2
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -27,6 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.File;
+import java.io.InputStream;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -138,11 +139,12 @@ public class FsUserCourseVideoController extends AppBaseController {
         try {
             String path = imageConfig.getServerPath();
             log.info("获取的logo图片路径,fileUrl:{}", path);
-            File file = new File(path);
+            InputStream inputStream = fsUserCourseService.handleImage("", path);
+
             if (StringUtils.isEmpty(param.getImgUrl())) {
                 return R.error(400, "课程封面不能为空!");
             }
-            String base64Image = fsUserCourseService.createCourseImageQR(realLink, param.getImgUrl(), file, "png", param.getTitle(), param.getDuration());
+            String base64Image = fsUserCourseService.createCourseImageQR(realLink, param.getImgUrl(), inputStream, "png", param.getTitle(), param.getDuration());
             // 返回Base64编码的图片字符串
             Map<String, Object> map = new HashMap<>();
             map.put("url", base64Image);

+ 9 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyUser.java

@@ -130,6 +130,9 @@ public class CompanyUser extends BaseEntity
     /** 是否审核 */
     private Integer isAudit;
 
+    /** 会员是否黑名单,1-是;0-否(用于销售分享成为会员的操作) */
+    private Integer fsUserIsDefaultBlack;
+
     public Integer getIsAudit() {
         return isAudit;
     }
@@ -448,5 +451,11 @@ public class CompanyUser extends BaseEntity
         return isDel;
     }
 
+    public Integer getFsUserIsDefaultBlack() {
+        return fsUserIsDefaultBlack;
+    }
 
+    public void setStatusText(String statusText) {
+        this.statusText = statusText;
+    }
 }

+ 33 - 0
fs-service-system/src/main/java/com/fs/course/param/newfs/FsUserCourseBeMemberImageParam.java

@@ -0,0 +1,33 @@
+package com.fs.course.param.newfs;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "邀请成为会员海报入参")
+public class FsUserCourseBeMemberImageParam implements Serializable {
+
+    @ApiModelProperty(value = "授权的用户id")
+    private Long userId;
+
+    @NotNull(message = "销售id不能为空")
+    @ApiModelProperty(value = "销售id")
+    private Long companyUserId;
+
+    @NotNull(message = "公司id不能为空")
+    @ApiModelProperty(value = "公司id")
+    private Long companyId;
+
+    @ApiModelProperty(value = "标签ids,多个用逗号隔开")
+    private String tagIds;
+
+    @NotNull(message = "链接不能为空")
+    @ApiModelProperty(value = "跳转链接")
+    private String realLink;
+
+
+}

+ 1 - 1
fs-service-system/src/main/java/com/fs/course/param/newfs/FsUserCourseBeMemberParam.java

@@ -21,7 +21,7 @@ public class FsUserCourseBeMemberParam implements Serializable {
     @ApiModelProperty(value = "公司id")
     private Long companyId;
 
-    @ApiModelProperty(value = "标签ids,多个用逗号隔开")
+    @ApiModelProperty(value = "标签ids,数组格式")
     private String[] tagIds;
 
 

+ 25 - 2
fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseService.java

@@ -1,6 +1,7 @@
 package com.fs.course.service;
 
-import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
 
@@ -135,7 +136,7 @@ public interface IFsUserCourseService
      * @return
      * @throws Exception
      */
-    String createCourseImageQR(String url, String backgroundImagePath, File file, String outputFormat, String title, String duration) throws Exception;
+    String createCourseImageQR(String url, String backgroundImagePath, InputStream file, String outputFormat, String title, String duration) throws Exception;
 
     /**
      * 创建 分享成为会员 短链
@@ -143,4 +144,26 @@ public interface IFsUserCourseService
      * @return
      */
     R createCourseMemberSortLink(FsCourseLinkCreateParam param);
+
+    /**
+     * 获取链接图片或者本地图片
+     * @param url 链接地址
+     * @param path 本地图片路径
+     * @return
+     * @throws IOException
+     */
+    InputStream handleImage(String url, String path) throws IOException;
+
+    /**
+     * 生成分享成为会员海报
+     * @param url
+     * @param backgroundImagePath
+     * @param file
+     * @param outputFormat
+     * @param companyUserId
+     * @return
+     * @throws Exception
+     */
+    String createUserImageQR(String url, String backgroundImagePath, InputStream file, String outputFormat, Long companyUserId) throws Exception;
+
 }

+ 67 - 13
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -9,9 +9,8 @@ import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.DictUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyTag;
-import com.fs.company.domain.CompanyTagUser;
+import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyTagMapper;
-import com.fs.company.mapper.CompanyTagUserMapper;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.*;
@@ -28,6 +27,7 @@ import com.google.zxing.EncodeHintType;
 import com.google.zxing.client.j2se.MatrixToImageWriter;
 import com.google.zxing.common.BitMatrix;
 import com.google.zxing.qrcode.QRCodeWriter;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -36,13 +36,11 @@ import org.springframework.transaction.annotation.Transactional;
 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.io.IOException;
+import java.io.*;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.net.URL;
+import java.net.URLConnection;
 import java.util.*;
 import java.util.List;
 
@@ -53,6 +51,7 @@ import java.util.List;
  * @date 2024-05-15
  */
 @Service
+@Slf4j
 public class FsUserCourseServiceImpl implements IFsUserCourseService
 {
     @Autowired
@@ -451,7 +450,7 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
 
 
     @Override
-    public String createCourseImageQR(String url, String backgroundImagePath, File file,
+    public String createCourseImageQR(String url, String backgroundImagePath, InputStream file,
                                       String outputFormat, String title, String duration) throws Exception {
         // 读取并缩放背景图片
         BufferedImage backgroundImage = createScaledBackgroundImage(backgroundImagePath);
@@ -470,7 +469,7 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         graphics.fillRect(0, scaledHeight, scaledWidth, bottomHeight);
 
         // 绘制推荐区域(图片和文字)
-        drawRecommendationArea(graphics, file, scaledHeight);
+        drawRecommendationArea(graphics, file, scaledHeight, "云联融智", "为您推荐");
 
         // 绘制二维码
         drawQRCode(graphics, url, scaledWidth, totalHeight);
@@ -529,7 +528,7 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
     /**
      * 绘制推荐区域
      */
-    private void drawRecommendationArea(Graphics2D graphics, File file, int scaledHeight) throws IOException {
+    private void drawRecommendationArea(Graphics2D graphics, InputStream file, int scaledHeight, String recommendName, String recommendContent) throws IOException {
         // 读取并绘制推荐图片
         BufferedImage referenceImg = ImageIO.read(file);
         int refHeight = 40;
@@ -546,16 +545,16 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         int textX = refX + refWidth + 10;
         int textY = refY + 25;
         graphics.setColor(new Color(51, 51, 51));
-        graphics.drawString("云联融智", textX, textY);
+        graphics.drawString(recommendName, textX, textY);
 
         // 绘制"为您推荐"
         FontMetrics metrics = graphics.getFontMetrics(recommendFont);
-        int brandWidth = metrics.stringWidth("云联融智");
+        int brandWidth = metrics.stringWidth(recommendName);
         int textX1 = textX + brandWidth + 5;
         graphics.setColor(new Color(102, 102, 102));
-        graphics.drawString("为您推荐", textX1, textY);
+        graphics.drawString(recommendContent, textX1, textY);
 //        FontMetrics metrics = graphics.getFontMetrics(recommendFont);
-        int reWidth = metrics.stringWidth("为您推荐");
+        int reWidth = metrics.stringWidth(recommendContent);
     }
 
 
@@ -665,6 +664,61 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         return R.error("生成链接失败!");
     }
 
+    @Override
+    public InputStream handleImage(String url, String path) throws IOException {
+        InputStream inputstream = null;
+        if(StringUtils.isNotEmpty(url)){
+            URL newUrl = new URL(url);
+            URLConnection connection = newUrl.openConnection();
+            // 设置用户代理,避免被服务器拒绝
+            connection.setRequestProperty("User-Agent", "Mozilla/5.0");
+            inputstream = connection.getInputStream();
+        } else {
+            File file = new File(path);
+            try{
+                inputstream = new FileInputStream(file);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+                log.error("获取本地路径失败:{}", path);
+            }
+        }
+        log.info("头像/logo路径, url:{}, path:{}", url, path);
+        return inputstream;
+    }
+
+    @Override
+    public String createUserImageQR(String url, String backgroundImagePath, InputStream file, String outputFormat, Long companyUserId) throws Exception {
+        // 读取并缩放背景图片
+        BufferedImage backgroundImage = createScaledBackgroundImage(backgroundImagePath);
+        int scaledWidth = backgroundImage.getWidth();
+        int scaledHeight = backgroundImage.getHeight();
+
+        // 创建最终的合成图片,确保底部区域有足够空间
+        int bottomHeight = 200; // 增加底部区域高度,确保内容完全显示
+        int totalHeight = scaledHeight + bottomHeight;
+        BufferedImage combined = new BufferedImage(scaledWidth, totalHeight, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D graphics = initializeGraphics(combined);
+
+        // 绘制背景和底部白色区域
+        graphics.drawImage(backgroundImage, 0, 0, null);
+        graphics.setColor(Color.WHITE);
+        graphics.fillRect(0, scaledHeight, scaledWidth, bottomHeight);
+
+        //获取销售名称
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(companyUserId);
+
+        // 绘制推荐区域(图片和文字)
+        drawRecommendationArea(graphics, file, scaledHeight, companyUser != null ? companyUser.getUserName(): "云联融智", "邀请您成为会员");
+
+        // 绘制二维码
+        drawQRCode(graphics, url, scaledWidth, totalHeight);
+
+        graphics.dispose();
+
+        // 转换为Base64
+        return convertToBase64(combined, outputFormat);
+    }
+
     private static Calendar getExpireDay(FsCourseLinkCreateParam param, CourseConfig config, Date createTime) {
         Integer expireDuration;
         if (param.getEffectiveDuration() == null || param.getEffectiveDuration() == 0){