Преглед изворни кода

fix: 舆情推送-趋势接口改为近7天每日统计(按总/重大/已处理分组),统计接口对齐前端字段

ice_1 пре 2 недеља
родитељ
комит
805b9e9a50

+ 2 - 2
ruoyi-modules/ruoyi-riskctrl/src/main/java/org/dromara/riskctrl/controller/PublicOpinionController.java

@@ -79,8 +79,8 @@ public class PublicOpinionController extends BaseController {
 
     @SaCheckPermission("riskctrl:publicOpinion:list")
     @GetMapping("/trend")
-    public R<List<Map<String, Object>>> trend(@RequestParam(defaultValue = "6") int months) {
-        return R.ok(publicOpinionService.selectMonthlyTrend(months));
+    public R<List<Map<String, Object>>> trend(@RequestParam(defaultValue = "7") int days) {
+        return R.ok(publicOpinionService.selectDailyTrend(days));
     }
 
     @SaCheckPermission("riskctrl:publicOpinion:list")

+ 1 - 1
ruoyi-modules/ruoyi-riskctrl/src/main/java/org/dromara/riskctrl/service/IPublicOpinionService.java

@@ -31,7 +31,7 @@ public interface IPublicOpinionService {
 
     Map<String, Object> selectOpinionStats();
 
-    List<Map<String, Object>> selectMonthlyTrend(int months);
+    List<Map<String, Object>> selectDailyTrend(int days);
 
     List<PublicOpinionVo> selectLatestOpinions(int limit);
 

+ 71 - 17
ruoyi-modules/ruoyi-riskctrl/src/main/java/org/dromara/riskctrl/service/impl/PublicOpinionServiceImpl.java

@@ -101,33 +101,87 @@ public class PublicOpinionServiceImpl implements IPublicOpinionService {
     public Map<String, Object> selectOpinionStats() {
         LambdaQueryWrapper<PublicOpinion> wrapper = Wrappers.lambdaQuery();
         wrapper.eq(PublicOpinion::getDelFlag, SystemConstants.NORMAL);
-        long total = baseMapper.selectCount(wrapper);
-        long pending = baseMapper.selectCount(wrapper.clone()
-            .in(PublicOpinion::getProcessStatus, List.of("0", "1")));
-        long processed = baseMapper.selectCount(wrapper.clone()
+
+        // 今日数据
+        Calendar todayCal = Calendar.getInstance();
+        String today = new SimpleDateFormat("yyyy-MM-dd").format(todayCal.getTime());
+        LambdaQueryWrapper<PublicOpinion> todayWrapper = Wrappers.lambdaQuery()
+            .eq(PublicOpinion::getDelFlag, SystemConstants.NORMAL)
+            .likeRight(PublicOpinion::getPublishTime, today);
+        long todayTotal = baseMapper.selectCount(todayWrapper);
+        long todayMajor = baseMapper.selectCount(todayWrapper.clone()
+            .eq(PublicOpinion::getRiskLevel, "重大"));
+        long todayProcessed = baseMapper.selectCount(todayWrapper.clone()
             .eq(PublicOpinion::getProcessStatus, "2"));
 
+        // 昨日数据(用于环比)
+        Calendar yesterdayCal = Calendar.getInstance();
+        yesterdayCal.add(Calendar.DATE, -1);
+        String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(yesterdayCal.getTime());
+        LambdaQueryWrapper<PublicOpinion> yesterdayWrapper = Wrappers.lambdaQuery()
+            .eq(PublicOpinion::getDelFlag, SystemConstants.NORMAL)
+            .likeRight(PublicOpinion::getPublishTime, yesterday);
+        long yesterdayTotal = baseMapper.selectCount(yesterdayWrapper);
+
+        // 全部数据
+        long allTotal = baseMapper.selectCount(wrapper.clone());
+        long allMajor = baseMapper.selectCount(wrapper.clone().eq(PublicOpinion::getRiskLevel, "重大"));
+        long allProcessed = baseMapper.selectCount(wrapper.clone().eq(PublicOpinion::getProcessStatus, "2"));
+        long allPending = allTotal - allProcessed;
+
+        // 日增长率
+        String growthRate;
+        if (yesterdayTotal == 0) {
+            growthRate = todayTotal > 0 ? "100%" : "0%";
+        } else {
+            double rate = ((double)(todayTotal - yesterdayTotal) / yesterdayTotal) * 100;
+            growthRate = String.format("%.1f%%", rate);
+        }
+
+        // 处理率
+        String processRate;
+        if (allTotal == 0) {
+            processRate = "0%";
+        } else {
+            double rate = ((double)allProcessed / allTotal) * 100;
+            processRate = String.format("%.1f%%", rate);
+        }
+
         Map<String, Object> stats = new LinkedHashMap<>();
-        stats.put("total", total);
-        stats.put("pending", pending);
-        stats.put("processed", processed);
+        stats.put("todayTotal", todayTotal);
+        stats.put("todayGrowthRate", growthRate);
+        stats.put("majorCount", allMajor);
+        stats.put("majorChange", String.valueOf(todayMajor));
+        stats.put("processedCount", allProcessed);
+        stats.put("processRate", processRate);
+        stats.put("pendingCount", allPending);
         return stats;
     }
 
     @Override
-    public List<Map<String, Object>> selectMonthlyTrend(int months) {
+    public List<Map<String, Object>> selectDailyTrend(int days) {
         List<Map<String, Object>> trend = new ArrayList<>();
-        for (int i = months - 1; i >= 0; i--) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        for (int i = days - 1; i >= 0; i--) {
             Calendar cal = Calendar.getInstance();
-            cal.add(Calendar.MONTH, -i);
-            String month = new SimpleDateFormat("yyyy-MM").format(cal.getTime());
-            LambdaQueryWrapper<PublicOpinion> wrapper = Wrappers.lambdaQuery();
-            wrapper.eq(PublicOpinion::getDelFlag, SystemConstants.NORMAL)
-                .likeRight(PublicOpinion::getPublishTime, month);
-            long count = baseMapper.selectCount(wrapper);
+            cal.add(Calendar.DATE, -i);
+            String dateStr = sdf.format(cal.getTime());
+
+            LambdaQueryWrapper<PublicOpinion> baseWrapper = Wrappers.lambdaQuery()
+                .eq(PublicOpinion::getDelFlag, SystemConstants.NORMAL)
+                .likeRight(PublicOpinion::getPublishTime, dateStr);
+
+            long total = baseMapper.selectCount(baseWrapper.clone());
+            long major = baseMapper.selectCount(baseWrapper.clone()
+                .eq(PublicOpinion::getRiskLevel, "重大"));
+            long processed = baseMapper.selectCount(baseWrapper.clone()
+                .eq(PublicOpinion::getProcessStatus, "2"));
+
             Map<String, Object> item = new LinkedHashMap<>();
-            item.put("month", month);
-            item.put("count", count);
+            item.put("date", dateStr.substring(5)); // MM-DD
+            item.put("total", total);
+            item.put("major", major);
+            item.put("processed", processed);
             trend.add(item);
         }
         return trend;