| 
					
				 | 
			
			
				@@ -0,0 +1,123 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package com.fs.hospital580.util; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import cn.hutool.core.util.ObjectUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import cn.hutool.json.JSONObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import cn.hutool.json.JSONUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.fs.common.core.redis.RedisCache; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.fs.common.utils.AbsolutePosition; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.fs.system.oss.CloudStorageService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.fs.system.oss.OSSFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.fs.system.service.ISysConfigService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import net.coobird.thumbnailator.Thumbnails; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import net.coobird.thumbnailator.geometry.Positions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.stereotype.Component; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import javax.imageio.ImageIO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.awt.image.BufferedImage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.ByteArrayOutputStream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.InputStream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.net.URL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.TimeUnit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@Component 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class ThumbnailatorWatermark { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private RedisCache redisCache; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private ISysConfigService configService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public String addWatermarkToNetworkImage(Long preId, Integer orderStatus, String signUrl) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 处方原图 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String imageUrl = redisCache.getCacheObject("prescription:dstFilePath:" + preId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (ObjectUtil.isEmpty(imageUrl)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 水印图片 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String watermarkURLJson = configService.selectConfigByKey("his.prescription.url"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            JSONObject jsonObject = JSONUtil.parseObj(watermarkURLJson); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 读取原图片 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            URL url = new URL(imageUrl); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            InputStream inputStream = url.openStream(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String watermarkImageUrl = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            switch (orderStatus) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 代付款 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 1: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    watermarkImageUrl = jsonObject.getStr("start"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 退款 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 3: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    watermarkImageUrl = jsonObject.getStr("end"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 已支付 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    watermarkImageUrl = jsonObject.getStr("ing"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 读取水印图片 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            URL watermarkURL = new URL(watermarkImageUrl); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            InputStream watermarkInputStream = watermarkURL.openStream(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BufferedImage watermarkImage = ImageIO.read(watermarkInputStream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 缩放水印 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 2. 计算并缩放水印图尺寸 (例如:缩放到原图宽度的1/8) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int newWatermarkWidth = watermarkImage.getWidth() / 8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 按水印图原比例计算高度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int newWatermarkHeight = (int) ((double) newWatermarkWidth / watermarkImage.getWidth() * watermarkImage.getHeight()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BufferedImage scaledWatermark = Thumbnails.of(watermarkImage) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .size(newWatermarkWidth, newWatermarkHeight) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .asBufferedImage(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (ObjectUtil.isNotEmpty(signUrl)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 创建签名图片 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                URL watermarkURL2 = new URL(signUrl); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                InputStream watermarkInputStream2 = watermarkURL2.openStream(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                BufferedImage signatureImage = ImageIO.read(watermarkInputStream2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 缩放水印 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 2. 计算并缩放水印图尺寸 (例如:缩放到原图宽度的1/4) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int newWatermarkWidth2 = signatureImage.getWidth() / 8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 按水印图原比例计算高度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int newWatermarkHeight2 = (int) ((double) newWatermarkWidth2 / signatureImage.getWidth() * signatureImage.getHeight()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                BufferedImage scaledWatermark2 = Thumbnails.of(signatureImage) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .size(newWatermarkWidth2, newWatermarkHeight2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .asBufferedImage(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 使用Thumbnailator处理并输出到字节数组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Thumbnails.of(inputStream) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .scale(1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .watermark(Positions.TOP_RIGHT, scaledWatermark, 0.5f) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .watermark( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                new AbsolutePosition(800, 1300), // 使用自定义坐标位置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                scaledWatermark2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                1f // 透明度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .outputQuality(0.9) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .outputFormat("jpg") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .toOutputStream(outputStream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Thumbnails.of(inputStream) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .scale(1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .watermark(Positions.TOP_RIGHT, scaledWatermark, 0.5f) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .outputQuality(0.9) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .outputFormat("jpg") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .toOutputStream(outputStream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            inputStream.close(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 处方图片阶段 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            redisCache.setCacheObject("prescription:dstFilePath:phase" + preId, orderStatus, 2, TimeUnit.DAYS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            CloudStorageService storage = OSSFactory.build(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return storage.uploadSuffix(outputStream.toByteArray(), ".jpg"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            System.err.println("添加水印失败: " + e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            e.printStackTrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |