package com.ruoyi.process.listener; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.basic.event.StandardMethodSavedEvent; import com.ruoyi.basic.mapper.StandardMethodMapper; import com.ruoyi.basic.pojo.StandardMethod; import com.ruoyi.process.mapper.ProcessMethodSearchNewFileSeqMapper; import com.ruoyi.process.mapper.ProcessMethodSearchNewMapper; import com.ruoyi.process.pojo.ProcessMethodSearchNew; import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; /** 根据标准维护保存动作同步生成、归档标准查新记录。 */ @Component @RequiredArgsConstructor public class StandardMethodSearchNewListener { private static final ZoneId CHINA_ZONE = ZoneId.of("Asia/Shanghai"); private static final DateTimeFormatter FILE_DATE = DateTimeFormatter.BASIC_ISO_DATE; private final StandardMethodMapper standardMethodMapper; private final ProcessMethodSearchNewMapper searchNewMapper; private final ProcessMethodSearchNewFileSeqMapper fileSeqMapper; @EventListener public void onStandardMethodSaved(StandardMethodSavedEvent event) { if (!Integer.valueOf(1).equals(event.getNeedSearchNew())) { return; } StandardMethod standard = standardMethodMapper.selectOne(Wrappers.lambdaQuery() .eq(StandardMethod::getId, event.getStandardMethodId()) .last("FOR UPDATE")); if (standard == null) { return; } ProcessMethodSearchNew current = searchNewMapper.selectOne(Wrappers.lambdaQuery() .eq(ProcessMethodSearchNew::getCurrentAutoStandardId, event.getStandardMethodId()) .last("FOR UPDATE")); if (!event.isEdit() && current != null) { return; } LocalDateTime now = LocalDateTime.now(CHINA_ZONE); if (current != null) { searchNewMapper.update(null, Wrappers.lambdaUpdate() .eq(ProcessMethodSearchNew::getMethodSearchNewId, current.getMethodSearchNewId()) .set(ProcessMethodSearchNew::getIsNewStandard, 0) .set(ProcessMethodSearchNew::getIsAutoArchived, 1) .set(ProcessMethodSearchNew::getCurrentAutoStandardId, null) .set(ProcessMethodSearchNew::getAutoArchivedTime, now)); } ProcessMethodSearchNew created = new ProcessMethodSearchNew(); created.setMethodName(event.getName()); created.setStandardNo(event.getCode()); created.setFileNo(nextFileNo(now.toLocalDate())); created.setIsNewStandard(1); created.setSearchNewSource(null); created.setStandardMethodId(event.getStandardMethodId()); created.setCurrentAutoStandardId(event.getStandardMethodId()); created.setIsAutoArchived(0); searchNewMapper.insert(created); } private String nextFileNo(LocalDate date) { String prefix = date.format(FILE_DATE); fileSeqMapper.insertIfAbsent(date); Integer stored = fileSeqMapper.selectForUpdate(date); Integer existing = fileSeqMapper.selectMaxExisting(prefix); int next = Math.max(stored == null ? 0 : stored, existing == null ? 0 : existing) + 1; fileSeqMapper.updateValue(date, next); return prefix + String.format("%03d", next); } }