소스 검색

代码合并

lwhhszx 2 년 전
부모
커밋
bc49cb997c

+ 236 - 0
RMS/src/main/java/cn/cslg/report/common/utils/WordUtil.java

@@ -0,0 +1,236 @@
+package cn.cslg.report.common.utils;
+
+import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
+import org.apache.poi.xwpf.usermodel.*;
+import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
+
+import java.io.IOException;
+import java.math.BigInteger;
+import java.util.List;
+
+/**
+ * @Classname WordUtil
+ * @Description 导出WORD工具类
+ * @Date 2020/11/24 10:40
+ * @Author author
+ */
+public class WordUtil {
+    /**
+     * 创建默认的页脚(该页脚主要只居中显示页码)
+     *
+     * @param docx XWPFDocument文档对象
+     * @return
+     * @throws IOException IO异常
+     */
+    public static void createDefaultFooter(XWPFDocument docx) throws IOException {
+        CTSectPr sectPr = docx.getDocument().getBody().addNewSectPr();
+        XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(docx, sectPr);
+        XWPFFooter footer = headerFooterPolicy.createFooter(STHdrFtr.DEFAULT);
+        XWPFParagraph paragraph = footer.getParagraphArray(0);
+        paragraph.setAlignment(ParagraphAlignment.CENTER);
+        paragraph.setVerticalAlignment(TextAlignment.CENTER);
+        CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
+        tabStop.setVal(STTabJc.CENTER);
+        XWPFRun run = paragraph.createRun();
+        run.addTab();
+        run = paragraph.createRun();
+        run.setText("第");
+        run = paragraph.createRun();
+        CTFldChar fldChar = run.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
+        run = paragraph.createRun();
+        CTText ctText = run.getCTR().addNewInstrText();
+        ctText.setStringValue("PAGE  \\* MERGEFORMAT");
+        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
+        fldChar = run.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
+        run = paragraph.createRun();
+        run.setText("页/共");
+        run = paragraph.createRun();
+        fldChar = run.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
+        run = paragraph.createRun();
+        ctText = run.getCTR().addNewInstrText();
+        ctText.setStringValue("NUMPAGES  \\* MERGEFORMAT ");
+        ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
+        fldChar = run.getCTR().addNewFldChar();
+        fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
+        run = paragraph.createRun();
+        run.setText("页");
+    }
+
+
+    /**
+     * 设置表头内容
+     *
+     * @param cell
+     * @param text
+     * @param width
+     * @param fontFamily
+     * @param fontSize
+     * @param bold
+     */
+    public static void setCellText(XWPFTableCell cell, String text, int width, String fontFamily, int fontSize, boolean bold) {
+        XWPFParagraph paragraph = cell.getParagraphs().get(0);
+        XWPFRun run = paragraph.createRun();
+        run.setFontFamily(fontFamily);
+        run.setFontSize(fontSize);
+        run.setBold(bold);
+        run.setText(text);
+        CTTc cttc = cell.getCTTc();
+        CTTcPr cellPr = cttc.addNewTcPr();
+//        cellPr.addNewTcW().setW(BigInteger.valueOf(width));
+        cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
+        CTTcPr ctPr = cttc.addNewTcPr();
+        ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
+        cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
+    }
+
+    /**
+     * 设置页边距
+     *
+     * @param doc
+     * @param left
+     * @param right
+     * @param top
+     * @param bottom
+     */
+    public static void setMargin(XWPFDocument doc, int left, int right, int top, int bottom) {
+        CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
+        CTPageMar pageMar = sectPr.addNewPgMar();
+        pageMar.setLeft(BigInteger.valueOf(left));
+        pageMar.setRight(BigInteger.valueOf(right));
+        pageMar.setTop(BigInteger.valueOf(top));
+        pageMar.setBottom(BigInteger.valueOf(bottom));
+    }
+
+    /**
+     * 设置段落文本
+     *
+     * @param doc
+     * @param text
+     * @param fontFamily
+     * @param fontSize
+     * @param textPosition
+     * @param bold
+     * @param paragraphAlignment
+     */
+    public static void setParagraph(XWPFDocument doc,
+                                    String text,
+                                    String fontFamily,
+                                    int fontSize,
+                                    int textPosition,
+                                    boolean bold,
+                                    ParagraphAlignment paragraphAlignment) {
+        XWPFParagraph xp = doc.createParagraph();
+        xp.setSpacingBefore(0);
+        XWPFRun r1 = xp.createRun();
+        r1.setText(text);
+        r1.setFontFamily(fontFamily);
+        r1.setFontSize(fontSize);
+        r1.setTextPosition(textPosition);
+        r1.setBold(bold);
+        xp.setAlignment(paragraphAlignment);
+    }
+
+    /**
+     * 设置表格样式
+     *
+     * @param cell
+     * @param paragraphAlignment
+     * @param fontFamily
+     * @param fontSize
+     * @param bold
+     * @return
+     */
+    public static XWPFRun setTableCellStyle(XWPFTableCell cell, ParagraphAlignment paragraphAlignment, String fontFamily, int fontSize, boolean bold) {
+        XWPFParagraph paragraph = cell.getParagraphs().get(0);
+        paragraph.setAlignment(paragraphAlignment);
+        XWPFRun run = paragraph.createRun();
+        run.setFontFamily(fontFamily);
+        run.setFontSize(fontSize);
+        run.setBold(bold);
+        return run;
+    }
+
+    /**
+     * 设置边框
+     *
+     * @param xTable
+     * @param bolderSize
+     */
+    public static void setTableBolder(XWPFTable xTable, int bolderSize, String color) {
+        CTTblBorders borders = xTable.getCTTbl().getTblPr().addNewTblBorders();
+        CTBorder hBorder = borders.addNewInsideH();
+        hBorder.setVal(STBorder.Enum.forString("single"));
+        hBorder.setSz(new BigInteger(String.valueOf(bolderSize)));
+        hBorder.setColor(color);
+
+        CTBorder vBorder = borders.addNewInsideV();
+        vBorder.setVal(STBorder.Enum.forString("single"));
+        vBorder.setSz(new BigInteger(String.valueOf(bolderSize)));
+        vBorder.setColor(color);
+
+        CTBorder lBorder = borders.addNewLeft();
+        lBorder.setVal(STBorder.Enum.forString("single"));
+        lBorder.setSz(new BigInteger(String.valueOf(bolderSize)));
+        lBorder.setColor(color);
+
+        CTBorder rBorder = borders.addNewRight();
+        rBorder.setVal(STBorder.Enum.forString("single"));
+        rBorder.setSz(new BigInteger(String.valueOf(bolderSize)));
+        rBorder.setColor(color);
+
+        CTBorder tBorder = borders.addNewTop();
+        tBorder.setVal(STBorder.Enum.forString("single"));
+        tBorder.setSz(new BigInteger(String.valueOf(bolderSize)));
+        tBorder.setColor(color);
+
+        CTBorder bBorder = borders.addNewBottom();
+        bBorder.setVal(STBorder.Enum.forString("single"));
+        bBorder.setSz(new BigInteger(String.valueOf(bolderSize)));
+        bBorder.setColor(color);
+    }
+    /**
+     * word单元格列合并
+     * @param table 表格
+     * @param row 合并列所在行
+     * @param startCell 开始列
+     * @param endCell 结束列
+     * @date 2020年4月8日 下午4:43:54
+     */
+    public static void mergeCellsHorizontal(XWPFTable table, int row, int startCell, int endCell) {
+        for (int i = startCell; i <= endCell; i++) {
+            XWPFTableCell cell = table.getRow(row).getCell(i);
+            if (i == startCell) {
+                // The first merged cell is set with RESTART merge value
+                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
+            } else {
+                // Cells which join (merge) the first one, are set with CONTINUE
+                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+
+    /**
+     * word单元格行合并
+     * @param table 表格
+     * @param col 合并行所在列
+     * @param fromRow 开始行
+     * @param toRow 结束行
+     * @date 2020年4月8日 下午4:46:18
+     */
+    public static void mergeCellsVertically(XWPFTable table, int col, int startRow, int endRow) {
+        for (int i = startRow; i <= endRow; i++) {
+            XWPFTableCell cell = table.getRow(i).getCell(col);
+            if (i == startRow) {
+                // The first merged cell is set with RESTART merge value
+                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
+            } else {
+                // Cells which join (merge) the first one, are set with CONTINUE
+                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+}

+ 12 - 3
RMS/src/main/java/cn/cslg/report/controller/InvalidReReport/InvalidReasonController.java

@@ -3,10 +3,10 @@ package cn.cslg.report.controller.InvalidReReport;
 import cn.cslg.report.common.core.base.Constants;
 import cn.cslg.report.common.model.dto.invalidReReport.CheckReFeaturesDTO;
 import cn.cslg.report.common.model.dto.invalidReReport.InvalidReasonDTO;
-import cn.cslg.report.common.model.dto.invalidReReport.QueryInvalidReasonDTO;
+import cn.cslg.report.common.model.dto.invalidReReport.InvalidReasonFieldValueDTO;
 import cn.cslg.report.common.model.vo.invalidReReport.QueryInvalidReasonVO;
 import cn.cslg.report.common.utils.Response;
-import cn.cslg.report.entity.invalidReReport.InvalidReason;
+import cn.cslg.report.service.business.InvalidReReport.InvalidReasonFieldValueService;
 import cn.cslg.report.service.business.InvalidReReport.InvalidReasonService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -30,7 +30,7 @@ import java.util.List;
 @RequestMapping(Constants.REPORT_API + "/invalidReason")
 public class InvalidReasonController {
     private final InvalidReasonService invalidReasonService;
-
+    private final InvalidReasonFieldValueService invalidReasonFieldValueService;
     @Operation(summary = "添加无效理由和证据")
     @PostMapping("/addInvalidReason")
     public String addInvalidReason(@RequestBody InvalidReasonDTO invalidReasonDTO) {
@@ -85,4 +85,13 @@ public class InvalidReasonController {
         return Response.success(isFlag);
     }
 
+    @Operation(summary = "添加或更新无效理由自定义字段值")
+    @PostMapping("/addOrUpdateValue")
+    public String addOrUpdateValue(@RequestBody List<InvalidReasonFieldValueDTO> invalidReasonFieldValueDTOS) throws IOException {
+        Boolean isFlag = invalidReasonFieldValueService.addOrUpdate(invalidReasonFieldValueDTOS);
+        if(!isFlag){
+            Response.error("添加失败");
+        }
+        return Response.success("添加成功");
+    }
 }

+ 7 - 0
RMS/src/main/java/cn/cslg/report/controller/InvalidRecordController.java

@@ -55,5 +55,12 @@ public class InvalidRecordController {
         return invalidRecordService.queryInvalidRecord(invalidRecord);
     }
 
+    @GetMapping(value = "/exportInvalid")
+    @Operation(summary = "查询无效记录")
+    @Transactional(rollbackFor = Exception.class)
+    public String exportInvalid(@RequestBody InvalidRecord invalidRecord)throws IOException{
+        return invalidRecordService.queryInvalidRecord(invalidRecord);
+    }
+
 
 }

+ 139 - 33
RMS/src/main/java/cn/cslg/report/service/business/ExportArgumentsScenariosService.java

@@ -1,26 +1,35 @@
 package cn.cslg.report.service.business;
 
 import cn.cslg.report.common.model.dto.invalidReReport.InvalidReasonDTO;
+import cn.cslg.report.common.model.dto.invalidReReport.InvalidReasonFieldValueDTO;
 import cn.cslg.report.common.model.vo.invalidReReport.ExportInvalidReasonVO;
+import cn.cslg.report.common.model.vo.invalidReReport.QueryInvalidReasonVO;
+import cn.cslg.report.common.utils.WordUtil;
+import cn.cslg.report.entity.invalidReReport.InvalidReasonField;
+import cn.cslg.report.service.business.InvalidReReport.InvalidReasonFieldService;
 import cn.cslg.report.service.business.InvalidReReport.InvalidReasonService;
 import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.apache.poi.xwpf.usermodel.*;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.io.OutputStream;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 导出无效理由实现类
+ *
  * @Author xiexiang
  * @Date 2023/7/24
  */
@@ -29,40 +38,137 @@ import java.util.List;
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class ExportArgumentsScenariosService {
     private final InvalidReasonService invalidReasonService;
+    private final InvalidReasonFieldService invalidReasonFieldService;
 
     public void ExportToExcel(Integer reportId, String filePath) throws IOException {
-        List<ExportInvalidReasonVO> exportInvalidReasonVOS = invalidReasonService.exportInvalidReason(reportId);
-        try (FileOutputStream fileOut = new FileOutputStream(filePath)){
-            Workbook workbook = new XSSFWorkbook();
-            Sheet sheet = workbook.createSheet("无效理由");
-            //创建标题行
-            Row headerRow = sheet.createRow(0);
-            String[] headers = {"序号","无效理由","涉及内容","相关证据","陈述意见"};
-            for(int i = 0; i < headers.length; i++){
-                Cell cell = headerRow.createCell(i);
-                cell.setCellValue(headers[i]);
-            }
-            //字体
-            Font headerFont = workbook.createFont();
-            headerFont.setBold(true);
-            CellStyle headerCellStyle = workbook.createCellStyle();
-            headerCellStyle.setFont(headerFont);
-            int rowNum = 0;
-            //填充数据
-            for(ExportInvalidReasonVO exportInvalidReasonVO : exportInvalidReasonVOS){
-                Row row = sheet.createRow(rowNum++);
-                row.createCell(0).setCellValue(exportInvalidReasonVO.getInvalidName());
-                row.createCell(1).setCellValue(exportInvalidReasonVO.getContent());
-                row.createCell(2).setCellValue(exportInvalidReasonVO.getProofStr());
-                row.createCell(3).setCellValue(exportInvalidReasonVO.getArgumentStr());
+        XWPFDocument doc = new XWPFDocument();
+        //根据报告id查询所有自定义字段
+        LambdaQueryWrapper<InvalidReasonField> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(InvalidReasonField::getReportId, reportId)
+                .orderByAsc(InvalidReasonField::getReportId);
+        List<InvalidReasonField> fields = invalidReasonFieldService.list(wrapper);
+        List<String> nameList = new ArrayList<>();
+        nameList.add("序号");
+        nameList.add("无效理由");
+        nameList.add("涉及内容");
+        nameList.add("相关证据");
+        nameList.add("陈述意见");
+
+        List<String> tem = fields.stream().map(InvalidReasonField::getFieldName).collect(Collectors.toList());
+        nameList.addAll(tem);
+        //根据报告id查询无效理由
+        List<QueryInvalidReasonVO> queryInvalidReasonVOS = invalidReasonService.queryInvalidReason(reportId);
+        //根据无效类型排序,方便合并单元格
+        queryInvalidReasonVOS.sort(Comparator.comparing(QueryInvalidReasonVO::getInvalidName));
+        //设置页脚
+//        WordUtil.createDefaultFooter(doc);
+        //设置页边距
+        WordUtil.setMargin(doc, 1000, 1000, 500, 100);
+        //设置标题
+        WordUtil.setParagraph(doc, "标题", "宋体", 16, 10, true, ParagraphAlignment.CENTER);
+        //设置副标题
+        WordUtil.setParagraph(doc, 1 + "到" + 2, "宋体", 10, 10, true, ParagraphAlignment.RIGHT);
+        int colTotalCount = fields.size() + 5;
+        //总条数
+        int dataCount = queryInvalidReasonVOS.size();
+        //创建表格
+        XWPFTable xTable = doc.createTable(1, colTotalCount);
+        //设置边框
+        WordUtil.setTableBolder(xTable, 10, "000000");
+        // 创建表头数据
+        for (int j = 0; j < colTotalCount; j++) {
+            WordUtil.setCellText(xTable.getRow(0).getCell(j), nameList.get(j), 200, "宋体", 10, true);
+        }
+        //记录合并数据map
+        Map<Integer, Integer> map = new HashMap<>();
+        // 创建表格内容
+        for (int i2 = 0; i2 < dataCount; i2++) {
+            QueryInvalidReasonVO queryInvalidReasonVO = queryInvalidReasonVOS.get(i2);
+            int name = queryInvalidReasonVO.getInvalidName();
+            //记录合并数据
+            if (!map.containsKey(name)) {
+                map.put(name, 1);
+            } else {
+                map.put(name, map.get(name) + 1);
             }
-            //自动调整列宽
-            for(int i = 0; i < headers.length; i++){
-                sheet.autoSizeColumn(i);
+            List<InvalidReasonFieldValueDTO> fieldValueDTOS = queryInvalidReasonVO.getFields();
+            XWPFTableRow row = xTable.insertNewTableRow(i2 + 1);
+            row.setHeight(300);
+            for (int j = 0; j < colTotalCount; j++) {
+                XWPFTableCell cell = row.createCell();
+                XWPFRun run;
+                run = WordUtil.setTableCellStyle(cell, ParagraphAlignment.CENTER, "微软雅黑", 9, false);
+                if (j == 0) {
+                    run.setText(String.valueOf(i2));
+                } else if (j == 1) {
+                    if (name == 0) {
+                        run.setText("权利要求不清楚");
+                    } else if (name == 1) {
+                        run.setText("说明书公开不充分");
+                    } else if (name == 2) {
+                        run.setText("不具备创造性");
+                    } else if (name == 3) {
+                        // 创建一个段落
+                        XWPFParagraph paragraph = cell.getParagraphs().get(0);
+
+                        // 创建一个运行
+                        XWPFRun run1 = paragraph.createRun();
+                        CTR ctr = run1.getCTR();
+                        ctr.addNewRPr().addNewB();
+                        ctr.addNewT().setStringValue("<b>Bold text</b> Normal text");
+//                        run.setText("<h1>不具备新颖性<h1>");
+                    }
+                } else if (j == 2) {
+                    int content = queryInvalidReasonVO.getContent();
+                    if (content == -1) {
+                        run.setText("说明书");
+                    } else {
+                        run.setText("权要" + content);
+                    }
+                } else if (j == 3) {
+                    if (name == 0 || name == 1) {
+                        run.setText(queryInvalidReasonVO.getProofStr());
+                    } else {
+                        StringBuilder stringBuilder = new StringBuilder();
+                        List<QueryInvalidReasonVO.proofGroupIn> proofGroupIns = queryInvalidReasonVO.getProofGroups();
+                        for (int t = 0; t < proofGroupIns.size(); t++) {
+                            List<QueryInvalidReasonVO.proofIn> proofIns = proofGroupIns.get(t).getProofs();
+                            List<Integer> strs = proofIns.stream().map(QueryInvalidReasonVO.proofIn::getSort).collect(Collectors.toList());
+                            for (int i = 0; i < strs.size(); i++) {
+                                if (t == 0 && i == 0) {
+                                    stringBuilder.append("D" + strs.get(i));
+
+                                } else if (t != 0 && i == 0) {
+                                    stringBuilder.append(" D" + strs.get(i));
+                                } else {
+                                    stringBuilder.append("+D" + strs.get(i));
+                                }
+                            }
+                        }
+                        run.setText(stringBuilder.toString());
+                    }
+                } else if (j == 4) {
+                    run.setText(queryInvalidReasonVO.getArgumentStr());
+                } else {
+                    InvalidReasonField field = fields.get(j - 5);
+                    InvalidReasonFieldValueDTO valueDTO = fieldValueDTOS.stream().filter(item -> item.getFieldId().equals(field.getId())).findFirst().orElse(new InvalidReasonFieldValueDTO());
+                    run.setText(valueDTO.getFieldValue());
+                }
             }
-            workbook.write(fileOut);
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
         }
+        //记录合并起始位置
+        Integer t=1;
+        for(int i :map.keySet()){
+            int end =t+map.get(i)-1;
+       WordUtil.mergeCellsVertically(xTable,1,t,end);
+      t= t+map.get(i);
+        }
+        FileOutputStream os = new FileOutputStream("output.docx");
+        doc.write(os);
+        os.close();
+        doc.close();
     }
+
+
 }
+