刘光辉
4 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package jnpf.dmsService;
 
import jnpf.dmsBusinessOccupancy.BusinessFileExpiryGate;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.UUID;
 
/** One coordinated rollout switch. Must stay off until acquisition, completion and all consumers pass. */
@Component
public class DmsBusinessLifecycleGuard {
    private final boolean enabled;
    private final BusinessFileExpiryGate expiry;
    private final jnpf.dmsBusinessOccupancy.BusinessFileExecutionService execution;
    public DmsBusinessLifecycleGuard(SqlSessionTemplate sessions,
            @Value("${dms.business-occupancy.enabled:false}") boolean enabled) {
        this.enabled = enabled;
        this.execution = enabled ? new jnpf.dmsBusinessOccupancy.BusinessFileExecutionService(sessions) : null;
        this.expiry = enabled ? new BusinessFileExpiryGate(sessions) : null;
    }
    /** Native source is reconstructed by the approved audit loader; no posted subset or chain. */
    public void requireAuditSource(jnpf.dmsEntity.storage.approval.DmsApprovedBatch source) {
        if(!enabled) return;
        var rows = "wailai_wenjian_xinzeng_shenhe".equals(source.getAuditType())
                ? requireExternalCreation(source)
                : "xiuding_shenhe".equals(source.getAuditType())
                    ? execution.requireRevision(source.getTenantId(),source.getAuditId())
                    : execution.requireCreation(source.getTenantId(),source.getAuditId());
        verifySourceCoverage(rows,source.getItems());
    }
    private java.util.List<jnpf.dmsBusinessOccupancy.BusinessFileOccupancy> requireExternalCreation(
            jnpf.dmsEntity.storage.approval.DmsApprovedBatch source) {
        if (source.getItems() == null || source.getItems().size() != 1
                || !"CREATE".equals(source.getItems().get(0).getChangeType()))
            throw new jnpf.exception.DataException("外来文件批准来源必须只有一份新文件");
        return execution.requireExternalCreation(source.getTenantId(), source.getAuditId(),
                source.getTaskId(), source.getItems().get(0).getDocumentNo());
    }
    /** Exact one-to-one match before center registration/activation; caller already verified receipts. */
    public static void verifySourceCoverage(java.util.List<jnpf.dmsBusinessOccupancy.BusinessFileOccupancy> businessReceipts,
            java.util.List<jnpf.dmsEntity.storage.approval.DmsApprovedItem> items) {
        var numbers=new java.util.HashSet<String>();
        for(var item:items) {
            var matching=businessReceipts.stream().filter(row->"CREATE".equals(item.getChangeType())
                    ? "CREATE".equals(row.getOperation()) && java.util.Objects.equals(item.getDocumentNo(),row.getFileNumber())
                    : item.getBaseFileVersionId()!=null && java.util.Objects.equals(item.getBaseFileVersionId().toString(),row.getCenterVersionId()))
                    .toList();
            if(matching.size()!=1 || !numbers.add(matching.get(0).getFileNumber()))
                throw new jnpf.exception.DataException("审核来源没有唯一匹配的业务占用");
        }
        if(numbers.size()!=businessReceipts.size()) throw new jnpf.exception.DataException("审核来源与业务占用集合不一致");
    }
    public boolean isEnabled() { return enabled; }
    public void guardStandaloneActivation(String tenant,UUID versionId) {
        if(enabled) execution.guardStandaloneActivation(tenant,versionId.toString());
    }
    public void guardStandaloneRegistration(String tenant,String fileNumber) {
        if(enabled) execution.guardStandaloneRegistration(tenant,fileNumber);
    }
    public java.util.List<jnpf.dmsBusinessOccupancy.BusinessFileOccupancy> requireCurrentUserExtension(
            String task,String application,java.util.Collection<String> fileIds) {
        if(!enabled) return java.util.List.of();
        String tenant=jnpf.util.UserProvider.getUser().getTenantId();
        return execution.requireExtension(tenant==null || tenant.isBlank() ? "0" : tenant,application,task,fileIds);
    }
    public java.util.List<jnpf.dmsBusinessOccupancy.BusinessFileOccupancy> requireCurrentUserExecution(
            String task,String application,String operation,java.util.Collection<String> fileIds) {
        if(!enabled) return java.util.List.of();
        String tenant=jnpf.util.UserProvider.getUser().getTenantId();
        return execution.require(tenant==null || tenant.isBlank() ? "0" : tenant,task,application,task,operation,fileIds);
    }
    public java.util.List<jnpf.dmsBusinessOccupancy.BusinessFileOccupancy> requireExecution(
            String tenant,String task,String application,String operation,java.util.Collection<String> fileIds) {
        return enabled ? execution.require(tenant,task,application,task,operation,fileIds) : java.util.List.of();
    }
    public java.util.List<jnpf.dmsBusinessOccupancy.BusinessFileOccupancy> requireRevision(String tenant,String auditId) {
        return enabled ? execution.requireRevision(tenant,auditId) : java.util.List.of();
    }
    public java.util.List<jnpf.dmsBusinessOccupancy.BusinessFileOccupancy> requireCreation(String tenant,String auditId) {
        return enabled ? execution.requireCreation(tenant,auditId) : java.util.List.of();
    }
    public java.util.List<jnpf.dmsBusinessOccupancy.BusinessFileOccupancy> requireExternalCreation(
            String tenant, String auditId, String taskId, String fileNumber) {
        return enabled ? execution.requireExternalCreation(tenant, auditId, taskId, fileNumber) : java.util.List.of();
    }
    public void guardValidity(String tenant,String task,java.util.Collection<String> versions) {
        if(enabled) execution.guardValidity(tenant,task,versions);
    }
    public void guardNumbers(String tenant,String chain,java.util.Collection<String> numbers) {
        if(enabled) execution.guardNumbers(tenant,chain,numbers);
    }
    public void guardVersions(String tenant,String chain,java.util.Collection<String> versions) {
        if(enabled) execution.guardVersions(tenant,chain,versions);
    }
    public void completeExecution(java.util.List<jnpf.dmsBusinessOccupancy.BusinessFileOccupancy> receipts) {
        if(enabled) execution.complete(receipts);
    }
    public java.util.List<jnpf.dmsBusinessOccupancy.BusinessFileOccupancy> terminationCandidates(String afterId,int limit) {
        return enabled ? execution.terminationCandidates(afterId,limit) : java.util.List.of();
    }
    @org.springframework.transaction.annotation.Transactional(rollbackFor=Exception.class)
    public boolean releaseEnded(jnpf.dmsBusinessOccupancy.BusinessFileOccupancy candidate) {
        return enabled && execution.releaseEnded(candidate);
    }
    public boolean tryEnterExpiry(String tenantId, UUID centerVersionId) {
        return !enabled || expiry.tryEnter(tenantId, centerVersionId.toString());
    }
}