diff --git a/lis-interfaceCommon/pom.xml b/lis-interfaceCommon/pom.xml index cd353c3..633e496 100644 --- a/lis-interfaceCommon/pom.xml +++ b/lis-interfaceCommon/pom.xml @@ -57,6 +57,11 @@ com.czlis lisresources + + + org.apache.pdfbox + pdfbox-tools + diff --git a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/LisUtil.java b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/LisUtil.java index 5f84818..0b93596 100644 --- a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/LisUtil.java +++ b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/LisUtil.java @@ -1,8 +1,12 @@ package com.czlis.interfaceCommon.utils; +import cn.hutool.core.codec.Base64; import com.czlis.common.utils.DateUtils; +import com.lowagie.text.Document; +import com.lowagie.text.pdf.PdfCopy; +import com.lowagie.text.pdf.PdfReader; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.RoundingMode; @@ -15,39 +19,43 @@ import java.util.*; public class LisUtil { // 换行符常量(跨平台) public static final String LINE_SEPARATOR = System.lineSeparator(); + /** * 生日格式为:yyyy-MM-dd * 根据出生日期计算年龄 + * * @param birthday * @return */ - public static Map getAgeFromBirthDay(String birthday){ + public static Map getAgeFromBirthDay(String birthday) { return AgeUtils.getAgeFromBirthDay(birthday); } /** * 根据年龄获取出生日期 + * * @param nl * @return */ public static Date getBirthDayFromAge(int nl, String nldw) { - return AgeUtils.getBirthDayFromAge(nl,nldw); + return AgeUtils.getBirthDayFromAge(nl, nldw); } /** * 按GBK编码的字节宽度截取字符串,最多取cutlens个字节(避免截取半个汉字) - * @param str 原始字符串 + * + * @param str 原始字符串 * @param beginidx 起始位置 - * @param cutlens 截取长度 + * @param cutlens 截取长度 * @return 截取后的字符串 */ - public static String substringByGbkWidth(String str,int beginidx,int cutlens) { + public static String substringByGbkWidth(String str, int beginidx, int cutlens) { if (str == null || str.isEmpty()) { return ""; } int targetWidth = cutlens; // 目标字节宽度 - int currentWidth =beginidx; // 当前累计字节宽度 + int currentWidth = beginidx; // 当前累计字节宽度 StringBuilder result = new StringBuilder(); for (char c : str.toCharArray()) { @@ -81,10 +89,11 @@ public class LisUtil { /** * 查询字符串GBK编码的长度 + * * @param str * @return */ - public static int getGbkByteLength(String str){ + public static int getGbkByteLength(String str) { if (str == null) { return 0; } @@ -95,10 +104,12 @@ public class LisUtil { throw new RuntimeException(e); } } + /** * 字符串转ASCII值 * 中文:返回GBK编码第一个字节的ASCII值(无符号) * 英文及其他单字节字符:直接返回其ASCII值 + * * @param strdata 要处理的字符串 * @return 对应的ASCII值 */ @@ -135,8 +146,10 @@ public class LisUtil { } return ascValue; } + /** * 计算以10为底的对数 + * * @param x 输入值(必须大于0) * @return 以10为底的对数值 */ @@ -147,8 +160,10 @@ public class LisUtil { // 利用换底公式:log10(x) = ln(x) / ln(10) return Math.log(x) / Math.log(10); } + /** * 判断字符是否为中文字符 + * * @param c 要判断的字符 * @return 是中文字符返回true,否则返回false */ @@ -158,6 +173,7 @@ public class LisUtil { || (c >= 0x3400 && c <= 0x4DBF) // 扩展A || (c >= 0x20000 && c <= 0x2A6DF); // 扩展B } + /** * 使用正则表达式判断字符串是否为数字 * 支持:整数(123)、小数(123.45)、正负号(-123、+45.6) @@ -170,6 +186,7 @@ public class LisUtil { String regex = "^[+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)$"; return str.matches(regex); } + /** * 使用正则表达式判断字符串是否为数字 * 支持:整数(123)、小数(123.45),不包括带正负号的情况 @@ -185,9 +202,11 @@ public class LisUtil { String regex = "^[0-9]+(\\.[0-9]*)?|\\.[0-9]+$"; return str.matches(regex); } + /** * 将包含比较运算符的字符串转换为特定格式的数值字符串 * 不支持的格式或非数字内容将返回原值 + * * @param input 输入字符串,如">=123", ">123", "<=123", "<123" * @return 转换后的字符串或原值 */ @@ -239,37 +258,38 @@ public class LisUtil { } /** - 保留指定小数位数(四舍五入) - 支持比较符号 (<=、>=、<、>) 和负号 (-) 同时存在的情况 - @param input 输入字符串,如 "123.1234"、">123.252"、"<=123.252"、"-45.67"、">=-89.01" - @param decimalPlaces 要保留的小数位数,需为非负整数 - @return 格式化后的字符串,无法处理时返回原值 + * 保留指定小数位数(四舍五入) + * 支持比较符号 (<=、>=、<、>) 和负号 (-) 同时存在的情况 + * + * @param input 输入字符串,如 "123.1234"、">123.252"、"<=123.252"、"-45.67"、">=-89.01" + * @param decimalPlaces 要保留的小数位数,需为非负整数 + * @return 格式化后的字符串,无法处理时返回原值 */ - public static String round (String input, int decimalPlaces) { + public static String round(String input, int decimalPlaces) { // 处理空输入或无效小数位数 - if (input == null || input.trim ().isEmpty () || decimalPlaces < 0) { + if (input == null || input.trim().isEmpty() || decimalPlaces < 0) { return input; } // 定义比较运算符前缀(按长度排序,确保正确识别) - String [] comparisonPrefixes = {"<=", ">=", "<", ">"}; + String[] comparisonPrefixes = {"<=", ">=", "<", ">"}; String comparisonPrefix = ""; - String remainingPart = input.trim (); // 去除首尾空格 + String remainingPart = input.trim(); // 去除首尾空格 // 提取比较运算符前缀 for (String prefix : comparisonPrefixes) { - if (remainingPart.startsWith (prefix)) { + if (remainingPart.startsWith(prefix)) { comparisonPrefix = prefix; - remainingPart = remainingPart.substring (prefix.length ()).trim (); // 去除前缀后的空格 + remainingPart = remainingPart.substring(prefix.length()).trim(); // 去除前缀后的空格 break; } } // 尝试解析剩余部分为数字(使用 BigDecimal 避免精度问题) try { // 解析为 BigDecimal(支持正负号和小数) - BigDecimal number = new BigDecimal (remainingPart); + BigDecimal number = new BigDecimal(remainingPart); // 设置四舍五入模式并保留指定小数位数 - BigDecimal rounded = number.setScale (decimalPlaces, RoundingMode.HALF_UP); + BigDecimal rounded = number.setScale(decimalPlaces, RoundingMode.HALF_UP); // 拼接比较前缀和格式化后的数字 - return comparisonPrefix + rounded.toPlainString (); //toPlainString 避免科学计数法 + return comparisonPrefix + rounded.toPlainString(); //toPlainString 避免科学计数法 } catch (NumberFormatException e) { // 数字部分无法解析时返回原值 return input; @@ -278,6 +298,7 @@ public class LisUtil { /** * 根据天数返回日期,正数往后推,负数往前推 + * * @param day * @return */ @@ -286,15 +307,16 @@ public class LisUtil { Calendar calendar = Calendar.getInstance(); // 当前时间 calendar.add(Calendar.DAY_OF_MONTH, day); // 2重置时间为00:00:00 - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); // 3. 返回推算的出生日期 return calendar.getTime(); } - public static Date relativeDate(Date date,int day) { + + public static Date relativeDate(Date date, int day) { // 1. 获取当前时间(基于Calendar) - Calendar calendar =Calendar.getInstance(); + Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_MONTH, day); // 2重置时间为00:00:00 @@ -304,8 +326,10 @@ public class LisUtil { // 3. 返回推算的出生日期 return calendar.getTime(); } + /** * 根据天数返回日期时间,正数往后推,负数往前推 + * * @param day * @return */ @@ -317,7 +341,8 @@ public class LisUtil { // 3. 返回推算的时间 return calendar.getTime(); } - public static Date relativeDateTime(Date date,int day) { + + public static Date relativeDateTime(Date date, int day) { // 1. 获取当前时间(基于Calendar) Calendar calendar = Calendar.getInstance(); // 当前时间 calendar.setTime(date); @@ -329,11 +354,12 @@ public class LisUtil { /** * 判断前一个时间与后面时间间隔几分钟 + * * @param pastDate * @param datenow * @return */ - public static long relativeMinute(Date pastDate,Date datenow) { + public static long relativeMinute(Date pastDate, Date datenow) { LocalDateTime pastTime = pastDate.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); @@ -346,49 +372,51 @@ public class LisUtil { /** * 判断一个时间与当前时间间隔几分钟 + * * @param pastDate * @return */ public static long relativeMinute(Date pastDate) { - return relativeMinute(pastDate,new Date()); + return relativeMinute(pastDate, new Date()); } - - /** - * 获取实体类中指定字段的属性和值 - * @param obj 实体类对象 - * @param fieldName 要查询的字段名 - * @return 字段信息字符串 - */ - public static String getFieldValue(Object obj, String fieldName) { - if (obj == null || fieldName == null || fieldName.isEmpty()) { - return "参数不能为空"; - } - Class clazz = obj.getClass(); - try { - // 获取指定字段(包括私有字段) - Field field = clazz.getDeclaredField(fieldName); - // 设置访问权限(私有字段需要开启) - field.setAccessible(true); - // 1. 获取字段属性信息 - String fieldType = field.getType().getSimpleName(); // 字段类型(如String、Integer) - // 2. 获取字段值 - Object fieldValue = field.get(obj); // 获取字段值 - String valueStr; - // 处理特殊类型(如Date格式化) - if (fieldValue instanceof Date) { - valueStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) fieldValue); - } else { - valueStr = (fieldValue != null) ? fieldValue.toString() : "null"; - } - return valueStr; - } catch (NoSuchFieldException e) { - return "字段不存在:" + fieldName; - } catch (IllegalAccessException e) { - return "无法访问字段:" + fieldName + ",原因:" + e.getMessage(); - } + /** + * 获取实体类中指定字段的属性和值 + * + * @param obj 实体类对象 + * @param fieldName 要查询的字段名 + * @return 字段信息字符串 + */ + public static String getFieldValue(Object obj, String fieldName) { + if (obj == null || fieldName == null || fieldName.isEmpty()) { + return "参数不能为空"; } + Class clazz = obj.getClass(); + try { + // 获取指定字段(包括私有字段) + Field field = clazz.getDeclaredField(fieldName); + // 设置访问权限(私有字段需要开启) + field.setAccessible(true); + // 1. 获取字段属性信息 + String fieldType = field.getType().getSimpleName(); // 字段类型(如String、Integer) + // 2. 获取字段值 + Object fieldValue = field.get(obj); // 获取字段值 + String valueStr; + // 处理特殊类型(如Date格式化) + if (fieldValue instanceof Date) { + valueStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) fieldValue); + } else { + valueStr = (fieldValue != null) ? fieldValue.toString() : "null"; + } + return valueStr; + } catch (NoSuchFieldException e) { + return "字段不存在:" + fieldName; + } catch (IllegalAccessException e) { + return "无法访问字段:" + fieldName + ",原因:" + e.getMessage(); + } + } + public static String getFieldType(Object obj, String fieldName) { if (obj == null || fieldName == null || fieldName.isEmpty()) { return "参数不能为空"; @@ -400,10 +428,78 @@ public class LisUtil { // 设置访问权限(私有字段需要开启) field.setAccessible(true); // 1. 获取字段属性信息 - return field.getType().getSimpleName(); // 字段类型(如String、Integer) + return field.getType().getSimpleName(); // 字段类型(如String、Integer) } catch (NoSuchFieldException e) { return "字段不存在:" + fieldName; } } + /** + * 合并多个Base64编码的PDF为字节数组 + * + * @param base64PdfList Base64字符串列表 + * @return 合并后的PDF字节数组 + * @throws Exception 处理异常 + */ + private static byte[] mergeBase64Pdfs(List base64PdfList) throws Exception { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + Document document = null; + PdfCopy pdfCopy = null; + + try { + for (int i = 0; i < base64PdfList.size(); i++) { + // 解码Base64为PDF字节数组 + String base64Str = base64PdfList.get(i); + byte[] pdfBytes = Base64.decode(base64Str); // 使用Hutool解码 + InputStream inputStream = new ByteArrayInputStream(pdfBytes); + + // 读取PDF文件 + PdfReader reader = new PdfReader(inputStream); + + // 初始化文档(仅第一次循环时) + if (i == 0) { + document = new Document(reader.getPageSizeWithRotation(1)); + pdfCopy = new PdfCopy(document, outputStream); + document.open(); + } + + // 合并所有页面 + for (int pageNum = 1; pageNum <= reader.getNumberOfPages(); pageNum++) { + pdfCopy.addPage(pdfCopy.getImportedPage(reader, pageNum)); + } + + // 释放资源 + pdfCopy.freeReader(reader); + reader.close(); + inputStream.close(); + } + } finally { + // 关闭文档和输出流 + if (document != null) { + document.close(); + } + if (outputStream != null) { + outputStream.close(); + } + } + + return outputStream.toByteArray(); + } + + /** + * 合并多个Base64编码的PDF为一个PDF文件 + * @param base64PdfList 包含多个PDF的Base64字符串列表 + * @param outputFilePath 合并后PDF的输出路径(如:D:/merged.pdf) + * @throws Exception 处理过程中的异常 + */ + public static void mergeToFile(List base64PdfList, String outputFilePath) throws Exception { + // 1. 合并所有PDF字节流为一个字节数组 + byte[] mergedBytes = mergeBase64Pdfs(base64PdfList); + + // 2. 将合并后的字节数组写入文件 + try (FileOutputStream fos = new FileOutputStream(outputFilePath)) { + fos.write(mergedBytes); + } + System.out.println("PDF合并完成,输出路径:" + outputFilePath); + } } diff --git a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/ReportUtil.java b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/ReportUtil.java index 48f88c3..aa28075 100644 --- a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/ReportUtil.java +++ b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/ReportUtil.java @@ -238,16 +238,22 @@ public class ReportUtil { e.printStackTrace(); log.error("打印条码失败,参数{}",barCodeParam,e); } - String httpPath = ""; - if(printURL == null || printURL.equals("")){ - httpPath = "http://"+ IpUtils.getHostIp() +":" + port + "/"+pdfName+".pdf"; - }else{ - httpPath = "http://"+ printURL +":" + port + "/"+pdfName+".pdf"; - } + String httpPath = getPrintURL(pdfName); log.info("传给前端的pdf地址:{}",httpPath); return new Result("0","打印成功!",httpPath); } + public String getPrintURL(String pdfName){ + String httpPath = ""; + if(printURL == null || printURL.equals("")){ + httpPath = "http://"+ IpUtils.getHostIp() +":" + port + "/printPDF/"+pdfName+".pdf"; + }else{ + httpPath = "http://"+ printURL +":" + port + "/printPDF/"+pdfName+".pdf"; + } + + return httpPath; + } + /*** 获取服务器当前的数据库连接事务对象 * 通过@Qualifier获取实际当前连接事务对象,一般是DynamicDataSource diff --git a/liswork/src/main/java/com/czlis/liswork/controller/dict/DictController.java b/liswork/src/main/java/com/czlis/liswork/controller/dict/DictController.java index 47ff163..62dbae1 100644 --- a/liswork/src/main/java/com/czlis/liswork/controller/dict/DictController.java +++ b/liswork/src/main/java/com/czlis/liswork/controller/dict/DictController.java @@ -47,6 +47,7 @@ public class DictController extends BaseController { @ApiOperation("查询字典列表(不分页)") @GetMapping("/getComDicts") + @Anonymous public Result getComDicts(String zdlb) { log.info("调用查询字典列表不分页,{}",zdlb); return comDictService.getComDicts(zdlb); diff --git a/pom.xml b/pom.xml index 6a82a3e..3ff67e9 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,7 @@ 2.1.7 1.5-beta1 2.0.29 + 2.0.29 9.0.98 @@ -337,6 +338,12 @@ ${pdfbox.version} + + org.apache.pdfbox + pdfbox-tools + ${pdfboxTools.version} + + diff --git a/zybgcx/src/main/java/com/czlis/zybgcx/controller/ZybgcxController.java b/zybgcx/src/main/java/com/czlis/zybgcx/controller/ZybgcxController.java index 353364f..4697948 100644 --- a/zybgcx/src/main/java/com/czlis/zybgcx/controller/ZybgcxController.java +++ b/zybgcx/src/main/java/com/czlis/zybgcx/controller/ZybgcxController.java @@ -39,6 +39,7 @@ public class ZybgcxController extends BaseController { @PostMapping("/ReportList") @Anonymous public Result getPatReportList(@RequestBody Web_getReportsList webGetReportsList){ + log.info("获取报告信息列表:{}",webGetReportsList); return zybgcxService.getPatList(webGetReportsList); } @@ -85,8 +86,8 @@ public class ZybgcxController extends BaseController { */ @Anonymous @ApiOperation("打印报告单") - @GetMapping("/print") - public Result printReport(String bgdh){ + @PostMapping("/print") + public Result printReport(@RequestBody String[] bgdh){ return zybgcxService.printReport(bgdh); } } diff --git a/zybgcx/src/main/java/com/czlis/zybgcx/service/ZybgcxService.java b/zybgcx/src/main/java/com/czlis/zybgcx/service/ZybgcxService.java index 1f486c8..9aecbb6 100644 --- a/zybgcx/src/main/java/com/czlis/zybgcx/service/ZybgcxService.java +++ b/zybgcx/src/main/java/com/czlis/zybgcx/service/ZybgcxService.java @@ -13,7 +13,7 @@ public interface ZybgcxService { Result getPatList(Web_getReportsList webGetReportsList); List getResultMed(Web_getResultMed webGetResultMed); - Result printReport(String bgdh); + Result printReport(String[] bgdh); Result getPDFReportOne(Date jyrq, String yq, String ybh); diff --git a/zybgcx/src/main/java/com/czlis/zybgcx/service/impl/ZybgcxServcieImpl.java b/zybgcx/src/main/java/com/czlis/zybgcx/service/impl/ZybgcxServcieImpl.java index 173685c..2c9d764 100644 --- a/zybgcx/src/main/java/com/czlis/zybgcx/service/impl/ZybgcxServcieImpl.java +++ b/zybgcx/src/main/java/com/czlis/zybgcx/service/impl/ZybgcxServcieImpl.java @@ -3,11 +3,15 @@ package com.czlis.zybgcx.service.impl; import cn.hutool.core.codec.Base64; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; import com.czlis.common.config.RuoYiConfig; import com.czlis.common.core.domain.Result; import com.czlis.common.core.domain.entity.lis.LabReqreportPdffile; +import com.czlis.common.utils.ip.IpUtils; +import com.czlis.common.utils.uuid.UUID; import com.czlis.interfaceCommon.utils.CommonUtil; +import com.czlis.interfaceCommon.utils.LisUtil; import com.czlis.interfaceCommon.utils.ReportUtil; import com.czlis.zybgcx.mapper.ZybgcxMapper; import com.czlis.zybgcx.pojo.Web_fs_printReport; @@ -17,10 +21,15 @@ import com.czlis.zybgcx.pojo.Web_result; import com.czlis.zybgcx.service.ZybgcxService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.CrossOrigin; import javax.print.PrintException; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; @@ -35,7 +44,6 @@ public class ZybgcxServcieImpl implements ZybgcxService { @Autowired private CommonUtil commonUtil; - /** * 获取报告信息 * @param webGetReportsList @@ -63,27 +71,35 @@ public class ZybgcxServcieImpl implements ZybgcxService { * @return */ @Override - public Result printReport(String bgdh) { - String[] strings = StrUtil.splitToArray(bgdh, "_"); - if(strings.length != 3) return new Result("-1","传入的报告单号不对!"); - String jyrqStr = strings[0]; - String yq = strings[1]; - String ybh = strings[2]; - LabReqreportPdffile labReqreportPdffileOne = commonUtil.getLabReqreportPdffileOne(DateUtil.parse(jyrqStr, "yyyyMMdd"), yq, ybh); - byte[] decode = Base64.decode(labReqreportPdffileOne.getBASE64PDF()); - String pdfName = bgdh+".pdf"; - String path = RuoYiConfig.getProfile() +"/printPDF/"+pdfName; - log.info("打印目录文件为:{}",path); - FileUtil.writeBytes(decode, path); + public Result printReport(String[] bgdh) { + List bgdhBase64List = new ArrayList<>(); + for (String string : bgdh) { + String[] stringParam = StrUtil.splitToArray(string, "_"); + if(stringParam.length != 3) return new Result("-1","传入的报告单号不对!"); + String jyrqStr = stringParam[0]; + String yq = stringParam[1]; + String ybh = stringParam[2]; + LabReqreportPdffile labReqreportPdffileOne = commonUtil.getLabReqreportPdffileOne(DateUtil.parse(jyrqStr, "yyyyMMdd"), yq, ybh); + if(labReqreportPdffileOne == null) continue; + String base64PDF = labReqreportPdffileOne.getBASE64PDF(); + if(base64PDF == null || base64PDF.equals("")) continue; + bgdhBase64List.add(base64PDF); + } + String pdfName = UUID.randomUUID().toString(); + String path = RuoYiConfig.getProfile() +"/config/static/printPDF/"+pdfName+".pdf"; + //合并pdf try { - ReportUtil.printPdf(path,""); + LisUtil.mergeToFile(bgdhBase64List,path); } catch (Exception e) { e.printStackTrace(); - log.error("打印pdf报告失败:",e); - return new Result("-1","打印pdf报告失败:"+e.getMessage()); + log.error("合并pdf:{}报告失败:{}",bgdh,e); + return new Result("-1",e.getMessage()); } - - return new Result("0","打印成功!"); + //String httpPath = reportUtil.getPrintURL(pdfName); + //转成base64字符串 + File file = new File(path); + String encode = Base64.encode(file); + return new Result("0","打印成功!",encode); } @Override @@ -150,4 +166,5 @@ public class ZybgcxServcieImpl implements ZybgcxService { } + } diff --git a/zybgcx/src/main/resources/mapper/ZybgcxMapper.xml b/zybgcx/src/main/resources/mapper/ZybgcxMapper.xml index f509c60..a335359 100644 --- a/zybgcx/src/main/resources/mapper/ZybgcxMapper.xml +++ b/zybgcx/src/main/resources/mapper/ZybgcxMapper.xml @@ -12,7 +12,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND sqh like '%'+#{sqh}+'%' AND dybz = #{dybz} and ksdh = #{ksdh} - '0']]> + + and ch = #{ch} + and jzbz = #{jzbz}