package com.ruoyi.process.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.ruoyi.common.utils.QueryWrappers; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.inspect.util.UserUtils; import com.ruoyi.process.dto.ProcessMethodSearchNewArchivedDto; import com.ruoyi.process.dto.ProcessMethodSearchNewBackupsDto; import com.ruoyi.process.mapper.ProcessMethodSearchNewArchivedMapper; import com.ruoyi.process.mapper.ProcessMethodSearchNewBackupsMapper; import com.ruoyi.process.mapper.ProcessMethodSearchNewFileSeqMapper; import com.ruoyi.process.mapper.ProcessMethodSearchNewMapper; import com.ruoyi.process.mapper.ProcessMethodSearchNewHistoryMapper; import com.ruoyi.process.pojo.ProcessMethodSearchNew; import com.ruoyi.process.pojo.ProcessMethodSearchNewArchived; import com.ruoyi.process.pojo.ProcessMethodSearchNewBackups; import com.ruoyi.process.pojo.ProcessMethodSearchNewHistory; import com.ruoyi.process.service.ProcessMethodSearchNewBackupsService; import com.ruoyi.process.service.ProcessMethodSearchNewService; 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 jakarta.annotation.Resource; import jakarta.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.time.LocalDateTime; import java.time.LocalDate; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * 标准查新 * * @author zhuo * @since 2024-11-04 */ @Service @Transactional(rollbackFor = Exception.class) public class ProcessMethodSearchNewServiceImpl extends ServiceImpl implements ProcessMethodSearchNewService { private static final ZoneId CHINA_ZONE = ZoneId.of("Asia/Shanghai"); private static final DateTimeFormatter FILE_DATE = DateTimeFormatter.BASIC_ISO_DATE; @Resource private ProcessMethodSearchNewArchivedMapper processMethodSearchNewArchivedMapper; @Resource private ProcessMethodSearchNewBackupsService processMethodSearchNewBackupsService; @Resource private ProcessMethodSearchNewBackupsMapper processMethodSearchNewBackupsMapper; @Resource private ProcessMethodSearchNewHistoryMapper processMethodSearchNewHistoryMapper; @Resource private ProcessMethodSearchNewFileSeqMapper processMethodSearchNewFileSeqMapper; /** * 新增标准查新 * * @param processMethodSearchNewList * @return */ @Override @Transactional(rollbackFor = Exception.class) public boolean addMethodSearchNew(List processMethodSearchNewList) { if (processMethodSearchNewList == null || processMethodSearchNewList.isEmpty()) { throw new ErrorException("请填写标准查新记录"); } Integer userId = SecurityUtils.getUserId().intValue(); for (ProcessMethodSearchNew processMethodSearchNew : processMethodSearchNewList) { validateSearchRecord(processMethodSearchNew); processMethodSearchNew.setIsNewStandard(1); processMethodSearchNew.setIsAutoArchived(0); processMethodSearchNew.setStandardMethodId(null); processMethodSearchNew.setCurrentAutoStandardId(null); processMethodSearchNew.setAutoArchivedTime(null); processMethodSearchNew.setSearchNewUserId(userId); processMethodSearchNew.setRemark(toLegacyRemark(processMethodSearchNew.getSearchNewResult())); if (!Integer.valueOf(3).equals(processMethodSearchNew.getSearchNewSource())) { processMethodSearchNew.setSearchNewWebsite(null); } this.save(processMethodSearchNew); insertHistory(processMethodSearchNew, userId); handleSearchResult(processMethodSearchNew); } return true; } @Override public boolean updateMethodSearchNew(ProcessMethodSearchNew processMethodSearchNew) { ProcessMethodSearchNew old = getById(processMethodSearchNew.getMethodSearchNewId()); if (old == null) { throw new ErrorException("标准查新记录不存在"); } if (Integer.valueOf(1).equals(old.getIsAutoArchived())) { throw new ErrorException("已归档标准不能继续查新"); } processMethodSearchNew.setMethodName(old.getMethodName()); processMethodSearchNew.setStandardNo(old.getStandardNo()); processMethodSearchNew.setFileNo(old.getFileNo()); processMethodSearchNew.setStandardMethodId(old.getStandardMethodId()); validateSearchRecord(processMethodSearchNew); Integer userId = SecurityUtils.getUserId().intValue(); boolean updated = update(Wrappers.lambdaUpdate() .eq(ProcessMethodSearchNew::getMethodSearchNewId, old.getMethodSearchNewId()) .set(ProcessMethodSearchNew::getNewMethodName, processMethodSearchNew.getNewMethodName()) .set(ProcessMethodSearchNew::getNewStandardNo, processMethodSearchNew.getNewStandardNo()) .set(ProcessMethodSearchNew::getSearchNewSource, processMethodSearchNew.getSearchNewSource()) .set(ProcessMethodSearchNew::getSearchNewTime, processMethodSearchNew.getSearchNewTime()) .set(ProcessMethodSearchNew::getNextSearchDatePersisted, processMethodSearchNew.getNextSearchDatePersisted()) .set(ProcessMethodSearchNew::getSearchNewResult, processMethodSearchNew.getSearchNewResult()) .set(ProcessMethodSearchNew::getSearchNewUserId, userId) .set(ProcessMethodSearchNew::getSearchNewWebsite, Integer.valueOf(3).equals(processMethodSearchNew.getSearchNewSource()) ? processMethodSearchNew.getSearchNewWebsite() : null) .set(ProcessMethodSearchNew::getRemark, toLegacyRemark(processMethodSearchNew.getSearchNewResult())) .set(ProcessMethodSearchNew::getIsNewStandard, 1)); if (updated) { ProcessMethodSearchNew latest = getById(old.getMethodSearchNewId()); insertHistory(latest, userId); handleSearchResult(latest); } return updated; } @Override public boolean delMethodSearchNew(Integer methodSearchNewId) { if (methodSearchNewId == null) { throw new ErrorException("缺少标准查新记录id"); } ProcessMethodSearchNew old = getById(methodSearchNewId); if (old == null) { throw new ErrorException("标准查新记录不存在"); } if (Integer.valueOf(1).equals(old.getIsAutoArchived())) { throw new ErrorException("已归档标准不能删除"); } Long historyCount = processMethodSearchNewHistoryMapper.selectCount( Wrappers.lambdaQuery() .eq(ProcessMethodSearchNewHistory::getMethodSearchNewId, methodSearchNewId)); if (historyCount != null && historyCount > 0) { throw new ErrorException("该标准已有查新记录,不允许删除"); } return removeById(methodSearchNewId); } /** * 标准查新列表 * * @param processMethodSearchNew * @return */ @Override public IPage pageMethodSearchNew(Page page, ProcessMethodSearchNewBackupsDto processMethodSearchNew) { String beginDate = processMethodSearchNew.getBeginDate(); String endDate = processMethodSearchNew.getEndDate(); processMethodSearchNew.setBeginDate(null); processMethodSearchNew.setEndDate(null); IPage result = baseMapper.pageMethodSearchNew( page, QueryWrappers.queryWrappers(processMethodSearchNew), beginDate, endDate); LocalDate today = LocalDate.now(CHINA_ZONE); result.getRecords().forEach(item -> { LocalDate nextDate = item.getNextSearchDate(); if (nextDate == null) { item.setSearchDueStatus("待首次查新"); } else if (today.isAfter(nextDate)) { item.setSearchDueStatus("已逾期"); } else if (today.isEqual(nextDate)) { item.setSearchDueStatus("今日到期"); } else { item.setSearchDueStatus("未到期"); } }); return result; } @Override public List listSearchNewHistory(Integer methodSearchNewId) { if (methodSearchNewId == null) { throw new ErrorException("缺少标准查新记录id"); } if (getById(methodSearchNewId) == null) { throw new ErrorException("标准查新记录不存在"); } return processMethodSearchNewHistoryMapper.selectByMainId(methodSearchNewId); } @Override public IPage pageSearchNewHistory(Page page, String standardNo) { return processMethodSearchNewHistoryMapper.pageAll(page, StringUtils.isBlank(standardNo) ? null : standardNo.trim()); } private void validateSearchRecord(ProcessMethodSearchNew row) { if (row == null) { throw new ErrorException("请填写标准查新记录"); } if (StringUtils.isBlank(row.getMethodName()) || StringUtils.isBlank(row.getStandardNo()) || StringUtils.isBlank(row.getFileNo())) { throw new ErrorException("请填写标准名称、标准号和文件编号"); } if (row.getSearchNewTime() == null) { throw new ErrorException("请选择查新日期"); } row.setSearchNewTime(row.getSearchNewTime().toLocalDate().atStartOfDay()); if (!"现行有效".equals(row.getSearchNewResult()) && !"已修订/有新版本替代".equals(row.getSearchNewResult()) && !"废止(无替代)".equals(row.getSearchNewResult()) && !"即将实施".equals(row.getSearchNewResult())) { throw new ErrorException("请选择有效的查新结果"); } Integer source = row.getSearchNewSource(); if (source == null || source < 3 || source > 8) { throw new ErrorException("请选择有效的查新记录来源"); } if ("已修订/有新版本替代".equals(row.getSearchNewResult()) && (StringUtils.isBlank(row.getNewMethodName()) || StringUtils.isBlank(row.getNewStandardNo()))) { throw new ErrorException("查新结果为已修订/有新版本替代时,请填写新标准名称和新标准号"); } if (!"已修订/有新版本替代".equals(row.getSearchNewResult())) { row.setNewMethodName(null); row.setNewStandardNo(null); } if (!Integer.valueOf(3).equals(source)) { row.setSearchNewWebsite(null); } if ("已修订/有新版本替代".equals(row.getSearchNewResult()) || "废止(无替代)".equals(row.getSearchNewResult())) { row.setNextSearchDate(null); } else if (row.getNextSearchDate() == null) { row.setNextSearchDate(row.getSearchNewTime().toLocalDate().plusMonths(3)); } row.setNextSearchDatePersisted(row.getNextSearchDate()); } private Integer toLegacyRemark(String result) { if ("废止(无替代)".equals(result)) return 0; if ("已修订/有新版本替代".equals(result)) return 1; return null; } private void insertHistory(ProcessMethodSearchNew row, Integer userId) { ProcessMethodSearchNewHistory history = new ProcessMethodSearchNewHistory(); history.setMethodSearchNewId(row.getMethodSearchNewId()); history.setStandardMethodId(row.getStandardMethodId()); history.setMethodName(row.getMethodName()); history.setStandardNo(row.getStandardNo()); history.setFileNo(row.getFileNo()); history.setSearchNewDate(row.getSearchNewTime().toLocalDate()); history.setNextSearchDate(row.getNextSearchDatePersisted()); history.setSearchNewResult(row.getSearchNewResult()); history.setSearchNewSource(row.getSearchNewSource()); history.setSearchNewWebsite(row.getSearchNewWebsite()); history.setNewMethodName(row.getNewMethodName()); history.setNewStandardNo(row.getNewStandardNo()); history.setSearchNewUserId(userId); history.setCreateTime(LocalDateTime.now(CHINA_ZONE)); processMethodSearchNewHistoryMapper.insert(history); } /** 旧标准只保留在查新记录;有新版时创建新的主列表记录。 */ private void handleSearchResult(ProcessMethodSearchNew oldStandard) { String result = oldStandard.getSearchNewResult(); if (!"废止(无替代)".equals(result) && !"已修订/有新版本替代".equals(result)) { return; } LocalDateTime now = LocalDateTime.now(CHINA_ZONE); update(Wrappers.lambdaUpdate() .eq(ProcessMethodSearchNew::getMethodSearchNewId, oldStandard.getMethodSearchNewId()) .set(ProcessMethodSearchNew::getIsNewStandard, 0) .set(ProcessMethodSearchNew::getIsAutoArchived, 1) .set(ProcessMethodSearchNew::getCurrentAutoStandardId, null) .set(ProcessMethodSearchNew::getAutoArchivedTime, now)); if (!"已修订/有新版本替代".equals(result)) { return; } if (count(Wrappers.lambdaQuery() .eq(ProcessMethodSearchNew::getStandardNo, oldStandard.getNewStandardNo()) .eq(ProcessMethodSearchNew::getIsAutoArchived, 0)) > 0) { return; } ProcessMethodSearchNew replacement = new ProcessMethodSearchNew(); replacement.setMethodName(oldStandard.getNewMethodName()); replacement.setStandardNo(oldStandard.getNewStandardNo()); replacement.setFileNo(nextFileNo(now.toLocalDate())); replacement.setIsNewStandard(1); replacement.setStandardMethodId(oldStandard.getStandardMethodId()); replacement.setCurrentAutoStandardId(oldStandard.getCurrentAutoStandardId()); replacement.setIsAutoArchived(0); save(replacement); } private String nextFileNo(LocalDate date) { String prefix = date.format(FILE_DATE); processMethodSearchNewFileSeqMapper.insertIfAbsent(date); Integer stored = processMethodSearchNewFileSeqMapper.selectForUpdate(date); Integer existing = processMethodSearchNewFileSeqMapper.selectMaxExisting(prefix); int next = Math.max(stored == null ? 0 : stored, existing == null ? 0 : existing) + 1; processMethodSearchNewFileSeqMapper.updateValue(date, next); return prefix + String.format("%03d", next); } /** * 标准查新导出 * * @param archivedId * @param response */ @Override public void exportMethodSearchNew(Integer archivedId, HttpServletResponse response) { // 查询标准查新存档信息 DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); ProcessMethodSearchNewArchived methodSearchNewArchived = processMethodSearchNewArchivedMapper.selectById(archivedId); Integer writeUserId = methodSearchNewArchived.getWriteUserId(); Integer ratifyUserId = methodSearchNewArchived.getRatifyUserId(); String writeDate = methodSearchNewArchived.getWriteTime() == null ? null : methodSearchNewArchived.getWriteTime().format(timeFormatter); String ratifyDate =methodSearchNewArchived.getRatifyTime() == null ? null : methodSearchNewArchived.getRatifyTime().format(timeFormatter); // 查询存档备份 List methodSearchNewBackups = processMethodSearchNewBackupsMapper.selectList(Wrappers.lambdaQuery() .eq(ProcessMethodSearchNewBackups::getArchivedId, archivedId)); int index = 1; // 格式化参数 List methodSearchNews = new ArrayList<>(); for (ProcessMethodSearchNewBackups methodSearchNew : methodSearchNewBackups) { ProcessMethodSearchNewBackupsDto searchNewBackupsDto = new ProcessMethodSearchNewBackupsDto(); BeanUtils.copyProperties(methodSearchNew, searchNewBackupsDto); searchNewBackupsDto.setSearchNewDateString(methodSearchNew.getSearchNewTime() == null ? null : methodSearchNew.getSearchNewTime().format(timeFormatter)); searchNewBackupsDto.setSearchNewResultString(methodSearchNew.getSearchNewResult()); if (methodSearchNew.getSearchNewSource() != null) switch (methodSearchNew.getSearchNewSource()) { case 0: searchNewBackupsDto.setOther("√"); searchNewBackupsDto.setOtherWebsite("标准网(历史来源)"); break; case 1: searchNewBackupsDto.setOther("√"); searchNewBackupsDto.setOtherWebsite("委托情报所(历史来源)"); break; case 2: searchNewBackupsDto.setOther("√"); searchNewBackupsDto.setOtherWebsite("标准书店(历史来源)"); break; case 4: searchNewBackupsDto.setStandardizationAdministration("√"); break; case 5: searchNewBackupsDto.setMarketRegulation("√"); break; case 6: searchNewBackupsDto.setNationalStandardInfo("√"); break; case 7: searchNewBackupsDto.setNationalStandardFullText("√"); break; case 8: searchNewBackupsDto.setIndustryStandard("√"); break; case 3: searchNewBackupsDto.setOther("√"); searchNewBackupsDto.setOtherWebsite(methodSearchNew.getSearchNewWebsite()); break; } searchNewBackupsDto.setIndex(index); methodSearchNews.add(searchNewBackupsDto); index++; } // 查询签名地址 String writeUserUrl = UserUtils.getUserSignatureUrl(writeUserId); String ratifyUserUrl = UserUtils.getUserSignatureUrl(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); // 这里fillConfig是配置文件 excelWriter.fill(methodSearchNews, writeSheet); // 这里easy excel模板导出问题 会删除后面内容再进行进行填充 // 所以list 后面还有数据 想办法手动写入 // 手动创建一个list 存放数据 然后再进行填充 // 这里List可以用对象代替 偷懒用list List> totalListList = ListUtils.newArrayList(); List totalList = ListUtils.newArrayList(); totalListList.add(totalList); // 第一列 totalList.add("编制人:"); // 第二列 设置签名 if (StringUtils.isNotBlank(writeUserUrl)) { totalList.add(FileUtils.readFileToByteArray(new File(writeUserUrl))); } // 第三列 totalList.add("日期:"); // 第五列 totalList.add(writeDate); // 第六列 totalList.add("审核:"); // 第七列 if (StringUtils.isNotBlank(ratifyUserUrl)) { totalList.add(FileUtils.readFileToByteArray(new File(ratifyUserUrl))); } // 第八列 totalList.add("日期:"); // 第九列 totalList.add(ratifyDate); // 这里追加是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(), ProcessMethodSearchNewBackupsDto.class, new AnalysisEventListener() { @Override public void invoke(ProcessMethodSearchNewBackupsDto 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.getSearchNewDateString())) { String dateText = searchNewDto.getSearchNewDateString().trim(); searchNew.setSearchNewTime(LocalDate.parse(dateText.substring(0, Math.min(10, dateText.length()))).atStartOfDay()); } searchNew.setSearchNewResult(searchNewDto.getSearchNewResultString()); int sourceCount = 0; if (StringUtils.isNotBlank(searchNewDto.getStandardizationAdministration())) sourceCount++; if (StringUtils.isNotBlank(searchNewDto.getMarketRegulation())) sourceCount++; if (StringUtils.isNotBlank(searchNewDto.getNationalStandardInfo())) sourceCount++; if (StringUtils.isNotBlank(searchNewDto.getNationalStandardFullText())) sourceCount++; if (StringUtils.isNotBlank(searchNewDto.getIndustryStandard())) sourceCount++; if (StringUtils.isNotBlank(searchNewDto.getOther())) sourceCount++; if (sourceCount != 1) { throw new ErrorException("标准号" + searchNew.getStandardNo() + "必须且只能选择一个查新来源"); } // 查新记录 if (StringUtils.isNotBlank(searchNewDto.getStandardizationAdministration())) { searchNew.setSearchNewSource(4); } else if (StringUtils.isNotBlank(searchNewDto.getMarketRegulation())) { searchNew.setSearchNewSource(5); } else if (StringUtils.isNotBlank(searchNewDto.getNationalStandardInfo())) { searchNew.setSearchNewSource(6); } else if (StringUtils.isNotBlank(searchNewDto.getNationalStandardFullText())) { searchNew.setSearchNewSource(7); } else if (StringUtils.isNotBlank(searchNewDto.getIndustryStandard())) { searchNew.setSearchNewSource(8); } else if (StringUtils.isNotBlank(searchNewDto.getOther())) { searchNew.setSearchNewSource(3); searchNew.setSearchNewWebsite(searchNewDto.getOtherWebsite()); } return searchNew; }).collect(Collectors.toList()); addMethodSearchNew(collect); } catch (IOException e) { throw new RuntimeException(e); } return true; } /** * 新增标准查新审批流程 * @param archived * @return */ @Override public boolean addSearchNewArchived(ProcessMethodSearchNewArchived archived) { // 新增存档 Integer userId = SecurityUtils.getUserId().intValue(); archived.setWriteUserId(userId); archived.setWriteTime(LocalDateTime.now()); processMethodSearchNewArchivedMapper.insert(archived); // 查询所有的标准查新 List searchNewList = this.list(Wrappers.lambdaQuery() .eq(ProcessMethodSearchNew::getIsAutoArchived, 0)); // 新增复制 List methodSearchNewBackups = searchNewList.stream().map(processMethodSearchNew -> { ProcessMethodSearchNewBackups backups = new ProcessMethodSearchNewBackups(); BeanUtils.copyProperties(processMethodSearchNew, backups); backups.setNextSearchDate(processMethodSearchNew.getNextSearchDatePersisted()); backups.setIsNewStandard(0); backups.setArchivedId(archived.getArchivedId()); return backups; }).collect(Collectors.toList()); processMethodSearchNewBackupsService.saveBatch(methodSearchNewBackups); return true; } /** * 查询存档 * @param page * @param archived * @return */ @Override public IPage pageSearchNewArchived(Page page, ProcessMethodSearchNewArchivedDto archived) { return processMethodSearchNewArchivedMapper.pageSearchNewArchived(page, QueryWrappers.queryWrappers(archived)); } /** * 查询存档备份列表 * @param page * @param backups * @return */ @Override public IPage pageSearchNewBackups(Page page, ProcessMethodSearchNewBackups backups) { if (backups.getArchivedId() == null) { throw new ErrorException("缺少存档id"); } return processMethodSearchNewBackupsMapper.pageSearchNewBackups(page, QueryWrappers.queryWrappers(backups)); } /** * 存档批准 * @param archived * @return */ @Override public boolean ratifySearchNewArchivedr(ProcessMethodSearchNewArchived archived) { // 当前登录用户 Integer userId = SecurityUtils.getUserId().intValue(); processMethodSearchNewArchivedMapper.update(null, Wrappers.lambdaUpdate() .eq(ProcessMethodSearchNewArchived::getArchivedId, archived.getArchivedId()) .set(ProcessMethodSearchNewArchived::getRatifyUserId, userId) .set(ProcessMethodSearchNewArchived::getRatifyRemark, archived.getRatifyRemark()) .set(ProcessMethodSearchNewArchived::getRatifyStatus, archived.getRatifyStatus()) .set(ProcessMethodSearchNewArchived::getRatifyTime, LocalDateTime.now()) ); return true; } }