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.<StandardMethod>lambdaQuery()
|
.eq(StandardMethod::getId, event.getStandardMethodId())
|
.last("FOR UPDATE"));
|
if (standard == null) {
|
return;
|
}
|
|
ProcessMethodSearchNew current = searchNewMapper.selectOne(Wrappers.<ProcessMethodSearchNew>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.<ProcessMethodSearchNew>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);
|
}
|
}
|