Ver Fonte

修改益寿缘生成处方图片布局的接口

cgp há 3 dias atrás
pai
commit
71fa87c33d

+ 133 - 26
fs-service/src/main/java/com/fs/his/service/impl/PrescriptionImageServiceImpl.java

@@ -244,8 +244,14 @@ public class PrescriptionImageServiceImpl implements PrescriptionImageService {
     }
 
     /**
-     * 绘制药品列表
-     * @return 返回最后一行的Y坐标
+     * 绘制药品列表(每药两行:第一行药名规格数量,第二行用法用量)
+     * 药品内部两行之间无空行,每个药品(包括最后一个)之后都加一个空白行
+     * @return 返回最后一行的Y坐标(即最后一个空白行之后的位置)
+     */
+    /**
+     * 绘制药品列表(每药两行:第一行药名规格数量,第二行用法用量)
+     * 药品内部两行之间有细微间距(不粘连),每个药品(包括最后一个)之后都加一个空白行
+     * @return 返回最后一行的Y坐标(即最后一个空白行之后的位置)
      */
     public int drawDrugList(Graphics2D pen, List<FsPrescribeDrug> drugs) {
         if (drugs == null || drugs.isEmpty()) {
@@ -254,47 +260,148 @@ public class PrescriptionImageServiceImpl implements PrescriptionImageService {
 
         int x = 133;
         int y = 728;
-        int lineHeight = 30;
 
-        for (FsPrescribeDrug drug : drugs) {
-            // 格式: 药品名 规格 用法 频次 每次用量 x 数量
-            StringBuilder sb = new StringBuilder();
+        // 行高设置(可根据实际字体微调)
+        int innerLineSpacing = 40;  // 药品内部两行之间的间距(含呼吸感,避免粘连)
+        int blankLine = 46;         // 药品之间的空白行(比内部稍大,形成视觉分组)
 
+        for (FsPrescribeDrug drug : drugs) {
+            // ========== 第一行:药名 + 规格 + 数量 ==========
+            StringBuilder line1 = new StringBuilder();
             if (StringUtils.isNotBlank(drug.getDrugName())) {
-                sb.append(drug.getDrugName()).append(" ");
+                line1.append(drug.getDrugName());
             }
             if (StringUtils.isNotBlank(drug.getDrugSpec())) {
-                sb.append(drug.getDrugSpec()).append(" ");
+                line1.append(" ").append(drug.getDrugSpec());
             }
-            if (StringUtils.isNotBlank(drug.getUsageMethod())) {
-                sb.append(drug.getUsageMethod()).append(" ");
-            }
-            if (StringUtils.isNotBlank(drug.getUsageFrequencyUnit())) {
-                sb.append(drug.getUsageFrequencyUnit()).append(" ");
+            if (drug.getDrugNum() != null) {
+                line1.append(" x ").append(drug.getDrugNum());
+                if (StringUtils.isNotBlank(drug.getDrugUnit())) {
+                    line1.append(drug.getDrugUnit());
+                }
             }
-            if (StringUtils.isNotBlank(drug.getUsagePerUseCount())) {
-                sb.append(drug.getUsagePerUseCount());
+
+            String firstLine = line1.toString().trim();
+            if (StringUtils.isNotBlank(firstLine)) {
+                y = drawDrugTextLine(pen, firstLine, x, y, 760, innerLineSpacing);
             }
-            if (StringUtils.isNotBlank(drug.getUsagePerUseUnit())) {
-                sb.append(drug.getUsagePerUseUnit()).append(" ");
+            y += innerLineSpacing; // 第一行占位(即使无内容也占)
+
+            // ========== 第二行:用法用量 ==========
+            StringBuilder line2 = new StringBuilder();
+            if (StringUtils.isNotBlank(drug.getUsageMethod())) {
+                line2.append(drug.getUsageMethod());
             }
-            if (drug.getDrugNum() != null) {
-                sb.append("x ").append(drug.getDrugNum());
+            if (StringUtils.isNotBlank(drug.getUsagePerUseCount())) {
+                line2.append(drug.getUsagePerUseCount());
+                if (StringUtils.isNotBlank(drug.getUsagePerUseUnit())) {
+                    line2.append(drug.getUsagePerUseUnit());
+                }
             }
-            if (StringUtils.isNotBlank(drug.getDrugUnit())) {
-                sb.append(drug.getDrugUnit());
+            if (StringUtils.isNotBlank(drug.getUsageFrequencyUnit())) {
+                line2.append(" ").append(drug.getUsageFrequencyUnit());
             }
 
-            String drugInfo = sb.toString().trim();
-            if (StringUtils.isNotBlank(drugInfo)) {
-                y = drawMultiLineText(pen, drugInfo, x, y, 760);
-                y += lineHeight;
+            String secondLine = line2.toString().trim();
+            if (StringUtils.isNotBlank(secondLine)) {
+                y = drawDrugTextLine(pen, secondLine, x, y, 760, innerLineSpacing);
             }
+            y += innerLineSpacing; // 第二行占位(即使无内容也占)
+
+            // ========== 每个药品之后(包括最后一个)加一个空白行 ==========
+            y += blankLine;
         }
 
         return y;
     }
 
+    /**
+     * 专用于药品列表的文本绘制:支持自动换行,返回最后一行文本的基线 Y 坐标
+     * 不额外增加行高,由调用方控制换行(如 y += innerLineSpacing)
+     */
+    private int drawDrugTextLine(Graphics2D pen, String text, int x, int y, int maxWidth, int lineHeight) {
+        if (StringUtils.isBlank(text)) {
+            return y;
+        }
+
+        FontMetrics fm = pen.getFontMetrics();
+        StringBuilder currentLine = new StringBuilder();
+        int currentY = y;
+
+        for (char c : text.toCharArray()) {
+            String testLine = currentLine.toString() + c;
+            int testWidth = fm.stringWidth(testLine);
+
+            // 如果加上当前字符会超宽,且当前行已有内容,则换行
+            if (testWidth > maxWidth && currentLine.length() > 0) {
+                pen.drawString(currentLine.toString(), x, currentY);
+                currentY += lineHeight; // 使用固定 lineHeight 换行
+                currentLine = new StringBuilder().append(c);
+            } else {
+                currentLine.append(c);
+            }
+        }
+
+        // 绘制最后一行(不额外增加 lineHeight)
+        if (currentLine.length() > 0) {
+            pen.drawString(currentLine.toString(), x, currentY);
+        }
+
+        return currentY;
+    }
+
+//    /**
+//     * 绘制药品列表
+//     * @return 返回最后一行的Y坐标
+//     */
+//    public int drawDrugList(Graphics2D pen, List<FsPrescribeDrug> drugs) {
+//        if (drugs == null || drugs.isEmpty()) {
+//            return 330;
+//        }
+//
+//        int x = 133;
+//        int y = 728;
+//        int lineHeight = 30;
+//
+//        for (FsPrescribeDrug drug : drugs) {
+//            // 格式: 药品名 规格 用法 频次 每次用量 x 数量
+//            StringBuilder sb = new StringBuilder();
+//
+//            if (StringUtils.isNotBlank(drug.getDrugName())) {
+//                sb.append(drug.getDrugName()).append(" ");
+//            }
+//            if (StringUtils.isNotBlank(drug.getDrugSpec())) {
+//                sb.append(drug.getDrugSpec()).append(" ");
+//            }
+//            if (StringUtils.isNotBlank(drug.getUsageMethod())) {
+//                sb.append(drug.getUsageMethod()).append(" ");
+//            }
+//            if (StringUtils.isNotBlank(drug.getUsageFrequencyUnit())) {
+//                sb.append(drug.getUsageFrequencyUnit()).append(" ");
+//            }
+//            if (StringUtils.isNotBlank(drug.getUsagePerUseCount())) {
+//                sb.append(drug.getUsagePerUseCount());
+//            }
+//            if (StringUtils.isNotBlank(drug.getUsagePerUseUnit())) {
+//                sb.append(drug.getUsagePerUseUnit()).append(" ");
+//            }
+//            if (drug.getDrugNum() != null) {
+//                sb.append("x ").append(drug.getDrugNum());
+//            }
+//            if (StringUtils.isNotBlank(drug.getDrugUnit())) {
+//                sb.append(drug.getDrugUnit());
+//            }
+//
+//            String drugInfo = sb.toString().trim();
+//            if (StringUtils.isNotBlank(drugInfo)) {
+//                y = drawMultiLineText(pen, drugInfo, x, y, 760);
+//                y += lineHeight;
+//            }
+//        }
+//
+//        return y;
+//    }
+
 
     /**
      * 绘制医嘱
@@ -329,7 +436,7 @@ public class PrescriptionImageServiceImpl implements PrescriptionImageService {
         // 药师签名
         if (StringUtils.isNotBlank(param.getDrugDoctorUrl())) {
             try {
-                BufferedImage pharmacistSign = downloadSignatureImage("https://ysy-1329817240.cos.ap-guangzhou.myqcloud.com/ysy/20251021/be7ef2dda6d94b6c97c9b41bdb3a9cb8.png");
+                BufferedImage pharmacistSign = downloadSignatureImage("https://ysy-1329817240.cos.ap-guangzhou.myqcloud.com/ysy/20251028/ed509381390049c9ad2a17e95d8b8732.png");
                 if (pharmacistSign != null) {
                     Image scaledSign = pharmacistSign.getScaledInstance(120, 80, Image.SCALE_SMOOTH);
                     pen.drawImage(scaledSign, 1076, 1528, null);