using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using ZhonTai.Admin.Core.Dto;
using ZhonTai.Admin.Services;
using NPP.SmartSchedue.Api.Contracts.Services.Time;
using NPP.SmartSchedue.Api.Contracts.Services.Time.Input;
using NPP.SmartSchedue.Api.Contracts.Services.Time.Output;
using NPP.SmartSchedue.Api.Repositories.Time;
using NPP.SmartSchedue.Api.Contracts.Domain.Time;
using ZhonTai.DynamicApi;
using ZhonTai.DynamicApi.Attributes;
namespace NPP.SmartSchedue.Api.Services.Time;
///
/// 员工休假服务
///
[DynamicApi(Area = "app")]
public class EmployeeLeaveService : BaseService, IEmployeeLeaveService, IDynamicApi
{
private readonly EmployeeLeaveRepository _employeeLeaveRepository;
public EmployeeLeaveService(EmployeeLeaveRepository employeeLeaveRepository)
{
_employeeLeaveRepository = employeeLeaveRepository;
}
///
/// 查询
///
///
///
public async Task GetAsync(long id)
{
var output = await _employeeLeaveRepository.Select
.WhereDynamic(id)
.ToOneAsync();
return output;
}
///
/// 查询分页
///
///
///
[HttpPost]
public async Task> GetPageAsync(PageInput input)
{
var list = await _employeeLeaveRepository.Select
.WhereIf(input.Filter?.EmployeeId.HasValue == true, a => a.EmployeeId == input.Filter.EmployeeId.Value)
.WhereIf(!string.IsNullOrEmpty(input.Filter?.LeaveType), a => a.LeaveType.Contains(input.Filter.LeaveType))
.WhereIf(!string.IsNullOrEmpty(input.Filter?.Status), a => a.Status.Contains(input.Filter.Status))
.Count(out var total)
.OrderByDescending(a => a.Id)
.Page(input.CurrentPage, input.PageSize)
.ToListAsync();
var data = new PageOutput()
{
List = list,
Total = total
};
return data;
}
///
/// 添加
///
///
///
public async Task AddAsync(EmployeeLeaveAddInput input)
{
var entity = Mapper.Map(input);
entity.Status = "approved";
var result = await _employeeLeaveRepository.InsertAsync(entity);
return result.Id;
}
///
/// 修改
///
///
///
public async Task UpdateAsync(EmployeeLeaveUpdateInput input)
{
var entity = await _employeeLeaveRepository.GetAsync(input.Id);
Mapper.Map(input, entity);
entity.Status = "approved";
await _employeeLeaveRepository.UpdateAsync(entity);
}
///
/// 删除
///
///
///
public async Task DeleteAsync(long id)
{
await _employeeLeaveRepository.DeleteAsync(id);
}
///
/// 软删除
///
///
///
public async Task SoftDeleteAsync(long id)
{
await _employeeLeaveRepository.SoftDeleteAsync(id);
}
///
/// 批量软删除
///
///
///
public async Task BatchSoftDeleteAsync(long[] ids)
{
await _employeeLeaveRepository.SoftDeleteAsync(ids);
}
///
/// 获取员工在指定时间段内的已批准请假记录
///
/// 员工ID
/// 开始时间
/// 结束时间
///
public async Task> GetApprovedLeavesByEmployeeAndTimeRangeAsync(
long employeeId,
DateTime startTime,
DateTime endTime)
{
var leaves = await _employeeLeaveRepository.Select
.Where(a => a.EmployeeId == employeeId)
.Where(a => a.Status == "Approved") // 只查询已批准的请假
.Where(a => a.StartTime <= endTime && a.EndTime >= startTime) // 时间段重叠判断
.ToListAsync();
return leaves;
}
///
/// 检查员工在指定时间段内是否有请假
///
/// 员工ID
/// 开始时间
/// 结束时间
///
public async Task HasApprovedLeaveInTimeRangeAsync(
long employeeId,
DateTime startTime,
DateTime endTime)
{
var hasLeave = await _employeeLeaveRepository.Select
.Where(a => a.EmployeeId == employeeId)
.Where(a => a.Status == "Approved") // 只查询已批准的请假
.Where(a => a.StartTime <= endTime && a.EndTime >= startTime) // 时间段重叠判断
.AnyAsync();
return hasLeave;
}
///
/// 检查员工在指定日期是否在请假
/// 智能分配系统专用方法,返回详细的请假信息
/// 深度业务思考:全面检查员工在指定日期的请假状态,支持多个重叠请假记录的场景
///
/// 员工ID
/// 检查日期
/// 请假状态信息
public async Task IsOnLeaveAsync(long employeeId, DateTime checkDate)
{
try
{
// 将检查日期标准化为当天的日期范围(00:00:00 到 23:59:59)
var checkDateStart = checkDate.Date;
var checkDateEnd = checkDateStart.AddDays(1).AddTicks(-1);
// 查询该员工在指定日期范围内所有已批准的请假记录
var leaveRecords = await _employeeLeaveRepository.Select
.Where(a => a.EmployeeId == employeeId)
.Where(a => a.Status == "approved" || a.Status == "Approved") // 兼容不同的状态值格式
.Where(a => a.StartTime <= checkDateEnd && a.EndTime >= checkDateStart) // 时间段重叠判断
.OrderBy(a => a.StartTime)
.ToListAsync();
var result = new EmployeeLeaveStatusResult
{
CheckDate = checkDate,
IsOnLeave = leaveRecords.Any(),
LeaveRecords = new List()
};
if (!leaveRecords.Any())
{
// 没有请假记录
return result;
}
// 转换请假记录到简化格式
result.LeaveRecords = leaveRecords.Select(record => new EmployeeLeaveInfo
{
Id = record.Id,
LeaveType = record.LeaveType,
StartTime = record.StartTime,
EndTime = record.EndTime,
Reason = record.Reason
}).ToList();
// 设置主要请假信息(如果有多个重叠请假,取最早开始的一个作为主要信息)
var primaryLeave = leaveRecords.First();
result.LeaveType = primaryLeave.LeaveType;
result.LeaveStartTime = primaryLeave.StartTime;
result.LeaveEndTime = primaryLeave.EndTime;
result.LeaveReason = primaryLeave.Reason;
result.LeaveRecordId = primaryLeave.Id;
return result;
}
catch (Exception ex)
{
// 异常情况下返回安全的默认结果
return new EmployeeLeaveStatusResult
{
CheckDate = checkDate,
IsOnLeave = false,
LeaveRecords = new List(),
LeaveReason = $"请假状态检查异常:{ex.Message}"
};
}
}
}