diff --git a/backend/src/main/java/com/designhub/controller/DesignerController.java b/backend/src/main/java/com/designhub/controller/DesignerController.java index 4f66385..f4a79b8 100644 --- a/backend/src/main/java/com/designhub/controller/DesignerController.java +++ b/backend/src/main/java/com/designhub/controller/DesignerController.java @@ -25,8 +25,10 @@ public class DesignerController { @Operation(summary = "获取所有设计师统计信息") @GetMapping("/stats") - public Result> getAllDesignerStats() { - return Result.success(designerService.getAllDesignerStats()); + public Result> getAllDesignerStats( + @Parameter(description = "部门ID,不传则查询所有接单部门") @RequestParam(required = false) Long deptId + ) { + return Result.success(designerService.getAllDesignerStats(deptId)); } @Operation(summary = "获取单个设计师统计信息") diff --git a/backend/src/main/java/com/designhub/service/DesignerService.java b/backend/src/main/java/com/designhub/service/DesignerService.java index c7e3de0..a64c955 100644 --- a/backend/src/main/java/com/designhub/service/DesignerService.java +++ b/backend/src/main/java/com/designhub/service/DesignerService.java @@ -35,29 +35,63 @@ public class DesignerService { * 获取所有设计师的统计信息 */ public List getAllDesignerStats() { - // 仅获取接单部门(designer/receiving)的用户 - List receivingDeptIds = departmentMapper.selectList( - new LambdaQueryWrapper() - .eq(Department::getDeptType, "receiving") - .eq(Department::getStatus, 1) - ).stream() - .map(Department::getId) - .collect(Collectors.toList()); + return getAllDesignerStats(null); + } + + /** + * 获取所有设计师的统计信息(支持部门筛选) + */ + public List getAllDesignerStats(Long deptId) { + List targetDeptIds; + + if (deptId != null) { + // 如果指定了部门,获取该部门及其所有子部门 + targetDeptIds = getDeptAndChildIds(deptId); + log.debug("筛选部门: deptId={}, targetDeptIds={}", deptId, targetDeptIds); + } else { + // 仅获取接单部门(designer/receiving)的用户 + targetDeptIds = departmentMapper.selectList( + new LambdaQueryWrapper() + .eq(Department::getDeptType, "receiving") + .eq(Department::getStatus, 1) + ).stream() + .map(Department::getId) + .collect(Collectors.toList()); + } - if (receivingDeptIds.isEmpty()) { + if (targetDeptIds.isEmpty()) { return new ArrayList<>(); } List designers = userMapper.selectList( new LambdaQueryWrapper() .eq(User::getStatus, 1) - .in(User::getDeptId, receivingDeptIds) + .in(User::getDeptId, targetDeptIds) ); return designers.stream() .map(this::buildDesignerStats) .collect(Collectors.toList()); } + + /** + * 递归获取部门及其所有子部门ID + */ + private List getDeptAndChildIds(Long deptId) { + List deptIds = new ArrayList<>(); + deptIds.add(deptId); + + List children = departmentMapper.selectList( + new LambdaQueryWrapper() + .eq(Department::getParentId, deptId) + .eq(Department::getStatus, 1) + ); + + for (Department child : children) { + deptIds.addAll(getDeptAndChildIds(child.getId())); + } + return deptIds; + } /** * 获取单个设计师的统计信息 diff --git a/frontend/src/api/designer.ts b/frontend/src/api/designer.ts index e278afc..b97094c 100644 --- a/frontend/src/api/designer.ts +++ b/frontend/src/api/designer.ts @@ -26,8 +26,10 @@ export interface DesignerStats { /** * 获取所有设计师统计信息 */ -export const getAllDesignerStats = () => { - return request.get('/designers/stats') +export const getAllDesignerStats = (deptId?: number) => { + const params: any = {} + if (deptId) params.deptId = deptId + return request.get('/designers/stats', { params }) } /** diff --git a/frontend/src/views/DesignerHall.vue b/frontend/src/views/DesignerHall.vue index ec5df19..7a74e9d 100644 --- a/frontend/src/views/DesignerHall.vue +++ b/frontend/src/views/DesignerHall.vue @@ -111,7 +111,27 @@
-

设计师列表

+
+

设计师列表

+
+ + 全部部门 + + {{ dept.deptName }} + + +
+
@@ -284,9 +304,18 @@ import { message } from 'ant-design-vue' import DefaultLayout from '@/layouts/DefaultLayout.vue' import Icon from '@/components/Icon.vue' import * as designerApi from '@/api/designer' +import * as departmentApi from '@/api/department' import type { DesignerStats } from '@/api/designer' import dayjs from 'dayjs' +// 部门类型定义 +interface Department { + id: number + deptName: string + deptType: string + parentId: number | null +} + // 状态 const loading = ref(false) const designersList = ref([]) @@ -294,6 +323,8 @@ const leaderboardData = ref([]) const activeLeaderboard = ref('score') const selectedMonth = ref('') // 选中的月份 const leaderboardExpanded = ref(false) // 排行榜默认折叠 +const selectedDeptId = ref(undefined) // 选中的部门ID +const receivingDepts = ref([]) // 接单部门列表(二级部门) // 排行榜Tab配置 const leaderboardTabs = [ @@ -384,7 +415,7 @@ const getLeaderboardLabel = () => { const loadDesigners = async () => { loading.value = true try { - const response = await designerApi.getAllDesignerStats() + const response = await designerApi.getAllDesignerStats(selectedDeptId.value) if (response.code === 200) { designersList.value = response.data || [] } @@ -396,6 +427,26 @@ const loadDesigners = async () => { } } +// 加载接单部门列表(二级部门) +const loadReceivingDepts = async () => { + try { + const response = await departmentApi.getDepartments() + if (response.code === 200 && response.data) { + // 只获取接单类型的二级部门(parent_id 不为空且 dept_type 为 receiving) + receivingDepts.value = response.data.filter((dept: Department) => + dept.deptType === 'receiving' && dept.parentId !== null + ) + } + } catch (error) { + console.error('加载部门列表失败:', error) + } +} + +// 部门筛选变更 +const handleDeptChange = () => { + loadDesigners() +} + // 加载排行榜数据 const loadLeaderboard = async (type: string, month?: string) => { try { @@ -443,6 +494,7 @@ const loadDesignerTasks = async (designer: DesignerStats) => { onMounted(() => { // 设置默认选中当前月份 selectedMonth.value = dayjs().format('YYYY-MM') + loadReceivingDepts() // 加载部门列表 loadDesigners() loadLeaderboard('score') }) @@ -699,6 +751,23 @@ onMounted(() => { // 设计师列表 .designers-section { margin-top: $space-xxxl; + + .section-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: $space-lg; + + .section-title { + margin-bottom: 0; + } + + .filter-area { + display: flex; + gap: $space-md; + align-items: center; + } + } } .section-title {