package com.ruoyi.system.service.impl; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson2.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.system.model.ProjectInfo; import com.ruoyi.system.mapper.ProjectInfoMapper; import com.ruoyi.system.model.Record; import com.ruoyi.system.query.ProjectHiddenDangerTrendListQuery; import com.ruoyi.system.service.ProjectInfoService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.system.service.RecordService; import com.ruoyi.system.vo.ProjectHiddenDangerList; import com.ruoyi.system.vo.ProjectHiddenDangerNextList; import com.ruoyi.system.vo.ProjectHiddenDangerTrendVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.YearMonth; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.List; import java.util.Map; import static java.util.stream.Collectors.groupingBy; /** *

* 服务实现类 *

* * @author l * @since 2026-01-12 */ @Service public class ProjectInfoServiceImpl extends ServiceImpl implements ProjectInfoService { @Override public List getProjectHiddenDangerTrend(Integer projectId) { // 获取上月第一天的时间 LocalDate lastMonth = LocalDate.now().minusMonths(1).with(TemporalAdjusters.firstDayOfMonth()); List list = this.baseMapper.getProjectHiddenDangerTrend(projectId,lastMonth+" 00:00:00",LocalDate.now()+" 23:59:59"); for (Record record : list) { String hierarchyNames = record.getHierarchyNames(); JSONArray jsonArray = JSONArray.parseArray(hierarchyNames); // 取出倒数第4个 String name = jsonArray.getString(jsonArray.size()-4); record.setHierarchyName( name); } LocalDate thisMonth = LocalDate.now().minusMonths(0).with(TemporalAdjusters.firstDayOfMonth()); Map> map = list.stream().collect(groupingBy(Record::getHierarchyName)); List resultList = map.entrySet().stream().map(entry -> { ProjectHiddenDangerTrendVo vo = new ProjectHiddenDangerTrendVo(); vo.setName(entry.getKey()); List value = entry.getValue(); long count = value.stream().filter(record -> record.getCreateTime().isAfter(thisMonth.atStartOfDay())).count(); // 根据value集合中的createTime 选出本月的数据 vo.setThisMonth((int) count); vo.setLastMonth(value.size()-(int) count); int num = vo.getThisMonth() - vo.getLastMonth(); if (num != 0) { if(vo.getLastMonth()>0){ Double rate = BigDecimal.valueOf(num).divide(BigDecimal.valueOf(vo.getLastMonth()), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).doubleValue(); vo.setRate(rate); }else { vo.setRate(100.00d); } }else { vo.setRate(0.00d); } return vo; }).toList(); return resultList; } @Override public List getProjectHiddenDangerTrendList(ProjectHiddenDangerTrendListQuery query) { List list = this.baseMapper.getProjectHiddenDangerTrend(query.getProjectId(),getMonthBoundaries(query.getStartTime(),true)+" 00:00:00",getMonthBoundaries(query.getEndTime(),false)+" 23:59:59"); for (Record record : list) { String hierarchyNames = record.getHierarchyNames(); JSONArray jsonArray = JSONArray.parseArray(hierarchyNames); // 取出倒数第4个 String name = jsonArray.getString(jsonArray.size()-4); record.setHierarchyName( name); } // 算出跨度几个月 int months = calculateMonthsBetween(query.getStartTime(),query.getEndTime()); ArrayList projectHiddenDangerLists = new ArrayList<>(); Map> map = list.stream().collect(groupingBy(Record::getHierarchyName)); for (Map.Entry> stringListEntry : map.entrySet()) { String key = stringListEntry.getKey(); if(query.getContent()!=null && !query.getContent().isEmpty()){ if(!key.contains( query.getContent())){ continue; } } List value = stringListEntry.getValue(); ProjectHiddenDangerList projectHiddenDangerList1 = new ProjectHiddenDangerList(); projectHiddenDangerList1.setName(key); ArrayList projectHiddenDangerNextLists = new ArrayList<>(); for (int i = 0; i < months; i++) { ProjectHiddenDangerNextList projectHiddenDangerNextList = new ProjectHiddenDangerNextList(); LocalDate localDate = getMonthBoundaries(query.getStartTime(), true).plusMonths(i); String dateStr = localDate.toString().substring(0, 7); long count = value.stream().filter(record -> record.getCreateTime().toString().contains(dateStr)).count(); ProjectHiddenDangerList projectHiddenDangerList = new ProjectHiddenDangerList(); projectHiddenDangerList.setName(key); projectHiddenDangerNextList.setTime(dateStr); projectHiddenDangerNextList.setNum((int) count); projectHiddenDangerNextLists.add(projectHiddenDangerNextList); } projectHiddenDangerList1.setList(projectHiddenDangerNextLists); projectHiddenDangerLists.add(projectHiddenDangerList1); } return projectHiddenDangerLists; } public static LocalDate getMonthBoundaries(String yearMonthStr,boolean isInclusive) { // 解析字符串为YearMonth YearMonth yearMonth = YearMonth.parse(yearMonthStr); if(isInclusive){ // 获取第一天 LocalDate firstDay = yearMonth.atDay(1); return firstDay; }else { // 获取最后一天 LocalDate lastDay = yearMonth.atEndOfMonth(); return lastDay; } } public static int calculateMonthsBetween(String startYearMonth, String endYearMonth) { YearMonth start = YearMonth.parse(startYearMonth); YearMonth end = YearMonth.parse(endYearMonth); // 计算月份差 + 1(包含结束月份) return (int) ChronoUnit.MONTHS.between(start, end) + 1; } public static void main(String[] args) { LocalDate monthBoundaries = getMonthBoundaries("2025-03", true); System.out.println(monthBoundaries); System.out.println(getMonthBoundaries("2025-02",false)); System.out.println(calculateMonthsBetween("2025-03", "2026-01")); for (int count = 0; count < 11; count++) { // 根据2025-03 根据循环获取下一个月的时间 LocalDate monthBoundaries1 = getMonthBoundaries("2025-03", true).plusMonths(count); System.out.println(monthBoundaries1.toString().substring(0,7)); } } }