李春阳 1 年之前
父節點
當前提交
85c5c68281

+ 160 - 9
simulation-resource-server/src/main/java/com/css/simulation/resource/server/app/impl/SimulationProjectServiceImpl.java

@@ -18,24 +18,23 @@ import api.common.pojo.po.model.ConfigPO;
 import api.common.pojo.po.model.ConfigSensorPO;
 import api.common.pojo.po.model.VehiclePO;
 import api.common.pojo.po.project.*;
+import api.common.pojo.po.scene.SceneComplexityPO;
 import api.common.pojo.po.scene.ScenePackagePO;
+import api.common.pojo.po.scene.SceneRiskPO;
 import api.common.pojo.vo.algorithm.AlgorithmVO;
 import api.common.pojo.vo.project.*;
 import api.common.util.*;
 import com.css.simulation.resource.server.domain.service.UserDomainService;
 import com.css.simulation.resource.server.infra.db.mysql.mapper.*;
 import com.css.simulation.resource.server.app.service.AlgorithmService;
-import com.css.simulation.resource.server.infra.util.AuthUtil;
-import com.css.simulation.resource.server.infra.util.PageUtil;
+import com.css.simulation.resource.server.infra.util.*;
 import com.css.simulation.resource.server.infra.feign.service.AlgoPlatformService;
 import com.css.simulation.resource.server.infra.feign.service.FileDownService;
 import com.css.simulation.resource.server.infra.feign.service.MonitorService;
 import com.css.simulation.resource.server.app.constant.ProjectRunStateEnum;
 import com.css.simulation.resource.server.app.constant.SceneTypeEnum;
 import com.css.simulation.resource.server.app.service.job_manage.SimulationProjectService;
-import com.css.simulation.resource.server.infra.util.PdfBuilder;
 import com.css.simulation.resource.server.app.service.DictService;
-import com.css.simulation.resource.server.infra.util.ProjectUtil;
 import com.github.pagehelper.PageInfo;
 import com.google.common.collect.ImmutableMap;
 import com.itextpdf.text.*;
@@ -48,6 +47,9 @@ import lombok.SneakyThrows;
 import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.tomcat.util.buf.StringUtils;
+import org.jfree.chart.ChartUtils;
+import org.jfree.data.category.DefaultCategoryDataset;
+import org.jfree.data.general.DefaultPieDataset;
 import org.springframework.beans.BeanUtils;
 import org.springframework.kafka.core.KafkaTemplate;
 import org.springframework.scheduling.support.CronExpression;
@@ -67,6 +69,7 @@ import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.List;
 import java.util.*;
+import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
@@ -114,6 +117,10 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
     private VehicleMapper vehicleMapper;
     @Resource
     private UserDomainService userDomainService;
+    @Resource
+    private SceneComplexityMapper sceneComplexityMapper;
+    @Resource
+    private SceneRiskMapper sceneRiskMapper;
 
     // * -------------------------------- Comment --------------------------------
 
@@ -3161,11 +3168,15 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
 
             if ("1".equals(param.getProjectType())) {
                 // 场景评价
-                addElement(document, "场景评价", null, bf3, 15, false, 30, true);
-                addElement(document, "       场景测试包共包含" + totalSceneNum + "个场景.", null, bf3, 15, false, 30, false);
-//                projectId
-//                sceneScoreLi
-
+                List<String> sceneIds = sceneScoreLi.stream().map(SceneScListVo::getSceneId).collect(Collectors.toList());
+                // 查询复杂度和危险度
+                List<SceneComplexityPO> sceneComplexityPOS = sceneComplexityMapper.selectSceneComplexityEvaluationForExport(param.getProjectId(), sceneIds);
+                List<SceneRiskPO> sceneRiskPOS = sceneRiskMapper.selectSceneRiskEvaluationForExport(param.getProjectId(), sceneIds);
+                if (CollectionUtil.isNotEmpty(sceneComplexityPOS) || CollectionUtil.isNotEmpty(sceneRiskPOS)) {
+                    addElement(document, "场景评价", null, bf3, 15, false, 30, true);
+                    addElement(document, "       场景测试包共包含" + totalSceneNum + "个场景.", null, bf3, 15, false, 30, false);
+                    createBarAndPieImg(document, sceneComplexityPOS, sceneRiskPOS);
+                }
             }
 
             // ------- 4.详细得分说明 -------
@@ -3788,6 +3799,146 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         document.add(elm);
     }
 
+    private void createBarAndPieImg(Document document, List<SceneComplexityPO> sceneComplexityPOS, List<SceneRiskPO> sceneRiskPOS) {
+        try {
+            // 饼图
+            DefaultPieDataset complexityDataSet = new DefaultPieDataset();
+            DefaultCategoryDataset complexityData = getBarDataSet();
+            DefaultCategoryDataset riskData = getBarDataSet();
+            if (CollectionUtil.isNotEmpty(sceneComplexityPOS)) {
+                sceneComplexityPOS.forEach(sceneComplexityPO -> {
+                    if (complexityDataSet.getValue(sceneComplexityPO.getComplexityLevel()) == null) {
+                        complexityDataSet.setValue(sceneComplexityPO.getComplexityLevel(), 1);
+                    } else {
+                        int num = complexityDataSet.getValue(sceneComplexityPO.getComplexityLevel()).intValue();
+                        complexityDataSet.setValue(sceneComplexityPO.getComplexityLevel(), ++num);
+                    }
+                    checkAndSetDataSetValue(complexityData, sceneComplexityPO.getComplexity());
+
+                });
+            }
+            ByteArrayOutputStream pieBos = new ByteArrayOutputStream();
+            ChartUtils.writeChartAsJPEG(pieBos, ChartUtil.pieChart("复杂度等级分布图", complexityDataSet), 300, 188);
+            Image pieImage = Image.getInstance(pieBos.toByteArray());
+            pieImage.setAlignment(Element.ALIGN_CENTER);
+            pieBos.close();
+
+            // 饼图
+            DefaultPieDataset riskDataSet = new DefaultPieDataset();
+            if (CollectionUtil.isNotEmpty(sceneRiskPOS)) {
+                sceneRiskPOS.forEach(sceneRiskPO -> {
+                    if (riskDataSet.getValue(sceneRiskPO.getRiskLevel()) == null) {
+                        riskDataSet.setValue(sceneRiskPO.getRiskLevel(), 1);
+                    } else {
+                        int num = riskDataSet.getValue(sceneRiskPO.getRiskLevel()).intValue();
+                        riskDataSet.setValue(sceneRiskPO.getRiskLevel(), ++num);
+                    }
+                    checkAndSetDataSetValue(riskData, sceneRiskPO.getRisk());
+                });
+            }
+            ByteArrayOutputStream riskBos = new ByteArrayOutputStream();
+            ChartUtils.writeChartAsJPEG(riskBos, ChartUtil.pieChart("危险度等级分布图", riskDataSet), 300, 188);
+            Image riskLevelImage = Image.getInstance(riskBos.toByteArray());
+            riskLevelImage.setAlignment(Element.ALIGN_CENTER);
+            riskBos.close();
+            if (CollectionUtil.isNotEmpty(sceneComplexityPOS) && CollectionUtil.isNotEmpty(sceneRiskPOS)) {
+                float[] floats = new float[2];
+                Arrays.fill(floats, 60);
+                PdfPTable table = new PdfPTable(floats);
+                table.setTotalWidth(600);
+                table.setLockedWidth(true);
+                table.setHorizontalAlignment(Element.ALIGN_CENTER);
+                table.getDefaultCell().setBorder(1);
+                PdfPCell complexityCell = new PdfPCell(pieImage);
+                pieImage.scaleAbsolute(300, 188);
+                complexityCell.setHorizontalAlignment(Element.ALIGN_CENTER);
+                complexityCell.setBorder(com.itextpdf.text.Rectangle.NO_BORDER);
+                table.addCell(complexityCell);
+
+                PdfPCell riskCell = new PdfPCell(riskLevelImage);
+                riskLevelImage.scaleAbsolute(300, 188);
+                riskCell.setHorizontalAlignment(Element.ALIGN_CENTER);
+                riskCell.setBorder(com.itextpdf.text.Rectangle.NO_BORDER);
+                table.addCell(riskCell);
+                document.add(table);
+                BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
+                Paragraph elements = new Paragraph(40, " ", new com.itextpdf.text.Font(font, 14));
+                document.add(elements);
+            } else if (CollectionUtil.isNotEmpty(sceneComplexityPOS)) {
+                document.add(pieImage);
+            } else if (CollectionUtil.isNotEmpty(sceneRiskPOS)) {
+                document.add(riskLevelImage);
+            }
+            if (CollectionUtil.isNotEmpty(sceneComplexityPOS)) {
+                ByteArrayOutputStream pieBos2 = new ByteArrayOutputStream();
+                ChartUtils.writeChartAsJPEG(pieBos2, ChartUtil.barChart("复杂度分布图", null, "复杂度", complexityData), 620, 200);
+                Image pieImage3 = Image.getInstance(pieBos2.toByteArray());
+                pieImage3.setAlignment(Element.ALIGN_CENTER);
+                document.add(pieImage3);
+            }
+            if (CollectionUtil.isNotEmpty(sceneRiskPOS)) {
+                ByteArrayOutputStream pieBos3 = new ByteArrayOutputStream();
+                ChartUtils.writeChartAsJPEG(pieBos3, ChartUtil.barChart("危险度分布图", null, "危险度", riskData), 620, 200);
+                Image pieImage4 = Image.getInstance(pieBos3.toByteArray());
+                pieImage4.setAlignment(Element.ALIGN_CENTER);
+                document.add(pieImage4);
+            }
+        } catch (Exception e) {
+            log.error("创建饼图和柱状图失败. ", e);
+        }
+    }
+
+    private DefaultCategoryDataset getBarDataSet() {
+        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
+        dataset.addValue(0, "场景名称", "[0,10]");
+        dataset.addValue(0, "场景名称", "(10,20]");
+        dataset.addValue(0, "场景名称", "(20,30]");
+        dataset.addValue(0, "场景名称", "(30,40]");
+        dataset.addValue(0, "场景名称", "(40,50]");
+        dataset.addValue(0, "场景名称", "(50,60]");
+        dataset.addValue(0, "场景名称", "(60,70]");
+        dataset.addValue(0, "场景名称", "(70,80]");
+        dataset.addValue(0, "场景名称", "(80,90]");
+        dataset.addValue(0, "场景名称", "(90,100]");
+        return dataset;
+    }
+
+    private void checkAndSetDataSetValue(DefaultCategoryDataset dataset, String value) {
+        int valInt = Integer.parseInt(value);
+        if (valInt >= 0 && valInt <= 10) {
+            int num = dataset.getValue("场景名称", "[0,10]").intValue();
+            dataset.setValue(++num, "场景名称", "[0,10]");
+        } else if (valInt > 10 && valInt <= 20) {
+            int num = dataset.getValue("场景名称", "(10,20]").intValue();
+            dataset.setValue(++num, "场景名称", "(10,20]");
+        } else if (valInt > 20 && valInt <= 30) {
+            int num = dataset.getValue("场景名称", "(20,30]").intValue();
+            dataset.setValue(++num, "场景名称", "(20,30]");
+        } else if (valInt > 30 && valInt <= 40) {
+            int num = dataset.getValue("场景名称", "(30,40]").intValue();
+            dataset.setValue(++num, "场景名称", "(30,40]");
+        } else if (valInt > 40 && valInt <= 50) {
+            int num = dataset.getValue("场景名称", "(40,50]").intValue();
+            dataset.setValue(++num, "场景名称", "(40,50]");
+        } else if (valInt > 50 && valInt <= 60) {
+            int num = dataset.getValue("场景名称", "(50,60]").intValue();
+            dataset.setValue(++num, "场景名称", "(50,60]");
+        } else if (valInt > 60 && valInt <= 70) {
+            int num = dataset.getValue("场景名称", "(60,70]").intValue();
+            dataset.setValue(++num, "场景名称", "(60,70]");
+        } else if (valInt > 70 && valInt <= 80) {
+            int num = dataset.getValue("场景名称", "(70,80]").intValue();
+            dataset.setValue(++num, "场景名称", "(70,80]");
+        } else if (valInt > 80 && valInt <= 90) {
+            int num = dataset.getValue("场景名称", "(80,90]").intValue();
+            dataset.setValue(++num, "场景名称", "(80,90]");
+        } else if (valInt > 90 && valInt <= 100) {
+            int num = dataset.getValue("场景名称", "(90,100]").intValue();
+            dataset.setValue(++num, "场景名称", "(90,100]");
+        }
+
+    }
+
     /**
      * 获取所有要合并的下标、每个下标索要合并的行数、要跳过创建表格的下标
      */

+ 4 - 2
simulation-resource-server/src/main/java/com/css/simulation/resource/server/infra/db/mysql/mapper/SceneComplexityMapper.java

@@ -15,14 +15,16 @@ public interface SceneComplexityMapper {
 
     @Select("select sc.complexity_id, sc.scene_id, sc.scene_type,sc.rule_id ,ser.rule_name, sc.task_id ,sc.complexity, sc.complexity_level\n" +
             "from scene_complexity sc LEFT JOIN scene_evaluation_rule ser  ON ser.rule_id = sc.rule_id \n" +
-            "where sc.scene_id = #{sceneId} order by sc.create_time desc" )
+            "where sc.scene_id = #{sceneId} order by sc.create_time desc")
     List<SceneComplexityPO> querySceneEvaluationComplexityDetail(@Param("sceneId") String sceneId);
 
     void saveSceneComplexity(SceneComplexityPO params);
 
     void saveSceneComplexityS(@Param("list") List<SceneComplexityPO> params);
 
-    @Select("SELECT * FROM scene_complexity WHERE scene_id = #{sceneId} AND task_id = #{taskId}" )
+    @Select("SELECT * FROM scene_complexity WHERE scene_id = #{sceneId} AND task_id = #{taskId}")
     List<SceneComplexityPO> selectSceneComplexityEvaluation(@Param("taskId") String taskId, @Param("sceneId") String sceneId);
 
+    List<SceneComplexityPO> selectSceneComplexityEvaluationForExport(@Param("taskId") String taskId, @Param("list") List<String> list);
+
 }

+ 2 - 0
simulation-resource-server/src/main/java/com/css/simulation/resource/server/infra/db/mysql/mapper/SceneRiskMapper.java

@@ -14,6 +14,8 @@ public interface SceneRiskMapper {
 
     List<SceneRiskPO> selectSceneIdsByEvaluation(SceneRiskPO sceneRiskPO);
 
+    List<SceneRiskPO> selectSceneRiskEvaluationForExport(@Param("taskId") String taskId, @Param("list") List<String> list);
+
 
     @Select("select sr.risk_id, sr.scene_id, sr.scene_type,sr.rule_id ,ser.rule_name, sr.task_id ,sr.risk, sr.risk_level, mv.vehicle_name, a.algorithm_name \n" +
             "from scene_risk sr LEFT JOIN scene_evaluation_rule ser  ON ser.rule_id = sr.rule_id \n" +

+ 44 - 32
simulation-resource-server/src/main/java/com/css/simulation/resource/server/infra/util/ChartUtil.java

@@ -23,6 +23,7 @@ import org.jfree.data.category.DefaultCategoryDataset;
 import org.jfree.data.general.DefaultPieDataset;
 
 import java.awt.*;
+import java.awt.Font;
 import java.text.DecimalFormat;
 import java.text.NumberFormat;
 
@@ -47,10 +48,10 @@ public class ChartUtil {
     static StandardChartTheme initChartTheme() {
         StandardChartTheme currentTheme = new StandardChartTheme("JFree");
         // 横轴纵轴标题文字大小
-        currentTheme.setLargeFont(new java.awt.Font("宋体", java.awt.Font.BOLD, 15));
+        currentTheme.setLargeFont(new java.awt.Font("宋体", java.awt.Font.BOLD, 13));
         // 横轴纵轴数值文字大小
-        currentTheme.setRegularFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 13));
-        currentTheme.setExtraLargeFont(new java.awt.Font("宋体", java.awt.Font.BOLD, 20));
+        currentTheme.setRegularFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 11));
+        currentTheme.setExtraLargeFont(new java.awt.Font("宋体", java.awt.Font.BOLD, 13));
         // 背景颜色
         currentTheme.setPlotBackgroundPaint(new Color(255, 255, 204, 0));
         // 边框线条
@@ -78,6 +79,7 @@ public class ChartUtil {
         JFreeChart chart = ChartFactory.createBarChart(title, categoryAxisLabel, valueAxisLabel, dataset, PlotOrientation.VERTICAL, true, true, false);
 
         CategoryPlot plot = chart.getCategoryPlot();
+        plot.getDomainAxis().setTickLabelFont(new Font("宋体",Font.PLAIN,9));
         BarRenderer renderer = (BarRenderer) plot.getRenderer();
         // 纯色显示
         renderer.setBarPainter(new StandardBarPainter());
@@ -165,12 +167,14 @@ public class ChartUtil {
             ByteArrayOutputStream pieBos = new ByteArrayOutputStream();
             ChartUtils.writeChartAsJPEG(pieBos, ChartUtil.pieChart("复杂度等级分布图", getPieDataset()), 300, 188);
             Image pieImage = Image.getInstance(pieBos.toByteArray());
+            pieBos.close();
 //            pieImage.scalePercent(80);
 //            doc.add(pieImage);
             // 饼图
             ByteArrayOutputStream pieBos1 = new ByteArrayOutputStream();
             ChartUtils.writeChartAsJPEG(pieBos1, ChartUtil.pieChart("危险度等级分布图", getPieDataset()), 300, 188);
             Image pieImage1 = Image.getInstance(pieBos1.toByteArray());
+            pieBos1.close();
 //            pieImage1.scalePercent(80);
 //            doc.add(pieImage1);
 
@@ -199,33 +203,37 @@ public class ChartUtil {
             doc.add(elements2);
 
             ByteArrayOutputStream pieBos2 = new ByteArrayOutputStream();
-            ChartUtils.writeChartAsJPEG(pieBos2, ChartUtil.barChart("复杂度分布图", null, "复杂度", getDataSet()), 300, 188);
+            ChartUtils.writeChartAsJPEG(pieBos2, ChartUtil.barChart("复杂度分布图", null, "复杂度", getDataSet()), 620, 200);
             Image pieImage3 = Image.getInstance(pieBos2.toByteArray());
+            pieImage3.setAlignment(Element.ALIGN_CENTER);
+            pieBos2.close();
 
             ByteArrayOutputStream pieBos3 = new ByteArrayOutputStream();
-            ChartUtils.writeChartAsJPEG(pieBos3, ChartUtil.barChart("危险度分布图", null, "危险度", getDataSet()), 300, 188);
+            ChartUtils.writeChartAsJPEG(pieBos3, ChartUtil.barChart("危险度分布图", null, "危险度", getDataSet()), 620, 200);
             Image pieImage4 = Image.getInstance(pieBos3.toByteArray());
-
-
-            float[] floats1 = new float[2];
-            Arrays.fill(floats1, 60);
-            PdfPTable table1 = new PdfPTable(floats1);
-            table1.setTotalWidth(600);
-            table1.setLockedWidth(true);
-            table1.setHorizontalAlignment(Element.ALIGN_CENTER);
-            table1.getDefaultCell().setBorder(1);
-            PdfPCell cell1 = new PdfPCell(pieImage3);
-            pieImage3.scaleAbsolute(300, 188);
-            cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
-            cell1.setBorder(com.itextpdf.text.Rectangle.NO_BORDER);
-            table1.addCell(cell1);
-
-            PdfPCell cell3 = new PdfPCell(pieImage4);
-            pieImage4.scaleAbsolute(300, 188);
-            cell3.setHorizontalAlignment(Element.ALIGN_CENTER);
-            cell3.setBorder(com.itextpdf.text.Rectangle.NO_BORDER);
-            table1.addCell(cell3);
-            doc.add(table1);
+            pieImage4.setAlignment(Element.ALIGN_CENTER);
+            pieBos3.close();
+
+//            float[] floats1 = new float[2];
+//            Arrays.fill(floats1, 60);
+//            PdfPTable table1 = new PdfPTable(floats1);
+//            table1.setTotalWidth(600);
+//            table1.setLockedWidth(true);
+//            table1.setHorizontalAlignment(Element.ALIGN_CENTER);
+//            table1.getDefaultCell().setBorder(1);
+//            PdfPCell cell1 = new PdfPCell(pieImage3);
+//            pieImage3.scaleAbsolute(300, 188);
+//            cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
+//            cell1.setBorder(com.itextpdf.text.Rectangle.NO_BORDER);
+//            table1.addCell(cell1);
+//
+//            PdfPCell cell3 = new PdfPCell(pieImage4);
+//            pieImage4.scaleAbsolute(300, 188);
+//            cell3.setHorizontalAlignment(Element.ALIGN_CENTER);
+//            cell3.setBorder(com.itextpdf.text.Rectangle.NO_BORDER);
+//            table1.addCell(cell3);
+            doc.add(pieImage3);
+            doc.add(pieImage4);
 
 
         } catch (Exception e) {
@@ -241,12 +249,16 @@ public class ChartUtil {
 
     public static DefaultCategoryDataset getDataSet() {
         DefaultCategoryDataset dataset = new DefaultCategoryDataset();
-        dataset.addValue(50, "场景名称", "1");
-        dataset.addValue(40, "场景名称", "2");
-        dataset.addValue(23, "场景名称", "3");
-        dataset.addValue(24, "场景名称", "4");
-        dataset.addValue(11, "场景名称", "5");
-        dataset.addValue(55, "场景名称", "6");
+        dataset.addValue(50, "场景名称", "[0,10]");
+        dataset.addValue(40, "场景名称", "(10,20]");
+        dataset.addValue(23, "场景名称", "(20,30]");
+        dataset.addValue(24, "场景名称", "(30,40]");
+        dataset.addValue(11, "场景名称", "(40,50]");
+        dataset.addValue(55, "场景名称", "(50,60]");
+        dataset.addValue(55, "场景名称", "(60,70]");
+        dataset.addValue(55, "场景名称", "(70,80]");
+        dataset.addValue(55, "场景名称", "(80,90]");
+        dataset.addValue(55, "场景名称", "(90,100]");
         return dataset;
     }
 

+ 17 - 0
simulation-resource-server/src/main/resources/mysql/mapper/SceneComplexityMapper.xml

@@ -39,6 +39,23 @@
         ) srlsc GROUP BY scene_id;
     </select>
 
+    <select id="selectSceneComplexityEvaluationForExport" resultType="api.common.pojo.po.scene.SceneComplexityPO">
+        SELECT
+        scene_id, scene_type, task_id, complexity, complexity_level
+        FROM scene_complexity
+        <where>
+            is_deleted = '0' AND task_id = #{taskId}
+            <if test="list != null and list.size()>0">
+                AND scene_id IN
+                <foreach collection="list" item="item" index="index"
+                         separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+        ORDER BY create_time DESC;
+    </select>
+
     <insert id="saveSceneComplexity" parameterType="api.common.pojo.po.scene.SceneComplexityPO">
         insert into simulation.scene_complexity
         (complexity_id, scene_id, scene_type, rule_id,

+ 17 - 0
simulation-resource-server/src/main/resources/mysql/mapper/SceneRiskMapper.xml

@@ -39,6 +39,23 @@
         ) srlsc GROUP BY scene_id;
     </select>
 
+    <select id="selectSceneRiskEvaluationForExport" resultType="api.common.pojo.po.scene.SceneRiskPO">
+        SELECT
+        scene_id, scene_type, task_id, risk, risk_level
+        FROM scene_risk
+        <where>
+            is_deleted = '0' AND task_id = #{taskId}
+            <if test="list != null and list.size()>0">
+                AND scene_id IN
+                <foreach collection="list" item="item" index="index"
+                         separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+        ORDER BY create_time DESC;
+    </select>
+
     <insert id="saveSceneRisk" parameterType="api.common.pojo.po.scene.SceneRiskPO">
         insert into simulation.scene_risk
         (risk_id, scene_id, scene_type, rule_id,algorithm_id,vehicle_id