liding
18 小时以前 f7ba5f3fb17abf09b6bd3980c46761c2431a4c31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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);
    }
}