diff --git a/backend/src/main/java/com/qqchen/deploy/backend/api/DepartmentApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/api/DepartmentApiController.java index 8b246d21..a8fead50 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/api/DepartmentApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/api/DepartmentApiController.java @@ -5,6 +5,7 @@ import com.qqchen.deploy.backend.framework.api.Response; import com.qqchen.deploy.backend.framework.controller.BaseController; import com.qqchen.deploy.backend.model.DepartmentDTO; import com.qqchen.deploy.backend.model.query.DepartmentQuery; +import com.qqchen.deploy.backend.model.response.DepartmentResponse; import com.qqchen.deploy.backend.service.IDepartmentService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -25,7 +26,7 @@ public class DepartmentApiController extends BaseController> getTree() { + public Response> getTree() { return Response.success(departmentService.getTree()); } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/api/MenuApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/api/MenuApiController.java index d6c9ef39..069852a1 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/api/MenuApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/api/MenuApiController.java @@ -36,6 +36,12 @@ public class MenuApiController extends BaseController> getTree() { + return Response.success(menuService.getMenuTree()); + } + @Override protected void exportData(HttpServletResponse response, List data) { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/converter/DepartmentConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/converter/DepartmentConverter.java index 2a6df677..22e92b6a 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/converter/DepartmentConverter.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/converter/DepartmentConverter.java @@ -3,10 +3,20 @@ package com.qqchen.deploy.backend.converter; import com.qqchen.deploy.backend.entity.Department; import com.qqchen.deploy.backend.framework.converter.BaseConverter; import com.qqchen.deploy.backend.model.DepartmentDTO; +import com.qqchen.deploy.backend.model.response.DepartmentResponse; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; import org.mapstruct.ReportingPolicy; +import java.util.List; + @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface DepartmentConverter extends BaseConverter { // 继承了 BaseConverter 的方法,不需要再声明 + + @Mapping(target = "children", expression = "java(toResponseList(dto.getChildren()))") + DepartmentResponse toResponse(DepartmentDTO dto); + + List toResponseList(List dtoList); + } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/model/response/DepartmentResponse.java b/backend/src/main/java/com/qqchen/deploy/backend/model/response/DepartmentResponse.java new file mode 100644 index 00000000..538357f4 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/model/response/DepartmentResponse.java @@ -0,0 +1,57 @@ +package com.qqchen.deploy.backend.model.response; + +import com.qqchen.deploy.backend.framework.dto.BaseResponse; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class DepartmentResponse extends BaseResponse { + + /** + * 部门编码 + */ + private String code; + + /** + * 部门名称 + */ + private String name; + + /** + * 部门描述 + */ + private String description; + + /** + * 上级部门ID + */ + private Long parentId; + + /** + * 显示排序 + */ + private Integer sort; + + /** + * 是否启用 + */ + private Boolean enabled; + + /** + * 负责人ID + */ + private Long leaderId; + + /** + * 负责人姓名 + */ + private String leaderName; + + /** + * 子部门列表 + */ + private List children; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/service/IDepartmentService.java b/backend/src/main/java/com/qqchen/deploy/backend/service/IDepartmentService.java index 047e2b04..a162d502 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/service/IDepartmentService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/service/IDepartmentService.java @@ -3,6 +3,7 @@ package com.qqchen.deploy.backend.service; import com.qqchen.deploy.backend.entity.Department; import com.qqchen.deploy.backend.framework.service.IBaseService; import com.qqchen.deploy.backend.model.DepartmentDTO; +import com.qqchen.deploy.backend.model.response.DepartmentResponse; import java.util.List; @@ -11,5 +12,5 @@ public interface IDepartmentService extends IBaseService getTree(); + List getTree(); } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/service/IMenuService.java b/backend/src/main/java/com/qqchen/deploy/backend/service/IMenuService.java index 7461b802..a102aab0 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/service/IMenuService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/service/IMenuService.java @@ -20,4 +20,9 @@ public interface IMenuService extends IBaseService { * @return 用户菜单 */ List getUserMenus(); + + /** + * 获取菜单树 + */ + List getTree(); } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/service/impl/DepartmentServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/service/impl/DepartmentServiceImpl.java index a476703f..997efee7 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/service/impl/DepartmentServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/service/impl/DepartmentServiceImpl.java @@ -6,6 +6,7 @@ import com.qqchen.deploy.backend.framework.enums.ResponseCode; import com.qqchen.deploy.backend.framework.exception.UniqueConstraintException; import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; import com.qqchen.deploy.backend.model.DepartmentDTO; +import com.qqchen.deploy.backend.model.response.DepartmentResponse; import com.qqchen.deploy.backend.repository.IDepartmentRepository; import com.qqchen.deploy.backend.service.IDepartmentService; import com.qqchen.deploy.backend.framework.annotation.ServiceType; @@ -42,9 +43,10 @@ public class DepartmentServiceImpl extends BaseServiceImpl getTree() { + public List getTree() { List departments = departmentRepository.findByDeletedFalseOrderBySort(); - return buildTree(departments); + List dtoTree = buildTree(departments); + return departmentConverter.toResponseList(dtoTree); } private List buildTree(List departments) { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/service/impl/MenuServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/service/impl/MenuServiceImpl.java index 8237406b..d3e47327 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/service/impl/MenuServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/service/impl/MenuServiceImpl.java @@ -19,6 +19,7 @@ import java.util.Map; import java.util.ArrayList; import java.util.stream.Collectors; import java.util.Comparator; +import java.util.HashMap; import static com.qqchen.deploy.backend.framework.annotation.ServiceType.Type.DATABASE; @@ -66,6 +67,39 @@ public class MenuServiceImpl extends BaseServiceImpl implem return menuConverter.toResponseList(menuTree); } + @Override + public List getTree() { + List menus = menuRepository.findByDeletedFalseOrderBySort(); + return buildTree(menus); + } + + private List buildTree(List menus) { + Map dtoMap = new HashMap<>(); + List roots = new ArrayList<>(); + + // 转换为DTO并建立映射 + menus.forEach(menu -> { + MenuDTO dto = menuConverter.toDto(menu); + dto.setChildren(new ArrayList<>()); + dtoMap.put(dto.getId(), dto); + }); + + // 构建树形结构 + menus.forEach(menu -> { + MenuDTO dto = dtoMap.get(menu.getId()); + if (menu.getParentId() == null || menu.getParentId() == 0) { + roots.add(dto); + } else { + MenuDTO parent = dtoMap.get(menu.getParentId()); + if (parent != null) { + parent.getChildren().add(dto); + } + } + }); + + return roots; + } + private List buildMenuTree(List menus) { // 使用Map存储所有菜单,便于查找 Map menuMap = menus.stream()