zxl
2025-10-29 fea22e82e7e49691f6e0c20a29b228d0ab3173e9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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.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<IMonitorConstructionMapper, MonitorConstruction>
        implements IMonitorConstructionService {
    private final IMonitorConstructionMapper monitorConstructionMapper;
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result importExcel(MultipartFile file) {
        log.info("进入导入逻辑");
        ExcelUtil<MonitorConstructionDTO> excelUtil = new ExcelUtil<>(MonitorConstructionDTO.class);
        List<MonitorConstructionDTO> list = null;
        List<MonitorConstructionDTO> 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<MonitorConstruction> data = new ArrayList<>();
        for (MonitorConstructionDTO dto : distinctList) {
            MonitorConstruction monitorConstruction = new MonitorConstruction();
            monitorConstruction.setSerialNumber(dto.getSerialNumber());
            monitorConstruction.setTag(dto.getTag());
            data.add(monitorConstruction);
        }
        List<String> serialNumbers = data.stream()
                .map(MonitorConstruction::getSerialNumber)
                .collect(Collectors.toList());
 
        //删除已存在的设备对应标签
        if (CollectionUtils.isNotEmpty(serialNumbers)) {
            log.info("删除标签数据行数:{}",serialNumbers.size());
            QueryWrapper<MonitorConstruction> 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<MonitorConstructionDTO> excelUtil = new ExcelUtil<>(MonitorConstructionDTO.class);
        excelUtil.exportExcel(httpServletResponse, null, "设备标签模板");
    }
 
    @Override
    public List<MonitorConstruction> getSerialNumberListByConstructionType(String constructionType) {
        List<MonitorConstruction> 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;
    }
}