feat: 需求部门分析增加部门人数和人均任务数字段

This commit is contained in:
Your Name 2026-01-17 09:54:55 +08:00
parent 6fb03d14b9
commit 403c5af7a0
4 changed files with 34 additions and 2 deletions

View File

@ -2140,6 +2140,17 @@ public class AnalyticsService {
Map<Long, String> deptNames = departments.stream()
.collect(Collectors.toMap(d -> d.getId(), d -> d.getDeptName(), (a, b) -> a));
// 🔥 获取每个部门的人数
Map<Long, Integer> deptMemberCounts = new HashMap<>();
for (Long deptId : tasksByDept.keySet()) {
// 查询该部门及其子部门的所有用户数量
List<Long> deptAndChildIds = getDeptAndChildIds(deptId);
Long memberCount = userMapper.selectCount(new LambdaQueryWrapper<User>()
.in(User::getDeptId, deptAndChildIds)
.eq(User::getStatus, 1)); // 只统计启用状态的用户
deptMemberCounts.put(deptId, memberCount.intValue());
}
for (Map.Entry<Long, List<Task>> entry : tasksByDept.entrySet()) {
Long deptId = entry.getKey();
List<Task> deptTasks = entry.getValue();
@ -2149,6 +2160,18 @@ public class AnalyticsService {
analysis.setDeptName(deptNames.getOrDefault(deptId, "未知部门"));
analysis.setTotalTasks(deptTasks.size());
// 🔥 设置部门人数
int memberCount = deptMemberCounts.getOrDefault(deptId, 0);
analysis.setMemberCount(memberCount);
// 🔥 计算人均任务数
if (memberCount > 0) {
analysis.setAvgTasksPerMember(BigDecimal.valueOf((double) deptTasks.size() / memberCount)
.setScale(2, RoundingMode.HALF_UP));
} else {
analysis.setAvgTasksPerMember(BigDecimal.ZERO);
}
long completedCount = deptTasks.stream()
.filter(t -> "completed".equals(t.getStatus()))
.count();

View File

@ -130,8 +130,10 @@ public class DimensionAnalysisVO {
private Integer inProgressTasks; // 进行中任务数
private Integer pendingTasks; // 待接单任务数
private Integer totalQuantity; // 总数量
private Integer publisherCount; // 发布人数量
private Integer memberCount; // 部门总人数
private Integer publisherCount; // 发布人数量(有发布任务的人)
private Integer activePublisherCount; // 活跃发布人数量
private BigDecimal avgTasksPerMember; // 人均任务数
private BigDecimal totalScore; // 消耗总积分
private BigDecimal avgScore; // 平均积分
private BigDecimal completionRate; // 完成率

View File

@ -448,6 +448,8 @@ export interface DeptAnalysis {
completionRate: number;
totalQuantity: number;
avgCompletionHours?: number;
memberCount?: number; // 部门人数
avgTasksPerMember?: number; // 人均任务数
}
export interface PlatformAnalysis {

View File

@ -529,7 +529,7 @@
:columns="demandDeptColumns"
:data-source="dimensionData.demandDeptAnalysis"
:pagination="{ pageSize: 10 }"
:scroll="{ x: 800 }"
:scroll="{ x: 900 }"
row-key="deptId"
size="middle"
class="dark-table"
@ -538,6 +538,9 @@
<template v-if="column.key === 'totalScore'">
<span class="score-value">{{ formatScore(record.totalScore) }}</span>
</template>
<template v-else-if="column.key === 'avgTasksPerMember'">
<span class="score-value">{{ formatScore(record.avgTasksPerMember) }}</span>
</template>
<template v-else-if="column.key === 'completionRate'">
<span :class="record.completionRate >= 80 ? 'text-success' : record.completionRate >= 50 ? 'text-warning' : 'text-danger'">
{{ formatScore(record.completionRate) }}%
@ -985,7 +988,9 @@ const receivingDeptColumns = [
const demandDeptColumns = [
{ title: '部门名称', dataIndex: 'deptName', key: 'deptName', ellipsis: true },
{ title: '部门人数', dataIndex: 'memberCount', key: 'memberCount', align: 'center', width: 80 },
{ title: '任务数', dataIndex: 'totalTasks', key: 'totalTasks', align: 'center', width: 80 },
{ title: '人均任务', key: 'avgTasksPerMember', align: 'center', width: 90 },
{ title: '总数量', dataIndex: 'totalQuantity', key: 'totalQuantity', align: 'center', width: 80 },
{ title: '已完成', dataIndex: 'completedTasks', key: 'completedTasks', align: 'center', width: 80 },
{ title: '待处理', dataIndex: 'pendingTasks', key: 'pendingTasks', align: 'center', width: 80 },