diff --git a/src/main/java/com/labelsys/backend/controller/PlatformCompanyAdminController.java b/src/main/java/com/labelsys/backend/controller/PlatformCompanyAdminController.java index 350e70e..b7d33db 100644 --- a/src/main/java/com/labelsys/backend/controller/PlatformCompanyAdminController.java +++ b/src/main/java/com/labelsys/backend/controller/PlatformCompanyAdminController.java @@ -54,7 +54,7 @@ public class PlatformCompanyAdminController { return Result.success(UserResponse.from(userService.createCompanyAdmin(UserContext.requireUser(), request))); } - @Operation(summary = "创建系统工程师管理员") + @Operation(summary = "创建系统管理员") @PostMapping("/system-engineer") public Result createSystemEngineerAdmin(@Valid @RequestBody CreateSystemEngineerAdminRequest request) { return Result.success(UserResponse.from(userService.createSystemEngineerAdmin(UserContext.requireUser(), request))); diff --git a/src/main/java/com/labelsys/backend/controller/SourceResourceController.java b/src/main/java/com/labelsys/backend/controller/SourceResourceController.java index 7d6b45e..2891642 100644 --- a/src/main/java/com/labelsys/backend/controller/SourceResourceController.java +++ b/src/main/java/com/labelsys/backend/controller/SourceResourceController.java @@ -37,7 +37,7 @@ public class SourceResourceController { @Operation(summary = "分页查询资源") @GetMapping - public Result> page(@ParameterObject SourceResourcePageQuery query) { + public Result> page(@ParameterObject @ModelAttribute SourceResourcePageQuery query) { return Result.success(sourceResourceService.pageResources(UserContext.requireUser(), query)); } diff --git a/src/main/java/com/labelsys/backend/mapper/SourceResourceMapper.java b/src/main/java/com/labelsys/backend/mapper/SourceResourceMapper.java index e583fea..b6eefd7 100644 --- a/src/main/java/com/labelsys/backend/mapper/SourceResourceMapper.java +++ b/src/main/java/com/labelsys/backend/mapper/SourceResourceMapper.java @@ -8,4 +8,6 @@ import org.apache.ibatis.annotations.Param; public interface SourceResourceMapper extends BaseMapper { List selectByCompanyIdAndIds(@Param("companyId") Long companyId, @Param("resourceIds") List resourceIds); + + SourceResource selectByCompanyIdAndResourceName(@Param("companyId") Long companyId, @Param("resourceName") String resourceName); } \ No newline at end of file diff --git a/src/main/java/com/labelsys/backend/service/ObjectStorageInitializer.java b/src/main/java/com/labelsys/backend/service/ObjectStorageInitializer.java new file mode 100644 index 0000000..ead66ce --- /dev/null +++ b/src/main/java/com/labelsys/backend/service/ObjectStorageInitializer.java @@ -0,0 +1,62 @@ +package com.labelsys.backend.service; + +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import com.labelsys.backend.config.ObjectStorageProperties; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.CreateBucketRequest; +import software.amazon.awssdk.services.s3.model.HeadBucketRequest; +import software.amazon.awssdk.services.s3.model.NoSuchBucketException; + +@Slf4j +@Component +@RequiredArgsConstructor +public class ObjectStorageInitializer { + + private final S3Client s3Client; + private final ObjectStorageProperties properties; + + @EventListener(ApplicationReadyEvent.class) + public void initializeBuckets() { + log.info("开始初始化对象存储桶..."); + + String[] buckets = { + properties.getSourceBucket(), + properties.getArtifactBucket(), + properties.getExportBucket() + }; + + for (String bucketName : buckets) { + try { + if (!bucketExists(bucketName)) { + createBucket(bucketName); + log.info("成功创建存储桶: {}", bucketName); + } else { + log.info("存储桶已存在: {}", bucketName); + } + } catch (Exception e) { + log.error("初始化存储桶 {} 失败: {}", bucketName, e.getMessage()); + } + } + + log.info("对象存储桶初始化完成"); + } + + private boolean bucketExists(String bucketName) { + try { + s3Client.headBucket(HeadBucketRequest.builder().bucket(bucketName).build()); + return true; + } catch (NoSuchBucketException e) { + return false; + } + } + + private void createBucket(String bucketName) { + s3Client.createBucket(CreateBucketRequest.builder().bucket(bucketName).build()); + } +} \ No newline at end of file diff --git a/src/main/java/com/labelsys/backend/service/SourceResourceService.java b/src/main/java/com/labelsys/backend/service/SourceResourceService.java index b5a24ab..447dd20 100644 --- a/src/main/java/com/labelsys/backend/service/SourceResourceService.java +++ b/src/main/java/com/labelsys/backend/service/SourceResourceService.java @@ -12,7 +12,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.labelsys.backend.common.ResultCode; import com.labelsys.backend.common.exception.BusinessException; -import com.labelsys.backend.config.ObjectStorageProperties; import com.labelsys.backend.context.LoginUser; import com.labelsys.backend.dto.common.PageResult; import com.labelsys.backend.dto.request.SourceResourcePageQuery; @@ -53,6 +52,14 @@ public class SourceResourceService { if (!ResourceType.isValid(request.getResourceType())) { throw new BusinessException(ResultCode.BAD_REQUEST, "资源类型非法"); } + String resourceName = + StringUtils.hasText(request.getResourceName()) ? request.getResourceName() : file.getOriginalFilename(); + SourceResource existingResource = + sourceResourceMapper.selectByCompanyIdAndResourceName(currentUser.companyId(), resourceName); + if (existingResource != null) { + throw new BusinessException(ResultCode.BAD_REQUEST, "资源名称已存在:" + resourceName); + } + long resourceId = IdGenerator.nextId(); String extension = resolveExtension(file.getOriginalFilename(), request.getResourceType()); String objectKey = ObjectStoragePathBuilder.sourceObjectKey(currentUser.companyId(), request.getResourceType(), diff --git a/src/main/resources/mapper/SourceResourceMapper.xml b/src/main/resources/mapper/SourceResourceMapper.xml index 9b38e8b..c496633 100644 --- a/src/main/resources/mapper/SourceResourceMapper.xml +++ b/src/main/resources/mapper/SourceResourceMapper.xml @@ -27,4 +27,8 @@ and id in #{resourceId} + + \ No newline at end of file