diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationCategoryApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationCategoryApiController.java new file mode 100644 index 00000000..c9812403 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ApplicationCategoryApiController.java @@ -0,0 +1,29 @@ +package com.qqchen.deploy.backend.deploy.api; + +import com.qqchen.deploy.backend.deploy.dto.ApplicationCategoryDTO; +import com.qqchen.deploy.backend.deploy.entity.ApplicationCategory; +import com.qqchen.deploy.backend.deploy.query.ApplicationCategoryQuery; +import com.qqchen.deploy.backend.framework.controller.BaseController; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 应用分类API控制器 + */ +@Slf4j +@RestController +@RequestMapping("/api/v1/application-category") +@Tag(name = "应用分类管理", description = "应用分类的增删改查接口") +public class ApplicationCategoryApiController extends BaseController { + + @Override + protected void exportData(HttpServletResponse response, List data) { + // TODO: 实现导出功能 + } +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ProjectGroupApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ProjectGroupApiController.java deleted file mode 100644 index 50239556..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/api/ProjectGroupApiController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.qqchen.deploy.backend.deploy.api; - -import com.qqchen.deploy.backend.deploy.dto.ProjectGroupDTO; -import com.qqchen.deploy.backend.deploy.entity.ProjectGroup; -import com.qqchen.deploy.backend.deploy.query.ProjectGroupQuery; -import com.qqchen.deploy.backend.framework.controller.BaseController; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.servlet.http.HttpServletResponse; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@Tag(name = "项目组管理", description = "项目组管理相关接口") -@RestController -@RequestMapping("/api/v1/project-group") -public class ProjectGroupApiController extends BaseController { - - @Override - protected void exportData(HttpServletResponse response, List data) { - // TODO: 实现导出逻辑 - } -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ApplicationCategoryConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ApplicationCategoryConverter.java new file mode 100644 index 00000000..ce1f07ee --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ApplicationCategoryConverter.java @@ -0,0 +1,14 @@ +package com.qqchen.deploy.backend.deploy.converter; + +import com.qqchen.deploy.backend.deploy.dto.ApplicationCategoryDTO; +import com.qqchen.deploy.backend.deploy.entity.ApplicationCategory; +import com.qqchen.deploy.backend.framework.converter.BaseConverter; +import org.mapstruct.Mapper; + +/** + * 应用分类Converter + */ +@Mapper(config = BaseConverter.class) +public interface ApplicationCategoryConverter extends BaseConverter { +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ProjectGroupConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ProjectGroupConverter.java deleted file mode 100644 index 79326288..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/converter/ProjectGroupConverter.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.qqchen.deploy.backend.deploy.converter; - -import com.qqchen.deploy.backend.deploy.dto.ProjectGroupDTO; -import com.qqchen.deploy.backend.deploy.entity.ProjectGroup; -import com.qqchen.deploy.backend.framework.converter.BaseConverter; -import org.mapstruct.Mapper; - -@Mapper(config = BaseConverter.class) -public interface ProjectGroupConverter extends BaseConverter { -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ApplicationCategoryDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ApplicationCategoryDTO.java new file mode 100644 index 00000000..aa6417bc --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ApplicationCategoryDTO.java @@ -0,0 +1,43 @@ +package com.qqchen.deploy.backend.deploy.dto; + +import com.qqchen.deploy.backend.framework.dto.BaseDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 应用分类DTO + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "应用分类DTO") +public class ApplicationCategoryDTO extends BaseDTO { + + @Schema(description = "分类编码") + @NotBlank(message = "分类编码不能为空") + private String code; + + @Schema(description = "分类名称") + @NotBlank(message = "分类名称不能为空") + private String name; + + @Schema(description = "分类描述") + private String description; + + @Schema(description = "图标") + private String icon; + + @Schema(description = "是否启用") + @NotNull(message = "启用状态不能为空") + private Boolean enabled; + + @Schema(description = "排序号") + @NotNull(message = "排序号不能为空") + private Integer sort; + + @Schema(description = "应用数量") + private Long applicationCount; +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ApplicationDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ApplicationDTO.java index 2fa3e256..b591bfb2 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ApplicationDTO.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ApplicationDTO.java @@ -29,8 +29,8 @@ public class ApplicationDTO extends BaseDTO { @Schema(description = "代码仓库项目ID") private Long repoProjectId; - @NotNull(message = "所属项目组ID不能为空") - private Long projectGroupId; + @Schema(description = "应用分类ID") + private Long applicationCategoryId; @Schema(description = "是否启用") private Boolean enabled; @@ -42,6 +42,6 @@ public class ApplicationDTO extends BaseDTO { private RepositoryProjectDTO repositoryProject; - private ProjectGroupDTO projectGroup; + private ApplicationCategoryDTO applicationCategory; } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ProjectGroupDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ProjectGroupDTO.java deleted file mode 100644 index 6604ea7f..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/ProjectGroupDTO.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.qqchen.deploy.backend.deploy.dto; - -import com.qqchen.deploy.backend.deploy.enums.ProjectGroupTypeEnum; -import com.qqchen.deploy.backend.framework.dto.BaseDTO; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.List; - -@Data -@EqualsAndHashCode(callSuper = true) -public class ProjectGroupDTO extends BaseDTO { - - // @NotNull(message = "租户ID不能为空") - private String tenantCode; - - @NotNull(message = "项目组类型不能为空") - private ProjectGroupTypeEnum type; - - @NotBlank(message = "项目组编码不能为空") - private String projectGroupCode; - - @NotBlank(message = "项目组名称不能为空") - private String projectGroupName; - - private String projectGroupDesc; - - private Integer totalEnvironments; - - private Integer totalApplications; - - private Boolean enabled; - - @NotNull(message = "排序号不能为空") - private Integer sort; -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/Application.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/Application.java index 3ba0ad75..2dc8c2ec 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/Application.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/Application.java @@ -55,10 +55,10 @@ public class Application extends Entity { private Long repoProjectId; /** - * 项目组ID + * 应用分类ID */ - @Column(name = "project_group_id", nullable = false) - private Long projectGroupId; + @Column(name = "application_category_id") + private Long applicationCategoryId; /** * 排序号 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/ApplicationCategory.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/ApplicationCategory.java new file mode 100644 index 00000000..f920ace6 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/ApplicationCategory.java @@ -0,0 +1,54 @@ +package com.qqchen.deploy.backend.deploy.entity; + +import com.qqchen.deploy.backend.framework.domain.Entity; +import jakarta.persistence.Column; +import jakarta.persistence.Table; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 应用分类实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@jakarta.persistence.Entity +@Table(name = "deploy_application_category") +public class ApplicationCategory extends Entity { + + /** + * 分类编码 + */ + @Column(name = "code", nullable = false) + private String code; + + /** + * 分类名称 + */ + @Column(name = "name", nullable = false) + private String name; + + /** + * 分类描述 + */ + @Column(name = "description") + private String description; + + /** + * 图标 + */ + @Column(name = "icon") + private String icon; + + /** + * 是否启用 + */ + @Column(nullable = false) + private Boolean enabled = true; + + /** + * 排序号 + */ + @Column(name = "sort", nullable = false) + private Integer sort = 0; +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/ProjectGroup.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/ProjectGroup.java deleted file mode 100644 index 05583b34..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/entity/ProjectGroup.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.qqchen.deploy.backend.deploy.entity; - -import com.qqchen.deploy.backend.deploy.enums.ProjectGroupTypeEnum; -import com.qqchen.deploy.backend.framework.annotation.LogicDelete; -import com.qqchen.deploy.backend.framework.domain.Entity; -import jakarta.persistence.*; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 项目组实体 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@jakarta.persistence.Entity -@Table(name = "deploy_project_group") -public class ProjectGroup extends Entity { - - /** - * 租户ID - */ - @Column(name = "tenant_code") - private String tenantCode; - - @Column(name = "type", nullable = false) - @Enumerated(EnumType.STRING) - private ProjectGroupTypeEnum type; - - /** - * 项目组编码 - */ - @Column(name = "project_group_code", nullable = false) - private String projectGroupCode; - - - /** - * 项目组名称 - */ - @Column(name = "project_group_name", nullable = false) - private String projectGroupName; - - /** - * 项目组描述 - */ - @Column(name = "project_group_desc") - private String projectGroupDesc; - - /** - * 项目组状态 - */ - @Column(nullable = false) - private Boolean enabled = true; - - /** - * 排序号 - */ - @Column(name = "sort", nullable = false) - private Integer sort; - -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/enums/ProjectGroupTypeEnum.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/enums/ProjectGroupTypeEnum.java deleted file mode 100644 index 3cf5fbd1..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/enums/ProjectGroupTypeEnum.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.qqchen.deploy.backend.deploy.enums; - -import lombok.Getter; - -@Getter -public enum ProjectGroupTypeEnum { - - PRODUCT("PRODUCT", "产品"), - PROJECT("PROJECT", "项目"); - - private final String code; - - private final String description; - - ProjectGroupTypeEnum(String code, String description) { - this.code = code; - this.description = description; - } -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ApplicationCategoryQuery.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ApplicationCategoryQuery.java new file mode 100644 index 00000000..338ddbbd --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ApplicationCategoryQuery.java @@ -0,0 +1,30 @@ +package com.qqchen.deploy.backend.deploy.query; + +import com.qqchen.deploy.backend.framework.annotation.QueryField; +import com.qqchen.deploy.backend.framework.enums.QueryType; +import com.qqchen.deploy.backend.framework.query.BaseQuery; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 应用分类查询条件 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "应用分类查询条件") +public class ApplicationCategoryQuery extends BaseQuery { + + @QueryField(field = "code", type = QueryType.LIKE) + @Schema(description = "分类编码(模糊查询)") + private String code; + + @QueryField(field = "name", type = QueryType.LIKE) + @Schema(description = "分类名称(模糊查询)") + private String name; + + @QueryField(field = "enabled") + @Schema(description = "是否启用") + private Boolean enabled; +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ProjectGroupQuery.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ProjectGroupQuery.java deleted file mode 100644 index 4c21241f..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/query/ProjectGroupQuery.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.qqchen.deploy.backend.deploy.query; - -import com.qqchen.deploy.backend.framework.annotation.QueryField; -import com.qqchen.deploy.backend.framework.enums.QueryType; -import com.qqchen.deploy.backend.framework.query.BaseQuery; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode(callSuper = true) -public class ProjectGroupQuery extends BaseQuery { - - @QueryField(field = "projectGroupCode", type = QueryType.LIKE) - private String projectGroupCode; - - @QueryField(field = "projectGroupName", type = QueryType.LIKE) - private String projectGroupName; - - @QueryField(field = "projectGroupStatus") - private String projectGroupStatus; - - @QueryField(field = "tenantCode") - private Long tenantCode; -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationCategoryRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationCategoryRepository.java new file mode 100644 index 00000000..50a3da79 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationCategoryRepository.java @@ -0,0 +1,25 @@ +package com.qqchen.deploy.backend.deploy.repository; + +import com.qqchen.deploy.backend.deploy.entity.ApplicationCategory; +import com.qqchen.deploy.backend.framework.repository.IBaseRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +/** + * 应用分类Repository + */ +@Repository +public interface IApplicationCategoryRepository extends IBaseRepository { + + /** + * 根据编码查询(忽略已删除) + */ + Optional findByCodeAndDeletedFalse(String code); + + /** + * 检查编码是否存在 + */ + boolean existsByCodeAndDeletedFalse(String code); +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationRepository.java index 5ce76d27..bef80b10 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationRepository.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IApplicationRepository.java @@ -9,6 +9,9 @@ import java.util.List; @Repository public interface IApplicationRepository extends IBaseRepository { - Integer countByProjectGroupId(Long projectGroupId); + /** + * 统计应用分类下的应用数量 + */ + Long countByApplicationCategoryIdAndDeletedFalse(Long applicationCategoryId); } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IProjectGroupRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IProjectGroupRepository.java deleted file mode 100644 index 0b0157a1..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IProjectGroupRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.qqchen.deploy.backend.deploy.repository; - -import com.qqchen.deploy.backend.deploy.entity.ProjectGroup; -import com.qqchen.deploy.backend.framework.repository.IBaseRepository; -import com.querydsl.core.types.Predicate; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface IProjectGroupRepository extends IBaseRepository { - -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IApplicationCategoryService.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IApplicationCategoryService.java new file mode 100644 index 00000000..dff6c98b --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IApplicationCategoryService.java @@ -0,0 +1,13 @@ +package com.qqchen.deploy.backend.deploy.service; + +import com.qqchen.deploy.backend.deploy.dto.ApplicationCategoryDTO; +import com.qqchen.deploy.backend.deploy.entity.ApplicationCategory; +import com.qqchen.deploy.backend.deploy.query.ApplicationCategoryQuery; +import com.qqchen.deploy.backend.framework.service.IBaseService; + +/** + * 应用分类Service + */ +public interface IApplicationCategoryService extends IBaseService { +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IProjectGroupService.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IProjectGroupService.java deleted file mode 100644 index 7e3e0d40..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/IProjectGroupService.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.qqchen.deploy.backend.deploy.service; - -import com.qqchen.deploy.backend.deploy.dto.ProjectGroupDTO; -import com.qqchen.deploy.backend.deploy.entity.ProjectGroup; -import com.qqchen.deploy.backend.deploy.query.ProjectGroupQuery; -import com.qqchen.deploy.backend.framework.service.IBaseService; -import org.springframework.data.domain.Page; - -public interface IProjectGroupService extends IBaseService { - - Page page(ProjectGroupQuery query); -} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationCategoryServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationCategoryServiceImpl.java new file mode 100644 index 00000000..f9a2ca74 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationCategoryServiceImpl.java @@ -0,0 +1,61 @@ +package com.qqchen.deploy.backend.deploy.service.impl; + +import com.qqchen.deploy.backend.deploy.dto.ApplicationCategoryDTO; +import com.qqchen.deploy.backend.deploy.entity.ApplicationCategory; +import com.qqchen.deploy.backend.deploy.query.ApplicationCategoryQuery; +import com.qqchen.deploy.backend.deploy.repository.IApplicationCategoryRepository; +import com.qqchen.deploy.backend.deploy.repository.IApplicationRepository; +import com.qqchen.deploy.backend.deploy.service.IApplicationCategoryService; +import com.qqchen.deploy.backend.framework.enums.ResponseCode; +import com.qqchen.deploy.backend.framework.exception.BusinessException; +import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 应用分类Service实现 + */ +@Slf4j +@Service +public class ApplicationCategoryServiceImpl extends BaseServiceImpl + implements IApplicationCategoryService { + + @Resource + private IApplicationCategoryRepository applicationCategoryRepository; + + @Resource + private IApplicationRepository applicationRepository; + + @Override + @Transactional + public ApplicationCategoryDTO create(ApplicationCategoryDTO dto) { + // 检查编码唯一性 + if (applicationCategoryRepository.existsByCodeAndDeletedFalse(dto.getCode())) { + throw new RuntimeException("分类编码已存在: " + dto.getCode()); + } + return super.create(dto); + } + + @Override + public Page page(ApplicationCategoryQuery query) { + Page page = super.page(query); + + // 统计每个分类的应用数量 + List content = page.getContent().stream() + .peek(category -> { + Long count = applicationRepository.countByApplicationCategoryIdAndDeletedFalse(category.getId()); + category.setApplicationCount(count); + }) + .collect(Collectors.toList()); + + return new PageImpl<>(content, page.getPageable(), page.getTotalElements()); + } +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationServiceImpl.java index 8e0a6ef6..8714887a 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ApplicationServiceImpl.java @@ -1,21 +1,18 @@ package com.qqchen.deploy.backend.deploy.service.impl; -import com.qqchen.deploy.backend.deploy.converter.ExternalSystemConverter; -import com.qqchen.deploy.backend.deploy.converter.ProjectGroupConverter; +import com.qqchen.deploy.backend.deploy.converter.ApplicationCategoryConverter; import com.qqchen.deploy.backend.deploy.converter.RepositoryGroupConverter; import com.qqchen.deploy.backend.deploy.converter.RepositoryProjectConverter; import com.qqchen.deploy.backend.deploy.dto.ApplicationDTO; import com.qqchen.deploy.backend.deploy.dto.DevelopmentLanguageTypeDTO; import com.qqchen.deploy.backend.deploy.entity.Application; -import com.qqchen.deploy.backend.deploy.entity.ExternalSystem; -import com.qqchen.deploy.backend.deploy.entity.ProjectGroup; +import com.qqchen.deploy.backend.deploy.entity.ApplicationCategory; import com.qqchen.deploy.backend.deploy.entity.RepositoryGroup; import com.qqchen.deploy.backend.deploy.entity.RepositoryProject; import com.qqchen.deploy.backend.deploy.enums.DevelopmentLanguageTypeEnum; import com.qqchen.deploy.backend.deploy.query.ApplicationQuery; +import com.qqchen.deploy.backend.deploy.repository.IApplicationCategoryRepository; import com.qqchen.deploy.backend.deploy.repository.IApplicationRepository; -import com.qqchen.deploy.backend.deploy.repository.IExternalSystemRepository; -import com.qqchen.deploy.backend.deploy.repository.IProjectGroupRepository; import com.qqchen.deploy.backend.deploy.repository.IRepositoryGroupRepository; import com.qqchen.deploy.backend.deploy.repository.IRepositoryProjectRepository; import com.qqchen.deploy.backend.deploy.service.IApplicationService; @@ -36,10 +33,10 @@ import static java.util.stream.Collectors.toList; public class ApplicationServiceImpl extends BaseServiceImpl implements IApplicationService { @Resource - private IProjectGroupRepository projectGroupRepository; + private IApplicationCategoryRepository applicationCategoryRepository; @Resource - private ProjectGroupConverter projectGroupConverter; + private ApplicationCategoryConverter applicationCategoryConverter; @Resource private IRepositoryGroupRepository repositoryGroupRepository; @@ -53,21 +50,17 @@ public class ApplicationServiceImpl extends BaseServiceImpl page(ApplicationQuery query) { Page page = super.page(query); List result = page.getContent().stream().peek(application -> { - // 查询并设置项目组信息 - Optional projectGroupOptional = projectGroupRepository.findById(application.getProjectGroupId()); - projectGroupOptional.ifPresent(projectGroup -> application.setProjectGroup(projectGroupConverter.toDto(projectGroup))); + // 查询并设置应用分类信息 + if (application.getApplicationCategoryId() != null) { + Optional categoryOptional = applicationCategoryRepository.findById(application.getApplicationCategoryId()); + categoryOptional.ifPresent(category -> application.setApplicationCategory(applicationCategoryConverter.toDto(category))); + } // 查询并设置代码仓库组信息 if (application.getRepoGroupId() != null) { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ProjectGroupServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ProjectGroupServiceImpl.java deleted file mode 100644 index ba1d199d..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/ProjectGroupServiceImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.qqchen.deploy.backend.deploy.service.impl; - -import com.qqchen.deploy.backend.deploy.dto.ProjectGroupDTO; -import com.qqchen.deploy.backend.deploy.entity.Application; -import com.qqchen.deploy.backend.deploy.entity.ProjectGroup; -import com.qqchen.deploy.backend.deploy.query.ProjectGroupQuery; -import com.qqchen.deploy.backend.deploy.repository.IApplicationRepository; -import com.qqchen.deploy.backend.deploy.repository.IEnvironmentRepository; -import com.qqchen.deploy.backend.deploy.repository.IProjectGroupRepository; -import com.qqchen.deploy.backend.deploy.service.IEnvironmentService; -import com.qqchen.deploy.backend.deploy.service.IProjectGroupService; -import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; -import jakarta.annotation.Resource; -import jakarta.persistence.Query; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -import static java.util.stream.Collectors.toList; - -@Service -public class ProjectGroupServiceImpl extends BaseServiceImpl implements IProjectGroupService { - - @Resource - private IProjectGroupRepository projectGroupRepository; - - @Resource - private IApplicationRepository applicationRepository; - - @Resource - private IEnvironmentRepository environmentRepository; - - - @Override - public Page page(ProjectGroupQuery query) { - Page page = super.page(query); - List result = page.getContent().stream().map(projectGroupDTO -> { - projectGroupDTO.setTotalApplications(applicationRepository.countByProjectGroupId(projectGroupDTO.getId())); - projectGroupDTO.setTotalEnvironments(environmentRepository.countByProjectGroupId(projectGroupDTO.getId())); - return projectGroupDTO; - }).collect(toList()); - return new PageImpl<>(result, page.getPageable(), page.getTotalElements()); - } - - @Override - @Transactional - public void delete(Long id) { - // 1. 先删除中间表数据 - Query query = entityManager.createNativeQuery( - "DELETE FROM deploy_project_group_environment WHERE project_group_id = :projectGroupId" - ); - query.setParameter("projectGroupId", id); - query.executeUpdate(); - - // 2. 再调用父类的删除方法(逻辑删除ProjectGroup) - super.delete(id); - } -} \ No newline at end of file diff --git a/backend/src/main/resources/db/changelog/changes/v1.0.0-schema.sql b/backend/src/main/resources/db/changelog/changes/v1.0.0-schema.sql index 51adb059..a68aaf04 100644 --- a/backend/src/main/resources/db/changelog/changes/v1.0.0-schema.sql +++ b/backend/src/main/resources/db/changelog/changes/v1.0.0-schema.sql @@ -675,58 +675,59 @@ CREATE TABLE workflow_log -- 项目管理相关表 -- -------------------------------------------------------------------------------------- --- 项目组表 -CREATE TABLE deploy_project_group +-- 应用分类表 +CREATE TABLE deploy_application_category ( -- 基础字段 - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除', + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除', -- 业务字段 - tenant_code VARCHAR(50) DEFAULT NULL COMMENT '租户CODE', - type VARCHAR(50) NULL COMMENT '项目组类型', - project_group_code VARCHAR(50) NOT NULL COMMENT '项目组编码', - project_group_name VARCHAR(100) NOT NULL COMMENT '项目组名称', - project_group_desc VARCHAR(255) NULL COMMENT '项目组描述', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - sort INT NOT NULL DEFAULT 0 COMMENT '排序号' + code VARCHAR(50) NOT NULL COMMENT '分类编码', + name VARCHAR(100) NOT NULL COMMENT '分类名称', + description VARCHAR(500) NULL COMMENT '分类描述', + icon VARCHAR(50) NULL COMMENT '图标', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + sort INT NOT NULL DEFAULT 0 COMMENT '排序号', + + UNIQUE INDEX uk_code (code) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 - COLLATE = utf8mb4_unicode_ci COMMENT ='项目组表'; + COLLATE = utf8mb4_unicode_ci COMMENT ='应用分类表'; -- 应用表 CREATE TABLE deploy_application ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', -- 业务字段 - app_code VARCHAR(50) NOT NULL COMMENT '应用编码', - app_name VARCHAR(100) NOT NULL COMMENT '应用名称', - app_desc VARCHAR(255) NULL COMMENT '应用描述', - language VARCHAR(50) NULL COMMENT '开发语言:JAVA、PYTHON、NODEJS', - repo_group_id BIGINT NULL COMMENT '代码仓库组ID', - repo_project_id BIGINT NULL COMMENT '代码仓库项目ID', - project_group_id BIGINT NOT NULL COMMENT '所属项目组ID', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - sort INT NOT NULL DEFAULT 0 COMMENT '排序号', + app_code VARCHAR(50) NOT NULL COMMENT '应用编码', + app_name VARCHAR(100) NOT NULL COMMENT '应用名称', + app_desc VARCHAR(255) NULL COMMENT '应用描述', + language VARCHAR(50) NULL COMMENT '开发语言:JAVA、PYTHON、NODEJS', + repo_group_id BIGINT NULL COMMENT '代码仓库组ID', + repo_project_id BIGINT NULL COMMENT '代码仓库项目ID', + application_category_id BIGINT NULL COMMENT '所属应用分类ID', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + sort INT NOT NULL DEFAULT 0 COMMENT '排序号', -- 基础字段 - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除', -- 索引 - INDEX idx_project_group_id (project_group_id) COMMENT '项目ID索引', - UNIQUE INDEX uk_app_code (project_group_id, app_code) COMMENT '项目下应用编码唯一', + INDEX idx_application_category_id (application_category_id) COMMENT '应用分类ID索引', + UNIQUE INDEX uk_app_code (application_category_id, app_code) COMMENT '分类下应用编码唯一', -- 外键约束 - CONSTRAINT fk_application_project_group FOREIGN KEY (project_group_id) REFERENCES deploy_project_group (id) + CONSTRAINT fk_application_category FOREIGN KEY (application_category_id) REFERENCES deploy_application_category (id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT ='应用表'; @@ -754,34 +755,6 @@ CREATE TABLE deploy_environment -- 索引 UNIQUE INDEX uk_env_code (env_code) COMMENT '环境编码唯一' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='环境表'; - --- 项目环境关联表 -CREATE TABLE deploy_project_group_environment -( - -- 业务字段 - project_group_id BIGINT NOT NULL COMMENT '项目ID', - environment_id BIGINT NOT NULL COMMENT '环境ID', - - -- 基础字段 - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除', - - -- 索引 - UNIQUE INDEX uk_project_group_environment (project_group_id, environment_id) COMMENT '项目组环境关联唯一', - - -- 外键约束 - CONSTRAINT fk_project_env_project FOREIGN KEY (project_group_id) - REFERENCES deploy_project_group (id), - CONSTRAINT fk_project_env_environment FOREIGN KEY (environment_id) - REFERENCES deploy_environment (id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目组环境关联表'; - - CREATE TABLE deploy_log ( -- 基础字段