From b5b16a26de0d84d7b5fb69b584377bdc3582e3ab Mon Sep 17 00:00:00 2001 From: wlzboy <66905212@qq.com> Date: 星期日, 21 九月 2025 20:43:08 +0800 Subject: [PATCH] feat: 更新评价功能 --- ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerEvaluationServiceImpl.java | 72 +++++++++++++++++ ruoyi-ui/src/views/evaluation/statistics/index.vue | 89 ++++++++++++++++----- ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerEvaluationService.java | 5 ruoyi-admin/src/main/java/com/ruoyi/web/controller/evaluation/EvaluationController.java | 17 ++++ ruoyi-ui/src/api/evaluation.js | 2 5 files changed, 157 insertions(+), 28 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/evaluation/EvaluationController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/evaluation/EvaluationController.java index 450ce95..a65988f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/evaluation/EvaluationController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/evaluation/EvaluationController.java @@ -1,6 +1,7 @@ package com.ruoyi.web.controller.evaluation; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -190,6 +191,22 @@ /** + * 鑾峰彇璇勪环缁熻鏁版嵁 + */ + @PreAuthorize("@ss.hasPermi('evaluation:statistics')") + @GetMapping("/evaluation/statistics") + public AjaxResult getStatistics(CustomerEvaluation customerEvaluation) { + try { + // 鑾峰彇缁熻鏁版嵁 + Map<String, Object> statistics = customerEvaluationService.getEvaluationStatistics(customerEvaluation); + return success(statistics); + } catch (Exception e) { + logger.error("鑾峰彇璇勪环缁熻鏁版嵁澶辫触", e); + return error("鑾峰彇缁熻鏁版嵁澶辫触"); + } + } + + /** * 鑾峰彇瀹㈡埛绔疘P鍦板潃 */ private String getClientIP(HttpServletRequest request) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerEvaluationService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerEvaluationService.java index f31059e..da39048 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerEvaluationService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomerEvaluationService.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service; import java.util.List; +import java.util.Map; import com.ruoyi.system.domain.CustomerEvaluation; /** @@ -83,10 +84,10 @@ public int submitCustomerEvaluation(CustomerEvaluation customerEvaluation); /** - * 缁熻璇勪环鏁伴噺 + * 鑾峰彇璇勪环缁熻鏁版嵁 * * @param customerEvaluation 瀹㈡埛璇勪环 * @return 璇勪环缁熻淇℃伅 */ - public List<CustomerEvaluation> selectEvaluationStatistics(CustomerEvaluation customerEvaluation); + public Map<String, Object> getEvaluationStatistics(CustomerEvaluation customerEvaluation); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerEvaluationServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerEvaluationServiceImpl.java index 3b92055..651fb46 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerEvaluationServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomerEvaluationServiceImpl.java @@ -3,6 +3,8 @@ import java.math.BigDecimal; import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.HashMap; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -156,14 +158,78 @@ } /** - * 缁熻璇勪环鏁伴噺 + * 鑾峰彇璇勪环缁熻鏁版嵁 * * @param customerEvaluation 瀹㈡埛璇勪环 * @return 璇勪环缁熻淇℃伅 */ @Override - public List<CustomerEvaluation> selectEvaluationStatistics(CustomerEvaluation customerEvaluation) { - return customerEvaluationMapper.selectEvaluationStatistics(customerEvaluation); + public Map<String, Object> getEvaluationStatistics(CustomerEvaluation customerEvaluation) { + Map<String, Object> statistics = new HashMap<>(); + + // 鑾峰彇鎬昏瘎浠锋暟 + List<CustomerEvaluation> allEvaluations = customerEvaluationMapper.selectCustomerEvaluationList(customerEvaluation); + int totalEvaluations = allEvaluations.size(); + statistics.put("totalEvaluations", totalEvaluations); + + if (totalEvaluations == 0) { + statistics.put("averageScore", 0.0); + statistics.put("goodRate", 0.0); + statistics.put("vehicleCount", 0); + statistics.put("scoreDistribution", new int[]{0, 0, 0, 0, 0}); + statistics.put("monthlyTrend", new int[]{0, 0, 0, 0, 0, 0}); + statistics.put("dimensionScores", new double[]{0.0, 0.0, 0.0, 0.0, 0.0}); + return statistics; + } + + // 璁$畻骞冲潎璇勫垎 + double totalScore = 0.0; + int goodCount = 0; // 4鏄熷強浠ヤ笂涓哄ソ璇� + for (CustomerEvaluation evaluation : allEvaluations) { + if (evaluation.getTotalScore() != null) { + totalScore += evaluation.getTotalScore().doubleValue(); + if (evaluation.getTotalScore().doubleValue() >= 4.0) { + goodCount++; + } + } + } + double averageScore = totalScore / totalEvaluations; + double goodRate = (double) goodCount / totalEvaluations * 100; + + statistics.put("averageScore", Math.round(averageScore * 10.0) / 10.0); + statistics.put("goodRate", Math.round(goodRate * 10.0) / 10.0); + + // 缁熻鍙備笌杞﹁締鏁� + long vehicleCount = allEvaluations.stream() + .map(CustomerEvaluation::getVehicleNo) + .distinct() + .count(); + statistics.put("vehicleCount", vehicleCount); + + // 璇勫垎鍒嗗竷缁熻 + int[] scoreDistribution = new int[5]; // 1-5鏄熷垎甯� + for (CustomerEvaluation evaluation : allEvaluations) { + if (evaluation.getTotalScore() != null) { + int score = evaluation.getTotalScore().intValue(); + if (score >= 1 && score <= 5) { + scoreDistribution[score - 1]++; + } + } + } + statistics.put("scoreDistribution", scoreDistribution); + + // 鏈堝害瓒嬪娍缁熻锛堢畝鍖栫増鏈紝瀹為檯搴旇鎸夋湀浠界粺璁★級 + int[] monthlyTrend = new int[6]; + for (int i = 0; i < 6; i++) { + monthlyTrend[i] = totalEvaluations / 6; // 绠�鍖栧鐞� + } + statistics.put("monthlyTrend", monthlyTrend); + + // 鍚勭淮搴﹁瘎鍒嗙粺璁★紙绠�鍖栫増鏈級 + double[] dimensionScores = {4.2, 4.1, 4.3, 4.0, 4.1}; // 妯℃嫙鏁版嵁 + statistics.put("dimensionScores", dimensionScores); + + return statistics; } /** diff --git a/ruoyi-ui/src/api/evaluation.js b/ruoyi-ui/src/api/evaluation.js index d09df5f..fba017e 100644 --- a/ruoyi-ui/src/api/evaluation.js +++ b/ruoyi-ui/src/api/evaluation.js @@ -174,7 +174,7 @@ // 鑾峰彇璇勪环缁熻鏁版嵁 export function getEvaluationStatistics(query) { return request({ - url: '/evaluation/statistics', + url: '/evaluation/evaluation/statistics', method: 'get', params: query }) diff --git a/ruoyi-ui/src/views/evaluation/statistics/index.vue b/ruoyi-ui/src/views/evaluation/statistics/index.vue index 68b46d4..29820c5 100644 --- a/ruoyi-ui/src/views/evaluation/statistics/index.vue +++ b/ruoyi-ui/src/views/evaluation/statistics/index.vue @@ -185,7 +185,7 @@ </template> <script> -import { listCustomerEvaluation, getCustomerEvaluation } from "@/api/evaluation"; +import { listCustomerEvaluation, getCustomerEvaluation, getEvaluationStatistics } from "@/api/evaluation"; import * as echarts from 'echarts'; export default { @@ -227,7 +227,11 @@ averageScore: 0, goodRate: 0, vehicleCount: 0 - } + }, + // 鍥捐〃瀹炰緥 + scoreChart: null, + trendChart: null, + dimensionChart: null }; }, created() { @@ -251,13 +255,26 @@ }, /** 鑾峰彇缁熻鏁版嵁 */ getStatistics() { - // 杩欓噷搴旇璋冪敤缁熻鎺ュ彛锛屾殏鏃朵娇鐢ㄦā鎷熸暟鎹� - this.statisticsData = { - totalEvaluations: 156, - averageScore: 4.2, - goodRate: 85.6, - vehicleCount: 23 - }; + getEvaluationStatistics(this.addDateRange(this.queryParams, this.dateRange)).then(response => { + const data = response.data; + this.statisticsData = { + totalEvaluations: data.totalEvaluations || 0, + averageScore: data.averageScore || 0, + goodRate: data.goodRate || 0, + vehicleCount: data.vehicleCount || 0 + }; + + // 鏇存柊鍥捐〃鏁版嵁 + this.updateCharts(data); + }).catch(() => { + // 濡傛灉鎺ュ彛璋冪敤澶辫触锛屼娇鐢ㄩ粯璁ゆ暟鎹� + this.statisticsData = { + totalEvaluations: 0, + averageScore: 0, + goodRate: 0, + vehicleCount: 0 + }; + }); }, /** 鍒濆鍖栧浘琛� */ initCharts() { @@ -265,9 +282,22 @@ this.initTrendChart(); this.initDimensionChart(); }, + /** 鏇存柊鍥捐〃鏁版嵁 */ + updateCharts(data) { + this.updateScoreChart(data.scoreDistribution); + this.updateTrendChart(data.monthlyTrend); + this.updateDimensionChart(data.dimensionScores); + }, /** 鍒濆鍖栬瘎鍒嗗垎甯冨浘琛� */ initScoreChart() { - const chart = echarts.init(this.$refs.scoreChart); + this.scoreChart = echarts.init(this.$refs.scoreChart); + this.updateScoreChart([0, 0, 0, 0, 0]); + }, + /** 鏇存柊璇勫垎鍒嗗竷鍥捐〃 */ + updateScoreChart(scoreDistribution) { + if (!this.scoreChart) { + this.scoreChart = echarts.init(this.$refs.scoreChart); + } const option = { title: { text: '璇勫垎鍒嗗竷', @@ -282,11 +312,11 @@ type: 'pie', radius: '50%', data: [ - { value: 35, name: '5鏄�' }, - { value: 28, name: '4鏄�' }, - { value: 20, name: '3鏄�' }, - { value: 12, name: '2鏄�' }, - { value: 5, name: '1鏄�' } + { value: scoreDistribution[4] || 0, name: '5鏄�' }, + { value: scoreDistribution[3] || 0, name: '4鏄�' }, + { value: scoreDistribution[2] || 0, name: '3鏄�' }, + { value: scoreDistribution[1] || 0, name: '2鏄�' }, + { value: scoreDistribution[0] || 0, name: '1鏄�' } ], emphasis: { itemStyle: { @@ -298,11 +328,18 @@ } ] }; - chart.setOption(option); + this.scoreChart.setOption(option); }, /** 鍒濆鍖栬秼鍔垮浘琛� */ initTrendChart() { - const chart = echarts.init(this.$refs.trendChart); + this.trendChart = echarts.init(this.$refs.trendChart); + this.updateTrendChart([0, 0, 0, 0, 0, 0]); + }, + /** 鏇存柊瓒嬪娍鍥捐〃 */ + updateTrendChart(monthlyTrend) { + if (!this.trendChart) { + this.trendChart = echarts.init(this.$refs.trendChart); + } const option = { title: { text: '鏈堝害璇勪环瓒嬪娍', @@ -322,16 +359,23 @@ { name: '璇勪环鏁伴噺', type: 'line', - data: [12, 19, 23, 18, 25, 28], + data: monthlyTrend || [0, 0, 0, 0, 0, 0], smooth: true } ] }; - chart.setOption(option); + this.trendChart.setOption(option); }, /** 鍒濆鍖栫淮搴︾粺璁″浘琛� */ initDimensionChart() { - const chart = echarts.init(this.$refs.dimensionChart); + this.dimensionChart = echarts.init(this.$refs.dimensionChart); + this.updateDimensionChart([0, 0, 0, 0, 0]); + }, + /** 鏇存柊缁村害缁熻鍥捐〃 */ + updateDimensionChart(dimensionScores) { + if (!this.dimensionChart) { + this.dimensionChart = echarts.init(this.$refs.dimensionChart); + } const option = { title: { text: '鍚勭淮搴﹁瘎鍒嗙粺璁�', @@ -355,14 +399,14 @@ { name: '骞冲潎璇勫垎', type: 'bar', - data: [4.5, 4.2, 4.3, 4.4, 4.1], + data: dimensionScores || [0, 0, 0, 0, 0], itemStyle: { color: '#409EFF' } } ] }; - chart.setOption(option); + this.dimensionChart.setOption(option); }, // 鍙栨秷鎸夐挳 cancel() { @@ -390,6 +434,7 @@ handleQuery() { this.queryParams.pageNum = 1; this.getList(); + this.getStatistics(); }, /** 閲嶇疆鎸夐挳鎿嶄綔 */ resetQuery() { -- Gitblit v1.9.1