package com.ruoyi.system.service.impl; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.system.mapper.*; import com.ruoyi.system.model.*; import com.ruoyi.system.model.Record; import com.ruoyi.system.query.*; import com.ruoyi.system.service.ClientParamService; import com.ruoyi.system.service.DeviceUsageService; import com.ruoyi.system.service.ProjectCategoryCalculator; import com.ruoyi.system.vo.*; import com.ruoyi.system.vo.DeviceCountVo; import com.ruoyi.system.vo.DeviceListVo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.text.ParseException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.YearMonth; import java.util.*; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author administrator * @since 2026-01-13 */ @Slf4j @Service public class DeviceUsageServiceImpl extends ServiceImpl implements DeviceUsageService { @Autowired private EvalResultMapper evalResultMapper; @Autowired private ProjectMapper projectMapper; @Autowired private ClientParamMapper clientParamMapper; @Autowired private TaskMapper taskMapper; @Autowired private RecordMapper recordMapper; @Autowired private ProjectCategoryCalculator projectCategoryCalculator; @Override public List getDeviceUsageList(Integer id) { return this.baseMapper.getDeviceUsageList(id); } @Override public List getDeviceList(Page page, DeviceListQuery query) { List deviceList = this.baseMapper.getDeviceList(page, query); for (DeviceListVo deviceListVo : deviceList) { LocalDateTime checkTime = deviceListVo.getCheckTime(); // 判断checkTime是否是本月的时间 if (checkTime != null && YearMonth.from(checkTime).equals(YearMonth.now())) { deviceListVo.setCheckResult("已检查"); } else { deviceListVo.setCheckResult("未检查"); } } return deviceList; } @Override public List getProjectDeviceCount(Integer id) { return this.baseMapper.getProjectDeviceCount(id); } @Override public List projectList(Page page, EntrustListQuery query) { String startTime = query.getStartTime(); String endTime = query.getEndTime(); LambdaQueryWrapper projectWrapper = new LambdaQueryWrapper<>(); if (query.getClientId() != null) { projectWrapper.eq(Project::getClientId, query.getClientId()); } if (StringUtils.hasLength(query.getName())) { projectWrapper.like(Project::getName, query.getName()); } switch (query.getCategory()) { case 1: projectWrapper.eq(Project::getDeleted, false) .ne(Project::getType, 2) .and(wrapper -> wrapper .eq(Project::getStatus, 1) .or(w -> w.eq(Project::getStatus, 2)) ); break; case 2: projectWrapper.eq(Project::getDeleted, false) .eq(Project::getType, 2) .and(wrapper -> wrapper .eq(Project::getStatus, 1) .or(w -> w.eq(Project::getStatus, 2)) ); break; default: break; } List projects = projectMapper.selectList(projectWrapper); List projectIds = projects.stream().map(Project::getId).collect(Collectors.toList()); if (projectIds.isEmpty()) { projectIds.add(-1); } query.setProjectIds(projectIds); Map categoryMap = calculateProjectCategoryMap(projects, query); LambdaQueryWrapper taskWrapper = new LambdaQueryWrapper<>(); taskWrapper.in(Task::getProjectId, projectIds) .eq(Task::getDeleted, false); List taskList = taskMapper.selectList(taskWrapper); Map latestCheckedTaskMap = taskList.stream() .filter(task -> task.getProjectId() != null) .collect(Collectors.groupingBy(Task::getProjectId)) .entrySet() .stream() .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), findLatestCheckedTask(entry.getValue(), startTime, endTime))) .filter(entry -> entry.getValue() != null) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); if (StringUtils.hasLength(startTime) || StringUtils.hasLength(endTime)) { List checkedProjectIds = new ArrayList<>(latestCheckedTaskMap.keySet()); if (checkedProjectIds.isEmpty()) { checkedProjectIds.add(-1); } query.setProjectIds(checkedProjectIds); } List deviceList = this.baseMapper.projectList(page, query); for (EntrustProjectVo deviceListVo : deviceList) { deviceListVo.setRisk(formatProjectCategory(categoryMap.get(deviceListVo.getId()))); Task checkedTask = latestCheckedTaskMap.get(deviceListVo.getId()); if (checkedTask != null) { deviceListVo.setCheckTime(checkedTask.getDate().atStartOfDay()); deviceListVo.setCheckResult("已检查"); } else { deviceListVo.setCheckTime(null); deviceListVo.setCheckResult("未检查"); deviceListVo.setRisk(null); } } return deviceList; } private Map calculateProjectCategoryMap(List projects, EntrustListQuery query) { if (projects.isEmpty() || query.getClientId() == null || query.getCategory() == null) { return Collections.emptyMap(); } Date startDate = resolveProjectCategoryStartDate(query.getStartTime()); Date endDate = resolveProjectCategoryEndDate(query.getEndTime()); if (query.getCategory() == 1) { return projectCategoryCalculator.calculateOngoingProjectCategories( projects, query.getClientId().longValue(), startDate, endDate ); } if (query.getCategory() == 2) { return projectCategoryCalculator.calculateFixedAssetCategories( projects, query.getClientId().longValue(), startDate, endDate ); } return Collections.emptyMap(); } private Date resolveProjectCategoryStartDate(String startTime) { if (!StringUtils.hasLength(startTime)) { return DateUtil.beginOfMonth(new Date()); } return DateUtil.beginOfDay(DateUtil.parse(normalizeDateText(startTime))); } private Date resolveProjectCategoryEndDate(String endTime) { if (!StringUtils.hasLength(endTime)) { return DateUtil.endOfMonth(new Date()); } return DateUtil.endOfDay(DateUtil.parse(normalizeDateText(endTime))); } private String normalizeDateText(String dateText) { return dateText.replace("年", "-") .replace("月", "-") .replace("日", "") .replace("/", "-") .trim(); } private String formatProjectCategory(String category) { if (!StringUtils.hasLength(category)) { return null; } if (category.endsWith("类")) { return category; } return category + "类"; } private Task findLatestCheckedTask(List tasks, String startTime, String endTime) { LocalDate startDate = parseQueryDate(startTime); LocalDate endDate = parseQueryDate(endTime); return tasks.stream() .filter(this::isCheckedTask) .filter(task -> matchesCheckDate(task.getDate(), startDate, endDate)) .max(Comparator.comparing(Task::getDate)) .orElse(null); } private boolean isCheckedTask(Task task) { if (task == null || task.getDate() == null) { return false; } Integer state = task.getState(); return Integer.valueOf(3).equals(state) || Integer.valueOf(5).equals(state) || Integer.valueOf(6).equals(state) || Integer.valueOf(7).equals(state); } private boolean matchesCheckDate(LocalDate taskDate, LocalDate startDate, LocalDate endDate) { if (taskDate == null) { return false; } if (startDate == null && endDate == null) { LocalDate currentDate = LocalDate.now(); return taskDate.getYear() == currentDate.getYear() && taskDate.getMonthValue() == currentDate.getMonthValue(); } return (startDate == null || !taskDate.isBefore(startDate)) && (endDate == null || !taskDate.isAfter(endDate)); } private LocalDate parseQueryDate(String dateText) { if (!StringUtils.hasLength(dateText)) { return null; } String normalizedDateText = normalizeDateText(dateText); int separatorIndex = normalizedDateText.indexOf(' '); if (separatorIndex < 0) { separatorIndex = normalizedDateText.indexOf('T'); } if (separatorIndex > 0) { normalizedDateText = normalizedDateText.substring(0, separatorIndex); } return LocalDate.parse(normalizedDateText); } @Override public List projectReport(Page page, ProjectReportListQuery query) { List entrustProjectReportVoList = this.baseMapper.projectReport(page, query); return entrustProjectReportVoList; } @Override public List deviceList(Page page, EntrustDeviceListQuery query) { String startTime = query.getStartTime(); String endTime = query.getEndTime(); // 查询在建工程项目(usage_type 表示项目用途类型,假设 0 表示在建工程) LambdaQueryWrapper projectWrapper = new LambdaQueryWrapper<>(); if (query.getClientId() != null) { projectWrapper.eq(Project::getClientId, query.getClientId()); } switch (query.getCategory()) { case 1: // 查询在建资产项目 projectWrapper.eq(Project::getDeleted, false) .ne(Project::getType, 2) // 在建工程 .and(wrapper -> wrapper .eq(Project::getStatus, 1) // 在建项目 .or(w -> w .eq(Project::getStatus, 2) // 已完成项目 // 完成时间 >= 开始日期// 完成时间 <= 结束日期 ) ); break; case 2: // 查询固定资产项目 projectWrapper.eq(Project::getDeleted, false) .eq(Project::getType, 2) // 在建工程 .and(wrapper -> wrapper .eq(Project::getStatus, 1) // 在建项目 .or(w -> w .eq(Project::getStatus, 2) // 已完成项目 // 完成时间 >= 开始日期// 完成时间 <= 结束日期 ) ); break; } List projectIds = projectMapper.selectList(projectWrapper).stream().map(Project::getId).collect(Collectors.toList()); if(projectIds.isEmpty()){ projectIds.add(-1); } query.setProjectIds(projectIds); List deviceList = this.baseMapper.deviceList(page, query); for (EntrustDeviceListVo deviceListVo : deviceList) { if (deviceListVo.getCheckTime() != null) { deviceListVo.setCheckResult("已检查"); } else { deviceListVo.setCheckResult("未检查"); } } return deviceList; } @Override public List errorList(Page page, ErrorListQuery query) throws ParseException { String startTime=query.getStartTime(); String endTime=query.getEndTime(); // 查询在建工程项目(usage_type 表示项目用途类型,假设 0 表示在建工程) LambdaQueryWrapper projectWrapper = new LambdaQueryWrapper<>(); if(query.getCategory()!=null) { switch (query.getCategory()) { case 1: // 查询在建资产项目 projectWrapper.eq(Project::getDeleted, false) .ne(Project::getType, 2) // 在建工程 .and(wrapper -> wrapper .eq(Project::getStatus, 1) // 在建项目 .or(w -> w .eq(Project::getStatus, 2) // 已完成项目 .between(StringUtils.hasLength(startTime), Project::getSuccessTime, startTime, endTime) // 完成时间 >= 开始日期// 完成时间 <= 结束日期 ) ); break; case 2: // 查询固定资产项目 projectWrapper.eq(Project::getDeleted, false) .eq(Project::getType, 2) // 在建工程 .and(wrapper -> wrapper .eq(Project::getStatus, 1) // 在建项目 .or(w -> w .eq(Project::getStatus, 2) // 已完成项目 .between(StringUtils.hasLength(startTime), Project::getSuccessTime, startTime, endTime) // 完成时间 >= 开始日期// 完成时间 <= 结束日期 ) ); break; } } if (query.getClientId() != null) { projectWrapper.eq(Project::getClientId, query.getClientId()); } List projects = projectMapper.selectList(projectWrapper); List projectIds = projects.stream().map(Project::getId).collect(Collectors.toList()); if (projectIds.isEmpty()) { projectIds.add(-1); } // 查询检查任务 LambdaQueryWrapper taskWrapper = new LambdaQueryWrapper<>(); taskWrapper.in(Task::getProjectId, projectIds) .eq(Task::getDeleted, false); List tasks = taskMapper.selectList(taskWrapper); List checkTaskIds = tasks.stream().map(Task::getId).collect(Collectors.toList()); // 查询重大隐患记录(level 表示隐患等级,0 表示重大隐患) LambdaQueryWrapper recordWrapper = new LambdaQueryWrapper<>(); recordWrapper.eq(Record::getDeleted, false) .in(Record::getCheckTaskId, checkTaskIds) .eq(Record::getLevel, 0); // 重大隐患等级 List recordIds = recordMapper.selectList(recordWrapper).stream().map(Record::getId).toList(); query.setRecordIds(recordIds); List errorList = this.baseMapper.errorList(page, query); return errorList; } @Override public List deviceErrorList(Page page, ErrorListQuery query) { String startTime; String endTime; // 查询在建工程项目(usage_type 表示项目用途类型,假设 0 表示在建工程) if (StringUtils.hasLength(query.getStartTime())) { startTime = query.getStartTime().replace("年", "-").replace("月", "-").replace("日", "-"); endTime = query.getEndTime(); } else { endTime = ""; startTime = ""; } LambdaQueryWrapper projectWrapper = new LambdaQueryWrapper<>(); if (query.getCategory() != null) { switch (query.getCategory()) { case 1: // 查询在建资产项目 projectWrapper.eq(Project::getDeleted, false) .ne(Project::getType, 2) // 在建工程 .and(wrapper -> wrapper .eq(Project::getStatus, 1) // 在建项目 .or(w -> w .eq(Project::getStatus, 2) // 已完成项目 .between(StringUtils.hasLength(startTime), Project::getSuccessTime, startTime, endTime) // 完成时间 >= 开始日期// 完成时间 <= 结束日期 ) ); break; case 2: // 查询固定资产项目 projectWrapper.eq(Project::getDeleted, false) .eq(Project::getType, 2) // 在建工程 .and(wrapper -> wrapper .eq(Project::getStatus, 1) // 在建项目 .or(w -> w .eq(Project::getStatus, 2) // 已完成项目 .between(StringUtils.hasLength(startTime), Project::getSuccessTime, startTime, endTime) // 完成时间 >= 开始日期// 完成时间 <= 结束日期 ) ); break; } } if (query.getClientId() != null) { projectWrapper.eq(Project::getClientId, query.getClientId()); } List projects = projectMapper.selectList(projectWrapper); List projectIds = projects.stream().map(Project::getId).collect(Collectors.toList()); if (projectIds.isEmpty()) { projectIds.add(-1); } // 查询检查任务 LambdaQueryWrapper taskWrapper = new LambdaQueryWrapper<>(); taskWrapper.in(Task::getProjectId, projectIds) .eq(Task::getDeleted, false); List tasks = taskMapper.selectList(taskWrapper); List checkTaskIds = tasks.stream().map(Task::getId).collect(Collectors.toList()); // 查询重大隐患记录(level 表示隐患等级,0 表示重大隐患) LambdaQueryWrapper recordWrapper = new LambdaQueryWrapper<>(); recordWrapper.eq(Record::getDeleted, false) .in(Record::getCheckTaskId, checkTaskIds); List recordIds = recordMapper.selectList(recordWrapper).stream().map(Record::getId).toList(); query.setRecordIds(recordIds); List errorList = this.baseMapper.deviceErrorList(page, query); return errorList; } @Override public List safetyErrorList(Page page, ErrorListQuery query) { String startTime; String endTime; // 查询在建工程项目(usage_type 表示项目用途类型,假设 0 表示在建工程) if (StringUtils.hasLength(query.getStartTime())) { startTime = query.getStartTime().replace("年", "-").replace("月", "-").replace("日", "-"); endTime = query.getEndTime(); } else { endTime = ""; startTime = ""; } LambdaQueryWrapper projectWrapper = new LambdaQueryWrapper<>(); if(query.getCategory()!=null) { switch (query.getCategory()) { case 1: // 查询在建资产项目 projectWrapper // .eq(Project::getDeleted, false) .ne(Project::getType, 2) // 在建工程 .and(wrapper -> wrapper .eq(Project::getStatus, 1) // 在建项目 .or(w -> w .eq(Project::getStatus, 2) // 已完成项目 .between(StringUtils.hasLength(startTime), Project::getSuccessTime, startTime, endTime) // 完成时间 >= 开始日期// 完成时间 <= 结束日期 ) .or(w -> w .isNull(Project::getStatus) // 已完成项目 .between(StringUtils.hasLength(startTime), Project::getSuccessTime, startTime, endTime) // 完成时间 >= 开始日期// 完成时间 <= 结束日期 ) ); break; case 2: // 查询固定资产项目 projectWrapper // .eq(Project::getDeleted, false) .eq(Project::getType, 2) // 在建工程 .and(wrapper -> wrapper .eq(Project::getStatus, 1) // 在建项目 .or(w -> w .eq(Project::getStatus, 2) // 已完成项目 .between(StringUtils.hasLength(startTime), Project::getSuccessTime, startTime, endTime) // 完成时间 >= 开始日期// 完成时间 <= 结束日期 ) .or(w -> w .isNull(Project::getStatus) // 已完成项目 // .between(StringUtils.hasLength(startTime),Project::getSuccessTime, startTime, endTime) // 完成时间 >= 开始日期// 完成时间 <= 结束日期 ) ); break; } } if (query.getClientId() != null) { projectWrapper.eq(Project::getClientId, query.getClientId()); } List projects = projectMapper.selectList(projectWrapper); List projectIds = projects.stream().map(Project::getId).collect(Collectors.toList()); if (projectIds.isEmpty()) { projectIds.add(-1); } // 查询检查任务 LambdaQueryWrapper taskWrapper = new LambdaQueryWrapper<>(); taskWrapper.in(Task::getProjectId, projectIds) ; List tasks = taskMapper.selectList(taskWrapper); List checkTaskIds = tasks.stream().map(Task::getId).collect(Collectors.toList()); // 查询重大隐患记录(level 表示隐患等级,0 表示重大隐患) LambdaQueryWrapper recordWrapper = new LambdaQueryWrapper<>(); recordWrapper.eq(Record::getDeleted, false) .eq(Record::getRecordType, "error") .in(Record::getCheckTaskId, checkTaskIds); List recordIds = recordMapper.selectList(recordWrapper).stream().map(Record::getId).toList(); query.setRecordIds(recordIds); List errorList = this.baseMapper.safetyErrorList(page, query); return errorList; } }