package com.yuanchu.mom.service.impl; import cn.hutool.core.lang.UUID; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.deepoove.poi.data.*; import com.deepoove.poi.data.style.*; import com.yuanchu.mom.common.GetLook; import com.yuanchu.mom.common.PrintChina; import com.yuanchu.mom.exception.ErrorException; import com.yuanchu.mom.mapper.ProcessSampleMapper; import com.yuanchu.mom.mapper.UserMapper; import com.yuanchu.mom.pojo.*; import com.yuanchu.mom.mapper.ProcessTotalSampleMapper; import com.yuanchu.mom.service.ProcessTotalSampleService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yuanchu.mom.utils.QueryWrappers; import org.apache.commons.io.IOUtils; import org.apache.poi.xwpf.usermodel.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.*; import java.nio.file.Files; import java.nio.file.Paths; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** *

* 样品接收总表 服务实现类 *

* * @author * @since 2024-12-12 05:02:58 */ @Service public class ProcessTotalSampleServiceImpl extends ServiceImpl implements ProcessTotalSampleService { @Value("${wordUrl}") private String wordUrl; @Value("${file.path}") private String imgUrl; @Resource GetLook getLook; @Resource private UserMapper userMapper; @Resource private ProcessTotalSampleMapper processTotalSampleMapper; @Resource private ProcessSampleMapper processSampleMapper; @Override public Map pageProcessTotalSample(Page page, ProcessTotalSample processTotalSample) { Map map = new HashMap<>(); map.put("head", PrintChina.printChina(ProcessTotalSample.class)); map.put("body", processTotalSampleMapper.pageProcessTotalSample(page, QueryWrappers.queryWrappers(processTotalSample))); return map; } @Override public int submitProcessTotalSample(Integer id) { Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId"); User user = userMapper.selectById(userId); if (ObjectUtils.isEmpty(user.getSignatureUrl())) throw new ErrorException("未找到填表人的电子签名,请上传自己的电子签名!"); ProcessTotalSample processTotalSample = processTotalSampleMapper.selectById(id); processTotalSample.setSubmitUser(userId); processTotalSample.setSubmitState("已提交"); processTotalSample.setSubmitUrl(user.getSignatureUrl()); //生成样品处理申请表并将填表人的电子签名印上 processTotalSample.setUrl(processTotalSample(id,user.getSignatureUrl())); return processTotalSampleMapper.updateById(processTotalSample); } @Override public int checkProcessTotalSample(Integer id, String state) { Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId"); User user = userMapper.selectById(userId); if (ObjectUtils.isEmpty(user.getSignatureUrl())) throw new ErrorException("未找到审核人的电子签名,请上传自己的电子签名!"); ProcessTotalSample processTotalSample = processTotalSampleMapper.selectById(id); processTotalSample.setExamineUser(userId); processTotalSample.setExamineState(state); processTotalSample.setExamineUrl(user.getSignatureUrl()); if (state.equals("不通过")) { processTotalSample.setSubmitState("待提交"); } //将审核人的电子签名印上 wordInsertUrl(new HashMap() {{ put("examineUrl", new FilePictureRenderData(100,50,imgUrl + "/" + user.getSignatureUrl())); }}, wordUrl+"/"+processTotalSample.getUrl()); return processTotalSampleMapper.updateById(processTotalSample); } @Override public int ratifyProcessTotalSample(Integer id, String state) { Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId"); User user = userMapper.selectById(userId); if (ObjectUtils.isEmpty(user.getSignatureUrl())) throw new ErrorException("未找到批准人的电子签名,请上传自己的电子签名!"); ProcessTotalSample processTotalSample = processTotalSampleMapper.selectById(id); processTotalSample.setRatifyUser(userId); processTotalSample.setRatifyState(state); processTotalSample.setRatifyUrl(user.getSignatureUrl()); if (state.equals("不通过")) { processTotalSample.setSubmitState("待提交"); } //将批准人的签名印上 wordInsertUrl(new HashMap() {{ put("ratifyUrl", new FilePictureRenderData(100,50,imgUrl + "/" + user.getSignatureUrl())); }}, wordUrl+"/"+processTotalSample.getUrl()); return processTotalSampleMapper.updateById(processTotalSample); } //生成样品处理表word private String processTotalSample(Integer id,String signatureUrl){ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); List processSamples = processSampleMapper.selectList(Wrappers.lambdaQuery().eq(ProcessSample::getTotalSampleId,id)); String url; try { InputStream inputStream = this.getClass().getResourceAsStream("/static/sample-receive.docx"); File file = File.createTempFile("temp", ".tmp"); OutputStream outputStream = new FileOutputStream(file); IOUtils.copy(inputStream, outputStream); url = file.getAbsolutePath(); } catch (FileNotFoundException e) { throw new ErrorException("找不到模板文件"); } catch (IOException e) { throw new RuntimeException(e); } ConfigureBuilder builder = Configure.builder(); builder.useSpringEL(true); List> sampleList = new ArrayList<>(); Integer index = 1; Integer index1 = 1; for (int c = 0; c < processSamples.size(); c++) { //超过20行换页 if (c % 20 == 0) { List rows = new ArrayList<>(); //表格的行数 for (int i = 0; i < 21; i++) { RowRenderData rowRenderData = new RowRenderData(); RowStyle rowStyle = new RowStyle(); rowStyle.setHeight(40); rowRenderData.setRowStyle(rowStyle); List cells = new ArrayList<>(); //表格的列数 for (int j = 0; j < 8; j++) { CellRenderData cellRenderData = new CellRenderData(); CellStyle cellStyle = new CellStyle(); cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER); cellRenderData.setCellStyle(cellStyle); List paragraphRenderDataList = new ArrayList<>(); ParagraphRenderData paragraphRenderData = new ParagraphRenderData(); ParagraphStyle paragraphStyle = new ParagraphStyle(); paragraphStyle.setAlign(ParagraphAlignment.CENTER); paragraphRenderData.setParagraphStyle(paragraphStyle); List renderData = new ArrayList<>(); TextRenderData textRenderData = new TextRenderData(); Style style = new Style(); style.setFontFamily("宋体"); style.setColor("000000"); textRenderData.setStyle(style); if (i == 0) { //第一行 if (j == 0) { //第一列序号 textRenderData.setText("收样日期@Date of receipt"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 1) { //第二列样品名称 textRenderData.setText("样品编号@Sample number"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 2) { //第三列样品编号 textRenderData.setText("样品名称@Sample name"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 3) { //第四列供样单位 textRenderData.setText("样品数量@Number of samples"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 4) { //第五列数量 textRenderData.setText("来样单位@Sample unit"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 5) { //第六列处理方式 textRenderData.setText("留样日期@Sample retention date"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 6) { //第六列处理方式 textRenderData.setText("样品状态@Sample status"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { //第七列时间 textRenderData.setText("退样签收和/或处理日期@Return signature and/or processing date"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else { //其他行 if (j == 0) { //第一列 try{ String receiveDate = processSamples.get((i-1) + (index1 - 1) * 20).getReceiveDate().format(formatter); textRenderData.setText(receiveDate); } catch (Exception e) { textRenderData.setText(""); } index++; renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 1) { try{ textRenderData.setText(processSamples.get((i-1) + (index1 - 1) * 20).getSampleCode()); } catch (Exception e) { textRenderData.setText(""); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 2) { try{ textRenderData.setText(processSamples.get((i-1) + (index1 - 1) * 20).getSampleName()); } catch (Exception e) { textRenderData.setText(""); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 3) { try{ textRenderData.setText(processSamples.get((i-1) + (index1 - 1) * 20).getNum()+""); } catch (Exception e) { textRenderData.setText(""); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 4) { try{ textRenderData.setText(processSamples.get((i-1) + (index1 - 1) * 20).getSampleSupplier()); } catch (Exception e) { textRenderData.setText(""); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 5) { try{ textRenderData.setText(processSamples.get((i-1) + (index1 - 1) * 20).getLeaveDate().format(formatter)); } catch (Exception e) { textRenderData.setText(""); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 5) { try{ textRenderData.setText(processSamples.get((i-1) + (index1 - 1) * 20).getSampleState()); } catch (Exception e) { textRenderData.setText(""); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { try{ textRenderData.setText(processSamples.get((i-1) + (index1 - 1) * 20).getDealTime().format(formatter)); } catch (Exception e) { textRenderData.setText(""); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } } rowRenderData.setCells(cells); if (rowRenderData.getCells().size() != 0) { rows.add(rowRenderData); } } TableRenderData tableRenderData = new TableRenderData(); tableRenderData.setRows(rows); int countSize = tableRenderData.getRows().get(0).getCells().size(); for (RowRenderData row : tableRenderData.getRows()) { if (row.getCells().size() != countSize) { throw new ErrorException("每行单元格不相等"); } } TableStyle tableStyle = new TableStyle(); tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH); tableStyle.setAlign(TableRowAlign.CENTER); BorderStyle borderStyle = new BorderStyle(); borderStyle.setColor("000000"); borderStyle.setType(XWPFTable.XWPFBorderType.THICK); borderStyle.setSize(14); tableStyle.setLeftBorder(borderStyle); tableStyle.setTopBorder(borderStyle); tableStyle.setRightBorder(borderStyle); tableStyle.setBottomBorder(borderStyle); tableRenderData.setTableStyle(tableStyle); Map table = new HashMap<>(); table.put("sample", tableRenderData); sampleList.add(table); index1++; } } XWPFTemplate template = XWPFTemplate.compile(url, builder.build()).render( new HashMap() {{ put("sampleList", sampleList); put("examineUrl", null); put("ratifyUrl", null); put("writeUrl", new FilePictureRenderData(100,50,imgUrl + "/" + signatureUrl)); }}); String name = UUID.randomUUID() + "_检验样品登记表" + ".docx"; try { template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name))); } catch (IOException e) { throw new RuntimeException(e); } //处理中英文换行的问题 String path = wordUrl + "/" + name; try { FileInputStream stream1 = new FileInputStream(path); XWPFDocument document1 = new XWPFDocument(stream1); List xwpfTables1 = document1.getTables(); for (int i = 0; i < xwpfTables1.size(); i++) { for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) { for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) { if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) { String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText(); String[] split = text.split("@"); xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0); XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph(); XWPFRun run = xwpfParagraph.createRun(); run.setText(split[0]); if (ObjectUtils.isNotNull(split[1])) { run.addBreak(); run.setText(split[1]); } xwpfParagraph.setAlignment(ParagraphAlignment.CENTER); } } } } FileOutputStream fileOutputStream1 = new FileOutputStream(path); document1.write(fileOutputStream1); fileOutputStream1.close(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } return name; } public int wordInsertUrl(Map map, String url) { XWPFTemplate template = XWPFTemplate.compile(url).render(map); try { template.writeAndClose(Files.newOutputStream(Paths.get(url))); } catch (IOException e) { throw new RuntimeException(e); } return 1; } }