| | |
| | | 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; |
| | |
| | | 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; |
| | | |
| | | /** |
| | |
| | | @Service |
| | | public class ProcessMethodSearchNewServiceImpl extends ServiceImpl<ProcessMethodSearchNewMapper, ProcessMethodSearchNew> implements ProcessMethodSearchNewService { |
| | | |
| | | private final Set<String> importedFileHashes = ConcurrentHashMap.newKeySet(); |
| | | /** |
| | | * 新增标准查新 |
| | | * |
| | |
| | | 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); |
| | | } |
| | | |
| | | /** |
| | |
| | | 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++; |
| | |
| | | * @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(); |
| | | } |
| | | } |
| | | |