AttendanceRequest.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
  2. //
  3. // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
  4. //
  5. // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
  6. using Admin.NET.Plugin.DingTalk.RequestProxy.Attendance.DTO;
  7. using NewLife;
  8. namespace Admin.NET.Plugin.DingTalk.RequestProxy.Attendance;
  9. public class AttendanceRequest : IScoped
  10. {
  11. private readonly IAttendanceRequestProxy _request;
  12. public AttendanceRequest(IAttendanceRequestProxy request)
  13. {
  14. _request = request;
  15. }
  16. /// <summary>
  17. /// 获取打卡详情
  18. /// </summary>
  19. /// <param name="accessToken"></param>
  20. /// <param name="useridList">企业内的员工ID列表,最大值50</param>
  21. /// <param name="from">查询考勤打卡记录的起始工作日</param>
  22. /// <param name="to">查询考勤打卡记录的结束工作日</param>
  23. /// <param name="isI18N">是否为海外企业使用</param>
  24. /// <returns></returns>
  25. public async Task<ListRecordResponse> ListRecord(string accessToken, List<string> useridList, DateTime from, DateTime to, bool isI18N = false)
  26. {
  27. var requestBody = new ListRecordRequest
  28. {
  29. UserIds = useridList,
  30. CheckDateFrom = from.ToString("yyyy-MM-dd HH:mm:ss"),
  31. CheckDateTo = to.ToString("yyyy-MM-dd HH:mm:ss"),
  32. IsI18n = isI18N
  33. };
  34. var resStr = await _request.ListRecord(accessToken, requestBody);
  35. var res = resStr.ToObject<ListRecordResponse>();
  36. return res;
  37. }
  38. /// <summary>
  39. /// 通知审批通过
  40. /// </summary>
  41. /// <param name="accessToken"></param>
  42. /// <param name="userid">员工的userId</param>
  43. /// <param name="approveId">审批单ID,最大长度100个字符,自定义值</param>
  44. /// <param name="tagName">审批单类型名称,最大长度20个字符。 支持类型如下:请假, 出差,外出,加班</param>
  45. /// <param name="jumpUrl">审批单跳转地址,最大长度200个字符</param>
  46. /// <param name="bizType">审批单类型,可取值:1:加班,2:出差、外出,3:请假</param>
  47. /// <param name="fromTime">开始时间。开始时间不能早于当前时间前31天</param>
  48. /// <param name="toTime">结束时间</param>
  49. /// <param name="durationUnit">时长单位,支持格式如下:day,halfDay,hour:biz_type为1时仅支持hour</param>
  50. /// <param name="calculateModel">计算方法:0:按自然日计算,1:按工作日计算</param>
  51. /// <param name="leaveCode">假期规则唯一标识。选填。仅支持bizType=3 请假时传不为空,可以支持根据假期类型设置的取整规则进行时长取整</param>
  52. /// <param name="subType">子类型名称,最大长度20个字符。审批单类型biz_type=3时,该参数必传。</param>
  53. /// <param name="overTimeDuration">biz_type为1时必传,加班时长单位小时</param>
  54. /// <param name="overTimeToMore">biz_type为1时必传:1:加班转调休,2:加班转工资</param>
  55. /// <returns></returns>
  56. public async Task<AttendanceApprovalsFinishResponse> ApproveFinish(string accessToken, string userid, string approveId, string tagName, string jumpUrl,
  57. AttendanceBizTypeEnum bizType, DateTime fromTime, DateTime toTime, AttendanceDurationUnitEnum durationUnit, AttendanceCalculateModelEnum calculateModel, string? leaveCode = null,
  58. string? subType = null, string? overTimeDuration = null, long? overTimeToMore = null)
  59. {
  60. if (bizType == AttendanceBizTypeEnum.请假 && string.IsNullOrEmpty(subType))
  61. throw Oops.Oh("审批单类型biz_type=3时,subType必传。");
  62. if (bizType == AttendanceBizTypeEnum.加班 && (string.IsNullOrEmpty(overTimeDuration) || !overTimeToMore.HasValue))
  63. throw Oops.Oh("biz_type为1时,overTimeDuration和overTimeToMore必传");
  64. var fromTimeStr = "";
  65. var toTimeStr = "";
  66. switch (durationUnit)
  67. {
  68. case AttendanceDurationUnitEnum.Day:
  69. fromTimeStr = fromTime.ToString("yyyy-MM-dd");
  70. toTimeStr = toTime.ToString("yyyy-MM-dd");
  71. break;
  72. case AttendanceDurationUnitEnum.HalfDay:
  73. fromTimeStr = TimeToHalfDay(fromTime);
  74. toTimeStr = TimeToHalfDay(toTime);
  75. break;
  76. case AttendanceDurationUnitEnum.Hour:
  77. fromTimeStr = fromTime.ToString("yyyy-MM-dd HH:mm");
  78. toTimeStr = toTime.ToString("yyyy-MM-dd HH:mm");
  79. break;
  80. }
  81. var requestBody = new AttdendanceApprovalsFinishRequest
  82. {
  83. ApproveId = approveId,
  84. TagName = tagName,
  85. JumpUrl = jumpUrl,
  86. OvertimeDuration = overTimeDuration,
  87. OverTimeToMore = overTimeToMore,
  88. SubType = subType,
  89. TopCalculateApproveDurationParam = new TopCalculateApproveDurationParamDomain
  90. {
  91. BizType = bizType,
  92. FromTime = fromTimeStr,
  93. ToTime = toTimeStr,
  94. DurationUnit = durationUnit.ToString(),
  95. CalculateModel = (long)calculateModel,
  96. LeaveCode = leaveCode
  97. }
  98. };
  99. try
  100. {
  101. var resStr = await _request.ApprovalsFinish(userid, accessToken, requestBody);
  102. var res = resStr.ToObject<AttendanceApprovalsFinishResponse>();
  103. return res;
  104. }
  105. catch (Exception ex)
  106. {
  107. throw Oops.Oh(ex.Message);
  108. }
  109. }
  110. /// <summary>
  111. /// 通知审批撤销
  112. /// </summary>
  113. /// <param name="accessToken"></param>
  114. /// <param name="userid">员工的userId</param>
  115. /// <param name="approveId">审批ID</param>
  116. /// <returns></returns>
  117. public async Task<AttendanceApprovelsCancelResponse> ApproveCancel(string accessToken, string userid, string approveId)
  118. {
  119. var resStr = await _request.ApprovalsCancel(accessToken, new AttendanceApprovelsCancelRequest
  120. {
  121. ApproveId = approveId,
  122. UserId = userid,
  123. });
  124. return resStr.ToObject<AttendanceApprovelsCancelResponse>();
  125. }
  126. /// <summary>
  127. /// 查询请假状态
  128. /// </summary>
  129. /// <param name="accessToken"></param>
  130. /// <param name="userIdList">待查询用户的ID列表,每次最多100个</param>
  131. /// <param name="startTime">开始时间 ,支持最多180天的查询</param>
  132. /// <param name="endTime">结束时间,支持最多180天的查询</param>
  133. /// <param name="offset">支持分页查询,与size参数同时设置时才生效,此参数代表偏移量,偏移量从0开始</param>
  134. /// <param name="size">支持分页查询,与offset参数同时设置时才生效,此参数代表分页大小,最大20</param>
  135. /// <returns></returns>
  136. public async Task<GetLeaveStatusResponse> GetLeaveStatus(string accessToken, List<string> userIdList, DateTime startTime, DateTime endTime, int offset = 0, int size = 10)
  137. {
  138. var resStr = await _request.GetLeaveStatus(accessToken, new GetLeaveStatusRequest
  139. {
  140. UserIdList = userIdList.Join(),
  141. StartTime = new DateTimeOffset(startTime).ToUnixTimeMilliseconds(),
  142. EndTime = new DateTimeOffset(endTime).ToUnixTimeMilliseconds(),
  143. Offset = offset,
  144. Size = size
  145. });
  146. return resStr.ToObject<GetLeaveStatusResponse>();
  147. }
  148. private string TimeToHalfDay(DateTime time)
  149. {
  150. var dateStr = time.ToString("yyyy-MM-dd");
  151. var apm = time.Hour < 12 ? "AM" : "PM";
  152. return dateStr + " " + apm;
  153. }
  154. }