Explorar o código

修改导出报告

wangyaodong %!s(int64=2) %!d(string=hai) anos
pai
achega
3bd70c252d

+ 721 - 221
simulation-resource-server/src/main/java/com/css/simulation/resource/project/impl/SimulationProjectServiceImpl.java

@@ -32,6 +32,7 @@ import com.css.simulation.resource.project.enums.ProjectRunStateEnum;
 import com.css.simulation.resource.project.enums.SceneTypeEnum;
 import com.css.simulation.resource.project.mapper.*;
 import com.css.simulation.resource.project.service.SimulationProjectService;
+import com.css.simulation.resource.project.util.PdfBuilder;
 import com.css.simulation.resource.scene.mapper.ScenePackageMapper;
 import com.css.simulation.resource.system.service.DictService;
 import com.css.simulation.resource.util.ProjectUtil;
@@ -2624,280 +2625,779 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
     @Override
     @SneakyThrows
     public void exportProjectReport(SimulationManualProjectParam param) {
-
-        OutputStream os;
-        HttpServletResponse response = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getResponse();
-        //获取要生成的数据
-        ResponseBodyVO<ProjectReportVo> bodyVO = selectProjectReportById(param);
-        ProjectReportVo vo = bodyVO.getInfo();
-        //下载 or 保存本地
-        if (param.getIsCreateLocalPdfFile() != null && param.getIsCreateLocalPdfFile()) {
-            File file = new File(param.getLocalPdfFilePath());
-            os = new BufferedOutputStream(Files.newOutputStream(file.toPath()));
-        } else {
-            String fileName = vo.getProjectId() + "_" + vo.getProjectName();
-            response.setContentType("application/x-download");
-            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".pdf");
-            os = new BufferedOutputStream(response.getOutputStream());
-        }
-        // 监听生成pdf数据
         Document document = new Document(PageSize.A4);
-        document.open();
-        PdfWriter.getInstance(document, os);
-        BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
-        //* -------------------------------- 第一页 --------------------------------
-        Paragraph paragraph1 = new Paragraph("评价报告", new Font(baseFont, 20));
-        paragraph1.setAlignment(Element.ALIGN_CENTER); //居中
-        document.add(paragraph1);
-
-//        // 新的一页,横向显示
-//        document.setPageSize(PageSize.A4.rotate());
-//        document.newPage();
-
-        //算法名称、算法得分、测试等级
-        Paragraph algorithmNanmeElements = new Paragraph(
-                50,
-                "          算法名称:" + vo.getAlgorithmName()
-                        + "         算法得分:" + vo.getAlgorithmScore()
-                        + "         测试等级:" + vo.getEvaluationLevel(),
-                defaultFont(baseFont));
-        algorithmNanmeElements.setAlignment(Element.ALIGN_LEFT); //靠左
-        document.add(algorithmNanmeElements);
-        //算法描述
-        Paragraph algorithmDescribeFontElements = new Paragraph(
-                30,
-                "          算法描述:" + vo.getAlgorithmDescribe(),
-                defaultFont(baseFont));
-        algorithmDescribeFontElements.setAlignment(Element.ALIGN_LEFT); //居中
-        document.add(algorithmDescribeFontElements);
-        //算法简评
-        Font algorithmEvaluateFont = new Font(baseFont, 14); //字体
-        Paragraph algorithmEvaluateElements = new Paragraph(
-                30,
-                "          算法简评:" + vo.getAlgorithmEvaluation(),
-                algorithmEvaluateFont);
-        algorithmEvaluateElements.setAlignment(Element.ALIGN_LEFT); //居中
-        document.add(algorithmEvaluateElements);
+        OutputStream os = null;
+        try {
+            HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
+
+            //获取要生成的数据
+            ResponseBodyVO bodyVO = selectProjectReportById(param);
+            ProjectReportVo vo = (ProjectReportVo)bodyVO.getInfo();
+
+            //下载 or 保存本地
+            if(param.getIsCreateLocalPdfFile() != null && param.getIsCreateLocalPdfFile() == true){
+                File file = new File(param.getLocalPdfFilePath());
+                os = new BufferedOutputStream(new FileOutputStream(file));
+            }else{
+                String fileName=vo.getProjectId()+"_"+vo.getProjectName();
+                response.setContentType("application/x-download");
+                response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".pdf");
+                os = new BufferedOutputStream(response.getOutputStream());
+            }
+
+
+            //监听生成pdf数据
+            PdfWriter instance = PdfWriter.getInstance(document, os);
+
+            //设置监听,添加页眉以及设置页面顶部间隔
+            PdfBuilder pdfBuilder = new PdfBuilder();
+            instance.setPageEvent(pdfBuilder);
+
+            // 以下生成PDF
+            BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
+            document.open();
+
+            lineFeed(document, 1, 2);
+            lineFeed(document, 4, 1);
+
+            //添加首页
+            BaseFont bf = BaseFont.createFont("fonts/STXINWEI.TTF", BaseFont.IDENTITY_H,
+                    BaseFont.NOT_EMBEDDED);
+            Font f1 = new Font(bf, 48, Font.BOLD);
+            Paragraph elm1 = new Paragraph("ICV仿真云平台", f1);
+            elm1.setAlignment(Element.ALIGN_CENTER);
+            document.add(elm1);
+
+            lineFeed(document, 1, 1);
+            Font f2 = new Font(bf, 72, Font.BOLD);
+            Paragraph elm2 = new Paragraph("算法评价报告", f2);
+            elm2.setAlignment(Element.ALIGN_CENTER);
+            document.add(elm2);
+
+            //下一页
+            document.setPageSize(PageSize.A4);
+            document.newPage();
+
+//            lineFeed(document, 2, 2);
+
+            BaseFont bf3 = BaseFont.createFont("fonts/STSONG.TTF", BaseFont.IDENTITY_H,
+                    BaseFont.NOT_EMBEDDED);
+            addElement(document,"算法名称:",vo.getAlgorithmName(), bf3, 15, true, 0, false);
+            addElement(document,"算法得分:",vo.getAlgorithmScore().toString(), bf3, 15, true, 30, false);
+            addElement(document,"测试等级:",vo.getEvaluationLevel(), bf3, 15, true, 30, false);
+            ///TODO 测试时间需要添加
+            addElement(document,"测试时间:","", bf3, 15, true, 30, false);
+
+            BaseFont bf4 = BaseFont.createFont("fonts/simhei.ttf", BaseFont.IDENTITY_H,
+                    BaseFont.NOT_EMBEDDED);
+
+            addElement(document,"1. 算法描述与简评",null, bf4, 16, false, 70, false);
+            addElement(document,"1. 1  算法描述:",null, bf3, 15, false, 30, false);
+            addElement(document,"       "+vo.getAlgorithmDescribe(),null, bf3, 15, false, 30, false);
+            addElement(document,"1. 2  算法简评:",null, bf3, 15, false, 30, false);
+            String[] LevelArr = {"优秀(G)", "良好(A)", "一般(M)", "较差(P)"};
+            String Level = "";
+            String evaluationLevel = vo.getEvaluationLevel();
+            if("G".equals(evaluationLevel)){
+                Level = LevelArr[0];
+            }else if("A".equals(evaluationLevel)){
+                Level = LevelArr[1];
+            }else if("M".equals(evaluationLevel)){
+                Level = LevelArr[2];
+            }else if("P".equals(evaluationLevel)){
+                Level = LevelArr[3];
+            }
+
+            //此处为了方便直接截取 ”算法简评“ 字段后半段,不再重新获取数据
+            String algorithmEvaluation = vo.getAlgorithmEvaluation();
+            String s = algorithmEvaluation.substring(algorithmEvaluation.lastIndexOf("级评价,")+4);
+
+            addElement(document,"       "+vo.getAlgorithmName()+"测试得分为"+vo.getAlgorithmScore()+
+                            ",依据图1-1的标准,该算法获得"+Level+"级评价,"+s,null, bf3,
+                    15, false, 30, false);
+
+            Image image = Image.getInstance("classpath:icon/pjdj.png");
+            image.scaleAbsolute(320,100);
+            image.setAlignment(Element.ALIGN_CENTER);
+            document.add(image);
+
+            addElement(document,"图1-1 评价标准",null, bf3, 15, false, 30, true);
+
+            addElement(document,"2. 测试得分说明",null, bf4, 16, false, 70, false);
+
+            List<AlgorithmScoreVo> algorithmScoreList = vo.getAlgorithmScoreList();
+
+            StringBuffer stringBuffer = new StringBuffer("       " + vo.getAlgorithmName() + "在");
+            int size1 = algorithmScoreList.size();
+            for(int i=0; i<size1; i++){
+                AlgorithmScoreVo v = algorithmScoreList.get(i);
+                if("汇总".equals(v.getProjectName())){
+                    continue;
+                }
+                stringBuffer.append(v.getProjectName()+"项目的"+v.getSceneNum()+"个场景中,测试得分为"+v.getScore()+
+                        ",得分率为"+v.getScoreRatio()+"%;");
+
+            }
+            String substring = stringBuffer.substring(0, stringBuffer.lastIndexOf(";"));
+
+            addElement(document,substring+",详见表2-1。",null, bf3, 15, false, 30, false);
+            addElement(document,"表2-1 测试得分表",null, bf3, 15, false, 30, true);
+
             /*
             测试得分表
              */
-        Paragraph scoreTableElements = new Paragraph(
-                50,
-                "测试得分表",
-                defaultFont(baseFont));
-        scoreTableElements.setAlignment(Element.ALIGN_CENTER); //居中
-        document.add(scoreTableElements);
-        setBlankLineSpacing(20, baseFont, document);
-        // 表头
-        PdfPTable pdfPTable = new PdfPTable(5);
-        pdfPTable.setHeaderRows(1);//换页每页显示表头
-        addTitleList(pdfPTable, baseFont, new String[]{"测试项目", "场景数量", "测试权重(%)", "测试得分", "得分率(%)"});
-
-        // 数据
-        List<AlgorithmScoreVo> algorithmScoreList = vo.getAlgorithmScoreList();
-        for (AlgorithmScoreVo asv : algorithmScoreList) {
-            String[] data = new String[]{
-                    asv.getProjectName(), String.valueOf(asv.getSceneNum()), asv.getWeight(), String.valueOf(asv.getScore()), String.valueOf(asv.getScoreRatio())
-            };
-            addDataList(pdfPTable, baseFont, data);
-        }
-        document.add(pdfPTable);
-
-        // 新的一页,横向显示
-        document.setPageSize(PageSize.A4.rotate());
-        document.newPage();
-
-        // 算法测试评分细则(指标得分列表)
-        Paragraph subListScoreElements = new Paragraph(
-                50,
-                "算法测试评分细则",
-                defaultFont(baseFont));
-        subListScoreElements.setAlignment(Element.ALIGN_CENTER); //居中
-        document.add(subListScoreElements);
-        setBlankLineSpacing(20, baseFont, document);
-        List<Map> subListScoreLiTitle = vo.getSubListScoreLiTitle();
-        int size = subListScoreLiTitle.size();
-        PdfPTable pdfPTable2 = new PdfPTable(size);
-        pdfPTable2.setHeaderRows(1);
-        String[] slt = new String[size];
-        for (int i = 0; i < size; i++) {
-            slt[i] = subListScoreLiTitle.get(i).get("label").toString();
-        }
-        addTitleList(pdfPTable2, baseFont, slt);
-        List<SubScListVo> subListScoreLi = vo.getSubListScoreLi();
-        List<String[]> list = new ArrayList<>();
-        int fieldNumber = 7;
-        for (SubScListVo slv : subListScoreLi) {
-            String[] slsi = new String[size];
-            for (int i = 0; i < size; i++) {
-                slsi[i] = "";
+            lineFeed(document, 3, 2);
+            //表头
+            PdfPTable pdfPTable = new PdfPTable(5);
+            pdfPTable.setHeaderRows(1);//换页每页显示表头
+            addTitleList(pdfPTable, font, new String[]{"测试项目","场景数量","测试权重(%)","测试得分","得分率(%)"});
+
+            //数据
+            for(AlgorithmScoreVo asv : algorithmScoreList){
+                String[] data = new String[]{
+                        asv.getProjectName(), String.valueOf(asv.getSceneNum()), asv.getWeight(), String.valueOf(asv.getScore()), String.valueOf(asv.getScoreRatio())
+                };
+
+                addDataList(pdfPTable, font, data);
             }
-            //目前最多支持到6级指标
-            for (int i = 0; i < size - fieldNumber; i++) {
-                if (i == 0) {
-                    if (slv.getSublistName1() != null) {
-                        slsi[i] = slv.getSublistName1();
+            document.add(pdfPTable);
+
+            addElement(document,"3. 算法测试评分情况",null, bf4, 16, false, 70, false);
+            addElement(document,"       为排除其他因素的干扰,科学评价算法效果,本报告将测试场景分为仿真异常场景、未参与评分场景、未达标场景和达标场景4类:",null, bf3, 15, false, 30, false);
+            addElement(document,"       1. 仿真异常场景指的是在仿真过程中报aborted错误的场景,参与得分权重,测试结果均赋0分;",null, bf3, 15, false, 30, false);
+            addElement(document,"       2. 评分失败场景是指因为场景与评分规则不匹配导致程序报错无法对仿真结果进行打分的场景,参与得分权重,测试结果均赋0分;",null, bf3, 15, false, 30, false);
+            addElement(document,"       3. 未达标场景是指仿真测试未得到满分的场景;",null, bf3, 15, false, 30, false);
+            addElement(document,"       4. 达标场景是指仿真测试得到满分的场景。",null, bf3, 15, false, 30, false);
+            addElement(document,"       算法在本次场景测试包中的表现见表3-1.",null, bf3, 15, false, 30, false);
+            addElement(document,"表3-1 算法测试评分细则",null, bf3, 15, false, 30, true);
+
+            /**
+             * 算法评分细则
+             */
+
+            setBlankLineSpacing(20,font,document);
+
+            List<Map> subListScoreLiTitle = vo.getSubListScoreLiTitle();
+            int size = subListScoreLiTitle.size();
+            PdfPTable pdfPTable2 = new PdfPTable(size);
+            pdfPTable2.setHeaderRows(1);
+            String[] slt = new String[size];
+            for(int i=0; i<size; i++){
+                slt[i] = subListScoreLiTitle.get(i).get("label").toString();
+            }
+            addTitleList(pdfPTable2, font, slt);
+
+            List<SubScListVo> subListScoreLi = vo.getSubListScoreLi();
+
+            List<String[]> list = new ArrayList<>();
+            for(SubScListVo slv : subListScoreLi){
+                String[] slsi = new String[size];
+                for(int i=0;i<size;i++){
+                    slsi[i] = "";
+                }
+                //目前最多支持到6级指标
+                for(int i=0; i<size-4; i++){
+                    if(i==0){
+                        if(slv.getSublistName1() != null){
+                            slsi[i] = slv.getSublistName1();
+                        }
+
+                    }else if(i==1){
+                        if(slv.getSublistName2() != null){
+                            slsi[i] = slv.getSublistName2();
+                        }
+
+                    }else if(i==2){
+                        if(slv.getSublistName3() != null){
+                            slsi[i] = slv.getSublistName3();
+                        }
+
+                    }else if(i==3){
+                        if(slv.getSublistName4() != null){
+                            slsi[i] = slv.getSublistName4();
+                        }
+
+                    }else if(i==4){
+                        if(slv.getSublistName5() != null){
+                            slsi[i] = slv.getSublistName5();
+                        }
+
+                    }else if(i==5){
+                        if(slv.getSublistName6() != null){
+                            slsi[i] = slv.getSublistName6();
+                        }
+
+                    }
+                }
+                slsi[size-4] = slv.getSceneNum();
+                slsi[size-3] = slv.getNotStandardSceneNum();
+                slsi[size-2] = slv.getLastScore();
+                slsi[size-1] = slv.getFirstScore();
+
+                list.add(slsi);
+
+//                addDataList(pdfPTable2, font, slsi);
+            }
+
+
+            Map map = getSubScListCombineCoord(subListScoreLi, size);
+
+            Map<String, Integer> combineCoordList = (Map<String, Integer>) map.get("combineCoordList");
+            List<String> skipCoordList = (List<String>) map.get("skipCoordList");
+
+            for(int i=0; i<list.size();i++){
+                String[] strings = list.get(i);
+                for(int j=0; j<strings.length; j++){
+                    String coord = i+","+j;
+
+                    //是否要跳过
+                    boolean contains = skipCoordList.contains(coord);
+                    if(contains){
+                        continue;
                     }
-                } else if (i == 1) {
-                    if (slv.getSublistName2() != null) {
-                        slsi[i] = slv.getSublistName2();
+                    PdfPCell pdfPCell = new PdfPCell(new Paragraph(strings[j],defaultFont(font)));
+
+                    //是否要合并
+                    Integer n =  combineCoordList.get(coord);
+                    if(n != null){
+                        pdfPCell.setRowspan(n);
                     }
-                } else if (i == 2) {
-                    if (slv.getSublistName3() != null) {
-                        slsi[i] = slv.getSublistName3();
+
+                    pdfPTable2.addCell(pdfPCell);
+
+
+                }
+            }
+
+            document.add(pdfPTable2);
+
+            //新的一页,横向显示
+            document.setPageSize(PageSize.A4.rotate());
+            document.newPage();
+//            lineFeed(document, 2, 2);
+
+            List<SceneScListVo> sceneScoreLi = vo.getSceneScoreLi();
+            addElement(document,"4. 详细场景得分说明",null, bf4, 16, false, 0, false);
+            StringBuffer s1 = new StringBuffer("       " + vo.getAlgorithmName());
+            boolean b = true;
+            for(int i=0; i<size1; i++){
+                AlgorithmScoreVo v = algorithmScoreList.get(i);
+                Double score = v.getScore();
+                if(100 > score){
+                    b = false;
+                    break;
+                }
+            }
+            String substring1 = "";
+            StringBuffer stringBuffer2 = new StringBuffer("       ");
+            if(b){
+                //得分都为100
+                for(int i=0; i<size1; i++){
+                    AlgorithmScoreVo v = algorithmScoreList.get(i);
+                    if("汇总".equals(v.getProjectName())){
+                        continue;
                     }
-                } else if (i == 3) {
-                    if (slv.getSublistName4() != null) {
-                        slsi[i] = slv.getSublistName4();
+                    stringBuffer2.append(vo.getAlgorithmName()+"在指标中的"+v.getSceneNum()+"个场景均表现良好,测试得分为"+v.getScore()+
+                            ";");
+                }
+                substring1 = stringBuffer2.substring(0, stringBuffer2.lastIndexOf(";"));
+                substring1 += "。详见表4-1。";
+
+            }else{
+                //得分有小于100的
+                for(int i=0; i<size1; i++){
+                    AlgorithmScoreVo v = algorithmScoreList.get(i);
+                    if("汇总".equals(v.getProjectName())){
+                        continue;
                     }
-                } else if (i == 4) {
-                    if (slv.getSublistName5() != null) {
-                        slsi[i] = slv.getSublistName5();
+                    Integer sceneNum = v.getSceneNum();
+                    String projectName = v.getProjectName();
+
+                    for(SceneScListVo v1 : sceneScoreLi){
+                        if(projectName.equals(v1.getSublistName1())){
+                            String sceneScore = v1.getSceneScore();
+                            BigDecimal score = new BigDecimal("0");
+                            if(sceneScore != null && !"".equals(sceneScore)){
+                                score = new BigDecimal(sceneScore);
+                            }
+                            int r = score.compareTo(new BigDecimal("100"));
+                            if(r == -1){
+                                stringBuffer2.append(vo.getAlgorithmName()+"在"+v1.getSublistName1()+"指标中的"+v1.getSceneId()+"中,"+"测试得分为"+v1.getSceneScore()+";");
+                                sceneNum--;
+                            }
+                        }
                     }
-                } else if (i == 5) {
-                    if (slv.getSublistName6() != null) {
-                        slsi[i] = slv.getSublistName6();
+                    substring1 = stringBuffer2.substring(0, stringBuffer2.lastIndexOf(";"));
+                    if(sceneNum > 0){
+                        substring1 += ",在其他"+sceneNum+"个场景表现良好,测试得分100分";
+                    }else{
+                        substring1 += "。详见表4-1。";
                     }
+
+
                 }
+
             }
-            slsi[size - 7] = slv.getSceneNum();
-            slsi[size - 6] = slv.getErrorSceneNum();
-            slsi[size - 5] = slv.getNotScoredSceneNum();
-            slsi[size - 4] = slv.getNotStandardSceneNum();
-            slsi[size - 3] = slv.getStandardSceneNum();
-            slsi[size - 2] = slv.getLastScore();
-            slsi[size - 1] = slv.getFirstScore();
 
-            list.add(slsi);
-        }
+            addElement(document,substring1,null, bf3, 15, false, 30, false);
+            addElement(document,"表4-1 详细得分情况",null, bf3, 15, false, 30, true);
 
 
-        Map map = getSubScListCombineCoord(subListScoreLi, size);
+            /*
+            详细得分情况
+             */
+            /*Paragraph sceneScoreElements = new Paragraph(
+                    50,
+                    "详细得分情况",
+                    defaultFont(font));
+            sceneScoreElements.setAlignment(Element.ALIGN_CENTER); //居中
+            document.add(sceneScoreElements);*/
+
+            setBlankLineSpacing(20,font,document);
+
+            List<Map> scoreLiTitle = vo.getSceneScoreLiTitle();
+            int size2 = scoreLiTitle.size();
+            PdfPTable pdfPTable3 = new PdfPTable(size2);
+            pdfPTable3.setHeaderRows(1);
+            String[] slt2 = new String[size2];
+            for(int i=0; i<size2; i++){
+                slt2[i] = scoreLiTitle.get(i).get("label").toString();
+            }
+            addTitleList(pdfPTable3, font, slt2);
 
-        Map<String, Integer> combineCoordList = (Map<String, Integer>) map.get("combineCoordList");
-        List<String> skipCoordList = (List<String>) map.get("skipCoordList");
+            List<String[]> list2 = new ArrayList<>();
 
-        for (int i = 0; i < list.size(); i++) {
-            String[] strings = list.get(i);
-            for (int j = 0; j < strings.length; j++) {
-                String coord = i + "," + j;
+            for(SceneScListVo sslv : sceneScoreLi){
+                String[] ssli = new String[size2];
+                for(int i=0;i<size2;i++){
+                    ssli[i] = "";
+                }
+                //目前最多支持到6级指标
+                for(int i=0; i<size2-5; i++){
+                    if(i==0){
+                        if(sslv.getSublistName1() != null){
+                            ssli[i] = sslv.getSublistName1();
+                        }
 
-                //是否要跳过
-                boolean contains = skipCoordList.contains(coord);
-                if (contains) {
-                    continue;
+                    }else if(i==1){
+                        if(sslv.getSublistName2() != null){
+                            ssli[i] = sslv.getSublistName2();
+                        }
+
+                    }else if(i==2){
+                        if(sslv.getSublistName3() != null){
+                            ssli[i] = sslv.getSublistName3();
+                        }
+
+                    }else if(i==3){
+                        if(sslv.getSublistName4() != null){
+                            ssli[i] = sslv.getSublistName4();
+                        }
+
+                    }else if(i==4){
+                        if(sslv.getSublistName5() != null){
+                            ssli[i] = sslv.getSublistName5();
+                        }
+
+                    }else if(i==5){
+                        if(sslv.getSublistName6() != null){
+                            ssli[i] = sslv.getSublistName6();
+                        }
+
+                    }
                 }
-                PdfPCell pdfPCell = new PdfPCell(new Paragraph(strings[j], defaultFont(baseFont)));
-                //是否要合并
-                Integer n = combineCoordList.get(coord);
-                if (n != null) {
-                    pdfPCell.setRowspan(n);
+                ssli[size2-5] = sslv.getSceneId();
+                ssli[size2-4] = sslv.getSceneIdType();
+                ssli[size2-3] = sslv.getSceneScore();
+                ssli[size2-2] = sslv.getTargetEvaluate();
+                ssli[size2-1] = sslv.getScoreExplain();
+
+                list2.add(ssli);
+
+//                addDataList(pdfPTable3, font, ssli);
+            }
+
+            Map map2 = getSceneScListCombineCoord(sceneScoreLi, size2);
+
+            Map<String, Integer> combineCoordList2 = (Map<String, Integer>) map2.get("combineCoordList");
+            List<String> skipCoordList2 = (List<String>) map2.get("skipCoordList");
+
+            boolean b2 = false;
+            int num2 = 0;
+            for(int i=0; i<list2.size();i++){
+                String[] strings = list2.get(i);
+                for(int j=0; j<strings.length; j++){
+                    String coord = i+","+j;
+
+                    //是否要跳过
+                    boolean contains = skipCoordList2.contains(coord);
+                    if(contains){
+                        continue;
+                    }
+                    PdfPCell pdfPCell = new PdfPCell(new Paragraph(strings[j],defaultFont(font)));
+                    //是否要合并
+                    Integer n =  combineCoordList2.get(coord);
+                    if(n != null){
+                        pdfPCell.setRowspan(n);
+                    }
+
+                    pdfPTable3.addCell(pdfPCell);
+
+
                 }
-                pdfPTable2.addCell(pdfPCell);
             }
-        }
 
-        document.add(pdfPTable2);
+            document.add(pdfPTable3);
+
+
 
-            /*
-            场景得分列表
-             */
-        Paragraph sceneScoreElements = new Paragraph(50, "详细得分情况", defaultFont(baseFont));
-        sceneScoreElements.setAlignment(Element.ALIGN_CENTER); //居中
-        document.add(sceneScoreElements);
 
-        setBlankLineSpacing(20, baseFont, document);
 
-        List<Map> scoreLiTitle = vo.getSceneScoreLiTitle();
-        int size2 = scoreLiTitle.size();
-        PdfPTable pdfPTable3 = new PdfPTable(size2);
-        pdfPTable3.setHeaderRows(1);
-        String[] slt2 = new String[size2];
-        for (int i = 0; i < size2; i++) {
-            slt2[i] = scoreLiTitle.get(i).get("label").toString();
-        }
-        addTitleList(pdfPTable3, baseFont, slt2);
-        List<SceneScListVo> sceneScoreLi = vo.getSceneScoreLi();
 
-        List<String[]> list2 = new ArrayList<>();
 
-        for (SceneScListVo sslv : sceneScoreLi) {
-            String[] ssli = new String[size2];
-            for (int i = 0; i < size2; i++) {
-                ssli[i] = "";
+
+           /* //标题
+            Font titleFont = new Font(font, 20); //字体
+            Paragraph titleElements = new Paragraph("评价报告",titleFont);
+            titleElements.setAlignment(Element.ALIGN_CENTER); //居中
+            document.add(titleElements);
+
+
+            //算法名称、算法得分、测试等级
+            Paragraph algorithmNanmeElements = new Paragraph(
+                    50,
+                    "          算法名称:"+vo.getAlgorithmName()
+                            +"         算法得分:"+vo.getAlgorithmScore()
+                            +"         测试等级:"+vo.getEvaluationLevel(),
+                    defaultFont(font));
+            algorithmNanmeElements.setAlignment(Element.ALIGN_LEFT); //靠左
+            document.add(algorithmNanmeElements);
+
+
+            //算法描述
+            Paragraph algorithmDescribeFontElements = new Paragraph(
+                    30,
+                    "          算法描述:"+vo.getAlgorithmDescribe(),
+                    defaultFont(font));
+            algorithmDescribeFontElements.setAlignment(Element.ALIGN_LEFT); //居中
+            document.add(algorithmDescribeFontElements);
+
+            //算法简评
+            Font algorithmEvaluateFont = new Font(font, 14); //字体
+            Paragraph algorithmEvaluateElements = new Paragraph(
+                    30,
+                    "          算法简评:"+vo.getAlgorithmEvaluation(),
+                    algorithmEvaluateFont);
+            algorithmEvaluateElements.setAlignment(Element.ALIGN_LEFT); //居中
+            document.add(algorithmEvaluateElements);*/
+
+            /*
+            测试得分表
+             *//*
+            Paragraph scoreTableElements = new Paragraph(
+                    50,
+                    "测试得分表",
+                    defaultFont(font));
+            scoreTableElements.setAlignment(Element.ALIGN_CENTER); //居中
+            document.add(scoreTableElements);
+
+            setBlankLineSpacing(20,font,document);
+
+            //表头
+            PdfPTable pdfPTable = new PdfPTable(5);
+            pdfPTable.setHeaderRows(1);//换页每页显示表头
+            addTitleList(pdfPTable, font, new String[]{"测试项目","场景数量","测试权重(%)","测试得分","得分率(%)"});
+
+            //数据
+//            List<AlgorithmScoreVo> algorithmScoreList = vo.getAlgorithmScoreList();
+            for(AlgorithmScoreVo asv : algorithmScoreList){
+                String[] data = new String[]{
+                        asv.getProjectName(), String.valueOf(asv.getSceneNum()), asv.getWeight(), String.valueOf(asv.getScore()), String.valueOf(asv.getScoreRatio())
+                };
+
+                addDataList(pdfPTable, font, data);
             }
-            //目前最多支持到6级指标
-            for (int i = 0; i < size2 - 5; i++) {
-                if (i == 0) {
-                    if (sslv.getSublistName1() != null) {
-                        ssli[i] = sslv.getSublistName1();
-                    }
+            document.add(pdfPTable);*/
 
-                } else if (i == 1) {
-                    if (sslv.getSublistName2() != null) {
-                        ssli[i] = sslv.getSublistName2();
-                    }
+            /*
+            评价等级
+             *//*
+            Paragraph levelTableElements = new Paragraph(
+                    50,
+                    "评价等级",
+                    defaultFont(font));
+            levelTableElements.setAlignment(Element.ALIGN_CENTER); //居中
+            document.add(levelTableElements);
+
+            setBlankLineSpacing(20,font,document);
+
+            PdfPTable pdfPTable1 = new PdfPTable(5);
+            addTitleList(pdfPTable1, font, new String[]{"测试项目","90<总分<100","80<总分<90","70<总分<80","0<总分<70"});
+            addDataList(pdfPTable1, font, new String[]{"评价等级","优秀(G)","良好(A)","一般(M)","较差(P)",
+                    "评价等级","++++++","+++++","++++","+++",});
+            document.add(pdfPTable1);*/
+
+
+            /*//新的一页,横向显示
+            document.setPageSize(PageSize.A4.rotate());
+            document.newPage();*/
+
+            //指标得分列表
+            /*Paragraph subListScoreElements = new Paragraph(
+                    50,
+                    "算法测试评分细则",
+                    defaultFont(font));
+            subListScoreElements.setAlignment(Element.ALIGN_CENTER); //居中
+            document.add(subListScoreElements);
+
+            setBlankLineSpacing(20,font,document);
+
+            List<Map> subListScoreLiTitle = vo.getSubListScoreLiTitle();
+            int size = subListScoreLiTitle.size();
+            PdfPTable pdfPTable2 = new PdfPTable(size);
+            pdfPTable2.setHeaderRows(1);
+            String[] slt = new String[size];
+            for(int i=0; i<size; i++){
+                slt[i] = subListScoreLiTitle.get(i).get("label").toString();
+            }
+            addTitleList(pdfPTable2, font, slt);
 
-                } else if (i == 2) {
-                    if (sslv.getSublistName3() != null) {
-                        ssli[i] = sslv.getSublistName3();
-                    }
+            List<SubScListVo> subListScoreLi = vo.getSubListScoreLi();
+
+            List<String[]> list = new ArrayList<>();
+            for(SubScListVo slv : subListScoreLi){
+                String[] slsi = new String[size];
+                for(int i=0;i<size;i++){
+                    slsi[i] = "";
+                }
+                //目前最多支持到6级指标
+                for(int i=0; i<size-4; i++){
+                    if(i==0){
+                        if(slv.getSublistName1() != null){
+                            slsi[i] = slv.getSublistName1();
+                        }
+
+                    }else if(i==1){
+                        if(slv.getSublistName2() != null){
+                            slsi[i] = slv.getSublistName2();
+                        }
+
+                    }else if(i==2){
+                        if(slv.getSublistName3() != null){
+                            slsi[i] = slv.getSublistName3();
+                        }
+
+                    }else if(i==3){
+                        if(slv.getSublistName4() != null){
+                            slsi[i] = slv.getSublistName4();
+                        }
+
+                    }else if(i==4){
+                        if(slv.getSublistName5() != null){
+                            slsi[i] = slv.getSublistName5();
+                        }
+
+                    }else if(i==5){
+                        if(slv.getSublistName6() != null){
+                            slsi[i] = slv.getSublistName6();
+                        }
 
-                } else if (i == 3) {
-                    if (sslv.getSublistName4() != null) {
-                        ssli[i] = sslv.getSublistName4();
                     }
+                }
+                slsi[size-4] = slv.getSceneNum();
+                slsi[size-3] = slv.getNotStandardSceneNum();
+                slsi[size-2] = slv.getLastScore();
+                slsi[size-1] = slv.getFirstScore();
+
+                list.add(slsi);
+
+//                addDataList(pdfPTable2, font, slsi);
+            }
+
+
+            Map map = getSubScListCombineCoord(subListScoreLi, size);
 
-                } else if (i == 4) {
-                    if (sslv.getSublistName5() != null) {
-                        ssli[i] = sslv.getSublistName5();
+            Map<String, Integer> combineCoordList = (Map<String, Integer>) map.get("combineCoordList");
+            List<String> skipCoordList = (List<String>) map.get("skipCoordList");
+
+            for(int i=0; i<list.size();i++){
+                String[] strings = list.get(i);
+                for(int j=0; j<strings.length; j++){
+                    String coord = i+","+j;
+
+                    //是否要跳过
+                    boolean contains = skipCoordList.contains(coord);
+                    if(contains){
+                        continue;
                     }
+                    PdfPCell pdfPCell = new PdfPCell(new Paragraph(strings[j],defaultFont(font)));
 
-                } else if (i == 5) {
-                    if (sslv.getSublistName6() != null) {
-                        ssli[i] = sslv.getSublistName6();
+                    //是否要合并
+                    Integer n =  combineCoordList.get(coord);
+                    if(n != null){
+                        pdfPCell.setRowspan(n);
                     }
 
+                    pdfPTable2.addCell(pdfPCell);
+
+
                 }
             }
-            ssli[size2 - 5] = sslv.getSceneId();
-            ssli[size2 - 4] = sslv.getSceneIdType();
-            ssli[size2 - 3] = sslv.getSceneScore();
-            ssli[size2 - 2] = sslv.getTargetEvaluate();
-            ssli[size2 - 1] = sslv.getScoreExplain();
 
-            list2.add(ssli);
+            document.add(pdfPTable2);*/
 
-        }
+            /*
+            场景得分列表
+             *//*
+            Paragraph sceneScoreElements = new Paragraph(
+                    50,
+                    "详细得分情况",
+                    defaultFont(font));
+            sceneScoreElements.setAlignment(Element.ALIGN_CENTER); //居中
+            document.add(sceneScoreElements);
+
+            setBlankLineSpacing(20,font,document);
+
+            List<Map> scoreLiTitle = vo.getSceneScoreLiTitle();
+            int size2 = scoreLiTitle.size();
+            PdfPTable pdfPTable3 = new PdfPTable(size2);
+            pdfPTable3.setHeaderRows(1);
+            String[] slt2 = new String[size2];
+            for(int i=0; i<size2; i++){
+                slt2[i] = scoreLiTitle.get(i).get("label").toString();
+            }
+            addTitleList(pdfPTable3, font, slt2);
+            List<SceneScListVo> sceneScoreLi = vo.getSceneScoreLi();
 
-        Map map2 = getSceneScListCombineCoord(sceneScoreLi, size2);
+            List<String[]> list2 = new ArrayList<>();
 
-        Map<String, Integer> combineCoordList2 = (Map<String, Integer>) map2.get("combineCoordList");
-        List<String> skipCoordList2 = (List<String>) map2.get("skipCoordList");
+            for(SceneScListVo sslv : sceneScoreLi){
+                String[] ssli = new String[size2];
+                for(int i=0;i<size2;i++){
+                    ssli[i] = "";
+                }
+                //目前最多支持到6级指标
+                for(int i=0; i<size2-5; i++){
+                    if(i==0){
+                        if(sslv.getSublistName1() != null){
+                            ssli[i] = sslv.getSublistName1();
+                        }
 
-        for (int i = 0; i < list2.size(); i++) {
-            String[] strings = list2.get(i);
-            for (int j = 0; j < strings.length; j++) {
-                String coord = i + "," + j;
+                    }else if(i==1){
+                        if(sslv.getSublistName2() != null){
+                            ssli[i] = sslv.getSublistName2();
+                        }
 
-                //是否要跳过
-                boolean contains = skipCoordList2.contains(coord);
-                if (contains) {
-                    continue;
+                    }else if(i==2){
+                        if(sslv.getSublistName3() != null){
+                            ssli[i] = sslv.getSublistName3();
+                        }
+
+                    }else if(i==3){
+                        if(sslv.getSublistName4() != null){
+                            ssli[i] = sslv.getSublistName4();
+                        }
+
+                    }else if(i==4){
+                        if(sslv.getSublistName5() != null){
+                            ssli[i] = sslv.getSublistName5();
+                        }
+
+                    }else if(i==5){
+                        if(sslv.getSublistName6() != null){
+                            ssli[i] = sslv.getSublistName6();
+                        }
+
+                    }
                 }
-                PdfPCell pdfPCell = new PdfPCell(new Paragraph(strings[j], defaultFont(baseFont)));
-                //是否要合并
-                Integer n = combineCoordList2.get(coord);
-                if (n != null) {
-                    pdfPCell.setRowspan(n);
+                ssli[size2-5] = sslv.getSceneId();
+                ssli[size2-4] = sslv.getSceneIdType();
+                ssli[size2-3] = sslv.getSceneScore();
+                ssli[size2-2] = sslv.getTargetEvaluate();
+                ssli[size2-1] = sslv.getScoreExplain();
+
+                list2.add(ssli);
+
+//                addDataList(pdfPTable3, font, ssli);
+            }
+
+            Map map2 = getSceneScListCombineCoord(sceneScoreLi, size2);
+
+            Map<String, Integer> combineCoordList2 = (Map<String, Integer>) map2.get("combineCoordList");
+            List<String> skipCoordList2 = (List<String>) map2.get("skipCoordList");
+
+            boolean b2 = false;
+            int num2 = 0;
+            for(int i=0; i<list2.size();i++){
+                String[] strings = list2.get(i);
+                for(int j=0; j<strings.length; j++){
+                    String coord = i+","+j;
+
+                    //是否要跳过
+                    boolean contains = skipCoordList2.contains(coord);
+                    if(contains){
+                        continue;
+                    }
+                    PdfPCell pdfPCell = new PdfPCell(new Paragraph(strings[j],defaultFont(font)));
+                    //是否要合并
+                    Integer n =  combineCoordList2.get(coord);
+                    if(n != null){
+                        pdfPCell.setRowspan(n);
+                    }
+
+                    pdfPTable3.addCell(pdfPCell);
+
+
                 }
+            }
 
-                pdfPTable3.addCell(pdfPCell);
+            document.add(pdfPTable3);*/
 
 
+        } catch (Exception e){
+            e.printStackTrace();
+
+        }
+        finally {
+            document.close();
+            try {
+                os.close();
+            } catch (IOException e) {
+                e.printStackTrace();
             }
         }
-        document.add(pdfPTable3);
+
+    }
+
+    public void lineFeed(Document document, int length, int type) throws DocumentException {
+        if(type == 1){
+            for(int i=0; i<length; i++){
+                document.add(Chunk.NEWLINE);
+            }
+        }else if(type == 2){
+            for(int i=0; i<length; i++){
+                document.add(new Phrase("\n"));
+            }
+        }
+    }
+
+    private void addElement(Document document, String val1, String val2, BaseFont f, int fontSize, boolean isBold, int leading, boolean isCenter) throws DocumentException {
+        Font ft;
+        Paragraph elm;
+        if(isBold){
+            ft = new Font(f, fontSize, Font.BOLD);
+        }else{
+            ft = new Font(f, fontSize);
+        }
+        if(val2 != null && !"".equals(val2)){
+            elm = new Paragraph(leading,val1+val2, ft);
+        }else{
+            elm = new Paragraph(leading, val1, ft);
+        }
+        if(isCenter){
+            elm.setAlignment(Element.ALIGN_CENTER);
+        }
+        document.add(elm);
     }
 
 

+ 39 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/project/util/PdfBuilder.java

@@ -0,0 +1,39 @@
+package com.css.simulation.resource.project.util;
+
+import com.css.simulation.resource.project.impl.SimulationProjectServiceImpl;
+import com.itextpdf.text.*;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.ColumnText;
+import com.itextpdf.text.pdf.PdfContentByte;
+import com.itextpdf.text.pdf.PdfWriter;
+import com.itextpdf.text.pdf.events.PdfPageEventForwarder;
+import lombok.SneakyThrows;
+
+public class PdfBuilder extends PdfPageEventForwarder {
+
+
+    @SneakyThrows
+    @Override
+    public void onEndPage(PdfWriter writer, Document document) {
+
+        Image image = Image.getInstance("classpath:icon/ym.png");
+        PdfContentByte directContent = writer.getDirectContent();
+
+        BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
+        Font font = new Font(baseFont, 12, Font.NORMAL);
+
+        Phrase elements = new Phrase("", font);
+        elements.add(new Chunk(image, 30, -30));
+
+        ColumnText.showTextAligned(directContent, Element.ALIGN_LEFT,
+                elements, Element.ALIGN_LEFT,  document.top(0), 0);
+
+
+    }
+
+    @SneakyThrows
+    @Override
+    public void onStartPage(PdfWriter writer, Document document) {
+        new SimulationProjectServiceImpl().lineFeed(document, 4, 2);;
+    }
+}

BIN=BIN
simulation-resource-server/src/main/resources/fonts/STSONG.TTF


BIN=BIN
simulation-resource-server/src/main/resources/fonts/STXINWEI.TTF


BIN=BIN
simulation-resource-server/src/main/resources/fonts/simhei.ttf


+ 3 - 0
simulation-resource-server/src/main/resources/fonts/字体库说明

@@ -0,0 +1,3 @@
+STXINWEI.TTF:华文新魏
+STSONG.TTF:华文宋体
+simhei.ttf:黑体常规

BIN=BIN
simulation-resource-server/src/main/resources/icon/pjdj.png


BIN=BIN
simulation-resource-server/src/main/resources/icon/ym.png