package org.dromara.eims.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.eims.domain.*; import org.dromara.eims.domain.vo.EimsEquVo; import org.dromara.eims.mapper.*; import org.dromara.eims.service.IReportService; import org.dromara.system.mapper.SysDeptMapper; import org.springframework.stereotype.Service; import java.time.*; import java.util.*; import java.util.stream.Collectors; @RequiredArgsConstructor @Service public class ReportServiceImpl implements IReportService { private static final String UNCHECKED = "未点检"; private static final String PENDING_VERIFICATION = "待验证"; private static final String COMPLETED = "已完成"; private static final String NOT_APPLICABLE = "/"; private static final String MAINT_0 = "待保养"; private static final String MAINT_1 = "保养中"; private static final String MAINT_2 = "待验证"; private static final String MAINT_3 = "已完成"; private final EimsInspectRecordMapper baseMapper; private final EimsInspectStMapper inspectStMapper; private final EimsInspectPlanMapper inspectPlanMapper; private final SysDeptMapper sysDeptMapper; private final EimsEquMapper equMapper; private final EimsMaintOrderMapper maintOrderMapper; private final EimsMaintPlanMapper maintPlanMapper; @Override public TableDataInfo> queryPageListCustom(Map queryParams, PageQuery pageQuery) { LambdaQueryWrapper equWrapper = Wrappers.lambdaQuery(); if (queryParams.containsKey("keyword")) { String keyword = (String) queryParams.get("keyword"); equWrapper.and(StringUtils.isNotBlank(keyword), wrapper -> wrapper .like(EimsEqu::getEquName, keyword) .or() .like(EimsEqu::getAssetNo, keyword) ); } Page equList = equMapper.selectVoPage(pageQuery.build(), equWrapper); return TableDataInfo.build(fitInspData(equList, queryParams)); } @Override public TableDataInfo> queryMaintList(Map queryParams, PageQuery pageQuery) { LambdaQueryWrapper equWrapper = Wrappers.lambdaQuery(); if (queryParams.containsKey("keyword")) { String keyword = (String) queryParams.get("keyword"); equWrapper.and(StringUtils.isNotBlank(keyword), wrapper -> wrapper .like(EimsEqu::getEquName, keyword) .or() .like(EimsEqu::getAssetNo, keyword) ); } Page equList = equMapper.selectVoPage(pageQuery.build(), equWrapper); return TableDataInfo.build(fitMaintData(equList, queryParams)); } private Page> fitMaintData(Page equPageList, Map queryParams) { Integer selectYear = getYearFromParams(queryParams); LocalDate firstDay = Year.of(selectYear).atDay(1); // 第一天 LocalDate lastDay = Year.of(selectYear).atDay(Year.of(selectYear).length()); Page> page = new Page<>( equPageList.getCurrent(), equPageList.getSize(), equPageList.getTotal(), equPageList.searchCount() ); if (equPageList.getRecords().isEmpty()) { return page; } List equIds = equPageList.getRecords().stream() .map(EimsEquVo::getEquId) .collect(Collectors.toList()); Map> maintOrderMap = getMaintOrderMap(equIds, firstDay, lastDay); Map> maintPlanMap = getMaintPlanMap(equIds,selectYear); List> resultList = equPageList.getRecords().stream() .map(equ -> buildMaintReport(equ, maintOrderMap, maintPlanMap)) .collect(Collectors.toList()); page.setRecords(resultList); return page; } private Page> fitInspData(Page equPageList, Map queryParams) { YearMonth yearMonth = getYearMonthFromParams(queryParams); LocalDate firstDay = yearMonth.atDay(1); LocalDate lastDay = yearMonth.atEndOfMonth(); Page> page = new Page<>( equPageList.getCurrent(), equPageList.getSize(), equPageList.getTotal(), equPageList.searchCount() ); if (equPageList.getRecords().isEmpty()) { return page; } List equIds = equPageList.getRecords().stream() .map(EimsEquVo::getEquId) .collect(Collectors.toList()); Map> inspectStMap = getInspectStMap(equIds, firstDay, lastDay); Map> inspectPlanMap = getInspectPlanMap(equIds, yearMonth); List> resultList = equPageList.getRecords().stream() .map(equ -> buildEquipmentReport(equ, inspectStMap, inspectPlanMap, yearMonth)) .collect(Collectors.toList()); page.setRecords(resultList); return page; } private YearMonth getYearMonthFromParams(Map queryParams) { if (queryParams.containsKey("selectMonth")) { String[] parts = queryParams.get("selectMonth").toString().split("-"); return YearMonth.of(Integer.parseInt(parts[0]), Integer.parseInt(parts[1])); } return YearMonth.now(); } private Map> getInspectStMap(List equIds, LocalDate firstDay, LocalDate lastDay) { LambdaQueryWrapper sWrapper = Wrappers.lambdaQuery(); sWrapper.in(EimsInspectSt::getEquId, equIds) .between(EimsInspectSt::getPlanTime, firstDay, lastDay) .eq(EimsInspectSt::getType, "Day"); return inspectStMapper.selectList(sWrapper).stream() .collect(Collectors.groupingBy(EimsInspectSt::getEquId)); } private Map> getInspectPlanMap(List equIds, YearMonth yearMonth) { LocalDateTime firstDayTime = yearMonth.atDay(1).atStartOfDay(); LocalDateTime lastDayTime = yearMonth.atEndOfMonth().atTime(23, 59, 59); LambdaQueryWrapper pWrapper = Wrappers.lambdaQuery(); pWrapper.in(EimsInspectPlan::getEquId, equIds) .between(EimsInspectPlan::getCreateTime, firstDayTime, lastDayTime); return inspectPlanMapper.selectList(pWrapper).stream() .collect(Collectors.groupingBy(EimsInspectPlan::getEquId)); } private Map buildEquipmentReport(EimsEquVo equ, Map> inspectStMap, Map> inspectPlanMap, YearMonth yearMonth) { Map item = new HashMap<>(); item.put("equName", equ.getEquName()); item.put("assetNo", equ.getAssetNo()); List equInspList = inspectStMap.getOrDefault(equ.getEquId(), Collections.emptyList()); List equPlanList = inspectPlanMap.getOrDefault(equ.getEquId(), Collections.emptyList()); Map stMap = equInspList.stream() .collect(Collectors.toMap( inspSt -> String.valueOf(inspSt.getPlanTime().toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate().getDayOfMonth()), inspSt -> inspSt, (existing, replacement) -> existing )); Map planMap = equPlanList.stream() .collect(Collectors.toMap( inspPlan -> String.valueOf(inspPlan.getCreateTime().toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate().getDayOfMonth()), inspPlan -> inspPlan, (existing, replacement) -> existing )); int daysInMonth = yearMonth.lengthOfMonth(); for (int day = 1; day <= daysInMonth; day++) { String dayKey = "day_" + day; if (planMap.containsKey(String.valueOf(day))) { item.put(dayKey, UNCHECKED); } else if (stMap.containsKey(String.valueOf(day))) { EimsInspectSt st = stMap.get(String.valueOf(day)); switch (st.getStatus()) { case "0": item.put(dayKey, UNCHECKED); break; case "1": item.put(dayKey, PENDING_VERIFICATION); break; case "2": item.put(dayKey, COMPLETED); break; default: item.put(dayKey, NOT_APPLICABLE); } } else { item.put(dayKey, NOT_APPLICABLE); } } return item; } private Integer getYearFromParams(Map queryParams) { if (queryParams.containsKey("selectYear")) { String year = queryParams.get("selectYear").toString(); return Integer.parseInt(year); } return LocalDate.now().getYear(); } private Map> getMaintOrderMap(List equIds, LocalDate firstDay, LocalDate lastDay) { LambdaQueryWrapper sWrapper = Wrappers.lambdaQuery(); sWrapper.in(EimsMaintOrder::getEquId, equIds) .between(EimsMaintOrder::getPlanTime, firstDay, lastDay); return maintOrderMapper.selectList(sWrapper).stream() .collect(Collectors.groupingBy(EimsMaintOrder::getEquId)); } private Map> getMaintPlanMap(List equIds, Integer year) { LocalDateTime firstDay = Year.of(year).atDay(1).atStartOfDay(); LocalDateTime lastDay = Year.of(year).atDay(Year.of(year).length()) .atTime(23, 59, 59); LambdaQueryWrapper pWrapper = Wrappers.lambdaQuery(); pWrapper.in(EimsMaintPlan::getEquId, equIds) .between(EimsMaintPlan::getCreateTime, firstDay, lastDay); return maintPlanMapper.selectList(pWrapper).stream() .collect(Collectors.groupingBy(EimsMaintPlan::getEquId)); } private Map buildMaintReport(EimsEquVo equ, Map> maintOrderMap, Map> maintPlanMap) { Map item = new HashMap<>(); item.put("equName", equ.getEquName()); item.put("assetNo", equ.getAssetNo()); List equMaintOrderList = maintOrderMap.getOrDefault(equ.getEquId(), Collections.emptyList()); List equMaintPlanList = maintPlanMap.getOrDefault(equ.getEquId(), Collections.emptyList()); Map orderMap = equMaintOrderList.stream() .collect(Collectors.groupingBy( order -> String.valueOf(order.getPlanTime().toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate().getMonthValue()), // 按月份分组后,判断该月是否全部status=3 Collectors.collectingAndThen( Collectors.toList(), orders -> orders.stream().allMatch(o -> o.getStatus().equals("3")) ? "已完成" : "未完成" ) )); Map planMap = equMaintPlanList.stream() .collect(Collectors.toMap( maintPlan -> String.valueOf(maintPlan.getCreateTime().toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate().getMonthValue()), maintPlan -> maintPlan, (existing, replacement) -> existing )); int monthInYear = 12; for (int month = 1; month <= monthInYear; month++) { String monthKey = "month_" + month; if (planMap.containsKey(String.valueOf(month))) { item.put(monthKey, UNCHECKED); } else if (orderMap.containsKey(String.valueOf(month))) { String result = orderMap.get(String.valueOf(month)); item.put(monthKey, result); } else { item.put(monthKey, NOT_APPLICABLE); } } return item; } }