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.metadata.data.ImageData; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.util.FileUtils; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; 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.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; 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)); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("UTF-8"); try { // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("原材料检测信息导出", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); // 创建 ExcelWriter ServletOutputStream outputStream = response.getOutputStream(); ExcelWriter excelWriter = EasyExcel.write(outputStream).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build(); // 获取 sheet0 对象 WriteSheet mainSheet = EasyExcel.writerSheet(0, "标准查新导出").head(ProcessMethodSearchNewDto.class).build(); // 图片对象 ImageData imageData = new ImageData(); ImageData imageData1 = new ImageData(); // 设置图片数据 imageData.setImage(FileUtils.readFileToByteArray(new File(writeUserUrl))); // 设置编制人图片的文件路径 imageData1.setImage(FileUtils.readFileToByteArray(new File(ratifyUserUrl))); // 设置批准人图片的文件路径 // 设置编制人图片位置 imageData.setRelativeFirstRowIndex(1); imageData.setRelativeFirstColumnIndex(2); imageData.setRelativeLastRowIndex(1); imageData.setRelativeLastColumnIndex(2); // 设置批准人图片位置 imageData1.setRelativeFirstRowIndex(1); imageData1.setRelativeFirstColumnIndex(4); imageData1.setRelativeLastRowIndex(1); imageData1.setRelativeLastColumnIndex(4); List list = new ArrayList<>(); // 放入列表中 list.add(imageData); list.add(imageData1); // // 设置额外的文字(可选) // WriteCellData writeCellData = new WriteCellData<>(); //// imageDemoData.setWriteCellDataFile(writeCellData); // // 这里可以设置为 EMPTY 则代表不需要其他数据了 // writeCellData.setType(CellDataTypeEnum.STRING); // writeCellData.setStringValue("额外的放一些文字"); // 将图片数据设置到单元格中 WriteCellData writeCellData = new WriteCellData<>(); writeCellData.setImageDataList(list); // 创建数据列表 List> dataList = new ArrayList<>(); List rowData = new ArrayList<>(); rowData.add(writeCellData); // 把图片放入一行 dataList.add(rowData); // 向 sheet0 写入数据(传入空list这样只导出表头) excelWriter.write(methodSearchNews, mainSheet); // 写入 图片 excelWriter.write(dataList,mainSheet); //关闭流 excelWriter.finish(); } catch (IOException e) { throw new RuntimeException("导出失败"); } } /** * 导入标准查新 * @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; } }