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或姓名");
|
}
|
}
|
}
|
}
|