package com.ycl.platform.service.impl; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.platform.domain.dto.MonitorConstructionDTO; import com.ycl.platform.domain.dto.ReportImportDTO; import com.ycl.platform.domain.entity.MonitorConstruction; import com.ycl.platform.mapper.IMonitorConstructionMapper; import com.ycl.platform.service.IDailyMonitorDemeritRecordService; import com.ycl.platform.service.IMonitorConstructionService; import com.ycl.system.Result; import com.ycl.utils.StringUtils; import com.ycl.utils.poi.ExcelUtil; import enumeration.ConstructionTypeEnum; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * zgyw * * @author : zxl * @date : 2025-10-20 13:58 **/ @Service @Slf4j @RequiredArgsConstructor public class IMonitorConstructionServiceImpl extends ServiceImpl implements IMonitorConstructionService { private final IMonitorConstructionMapper monitorConstructionMapper; private final IDailyMonitorDemeritRecordService dailyMonitorDemeritRecordService; @Override @Transactional(rollbackFor = Exception.class) public Result importExcel(MultipartFile file) { log.info("进入导入逻辑"); ExcelUtil excelUtil = new ExcelUtil<>(MonitorConstructionDTO.class); List list = null; List distinctList = null; try { list = excelUtil.importExcel(file.getInputStream()); distinctList = list.stream() .filter(Objects::nonNull)//过滤掉null的对象 .filter(dto -> dto.getSerialNumber() != null)//过滤掉 getSerialNumber为null的对象 .collect(Collectors.toMap( MonitorConstructionDTO::getSerialNumber, dto -> dto, (existing, replacement) -> existing )) .values() .stream() .collect(Collectors.toList()); } catch (IOException e) { log.error("请检查导入excel表格内容"); throw new RuntimeException("请检查导入excel表格内容"); } List data = new ArrayList<>(); for (MonitorConstructionDTO dto : distinctList) { MonitorConstruction monitorConstruction = new MonitorConstruction(); monitorConstruction.setSerialNumber(dto.getSerialNumber()); monitorConstruction.setTag(dto.getTag()); data.add(monitorConstruction); } List serialNumbers = data.stream() .map(MonitorConstruction::getSerialNumber) .collect(Collectors.toList()); //删除已存在的设备对应标签 if (CollectionUtils.isNotEmpty(serialNumbers)) { log.info("删除标签数据行数:{}",serialNumbers.size()); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("serial_number", serialNumbers); queryWrapper.eq("deleted",false); baseMapper.delete(queryWrapper); } if (CollectionUtils.isNotEmpty(data)) { //插入标签表中 log.info("插入标签数据行数:{}",data.size()); saveBatch(data); } return Result.ok(); } @Override public void getImportTemplate(HttpServletResponse httpServletResponse){ ExcelUtil excelUtil = new ExcelUtil<>(MonitorConstructionDTO.class); excelUtil.exportExcel(httpServletResponse, null, "设备标签模板"); } @Override public List getSerialNumberListByConstructionType(String constructionType) { List list = new ArrayList<>(); if (ConstructionTypeEnum.PHASE_ONE_TWO.name().equals(constructionType)){ //一二期 list = new LambdaQueryChainWrapper<>(baseMapper).eq(MonitorConstruction::getDeleted, Boolean.FALSE) .eq(MonitorConstruction::getTag, ConstructionTypeEnum.PHASE_ONE_TWO.getDesc()) .list(); }else if (ConstructionTypeEnum.PHASE_THREE.name().equals(constructionType)){ //三期 list = new LambdaQueryChainWrapper<>(baseMapper).eq(MonitorConstruction::getDeleted, Boolean.FALSE) .eq(MonitorConstruction::getTag, ConstructionTypeEnum.PHASE_THREE.getDesc()) .list(); }else if (ConstructionTypeEnum.PHASE_FOURTH.name().equals(constructionType)){ //四期人脸 list = new LambdaQueryChainWrapper<>(baseMapper).eq(MonitorConstruction::getDeleted, Boolean.FALSE) .eq(MonitorConstruction::getTag, ConstructionTypeEnum.PHASE_FOURTH.getDesc()) .list(); }else if (ConstructionTypeEnum.EASTERN_NEW_CITY.name().equals(constructionType)){ //东部新城 list = new LambdaQueryChainWrapper<>(baseMapper).eq(MonitorConstruction::getDeleted, Boolean.FALSE) .eq(MonitorConstruction::getTag, ConstructionTypeEnum.EASTERN_NEW_CITY.getDesc()) .list(); }else if (ConstructionTypeEnum.CHECK_ENTER_SICHUAN.name().equals(constructionType)){ //入川即检 list = new LambdaQueryChainWrapper<>(baseMapper).eq(MonitorConstruction::getDeleted, Boolean.FALSE) .eq(MonitorConstruction::getTag, ConstructionTypeEnum.CHECK_ENTER_SICHUAN.getDesc()) .list(); }else if (ConstructionTypeEnum.YAN_TAN_PHASE_TWO_FACE.name().equals(constructionType)){ //沿滩二期人脸 list = new LambdaQueryChainWrapper<>(baseMapper).eq(MonitorConstruction::getDeleted, Boolean.FALSE) .eq(MonitorConstruction::getTag, ConstructionTypeEnum.YAN_TAN_PHASE_TWO_FACE.getDesc()) .list(); } return list; } }