diff --git a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ExamineItem.java b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ExamineItem.java index a2e15c7..e714833 100644 --- a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ExamineItem.java +++ b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ExamineItem.java @@ -55,6 +55,16 @@ public class ExamineItem extends BaseEntity implements Serializable { */ private Integer price; + /** + * 动物种类 + */ + private String animalSpecies; + + /** + * 检测类型 + */ + private String examineType; + /** * 关联检验方法 */ diff --git a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ExamineWay.java b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ExamineWay.java index 41efe85..b96de3c 100644 --- a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ExamineWay.java +++ b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/ExamineWay.java @@ -64,4 +64,9 @@ public class ExamineWay extends BaseEntity implements Serializable { */ private Integer useCount; + /** + * 输入方式 + */ + private String inputMode; + } \ No newline at end of file diff --git a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Reagent.java b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Reagent.java index 28f66f9..883dd23 100644 --- a/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Reagent.java +++ b/lab-service-api/lab-lims-api/src/main/java/org/springblade/lims/entry/Reagent.java @@ -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; diff --git a/lab-service/lab-capital/pom.xml b/lab-service/lab-capital/pom.xml index aba1ac6..d9ff829 100644 --- a/lab-service/lab-capital/pom.xml +++ b/lab-service/lab-capital/pom.xml @@ -103,7 +103,7 @@ - + org.springblade blade-starter-swagger diff --git a/lab-service/lab-capital/src/main/java/org/springblade/lims/capital/service/impl/ProductStoreServiceImpl.java b/lab-service/lab-capital/src/main/java/org/springblade/lims/capital/service/impl/ProductStoreServiceImpl.java index c4fb2a3..d268257 100644 --- a/lab-service/lab-capital/src/main/java/org/springblade/lims/capital/service/impl/ProductStoreServiceImpl.java +++ b/lab-service/lab-capital/src/main/java/org/springblade/lims/capital/service/impl/ProductStoreServiceImpl.java @@ -200,8 +200,9 @@ public class ProductStoreServiceImpl extends BaseServiceImpl 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 contracts = ExcelUtil.read(file, ContractExcel.class); - if (contracts != null && contracts.size() > 0) { + if (CollectionUtils.isNotEmpty(contracts)) { + // 根据供应商分组 Map> map = contracts.stream().collect(Collectors.groupingBy(ContractExcel::getSupplierName)); + Set>> entries = map.entrySet(); Contract contract1 = new Contract(); for (Map.Entry> 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 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 detailList = contractVO.getDetailList(); diff --git a/lab-service/lab-capital/src/main/java/org/springblade/lims/goods/controller/GoodsController.java b/lab-service/lab-capital/src/main/java/org/springblade/lims/goods/controller/GoodsController.java index c2cd64b..e70017e 100644 --- a/lab-service/lab-capital/src/main/java/org/springblade/lims/goods/controller/GoodsController.java +++ b/lab-service/lab-capital/src/main/java/org/springblade/lims/goods/controller/GoodsController.java @@ -79,19 +79,17 @@ public class GoodsController extends BladeController { LambdaQueryWrapper 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 page = goodsService.page(Condition.getPage(query), queryWrapper); List 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 userList = userClient.listRolebyId("实验室组长").getData(); if (userList != null) { diff --git a/lab-service/lab-lims/pom.xml b/lab-service/lab-lims/pom.xml index 7f89fc7..48585b8 100644 --- a/lab-service/lab-lims/pom.xml +++ b/lab-service/lab-lims/pom.xml @@ -157,6 +157,36 @@ + + org.apache.pdfbox + pdfbox + 2.0.6 + + + + com.google.zxing + javase + 3.1.0 + + + + org.eclipse.birt.runtime.3_7_1 + com.lowagie.text + 2.1.7 + + + + com.documents4j + documents4j-local + 1.0.3 + + + com.documents4j + documents4j-transformer-msoffice-word + 1.0.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 07b1a7a..74446b7 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 @@ -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(); diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineController.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineController.java index fbea5d0..c791533 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineController.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineController.java @@ -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) { //结果判定方法和依据 diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineItemController.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineItemController.java index f0b1b49..48ca65b 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineItemController.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineItemController.java @@ -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> getReagent(String id) throws Exception { - ExamineItem examineItem = service.getById(id); + public R> getReagent(String id, String name) throws Exception { List reagentList = new ArrayList<>(); - if (examineItem != null) { - try { - String reagentId = examineItem.getReagentId(); - String[] split = reagentId.split(","); - for (String s : split) { - List 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 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 wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Reagent::getType, "1"); +// wrapper.eq(Reagent::getAnimalSpecies, examineItem.getAnimalSpecies()); + wrapper.eq(Reagent::getExamineType, examineItem.getExamineType()); + List reagentArrayList = reagentService.list(wrapper); + String[] animalSplit = examineItem.getAnimalSpecies().split(","); + List 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 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 list = JSON.parseArray(reagent.getTypeAndOperation(), TypeAndOperation.class); + reagent.setOperationList(list); } + reagentList.addAll(reagents); } - reagent.setInstrumentList(instrumentList); - List 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 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 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); diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineResultController.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineResultController.java index 7db921e..de44e4f 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineResultController.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineResultController.java @@ -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 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 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 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 list = new ArrayList<>(); String[] split = experieNum.split(","); diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ReagentController.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ReagentController.java index b6665c0..d51d651 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ReagentController.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ReagentController.java @@ -89,15 +89,7 @@ public class ReagentController extends BladeController { */ @PostMapping("/update") @ApiOperation(value = "更改", notes = "更改") - public R update(@RequestBody Reagent entry) throws Exception { -// List 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 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 getAll() { LambdaQueryWrapper 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 excelList = ExcelUtil.read(file, ReagentExcel.class); List list = service.list(); @@ -180,7 +174,7 @@ public class ReagentController extends BladeController { /** * excle模板下载 */ - @GetMapping("downExcle") + @GetMapping("/downExcle") public void exportInOrder(HttpServletResponse response) { List 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> getExtract() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Reagent::getType, "2"); + return R.data(service.list(wrapper)); + } + } diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/WordToPDF.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/WordToPDF.java new file mode 100644 index 0000000..7133cf2 --- /dev/null +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/WordToPDF.java @@ -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 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 list) { + Map result = new HashMap<>(); + List> 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 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; + } +} 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 dceece6..c7c508d 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 @@ -417,17 +417,18 @@ public class EntrustServiceImpl extends BaseServiceImpl 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 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 } } // PCR检测 - else if ("4".equals(examineItem.getInputMode())) { + else if ("4".equals(examineWay.getInputMode())) { List 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 } } // XN检测 - else if ("5".equals(examineItem.getInputMode())) { + else if ("5".equals(examineWay.getInputMode())) { List 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 // 对普通检测原始记录进行按照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 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 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 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 // 检测项目 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 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 } // 如果是布鲁氏检测 (列排单+式和列排多+式) - 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 } } // PCR检测 - else if ("4".equals(byId.getInputMode())) { + else if ("4".equals(examineWay.getInputMode())) { List 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 url = DictBizCache.getKey(DictBizEnum.PRINT_URL.getName(), "PCRreportPrint"); } // XN检测 - else if ("5".equals(byId.getInputMode())) { + else if ("5".equals(examineWay.getInputMode())) { List 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 } }); // position1 - if ("3".equals(byId.getInputMode())) { + if ("3".equals(examineWay.getInputMode())) { // 口蹄疫兰所单板 if ("1".equals(examine.getTemplateType())) { List voList = JSON.parseArray(examineResult.getOriginRecordResult(), ExamineDataArrVO.class); @@ -3641,10 +3642,11 @@ public class EntrustServiceImpl extends BaseServiceImpl 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 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 } } // PCR检测 - else if ("4".equals(examineItem.getInputMode())) { + else if ("4".equals(examineWay.getInputMode())) { List 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 } } // XN检测 - else if ("5".equals(examineItem.getInputMode())) { + else if ("5".equals(examineWay.getInputMode())) { List 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 } }); // position1 - if ("3".equals(examineItem.getInputMode())) { + if ("3".equals(examineWay.getInputMode())) { // 口蹄疫兰所单板 if ("1".equals(examine.getTemplateType())) { List voList = JSON.parseArray(examineResult.getOriginRecordResult(), ExamineDataArrVO.class); diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/ExamineResultServiceImpl.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/ExamineResultServiceImpl.java index dfe2a42..1261647 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/ExamineResultServiceImpl.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/ExamineResultServiceImpl.java @@ -439,7 +439,7 @@ public class ExamineResultServiceImpl extends BaseServiceImpl hints = new HashMap() { + 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); + } +} diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/utils/PrintToPdfUtil.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/utils/PrintToPdfUtil.java new file mode 100644 index 0000000..41e6d1f --- /dev/null +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/utils/PrintToPdfUtil.java @@ -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(); + } + } +}