package com.ruoyi.system.service.impl;
import com.alibaba.fastjson2.JSONArray;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.mapper.ProjectInfoMapper;
import com.ruoyi.system.model.Project;
import com.ruoyi.system.model.ProjectInfo;
import com.ruoyi.system.model.Record;
import com.ruoyi.system.query.ProjectDangerousTrendQuery;
import com.ruoyi.system.query.ProjectHiddenDangerTrendListQuery;
import com.ruoyi.system.service.ProjectCategoryCalculator;
import com.ruoyi.system.service.ProjectInfoService;
import com.ruoyi.system.service.ProjectService;
import com.ruoyi.system.vo.ProjectDangerousTrendVo;
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.text.ParseException;
import java.text.SimpleDateFormat;
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.Date;
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 {
@Autowired
private ProjectCategoryCalculator projectCategoryCalculator;
@Autowired
private ProjectService projectService;
@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);
if(record.getDeviceId()!=null){
// 取出倒数第3个
String name = jsonArray.getString(jsonArray.size()-3);
record.setHierarchyName( name);
}else {
// 取出倒数第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 = new ArrayList<>();
for (Map.Entry> entry : map.entrySet()) {
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);
}
resultList.add(vo) ;
}
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);
if(record.getDeviceId()!=null){
// 取出倒数第3个
String name = jsonArray.getString(jsonArray.size()-3);
record.setHierarchyName( name);
}else {
// 取出倒数第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;
}
@Override
public List getProjectDangerousTrend(ProjectDangerousTrendQuery query) {
List list = new ArrayList<>();
Project project = projectService.getById(query.getProjectId());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 算出跨度几个月
int months = calculateMonthsBetween(query.getStartTime(),query.getEndTime());
ArrayList projects = new ArrayList<>();
projects.add( project);
String temp=null;
try {
for (int i = 0; i < months; i++) {
ProjectDangerousTrendVo vo = new ProjectDangerousTrendVo();
LocalDate localDate = getMonthBoundaries(query.getStartTime(), true).plusMonths(i);
String dateStr = localDate.toString().substring(0, 7);
String start = localDate+" 00:00:00";
String end = getMonthBoundaries(query.getStartTime(), false).plusMonths(i)+" 23:59:59";
Date startDate = simpleDateFormat.parse(start);
Date endDate = simpleDateFormat.parse(end);
vo.setTime(dateStr);
if(project.getType()==2){
Map integerStringMap = projectCategoryCalculator.calculateFixedAssetCategories(projects, Long.valueOf(project.getClientId()), startDate, endDate);
String s = integerStringMap.get(query.getProjectId());
vo.setLevel(s);
}else {
Map integerStringMap = projectCategoryCalculator.calculateOngoingProjectCategories(projects, Long.valueOf(project.getClientId()), startDate, endDate);
String s = integerStringMap.get(query.getProjectId());
vo.setLevel(s);
}
// 如果没有则沿用上次的
if(vo.getLevel()!=null){
temp=vo.getLevel();
vo.setStatus(2);
}else {
vo.setLevel(temp);
}
list.add( vo);
}
}catch (ParseException e){
e.printStackTrace();
}
return list;
}
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;
}
}