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
}