用户报告管理端的 @employee-info-panel 虽然成功复用了 @employee-detail-panel 组件,但数据没有正确显示,特别是:
通过对比组长端(team-leader/dashboard)和管理端(admin/employees)的代码,发现了关键问题:
管理端的日历生成逻辑过于严格:
// ❌ 旧逻辑:要求项目必须同时有 createdAt 和 deadline
if (!createdAt || !deadline) return false;
这导致:
deadline 没有 createdAt,日历不显示createdAt 没有 deadline,日历也不显示而组长端使用了智能处理逻辑:
// ✅ 组长端逻辑:智能处理三种情况
if (deadline && createdAt) {
// 情况1:两个日期都有
startDate = createdAt;
endDate = deadline;
} else if (deadline) {
// 情况2:只有deadline,往前推30天
startDate = new Date(deadline.getTime() - 30 * 24 * 60 * 60 * 1000);
endDate = deadline;
} else {
// 情况3:只有createdAt,往后推30天
startDate = createdAt;
endDate = new Date(createdAt.getTime() + 30 * 24 * 60 * 60 * 1000);
}
文件: yss-project/src/app/pages/admin/employees/employees.ts
修改前(第 394-402 行):
const dayProjects = projects.filter(p => {
const createdAt = parseDate((p as any).createdAt);
const deadline = parseDate((p as any).deadline);
if (!createdAt || !deadline) return false; // ❌ 太严格
return dateTime >= createdAt.getTime() && dateTime <= deadline.getTime();
});
修改后:
const dayProjects = projects.filter(p => {
const createdAt = parseDate((p as any).createdAt);
const deadline = parseDate((p as any).deadline);
// ⭐ 智能处理:如果项目既没有 deadline 也没有 createdAt,则跳过
if (!deadline && !createdAt) {
return false;
}
// ⭐ 智能处理日期范围(与组长端对齐)
let startDate: Date;
let endDate: Date;
if (deadline && createdAt) {
// 情况1:两个日期都有
startDate = new Date(createdAt);
endDate = new Date(deadline);
} else if (deadline) {
// 情况2:只有deadline,往前推30天
startDate = new Date(deadline.getTime() - 30 * 24 * 60 * 60 * 1000);
endDate = new Date(deadline);
} else {
// 情况3:只有createdAt,往后推30天
startDate = new Date(createdAt!);
endDate = new Date(createdAt!.getTime() + 30 * 24 * 60 * 60 * 1000);
}
startDate.setHours(0, 0, 0, 0);
endDate.setHours(0, 0, 0, 0);
// ⭐ 关键:项目在 [startDate, endDate] 范围内的所有天都显示
const inRange = date >= startDate && date <= endDate;
return inRange;
});
关键改进:
deadline 的项目(往前推 30 天)createdAt 的项目(往后推 30 天)文件: yss-project/src/app/pages/admin/employees/employees.ts
新增日志(第 456-477 行):
// ⭐ 详细的调试日志
console.log(`📅 [buildCalendarData] 日历生成完成:`, {
总天数: days.length,
本月天数: daysInMonth,
有项目的天数: days.filter(d => d.isCurrentMonth && d.projectCount > 0).length,
项目总数: projects.length,
项目详情: projects.map(p => ({
name: p.name,
createdAt: (p as any).createdAt,
deadline: (p as any).deadline
}))
});
// 输出每一天的项目统计(只输出有项目的天)
const daysWithProjects = days.filter(d => d.isCurrentMonth && d.projectCount > 0);
if (daysWithProjects.length > 0) {
console.log(`📅 [buildCalendarData] 有项目的日期:`, daysWithProjects.map(d => ({
日期: d.date.toISOString().split('T')[0],
项目数: d.projectCount,
项目: d.projects.map((p: any) => p.name)
})));
}
日志作用:
createdAt 和 deadline// 日历生成日志
📅 [buildCalendarData] 日历生成完成: {
总天数: 42,
本月天数: 30,
有项目的天数: 0, // ❌ 没有项目被标记
项目总数: 3
}
问题:
// 日历生成日志
📅 [buildCalendarData] 日历生成完成: {
总天数: 42,
本月天数: 30,
有项目的天数: 15, // ✅ 正确标记了 15 天
项目总数: 3,
项目详情: [
{ name: '项目A', createdAt: '2025-11-01', deadline: '2025-11-30' },
{ name: '项目B', createdAt: null, deadline: '2025-11-15' },
{ name: '项目C', createdAt: '2025-11-20', deadline: null }
]
}
// 有项目的日期详情
📅 [buildCalendarData] 有项目的日期: [
{ 日期: '2025-11-01', 项目数: 1, 项目: ['项目A'] },
{ 日期: '2025-11-02', 项目数: 1, 项目: ['项目A'] },
{ 日期: '2025-11-03', 项目数: 1, 项目: ['项目A'] },
// ... 更多日期
{ 日期: '2025-11-15', 项目数: 2, 项目: ['项目A', '项目B'] },
// ... 更多日期
{ 日期: '2025-11-30', 项目数: 2, 项目: ['项目A', '项目C'] }
]
改进:
createdAt 和 deadline// 项目 A
{
name: '华迈效果——21/22初稿',
createdAt: '2025-11-01T00:00:00Z',
deadline: '2025-11-30T00:00:00Z'
}
// 日历显示:11月1日到11月30日,每天都标记该项目
// ✅ 使用实际的项目周期
deadline// 项目 B
{
name: '某紧急项目',
createdAt: null,
deadline: '2025-11-15T00:00:00Z'
}
// 日历显示:10月16日到11月15日,每天都标记该项目
// ✅ 往前推30天作为开始日期
createdAt// 项目 C
{
name: '某新项目',
createdAt: '2025-11-20T00:00:00Z',
deadline: null
}
// 日历显示:11月20日到12月20日,每天都标记该项目
// ✅ 往后推30天作为结束日期
启动应用
cd yss-project
npm start
打开管理端员工页面
http://localhost:4200/admin/employeesF12 打开控制台点击任意设计师员工
切换到"项目负载"标签页
🚀 [Employees] 开始打开员工信息面板: 徐福静 (xxxxxxxx)
🔄 [Employees] 预加载员工 xxxxxxxx 的完整数据...
✅ [Employees] 项目数据加载完成: {
currentProjects: 3,
ongoingProjects: 3,
项目列表: ['项目A', '项目B', '项目C']
}
📅 [buildCalendarData] 日历生成完成: {
总天数: 42,
本月天数: 30,
有项目的天数: 15,
项目总数: 3,
项目详情: [
{ name: '项目A', createdAt: '...', deadline: '...' },
{ name: '项目B', createdAt: null, deadline: '...' },
{ name: '项目C', createdAt: '...', deadline: null }
]
}
📅 [buildCalendarData] 有项目的日期: [
{ 日期: '2025-11-01', 项目数: 1, 项目: ['项目A'] },
{ 日期: '2025-11-02', 项目数: 1, 项目: ['项目A'] },
// ... 更多日期
]
✅ [Employees] 面板已显示
🔍 [employeeDetailForTeamLeader] 开始转换: { ... }
✅ [employeeDetailForTeamLeader] 转换完成: {
currentProjects: 3,
projectDataLength: 3,
hasCalendarData: true,
calendarDays: 42
}
✅ 负载概况:
✅ 负载详细日历:
✅ 能力问卷:
日期处理更智能
调试日志更详细
代码质量提升
// 智能日期范围处理
if (deadline && createdAt) {
startDate = new Date(createdAt);
endDate = new Date(deadline);
} else if (deadline) {
startDate = new Date(deadline.getTime() - 30 * 24 * 60 * 60 * 1000);
endDate = new Date(deadline);
} else {
startDate = new Date(createdAt!);
endDate = new Date(createdAt!.getTime() + 30 * 24 * 60 * 60 * 1000);
}
yss-project/src/app/pages/admin/employees/employees.ts
✅ No linter errors found.
📌 重要:修复的关键在于日历生成逻辑现在与组长端完全一致,支持智能处理三种日期场景! ✨