// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 // // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 // // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! using Admin.NET.Plugin.DingTalk.RequestProxy.Attendance.DTO; using NewLife; namespace Admin.NET.Plugin.DingTalk.RequestProxy.Attendance; public class AttendanceRequest : IScoped { private readonly IAttendanceRequestProxy _request; public AttendanceRequest(IAttendanceRequestProxy request) { _request = request; } /// /// 获取打卡详情 /// /// /// 企业内的员工ID列表,最大值50 /// 查询考勤打卡记录的起始工作日 /// 查询考勤打卡记录的结束工作日 /// 是否为海外企业使用 /// public async Task ListRecord(string accessToken, List useridList, DateTime from, DateTime to, bool isI18N = false) { var requestBody = new ListRecordRequest { UserIds = useridList, CheckDateFrom = from.ToString("yyyy-MM-dd HH:mm:ss"), CheckDateTo = to.ToString("yyyy-MM-dd HH:mm:ss"), IsI18n = isI18N }; var resStr = await _request.ListRecord(accessToken, requestBody); var res = resStr.ToObject(); return res; } /// /// 通知审批通过 /// /// /// 员工的userId /// 审批单ID,最大长度100个字符,自定义值 /// 审批单类型名称,最大长度20个字符。 支持类型如下:请假, 出差,外出,加班 /// 审批单跳转地址,最大长度200个字符 /// 审批单类型,可取值:1:加班,2:出差、外出,3:请假 /// 开始时间。开始时间不能早于当前时间前31天 /// 结束时间 /// 时长单位,支持格式如下:day,halfDay,hour:biz_type为1时仅支持hour /// 计算方法:0:按自然日计算,1:按工作日计算 /// 假期规则唯一标识。选填。仅支持bizType=3 请假时传不为空,可以支持根据假期类型设置的取整规则进行时长取整 /// 子类型名称,最大长度20个字符。审批单类型biz_type=3时,该参数必传。 /// biz_type为1时必传,加班时长单位小时 /// biz_type为1时必传:1:加班转调休,2:加班转工资 /// public async Task ApproveFinish(string accessToken, string userid, string approveId, string tagName, string jumpUrl, AttendanceBizTypeEnum bizType, DateTime fromTime, DateTime toTime, AttendanceDurationUnitEnum durationUnit, AttendanceCalculateModelEnum calculateModel, string? leaveCode = null, string? subType = null, string? overTimeDuration = null, long? overTimeToMore = null) { if (bizType == AttendanceBizTypeEnum.请假 && string.IsNullOrEmpty(subType)) throw Oops.Oh("审批单类型biz_type=3时,subType必传。"); if (bizType == AttendanceBizTypeEnum.加班 && (string.IsNullOrEmpty(overTimeDuration) || !overTimeToMore.HasValue)) throw Oops.Oh("biz_type为1时,overTimeDuration和overTimeToMore必传"); var fromTimeStr = ""; var toTimeStr = ""; switch (durationUnit) { case AttendanceDurationUnitEnum.Day: fromTimeStr = fromTime.ToString("yyyy-MM-dd"); toTimeStr = toTime.ToString("yyyy-MM-dd"); break; case AttendanceDurationUnitEnum.HalfDay: fromTimeStr = TimeToHalfDay(fromTime); toTimeStr = TimeToHalfDay(toTime); break; case AttendanceDurationUnitEnum.Hour: fromTimeStr = fromTime.ToString("yyyy-MM-dd HH:mm"); toTimeStr = toTime.ToString("yyyy-MM-dd HH:mm"); break; } var requestBody = new AttdendanceApprovalsFinishRequest { ApproveId = approveId, TagName = tagName, JumpUrl = jumpUrl, OvertimeDuration = overTimeDuration, OverTimeToMore = overTimeToMore, SubType = subType, TopCalculateApproveDurationParam = new TopCalculateApproveDurationParamDomain { BizType = bizType, FromTime = fromTimeStr, ToTime = toTimeStr, DurationUnit = durationUnit.ToString(), CalculateModel = (long)calculateModel, LeaveCode = leaveCode } }; try { var resStr = await _request.ApprovalsFinish(userid, accessToken, requestBody); var res = resStr.ToObject(); return res; } catch (Exception ex) { throw Oops.Oh(ex.Message); } } /// /// 通知审批撤销 /// /// /// 员工的userId /// 审批ID /// public async Task ApproveCancel(string accessToken, string userid, string approveId) { var resStr = await _request.ApprovalsCancel(accessToken, new AttendanceApprovelsCancelRequest { ApproveId = approveId, UserId = userid, }); return resStr.ToObject(); } /// /// 查询请假状态 /// /// /// 待查询用户的ID列表,每次最多100个 /// 开始时间 ,支持最多180天的查询 /// 结束时间,支持最多180天的查询 /// 支持分页查询,与size参数同时设置时才生效,此参数代表偏移量,偏移量从0开始 /// 支持分页查询,与offset参数同时设置时才生效,此参数代表分页大小,最大20 /// public async Task GetLeaveStatus(string accessToken, List userIdList, DateTime startTime, DateTime endTime, int offset = 0, int size = 10) { var resStr = await _request.GetLeaveStatus(accessToken, new GetLeaveStatusRequest { UserIdList = userIdList.Join(), StartTime = new DateTimeOffset(startTime).ToUnixTimeMilliseconds(), EndTime = new DateTimeOffset(endTime).ToUnixTimeMilliseconds(), Offset = offset, Size = size }); return resStr.ToObject(); } private string TimeToHalfDay(DateTime time) { var dateStr = time.ToString("yyyy-MM-dd"); var apm = time.Hour < 12 ? "AM" : "PM"; return dateStr + " " + apm; } }