package com.ruoyi.system.service.impl;
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.service.ProjectInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.service.RecordService;
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.temporal.TemporalAdjusters;
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 collect = 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){
String rate = BigDecimal.valueOf(num).divide(BigDecimal.valueOf(vo.getLastMonth()), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString();
vo.setRate(rate);
}else {
vo.setRate("100.00");
}
}else {
vo.setRate("0.00");
}
return vo;
}).toList();
return collect;
}
public static void main(String[] args) {
LocalDate lastMonth = LocalDate.now().minusMonths(0).with(TemporalAdjusters.firstDayOfMonth());
System.out.println(lastMonth+" 23:59:59");
}
}