# 组长端设计师负载日历月份切换功能 ## 功能概述 为组长端的设计师详情面板中的负载详细日历添加上月/下月切换按钮,允许组长查看设计师在不同月份的工作负载情况。 ## 实现日期 2025年11月3日 ## 修改的文件 ### 1. `src/app/pages/team-leader/dashboard/dashboard.html` **修改位置**:第441-462行(日历月份标题部分) **修改内容**: - 在月份标题左侧添加"上月"按钮 - 在月份标题右侧添加"下月"按钮 - 使用SVG图标展示箭头 - 绑定点击事件到 `changeEmployeeCalendarMonth()` 方法 **代码片段**: ```html
{{ selectedEmployeeDetail.calendarData.currentMonth | date:'yyyy年M月' }}
``` ### 2. `src/app/pages/team-leader/dashboard/dashboard.ts` #### 修改1:添加员工日历相关数据属性(第207-209行) **目的**:保存当前员工信息和项目数据,用于月份切换时重新生成日历 ```typescript // 当前员工日历相关数据(用于切换月份) private currentEmployeeName: string = ''; private currentEmployeeProjects: any[] = []; ``` #### 修改2:修改 `generateEmployeeDetail` 方法(第2694-2699行) **目的**:在生成员工详情时保存员工信息和项目数据 ```typescript // 保存当前员工信息和项目数据(用于切换月份) this.currentEmployeeName = employeeName; this.currentEmployeeProjects = employeeProjects; // 生成日历数据 const calendarData = this.generateEmployeeCalendar(employeeName, employeeProjects); ``` #### 修改3:修改 `generateEmployeeCalendar` 方法签名(第2771行) **目的**:支持传入指定月份参数 **修改前**: ```typescript private generateEmployeeCalendar(employeeName: string, employeeProjects: any[]): EmployeeCalendarData { const currentMonth = new Date(); ``` **修改后**: ```typescript private generateEmployeeCalendar(employeeName: string, employeeProjects: any[], targetMonth?: Date): EmployeeCalendarData { const currentMonth = targetMonth || new Date(); ``` #### 修改4:添加 `changeEmployeeCalendarMonth` 方法(第2920-2945行) **目的**:实现月份切换逻辑 ```typescript /** * 切换员工日历月份 * @param direction -1=上月, 1=下月 */ changeEmployeeCalendarMonth(direction: number): void { if (!this.selectedEmployeeDetail?.calendarData) { return; } const currentMonth = this.selectedEmployeeDetail.calendarData.currentMonth; const newMonth = new Date(currentMonth); newMonth.setMonth(newMonth.getMonth() + direction); // 重新生成日历数据 const newCalendarData = this.generateEmployeeCalendar( this.currentEmployeeName, this.currentEmployeeProjects, newMonth ); // 更新员工详情中的日历数据 this.selectedEmployeeDetail = { ...this.selectedEmployeeDetail, calendarData: newCalendarData }; } ``` ### 3. `src/app/pages/team-leader/dashboard/dashboard-calendar.scss` **修改位置**:第9-60行(日历月份标题样式) **修改内容**: - 将 `calendar-month-header` 改为 flex 布局,支持左右布局 - 为月份标题设置 flex: 1 居中显示 - 添加 `.btn-prev-month` 和 `.btn-next-month` 按钮样式 - 添加悬停效果:渐变背景、图标颜色变化、缩放动画 - 添加点击效果:缩小动画 **关键样式**: ```scss .calendar-month-header { display: flex; align-items: center; justify-content: space-between; .month-title { flex: 1; text-align: center; } .btn-prev-month, .btn-next-month { background: transparent; border: 1px solid #e2e8f0; border-radius: 8px; width: 32px; height: 32px; cursor: pointer; transition: all 0.2s ease; &:hover { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-color: #667eea; transform: scale(1.05); svg { stroke: white; } } &:active { transform: scale(0.95); } } } ``` ## 功能特性 ### 1. 月份导航 - ✅ 左侧按钮:切换到上一个月 - ✅ 右侧按钮:切换到下一个月 - ✅ 中间显示:当前月份(格式:yyyy年M月) ### 2. 数据同步 - ✅ 切换月份时自动重新生成该月的日历数据 - ✅ 保留员工信息和项目数据,确保数据一致性 - ✅ 正确计算每天的项目数量和项目列表 ### 3. 视觉效果 - ✅ 按钮使用简洁的左右箭头图标 - ✅ 悬停时按钮显示渐变紫色背景 - ✅ 图标颜色从灰色变为白色 - ✅ 缩放动画提供视觉反馈 - ✅ 点击时有缩小效果,增强交互感 ### 4. 日历数据处理 - ✅ 自动补齐月初和月末的日期(确保从周日开始) - ✅ 正确标记"今天"(相对于系统当前日期) - ✅ 区分当前月和其他月的日期(其他月半透明显示) - ✅ 计算每天的项目数量 - ✅ 高负载标记(2个及以上项目) ## 用户使用场景 ### 场景1:查看历史负载 组长想要查看设计师上个月的工作负载情况: 1. 点击某个设计师,打开详情面板 2. 查看负载详细日历 3. 点击左侧"上月"按钮 4. 日历显示上个月的数据 ### 场景2:查看未来负载 组长想要查看设计师下个月的工作安排: 1. 在详情面板中查看日历 2. 点击右侧"下月"按钮 3. 日历显示下个月的数据 4. 查看每天的项目安排 ### 场景3:跨月对比 组长想要对比不同月份的负载情况: 1. 查看当前月份 2. 点击"上月"查看上月数据 3. 点击"下月"返回当前月 4. 继续点击"下月"查看下月数据 ## 技术亮点 ### 1. 灵活的参数设计 `generateEmployeeCalendar` 方法使用可选的 `targetMonth` 参数: - 不传参数:默认生成当前月份 - 传入日期:生成指定月份 ### 2. 数据缓存优化 使用 `currentEmployeeName` 和 `currentEmployeeProjects` 缓存当前员工数据: - 避免重复查询数据库 - 快速切换月份 - 保持数据一致性 ### 3. 不可变数据更新 使用对象展开运算符更新 `selectedEmployeeDetail`: ```typescript this.selectedEmployeeDetail = { ...this.selectedEmployeeDetail, calendarData: newCalendarData }; ``` - 符合 Angular 的变更检测机制 - 确保UI正确更新 ### 4. 防御性编程 在 `changeEmployeeCalendarMonth` 中进行空值检查: ```typescript if (!this.selectedEmployeeDetail?.calendarData) { return; } ``` - 避免空指针错误 - 提高代码健壮性 ## 后续优化建议 ### 1. 快速跳转 可以添加月份选择器,允许直接跳转到指定月份: ```html ``` ### 2. 年份切换 当前只能切换月份,可以添加年份切换按钮: ```html ``` ### 3. 键盘导航 支持键盘快捷键: - 左箭头键:上月 - 右箭头键:下月 - Home键:回到当前月 ### 4. 加载状态 切换月份时显示加载动画,提升用户体验: ```typescript isLoadingCalendar: boolean = false; changeEmployeeCalendarMonth(direction: number): void { this.isLoadingCalendar = true; // ... 生成日历 ... this.isLoadingCalendar = false; } ``` ### 5. 数据预加载 预加载前后一个月的数据,实现无缝切换: ```typescript // 缓存前后3个月的日历数据 private calendarCache: Map = new Map(); ``` ## 测试建议 ### 功能测试 - [ ] 点击"上月"按钮,日历显示上个月 - [ ] 点击"下月"按钮,日历显示下个月 - [ ] 连续点击可以跨年切换(如:2024年12月 → 2025年1月) - [ ] 切换月份后项目数量和项目列表正确 - [ ] "今天"标记在非当前月份时不显示 ### UI测试 - [ ] 按钮悬停时显示紫色渐变背景 - [ ] 按钮点击时有缩放动画 - [ ] 月份标题居中显示 - [ ] 按钮大小和图标大小适中 - [ ] 在不同屏幕尺寸下布局正常 ### 边界测试 - [ ] 未打开员工详情面板时点击按钮不报错 - [ ] 员工没有项目时切换月份不报错 - [ ] 从12月切换到1月,年份正确增加 - [ ] 从1月切换到12月,年份正确减少 ## 总结 此功能为组长端的设计师负载管理增加了重要的时间维度导航能力,使组长能够: - 📅 查看历史工作负载 - 📈 预测未来工作安排 - 📊 对比不同时期的负载情况 - 🎯 更科学地进行任务分配 通过简洁的UI设计和流畅的交互动画,提升了用户体验,使负载管理更加高效便捷。