From d2d71a6bc8e445ee60b7be2667676138e277d676 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期五, 28 六月 2024 17:41:08 +0800
Subject: [PATCH] 1. 修改走航报告自动输出模块

---
 src/main/kotlin/com/flightfeather/uav/common/chart/ChartUtil.kt |  130 ++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 114 insertions(+), 16 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/common/chart/ChartUtil.kt b/src/main/kotlin/com/flightfeather/uav/common/chart/ChartUtil.kt
index 4ce6f08..d448cb2 100644
--- a/src/main/kotlin/com/flightfeather/uav/common/chart/ChartUtil.kt
+++ b/src/main/kotlin/com/flightfeather/uav/common/chart/ChartUtil.kt
@@ -3,17 +3,21 @@
 import org.jfree.chart.ChartFactory
 import org.jfree.chart.ChartUtils
 import org.jfree.chart.JFreeChart
-import org.jfree.chart.labels.StandardCategoryItemLabelGenerator
+import org.jfree.chart.axis.NumberAxis
+import org.jfree.chart.axis.NumberTickUnit
 import org.jfree.chart.labels.StandardCategorySeriesLabelGenerator
 import org.jfree.chart.plot.CategoryPlot
+import org.jfree.chart.plot.PlotOrientation
 import org.jfree.chart.renderer.category.LineAndShapeRenderer
-import org.jfree.chart.title.TextTitle
 import org.jfree.data.category.DefaultCategoryDataset
 import java.awt.BasicStroke
 import java.awt.Color
 import java.awt.Font
 import java.awt.Paint
 import java.io.ByteArrayOutputStream
+import java.text.DecimalFormat
+import kotlin.math.max
+import kotlin.math.min
 
 /**
  * 鍥捐〃鐢熸垚
@@ -22,40 +26,87 @@
  */
 object ChartUtil {
 
-    data class ChartValue(val x: String?, val y: Number)
+    private const val FONT_NAME = "SimHei"
+    private val defaultColors = listOf(
+        Color(191, 0, 0),
+        Color(181, 125, 69),
+        Color(236, 204, 6),
+        Color(84, 151, 57),
+        Color(13, 221, 151),
+        Color(57, 75, 151),
+        Color(115, 51, 206),
+    )
 
-    fun line(title: String, dataset: DefaultCategoryDataset): JFreeChart {
-        val line = ChartFactory.createLineChart(title, "鏃堕棿", "娴撳害", dataset)
-//        line.categoryPlot.domainAxis.labelFont = Font("瀹嬩綋", Font.PLAIN, 12)
-//        line.categoryPlot.rangeAxis.labelFont = Font("瀹嬩綋", Font.PLAIN, 12)
+    // 鍥捐〃鏁版嵁鍊煎潗鏍�
+    data class ChartValue(val x: String?, val y: Double)
+    // 鍥捐〃鏁版嵁闆�
+    data class ChartDataset(val dataset: DefaultCategoryDataset, val minValue: Double, val maxValue: Double)
+
+    /**
+     * 鍒涘缓鎶樼嚎鍥�
+     */
+    fun line(title: String, chartDatasetList: List<ChartDataset>): JFreeChart? {
+        if (chartDatasetList.isEmpty()) return null
+
+        val line = ChartFactory.createLineChart(
+            title, "鏃堕棿", "娴撳害(渭g/m3)",
+            null, PlotOrientation.VERTICAL, true, false, false
+        )
+//        val line = ChartFactory.createLineChart(
+//            title, "", "娴撳害(渭g/m鲁)",
+//            null, PlotOrientation.VERTICAL, true, false, false
+//        )
+        var minValue = chartDatasetList[0].minValue
+        var maxValue = chartDatasetList[0].maxValue
+        val datasetList = mutableListOf<DefaultCategoryDataset>()
+        chartDatasetList.forEach {
+            minValue = min(minValue, it.minValue)
+            maxValue = max(maxValue, it.maxValue)
+            datasetList.add(it.dataset)
+        }
+        val plot = line.categoryPlot
         setLine(line)
+        setRenderer(plot, datasetList)
+        setX(plot)
+        setY(plot, "娴撳害(渭g/m3)", minValue, maxValue)
         return line
     }
 
-    fun lineToByteArray(title: String, dataset: DefaultCategoryDataset):ByteArray {
+    /**
+     * 鏂板缓鎶樼嚎鍥惧苟杞崲涓篵yte鏁扮粍
+     */
+    fun lineToByteArray(title: String, dataset: List<ChartDataset>): ByteArray {
         val chart = line(title, dataset)
         val output = ByteArrayOutputStream()
-        ChartUtils.writeChartAsPNG(output, chart, 600, 400)
+        ChartUtils.writeChartAsJPEG(output, chart, 1080, 607)
         val byteArray = output.toByteArray()
         output.flush()
         output.close()
         return byteArray
     }
 
-    fun newDataset(dataList:List<ChartValue>, seriesName:String): DefaultCategoryDataset {
+    /**
+     * 鏂板缓鍥捐〃鏁版嵁闆�
+     */
+    fun newDataset(dataList: List<ChartValue>, seriesName: String): ChartDataset? {
+        if (dataList.isEmpty()) return null
         val dataset = DefaultCategoryDataset()
+        var minValue = dataList[0].y
+        var maxValue = minValue
         dataList.forEach {
             dataset.setValue(it.y, seriesName, it.x)
+            minValue = min(minValue, it.y)
+            maxValue = max(maxValue, it.y)
         }
-        return dataset
+        return ChartDataset(dataset, minValue, maxValue)
     }
 
     /**
      * 璁剧疆鎶樼嚎鍥炬牱寮�
      */
     private fun setLine(chart: JFreeChart) {
-        chart.legend.itemFont = Font("SimHei", Font.PLAIN, 16)
-        chart.title.font = Font("SimHei", Font.BOLD, 20)
+        chart.legend.itemFont = Font(FONT_NAME, Font.PLAIN, 16)
+        chart.title.font = Font(FONT_NAME, Font.BOLD, 20)
         chart.categoryPlot.apply {
             backgroundPaint = Color(255, 255, 255)
             rangeGridlinePaint = Color(200, 200, 200)
@@ -64,11 +115,58 @@
         }
     }
 
-    private fun setRenderer(plot:CategoryPlot, datasetList:List<DefaultCategoryDataset>) {
-        val renderer = newBasicRenderer(paint = Color(191, 0, 0))
+    private fun setRenderer(plot: CategoryPlot, datasetList: List<DefaultCategoryDataset>) {
+        datasetList.forEachIndexed { index, v ->
+            val renderer = newBasicRenderer(paint = defaultColors[index % defaultColors.size])
+            plot.setDataset(index, v)
+            plot.setRenderer(index, renderer)
+        }
+
     }
 
-    private fun newBasicRenderer(series:Int = 0, paint:Paint): LineAndShapeRenderer {
+    private fun setX(plot: CategoryPlot) {
+        plot.domainAxis.apply {
+            // 璁剧疆x杞存瘡涓埢搴︾殑瀛椾綋
+            tickLabelFont = Font(FONT_NAME, Font.BOLD, 16)
+            // 璁剧疆x杞存爣绛剧殑瀛椾綋
+            labelFont = Font(FONT_NAME, Font.BOLD, 20)
+            // 璁剧疆x杞磋酱绾挎槸鍚︽樉绀�
+            isAxisLineVisible = false
+            // 璁剧疆x杞村埢搴︽槸鍚︽樉绀�
+            isTickMarksVisible = false
+
+            upperMargin = .0
+            lowerMargin = .0
+        }
+    }
+
+    private fun setY(plot: CategoryPlot, label:String, minValue: Double, maxValue: Double) {
+        val tickUnit = (maxValue - minValue) / 10
+        val axis1 = NumberAxis().apply {
+            this.label = label
+            // 鍒诲害灞曠ず鏍煎紡鍖�
+            numberFormatOverride = DecimalFormat("0.0")
+            if (tickUnit != .0) {
+                // 鍙栨秷鑷姩鍒嗛厤闂磋窛
+                isAutoTickUnitSelection = false
+                // 璁剧疆闂撮殧璺濈
+                setTickUnit(NumberTickUnit(tickUnit))
+                // 璁剧疆鏄剧ず鑼冨洿
+                setRange(minValue, maxValue)
+            }
+            // 璁剧疆y杞存瘡涓埢搴︾殑瀛椾綋
+            tickLabelFont = Font(FONT_NAME, Font.BOLD, 16)
+            // 璁剧疆y杞存爣绛剧殑瀛椾綋
+            labelFont = Font(FONT_NAME, Font.BOLD, 20)
+            // 璁剧疆y杞磋酱绾夸笉鏄剧ず
+            isAxisLineVisible = false
+            // 璁剧疆y杞村埢搴︿笉鏄剧ず
+            isTickMarksVisible = false
+        }
+        plot.rangeAxis = axis1
+    }
+
+    private fun newBasicRenderer(series: Int = 0, paint: Paint): LineAndShapeRenderer {
         return LineAndShapeRenderer().apply {
             legendItemLabelGenerator = StandardCategorySeriesLabelGenerator()
             setSeriesStroke(series, BasicStroke(3f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 2000f))

--
Gitblit v1.9.3