Selaa lähdekoodia

Merge remote-tracking branch 'origin/master_179_20250814' into master_179_20250814

xgb 1 päivä sitten
vanhempi
commit
935d033e28

+ 2 - 2
fs-service/src/main/java/com/fs/medical/mapper/ReportIndicatorResultMapper.java

@@ -28,7 +28,7 @@ public interface ReportIndicatorResultMapper {
             "concat(mi.reference_min,' ~ ',mi.reference_max) as ref_range,\n" +
             "rir.test_value,rir.test_result,rir.is_abnormal,rir.remarks,rir.create_time,rir.update_time\n" +
             "FROM fs_report_indicator_result  rir\n" +
-            "left join fs_medical_indicator mi\n" +
+            "inner join fs_medical_indicator mi\n" +
             "on rir.indicator_id=mi.indicator_id and rir.report_id=#{reportId}")
     List<ReportIndicatorResult> listByReportId(@Param("reportId") Long reportId);
 
@@ -86,7 +86,7 @@ public interface ReportIndicatorResultMapper {
             "rir.create_time, " +
             "rir.update_time " +
             "FROM fs_report_indicator_result rir " +
-            "LEFT JOIN fs_medical_indicator mi ON rir.indicator_id = mi.indicator_id " +
+            "inner JOIN fs_medical_indicator mi ON rir.indicator_id = mi.indicator_id " +
             "WHERE rir.report_id = #{reportId} " +
             "<if test='indicatorName != null and indicatorName != \"\"'>" +
             "AND mi.indicator_name LIKE CONCAT('%', #{indicatorName}, '%') " +

+ 1 - 0
fs-service/src/main/java/com/fs/medical/service/ReportIndicatorResultService.java

@@ -47,4 +47,5 @@ public interface ReportIndicatorResultService {
 
     List<ReportAllIndicatorCateDTO> getAllIndicatorByReportId(Long reportId);
 
+    boolean updateBatch(List<ReportIndicatorResult> resultList);
 }

+ 38 - 0
fs-service/src/main/java/com/fs/medical/service/impl/ReportIndicatorResultServiceImpl.java

@@ -12,7 +12,10 @@ import com.fs.medical.param.ReportIndicatorResultQueryDto;
 import com.fs.medical.service.ReportIndicatorResultService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.List;
 
@@ -59,6 +62,32 @@ public class ReportIndicatorResultServiceImpl implements ReportIndicatorResultSe
 
     @Override
     public boolean update(ReportIndicatorResult result) {
+        // 如果testValue不为空且indicatorId不为空,则进行异常判断
+        if (result.getTestValue() != null && result.getIndicatorId() != null) {
+            // 查询指标信息获取参考范围
+            MedicalIndicator indicator = medicalIndicatorMapper.getById(result.getIndicatorId());
+
+            if (indicator != null && indicator.getReferenceMin() != null && indicator.getReferenceMax() != null) {
+                BigDecimal testValue = result.getTestValue();
+                BigDecimal referenceMin = indicator.getReferenceMin();
+                BigDecimal referenceMax = indicator.getReferenceMax();
+
+                // 判断是否在正常范围内
+                if (testValue.compareTo(referenceMin) >= 0 && testValue.compareTo(referenceMax) <= 0) {
+                    // 正常范围内
+                    result.setIsAbnormal(0);
+                    result.setAbnormalType(null);
+                } else if (testValue.compareTo(referenceMin) < 0) {
+                    // 偏低
+                    result.setIsAbnormal(1);
+                    result.setAbnormalType("偏低");
+                } else {
+                    // 偏高
+                    result.setIsAbnormal(1);
+                    result.setAbnormalType("偏高");
+                }
+            }
+        }
         return reportIndicatorResultMapper.update(result) > 0;
     }
 
@@ -80,4 +109,13 @@ public class ReportIndicatorResultServiceImpl implements ReportIndicatorResultSe
         }
         return allIndicatorByReportId;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
+    public boolean updateBatch(List<ReportIndicatorResult> resultList) {
+        for (ReportIndicatorResult reportIndicatorResult : resultList) {
+            this.update(reportIndicatorResult);
+        }
+        return true;
+    }
 }

+ 1 - 1
fs-service/src/main/java/com/fs/saler/mapper/FsCompetitorInfoMapper.java

@@ -44,7 +44,7 @@ public interface FsCompetitorInfoMapper {
             "AND remark LIKE CONCAT('%', #{remark}, '%') " +
             "</if>" +
             "<if test='userId != null'>" +
-            "AND create_by = #{userId} " +
+            "AND user_id = #{userId} " +
             "</if>" +
             "<if test='companyUserId != null'>" +
             "AND company_user_id = #{companyUserId} " +

+ 21 - 0
fs-user-app/src/main/java/com/fs/app/controller/medical/ReportIndicatorResultController.java

@@ -201,7 +201,28 @@ public class ReportIndicatorResultController extends AppBaseController {
             return R.error("更新失败");
         }
     }
+    /**
+     * 批量更新检查结果
+     */
+    @Login
+    @RepeatSubmit
+    @ApiOperation("更新检查结果")
+    @PostMapping("/updateBatch")
+    public R update(@RequestBody List<ReportIndicatorResult> resultList) {
+        log.info("批量更新检查结果 {}",resultList);
 
+        try {
+            boolean success = reportIndicatorResultService.updateBatch(resultList);
+            if (success) {
+                return R.ok("更新成功");
+            } else {
+                return R.error("更新失败");
+            }
+        } catch (Exception e) {
+            logger.error("更新检查结果失败", e);
+            return R.error("更新失败");
+        }
+    }
     /**
      * 删除检查结果
      */

+ 28 - 3
fs-user-app/src/main/java/com/fs/app/controller/store/ProductScrmController.java

@@ -1,6 +1,7 @@
 package com.fs.app.controller.store;
 
 
+import cn.hutool.extra.servlet.ServletUtil;
 import com.fs.app.annotation.Login;
 import com.fs.app.controller.AppBaseController;
 import com.fs.common.core.domain.R;
@@ -15,6 +16,7 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -24,7 +26,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
-
+@Slf4j
 @Api("商品中心")
 @RestController
 @RequestMapping(value="/store/app/product")
@@ -59,6 +61,7 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取分类")
     @GetMapping("/getProductCate")
     public R getProductCate(HttpServletRequest request){
+        log.info("获取分类 {}", ServletUtil.getHeaderMap(request));
         try {
             FsStoreProductCategoryScrm param=new FsStoreProductCategoryScrm();
             param.setIsShow(1);
@@ -72,6 +75,8 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取分类")
     @GetMapping("/getProductCateByPid")
     public R getProductCateByPid(@RequestParam(value="pid") Long pid, HttpServletRequest request){
+        log.info("获取分类 pid:{} headers:{}",pid, ServletUtil.getHeaderMap(request));
+
         try {
             FsStoreProductCategoryScrm param=new FsStoreProductCategoryScrm();
             param.setIsShow(1);
@@ -87,6 +92,8 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取商品列表")
     @GetMapping("/getProducts")
     public R getProducts(FsStoreProductQueryParam param, HttpServletRequest request){
+        log.info("获取商品列表 param:{} headers:{}",param, ServletUtil.getHeaderMap(request));
+
         PageHelper.startPage(param.getPage(), param.getPageSize());
         param.setIsDisplay(1);
         List<FsStoreProductListQueryVO> productList=productService.selectFsStoreProductListQuery(param);
@@ -96,6 +103,8 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取商品详情")
     @GetMapping("/getProductDetails")
     public R getProductDetails(@RequestParam(value="productId") Long productId,@RequestParam(value="storeId",required = false) String storeId){
+        log.info("获取商品详情 productId:{} storeId:{}",productId,storeId);
+
         FsStoreProductQueryVO product=productService.selectFsStoreProductByIdQuery(productId,storeId);
         if(product==null){
             return R.error("商品不存在或已下架");
@@ -223,12 +232,15 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("添加购物车")
     @PostMapping("/addCart")
     public R addCart(@Validated @RequestBody FsStoreCartParam cartParam, HttpServletRequest request){
+        log.info("添加购物车 参数: {}",cartParam);
         return cartService.addCart(Long.parseLong(getUserId()),cartParam);
     }
     @Login
     @ApiOperation("获取购物车列表")
     @GetMapping("/getCarts")
     public R getCarts(HttpServletRequest request){
+        log.info("获取购物车列表 参数: {}",ServletUtil.getHeaderMap(request));
+
         List<FsStoreCartVO> carts= cartService.selectFsStoreCartListByUid(Long.parseLong(getUserId()));
         return R.ok().put("carts",carts);
     }
@@ -236,12 +248,15 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("改变购物车数量")
     @PostMapping("/cartNum")
     public R cartNum(@Validated @RequestBody FsStoreCartNumParam cartParam, HttpServletRequest request){
+        log.info("改变购物车数量 参数: {} {}",cartParam,ServletUtil.getHeaderMap(request));
+
         return cartService.changeNum(Long.parseLong(getUserId()),cartParam);
     }
     @Login
     @ApiOperation("删除购物车")
     @PostMapping("/delCart")
     public R delCart(@Validated @RequestBody FsStoreCartDelParam cartParam, HttpServletRequest request){
+        log.info("删除购物车 参数: {} {}",cartParam,ServletUtil.getHeaderMap(request));
         return cartService.delCart(Long.parseLong(getUserId()),cartParam);
     }
 
@@ -250,6 +265,8 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取商品购物车数量")
     @GetMapping("/getCartCount")
     public R getCartCount(FsStoreCartCountParam param){
+        log.info("获取商品购物车数量 参数: {}",param);
+
         param.setUserId(Long.parseLong(getUserId()));
         Integer count=cartService.selectFsStoreCartCount(param);
         return R.ok().put("data", count);
@@ -258,18 +275,24 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取推荐商品列表")
     @GetMapping("/getTuiProduct")
     public R getTuiProduct(HttpServletRequest request){
+        log.info("删除购物车 参数: {}",ServletUtil.getHeaderMap(request));
+
         List<FsStoreProductListQueryVO> productList=productService.selectFsStoreProductTuiQuery(10);
         return R.ok().put("data", productList);
     }
     @ApiOperation("获取喜欢商品列表")
     @GetMapping("/getGoodsProduct")
     public R getGoodsProduct(BaseQueryParam param,HttpServletRequest request){
+        log.info("获取喜欢商品列表 参数: {} 请求参数: {}",param,ServletUtil.getHeaderMap(request));
+
         List<FsStoreProductListQueryVO> productList=productService.selectFsStoreProductGoodQuery(10);
         return R.ok().put("data", productList);
     }
     @ApiOperation("获取推荐商品数据")
     @GetMapping("/getTuiProducts")
     public R getTuiProducts(BaseQueryParam param, HttpServletRequest request){
+        log.info("获取推荐商品数据 参数: {} 请求参数: {}",param,ServletUtil.getHeaderMap(request));
+
         PageHelper.startPage(param.getPage(), param.getPageSize());
         List<FsStoreProductListQueryVO> list=productService.selectFsStoreProductTuiListQuery();
         PageInfo<FsStoreProductListQueryVO> listPageInfo=new PageInfo<>(list);
@@ -278,6 +301,8 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取喜欢商品数据")
     @GetMapping("/getGoodsProducts")
     public R getGoodsProducts(BaseQueryParam param, HttpServletRequest request){
+        log.info("获取喜欢商品数据 参数: {} 请求参数: {}",param,ServletUtil.getHeaderMap(request));
+
         PageHelper.startPage(param.getPage(), param.getPageSize());
         List<FsStoreProductListQueryVO> list=productService.selectFsStoreProductGoodListQuery();
         PageInfo<FsStoreProductListQueryVO> listPageInfo=new PageInfo<>(list);
@@ -288,12 +313,12 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取推广商品列表")
     @GetMapping("/getStoreProductAttrValueList")
     public R getStoreProductAttrValueList(FsStoreProductAttrValueQueryParam param, HttpServletRequest request){
+        log.info("获取推广商品列表 参数: {} 请求参数: {}",param,ServletUtil.getHeaderMap(request));
+
         PageHelper.startPage(param.getPage(), param.getPageSize());
         List<FsStoreProductAttrValueQueryVO> productList=attrValueService.selectStoreProductAttrValueListQuery(param);
         PageInfo<FsStoreProductAttrValueQueryVO> listPageInfo=new PageInfo<>(productList);
         return R.ok().put("data",listPageInfo);
     }
 
-
-
 }

+ 244 - 79
fs-user-app/src/main/java/com/fs/app/controller/store/UserScrmController.java

@@ -3,7 +3,9 @@ package com.fs.app.controller.store;
 
 import cn.hutool.core.img.ImgUtil;
 import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.resource.ResourceUtil;
 import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.servlet.ServletUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.app.annotation.Login;
 import com.fs.app.controller.AppBaseController;
@@ -33,16 +35,21 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import java.awt.*;
+import java.awt.image.BufferedImage;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigDecimal;
+import java.net.URL;
 import java.util.List;
 
 
@@ -80,6 +87,8 @@ public class UserScrmController extends AppBaseController {
     @ApiOperation("获取用户信息")
     @GetMapping("/getUserInfo")
     public R getUserInfo(HttpServletRequest request){
+
+        log.info("获取用户信息 headers: {}", ServletUtil.getHeaderMap(request));
         try {
             FsUserScrm user=userService.selectFsUserById(Long.parseLong(getUserId()));
             if (user.getIsShow() !=null && user.getIsShow() == 0){
@@ -108,20 +117,40 @@ public class UserScrmController extends AppBaseController {
     @ApiOperation("检测是否登录")
     @GetMapping("/checkLogin")
     public R checkLogin(HttpServletRequest request){
+        log.info("检测是否登录 headers: {}", ServletUtil.getHeaderMap(request));
         return R.ok("认证成功");
     }
 
+    @Value("${getTuiImg}")
+    private String getTuiImg;
+    @Value("${getTuiFont}")
+    private String getTuiFont;
     @Login
     @ApiOperation("获取推荐海报")
     @GetMapping("/getTuiImg")
     public R getTuiImg(HttpServletRequest request){
+        log.info("获取推荐海报 headers: {}", ServletUtil.getHeaderMap(request));
         log.info("开始获取推荐海报");
+
+        InputStream templateStream = null;
+        InputStream fontStream = null;
+
         try {
             String userId = getUserId();
             log.info("获取用户ID: {}", userId);
+
+            if (StringUtils.isEmpty(userId)) {
+                log.error("用户ID为空");
+                return R.error("用户ID不能为空");
+            }
+
             FsUserScrm user = userService.selectFsUserById(Long.parseLong(userId));
-            log.info("查询到用户信息: 用户ID={}, 昵称={}", userId, user.getNickname());
+            if (user == null) {
+                log.error("未找到用户信息,用户ID: {}", userId);
+                return R.error("用户信息不存在");
+            }
 
+            log.info("查询到用户信息: 用户ID={}, 昵称={}", userId, user.getNickname());
             if(StringUtils.isEmpty(user.getUserCode())){
                 log.info("用户邀请码为空,开始生成新的邀请码");
                 FsUserScrm userMap = new FsUserScrm();
@@ -131,104 +160,223 @@ public class UserScrmController extends AppBaseController {
                 user.setUserCode(userMap.getUserCode());
                 log.info("成功生成并更新用户邀请码: {}", userMap.getUserCode());
             }
+            File templateSourceFile = new File(getTuiImg);
+            File fontSourceFile = new File(getTuiFont);
+
+            if (!templateSourceFile.exists() || !templateSourceFile.isFile()) {
+                log.error("海报模板文件不存在: {}", getTuiImg);
+                return R.error("海报模板文件不存在");
+            }
+
+            if (!fontSourceFile.exists() || !fontSourceFile.isFile()) {
+                log.error("字体文件不存在: {}", getTuiFont);
+                return R.error("字体文件不存在");
+            }
+            String tempDir = System.getProperty("java.io.tmpdir") + File.separator + "poster_temp";
+            File tempDirFile = new File(tempDir);
+            if (!tempDirFile.exists()) {
+                tempDirFile.mkdirs();
+            }
+
+            File tempTemplateFile = new File(tempDir, "template_" + userId + "_" + System.currentTimeMillis() + ".jpg");
+            File tempFontFile = new File(tempDir, "font_" + userId + "_" + System.currentTimeMillis() + ".ttf");
 
-            File newFile = new File("fx.jpg");
-            File newFileT = new File("simsunb.ttf");
             try {
                 log.info("开始加载海报模板图片");
-                InputStream stream = getClass().getClassLoader().getResourceAsStream("fx.jpg");
-                FileUtils.copyInputStreamToFile(stream, newFile);
-                log.info("海报模板图片加载成功: {}", newFile.getAbsolutePath());
-
-                if(!newFileT.exists()){
-                    log.info("开始加载字体文件");
-                    InputStream streamT = getClass().getClassLoader().getResourceAsStream("simsunb.ttf");
-                    FileUtils.copyInputStreamToFile(streamT, newFileT);
-                    log.info("字体文件加载成功: {}", newFileT.getAbsolutePath());
+                templateStream = new FileInputStream(templateSourceFile);
+                FileUtils.copyInputStreamToFile(templateStream, tempTemplateFile);
+                log.info("海报模板图片加载成功: {}", tempTemplateFile.getAbsolutePath());
+                if (!isValidImageFile(tempTemplateFile)) {
+                    log.error("模板图片文件无效或损坏");
+                    return R.error("模板图片文件无效");
                 }
+                log.info("开始加载字体文件");
+                fontStream = new FileInputStream(fontSourceFile);
+                FileUtils.copyInputStreamToFile(fontStream, tempFontFile);
+                log.info("字体文件加载成功: {}", tempFontFile.getAbsolutePath());
+
             } catch (IOException e) {
                 log.error("加载资源文件失败: {}", e.getMessage(), e);
-                throw new CustomException(e.getMessage());
+                return R.error("加载资源文件失败: " + e.getMessage());
             }
+            return generatePoster(user, tempTemplateFile, tempFontFile, userId);
+
+        } catch (NumberFormatException e) {
+            log.error("用户ID格式错误: {}", e.getMessage(), e);
+            return R.error("用户ID格式错误");
+        } catch (Exception e){
+            log.error("获取推荐海报失败: {}", e.getMessage(), e);
+            return R.error("操作异常: " + e.getMessage());
+        } finally {
+            closeQuietly(templateStream);
+            closeQuietly(fontStream);
+        }
+    }
+
+    /**
+     * 生成海报的核心方法
+     */
+    private R generatePoster(FsUserScrm user, File templateFile, File fontFile, String userId) {
+        File outputFile = null;
+        File qrFile = null;
+
+        try {
+            String outputDir = fsConfig.getTuiImgPath();
+            File outputDirFile = new File(outputDir);
+            if (!outputDirFile.exists()) {
+                outputDirFile.mkdirs();
+            }
+
+            String outputPath = outputDir + "/tui-" + userId + ".jpg";
+            outputFile = new File(outputPath);
+            log.info("开始生成用户海报,输出路径: {}", outputPath);
+            Font font;
             try {
-                String url = fsConfig.getTuiImgPath()+"/tui-"+getUserId()+".jpg";
-                log.info("开始生成用户海报,输出路径: {}", url);
-
-                File outputFile = new File(url);
-                if(!outputFile.exists()) {
-                    try {
-                        outputFile.createNewFile();
-                        log.info("创建海报输出文件成功");
-                    } catch (IOException e) {
-                        log.error("创建海报输出文件失败: {}", e.getMessage(), e);
-                        e.printStackTrace();
-                    }
+                font = Font.createFont(Font.TRUETYPE_FONT, fontFile);
+                font = font.deriveFont(Font.PLAIN, 50f);
+                log.info("字体加载成功");
+            } catch (Exception e) {
+                log.error("字体加载失败: {}", e.getMessage(), e);
+                font = new Font(Font.SANS_SERIF, Font.PLAIN, 50);
+                log.info("使用系统默认字体作为备选");
+            }
+            String nickname = user.getNickname();
+            if (StringUtils.isEmpty(nickname)) {
+                nickname = "用户";
+            }
+
+            log.info("开始向海报添加用户昵称文本: {}", nickname);
+            try {
+                FileUtils.copyFile(templateFile, outputFile);
+
+                BufferedImage templateImage = ImageIO.read(templateFile);
+                if (templateImage == null) {
+                    log.error("无法读取模板图片");
+                    return R.error("模板图片读取失败");
                 }
 
-                Font font = Font.createFont(Font.TRUETYPE_FONT, newFileT);
-                Font f = font.deriveFont(Font.PLAIN,50);
-                log.info("开始向海报添加用户昵称文本");
-                ImgUtil.pressText(
-                        newFile,
-                        outputFile,
-                        user.getNickname()+"邀您加入",
-                        Color.BLACK,
-                        f,
-                        -60,
-                        900,
-                        0.8f
+                BufferedImage resultImage = new BufferedImage(
+                        templateImage.getWidth(),
+                        templateImage.getHeight(),
+                        BufferedImage.TYPE_INT_RGB
                 );
 
-                log.info("开始向海报添加邀请码文本: {}", user.getUserCode());
-                ImgUtil.pressText(
-                        outputFile,
-                        outputFile,
-                        "邀请码:"+user.getUserCode(),
-                        Color.BLACK,
-                        f,
-                        -40,
-                        1000,
-                        0.8f
-                );
+                Graphics2D g2d = resultImage.createGraphics();
+                try {
+                    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+                    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+
+                    g2d.drawImage(templateImage, 0, 0, null);
+
+                    g2d.setFont(font);
+                    g2d.setColor(Color.BLACK);
+
+                    String nicknameText = nickname + "邀您加入";
+                    FontMetrics fm = g2d.getFontMetrics();
+                    int textWidth = fm.stringWidth(nicknameText);
+                    int x = (templateImage.getWidth() - textWidth) / 2;
+                    int y = 900;
+
+                    g2d.drawString(nicknameText, x, y);
+
+                    String inviteText = "邀请码:" + user.getUserCode();
+                    int inviteTextWidth = fm.stringWidth(inviteText);
+                    int inviteX = (templateImage.getWidth() - inviteTextWidth) / 2;
+                    int inviteY = 1000;
 
-                String qrPath = fsConfig.getTuiImgPath()+"/qr-"+getUserId()+".png";
-                File qr = new File(qrPath);
-                log.info("开始生成二维码图片: {}", qrPath);
-                if(!qr.exists()) {
-                    try {
-                        qr.createNewFile();
-                        log.info("创建二维码输出文件成功");
-                    } catch (IOException e) {
-                        log.error("创建二维码输出文件失败: {}", e.getMessage(), e);
-                        e.printStackTrace();
-                    }
+                    g2d.drawString(inviteText, inviteX, inviteY);
+
+                } finally {
+                    g2d.dispose();
                 }
 
-                String qrContent = fsConfig.getUrl()+"/distribution?userCode="+user.getUserCode();
-                log.info("生成二维码内容: {}", qrContent);
-                QrCodeUtil.generate(qrContent, 300, 300, FileUtil.file(qrPath));
+                ImageIO.write(resultImage, "jpg", outputFile);
+                log.info("文本添加完成");
 
+            } catch (Exception e) {
+                log.error("添加文本时出现异常: {}", e.getMessage(), e);
+                return R.error("添加文本失败: " + e.getMessage());
+            }
+            String qrPath = fsConfig.getTuiImgPath() + "/qr-" + userId + ".png";
+            qrFile = new File(qrPath);
+            log.info("开始生成二维码图片: {}", qrPath);
+            try {
+                String qrContent = fsConfig.getUrl() + "/distribution?userCode=" + user.getUserCode();
+                log.info("生成二维码内容: {}", qrContent);
+                QrCodeUtil.generate(qrContent, 300, 300, qrFile);
+                log.info("二维码生成成功");
+            } catch (Exception e) {
+                log.error("生成二维码失败: {}", e.getMessage(), e);
+                return R.error("生成二维码失败: " + e.getMessage());
+            }
+            try {
                 log.info("开始将二维码图片合并到海报");
-                ImgUtil.pressImage(
-                        outputFile,
-                        outputFile,
-                        ImgUtil.read(qr),
-                        -400,
-                        900,
-                        1f
-                );
+                BufferedImage posterImage = ImageIO.read(outputFile);
+                BufferedImage qrImage = ImageIO.read(qrFile);
+
+                if (posterImage == null || qrImage == null) {
+                    log.error("读取图片失败,无法合并二维码");
+                    return R.error("图片读取失败");
+                }
+
+                Graphics2D g2d = posterImage.createGraphics();
+                try {
+                    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+                    int qrX = posterImage.getWidth() - qrImage.getWidth() - 50;
+                    int qrY = 900;
+
+                    g2d.drawImage(qrImage, qrX, qrY, null);
+                } finally {
+                    g2d.dispose();
+                }
+
+                ImageIO.write(posterImage, "jpg", outputFile);
+                log.info("二维码合并完成");
 
-                String resultUrl = "profile/tui/tui-"+getUserId()+".jpg";
-                log.info("海报生成完成,返回URL: {}", resultUrl);
-                return R.ok().put("url", resultUrl);
             } catch (Exception e) {
-                log.error("生成海报过程出现异常: {}", e.getMessage(), e);
-                e.printStackTrace();
-                return R.error("操作异常");
+                log.error("合并二维码时出现异常: {}", e.getMessage(), e);
+                return R.error("合并二维码失败: " + e.getMessage());
+            }
+            String resultUrl = "profile/tui/tui-" + userId + ".jpg";
+            log.info("海报生成完成,返回URL: {}", resultUrl);
+            return R.ok().put("url", resultUrl);
+
+        } catch (Exception e) {
+            log.error("生成海报过程出现异常: {}", e.getMessage(), e);
+            return R.error("生成海报失败: " + e.getMessage());
+        } finally {
+            cleanupTempFiles(qrFile);
+        }
+    }
+    private boolean isValidImageFile(File imageFile) {
+        try {
+            BufferedImage image = ImageIO.read(imageFile);
+            return image != null && image.getWidth() > 0 && image.getHeight() > 0;
+        } catch (Exception e) {
+            log.error("验证图片文件失败: {}", e.getMessage());
+            return false;
+        }
+    }
+    private void closeQuietly(InputStream stream) {
+        if (stream != null) {
+            try {
+                stream.close();
+            } catch (IOException e) {
+                log.warn("关闭流时出现异常: {}", e.getMessage());
+            }
+        }
+    }
+    private void cleanupTempFiles(File... files) {
+        for (File file : files) {
+            if (file != null && file.exists()) {
+                try {
+                    file.delete();
+                    log.debug("删除临时文件: {}", file.getAbsolutePath());
+                } catch (Exception e) {
+                    log.warn("删除临时文件失败: {}", e.getMessage());
+                }
             }
-        } catch (Exception e){
-            log.error("获取推荐海报失败: {}", e.getMessage(), e);
-            return R.error("操作异常");
         }
     }
 
@@ -236,6 +384,7 @@ public class UserScrmController extends AppBaseController {
     @ApiOperation("获取我的推荐人")
     @GetMapping("/getMyTuiList")
     public R getMyTuiList(BaseQueryParam param, HttpServletRequest request){
+        log.info("获取我的推荐人 参数: {}",param);
         PageHelper.startPage(param.getPage(), param.getPageSize());
         List<FsUserTuiVO> list= userService.selectFsUserTuiList(getUserId());
         PageInfo<FsUserTuiVO> listPageInfo=new PageInfo<>(list);
@@ -246,6 +395,7 @@ public class UserScrmController extends AppBaseController {
     @ApiOperation("获取用户金额")
     @GetMapping("/getTuiMoney")
     public R getMemberTuiMoney(HttpServletRequest request){
+        log.info("获取我的推荐人 headers: {}",ServletUtil.getHeaderMap(request));
         try {
             FsUserScrm user=userService.selectFsUserById(Long.parseLong(getUserId()));
             BigDecimal yesterdayMoney=userBillService.selectFsUserBillTotalByUserId(getUserId(),"brokerage_price");
@@ -260,6 +410,8 @@ public class UserScrmController extends AppBaseController {
     @ApiOperation("获取我的推荐订单")
     @GetMapping("/getMyTuiOrderList")
     public R getMyTuiOrderList(BaseQueryParam param,  HttpServletRequest request){
+        log.info("获取我的推荐订单 参数: {}",param);
+
         PageHelper.startPage(param.getPage(), param.getPageSize());
         List<FsStoreOrderTuiVO> list= orderService.selectFsStoreOrderTuiListVO(getUserId());
         PageInfo<FsStoreOrderTuiVO> listPageInfo=new PageInfo<>(list);
@@ -270,6 +422,8 @@ public class UserScrmController extends AppBaseController {
     @ApiOperation("获取用户佣金记录")
     @GetMapping("/getTuiMoneyLogs")
     public R getTuiMoneyLogs(BaseQueryParam param, HttpServletRequest request){
+        log.info("获取用户佣金记录 参数: {}",param);
+
         PageHelper.startPage(param.getPage(), param.getPageSize());
         FsUserBillScrm map=new FsUserBillScrm();
         map.setUserId(Long.parseLong(getUserId()));
@@ -284,6 +438,8 @@ public class UserScrmController extends AppBaseController {
     @ApiOperation("获取商品足迹")
     @GetMapping("/getProductFoots")
     public R getProductFoots(FsStoreProductRelationQueryParam param, HttpServletRequest request){
+        log.info("获取商品足迹 参数: {}",param);
+
         PageHelper.startPage(param.getPage(), param.getPageSize());
         param.setUserId(Long.parseLong(getUserId()));
         List<FsStoreProductRelationQueryVO> list=productRelationService.selectFsStoreProductRelationListVOQuery(param);
@@ -295,6 +451,8 @@ public class UserScrmController extends AppBaseController {
     @ApiOperation("删除足迹")
     @PostMapping("/delProductFoots")
     public R delProductFoots(@RequestBody FsStoreProductFootDelParam param, HttpServletRequest request){
+        log.info("删除足迹 参数: {}",param);
+
         productRelationService.deleteFsStoreProductRelationById(param.getId());
         return R.ok("操作成功");
     }
@@ -304,6 +462,8 @@ public class UserScrmController extends AppBaseController {
     @ApiOperation("申请提现")
     @PostMapping("/doExtract")
     public R doExtract(@Validated  @RequestBody FsUseDoExtractParam param, HttpServletRequest request){
+        log.info("申请提现 参数: {}",param);
+
         param.setUserId(Long.parseLong(getUserId()));
         return userExtractService.doExtract(param);
     }
@@ -312,6 +472,8 @@ public class UserScrmController extends AppBaseController {
     @ApiOperation("获取提现记录")
     @GetMapping("/getExtractList")
     public R getExtractList(FsUseExtractQueryParam param, HttpServletRequest request){
+        log.info("获取提现记录 参数: {}",param);
+
         PageHelper.startPage(param.getPage(), param.getPageSize());
         param.setUserId(Long.parseLong(getUserId()));
         List<FsUserExtractVO> list=userExtractService.selectFsUserExtractListVOQuery(param);
@@ -323,6 +485,8 @@ public class UserScrmController extends AppBaseController {
     @ApiOperation("修改用户信息")
     @PostMapping("/editUser")
     public R editUser(@RequestBody @Valid FsUserEditParam param, HttpServletRequest request){
+        log.info("修改用户信息 参数: {}",param);
+
         param.setUserId(Long.parseLong(getUserId()));
         log.info("【修改用户头像昵称】:{}",param);
         if (param.getNickname().length()>50){
@@ -365,6 +529,7 @@ public class UserScrmController extends AppBaseController {
     @ApiOperation("绑定推广员")
     @PostMapping("/bindPromoter")
     public R bindPromoter(@RequestBody FsUserBindPromoterParam param, HttpServletRequest request){
+        log.info("绑定推广员 参数: {}",param);
 
         FsUserScrm user=userService.selectFsUserById(Long.parseLong(getUserId()));
         if(user.getIsPromoter()==null||user.getIsPromoter()==0){

+ 3 - 0
fs-user-app/src/main/resources/application.yml

@@ -13,3 +13,6 @@ spring:
 #    active: druid-sxjz
 #    active: druid-yzt
 #    active: druid-fcky-test
+getTuiImg: 'C:\Tools\ylrm_his_scrm\images\36f5863ffbbbdfc31620ea177c75284c.jpg'
+getTuiFont: 'C:\Tools\ylrm_his_scrm\images\simsunb.ttf'
+

BIN
fs-user-app/src/main/resources/files/36f5863ffbbbdfc31620ea177c75284c.jpg


BIN
fs-user-app/src/main/resources/files/simsunb.ttf