刘光辉
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
package jnpf.dmsService;
 
import com.fasterxml.jackson.databind.JsonNode;
import jnpf.dmsMapper.DmsVersionPropertiesMapper;
import jnpf.dmsEntity.permission.entity.DmsFileVersionEntity;
import jnpf.exception.DataException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
import java.util.UUID;
 
/** Version persistence only: no business-form, workflow or user-directory lookup. */
@Service
@RequiredArgsConstructor
public class DmsVersionPropertiesService {
    private final DmsVersionPropertiesMapper mapper;
 
    /** Insert metadata and optional snapshot together: persisted versions reject snapshot-only updates. */
    public void insertVersion(DmsFileVersionEntity version, JsonNode properties) {
        String snapshot = null;
        if (properties != null && !properties.isNull()) {
            validate(properties);
            snapshot = properties.toString();
        }
        if (mapper.insertVersion(version, snapshot) != 1)
            throw new DataException("文件版本及扩展属性保存失败");
    }
 
    public void verifyRetry(String tenant, UUID version, JsonNode properties) {
        // Old callers may omit the optional extension; omission must never clear a snapshot.
        if (properties == null || properties.isNull()) return;
        validate(properties);
        var saved = mapper.find(tenant, version);
        if (saved == null || !Objects.equals(saved.getExtendedProperties(), properties))
            throw new DataException("重复登记的文件版本扩展属性不一致");
    }
 
    private void validate(JsonNode value) {
        if (!value.isObject() || value.toString().getBytes(StandardCharsets.UTF_8).length > 32768)
            throw new DataException("文件版本扩展属性必须为不超过32KB的JSON对象");
        if (value.has("prepared_by_name") && !value.get("prepared_by_name").isTextual())
            throw new DataException("制定人姓名快照必须为文本");
        if (value.has("reviewers")) {
            if (!value.get("reviewers").isArray()) throw new DataException("审核人快照必须为数组");
            for (JsonNode reviewer : value.get("reviewers")) {
                if (!reviewer.isObject() || !reviewer.path("user_id").isTextual()
                        || reviewer.path("user_id").asText().isBlank() || !reviewer.path("name").isTextual())
                    throw new DataException("审核人快照缺少人员ID或姓名");
            }
        }
    }
}