DDDeptController.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. using Microsoft.AspNetCore.Http;
  2. using Microsoft.AspNetCore.Mvc;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using Microsoft.Extensions.Configuration;
  8. using TEAMModelOS.SDK.DI;
  9. using TEAMModelOS.Models;
  10. using DingTalk.Api;
  11. using DingTalk.Api.Request;
  12. using DingTalk.Api.Response;
  13. using TEAMModelOS.SDK.Models.Cosmos.BI;
  14. using System.Text.Json;
  15. using Azure.Cosmos;
  16. namespace TEAMModeBI.Controllers.DingDingStruc
  17. {
  18. [Route("branch")]
  19. [ApiController]
  20. public class DDDeptController : ControllerBase
  21. {
  22. private readonly IConfiguration _configuration;
  23. //数据容器
  24. private readonly AzureCosmosFactory _azureCosmos;
  25. //钉钉提示信息
  26. private readonly DingDing _dingDing;
  27. private readonly Option _option;
  28. public DDDeptController(IConfiguration configuration,AzureCosmosFactory azureCosmos)
  29. {
  30. _configuration = configuration;
  31. _azureCosmos = azureCosmos;
  32. }
  33. #region 从钉钉拿数据存CosmosDB中
  34. /// <summary>
  35. /// 获取部门机构
  36. /// </summary>
  37. /// <returns></returns>
  38. [ProducesDefaultResponseType]
  39. [HttpPost("get-depts")]
  40. public async Task<IActionResult> GetDDDepts()
  41. {
  42. try
  43. {
  44. string appKey = _configuration["DingDingAuth:appKey"];
  45. string appSecret = _configuration["DingDingAuth:appSecret"];
  46. string agentld = _configuration["DingDingAuth:Agentld"];
  47. //获取access_token
  48. DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
  49. OapiGettokenRequest request = new OapiGettokenRequest() { Appkey = appKey, Appsecret = appSecret };
  50. request.SetHttpMethod("Get");
  51. OapiGettokenResponse response = client.Execute(request);
  52. if (response.IsError)
  53. {
  54. return BadRequest();
  55. }
  56. //access_token的有效期为7200秒(2小时),有效期内重复获取会返回相同结果并自动续期,过期后获取会返回新的access_token
  57. string access_token = response.AccessToken;
  58. //获取一级部门列表
  59. IDingTalkClient V2departClient = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
  60. OapiV2DepartmentListsubRequest reqPartment1 = new OapiV2DepartmentListsubRequest() { DeptId = 1L, Language = "zh_CN" };
  61. OapiV2DepartmentListsubResponse rspPartment1 = V2departClient.Execute(reqPartment1, access_token);
  62. if (rspPartment1.IsError)
  63. {
  64. return BadRequest();
  65. }
  66. DeptNode deptNodes = new DeptNode();
  67. deptNodes.id = agentld;
  68. deptNodes.code = "DDPartment";
  69. deptNodes.pk = "DDPartment";
  70. deptNodes.ttl = -1;
  71. List<DeptInfo> deptlist = new List<DeptInfo>();
  72. if (rspPartment1.Result != null)
  73. {
  74. foreach (var depts in rspPartment1.Result)
  75. {
  76. DeptInfo deptInfo = new DeptInfo();
  77. deptInfo.id = depts.DeptId;
  78. deptInfo.pid = depts.ParentId;
  79. deptInfo.name = depts.Name;
  80. //获取一级部门用户列表
  81. IDingTalkClient userListClient1 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid");
  82. OapiUserListidRequest reqUsers1 = new OapiUserListidRequest() { DeptId = depts.DeptId };
  83. OapiUserListidResponse rspUsers1 = userListClient1.Execute(reqUsers1, access_token);
  84. if (rspUsers1.Result != null)
  85. {
  86. deptInfo.users = rspUsers1.Result.UseridList;
  87. }
  88. //获取二级部门列表
  89. OapiV2DepartmentListsubRequest reqPartment2 = new OapiV2DepartmentListsubRequest() { DeptId = depts.DeptId, Language = "zh_CN" };
  90. OapiV2DepartmentListsubResponse rspPartment2 = V2departClient.Execute(reqPartment2, access_token);
  91. if (rspPartment2.Result != null)
  92. {
  93. foreach (var depts2 in rspPartment2.Result)
  94. {
  95. DeptInfo deptInfo2 = new DeptInfo();
  96. deptInfo2.id = depts2.DeptId;
  97. deptInfo2.pid = depts2.ParentId;
  98. deptInfo2.name = depts2.Name;
  99. //获取三级部门用户列表
  100. OapiUserListidRequest reqUsers2 = new OapiUserListidRequest() { DeptId = depts2.DeptId };
  101. OapiUserListidResponse rspUsers2 = userListClient1.Execute(reqUsers2, access_token);
  102. if (rspUsers2.Result != null)
  103. {
  104. //添加三级部门用户
  105. deptInfo2.users = rspUsers2.Result.UseridList;
  106. }
  107. //获取三级部门列表
  108. OapiV2DepartmentListsubRequest reqPartment3 = new OapiV2DepartmentListsubRequest() { DeptId = depts2.DeptId, Language = "zh_CN" };
  109. OapiV2DepartmentListsubResponse rspPartment3 = V2departClient.Execute(reqPartment3, access_token);
  110. if (rspPartment3.Result != null)
  111. {
  112. foreach (var depts3 in rspPartment3.Result)
  113. {
  114. DeptInfo deptInfo3 = new DeptInfo();
  115. deptInfo3.id = depts3.DeptId;
  116. deptInfo3.pid = depts3.ParentId;
  117. deptInfo3.name = depts3.Name;
  118. //获取三级部门用户列表
  119. OapiUserListidRequest reqUsers3 = new OapiUserListidRequest() { DeptId = depts3.DeptId };
  120. OapiUserListidResponse rspUsers3 = userListClient1.Execute(reqUsers3, access_token);
  121. if (rspUsers3.Result != null)
  122. {
  123. //添加三级部门用户
  124. deptInfo3.users = rspUsers3.Result.UseridList;
  125. }
  126. //获取四级部门列表
  127. OapiV2DepartmentListsubRequest reqPartment4 = new OapiV2DepartmentListsubRequest() { DeptId = depts3.DeptId, Language = "zh_CN" };
  128. OapiV2DepartmentListsubResponse rspPartment4 = V2departClient.Execute(reqPartment4, access_token);
  129. if (rspPartment4.Result != null)
  130. {
  131. foreach (var depts4 in rspPartment4.Result)
  132. {
  133. DeptInfo deptInfo4 = new DeptInfo();
  134. deptInfo4.id = depts4.DeptId;
  135. deptInfo4.pid = depts4.ParentId;
  136. deptInfo4.name = depts4.Name;
  137. //获取四级部门用户列表
  138. OapiUserListidRequest reqUsers4 = new OapiUserListidRequest() { DeptId = depts4.DeptId };
  139. OapiUserListidResponse rspUsers4 = userListClient1.Execute(reqUsers4, access_token);
  140. if (rspUsers4.Result != null)
  141. {
  142. //添加四级部门用户
  143. deptInfo4.users = rspUsers4.Result.UseridList;
  144. }
  145. deptlist.Add(deptInfo4);
  146. }
  147. }
  148. deptlist.Add(deptInfo3);
  149. }
  150. }
  151. deptlist.Add(deptInfo2);
  152. }
  153. }
  154. deptlist.Add(deptInfo);
  155. }
  156. }
  157. deptNodes.depts = deptlist;
  158. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Normal").CreateItemAsync<DeptNode>(deptNodes, new Azure.Cosmos.PartitionKey($"DDPartment"));
  159. return Ok(new { state = 200, message = "钉钉的组织架构添加到数据库成功", deptNodes = deptNodes });
  160. }
  161. catch (Exception ex)
  162. {
  163. return Ok(new { state = 1, message = $"访问失败!状态:{ex.StackTrace} 错误:{ex.Message}" });
  164. }
  165. }
  166. #endregion
  167. #region 从数据库获取(设置、修改、)钉钉组织架构信息
  168. /// <summary>
  169. /// 依据当前部门编号获取下级部门信息
  170. /// </summary>
  171. /// <param name="jsonElement"></param>
  172. /// <returns></returns>
  173. [ProducesDefaultResponseType]
  174. [HttpPost("get-partment")]
  175. public async Task<IActionResult> GetPartment(JsonElement jsonElement)
  176. {
  177. try
  178. {
  179. if (!jsonElement.TryGetProperty("pid", out JsonElement pid)) return BadRequest();
  180. var client = _azureCosmos.GetCosmosClient();
  181. List<DeptInfo> deptInfos = new List<DeptInfo>();
  182. string sqltxt = $"select a1.id,a1.pid,a1.name,a1.users from c join a1 IN c.depts where a1.pid={pid}";
  183. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<DeptInfo>(queryText: sqltxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("DDPartment") }))
  184. {
  185. deptInfos.Add(item);
  186. }
  187. return Ok(new { state = 200, deptInfos });
  188. }
  189. catch (Exception ex)
  190. {
  191. return Ok(new { state = 1, message = $"访问失败! 状态:{ex.StackTrace} 错误:{ex.Message}" });
  192. }
  193. }
  194. #endregion
  195. }
  196. }