package jnpf.dmsService.center;
|
|
import jnpf.dmsIntegration.audit.DmsBusinessChangeAudit;
|
import static jnpf.dmsIntegration.audit.DmsBusinessChangeAudit.values;
|
|
import jnpf.dmsEntity.permission.entity.DmsDocumentEntity;
|
import jnpf.dmsMapper.DmsDocumentMapper;
|
import jnpf.exception.DataException;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import java.util.*;
|
|
/** Dedicated logical directory ownership. Historical records retain their membership. */
|
@Service
|
@RequiredArgsConstructor
|
public class DmsCenterDirectoryService {
|
private final DmsBusinessChangeAudit businessAudit;
|
private final DmsDocumentMapper documents;
|
|
@Transactional(rollbackFor = Exception.class)
|
public void bind(String tenantId, UUID mainDocumentId, Collection<UUID> recordDocumentIds) {
|
if (tenantId == null || tenantId.isBlank() || mainDocumentId == null || recordDocumentIds == null
|
|| recordDocumentIds.stream().anyMatch(Objects::isNull) || recordDocumentIds.contains(mainDocumentId))
|
throw new DataException("文件目录归属请求无效");
|
Set<UUID> ids = new TreeSet<>(); ids.add(mainDocumentId); ids.addAll(recordDocumentIds);
|
Map<UUID, DmsDocumentEntity> locked = new HashMap<>();
|
for (UUID id : ids) {
|
DmsDocumentEntity document = documents.selectByTenantAndIdForUpdate(tenantId, id);
|
if (document == null) throw new DataException("文件目录成员不存在");
|
locked.put(id, document);
|
}
|
DmsDocumentEntity main = locked.get(mainDocumentId);
|
if (main.getMainDocumentId() != null) throw new DataException("记录文件不能作为主文件目录");
|
for (UUID id : recordDocumentIds) {
|
DmsDocumentEntity record = locked.get(id);
|
if (!Objects.equals(main.getFolderId(), record.getFolderId()))
|
throw new DataException("记录与主文件的上级目录不一致");
|
if (record.getMainDocumentId() != null) {
|
if (!mainDocumentId.equals(record.getMainDocumentId()))
|
throw new DataException("记录已属于其他主文件目录");
|
continue;
|
}
|
if (documents.countRecords(tenantId, id) != 0)
|
throw new DataException("已有记录的主文件不能转为记录");
|
if (documents.bindMainDocument(tenantId, id, mainDocumentId) != 1)
|
throw new DataException("记录目录归属发生变化");
|
businessAudit.record(tenantId, "DMS_CENTER_BIND_DIRECTORY", "记录文件归属绑定", "dms_documents", id.toString(),
|
values("main_document_id", record.getMainDocumentId()), values("main_document_id", mainDocumentId),
|
null, values("document_id", id, "main_document_id", mainDocumentId));
|
}
|
}
|
}
|