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

This commit is contained in:
Your Name 2026-01-17 10:04:47 +08:00
parent 403c5af7a0
commit fceb14e00c
3 changed files with 31 additions and 1 deletions

View File

@ -2052,6 +2052,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();
@ -2061,6 +2072,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

@ -98,7 +98,9 @@ public class DimensionAnalysisVO {
public static class ReceivingDeptAnalysis {
private Long deptId;
private String deptName;
private Integer memberCount; // 部门总人数
private Integer totalTasks; // 总接单数(主任务+子任务)
private BigDecimal avgTasksPerMember; // 人均任务数
private Integer completedTasks; // 已完成任务数
private Integer inProgressTasks; // 进行中任务数
private Integer pendingTasks; // 待接单任务数

View File

@ -499,7 +499,7 @@
:columns="receivingDeptColumns"
:data-source="dimensionData.receivingDeptAnalysis"
:pagination="{ pageSize: 10 }"
:scroll="{ x: 900 }"
:scroll="{ x: 1000 }"
row-key="deptId"
size="middle"
class="dark-table"
@ -508,6 +508,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) }}%
@ -977,7 +980,9 @@ const brandColumns = [
const receivingDeptColumns = [
{ title: '部门名称', dataIndex: 'deptName', key: 'deptName', ellipsis: true },
{ title: '部门人数', dataIndex: 'memberCount', key: 'memberCount', align: 'center', width: 80 },
{ title: '任务数', dataIndex: 'totalTasks', key: 'totalTasks', align: 'center', width: 70 },
{ title: '人均任务', key: 'avgTasksPerMember', align: 'center', width: 80 },
{ title: '总数量', dataIndex: 'totalQuantity', key: 'totalQuantity', align: 'center', width: 70 },
{ title: '已完成', dataIndex: 'completedTasks', key: 'completedTasks', align: 'center', width: 70 },
{ title: '进行中', dataIndex: 'inProgressTasks', key: 'inProgressTasks', align: 'center', width: 70 },