2022年11月1日17:06:09

dev
litao 3 years ago
parent 2d888dcb52
commit cb22aaa87c
  1. 10
      lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ExamineItem.java
  2. 5
      lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ExamineWay.java
  3. 13
      lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Reagent.java
  4. 2
      lab-service/lab-capital/pom.xml
  5. 3
      lab-service/lab-capital/src/main/java/org/springblade/lims/capital/service/impl/ProductStoreServiceImpl.java
  6. 14
      lab-service/lab-capital/src/main/java/org/springblade/lims/capital/util/GoogleBarCodeUtils.java
  7. 20
      lab-service/lab-capital/src/main/java/org/springblade/lims/goods/controller/ContractController.java
  8. 30
      lab-service/lab-capital/src/main/java/org/springblade/lims/goods/controller/GoodsController.java
  9. 30
      lab-service/lab-lims/pom.xml
  10. 3
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/EntrustController.java
  11. 3
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineController.java
  12. 90
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineItemController.java
  13. 31
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineResultController.java
  14. 31
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ReagentController.java
  15. 284
      lab-service/lab-lims/src/main/java/org/springblade/lims/controller/WordToPDF.java
  16. 40
      lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/EntrustServiceImpl.java
  17. 2
      lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/ExamineResultServiceImpl.java
  18. 122
      lab-service/lab-lims/src/main/java/org/springblade/lims/utils/GoogleBarCodeUtils.java
  19. 81
      lab-service/lab-lims/src/main/java/org/springblade/lims/utils/PrintToPdfUtil.java

@ -55,6 +55,16 @@ public class ExamineItem extends BaseEntity implements Serializable {
*/
private Integer price;
/**
* 动物种类
*/
private String animalSpecies;
/**
* 检测类型
*/
private String examineType;
/**
* 关联检验方法
*/

@ -64,4 +64,9 @@ public class ExamineWay extends BaseEntity implements Serializable {
*/
private Integer useCount;
/**
* 输入方式
*/
private String inputMode;
}

@ -37,10 +37,19 @@ public class Reagent extends BaseEntity implements Serializable {
public String savePlace;
/**
* 动物种类
*/
private String animalSpecies;
/**
* 检测类型
*/
private String examineType;
public String manager;
@JsonSerialize(nullsUsing = NullSerializer.class)
public Integer type;
private String type;
public Integer count;

@ -103,7 +103,7 @@
<!-- <artifactId>lab-ops</artifactId>-->
<!-- <version>2.8.1.RELEASE</version>-->
<!-- </dependency>-->
<!-- pdf条形码 -->
<!-- pdf1条形码 -->
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-starter-swagger</artifactId>

@ -200,8 +200,9 @@ public class ProductStoreServiceImpl extends BaseServiceImpl<ProductStoreMapper,
}
}
// 条形码打印
// 条形码打印
@Override
public boolean printBarCode(String[] ids) throws IOException {

@ -4,17 +4,13 @@ import com.alibaba.cloud.commons.lang.StringUtils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@ -28,10 +24,10 @@ public class GoogleBarCodeUtils {
private static final int WIDTH = 600;
/** 条形码高度 */
private static final int HEIGHT = 50;
private static final int HEIGHT = 150;
/** 加文字 条形码 */
private static final int WORDHEIGHT = 75;
private static final int WORDHEIGHT = 300;
/**
* 设置 条形码参数
*/
@ -85,13 +81,13 @@ public class GoogleBarCodeUtils {
Color color=new Color(0, 0, 0);
g2d.setColor(color);
// 字体、字型、字号
g2d.setFont(new Font("微软雅黑", Font.PLAIN, 14));
g2d.setFont(new Font("微软雅黑", Font.PLAIN, 30));
//文字长度
int strWidth = g2d.getFontMetrics().stringWidth(words);
//总长度减去文字长度的一半 (居中显示)
int wordStartX=(WIDTH - strWidth) / 2;
int wordStartX = (WIDTH - strWidth) / 2;
//height + (outImage.getHeight() - height) / 2 + 12
int wordStartY=HEIGHT+20;
int wordStartY = HEIGHT + 30;
// 画文字
g2d.drawString(words, wordStartX, wordStartY);

@ -2,6 +2,7 @@
package org.springblade.lims.goods.controller;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -69,7 +70,6 @@ public class ContractController extends BladeController {
queryWrapper.orderByDesc(Contract::getCreateTime);
String temp = contract.getRemark();
contract.setRemark(null);
// LambdaQueryWrapper<Contract> wrapper = new LambdaQueryWrapper<>(contract);
if (temp != null && !"".equals(temp)) {
queryWrapper.like(Contract::getRemark, temp).or();
queryWrapper.like(Contract::getSupplierName, temp).or();
@ -159,9 +159,12 @@ public class ContractController extends BladeController {
*/
@PostMapping("/save")
public R save(MultipartFile file) throws Exception {
// 读取Excel表中数据
List<ContractExcel> contracts = ExcelUtil.read(file, ContractExcel.class);
if (contracts != null && contracts.size() > 0) {
if (CollectionUtils.isNotEmpty(contracts)) {
// 根据供应商分组
Map<String, List<ContractExcel>> map = contracts.stream().collect(Collectors.groupingBy(ContractExcel::getSupplierName));
Set<Map.Entry<String, List<ContractExcel>>> entries = map.entrySet();
Contract contract1 = new Contract();
for (Map.Entry<String, List<ContractExcel>> entry : entries) {
@ -195,6 +198,7 @@ public class ContractController extends BladeController {
goods.setNum(0);
goods.setUnit(contract.getUnit());
goods.setYt(contract.getYt());
goods.setCreateTime(new Date());
goodsService.save(goods);
ContractDetail detail = new ContractDetail();
@ -236,7 +240,9 @@ public class ContractController extends BladeController {
return R.success("操作成功");
}
// 开票(更改合同主表状态)
/**
* 开票更改合同主表状态
*/
@PostMapping("/invoice")
public boolean invoice(@RequestBody Batch batch) {
LambdaQueryWrapper<Batch> wrapper = new LambdaQueryWrapper<>();
@ -274,13 +280,17 @@ public class ContractController extends BladeController {
return true;
}
// 合同确认(更改合同主表状态)
/**
* 合同确认更改合同主表状态
*/
@PostMapping("/updateStatus")
public void update(@RequestBody Contract contract) {
contractService.updateById(contract);
}
// 接收货品提交(物品入库)
/**
* 接收货品提交物品入库
*/
@PostMapping("/saveAndCommit")
public void saveAndCommit(@RequestBody ContractVO contractVO) {
List<ContractDetail> detailList = contractVO.getDetailList();

@ -79,19 +79,17 @@ public class GoodsController extends BladeController {
LambdaQueryWrapper<Goods> queryWrapper = new LambdaQueryWrapper<>();
// 添加物品查询模糊查询
if (StringUtil.isNoneBlank(goods.getName())) {
queryWrapper.like(Goods::getName, goods.getName()).or();
queryWrapper.like(Goods::getCompany, goods.getName()).or();
queryWrapper.like(Goods::getBrand, goods.getName()).or();
queryWrapper.like(Goods::getYt, goods.getName()).or();
queryWrapper.and(eq -> eq
.like(Goods::getName, goods.getName()).or()
.like(Goods::getCompany, goods.getName()).or()
.like(Goods::getBrand, goods.getName()).or()
.like(Goods::getYt, goods.getName())
);
}
// 根据物品类型大类查询
if (goods.getBigClassId() != null) {
queryWrapper.eq(Goods::getBigClassId, goods.getBigClassId());
}
//根据存放地点查询
if (goods.getLocation() != null) {
queryWrapper.eq(Goods::getLocation, goods.getLocation());
}
queryWrapper.orderByDesc(Goods::getCreateTime);
IPage<Goods> page = goodsService.page(Condition.getPage(query), queryWrapper);
List<Goods> goodsList = page.getRecords();
@ -136,24 +134,16 @@ public class GoodsController extends BladeController {
if (list2 != null && list2.size() > 0) {
throw new Exception("数据重复!");
}
// goods.setDeactivate(1);
// 物品详情入库
goods.setId(RandomUtils.nextLong());
// ProductStoreDetial productStoreDetial = new ProductStoreDetial();
// productStoreDetial.setGoodsId(goods.getId());
// productStoreDetial.setGoodsName(goods.getName());
// productStoreDetial.setPNum(1);
// productStoreDetial.setNum(goods.getNum());
// productStoreDetial.setBeyondTime(new Date());
// productStoreDetial.setCompany(goods.getCompany());
// productStoreDetial.setLocation(goods.getLocation());
// productStoreDetial.setStatus(0);
// productStoreDetialService.save(productStoreDetial);
// 根据物品类型id查名称并赋值
if (goods.getBigClassId() != null) {
ProductClass productClass = productClassService.getById(goods.getBigClassId());
goods.setBigClass(productClass.getName());
}
// 默认数量为0
goods.setNum(0);
// 创建时间
goods.setCreateTime(new Date());
// 消息通知
List<User> userList = userClient.listRolebyId("实验室组长").getData();
if (userList != null) {

@ -157,6 +157,36 @@
<!-- <scope>compile</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.birt.runtime.3_7_1</groupId>
<artifactId>com.lowagie.text</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-local</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-transformer-msoffice-word</artifactId>
<version>1.0.3</version>
</dependency>
</dependencies>

@ -1051,7 +1051,7 @@ public class EntrustController extends BladeController {
if (byId != null) {
examine.setExamineItemName(byId.getName());
}
examine.setInputMode(byId.getInputMode());
// examine.setInputMode(byId.getInputMode());
}
}
if (examine.getExamineWayId() != null) {
@ -1062,6 +1062,7 @@ public class EntrustController extends BladeController {
String name2 = byId.getName();
examine.setExamineWayName(name2);
}
examine.setInputMode(byId.getInputMode());
}
}
Long examineBasisId1 = examine.getExamineBasisId();

@ -139,13 +139,14 @@ public class ExamineController extends BladeController {
if (examineItem != null) {
//检验项目名称
examine.setExamineItemName(examineItem.getName());
examine.setInputMode(examineItem.getInputMode());
// examine.setInputMode(examineItem.getInputMode());
}
if (examineWay != null) {
//检验方法名称
examine.setExamineWayName(examineWay.getName());
//操作程序
examine.setOperation(examineWay.getOperation());
examine.setInputMode(examineWay.getInputMode());
}
if (examineBasis != null) {
//结果判定方法和依据

@ -2,6 +2,8 @@
package org.springblade.lims.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@ -172,30 +174,78 @@ public class ExamineItemController extends BladeController {
* 根据项目id获取对应试剂
*/
@GetMapping("/getReagent")
public R<List<Reagent>> getReagent(String id) throws Exception {
ExamineItem examineItem = service.getById(id);
public R<List<Reagent>> getReagent(String id, String name) throws Exception {
List<Reagent> reagentList = new ArrayList<>();
if (examineItem != null) {
try {
String reagentId = examineItem.getReagentId();
String[] split = reagentId.split(",");
for (String s : split) {
List<Instrument> instrumentList = new ArrayList<>();
Reagent reagent = reagentService.getById(s);
if (reagent != null && reagent.getInstrumentId() != null && !"".equals(reagent.getInstrumentId())) {
String[] split1 = reagent.getInstrumentId().split(",");
for (String s1 : split1) {
Instrument instrument = instrumentService.getById(s1);
instrumentList.add(instrument);
// 如果name不为空,用name模糊查询
if (StringUtils.isNotBlank(name)) {
LambdaQueryWrapper<Reagent> wrapper = new LambdaQueryWrapper<>();
wrapper.like(Reagent::getName, name);
reagentList = reagentService.list(wrapper);
}
// 如果name为空,用标签条件筛选
else {
// id查检测项目
ExamineItem examineItem = service.getById(id);
if (examineItem != null) {
try {
// 条件查询标签一样的试剂数据
LambdaQueryWrapper<Reagent> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Reagent::getType, "1");
// wrapper.eq(Reagent::getAnimalSpecies, examineItem.getAnimalSpecies());
wrapper.eq(Reagent::getExamineType, examineItem.getExamineType());
List<Reagent> reagentArrayList = reagentService.list(wrapper);
String[] animalSplit = examineItem.getAnimalSpecies().split(",");
List<Reagent> reagents = new ArrayList<>();
for (Reagent reagent : reagentArrayList) {
if (StringUtils.isNotEmpty(reagent.getAnimalSpecies())) {
String[] split = reagent.getAnimalSpecies().split(",");
for (String s : split) {
if (Arrays.asList(animalSplit).contains(s)) {
reagents.add(reagent);
break;
}
}
}
}
// 非空 遍历
if (CollectionUtils.isNotEmpty(reagents)) {
for (Reagent reagent : reagents) {
List<Instrument> instrumentList = new ArrayList<>();
if (reagent != null && reagent.getInstrumentId() != null && !"".equals(reagent.getInstrumentId())) {
// 根据仪器id查数据
String[] split1 = reagent.getInstrumentId().split(",");
for (String s1 : split1) {
Instrument instrument = instrumentService.getById(s1);
instrumentList.add(instrument);
}
}
reagent.setInstrumentList(instrumentList);
List<TypeAndOperation> list = JSON.parseArray(reagent.getTypeAndOperation(), TypeAndOperation.class);
reagent.setOperationList(list);
}
reagentList.addAll(reagents);
}
reagent.setInstrumentList(instrumentList);
List<TypeAndOperation> list = JSON.parseArray(reagent.getTypeAndOperation(), TypeAndOperation.class);
reagent.setOperationList(list);
reagentList.add(reagent);
// String reagentId = examineItem.getReagentId();
// String[] split = reagentId.split(",");
// for (String s : split) {
// List<Instrument> instrumentList = new ArrayList<>();
// Reagent reagent = reagentService.getById(s);
// if (reagent != null && reagent.getInstrumentId() != null && !"".equals(reagent.getInstrumentId())) {
// String[] split1 = reagent.getInstrumentId().split(",");
// for (String s1 : split1) {
// Instrument instrument = instrumentService.getById(s1);
// instrumentList.add(instrument);
// }
// }
// reagent.setInstrumentList(instrumentList);
// List<TypeAndOperation> list = JSON.parseArray(reagent.getTypeAndOperation(), TypeAndOperation.class);
// reagent.setOperationList(list);
// reagentList.add(reagent);
// }
} catch (NullPointerException e) {
throw new Exception("请给当前检测项目关联对应的试剂");
}
} catch (NullPointerException e) {
throw new Exception("请给当前检测项目关联对应的试剂");
}
}
return R.data(reagentList);

@ -43,6 +43,8 @@ public class ExamineResultController extends BladeController {
private final IExamineItemService examineItemService;
private final IExamineWayService examineWayService;
private final IReagentService reagentService;
/**
@ -87,17 +89,19 @@ public class ExamineResultController extends BladeController {
public R excel(MultipartFile file, String examineId, String reagentId) throws Exception {
Examine examine = examineService.getById(examineId);
ExamineItem examineItem = examineItemService.getById(examine.getExamineItemId());
if ("2".equals(examineItem.getInputMode()) || "6".equals(examineItem.getInputMode())) {
ExamineWay examineWay = examineWayService.getById(examine.getExamineWayId());
if ("2".equals(examineWay.getInputMode()) || "6".equals(examineWay.getInputMode())) {
return blsExcel(file, examineId);
} else if ("3".equals(examineItem.getInputMode())) {
} else if ("3".equals(examineWay.getInputMode())) {
return ktyExcel(file, examineId);
}
// else if ("4".equals(examineItem.getInputMode())) {
// else if ("4".equals(examineWay.getInputMode())) {
// return pcrExcel(file, examineId);
// }
else if ("5".equals(examineItem.getInputMode())) {
else if ("5".equals(examineWay.getInputMode())) {
return xnExcel(file, examineId);
} else {
}
else {
return ptExcel(file, examineId, reagentId);
}
}
@ -2847,11 +2851,12 @@ public class ExamineResultController extends BladeController {
*/
private R blsExcel(MultipartFile file, String examineId) throws Exception {
Examine examine = examineService.getById(examineId);
ExamineItem examineItem = examineItemService.getById(examine.getExamineItemId());
// ExamineItem examineItem = examineItemService.getById(examine.getExamineItemId());
ExamineWay examineWay = examineWayService.getById(examine.getExamineWayId());
List<ExamineTemplate2Excel> read = ExcelUtil.read(file, ExamineTemplate2Excel.class);
if (read != null && read.size() > 0) {
// 布鲁氏杆菌抗体检测(平板凝集)
if ("2".equals(examineItem.getInputMode())) {
if ("2".equals(examineWay.getInputMode())) {
for (ExamineTemplate2Excel excel : read) {
if ("+".equals(excel.getValue())) {
excel.setResult("阳性");
@ -2863,7 +2868,7 @@ public class ExamineResultController extends BladeController {
}
}
// 布鲁氏杆菌抗体检测(试管凝集微量法)
else if ("6".equals(examineItem.getInputMode())) {
else if ("6".equals(examineWay.getInputMode())) {
for (ExamineTemplate2Excel excel : read) {
if ("++++".equals(excel.getValue()) || "+++".equals(excel.getValue()) || "++".equals(excel.getValue())) {
excel.setResult("阳性");
@ -4216,10 +4221,10 @@ public class ExamineResultController extends BladeController {
@ApiOperation(value = "结果模板")
public void exportCurrExamineTemplate(HttpServletResponse response, String id) {
Examine examine = examineService.getById(id);
ExamineItem examineItem = examineItemService.getById(examine.getExamineItemId());
// ExamineItem examineItem = examineItemService.getById(examine.getExamineItemId());
ExamineWay examineWay = examineWayService.getById(examine.getExamineWayId());
// 如果是布鲁氏杆菌抗体检测
if ("2".equals(examineItem.getInputMode()) || "6".equals(examineItem.getInputMode())) {
if ("2".equals(examineWay.getInputMode()) || "6".equals(examineWay.getInputMode())) {
LambdaQueryWrapper<SimpleDoExamineLog> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SimpleDoExamineLog::getExamineId, id);
wrapper.eq(SimpleDoExamineLog::getIsFinished, 0);
@ -4241,7 +4246,7 @@ public class ExamineResultController extends BladeController {
ExcelUtil.export(response, "结果模板", "结果模板", list, ExamineTemplateExcel.class);
}
// PCR检测
else if ("4".equals(examineItem.getInputMode())) {
else if ("4".equals(examineWay.getInputMode())) {
String experieNum = examine.getExperieNum();
List<PCRExcel> list = new ArrayList<>();
String[] split = experieNum.split(",");
@ -4260,7 +4265,7 @@ public class ExamineResultController extends BladeController {
}
// 血凝
// PCR检测
else if ("5".equals(examineItem.getInputMode())) {
else if ("5".equals(examineWay.getInputMode())) {
String experieNum = examine.getExperieNum();
List<XNExcel> list = new ArrayList<>();
String[] split = experieNum.split(",");

@ -89,15 +89,7 @@ public class ReagentController extends BladeController {
*/
@PostMapping("/update")
@ApiOperation(value = "更改", notes = "更改")
public R update(@RequestBody Reagent entry) throws Exception {
// List<Reagent> list = service.list();
// if (list != null && list.size() > 0) {
// for (Reagent reagent : list) {
// if (entry.getName().equals(reagent.getName()) && entry.getManufacturer().equals(reagent.getManufacturer())) {
// throw new Exception("名称重复");
// }
// }
// }
public R update(@RequestBody Reagent entry) {
List<TypeAndOperation> operationList = entry.getOperationList();
if (operationList != null && operationList.size() > 0) {
entry.setTypeAndOperation(JSON.toJSONString(operationList));
@ -106,7 +98,7 @@ public class ReagentController extends BladeController {
}
/**
*
* 新增
*/
@PostMapping("/insert")
public boolean insertExamine(@RequestBody Reagent entry) throws Exception {
@ -134,7 +126,9 @@ public class ReagentController extends BladeController {
return R.status(service.deleteLogic(Func.toLongList(ids)));
}
//返回所有试剂
/**
* 返回所有试剂
*/
@GetMapping("/getAll")
public List<Reagent> getAll() {
LambdaQueryWrapper<Reagent> wrapper = new LambdaQueryWrapper<>();
@ -145,7 +139,7 @@ public class ReagentController extends BladeController {
/**
* excle批量导入试剂
*/
@PostMapping("inExcle")
@PostMapping("/inExcle")
public R inExcle(MultipartFile file) throws Exception {
List<ReagentExcel> excelList = ExcelUtil.read(file, ReagentExcel.class);
List<Reagent> list = service.list();
@ -180,7 +174,7 @@ public class ReagentController extends BladeController {
/**
* excle模板下载
*/
@GetMapping("downExcle")
@GetMapping("/downExcle")
public void exportInOrder(HttpServletResponse response) {
List<ReagentExcel> list = new ArrayList<>();
ReagentExcel excel1 = new ReagentExcel();
@ -197,4 +191,15 @@ public class ReagentController extends BladeController {
excel2.setResultDeterminationMethod("血清的结果判定");
ExcelUtil.export(response, "试剂导入模板", "试剂数据", list, ReagentExcel.class);
}
/**
* excle模板下载
*/
@GetMapping("/getExtract")
public R<List<Reagent>> getExtract() {
LambdaQueryWrapper<Reagent> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Reagent::getType, "2");
return R.data(service.list(wrapper));
}
}

@ -0,0 +1,284 @@
package org.springblade.lims.controller;
import cn.afterturn.easypoi.entity.ImageEntity;
import cn.afterturn.easypoi.word.WordExportUtil;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
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.lims.entry.Entrust;
import org.springblade.lims.entry.Simple;
import org.springblade.lims.utils.PrintToPdfUtil;
import org.springblade.system.cache.DictBizCache;
import org.springblade.system.enums.DictBizEnum;
import javax.imageio.ImageIO;
import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.Sides;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
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 static org.springblade.lims.utils.GoogleBarCodeUtils.getBarCode;
import static org.springblade.lims.utils.GoogleBarCodeUtils.insertWords;
public class WordToPDF {
// public static void main(String[] args) throws Exception {
// DateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
// String format = sdf.format(new Date());
// String spath = "D:/ceshi/uploadPath/";
// String path = spath + format + "/";
// File file1 = new File(path);
// //如果该路径没有,就创建该路径
// if (!file1.exists()) {
// file1.mkdirs();
// }
//
// // 图片路径集合
// List<String> list = new ArrayList<>();
//
// for (int i = 0; i < 24; i++) {
// StringBuilder stringBuilder = new StringBuilder();
// stringBuilder.append("编号:").append("aaa").append(i).append(" ")
// .append("方式:").append("eee").append(i).append(" ");
// System.out.println(stringBuilder.toString());
//
// //设置条形码表尾信息
// BufferedImage image = insertWords(getBarCode("sdsj-" + i), stringBuilder.toString());
//
// String pathpicture = path + format + "-(" + i + ").png";
// System.out.println(pathpicture);
// list.add(pathpicture);
// //生成指定的图片
// ImageIO.write(image, "jpg", new File(pathpicture));
// }
// //将图片存放到pdf中
//// PrintToPdfUtil.toPdf(path, spath + format + ".pdf");
//
// // 生成word文档
// simpleHandlePrint(list);
//
// // 首先将word文件转化为pdf文件
//// documents4jWordToPdf("C:\\Users\\AAA\\Desktop\\txm.docx", "C:\\Users\\AAA\\Desktop\\txm.pdf");
//
// // 然后打印pdf文件
//// String pdfFile = "C:\\Users\\AAA\\Desktop\\txm.pdf";//文件路径
//// File file = new File(pdfFile);
//// PDFprint(file, "HP Color LaserJet MFP M281fdw");
//
// // 删除PDF文件
//// if (file.exists() && file.isFile()) {
//// file.delete();
//// }
// }
/**
* 将生成的条形码图片放到word文档中
*/
public static void simpleHandlePrint(List<String> list) {
Map<String, Object> result = new HashMap<>();
List<Map<String, Object>> resultList = new ArrayList<>();
// 获取所有图片
int count = 0;
if (list.size() % 3 == 0) {
count = list.size() / 3;
} else {
count = (list.size() / 3) + 1;
}
for (int i = 0; i < count; i++) {
Map<String, Object> map = new HashMap<>();
for (int j = 0; j < 3; j++) {
if ((i * 3) + j <= list.size() - 1) {
String s = list.get((i * 3) + 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 url = DictBizCache.getKey(DictBizEnum.PRINT_URL.getName(), "simpleHandlePrint");
XWPFDocument doc = null;
FileOutputStream fos = null;
try {
doc = WordExportUtil.exportWord07(handleUrl, result);
fos = new FileOutputStream("C://Users//AAA//Desktop//txm.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;
}
}

@ -417,17 +417,18 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
for (int i = 1; i <= examineList.size(); i++) {
Examine examine = examineList.get(i - 1);
ExamineItem examineItem = examineItemService.getById(examine.getExamineItemId());
ExamineWay examineWay = examineWayService.getById(examine.getExamineWayId());
// 检测项目名称
reportMainBody.put("name" + i, examineItem.getName());
// 判断是哪种检测
String inputMode = examineItem.getInputMode();
// String inputMode = examineItem.getInputMode();
// 根据检测检测项目拿检测结果
ExamineResult examineResult = getExamineResultByExamineId(examine.getId());
// 布鲁氏检测
if ("2".equals(examineItem.getInputMode()) || "6".equals(examineItem.getInputMode())) {
if ("2".equals(examineWay.getInputMode()) || "6".equals(examineWay.getInputMode())) {
List<ExamineTemplate2Excel> list = JSON.parseArray(examineResult.getExamineDataArr(), ExamineTemplate2Excel.class);
if (list != null && list.size() > 0) {
for (int i1 = 0; i1 < list.size(); i1++) {
@ -450,7 +451,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
}
}
// PCR检测
else if ("4".equals(examineItem.getInputMode())) {
else if ("4".equals(examineWay.getInputMode())) {
List<PCR2Excel> list = JSON.parseArray(examineResult.getExamineDataArr(), PCR2Excel.class);
if (list != null && list.size() > 0) {
for (PCR2Excel excel : list) {
@ -472,7 +473,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
}
}
// XN检测
else if ("5".equals(examineItem.getInputMode())) {
else if ("5".equals(examineWay.getInputMode())) {
List<XN2Excel> list = JSON.parseArray(examineResult.getExamineDataArr(), XN2Excel.class);
if (list != null && list.size() > 0) {
for (XN2Excel excel : list) {
@ -500,7 +501,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
// 对普通检测原始记录进行按照order排序
sortByOrder(list);
// 口蹄疫
if ("3".equals(examineItem.getInputMode())) {
if ("3".equals(examineWay.getInputMode())) {
// 口蹄疫兰所单板
if ("1".equals(examine.getTemplateType())) {
@ -532,7 +533,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
resultVo.setRecessiveNum(simple.getRecessiveNum());
resultVo.setNum(simple.getExperieNum());
resultVo.setIndex(i);
resultVo.setValue(excel.getValue());
resultVo.setValue(excel.getLog2());
resultVo.setResult(excel.getResult());
resultList.add(resultVo);
}
@ -566,7 +567,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
resultVo.setRecessiveNum(simple.getRecessiveNum());
resultVo.setNum(simple.getExperieNum());
resultVo.setIndex(i);
resultVo.setValue(excel.getValue());
resultVo.setValue(excel.getLog2());
resultVo.setResult(excel.getResult());
resultList.add(resultVo);
}
@ -600,7 +601,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
resultVo.setRecessiveNum(simple.getRecessiveNum());
resultVo.setNum(simple.getExperieNum());
resultVo.setIndex(i);
resultVo.setValue(excel.getValue());
resultVo.setValue(excel.getLog2());
resultVo.setResult(excel.getResult());
resultList.add(resultVo);
}
@ -1166,7 +1167,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
// 检测项目
ExamineItem byId = examineItemService.getById(examine.getExamineItemId());
// 检测方法
// ExamineWay examineWay = examineWayService.getById(examine.getExamineWayId());
ExamineWay examineWay = examineWayService.getById(examine.getExamineWayId());
// 检测依据
ExamineBasis examineBasis = examineBasisService.getById(examine.getExamineBasisId());
String[] split = examine.getExperieNum().split(",");
@ -1177,7 +1178,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
result.put("3", StringUtils.remove(examine.getSimpleName(), "-"));
result.put("4", examine.getSimpleCount());
// 标题名称
if ("4".equals(byId.getInputMode())) {
if ("4".equals(examineWay.getInputMode())) {
result.put("5", byId.getName().substring(0, byId.getName().length() - 2));
// 检测项目
result.put("19", byId.getName());
@ -1357,8 +1358,8 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
}
// 如果是布鲁氏检测 (列排单+式和列排多+式)
if ("2".equals(byId.getInputMode()) || "6".equals(byId.getInputMode())) {
if ("2".equals(byId.getInputMode())) {
if ("2".equals(examineWay.getInputMode()) || "6".equals(examineWay.getInputMode())) {
if ("2".equals(examineWay.getInputMode())) {
result.put("18", "平板凝集");
} else {
result.put("18", "试管凝集");
@ -1440,7 +1441,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
}
}
// PCR检测
else if ("4".equals(byId.getInputMode())) {
else if ("4".equals(examineWay.getInputMode())) {
List<PCR2Excel> list = JSON.parseArray(examineResult.getExamineDataArr(), PCR2Excel.class);
// 阴阳性数量
// long yin = list.stream().filter((PCR2Excel e) -> "阴性".equals(e.getValue())).count();
@ -1598,7 +1599,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
url = DictBizCache.getKey(DictBizEnum.PRINT_URL.getName(), "PCRreportPrint");
}
// XN检测
else if ("5".equals(byId.getInputMode())) {
else if ("5".equals(examineWay.getInputMode())) {
List<XN2Excel> list = JSON.parseArray(examineResult.getExamineDataArr(), XN2Excel.class);
// 阴阳性数量
// long yin = list.stream().filter((XN2Excel e) -> "阴性".equals(e.getValue())).count();
@ -1745,7 +1746,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
}
});
// position1
if ("3".equals(byId.getInputMode())) {
if ("3".equals(examineWay.getInputMode())) {
// 口蹄疫兰所单板
if ("1".equals(examine.getTemplateType())) {
List<ExamineDataArrVO> voList = JSON.parseArray(examineResult.getOriginRecordResult(), ExamineDataArrVO.class);
@ -3641,10 +3642,11 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
ExamineResult examineResult = examineResultService.getOne(queryWrapper);
// 检测项目
ExamineItem examineItem = examineItemService.getById(examine.getExamineItemId());
ExamineWay examineWay = examineWayService.getById(examine.getExamineWayId());
result.put("name", examineItem.getName());
// 布鲁氏检测
if ("2".equals(examineItem.getInputMode())) {
if ("2".equals(examineWay.getInputMode())) {
List<ExamineTemplate2Excel> list = JSON.parseArray(examineResult.getExamineDataArr(), ExamineTemplate2Excel.class);
if (list != null && list.size() > 0) {
for (ExamineTemplate2Excel excel : list) {
@ -3665,7 +3667,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
}
}
// PCR检测
else if ("4".equals(examineItem.getInputMode())) {
else if ("4".equals(examineWay.getInputMode())) {
List<PCR2Excel> list = JSON.parseArray(examineResult.getExamineDataArr(), PCR2Excel.class);
if (list != null && list.size() > 0) {
for (PCR2Excel excel : list) {
@ -3686,7 +3688,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
}
}
// XN检测
else if ("5".equals(examineItem.getInputMode())) {
else if ("5".equals(examineWay.getInputMode())) {
List<XN2Excel> list = JSON.parseArray(examineResult.getExamineDataArr(), XN2Excel.class);
if (list != null && list.size() > 0) {
for (XN2Excel excel : list) {
@ -3719,7 +3721,7 @@ public class EntrustServiceImpl extends BaseServiceImpl<EntrustMapper, Entrust>
}
});
// position1
if ("3".equals(examineItem.getInputMode())) {
if ("3".equals(examineWay.getInputMode())) {
// 口蹄疫兰所单板
if ("1".equals(examine.getTemplateType())) {
List<ExamineDataArrVO> voList = JSON.parseArray(examineResult.getOriginRecordResult(), ExamineDataArrVO.class);

@ -439,7 +439,7 @@ public class ExamineResultServiceImpl extends BaseServiceImpl<ExamineResultMappe
if (examineItem != null) {
reagentUseLog.setForExamine(examineItem.getName());
}
reagentUseLog.setType(reagent.getType());
reagentUseLog.setType(Integer.parseInt(reagent.getType()));
reagentUseLog.setApplicant(examine.getExamineBy());
reagentUseLog.setApplicationDate(new Date());
list2.add(reagentUseLog);

@ -0,0 +1,122 @@
package org.springblade.lims.utils;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
/**
* @description: 谷歌条形码打印
* @author: Administrator
* @date: 2019-03-07 14:46
*/
public class GoogleBarCodeUtils {
/** 条形码宽度 */
private static final int WIDTH = 600;
/** 条形码高度 */
private static final int HEIGHT = 150;
/** 加文字 条形码 */
private static final int WORDHEIGHT = 300;
/**
* 设置 条形码参数
*/
private static Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>() {
private static final long serialVersionUID = 1L;
{
// 设置编码方式
put(EncodeHintType.CHARACTER_SET, "utf-8");
}
};
/**
* 生成 图片缓冲
* @author fxbin
* @param vaNumber VA
* @return 返回BufferedImage
*/
public static BufferedImage getBarCode(String vaNumber){
try {
Code128Writer writer = new Code128Writer();
// 编码内容, 编码类型, 宽度, 高度, 设置参数
BitMatrix bitMatrix = writer.encode(vaNumber, BarcodeFormat.CODE_128, WIDTH, HEIGHT, hints);
return MatrixToImageWriter.toBufferedImage(bitMatrix);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 把带logo的二维码下面加上文字
* @author fxbin
* @param image 条形码图片
* @param words 文字
* @return 返回BufferedImage
*/
public static BufferedImage insertWords(BufferedImage image, String words){
// 新的图片,把带logo的二维码下面加上文字
if (StringUtils.isNotEmpty(words)) {
BufferedImage outImage = new BufferedImage(WIDTH, WORDHEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = outImage.createGraphics();
// 抗锯齿
setGraphics2D(g2d);
// 设置白色
setColorWhite(g2d);
// 画条形码到新的面板
g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
// 画文字到新的面板
Color color=new Color(0, 0, 0);
g2d.setColor(color);
// 字体、字型、字号
g2d.setFont(new Font("微软雅黑", Font.PLAIN, 30));
//文字长度
int strWidth = g2d.getFontMetrics().stringWidth(words);
//总长度减去文字长度的一半 (居中显示)
int wordStartX = (WIDTH - strWidth) / 2;
//height + (outImage.getHeight() - height) / 2 + 12
int wordStartY = HEIGHT + 30;
// 画文字
g2d.drawString(words, wordStartX, wordStartY);
g2d.dispose();
outImage.flush();
return outImage;
}
return null;
}
/**
* 设置 Graphics2D 属性 抗锯齿
* @param g2d Graphics2D提供对几何形状坐标转换颜色管理和文本布局更为复杂的控制
*/
private static void setGraphics2D(Graphics2D g2d){
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
Stroke s = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
g2d.setStroke(s);
}
/**
* 设置背景为白色
* @param g2d Graphics2D提供对几何形状坐标转换颜色管理和文本布局更为复杂的控制
*/
private static void setColorWhite(Graphics2D g2d){
g2d.setColor(Color.WHITE);
//填充整个屏幕
g2d.fillRect(0,0,600,600);
//设置笔刷
g2d.setColor(Color.BLACK);
}
}

@ -0,0 +1,81 @@
package org.springblade.lims.utils;
import com.lowagie.text.*;
import com.lowagie.text.pdf.PdfWriter;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 将多张图片合并转为PDF需要用到iTextpdf包
*
* @author 浴缸
*
*/
public class PrintToPdfUtil {
/**
*
* @param imageFolderPath
* 图片文件夹地址
* @param pdfPath
* PDF文件保存地址
*
*/
public static void toPdf(String imageFolderPath, String pdfPath) {
try {
// 图片文件夹地址
// String imageFolderPath = "D:/Demo/ceshi/";
// 图片地址
String imagePath = null;
// PDF文件保存地址
// String pdfPath = "D:/Demo/ceshi/hebing.pdf";
// 输入流
FileOutputStream fos = new FileOutputStream(pdfPath);
// 创建文档
Document doc = new Document(null, 0, 0, 0, 0);
//doc.open();
// 写入PDF文档
PdfWriter.getInstance(doc, fos);
// 读取图片流
BufferedImage img = null;
// 实例化图片
Image image = null;
// 获取图片文件夹对象
File file = new File(imageFolderPath);
File[] files = file.listFiles();
// 循环获取图片文件夹内的图片
for (File file1 : files) {
if (file1.getName().endsWith(".png")
|| file1.getName().endsWith(".jpg")
|| file1.getName().endsWith(".gif")
|| file1.getName().endsWith(".jpeg")
|| file1.getName().endsWith(".tif")) {
// System.out.println(file1.getName());
imagePath = imageFolderPath + file1.getName();
System.out.println(file1.getName());
// 读取图片流
img = ImageIO.read(new File(imagePath));
// 根据图片大小设置文档大小
doc.setPageSize(new Rectangle(img.getWidth(), img
.getHeight()));
// 实例化图片
image = Image.getInstance(imagePath);
// 添加图片到文档
doc.open();
doc.add(image);
}
}
// 关闭文档
doc.close();
} catch (IOException e) {
e.printStackTrace();
} catch (BadElementException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
Loading…
Cancel
Save