From 5e83efabf33a817b0c8e64035aa40db1543b7a7b Mon Sep 17 00:00:00 2001 From: litao Date: Tue, 29 Nov 2022 09:20:02 +0800 Subject: [PATCH] =?UTF-8?q?2022=E5=B9=B411=E6=9C=8829=E6=97=A509:19:29?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springblade/system/enums/DictBizEnum.java | 6 +- .../org/springblade/lims/entry/Contract.java | 2 +- .../lims/entry/ContractSample.java | 52 +++ .../org/springblade/lims/entry/Entrust.java | 10 +- .../org/springblade/lims/entry/Examine.java | 3 - lab-service/lab-lims/pom.xml | 19 +- .../lims/controller/ContractController.java | 2 + .../lims/controller/EntrustController.java | 72 +++- .../controller/TaskBlueprintController.java | 344 +++++++++++++++- .../lims/service/IExamineBasisService.java | 1 - .../lims/service/impl/EntrustServiceImpl.java | 22 +- .../impl/TaskBlueprintServiceImpl.java | 6 +- .../springblade/lims/utils/BarcodeUtils.java | 378 ++++++++++++++++++ 13 files changed, 875 insertions(+), 42 deletions(-) create mode 100644 lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ContractSample.java create mode 100644 lab-service/lab-lims/src/main/java/org/springblade/lims/utils/BarcodeUtils.java diff --git a/lab-service-api/lab-dict-api/src/main/java/org/springblade/system/enums/DictBizEnum.java b/lab-service-api/lab-dict-api/src/main/java/org/springblade/system/enums/DictBizEnum.java index 3190bbe..12a20d8 100644 --- a/lab-service-api/lab-dict-api/src/main/java/org/springblade/system/enums/DictBizEnum.java +++ b/lab-service-api/lab-dict-api/src/main/java/org/springblade/system/enums/DictBizEnum.java @@ -72,7 +72,11 @@ public enum DictBizEnum { /** * 样品传输条件 */ - SAMPLE_TRANSPORTATION("sample_transportation") + SAMPLE_TRANSPORTATION("sample_transportation"), + /** + * 打印标签相关 + */ + LABEL_PRINT("label_print") ; diff --git a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Contract.java b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Contract.java index e962b83..b044909 100644 --- a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Contract.java +++ b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Contract.java @@ -29,7 +29,7 @@ public class Contract extends BaseEntity implements Serializable { private String contractCode; // 合同金额 - private Double contractMount; + private String contractMount; // 检测内容 private String examineContent; diff --git a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ContractSample.java b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ContractSample.java new file mode 100644 index 0000000..8dd21de --- /dev/null +++ b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ContractSample.java @@ -0,0 +1,52 @@ +package org.springblade.lims.entry; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.springblade.core.mp.base.BaseEntity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author swj + */ +@Data +//@SuppressWarnings("all") +@TableName("f_contract_sample") +public class ContractSample extends BaseEntity implements Serializable { + +// private static final long serialVersionUID = 1L; + + // 合同id + private String contractId; + // 委托单id + private Long entrustId; + // 地市 + private String city; + // 养殖场名称 + private String farmName; + // 养殖场地址 + private String farmAddress; + // 畜主姓名 + private String livestockOwnerName; + // 联系电话 + private String phone; + // 收样日期 + private Date collectSampleTime; + // 样品名称 + private String sampleName; + // 样品数量 + private Integer sampleCount; + // 原始编号(显性) + private String originalNum; + // 原始编号(隐性) + private String recessiveNum; + // 实验编号 + private String experimentNum; + // 领样人 + private String sampleReceiver; + // 领样日期 + private Date sampleReceiverTime; + // 备注 + private String remark; +} diff --git a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Entrust.java b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Entrust.java index cbf8362..4db8890 100644 --- a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Entrust.java +++ b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Entrust.java @@ -36,6 +36,9 @@ public class Entrust extends BaseEntity implements Serializable { // 委托类型(1委托单 2合同单) private Integer entrustType; + // 养殖场类型 + private String farmType; + // 合同id @JsonSerialize(nullsUsing = NullSerializer.class) private Long contractId; @@ -75,7 +78,7 @@ public class Entrust extends BaseEntity implements Serializable { public String simpleState; // 10.样品名称 - public String simpleName; + private String simpleName; // 11.样品数量 public Integer simpleCount; @@ -196,4 +199,9 @@ public class Entrust extends BaseEntity implements Serializable { // 审批时间 private Date approvalDate; + @TableField(exist = false) + private List contractSamples; + + // 合同编号 + private String contractCode; } diff --git a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Examine.java b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Examine.java index c4d9500..cd9071e 100644 --- a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Examine.java +++ b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Examine.java @@ -2,18 +2,15 @@ package org.springblade.lims.entry; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.NullSerializer; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springblade.core.mp.base.BaseEntity; -import org.springframework.data.annotation.Id; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; -import java.util.List; /** * @author swj diff --git a/lab-service/lab-lims/pom.xml b/lab-service/lab-lims/pom.xml index 48585b8..6280596 100644 --- a/lab-service/lab-lims/pom.xml +++ b/lab-service/lab-lims/pom.xml @@ -163,12 +163,26 @@ 2.0.6 + google zxing <--> + + com.google.zxing + core + 3.3.0 + com.google.zxing javase - 3.1.0 + 3.3.0 + + + thumbnailator <--> + + net.coobird + thumbnailator + 0.4.8 + org.eclipse.birt.runtime.3_7_1 com.lowagie.text @@ -185,9 +199,6 @@ documents4j-transformer-msoffice-word 1.0.3 - - - diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ContractController.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ContractController.java index 38ccef0..99df714 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ContractController.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ContractController.java @@ -101,6 +101,7 @@ public class ContractController extends BladeController { String name = userClient.userInfoById(contract.getReviewConclusionTechnicalDirectorId()).getData().getName(); byId.setReviewConclusionTechnicalDirectorName(name); byId.setReviewConclusionDate(new Date()); + byId.setReviewConclusion(contract.getReviewConclusion()); byId.setStatus(1); } // 中心主任签名 @@ -109,6 +110,7 @@ public class ContractController extends BladeController { String name = userClient.userInfoById(contract.getCenterDirectorId()).getData().getName(); byId.setCenterDirectorName(name); byId.setCenterDirectorOpinionDate(new Date()); + byId.setCenterDirectorOpinion(contract.getCenterDirectorOpinion()); byId.setStatus(3); } // 指定评审人员签名 diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/EntrustController.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/EntrustController.java index f3c7083..b1238ae 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/EntrustController.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/EntrustController.java @@ -23,7 +23,8 @@ import com.spire.doc.documents.Paragraph; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import oracle.jdbc.proxy.annotation.Post; -import org.apache.commons.lang.math.RandomUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.RandomUtils; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springblade.common.utils.ZipCompressUtil; @@ -196,7 +197,7 @@ public class EntrustController extends BladeController { List samples = contractSampleService.list(wrapper); entrust.setContractSamples(samples); } - if (entrust.getSampleReceiverId() != null) { + if (StringUtils.isNotBlank(entrust.getSampleReceiverId())) { R userR = userClient.userInfoById(Long.valueOf(entrust.getSampleReceiverId())); User data = userR.getData(); entrust.setSampleReceiverName(data.getName()); @@ -1170,8 +1171,6 @@ public class EntrustController extends BladeController { */ @PostMapping("/conserve") public Entrust conserve(@RequestBody Entrust entrust) { - // 委托单入库 - // 采样单位相关 Long entrustCustomerId = entrust.getEntrustCustomerId(); String entrustCustomerName = entrust.getEntrustCustomerName(); @@ -1226,7 +1225,7 @@ public class EntrustController extends BladeController { } } - if (entrust.getSampleReceiverId() != null && !"".equals(entrust.getSampleReceiverId())) { + if (StringUtils.isNotBlank(entrust.getSampleReceiverId())) { R userR = userClient.userInfoById(Long.valueOf(entrust.getSampleReceiverId())); User data = userR.getData(); if (data != null) { @@ -1243,11 +1242,9 @@ public class EntrustController extends BladeController { entrust.setSimpleJson(s); // 是否为合同新增委托单 if (entrust.getContractId() != null) { + Contract byId = contractService.getById(entrust.getContractId()); + entrust.setContractCode(byId.getContractCode()); entrust.setEntrustType(2); - Contract contract = new Contract(); - contract.setId(entrust.getContractId()); - contract.setStatus(2); - contractService.updateById(contract); } else { entrust.setEntrustType(1); } @@ -1261,7 +1258,7 @@ public class EntrustController extends BladeController { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Examine::getEntrustId, entrust.getId()); List list = examineService.list(queryWrapper); - if (list != null && list.size() > 0) { + if (CollectionUtils.isNotEmpty(list)) { List ids = new ArrayList<>(); for (Examine examine : list) { ids.add(examine.getId()); @@ -1270,7 +1267,7 @@ public class EntrustController extends BladeController { } List examines = entrust.getExamines(); - if (examines != null && examines.size() > 0) { + if (CollectionUtils.isNotEmpty(examines)) { for (int i = 0; i < examines.size(); i++) { Examine examine = examines.get(i); examine.setId(null); @@ -1284,6 +1281,37 @@ public class EntrustController extends BladeController { } examineService.saveBatch(examines); } + + // 合同评审收样登记先删在加 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(ContractSample::getEntrustId, entrust.getId()); + List list1 = contractSampleService.list(lambdaQueryWrapper); + if (CollectionUtils.isNotEmpty(list1)) { + List ids = new ArrayList<>(); + for (ContractSample contractSample : list1) { + ids.add(contractSample.getId()); + } + contractSampleService.deleteLogic(ids); + } + + // 合同评审收样登记入库 + List contractSamples = entrust.getContractSamples(); + if (CollectionUtils.isNotEmpty(contractSamples)) { + for (int i = 0; i < contractSamples.size(); i++) { + ContractSample contractSample = contractSamples.get(i); + contractSample.setId(null); + contractSample.setContractId(entrust.getContractId().toString()); + contractSample.setEntrustId(entrust.getId()); + contractSample.setSampleName(entrust.getSimpleName()); + contractSample.setCollectSampleTime(entrust.getSamplingDate()); + contractSample.setStatus(0); + contractSample.setIsDeleted(0); + contractSample.setCreateTime(new Date()); + contractSample.setUpdateTime(new Date()); + } + contractSampleService.saveBatch(contractSamples); + } + return entrust; } @@ -1451,10 +1479,10 @@ public class EntrustController extends BladeController { public R> getContractStatusAndCount() { Map map = new HashMap<>(10); QueryWrapper queryWrapper = new QueryWrapper<>(); -// queryWrapper.eq("entrust_type", 2); -// queryWrapper.eq("entrust_status", "0.5"); -// map.put("dtj", service.count(queryWrapper)); -// queryWrapper.clear(); + queryWrapper.eq("entrust_type", 2); + queryWrapper.eq("entrust_status", "0.5"); + map.put("dtj", service.count(queryWrapper)); + queryWrapper.clear(); queryWrapper.eq("entrust_type", 2); queryWrapper.eq("entrust_status", "1"); @@ -1478,14 +1506,14 @@ public class EntrustController extends BladeController { map.put("ywc", service.count(queryWrapper)); queryWrapper.clear(); -// queryWrapper.eq("entrust_type", 2); -// queryWrapper.eq("entrust_status", "-1"); -// map.put("yzf", service.count(queryWrapper)); -// queryWrapper.clear(); + queryWrapper.eq("entrust_type", 2); + queryWrapper.eq("entrust_status", "-1"); + map.put("yzf", service.count(queryWrapper)); + queryWrapper.clear(); -// queryWrapper.eq("entrust_type", 2); -// queryWrapper.eq("entrust_status", "-0.5"); -// map.put("djc", service.count(queryWrapper)); + queryWrapper.eq("entrust_type", 2); + queryWrapper.eq("entrust_status", "-0.5"); + map.put("djc", service.count(queryWrapper)); // queryWrapper.clear(); // queryWrapper.eq("entrust_status", "4").or(); // queryWrapper.eq("entrust_status", "5").or(); diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/TaskBlueprintController.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/TaskBlueprintController.java index 6249699..3f73843 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/TaskBlueprintController.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/TaskBlueprintController.java @@ -1,19 +1,44 @@ package org.springblade.lims.controller; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.word.WordExportUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.documents4j.api.DocumentType; +import com.documents4j.api.IConverter; +import com.documents4j.job.LocalConverter; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.printing.PDFPrintable; +import org.apache.pdfbox.printing.Scaling; +import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.lims.entry.*; import org.springblade.lims.service.*; +import org.springblade.system.cache.DictBizCache; +import org.springblade.system.enums.DictBizEnum; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Random; +import javax.imageio.ImageIO; +import javax.print.PrintService; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.standard.Sides; +import java.awt.image.BufferedImage; +import java.awt.print.Book; +import java.awt.print.PageFormat; +import java.awt.print.Paper; +import java.awt.print.PrinterJob; +import java.io.*; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +import static org.springblade.lims.utils.GoogleBarCodeUtils.getBarCode; +import static org.springblade.lims.utils.GoogleBarCodeUtils.insertWords; /** @@ -27,6 +52,7 @@ import java.util.Random; public class TaskBlueprintController extends BladeController { private final ITaskBlueprintService service; + private final ISimpleService simpleService; /** * 提交计划书 @@ -46,5 +72,315 @@ public class TaskBlueprintController extends BladeController { return service.continuePlan(id); } + /** + * 标签打印 + */ + @GetMapping("/labelPrint") + public void labelPrint(String id) throws Exception { + //定义时间格式 + DateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + String format = sdf.format(new Date()); + String spath = DictBizCache.getKey(DictBizEnum.LABEL_PRINT.getName(), "name1"); +// String spath = "D:/ceshi/uploadPath/"; + String path = spath + format + "/"; + File file1 = new File(path); + //如果该路径没有,就创建该路径 + if (!file1.exists()) { + file1.mkdirs(); + } + + // 图片路径集合 + List list = new ArrayList<>(); + + // 拿到本委托单所有样品 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Simple::getEntrustId, id); + wrapper.eq(Simple::getIsReagent, "0"); + List simples = simpleService.list(wrapper); + + + // 根据样品名称分组 + Map> collect = simples.stream().collect(Collectors.groupingBy(Simple::getSimpleName)); + + + // 样品名称集合 + Set set = collect.keySet(); + for (String name : set) { + // 拿到该样品名称对应的所有样品 + List simpleList = collect.get(name); + // 拿到随便一个检测编号 + String experieNum = simpleList.get(0).getExperieNum(); + // 检测编号前缀 + String qz = ""; + String[] split = experieNum.split("-"); + for (int i = 0; i < split.length - 1; i++) { + qz += split[i] + "-"; + } + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + + // 条形码下需要打印的文字内容: 检测编号,样品名称,样品数量,送样时间,科室 + String s = qz + " " + name + " " + simpleList.size() + " " + dateFormat.format(new Date()); + //设置条形码表尾信息 + BufferedImage image = insertWords(getBarCode(s), s); + + String pathpicture = path + format + "-(" + name + ").png"; + list.add(pathpicture); + //生成指定的图片 + ImageIO.write(image, "jpg", new File(pathpicture)); + } + + //将图片存放到pdf中 +// PrintToPdfUtil.toPdf(path, spath + format + ".pdf"); + + // word路劲 + String docx = DictBizCache.getKey(DictBizEnum.LABEL_PRINT.getName(), "name2"); + File file3 = new File(docx); + + + // pdf路径 + String pdf = DictBizCache.getKey(DictBizEnum.LABEL_PRINT.getName(), "name3"); + File file = new File(pdf); + + + // 生成word文档 + simpleHandlePrint(list, docx); + + + // 首先将word文件转化为pdf文件 + documents4jWordToPdf(docx, pdf); + + + // 打印机名称 + String printName = DictBizCache.getKey(DictBizEnum.LABEL_PRINT.getName(), "name4"); + + + // 然后打印pdf文件 + PDFprint(file, printName); + + + // 删除PDF文件 + if (file.exists() && file.isFile()) { + file.delete(); + } + + + // 删除docx文件 + if (file3.exists() && file3.isFile()) { + file3.delete(); + } + + + // 删除生成的所有图片及文件夹 + File file2 = new File(spath + format); + deleteDirectoryLegacyIO(file2); + } + + /** + * 将生成的条形码图片放到word文档中 + */ + public static void simpleHandlePrint(List list, String docx) { + Map result = new HashMap<>(); + List> resultList = new ArrayList<>(); + + // 获取所有图片 + int count = 0; + if (list.size() % 2 == 0) { + count = list.size() / 2; + } else { + count = (list.size() / 2) + 1; + } + for (int i = 0; i < count; i++) { + Map map = new HashMap<>(); + for (int j = 0; j < 2; j++) { + if ((i * 2) + j <= list.size() - 1) { + String s = list.get((i * 2) + j); + ImageEntity farView1 = new ImageEntity(); + farView1.setHeight(124);//设置高度 + farView1.setWidth(240);//设置宽度 + farView1.setType(ImageEntity.Data);//类型 + FileInputStream fis = null; + try { + fis = new FileInputStream(new File(s)); + byte[] bytes = readInputStream(fis); + farView1.setData(bytes); + } catch (Exception e) { + e.printStackTrace(); + } + map.put("p" + j, farView1); + } + } + resultList.add(map); + } + + result.put("list", resultList); + //模板地址 +// String handleUrl = "C://Users//AAA//Desktop//ceshi.docx"; + String labelPrint = DictBizCache.getKey(DictBizEnum.PRINT_URL.getName(), "labelPrint"); +// String url = DictBizCache.getKey(DictBizEnum.PRINT_URL.getName(), "simpleHandlePrint"); + XWPFDocument doc = null; + FileOutputStream fos = null; + try { + doc = WordExportUtil.exportWord07(labelPrint, result); + fos = new FileOutputStream(docx); + String filename = "测试.docx"; +// response.setContentType("application/octet-stream"); +// response.setHeader("content-disposition", "attachment;filename=12344.docx"); + +// doc.write(response.getOutputStream()); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (null != doc) { +// doc.close(); + try { + doc.write(fos); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != fos) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != doc) { + try { + doc.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * 读输入流 + */ + private static byte[] readInputStream(InputStream inStream) throws Exception { + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = inStream.read(buffer)) != -1) { + outStream.write(buffer, 0, len); + } + inStream.close(); + return outStream.toByteArray(); + } + + /** + * 通过documents4j 实现word转pdf + * + * @param sourcePath 源文件地址 如 /root/example.doc + * @param targetPath 目标文件地址 如 /root/example.pdf + */ + public static void documents4jWordToPdf(String sourcePath, String targetPath) { + File inputWord = new File(sourcePath); + File outputFile = new File(targetPath); + try { + InputStream docxInputStream = new FileInputStream(inputWord); + OutputStream outputStream = new FileOutputStream(outputFile); + IConverter converter = LocalConverter.builder().build(); + converter.convert(docxInputStream) + .as(DocumentType.DOCX) + .to(outputStream) + .as(DocumentType.PDF).execute(); + outputStream.close(); + } catch (Exception e) { + System.out.println("[documents4J] word转pdf失败:{}"); + } + } + + /** + * 这里传入的文件为word转化生成的pdf文件 + */ + public static void PDFprint(File file, String printerName) throws Exception { + PDDocument document = null; + try { + document = PDDocument.load(file); + PrinterJob printJob = PrinterJob.getPrinterJob(); + printJob.setJobName(file.getName()); + if (printerName != null) { + // 查找并设置打印机 + //获得本台电脑连接的所有打印机 + PrintService[] printServices = PrinterJob.lookupPrintServices(); + if (printServices == null || printServices.length == 0) { + System.out.print("打印失败,未找到可用打印机,请检查。"); + return; + } + PrintService printService = null; + //匹配指定打印机 + for (int i = 0; i < printServices.length; i++) { + System.out.println(printServices[i].getName()); + if (printServices[i].getName().contains(printerName)) { + printService = printServices[i]; + break; + } + } + if (printService != null) { + printJob.setPrintService(printService); + } else { + System.out.print("打印失败,未找到名称为" + printerName + "的打印机,请检查。"); + return; + } + } + //设置纸张及缩放 + PDFPrintable pdfPrintable = new PDFPrintable(document, Scaling.ACTUAL_SIZE); + //设置多页打印 + Book book = new Book(); + PageFormat pageFormat = new PageFormat(); + //设置打印方向 + pageFormat.setOrientation(PageFormat.PORTRAIT);//纵向 + pageFormat.setPaper(getPaper());//设置纸张 + book.append(pdfPrintable, pageFormat, document.getNumberOfPages()); + printJob.setPageable(book); + printJob.setCopies(1);//设置打印份数 + //添加打印属性 + HashPrintRequestAttributeSet pars = new HashPrintRequestAttributeSet(); + pars.add(Sides.DUPLEX); //设置单双页 + printJob.print(pars); + } finally { + if (document != null) { + try { + document.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static Paper getPaper() { + Paper paper = new Paper(); + // 默认为A4纸张,对应像素宽和高分别为 595, 842 + int width = 595; + int height = 842; + // 设置边距,单位是像素,10mm边距,对应 28px + int marginLeft = 10; + int marginRight = 0; + int marginTop = 10; + int marginBottom = 0; + paper.setSize(width, height); + // 下面一行代码,解决了打印内容为空的问题 + paper.setImageableArea(marginLeft, marginRight, width - (marginLeft + marginRight), height - (marginTop + marginBottom)); + return paper; + } + + + private static void deleteDirectoryLegacyIO(File file) { + File[] list = file.listFiles(); + if (list != null) { + for (File temp : list) { + deleteDirectoryLegacyIO(temp); + } + } + + if (file.delete()) { + System.out.printf("删除成功 : %s%n", file); + } else { + System.err.printf("删除失败 : %s%n", file); + } + } } diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/service/IExamineBasisService.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/service/IExamineBasisService.java index fc7bd5c..4e5a461 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/service/IExamineBasisService.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/service/IExamineBasisService.java @@ -3,7 +3,6 @@ package org.springblade.lims.service; import org.springblade.core.mp.base.BaseService; -import org.springblade.lims.entry.Examine; import org.springblade.lims.entry.ExamineBasis; /** diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/EntrustServiceImpl.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/EntrustServiceImpl.java index f19bd9a..1ded00a 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/EntrustServiceImpl.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/EntrustServiceImpl.java @@ -205,15 +205,33 @@ public class EntrustServiceImpl extends BaseServiceImpl // 委托单入库/修改 addOrUpdateEntrust(entrust, id); + + // 合同评审收样登记先删在加 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(ContractSample::getEntrustId, entrust.getId()); + List list1 = contractSampleService.list(lambdaQueryWrapper); + if (CollectionUtils.isNotEmpty(list1)) { + List ids = new ArrayList<>(); + for (ContractSample contractSample : list1) { + ids.add(contractSample.getId()); + } + contractSampleService.deleteLogic(ids); + } // 合同评审收样登记入库 if (entrust.getContractId() != null) { if (CollectionUtils.isNotEmpty(entrust.getContractSamples())) { List contractSamples = entrust.getContractSamples(); - for (ContractSample contractSample : contractSamples) { + for (int i = 0; i < contractSamples.size(); i++) { + ContractSample contractSample = contractSamples.get(i); + contractSample.setId(null); contractSample.setContractId(entrust.getContractId().toString()); - contractSample.setEntrustId(String.valueOf(entrust.getId())); + contractSample.setEntrustId(entrust.getId()); contractSample.setSampleName(entrust.getSimpleName()); contractSample.setCollectSampleTime(entrust.getSamplingDate()); + contractSample.setStatus(0); + contractSample.setIsDeleted(0); + contractSample.setCreateTime(new Date()); + contractSample.setUpdateTime(new Date()); } contractSampleService.saveBatch(contractSamples); } diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/TaskBlueprintServiceImpl.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/TaskBlueprintServiceImpl.java index 044e697..55bff6e 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/TaskBlueprintServiceImpl.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/TaskBlueprintServiceImpl.java @@ -290,19 +290,19 @@ public class TaskBlueprintServiceImpl extends BaseServiceImpl ENCODE_HINTS = new EnumMap<>(EncodeHintType.class); + + /** + * 解析条形码参数 + */ + private static final EnumMap DECODE_HINTS = new EnumMap<>(DecodeHintType.class); + + /** 微软雅黑常规字体库 字体库 */ + private static final String BASE_FONT = "font/msyh.ttc"; + + static { + /* 字符编码 */ + ENCODE_HINTS.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + /* 容错等级 L、M、Q、H 其中 L 为最低, H 为最高 */ + ENCODE_HINTS.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + /* 字符编码 */ + DECODE_HINTS.put(DecodeHintType.CHARACTER_SET, "UTF-8"); + /* 优化精度 */ + DECODE_HINTS.put(DecodeHintType.TRY_HARDER, true); + } + + private BarcodeUtils() { + } + + /** + * @title 生成条形图片 + * @description 根据文本内容生成默认格式的二维图图片 + * @param text 文本内容 + * @param filePath 生成图片路径 + * @throws WriterException + * @throws IOException + */ + public static void create(String text, String filePath) throws WriterException, IOException { + BitMatrix bitMatrix = createBitMatrix(text, BarcodeFormat.CODE_128, BARCODE_WIDTH, BARCODE_HEIGHT, ENCODE_HINTS); + Path path = FileSystems.getDefault().getPath(filePath); + MatrixToImageWriter.writeToPath(bitMatrix, FORMAT, path); + } + + /** + * @title 生成条形码图片 + * @description 根据文本内容生成条形码图片的字节输出流 + * @param text 文本内容 + * @return 字节输出流 + * @throws WriterException + * @throws IOException + */ + public static ByteArrayOutputStream create(String text) throws WriterException, IOException { + BitMatrix bitMatrix = createBitMatrix(text, BarcodeFormat.CODE_128, BARCODE_WIDTH, BARCODE_HEIGHT, ENCODE_HINTS); + return writeToStream(bitMatrix, FORMAT); + } + + /** + * @title 生成条形码图片 + * @description 根据文本内容,自定义宽度高度,生成所需要的条形码图片 + * @param text 文本内容 + * @param filePath 生成图片文件路径 + * @param width 宽度 + * @param height 高度 + */ + public static void create(String text, String filePath, int width, int height) throws WriterException, IOException { + BitMatrix bitMatrix = createBitMatrix(text, BarcodeFormat.CODE_128, width, height, ENCODE_HINTS); + Path path = FileSystems.getDefault().getPath(filePath); + MatrixToImageWriter.writeToPath(bitMatrix, FORMAT, path); + } + + /** + * @title 生成条形图片 + * @description 根据文本内容,自定义宽度高度,生成所需要的条形码图片 + * @param text 文本内容 + * @param filePath 生成图片文件路径 + * @param width 宽度 + * @param height 高度 + * @param onColor 条形码颜色 + * @param offColor 条形码背景颜色 + */ + public static void create(String text, String filePath, int width, int height, Color onColor, Color offColor) throws WriterException, IOException { + BitMatrix bitMatrix = createBitMatrix(text, BarcodeFormat.CODE_128, width, height, ENCODE_HINTS); + Path path = FileSystems.getDefault().getPath(filePath); + MatrixToImageWriter.writeToPath(bitMatrix, FORMAT, path, new MatrixToImageConfig(onColor.getRGB(), offColor.getRGB())); + } + + /** + * @title 生成条形码图片 + * @description 根据文本内容生成条形码图片的字节输出流 + * @param text 文本内容 + * @param width 宽度 + * @param height 高度 + * @return 字节输出流 + */ + public static ByteArrayOutputStream create(String text, int width, int height) throws WriterException, IOException { + BitMatrix bitMatrix = createBitMatrix(text, BarcodeFormat.QR_CODE, width, height, ENCODE_HINTS); + return writeToStream(bitMatrix, FORMAT); + } + + /** + * @title 生成条形码图片 + * @description 根据文本内容,自定义宽度高度,自定义图片格式,生成所需要的条形码图片 + * @param text 文本内容 + * @param filePath 生成图片文件路径 + * @param width 宽度 + * @param height 高度 + * @param format 图片格式 + */ + public static void create(String text, String filePath, int width, int height, String format) throws WriterException, IOException { + BitMatrix bitMatrix = createBitMatrix(text, BarcodeFormat.QR_CODE, width, height, ENCODE_HINTS); + Path path = FileSystems.getDefault().getPath(filePath); + MatrixToImageWriter.writeToPath(bitMatrix, format, path); + } + + /** + * @title 生成条形图片 + * @description 根据文本内容生成条形图片的字节输出流 + * @param text 文本内容 + * @param width 宽度 + * @param height 高度 + * @param format 自定义图片格式 + * @return 字节输出流 + */ + public static ByteArrayOutputStream create(String text, int width, int height, String format) throws WriterException, IOException { + BitMatrix bitMatrix = createBitMatrix(text, BarcodeFormat.QR_CODE, width, height, ENCODE_HINTS); + return writeToStream(bitMatrix, format); + } + + /** + * @title 生成条形码图片 + * @description 根据文本内容,自定义宽度高度,自定义图片格式,自定义配置信息,生成所需要的条形码图片 + * @param text 文本内容 + * @param filePath 生成图片文件路径 + * @param width 宽度 + * @param height 高度 + * @param format 图片格式 + * @param hintTypes 配置信息 + */ + public static void create(String text, String filePath, int width, int height, String format, EnumMap hintTypes) throws WriterException, IOException { + BitMatrix bitMatrix = createBitMatrix(text, BarcodeFormat.QR_CODE, width, height, hintTypes); + Path path = FileSystems.getDefault().getPath(filePath); + MatrixToImageWriter.writeToPath(bitMatrix, format, path); + } + + /** + * @title 生成条形码图片 + * @param text 文本内容 + * @param width 宽度 + * @param height 高度 + * @param format 图片格式 + * @param hintTypes 配置信息 + * @return 字节输出流 + * @throws WriterException + * @throws IOException + */ + public static ByteArrayOutputStream create(String text, int width, int height, String format, EnumMap hintTypes) throws WriterException, IOException { + BitMatrix bitMatrix = createBitMatrix(text, BarcodeFormat.QR_CODE, width, height, hintTypes); + return writeToStream(bitMatrix, format); + } + + /** + * 生成带文字的条形图片 + * @param text 文本内容 + * @param filePath 生成文件存放路径 + */ + public static void createWithText(String text, String filePath) throws IOException, WriterException { + createWidthLogo(text, BARCODE_WIDTH, BARCODE_HEIGHT, FORMAT, ENCODE_HINTS) + .toFile(filePath); + } + + + /** + * @title 解析条形码 + * @description 解析条形,获取其中文本信息 + * @param filePath 图片路径 + * @return 文本信息 + * @throws IOException + * @throws FormatException + * @throws ChecksumException + * @throws NotFoundException + */ + public static String read(String filePath) throws IOException, FormatException, ChecksumException, NotFoundException { + BinaryBitmap binaryBitmap = createBinaryBitmap(new FileInputStream(filePath)); + return readBarcode(binaryBitmap, DECODE_HINTS).getText(); + } + + /** + * @title 解析条形码 + * @description 解析条形码,获取其中文本信息 + * @param inputStream 输入流 + * @return 文本信息 + * @throws IOException + * @throws FormatException + * @throws ChecksumException + * @throws NotFoundException + */ + public static String read(InputStream inputStream) throws IOException, FormatException, ChecksumException, NotFoundException { + BinaryBitmap binaryBitmap = createBinaryBitmap(inputStream); + return readBarcode(binaryBitmap, DECODE_HINTS).getText(); + } + + /** + * @title 解析条形码 + * @description 解析条形码,获取其中文本信息 + * @param filePath 图片路径 + * @param decodeHints 解析配置 + * @return 文本信息 + * @throws FormatException + * @throws ChecksumException + * @throws NotFoundException + * @throws IOException + */ + private static String read(String filePath, Map decodeHints) throws FormatException, ChecksumException, NotFoundException, IOException { + BinaryBitmap binaryBitmap = createBinaryBitmap(new FileInputStream(filePath)); + return readBarcode(binaryBitmap, decodeHints).getText(); + } + + /** + * @title 解析条形码 + * @description 解析条形码,获取其中文本信息 + * @param inputStream 输入流 + * @return 文本信息 + * @throws IOException + * @throws FormatException + * @throws ChecksumException + * @throws NotFoundException + */ + public static String read(InputStream inputStream, Map decodeHints) throws IOException, FormatException, ChecksumException, NotFoundException { + BinaryBitmap binaryBitmap = createBinaryBitmap(inputStream); + return readBarcode(binaryBitmap, decodeHints).getText(); + } + + + /** + * @title 生成BitMatrix + * @param text 文本内容 + * @param barcodeFormat 条形码格式 + * @param width 宽度 + * @param height 高度 + * @param hintTypes 配置 + * @return BitMatrix + * @throws WriterException + */ + private static BitMatrix createBitMatrix(String text, BarcodeFormat barcodeFormat, int width, int height, EnumMap hintTypes) throws WriterException { + MultiFormatWriter writer = new MultiFormatWriter(); + return writer.encode(text, barcodeFormat, width, height, hintTypes); + } + + /** + * 转成字符输出流 + * @param bitMatrix bitMatrix + * @param format 图片格式 + * @return + * @throws IOException + */ + private static ByteArrayOutputStream writeToStream(BitMatrix bitMatrix, String format) throws IOException { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + MatrixToImageWriter.writeToStream(bitMatrix, format, outputStream); + return outputStream; + } + + /** + * 解析条形码 + * @param binaryBitmap 条形码图类 + * @return 解析信息 + * @throws FormatException + * @throws ChecksumException + * @throws NotFoundException + */ + private static Result readBarcode(BinaryBitmap binaryBitmap, Map decodeHints) throws FormatException, ChecksumException, NotFoundException { + MultiFormatReader reader = new MultiFormatReader(); + return reader.decode(binaryBitmap, decodeHints); + } + + /** + * 生成BinaryBitmap + * @param inputStream 输入流 + * @return + * @throws IOException + */ + private static BinaryBitmap createBinaryBitmap(InputStream inputStream) throws IOException { + BufferedImage bufferedImage = ImageIO.read(inputStream); + LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage); + Binarizer binarizer = new HybridBinarizer(source); + return new BinaryBitmap(binarizer); + } + + /** + * 生成带有文本的条形码 + * @param text 生成文本 + * @param qrCodeWidth 条形码宽度 + * @param qrCodeHeight 条形码高度 + * @param format 图片格式 + * @param encodeHints 条形码配置 + * @return 输出流 + * @throws WriterException + * @throws IOException + */ + private static Thumbnails.Builder createWidthLogo(String text, int qrCodeWidth, int qrCodeHeight, String format, + EnumMap encodeHints) throws WriterException, IOException { + BitMatrix bitMatrix = createBitMatrix(text, BarcodeFormat.CODE_128, qrCodeWidth, qrCodeHeight, encodeHints); + /* 生成条形码的bufferedImage */ + BufferedImage barcode = MatrixToImageWriter.toBufferedImage(bitMatrix); + /* 创建图片构件对象 */ + BufferedImage bg = new BufferedImage(qrCodeWidth, qrCodeHeight + 10, BufferedImage.TYPE_INT_RGB); + Graphics bgGraphics = bg.getGraphics(); + bgGraphics.setColor(Color.WHITE); + bgGraphics.fillRect(0, 0, qrCodeWidth, qrCodeHeight); + Thumbnails.Builder builder = Thumbnails.of(bg); + String fontFile = BarcodeUtils.class.getClassLoader() + .getResource(BASE_FONT) + .getPath(); + Font font = new Font(fontFile, Font.PLAIN, 12); + BufferedImage textImage = new BufferedImage(qrCodeWidth, font.getSize(), BufferedImage.TYPE_INT_ARGB); + //获得图片的笔刷 + Graphics graphics = textImage.getGraphics(); + // 背景颜色 + bgGraphics.setColor(Color.WHITE); + graphics.fillRect(0, 0, qrCodeWidth, font.getSize()); + graphics.setColor(Color.BLACK); + //文字居中 + FontMetrics fm = graphics.getFontMetrics(); + graphics.setFont(font); + graphics.drawString(text, (qrCodeWidth - fm.stringWidth(text)) / 2 , font.getSize()); + BufferedImage textBufferedImage = Thumbnails.of(textImage).size(qrCodeWidth, font.getSize()).asBufferedImage(); + /* 设置l位置居中,不透明 */ + builder.watermark(Positions.CENTER, barcode, 1F) + .watermark(Positions.BOTTOM_CENTER, textBufferedImage, 1F) + .scale(1F) + .outputFormat(format); + return builder; + } +}