package com.yuanchu.mom.service.impl; 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.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.yuanchu.mom.dto.ProcessMethodSearchNewDto; import com.yuanchu.mom.mapper.ProcessMethodSearchNewMapper; import com.yuanchu.mom.pojo.ProcessMethodSearchNew; import com.yuanchu.mom.service.ProcessMethodSearchNewService; import com.yuanchu.mom.utils.QueryWrappers; import com.yuanchu.mom.utils.UserUtils; import org.springframework.beans.BeanUtils; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * 标准查新 * * @author zhuo * @since 2024-11-04 */ @Service public class ProcessMethodSearchNewServiceImpl extends ServiceImpl implements ProcessMethodSearchNewService { /** * 新增标准查新 * * @param processMethodSearchNewList * @return */ @Override @Transactional(rollbackFor = Exception.class) public boolean addMethodSearchNew(List processMethodSearchNewList) { for (ProcessMethodSearchNew processMethodSearchNew : processMethodSearchNewList) { processMethodSearchNew.setIsNewStandard(1); } // 修改之前所有没有变新的 List processMethodSearchNews = baseMapper.selectList(Wrappers.lambdaQuery() .eq(ProcessMethodSearchNew::getIsNewStandard, 1)); for (ProcessMethodSearchNew processMethodSearchNew : processMethodSearchNews) { baseMapper.update(null, Wrappers.lambdaUpdate() .set(ProcessMethodSearchNew::getMethodName, processMethodSearchNew.getNewMethodName()) .set(ProcessMethodSearchNew::getStandardNo, processMethodSearchNew.getNewStandardNo()) .set(ProcessMethodSearchNew::getFileNo, processMethodSearchNew.getNewStandardNo()) .set(ProcessMethodSearchNew::getIsNewStandard, 0) .set(ProcessMethodSearchNew::getNewMethodName, null) .set(ProcessMethodSearchNew::getNewStandardNo, null) .eq(ProcessMethodSearchNew::getMethodSearchNewId, processMethodSearchNew.getMethodSearchNewId())); } // 新增 this.saveBatch(processMethodSearchNewList); return true; } /** * 标准查新列表 * @param processMethodSearchNew * @return */ @Override public IPage pageMethodSearchNew(Page page, ProcessMethodSearchNewDto processMethodSearchNew) { String beginDate = processMethodSearchNew.getBeginDate(); String endDate = processMethodSearchNew.getEndDate(); processMethodSearchNew.setBeginDate(null); processMethodSearchNew.setEndDate(null); return baseMapper.pageMethodSearchNew(page, QueryWrappers.queryWrappers(processMethodSearchNew), beginDate, endDate); } /** * 标准查新导出 * @param processMethodSearchNew * @param response */ @Override public void exportMethodSearchNew(ProcessMethodSearchNewDto processMethodSearchNew, HttpServletResponse response) { // 查询标准查新 String beginDate = processMethodSearchNew.getBeginDate(); String endDate = processMethodSearchNew.getEndDate(); String writeUserId = processMethodSearchNew.getWriteUserId().toString(); String ratifyUserId = processMethodSearchNew.getRatifyUserId().toString(); processMethodSearchNew.setBeginDate(null); processMethodSearchNew.setEndDate(null); processMethodSearchNew.setWriteUserId(null); processMethodSearchNew.setRatifyUserId(null); List methodSearchNews = baseMapper.selectMethodSearchNew(QueryWrappers.queryWrappers(processMethodSearchNew), beginDate, endDate); int index = 1; // 格式化参数 for (ProcessMethodSearchNewDto methodSearchNew : methodSearchNews) { // 是否是跟新标准 if (methodSearchNew.getIsNewStandard().equals(1)) { methodSearchNew.setIsNewStandardString("是"); } else { methodSearchNew.setIsNewStandardString("否"); } // 备注 if (methodSearchNew.getRemark() != null) { if (methodSearchNew.getRemark().equals(1)) { methodSearchNew.setIsNewStandardString("替换"); } else { methodSearchNew.setIsNewStandardString("作废"); } } if (methodSearchNew.getRemark() != null) { if (methodSearchNew.getRemark().equals(1)) { methodSearchNew.setRemarkString("替换"); } else { 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; } methodSearchNew.setIndex(index); index++; } // 查询签名地址 String writeUserUrl = UserUtils.getUserSignatureUrl(Integer.valueOf(writeUserId)); String ratifyUserUrl = UserUtils.getUserSignatureUrl(Integer.valueOf(ratifyUserId)); //创建ExcelWriter 可以自动关流但还是手动关一次 ExcelWriter excelWriter = null; try { // outputStream:要导出的文件的输出流 OutputStream outputStream = response.getOutputStream(); // 获取模版文件 ClassPathResource classPathResource = new ClassPathResource("/static/excel/check-records.xlsx"); // 使用模版文件的两种方式: // 1、文件路径:.withTemplate(templateFileName) // 2、输入流:.withTemplate(inputStream) // String templateFileName = classPathResource.getFile().getPath(); InputStream inputStream = classPathResource.getInputStream(); // 创建ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).build(); // 获取第一个sheet页 WriteSheet writeSheet = EasyExcel.writerSheet(0, "标准查新导出").build(); //excelWriter.fill() 这地方就是填充属性。 // excelWriter.fill(methodSearchNews, fillConfig, writeSheet); excelWriter.fill(methodSearchNews, writeSheet); // 这里easy excel模板导出问题 会删除后面内容再进行进行填充 // 所以list 后面还有数据 想办法手动写入 // 手动创建一个list 存放数据 然后再进行填充 // 这里List可以用对象代替 偷懒用list List> totalListList = ListUtils.newArrayList(); List totalList = ListUtils.newArrayList(); totalListList.add(totalList); // 第一列 totalList.add("查新人:"); // 第二列 设置签名 totalList.add(FileUtils.readFileToByteArray(new File(writeUserUrl))); // 第三列 totalList.add("日期:"); // 第五列 totalList.add("2024-12-23"); // 日期写死 // 第六列 totalList.add("审核:"); // 第七列 totalList.add(FileUtils.readFileToByteArray(new File(ratifyUserUrl))); // 第八列 totalList.add("日期:"); // 第九列 totalList.add("2024-12-23"); // 日期写死 // 这里是write 别和fill 搞错了 excelWriter.write(totalListList, writeSheet); // 设置输出流格式以及文件名: response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode( "原材料检测信息导出", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); } catch (Exception e) { throw new RuntimeException(e); } finally { // 千万别忘记close关闭流 if (excelWriter != null) { excelWriter.close(); } } } /** * 导入标准查新 * @param file * @return */ @Override public boolean importMethodSearchNew(MultipartFile file) { List searchNewDtoList = new ArrayList<>(); try { // excel解析 EasyExcel.read(file.getInputStream(), ProcessMethodSearchNewDto.class, new AnalysisEventListener() { @Override public void invoke(ProcessMethodSearchNewDto searchNewDto, AnalysisContext analysisContext) { searchNewDtoList.add(searchNewDto); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }).sheet().doRead(); // 格式化查新对象 List 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) { throw new RuntimeException(e); } return true; } }