DingTalkService.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
  2. //
  3. // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
  4. //
  5. // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
  6. using Admin.NET.Plugin.DingTalk.RequestProxy.Top;
  7. using Admin.NET.Plugin.DingTalk.RequestProxy.HRM;
  8. using Admin.NET.Plugin.DingTalk.RequestProxy.HRM.DTO;
  9. using Admin.NET.Core.Service;
  10. namespace Admin.NET.Plugin.DingTalk.Service;
  11. /// <summary>
  12. /// 钉钉服务 🧩
  13. /// </summary>
  14. [ApiDescriptionSettings(DingTalkConst.GroupName, Order = 100)]
  15. public class DingTalkService : IDynamicApiController, IScoped
  16. {
  17. private readonly IDingTalkApi _dingTalkApi;
  18. private readonly DingTalkOptions _dingTalkOptions;
  19. private readonly SysCacheService _sysCacheService;
  20. private readonly TopRequest _topRequest;
  21. private readonly HrmRequest _hrmRequest;
  22. private readonly string _accessTokenKey;
  23. public DingTalkService(IDingTalkApi dingTalkApi,
  24. IOptions<DingTalkOptions> dingTalkOptions,
  25. TopRequest topRequest,
  26. HrmRequest hrmRequest,
  27. SysCacheService sysCacheService)
  28. {
  29. _dingTalkApi = dingTalkApi;
  30. _dingTalkOptions = dingTalkOptions.Value;
  31. _sysCacheService = sysCacheService;
  32. _topRequest = topRequest;
  33. _hrmRequest = hrmRequest;
  34. _accessTokenKey = DingTalkConst.AccessTokenKeyPrefix + _dingTalkOptions.ClientId;
  35. }
  36. [HttpGet, DisplayName("获取花名册元数据")]
  37. public async Task<GetRosterMetaResponse> GetRosterMeta()
  38. {
  39. var token = await GetDingTalkToken();
  40. var res = await _hrmRequest.GetRosterMeta(token, _dingTalkOptions.AgentId);
  41. return res;
  42. }
  43. /// <summary>
  44. /// 获取企业内部应用的access_token
  45. /// </summary>
  46. /// <returns></returns>
  47. [HttpGet, DisplayName("获取企业内部应用的access_token")]
  48. public async Task<string> GetDingTalkToken()
  49. {
  50. var token = _sysCacheService.Get<string>(_accessTokenKey);
  51. if (token != null) return token;
  52. var tokenRes = await _topRequest.GetAccessToken(_dingTalkOptions.ClientId, _dingTalkOptions.ClientSecret);
  53. _sysCacheService.Set(_accessTokenKey, tokenRes.AccessToken, TimeSpan.FromSeconds(tokenRes.ExpireIn));
  54. return tokenRes.AccessToken;
  55. }
  56. /// <summary>
  57. /// 获取在职员工列表 🔖
  58. /// </summary>
  59. /// <param name="accessToken"></param>
  60. /// <param name="statusList"></param>
  61. /// <param name="size"></param>
  62. /// <param name="offset"></param>
  63. /// <returns></returns>
  64. [HttpPost, DisplayName("获取在职员工列表")]
  65. public async Task<EmployeeQueryOnJobResponse> GetDingTalkCurrentEmployeesList(string accessToken, List<string> statusList, int size, int offset)
  66. {
  67. return await _hrmRequest.EmployeeQueryOnJob(accessToken, statusList, size, offset);
  68. }
  69. /// <summary>
  70. /// 获取员工花名册字段信息 🔖
  71. /// </summary>
  72. /// <param name="accessToken"></param>
  73. /// <param name="userIdList"></param>
  74. /// <param name="fieldFilterList"></param>
  75. /// <param name="appAgentId"></param>
  76. /// <returns></returns>
  77. [HttpPost, DisplayName("获取员工花名册字段信息")]
  78. public async Task<RosterListsQueryResponse> GetDingTalkCurrentEmployeesRosterList(string accessToken, List<string> userIdList, List<string> fieldFilterList, long appAgentId)
  79. {
  80. return await _hrmRequest.RosterListsQuery(accessToken, userIdList, fieldFilterList, appAgentId);
  81. }
  82. /// <summary>
  83. /// 发送钉钉互动卡片 🔖
  84. /// </summary>
  85. /// <param name="accessToken"></param>
  86. /// <param name="input"></param>
  87. /// <returns></returns>
  88. [DisplayName("给指定用户发送钉钉互动卡片")]
  89. public async Task<DingTalkSendInteractiveCardsOutput> DingTalkSendInteractiveCards(string accessToken, DingTalkSendInteractiveCardsInput input)
  90. {
  91. return await _dingTalkApi.DingTalkSendInteractiveCards(accessToken, input);
  92. }
  93. }