package com.ruoyi.inspect.handler; import com.deepoove.poi.data.*; import com.deepoove.poi.data.style.*; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.framework.util.MyUtil; import com.ruoyi.inspect.dto.SampleProductDto; import com.ruoyi.inspect.mapper.InsProductMapper; import com.ruoyi.inspect.mapper.InsSampleMapper; import com.ruoyi.inspect.pojo.InsProduct; import com.ruoyi.inspect.pojo.InsReport; import com.ruoyi.inspect.pojo.InsSample; import com.ruoyi.inspect.vo.InsProductFiberVO; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.TableRowAlign; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import java.text.Collator; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** * 光纤配置报告处理类 */ public class FiberConfigReportHandler { /** * 默认表格宽度 */ private final static int[] DEFAULT_COL_WIDTHS = {1600,0, 1200, 1200, 1200, 1200, 1200, 1200,1200}; private final InsProductMapper insProductMapper; private final InsSampleMapper insSampleMapper; public FiberConfigReportHandler(InsProductMapper insProductMapper, InsSampleMapper insSampleMapper){ this.insProductMapper = insProductMapper; this.insSampleMapper = insSampleMapper; } private final static String ITEM_SPLIT_CHAR = "&";//检验项分隔符 private final static String COLOR_SPLIT_CHAR = "-";//色标分隔符 /** * * @param samples 所有样品 * @param insReport report对象 * @param tables2 光纤配置附件表格行列表 * @param colorDict 色标字典 */ public void doWrite(List samples, InsReport insReport, List> tables2, List colorDict){ AtomicInteger index2 = new AtomicInteger(1);//页码 samples.forEach(sample -> { //查询样品下的检验项和色标 List insProducts1 = insProductMapper.selectInsProductInsFiberList(sample.getId()); //根据色标分组 Map> groupProducts = insProducts1.stream() .filter(p->!p.getInspectionItem().equals("光纤接头损耗")) .collect(Collectors.groupingBy(product -> product.getBushColor()+"-"+product.getColor())); if(groupProducts.isEmpty()){ return; } List collect = groupProducts.keySet().stream().map(k -> k.split(COLOR_SPLIT_CHAR)).sorted((o1, o2) -> { if (o1.length > 1 && o2.length > 1) { if (!Objects.equals(o1[0], o2[0])) { Integer o1Index = colorDict.indexOf(o1[0]); Integer o2Index = colorDict.indexOf(o2[0]); return o1Index.compareTo(o2Index); } if (!Objects.equals(o1[1], o2[1])) { Integer o1Index = colorDict.indexOf(o1[1]); Integer o2Index = colorDict.indexOf(o2[1]); return o1Index.compareTo(o2Index); } } return 0; }).collect(Collectors.toList()); List sortKeys = collect.stream().map(c->String.join(COLOR_SPLIT_CHAR,c)).collect(Collectors.toList()); //检验项列表(表头) List itemMap = insProducts1.stream().sorted((o1,o2)->{ //根据检验项排序 if(!Objects.equals(o1.getInspectionItem(),o2.getInspectionItem())){ List specialItems = Arrays.asList("耐环境应力开裂","热收缩率"); if(specialItems.contains(o1.getInspectionItem()) && specialItems.contains(o2.getInspectionItem())){ return Integer.MAX_VALUE; } Collator instance = Collator.getInstance(Locale.CHINA); return instance.compare(o1.getInspectionItem(),o2.getInspectionItem()); } //检验子项排序 if(StringUtils.isNotBlank(o1.getInspectionItemSubclass())&& StringUtils.isNotBlank(o2.getInspectionItemSubclass())){ if(!Objects.equals(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass())){ Collator instance = Collator.getInstance(Locale.CHINA); return instance.compare(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass()); } } return 0; }).map(insProduct -> { String item = MyUtil.joinChars("@",insProduct.getInspectionItem(),insProduct.getInspectionItemEn()); String itemSubClass = MyUtil.joinChars("@",insProduct.getInspectionItemSubclass(),insProduct.getInspectionItemSubclassEn()); return MyUtil.joinChars(ITEM_SPLIT_CHAR,item,itemSubClass); }).distinct().collect(Collectors.toList()); long size = itemMap.size(); long size2 = insProducts1.stream().map(InsProduct::getInsFiberId).distinct().count(); long number = 7; long k = 0; //判断检验项目是否有父子关系 int a = itemMap.stream().anyMatch(p -> p.split(ITEM_SPLIT_CHAR).length>0) ? 2 : 1; for (long c = 0; c < size; c++) { if (c % number == 0) { List rows = new ArrayList<>(); //表格的行数 for (long i = 0; i < size2 + a + 1; i++) { RowRenderData rowRenderData = new RowRenderData(); RowStyle rowStyle = new RowStyle(); rowStyle.setHeight(40); rowRenderData.setRowStyle(rowStyle); List cells = new ArrayList<>(); //表格的列数 for (long j = 0; j < 9; 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"); style.setFontSize(10); textRenderData.setStyle(style); if(i==0){ //第一行 if (j == 0) { //第一列 textRenderData.setText("样品编号@Sample number∑456"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 1) { //第二列 textRenderData.setText("样品编号@Sample number∑456"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 2) { //第二列 textRenderData.setText(sample.getSampleCode()+"∑4566"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); }else if (j == 3) { //第二列 textRenderData.setText(sample.getSampleCode()+"∑4566"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); }else if (j == 4) { //第二列 textRenderData.setText("规格型号@Type∑457"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); }else if (j == 5) { //第二列 textRenderData.setText("规格型号@Type∑457"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); }else if (j == 6) { //第二列 textRenderData.setText(sample.getModel()+"∑4577"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); }else if (j == 7) { //第二列 textRenderData.setText(sample.getModel()+"∑4577"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); }else{ //第二列 textRenderData.setText(sample.getModel()+"∑4577"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else if (i == 1) { //第二行 if (j == 0) { //第一列 textRenderData.setText("管色标@Pipe∑100"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 1) { //第二列 textRenderData.setText("光纤色标@Scanning Number∑101"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { if(itemMap.size()>(int) (j - 2 + k)){ String inspectionItem = itemMap.get((int) (j - 2 + k)).split(ITEM_SPLIT_CHAR)[0]; textRenderData.setText( inspectionItem + "∑" + inspectionItem); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); }else{ String inspectionItem = itemMap.get(itemMap.size()-1).split(ITEM_SPLIT_CHAR)[0]; textRenderData.setText("∑" + inspectionItem); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } } else if (a == 2 && i == 2) { //有父子项目关系的第三行 if (j == 0) { //第一列 textRenderData.setText("管色标@Pipe∑100"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 1) { //第二列 textRenderData.setText("光纤色标@Scanning Number∑101"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { //项目信息 if(itemMap.size()>(int)(j - 2 + k)){ //判断是否有项目子类 String[] splits = itemMap.get((int) (j - 2 + k)).split(ITEM_SPLIT_CHAR); if (splits.length<2 || "@".equals(splits[1])) { textRenderData.setText(splits[0] + "∑" + splits[0]); } else { textRenderData.setText(splits[1]+"∑"+splits[0]+splits[1]); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); }else{ //判断是否有项目子类 String[] splits = itemMap.get(itemMap.size()-1).split(ITEM_SPLIT_CHAR); if (splits.length<2 || "@".equals(splits[1])) { textRenderData.setText("∑" + splits[0]); } else { textRenderData.setText("∑"+splits[0]+splits[1]); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } } else{ //循环色标 String key = sortKeys.get((int)i-3); if(itemMap.size()>(int) (j - 2 + k)) { int index = Math.max((int) (j - 2 + k), 0); String item = itemMap.get(index); InsProductFiberVO insProduct = groupProducts.get(key).stream() .filter(p->{ String insItem = MyUtil.joinChars("@",p.getInspectionItem(),p.getInspectionItemEn()); String insSubItem = MyUtil.joinChars("@",p.getInspectionItemSubclass(),p.getInspectionItemSubclassEn()); return item.equals(MyUtil.joinChars(ITEM_SPLIT_CHAR,insItem,insSubItem)); }).findFirst().orElse(new InsProductFiberVO()); //填值 if (j == 0) { //第一列 textRenderData.setText(insProduct.getBushColor()); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 1) { //第二列 textRenderData.setText(insProduct.getColor()); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { //项目信息 if((index+1)==groupProducts.get(key).size()){ textRenderData.setText(insProduct.getLastValue()+"∑last"+key); }else{ textRenderData.setText(insProduct.getLastValue()); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else { textRenderData.setText("∑last"+key); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } } rowRenderData.setCells(cells); if (!rowRenderData.getCells().isEmpty()) { 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("每行单元格不相等4"); } } 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("table2", tableRenderData); table.put("report", insReport); table.put("sample_number", sample.getSampleCode()); table.put("type", sample.getModel()); table.put("index2", index2.get()); tables2.add(table); k += 7; index2.getAndIncrement(); } } }); } /** * 光纤附件表格:写入行数据 * @param fiberList 光纤项目信息 * @param tables2 光纤附件表格 */ public void writeFiberEnclosureTableRow(List fiberList, List> tables2, InsReport insReport) { AtomicInteger index2 = new AtomicInteger(1);//页码 int colCount = 9;//表格总列数 int itemCount = 7;//表格项目列数 int k = 0;//已遍历检验项数量 //检验项列表(表头) List itemMap = fiberList.stream().map(insProduct -> { String item = MyUtil.joinChars("@",insProduct.getInspectionItem(),insProduct.getInspectionItemEn()); String itemSubClass = MyUtil.joinChars("@",insProduct.getInspectionItemSubclass(),insProduct.getInspectionItemSubclassEn()); return MyUtil.joinChars(ITEM_SPLIT_CHAR,item,itemSubClass); }).sorted(Comparator.naturalOrder()).distinct().collect(Collectors.toList()); //根据样品id分组 Map> groupProducts = fiberList.stream() .collect(Collectors.groupingBy(InsProduct::getInsSampleId)); //sampleId顺序排序 List sortKeys = groupProducts.keySet().stream().sorted(Comparator.naturalOrder()).collect(Collectors.toList()); //判断检验项目是否有父子关系 int a = itemMap.stream().anyMatch(p -> p.split(ITEM_SPLIT_CHAR).length>0) ? 2 : 1; for (int c = 0; c < itemMap.size(); c++) { if (c % itemCount == 0) { List rows = new ArrayList<>(); //表格的行数(样品数量+表头) int tableRow = sortKeys.size() + a; for (int i = 0; i < tableRow; i++) { RowRenderData rowRenderData = new RowRenderData(); RowStyle rowStyle = new RowStyle(); rowStyle.setHeight(40); rowRenderData.setRowStyle(rowStyle); List cells = new ArrayList<>(); //表格的列数 for (int j = 0; j < colCount; 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"); style.setFontSize(10); textRenderData.setStyle(style); //第一行 if(i==0){ if (j < 2) { //第一列 textRenderData.setText("样品编号@Sample number∑45678"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else{ //生成表头 if(itemMap.size()> (j - 2 + k)){ String inspectionItem = itemMap.get(j - 2 + k).split(ITEM_SPLIT_CHAR)[0]; textRenderData.setText( inspectionItem + "∑" + inspectionItem); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); }else{ String inspectionItem = itemMap.get(itemMap.size()-1).split(ITEM_SPLIT_CHAR)[0]; textRenderData.setText("∑" + inspectionItem); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } } else if (a == 2 && i == 1) { //有父子项目关系的第二行 if (j < 2) { //第一列 textRenderData.setText("样品编号@Sample number∑45678"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { //项目信息 if(itemMap.size()> (j - 2 + k)){ //判断是否有项目子类 String[] splits = itemMap.get(j - 2 + k).split(ITEM_SPLIT_CHAR); if (splits.length<2 || "@".equals(splits[1])) { textRenderData.setText(splits[0] + "∑" + splits[0]); } else { textRenderData.setText(splits[1]+"∑"+splits[0]+splits[1]); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); }else{ //判断是否有项目子类 String[] splits = itemMap.get(itemMap.size()-1).split(ITEM_SPLIT_CHAR); if (splits.length<2 || "@".equals(splits[1])) { textRenderData.setText("∑" + splits[0]); } else { textRenderData.setText("∑"+splits[0]+splits[1]); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } } else{ //循环样品 Integer key = sortKeys.get(i-2); if(itemMap.size()>j - 2 + k) { //查询当前样品信息 InsSample insSample = insSampleMapper.selectById(key); int index = Math.max(j - 2 + k, 0); String item = itemMap.get(index); InsProduct insProduct = groupProducts.get(key).stream() .filter(p->{ String insItem = MyUtil.joinChars("@",p.getInspectionItem(),p.getInspectionItemEn()); String insItemSubClass = MyUtil.joinChars("@",p.getInspectionItemSubclass(),p.getInspectionItemSubclassEn()); return item.equals(MyUtil.joinChars(ITEM_SPLIT_CHAR,insItem,insItemSubClass)); }) .findFirst().orElse(new InsProduct()); //填值 if (j < 2) { //第一列 textRenderData.setText(insSample.getSampleCode()+"∑"+key); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { //项目信息 if((index+1)==groupProducts.get(key).size()){ textRenderData.setText(insProduct.getLastValue()+"∑last"+key); }else{ textRenderData.setText(insProduct.getLastValue()); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else { textRenderData.setText("∑last"+key); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } } rowRenderData.setCells(cells); if (!rowRenderData.getCells().isEmpty()) { 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.setColWidths(DEFAULT_COL_WIDTHS); // tableStyle.setWidth("10000"); 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("table2", tableRenderData); table.put("report", insReport); table.put("index2", index2.get()); tables2.add(table); k += 7; index2.getAndIncrement(); } } } /** * 光纤附件表格:写入行数据 * @param ribbonList 光纤项目信息 * @param tables6 光纤带尺寸参数附件表格 */ public void writeFiberOpticRibbonEnclosureTableRow(List ribbonList, List> tables6,InsReport insReport){ } }