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;
|
|
/**
|
* <p>
|
* 服务实现类
|
* </p>
|
*
|
* @author l
|
* @since 2026-01-12
|
*/
|
@Service
|
public class ProjectInfoServiceImpl extends ServiceImpl<ProjectInfoMapper, ProjectInfo> implements ProjectInfoService {
|
|
|
@Override
|
public List<ProjectHiddenDangerTrendVo> getProjectHiddenDangerTrend(Integer projectId) {
|
// 获取上月第一天的时间
|
LocalDate lastMonth = LocalDate.now().minusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
|
List<Record> 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<String, List<Record>> map = list.stream().collect(groupingBy(Record::getHierarchyName));
|
List<ProjectHiddenDangerTrendVo> resultList = map.entrySet().stream().map(entry -> {
|
ProjectHiddenDangerTrendVo vo = new ProjectHiddenDangerTrendVo();
|
vo.setName(entry.getKey());
|
List<Record> 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<ProjectHiddenDangerList> getProjectHiddenDangerTrendList(ProjectHiddenDangerTrendListQuery query) {
|
List<Record> 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<ProjectHiddenDangerList> projectHiddenDangerLists = new ArrayList<>();
|
|
Map<String, List<Record>> map = list.stream().collect(groupingBy(Record::getHierarchyName));
|
for (Map.Entry<String, List<Record>> stringListEntry : map.entrySet()) {
|
String key = stringListEntry.getKey();
|
if(query.getContent()!=null && !query.getContent().isEmpty()){
|
if(!key.contains( query.getContent())){
|
continue;
|
}
|
}
|
|
List<Record> value = stringListEntry.getValue();
|
ProjectHiddenDangerList projectHiddenDangerList1 = new ProjectHiddenDangerList();
|
projectHiddenDangerList1.setName(key);
|
ArrayList<ProjectHiddenDangerNextList> 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));
|
}
|
}
|
}
|