2022年11月29日09:19:29

dev
litao 3 years ago
parent 5f36c476c6
commit 5e83efabf3
  1. 6
      lab-service-api/lab-dict-api/src/main/java/org/springblade/system/enums/DictBizEnum.java
  2. 2
      lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Contract.java
  3. 52
      lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ContractSample.java
  4. 10
      lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Entrust.java
  5. 3
      lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Examine.java
  6. 19
      lab-service/lab-lims/pom.xml
  7. 2
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ContractController.java
  8. 72
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/EntrustController.java
  9. 344
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/TaskBlueprintController.java
  10. 1
      lab-service/lab-lims/src/main/java/org/springblade/lims/service/IExamineBasisService.java
  11. 22
      lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/EntrustServiceImpl.java
  12. 6
      lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/TaskBlueprintServiceImpl.java
  13. 378
      lab-service/lab-lims/src/main/java/org/springblade/lims/utils/BarcodeUtils.java

@ -72,7 +72,11 @@ public enum DictBizEnum {
/**
* 样品传输条件
*/
SAMPLE_TRANSPORTATION("sample_transportation")
SAMPLE_TRANSPORTATION("sample_transportation"),
/**
* 打印标签相关
*/
LABEL_PRINT("label_print")
;

@ -29,7 +29,7 @@ public class Contract extends BaseEntity implements Serializable {
private String contractCode;
// 合同金额
private Double contractMount;
private String contractMount;
// 检测内容
private String examineContent;

@ -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;
}

@ -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<ContractSample> contractSamples;
// 合同编号
private String contractCode;
}

@ -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

@ -163,12 +163,26 @@
<version>2.0.6</version>
</dependency>
<!--> google zxing <-->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.1.0</version>
<version>3.3.0</version>
</dependency>
<!--> thumbnailator <-->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
<dependency>
<groupId>org.eclipse.birt.runtime.3_7_1</groupId>
<artifactId>com.lowagie.text</artifactId>
@ -185,9 +199,6 @@
<artifactId>documents4j-transformer-msoffice-word</artifactId>
<version>1.0.3</version>
</dependency>
</dependencies>

@ -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);
}
// 指定评审人员签名

@ -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<ContractSample> samples = contractSampleService.list(wrapper);
entrust.setContractSamples(samples);
}
if (entrust.getSampleReceiverId() != null) {
if (StringUtils.isNotBlank(entrust.getSampleReceiverId())) {
R<User> 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<User> 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<Examine> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Examine::getEntrustId, entrust.getId());
List<Examine> list = examineService.list(queryWrapper);
if (list != null && list.size() > 0) {
if (CollectionUtils.isNotEmpty(list)) {
List<Long> ids = new ArrayList<>();
for (Examine examine : list) {
ids.add(examine.getId());
@ -1270,7 +1267,7 @@ public class EntrustController extends BladeController {
}
List<Examine> 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<ContractSample> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ContractSample::getEntrustId, entrust.getId());
List<ContractSample> list1 = contractSampleService.list(lambdaQueryWrapper);
if (CollectionUtils.isNotEmpty(list1)) {
List<Long> ids = new ArrayList<>();
for (ContractSample contractSample : list1) {
ids.add(contractSample.getId());
}
contractSampleService.deleteLogic(ids);
}
// 合同评审收样登记入库
List<ContractSample> 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<Map<String, Integer>> getContractStatusAndCount() {
Map<String, Integer> map = new HashMap<>(10);
QueryWrapper<Entrust> 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();

@ -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<String> list = new ArrayList<>();
// 拿到本委托单所有样品
LambdaQueryWrapper<Simple> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Simple::getEntrustId, id);
wrapper.eq(Simple::getIsReagent, "0");
List<Simple> simples = simpleService.list(wrapper);
// 根据样品名称分组
Map<String, List<Simple>> collect = simples.stream().collect(Collectors.groupingBy(Simple::getSimpleName));
// 样品名称集合
Set<String> set = collect.keySet();
for (String name : set) {
// 拿到该样品名称对应的所有样品
List<Simple> 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<String> list, String docx) {
Map<String, Object> result = new HashMap<>();
List<Map<String, Object>> 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<String, Object> 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);
}
}
}

@ -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;
/**

@ -205,15 +205,33 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
// 委托单入库/修改
addOrUpdateEntrust(entrust, id);
// 合同评审收样登记先删在加
LambdaQueryWrapper<ContractSample> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ContractSample::getEntrustId, entrust.getId());
List<ContractSample> list1 = contractSampleService.list(lambdaQueryWrapper);
if (CollectionUtils.isNotEmpty(list1)) {
List<Long> ids = new ArrayList<>();
for (ContractSample contractSample : list1) {
ids.add(contractSample.getId());
}
contractSampleService.deleteLogic(ids);
}
// 合同评审收样登记入库
if (entrust.getContractId() != null) {
if (CollectionUtils.isNotEmpty(entrust.getContractSamples())) {
List<ContractSample> 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);
}

@ -290,19 +290,19 @@ public class TaskBlueprintServiceImpl extends BaseServiceImpl<TaskBlueprintMappe
log.setIsFinished(0);
// 1正样 0留样
// 第一批样品
log.setSimpleCount(examine.getSimpleCount());
log.setBatch(1);
Integer min = examine.getMin();
Integer max = examine.getMax();
examine.setSimpleCount(max - min + 1);
log.setSimpleCount(examine.getSimpleCount());
StringBuilder experieNum = new StringBuilder();
for (int i = min - 1; i < max; i++) {
for (int i = 0; i < examine.getSimpleCount(); i++) {
simples.get(i).setIsDistribution(1);
experieNum.append(simples.get(i).getExperieNum()).append(",");
}
examine.setExperieNum(experieNum.toString());
log.setExperieNum(experieNum.toString());
simpleDoExamineLogService.save(log);
examine.setSimpleCount(max - min + 1);
examine.setETaskId(taskId);
examine.setIsDistribute(0);
examine.setIsFinished("-1");

@ -0,0 +1,378 @@
package org.springblade.lims.utils;
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.EnumMap;
import java.util.Map;
/**
* 条形码生成/解析工具类
* @author rocky
* @date 2021/3/18 15:25
*/
public class BarcodeUtils {
/**
* 条形码默认宽度
*/
private static final int BARCODE_WIDTH = 180;
/**
* 条形默认高度
*/
private static final int BARCODE_HEIGHT = 70;
/**
* 默认条形码文件格式
*/
private static final String FORMAT = "png";
/**
* 条形条形码参数
*/
private static final EnumMap<EncodeHintType, Object> ENCODE_HINTS = new EnumMap<>(EncodeHintType.class);
/**
* 解析条形码参数
*/
private static final EnumMap<DecodeHintType, Object> 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<EncodeHintType, Object> 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<EncodeHintType, Object> 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<DecodeHintType, Object> 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<DecodeHintType, Object> 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<EncodeHintType, Object> 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<DecodeHintType, Object> 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<BufferedImage> createWidthLogo(String text, int qrCodeWidth, int qrCodeHeight, String format,
EnumMap<EncodeHintType, Object> 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<BufferedImage> 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;
}
}
Loading…
Cancel
Save