lxp
2025-03-18 059b188fd49c5127b75a38408d12e26d2363fbab
cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewServiceImpl.java
@@ -1,23 +1,26 @@
package com.ruoyi.process.service.impl;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.util.FileUtils;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.process.dto.ProcessMethodSearchNewDto;
import com.ruoyi.process.dto.ProcessMethodSearchNewExcel;
import com.ruoyi.process.dto.ProcessMethodSearchNewImport;
import com.ruoyi.process.mapper.ProcessMethodSearchNewMapper;
import com.ruoyi.process.pojo.ProcessMethodSearchNew;
import com.ruoyi.process.service.ProcessMethodSearchNewService;
import com.ruoyi.process.utils.UserUtils;
import org.apache.poi.hslf.util.LocaleDateFormat;
import org.springframework.beans.BeanUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
@@ -30,10 +33,13 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
@@ -45,6 +51,7 @@
@Service
public class ProcessMethodSearchNewServiceImpl extends ServiceImpl<ProcessMethodSearchNewMapper, ProcessMethodSearchNew> implements ProcessMethodSearchNewService {
    private final Set<String> importedFileHashes = ConcurrentHashMap.newKeySet();
    /**
     * 新增标准查新
     *
@@ -87,7 +94,16 @@
        String endDate = processMethodSearchNew.getEndDate();
        processMethodSearchNew.setBeginDate(null);
        processMethodSearchNew.setEndDate(null);
        return baseMapper.pageMethodSearchNew(page, QueryWrappers.queryWrappers(processMethodSearchNew), beginDate, endDate);
        // 历史记录的话 就要加时间
        if(!processMethodSearchNew.getIsThisYear()) {
            LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now().getYear(), 1, 1, 0, 0, 0);
            endDate = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(localDateTime);
        }
        ProcessMethodSearchNew processMethodSearchNew1 = new ProcessMethodSearchNew();
        BeanUtils.copyProperties(processMethodSearchNew, processMethodSearchNew1);
        return baseMapper.pageMethodSearchNew(page, QueryWrappers.queryWrappers(processMethodSearchNew1), beginDate, endDate);
    }
    /**
@@ -139,20 +155,23 @@
                    methodSearchNew.setRemarkString("作废");
                }
            }
            switch (methodSearchNew.getSearchNewSource()) {
                case 0:
                    methodSearchNew.setStandardNet("√");
                    break;
                case 1:
                    methodSearchNew.setInformationOffices("√");
                    break;
                case 2:
                    methodSearchNew.setStandardBookstore("√");
                    break;
                case 3:
                    methodSearchNew.setOther("√");
                    break;
            if(Objects.nonNull(methodSearchNew.getSearchNewSource())) {
                switch (methodSearchNew.getSearchNewSource()) {
                    case 0:
                        methodSearchNew.setStandardNet("√");
                        break;
                    case 1:
                        methodSearchNew.setInformationOffices("√");
                        break;
                    case 2:
                        methodSearchNew.setStandardBookstore("√");
                        break;
                    case 3:
                        methodSearchNew.setOther("√");
                        break;
                    default:
                        break;
                }
            }
            methodSearchNew.setIndex(index);
            index++;
@@ -236,63 +255,78 @@
     * @return
     */
    @Override
    public boolean importMethodSearchNew(MultipartFile file) {
        List<ProcessMethodSearchNewDto> searchNewDtoList = new ArrayList<>();
    public void importMethodSearchNew(MultipartFile file) {
        try {
            // excel解析
            EasyExcel.read(file.getInputStream(), ProcessMethodSearchNewDto.class, new AnalysisEventListener<ProcessMethodSearchNewDto>() {
                @Override
                public void invoke(ProcessMethodSearchNewDto searchNewDto, AnalysisContext analysisContext) {
                    searchNewDtoList.add(searchNewDto);
                }
            // 1. 计算文件的 MD5 哈希值
            String fileHash = calculateFileHash(file);
                @Override
                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
            // 2. 检查是否已存在相同文件
            if (!importedFileHashes.add(fileHash)) {
                return; // 已存在,直接跳过
            }
            // 3. 读取并处理文件
            try (InputStream inputStream = file.getInputStream()) {
                EasyExcel.read(inputStream, ProcessMethodSearchNewExcel.class, new ProcessMethodSearchNewImport(this))
                        .sheet()
                        .doRead();
            }
                }
            }).sheet().doRead();
            // 格式化查新对象
            List<ProcessMethodSearchNew> collect = searchNewDtoList.stream().map(searchNewDto -> {
                ProcessMethodSearchNew searchNew = new ProcessMethodSearchNew();
                BeanUtils.copyProperties(searchNewDto, searchNew);
                // 是否是更新
                if (StringUtils.isNotBlank(searchNewDto.getIsNewStandardString())) {
                    if (searchNewDto.getIsNewStandardString().equals("是")) {
                        searchNew.setIsNewStandard(1);
                    } else {
                        searchNew.setIsNewStandard(0);
                    }
                }
                // 查新记录
                if (StringUtils.isNotBlank(searchNewDto.getStandardNet())) {
                    searchNew.setSearchNewSource(0);
                } else if (StringUtils.isNotBlank(searchNewDto.getInformationOffices())) {
                    searchNew.setSearchNewSource(1);
                } else if (StringUtils.isNotBlank(searchNewDto.getIsNewStandardString())) {
                    searchNew.setSearchNewSource(2);
                } else if (StringUtils.isNotBlank(searchNewDto.getOther())) {
                    searchNew.setSearchNewSource(3);
                }
                // 备注
                if (StringUtils.isNotBlank(searchNewDto.getRemarkString())) {
                    if (searchNewDto.getRemarkString().equals("替换")) {
                        searchNew.setRemark(1);
                    } else if (searchNewDto.getRemarkString().equals("作废")) {
                        searchNew.setRemark(0);
                    }
                }
                return searchNew;
            }).collect(Collectors.toList());
            this.saveBatch(collect);
        } catch (IOException e) {
            // 4. 记录文件哈希值(标记为已导入)
            importedFileHashes.add(fileHash);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return true;
    }
    public void save (List<ProcessMethodSearchNewExcel> list) {
        if(CollectionUtils.isNotEmpty(list)) {
            for (ProcessMethodSearchNewExcel a : list) {
                if(NumberUtil.isNumber(a.getIndex())) {
                    ProcessMethodSearchNew processMethodSearchNew = new ProcessMethodSearchNew();
                    BeanUtils.copyProperties(a, processMethodSearchNew);
                    processMethodSearchNew.setIsNewStandard(a.getIsNewStandardString() == "是" ? 1 : 0); // 是否是新标准
                    // 查新记录 0 标准网  1 委托情报 2 标准数  3 其他
                    if(StringUtils.isNotEmpty(a.getStandardNet())) {
                        processMethodSearchNew.setSearchNewSource(0);
                    } else if(StringUtils.isNotEmpty(a.getInformationOffices())) {
                        processMethodSearchNew.setSearchNewSource(1);
                    } else if(StringUtils.isNotEmpty(a.getStandardBookstore())) {
                        processMethodSearchNew.setSearchNewSource(2);
                    } else if(StringUtils.isNotEmpty(a.getOther())) {
                        processMethodSearchNew.setSearchNewSource(3);
                    }
                    // 编制人
                    baseMapper.insert(processMethodSearchNew);
                }
            }
        }
    }
    // 计算文件的 MD5 哈希值
    private String calculateFileHash(MultipartFile file) throws Exception {
        try (InputStream is = file.getInputStream()) {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] buffer = new byte[8192];
            int bytesRead;
            while ((bytesRead = is.read(buffer)) != -1) {
                md.update(buffer, 0, bytesRead);
            }
            byte[] hashBytes = md.digest();
            // 将字节数组转换为十六进制字符串
            return bytesToHex(hashBytes);
        }
    }
    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }
}