From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsService/DmsFileUploadService.java |  182 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 182 insertions(+), 0 deletions(-)

diff --git a/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsService/DmsFileUploadService.java b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsService/DmsFileUploadService.java
new file mode 100644
index 0000000..d41ef07
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsService/DmsFileUploadService.java
@@ -0,0 +1,182 @@
+package jnpf.dmsService;
+
+import jnpf.base.UserInfo;
+import jnpf.dmsEntity.permission.entity.DmsDocumentEntity;
+import jnpf.dmsEntity.permission.entity.DmsFileVersionEntity;
+import jnpf.dmsEntity.permission.entity.DmsPermissionResourceEntity;
+import jnpf.dmsEntity.permission.enums.DmsPermissionAction;
+import jnpf.dmsEntity.permission.enums.DmsResourceType;
+import jnpf.dmsEntity.storage.entity.DmsFileObjectEntity;
+import jnpf.dmsEntity.storage.form.DmsFileUploadRegisterForm;
+import jnpf.dmsEntity.storage.vo.DmsFileUploadVO;
+import jnpf.dmsIntegration.audit.DmsAuditAdapter;
+import jnpf.dmsMapper.DmsDocumentMapper;
+import jnpf.dmsMapper.DmsFileObjectMapper;
+import jnpf.dmsMapper.DmsFileVersionMapper;
+import jnpf.dmsMapper.DmsPermissionResourceMapper;
+import jnpf.dmsMapper.DmsVersionStateMapper;
+import jnpf.dmsPermission.DmsCurrentIdentity;
+import jnpf.dmsPermission.DmsPermissionError;
+import jnpf.dmsPermission.DmsPermissionException;
+import lombok.RequiredArgsConstructor;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Locale;
+import java.util.Objects;
+
+@Service
+@RequiredArgsConstructor
+public class DmsFileUploadService {
+    private static final String SOURCE_PREFIX = "upload:";
+
+    private final DmsCurrentIdentity currentIdentity;
+    private final DmsPermissionDecisionService decisionService;
+    private final DmsDocumentMapper documentMapper;
+    private final DmsFileVersionMapper fileVersionMapper;
+    private final DmsPermissionResourceMapper resourceMapper;
+    private final DmsFileObjectMapper fileObjectMapper;
+    private final DmsVersionStateMapper versionStateMapper;
+    private final DmsAuditAdapter auditAdapter;
+
+    @Transactional
+    public DmsFileUploadVO register(DmsFileUploadRegisterForm form, String serviceId) {
+        UserInfo user = currentIdentity.requireUser();
+        String tenantId = currentIdentity.tenantId(user);
+        String sourceId = form.getSourceId().trim();
+        decisionService.requireAllowed(DmsResourceType.FOLDER, form.getFolderId(), DmsPermissionAction.CREATE);
+
+        DmsFileUploadVO existing = fileObjectMapper.selectUploadBySource(tenantId, serviceId, sourceId);
+        if (existing != null) {
+            validateRetry(existing, form);
+            return existing;
+        }
+
+        try {
+            insertDocument(form, tenantId, user.getUserId(), serviceId, sourceId);
+            insertFileVersion(form, tenantId, user.getUserId(), serviceId, sourceId);
+            insertDirectEffectiveState(form, tenantId, user.getUserId());
+            insertFileObject(form, tenantId, user.getUserId(), serviceId, sourceId);
+        } catch (DuplicateKeyException exception) {
+            throw conflict("涓婁紶鐧昏鐨勮祫婧� ID銆乻ource_id銆佺増鏈彿鎴栧璞¢敭宸茶鍗犵敤", exception);
+        }
+
+        auditAdapter.dataChange("CREATE", "涓婁紶 DMS 鏂囦欢", "dms_file_objects",
+                form.getFileObjectId().toString(), null,
+                "{\"documentId\":\"" + form.getDocumentId() + "\",\"fileVersionId\":\""
+                        + form.getFileVersionId() + "\"}");
+        return fileObjectMapper.selectUploadBySource(tenantId, serviceId, sourceId);
+    }
+
+    private void insertDocument(DmsFileUploadRegisterForm form, String tenantId, String userId,
+                                String serviceId, String sourceId) {
+        DmsDocumentEntity document = new DmsDocumentEntity();
+        document.setId(form.getDocumentId());
+        document.setTenantId(tenantId);
+        document.setFolderId(form.getFolderId());
+        document.setDocumentNo(form.getDocumentNo().trim());
+        document.setName(form.getDocumentName().trim());
+        document.setDocumentType(form.getDocumentType().trim());
+        document.setResponsibleDeptId(form.getResponsibleDeptId().trim());
+        document.setCreatedBy(userId);
+        documentMapper.insert(document);
+        insertRegistry(tenantId, form.getDocumentId(), DmsResourceType.DOCUMENT,
+                registrySource(sourceId, "document"), serviceId);
+    }
+
+    private void insertFileVersion(DmsFileUploadRegisterForm form, String tenantId, String userId,
+                                   String serviceId, String sourceId) {
+        DmsFileVersionEntity version = new DmsFileVersionEntity();
+        version.setId(form.getFileVersionId());
+        version.setTenantId(tenantId);
+        version.setDocumentId(form.getDocumentId());
+        version.setVersionNo(1L);
+        version.setVersionLabel(form.getVersionLabel().trim());
+        version.setFileName(form.getFileName().trim());
+        version.setMimeType(trimToNull(form.getMimeType()));
+        version.setSizeBytes(form.getSizeBytes());
+        version.setChecksumSha256(form.getChecksumSha256().toLowerCase(Locale.ROOT));
+        version.setPreparedBy(form.getPreparedBy().trim());
+        version.setPreparedOn(form.getPreparedOn());
+        version.setCreatedBy(userId);
+        fileVersionMapper.insert(version);
+        insertRegistry(tenantId, form.getFileVersionId(), DmsResourceType.FILE_VERSION,
+                registrySource(sourceId, "version:1"), serviceId);
+    }
+
+    private void insertFileObject(DmsFileUploadRegisterForm form, String tenantId, String userId,
+                                  String serviceId, String sourceId) {
+        DmsFileObjectEntity object = new DmsFileObjectEntity();
+        object.setId(form.getFileObjectId());
+        object.setTenantId(tenantId);
+        object.setFileVersionId(form.getFileVersionId());
+        object.setStoragePlatform(form.getStoragePlatform().trim());
+        object.setBucketName(form.getBucketName().trim());
+        object.setBasePath(trimToEmpty(form.getBasePath()));
+        object.setObjectPath(form.getObjectPath().trim());
+        object.setObjectName(form.getObjectName().trim());
+        object.setSourceServiceId(serviceId);
+        object.setSourceId(sourceId);
+        object.setCreatedBy(userId);
+        fileObjectMapper.insert(object);
+    }
+
+    private void insertDirectEffectiveState(DmsFileUploadRegisterForm form, String tenantId,
+                                            String userId) {
+        versionStateMapper.insertDirectEffective(tenantId, form.getDocumentId(),
+                form.getFileVersionId(), userId);
+    }
+
+    private void insertRegistry(String tenantId, java.util.UUID id, DmsResourceType type,
+                                String sourceId, String serviceId) {
+        DmsPermissionResourceEntity registry = new DmsPermissionResourceEntity();
+        registry.setId(id);
+        registry.setTenantId(tenantId);
+        registry.setResourceType(type.name());
+        registry.setSourceType("SYSTEM");
+        registry.setSourceId(sourceId);
+        registry.setRegisteredBy(serviceId);
+        resourceMapper.insert(registry);
+    }
+
+    private void validateRetry(DmsFileUploadVO existing, DmsFileUploadRegisterForm form) {
+        if (!Objects.equals(existing.getFolderId(), form.getFolderId())
+                || !Objects.equals(existing.getDocumentNo(), form.getDocumentNo().trim())
+                || !Objects.equals(existing.getDocumentName(), form.getDocumentName().trim())
+                || !Objects.equals(existing.getDocumentType(), form.getDocumentType().trim())
+                || !Objects.equals(existing.getResponsibleDeptId(), form.getResponsibleDeptId().trim())
+                || !Objects.equals(existing.getVersionLabel(), form.getVersionLabel().trim())
+                || !Objects.equals(existing.getFileName(), form.getFileName().trim())
+                || !Objects.equals(existing.getMimeType(), trimToNull(form.getMimeType()))
+                || !Objects.equals(existing.getSizeBytes(), form.getSizeBytes())
+                || !equalsIgnoreCase(existing.getChecksumSha256(), form.getChecksumSha256())
+                || !Objects.equals(existing.getPreparedBy(), form.getPreparedBy().trim())
+                || !Objects.equals(existing.getPreparedOn(), form.getPreparedOn())) {
+            throw DmsPermissionException.of(DmsPermissionError.IDEMPOTENCY_CONFLICT,
+                    "source_id 瀵瑰簲鐨勪笂浼犲唴瀹逛笌鏈璇锋眰涓嶄竴鑷�");
+        }
+    }
+
+    private String registrySource(String sourceId, String suffix) {
+        return SOURCE_PREFIX + sourceId + ":" + suffix;
+    }
+
+    private String trimToNull(String value) {
+        return value == null || value.trim().isEmpty() ? null : value.trim();
+    }
+
+    private String trimToEmpty(String value) {
+        return value == null ? "" : value.trim();
+    }
+
+    private boolean equalsIgnoreCase(String left, String right) {
+        return left == null ? right == null : right != null && left.equalsIgnoreCase(right);
+    }
+
+    private DmsPermissionException conflict(String message, Throwable cause) {
+        DmsPermissionException exception = DmsPermissionException.of(DmsPermissionError.SOURCE_CONFLICT, message);
+        exception.initCause(cause);
+        return exception;
+    }
+}

--
Gitblit v1.8.0