using System; using System.Collections.Generic; using System.Threading.Tasks; using NPP.SmartSchedue.Api.Contracts.Services.Time.Input; using NPP.SmartSchedue.Api.Contracts.Services.Time.Output; using ZhonTai.Admin.Core.Dto; namespace NPP.SmartSchedue.Api.Contracts.Services.Time; /// /// 班次不可用标记服务接口 /// 提供班次不可用数据的业务逻辑处理 /// public interface IShiftUnavailabilityService { #region 基础CRUD操作 /// /// 添加班次不可用标记 /// /// 添加输入模型 /// 新创建记录的ID Task AddAsync(ShiftUnavailabilityAddInput input); /// /// 更新班次不可用标记 /// /// 更新输入模型 /// 是否更新成功 Task UpdateAsync(ShiftUnavailabilityUpdateInput input); /// /// 删除班次不可用标记 /// /// 记录ID /// 是否删除成功 Task DeleteAsync(long id); /// /// 获取班次不可用标记详情 /// /// 记录ID /// 详情信息 Task GetAsync(long id); /// /// 分页查询班次不可用标记 /// /// 查询条件 /// 分页结果 Task> GetPageAsync(PageInput input); #endregion #region 网格视图专用方法 /// /// 获取指定员工指定月份的网格数据 /// 用于前端网格组件的数据加载 /// /// 员工ID /// 月份 /// 网格数据 Task GetMonthlyGridDataAsync(long personnelId, DateTime month); /// /// 切换单元格状态(快速操作) /// 如果该单元格已标记为不可用,则清除;否则用默认原因标记为不可用 /// /// 切换输入 /// 操作结果 Task ToggleCellAsync(CellToggleInput input); /// /// 设置单元格状态(精确操作) /// /// 设置输入 /// 操作结果 Task SetCellAsync(CellSetInput input); #endregion #region 批量操作方法 /// /// 模板复制 /// 将指定日期的班次不可用设置复制到其他日期 /// /// 复制输入 /// 批量操作结果 Task CopyTemplateAsync(TemplateCopyInput input); /// /// 周期性设置 /// 按周模式批量设置班次不可用标记 /// /// 周期设置输入 /// 批量操作结果 Task SetWeeklyPatternAsync(WeeklyPatternInput input); /// /// 批量设置单元格 /// /// 批量设置输入 /// 批量操作结果 Task BatchSetCellsAsync(BatchCellEditInput input); #endregion #region 智能排班集成方法 /// /// 获取指定日期和班次的不可用员工ID列表 /// 用于智能排班算法过滤不可用人员 /// /// 日期 /// 班次ID /// 不可用员工ID列表 Task> GetUnavailablePersonnelAsync(DateTime date, long shiftId); /// /// 检查人员班次的意愿 /// /// /// /// /// Task CheckUnavailablePersonnelByShift(DateTime date, long shiftId, long personnelId); /// /// 获取指定日期所有班次的不可用员工分布 /// /// 日期 /// 班次ID -> 不可用员工ID列表的字典 Task>> GetDailyUnavailablePersonnelAsync(DateTime date); /// /// 批量获取日期范围内的不可用员工分布 /// 用于智能排班算法的批量优化查询 /// /// 开始日期 /// 结束日期 /// 日期 -> (班次ID -> 不可用员工ID列表) 的嵌套字典 Task>>> GetRangeUnavailablePersonnelAsync(DateTime startDate, DateTime endDate); #endregion #region 统计分析方法 /// /// 获取员工不可用统计信息 /// /// 员工ID /// 开始日期 /// 结束日期 /// 统计信息 Task GetStatisticsAsync(long personnelId, DateTime startDate, DateTime endDate); /// /// 获取团队不可用报表 /// /// 员工ID列表 /// 月份 /// 团队报表列表 Task> GetTeamReportAsync(List personnelIds, DateTime month); #endregion }