|  | @@ -244,8 +244,14 @@ public class PrescriptionImageServiceImpl implements PrescriptionImageService {
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      /**
 |  |      /**
 | 
											
												
													
														|  | -     * 绘制药品列表
 |  | 
 | 
											
												
													
														|  | -     * @return 返回最后一行的Y坐标
 |  | 
 | 
											
												
													
														|  | 
 |  | +     * 绘制药品列表(每药两行:第一行药名规格数量,第二行用法用量)
 | 
											
												
													
														|  | 
 |  | +     * 药品内部两行之间无空行,每个药品(包括最后一个)之后都加一个空白行
 | 
											
												
													
														|  | 
 |  | +     * @return 返回最后一行的Y坐标(即最后一个空白行之后的位置)
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * 绘制药品列表(每药两行:第一行药名规格数量,第二行用法用量)
 | 
											
												
													
														|  | 
 |  | +     * 药品内部两行之间有细微间距(不粘连),每个药品(包括最后一个)之后都加一个空白行
 | 
											
												
													
														|  | 
 |  | +     * @return 返回最后一行的Y坐标(即最后一个空白行之后的位置)
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  |      public int drawDrugList(Graphics2D pen, List<FsPrescribeDrug> drugs) {
 |  |      public int drawDrugList(Graphics2D pen, List<FsPrescribeDrug> drugs) {
 | 
											
												
													
														|  |          if (drugs == null || drugs.isEmpty()) {
 |  |          if (drugs == null || drugs.isEmpty()) {
 | 
											
										
											
												
													
														|  | @@ -254,47 +260,148 @@ public class PrescriptionImageServiceImpl implements PrescriptionImageService {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          int x = 133;
 |  |          int x = 133;
 | 
											
												
													
														|  |          int y = 728;
 |  |          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())) {
 |  |              if (StringUtils.isNotBlank(drug.getDrugName())) {
 | 
											
												
													
														|  | -                sb.append(drug.getDrugName()).append(" ");
 |  | 
 | 
											
												
													
														|  | 
 |  | +                line1.append(drug.getDrugName());
 | 
											
												
													
														|  |              }
 |  |              }
 | 
											
												
													
														|  |              if (StringUtils.isNotBlank(drug.getDrugSpec())) {
 |  |              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;
 |  |          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())) {
 |  |          if (StringUtils.isNotBlank(param.getDrugDoctorUrl())) {
 | 
											
												
													
														|  |              try {
 |  |              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) {
 |  |                  if (pharmacistSign != null) {
 | 
											
												
													
														|  |                      Image scaledSign = pharmacistSign.getScaledInstance(120, 80, Image.SCALE_SMOOTH);
 |  |                      Image scaledSign = pharmacistSign.getScaledInstance(120, 80, Image.SCALE_SMOOTH);
 | 
											
												
													
														|  |                      pen.drawImage(scaledSign, 1076, 1528, null);
 |  |                      pen.drawImage(scaledSign, 1076, 1528, null);
 |