From 0af19cf1b5f6d2243897fbb18ac0a4ecd9649cec Mon Sep 17 00:00:00 2001 From: wh Date: Tue, 14 Apr 2026 13:19:39 +0800 Subject: [PATCH] refactor: flatten infrastructure packages --- .../aop => annotation}/OperationLog.java | 2 +- .../{common/aop => aspect}/AuditAspect.java | 3 +- .../com/label/common/ai/AiServiceClient.java | 28 +++++++------ .../config/MybatisPlusConfig.java | 2 +- .../{common => }/config/OpenApiConfig.java | 2 +- .../{common => }/config/RedisConfig.java | 2 +- .../event/ExtractionApprovedEvent.java | 2 +- .../ExtractionApprovedEventListener.java | 4 +- .../annotation/service/ExtractionService.java | 2 +- .../unit/PackageStructureMigrationTest.java | 39 +++++++++++++++++++ 10 files changed, 66 insertions(+), 20 deletions(-) rename src/main/java/com/label/{common/aop => annotation}/OperationLog.java (94%) rename src/main/java/com/label/{common/aop => aspect}/AuditAspect.java (97%) rename src/main/java/com/label/{common => }/config/MybatisPlusConfig.java (98%) rename src/main/java/com/label/{common => }/config/OpenApiConfig.java (97%) rename src/main/java/com/label/{common => }/config/RedisConfig.java (96%) rename src/main/java/com/label/{module/annotation => }/event/ExtractionApprovedEvent.java (95%) rename src/main/java/com/label/{module/annotation/service => listener}/ExtractionApprovedEventListener.java (98%) create mode 100644 src/test/java/com/label/unit/PackageStructureMigrationTest.java diff --git a/src/main/java/com/label/common/aop/OperationLog.java b/src/main/java/com/label/annotation/OperationLog.java similarity index 94% rename from src/main/java/com/label/common/aop/OperationLog.java rename to src/main/java/com/label/annotation/OperationLog.java index 8c96a4a..58cc8fd 100644 --- a/src/main/java/com/label/common/aop/OperationLog.java +++ b/src/main/java/com/label/annotation/OperationLog.java @@ -1,4 +1,4 @@ -package com.label.common.aop; +package com.label.annotation; import java.lang.annotation.*; diff --git a/src/main/java/com/label/common/aop/AuditAspect.java b/src/main/java/com/label/aspect/AuditAspect.java similarity index 97% rename from src/main/java/com/label/common/aop/AuditAspect.java rename to src/main/java/com/label/aspect/AuditAspect.java index a2f0b61..9699959 100644 --- a/src/main/java/com/label/common/aop/AuditAspect.java +++ b/src/main/java/com/label/aspect/AuditAspect.java @@ -1,5 +1,6 @@ -package com.label.common.aop; +package com.label.aspect; +import com.label.annotation.OperationLog; import com.label.common.context.CompanyContext; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/label/common/ai/AiServiceClient.java b/src/main/java/com/label/common/ai/AiServiceClient.java index 56e78d2..7dcc66b 100644 --- a/src/main/java/com/label/common/ai/AiServiceClient.java +++ b/src/main/java/com/label/common/ai/AiServiceClient.java @@ -3,10 +3,12 @@ package com.label.common.ai; import lombok.Builder; import lombok.Data; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestClient; +import org.springframework.web.client.RestTemplate; import jakarta.annotation.PostConstruct; +import java.time.Duration; import java.util.List; import java.util.Map; @@ -19,11 +21,15 @@ public class AiServiceClient { @Value("${ai-service.timeout:30000}") private int timeoutMs; - private RestClient restClient; + private RestTemplate restTemplate; @PostConstruct public void init() { - restClient = RestClient.builder().baseUrl(baseUrl).build(); + restTemplate = new RestTemplateBuilder() + .rootUri(baseUrl) + .setConnectTimeout(Duration.ofMillis(timeoutMs)) + .setReadTimeout(Duration.ofMillis(timeoutMs)) + .build(); } // DTO classes @@ -83,34 +89,34 @@ public class AiServiceClient { // The 8 endpoints: public ExtractionResponse extractText(ExtractionRequest request) { - return restClient.post().uri("/extract/text").body(request).retrieve().body(ExtractionResponse.class); + return restTemplate.postForObject("/extract/text", request, ExtractionResponse.class); } public ExtractionResponse extractImage(ExtractionRequest request) { - return restClient.post().uri("/extract/image").body(request).retrieve().body(ExtractionResponse.class); + return restTemplate.postForObject("/extract/image", request, ExtractionResponse.class); } public void extractFrames(VideoProcessRequest request) { - restClient.post().uri("/video/extract-frames").body(request).retrieve().toBodilessEntity(); + restTemplate.postForLocation("/video/extract-frames", request); } public void videoToText(VideoProcessRequest request) { - restClient.post().uri("/video/to-text").body(request).retrieve().toBodilessEntity(); + restTemplate.postForLocation("/video/to-text", request); } public QaGenResponse genTextQa(ExtractionRequest request) { - return restClient.post().uri("/qa/gen-text").body(request).retrieve().body(QaGenResponse.class); + return restTemplate.postForObject("/qa/gen-text", request, QaGenResponse.class); } public QaGenResponse genImageQa(ExtractionRequest request) { - return restClient.post().uri("/qa/gen-image").body(request).retrieve().body(QaGenResponse.class); + return restTemplate.postForObject("/qa/gen-image", request, QaGenResponse.class); } public FinetuneResponse startFinetune(FinetuneRequest request) { - return restClient.post().uri("/finetune/start").body(request).retrieve().body(FinetuneResponse.class); + return restTemplate.postForObject("/finetune/start", request, FinetuneResponse.class); } public FinetuneStatusResponse getFinetuneStatus(String jobId) { - return restClient.get().uri("/finetune/status/{jobId}", jobId).retrieve().body(FinetuneStatusResponse.class); + return restTemplate.getForObject("/finetune/status/{jobId}", FinetuneStatusResponse.class, jobId); } } diff --git a/src/main/java/com/label/common/config/MybatisPlusConfig.java b/src/main/java/com/label/config/MybatisPlusConfig.java similarity index 98% rename from src/main/java/com/label/common/config/MybatisPlusConfig.java rename to src/main/java/com/label/config/MybatisPlusConfig.java index 46aaf9d..ab2fb8d 100644 --- a/src/main/java/com/label/common/config/MybatisPlusConfig.java +++ b/src/main/java/com/label/config/MybatisPlusConfig.java @@ -1,4 +1,4 @@ -package com.label.common.config; +package com.label.config; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; diff --git a/src/main/java/com/label/common/config/OpenApiConfig.java b/src/main/java/com/label/config/OpenApiConfig.java similarity index 97% rename from src/main/java/com/label/common/config/OpenApiConfig.java rename to src/main/java/com/label/config/OpenApiConfig.java index 8b695cf..3af00c0 100644 --- a/src/main/java/com/label/common/config/OpenApiConfig.java +++ b/src/main/java/com/label/config/OpenApiConfig.java @@ -1,4 +1,4 @@ -package com.label.common.config; +package com.label.config; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; diff --git a/src/main/java/com/label/common/config/RedisConfig.java b/src/main/java/com/label/config/RedisConfig.java similarity index 96% rename from src/main/java/com/label/common/config/RedisConfig.java rename to src/main/java/com/label/config/RedisConfig.java index d2394b9..6b41622 100644 --- a/src/main/java/com/label/common/config/RedisConfig.java +++ b/src/main/java/com/label/config/RedisConfig.java @@ -1,4 +1,4 @@ -package com.label.common.config; +package com.label.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/com/label/module/annotation/event/ExtractionApprovedEvent.java b/src/main/java/com/label/event/ExtractionApprovedEvent.java similarity index 95% rename from src/main/java/com/label/module/annotation/event/ExtractionApprovedEvent.java rename to src/main/java/com/label/event/ExtractionApprovedEvent.java index d59f332..d2418dc 100644 --- a/src/main/java/com/label/module/annotation/event/ExtractionApprovedEvent.java +++ b/src/main/java/com/label/event/ExtractionApprovedEvent.java @@ -1,4 +1,4 @@ -package com.label.module.annotation.event; +package com.label.event; import lombok.Getter; import org.springframework.context.ApplicationEvent; diff --git a/src/main/java/com/label/module/annotation/service/ExtractionApprovedEventListener.java b/src/main/java/com/label/listener/ExtractionApprovedEventListener.java similarity index 98% rename from src/main/java/com/label/module/annotation/service/ExtractionApprovedEventListener.java rename to src/main/java/com/label/listener/ExtractionApprovedEventListener.java index 52c4a60..6e222ae 100644 --- a/src/main/java/com/label/module/annotation/service/ExtractionApprovedEventListener.java +++ b/src/main/java/com/label/listener/ExtractionApprovedEventListener.java @@ -1,16 +1,16 @@ -package com.label.module.annotation.service; +package com.label.listener; import com.fasterxml.jackson.databind.ObjectMapper; import com.label.common.ai.AiServiceClient; import com.label.common.context.CompanyContext; import com.label.module.annotation.entity.TrainingDataset; -import com.label.module.annotation.event.ExtractionApprovedEvent; import com.label.module.annotation.mapper.AnnotationResultMapper; import com.label.module.annotation.mapper.TrainingDatasetMapper; import com.label.module.source.entity.SourceData; import com.label.module.source.mapper.SourceDataMapper; import com.label.module.task.service.TaskClaimService; import com.label.module.task.service.TaskService; +import com.label.event.ExtractionApprovedEvent; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/com/label/module/annotation/service/ExtractionService.java b/src/main/java/com/label/module/annotation/service/ExtractionService.java index 100111e..0bdd7b6 100644 --- a/src/main/java/com/label/module/annotation/service/ExtractionService.java +++ b/src/main/java/com/label/module/annotation/service/ExtractionService.java @@ -9,7 +9,7 @@ import com.label.common.statemachine.StateValidator; import com.label.common.statemachine.TaskStatus; import com.label.module.annotation.entity.AnnotationResult; import com.label.module.annotation.entity.TrainingDataset; -import com.label.module.annotation.event.ExtractionApprovedEvent; +import com.label.event.ExtractionApprovedEvent; import com.label.module.annotation.mapper.AnnotationResultMapper; import com.label.module.annotation.mapper.TrainingDatasetMapper; import com.label.module.source.entity.SourceData; diff --git a/src/test/java/com/label/unit/PackageStructureMigrationTest.java b/src/test/java/com/label/unit/PackageStructureMigrationTest.java new file mode 100644 index 0000000..7ea8bc7 --- /dev/null +++ b/src/test/java/com/label/unit/PackageStructureMigrationTest.java @@ -0,0 +1,39 @@ +package com.label.unit; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +@DisplayName("标准目录扁平化迁移守卫测试") +class PackageStructureMigrationTest { + + @Test + @DisplayName("基础设施类已迁移到目标目录") + void infrastructureTypesMoved() { + assertClassExists("com.label.annotation.OperationLog"); + assertClassExists("com.label.aspect.AuditAspect"); + assertClassExists("com.label.config.MybatisPlusConfig"); + assertClassExists("com.label.config.OpenApiConfig"); + assertClassExists("com.label.config.RedisConfig"); + assertClassExists("com.label.event.ExtractionApprovedEvent"); + assertClassExists("com.label.listener.ExtractionApprovedEventListener"); + + assertClassMissing("com.label.common.aop.OperationLog"); + assertClassMissing("com.label.common.aop.AuditAspect"); + assertClassMissing("com.label.common.config.MybatisPlusConfig"); + assertClassMissing("com.label.common.config.OpenApiConfig"); + assertClassMissing("com.label.common.config.RedisConfig"); + assertClassMissing("com.label.module.annotation.event.ExtractionApprovedEvent"); + assertClassMissing("com.label.module.annotation.service.ExtractionApprovedEventListener"); + } + + private static void assertClassExists(String fqcn) { + assertThatCode(() -> Class.forName(fqcn)).doesNotThrowAnyException(); + } + + private static void assertClassMissing(String fqcn) { + assertThatThrownBy(() -> Class.forName(fqcn)).isInstanceOf(ClassNotFoundException.class); + } +}