using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using TEAMModelOS.SDK.DI;
using TEAMModelOS.Models;
using DingTalk.Api;
using DingTalk.Api.Request;
using DingTalk.Api.Response;
using TEAMModelOS.SDK.Models.Cosmos.BI;
using System.Text.Json;
using Azure.Cosmos;
namespace TEAMModeBI.Controllers.DingDingStruc
{
[Route("branch")]
[ApiController]
public class DDDeptController : ControllerBase
{
private readonly IConfiguration _configuration;
//数据容器
private readonly AzureCosmosFactory _azureCosmos;
//钉钉提示信息
private readonly DingDing _dingDing;
private readonly Option _option;
public DDDeptController(IConfiguration configuration,AzureCosmosFactory azureCosmos)
{
_configuration = configuration;
_azureCosmos = azureCosmos;
}
#region 从钉钉拿数据存CosmosDB中
///
/// 获取部门机构
///
///
[ProducesDefaultResponseType]
[HttpPost("get-depts")]
public async Task GetDDDepts()
{
try
{
string appKey = _configuration["DingDingAuth:appKey"];
string appSecret = _configuration["DingDingAuth:appSecret"];
string agentld = _configuration["DingDingAuth:Agentld"];
//获取access_token
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request = new OapiGettokenRequest() { Appkey = appKey, Appsecret = appSecret };
request.SetHttpMethod("Get");
OapiGettokenResponse response = client.Execute(request);
if (response.IsError)
{
return BadRequest();
}
//access_token的有效期为7200秒(2小时),有效期内重复获取会返回相同结果并自动续期,过期后获取会返回新的access_token
string access_token = response.AccessToken;
//获取一级部门列表
IDingTalkClient V2departClient = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
OapiV2DepartmentListsubRequest reqPartment1 = new OapiV2DepartmentListsubRequest() { DeptId = 1L, Language = "zh_CN" };
OapiV2DepartmentListsubResponse rspPartment1 = V2departClient.Execute(reqPartment1, access_token);
if (rspPartment1.IsError)
{
return BadRequest();
}
DeptNode deptNodes = new DeptNode();
deptNodes.id = agentld;
deptNodes.code = "DDPartment";
deptNodes.pk = "DDPartment";
deptNodes.ttl = -1;
List deptlist = new List();
if (rspPartment1.Result != null)
{
foreach (var depts in rspPartment1.Result)
{
DeptInfo deptInfo = new DeptInfo();
deptInfo.id = depts.DeptId;
deptInfo.pid = depts.ParentId;
deptInfo.name = depts.Name;
//获取一级部门用户列表
IDingTalkClient userListClient1 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid");
OapiUserListidRequest reqUsers1 = new OapiUserListidRequest() { DeptId = depts.DeptId };
OapiUserListidResponse rspUsers1 = userListClient1.Execute(reqUsers1, access_token);
if (rspUsers1.Result != null)
{
deptInfo.users = rspUsers1.Result.UseridList;
}
//获取二级部门列表
OapiV2DepartmentListsubRequest reqPartment2 = new OapiV2DepartmentListsubRequest() { DeptId = depts.DeptId, Language = "zh_CN" };
OapiV2DepartmentListsubResponse rspPartment2 = V2departClient.Execute(reqPartment2, access_token);
if (rspPartment2.Result != null)
{
foreach (var depts2 in rspPartment2.Result)
{
DeptInfo deptInfo2 = new DeptInfo();
deptInfo2.id = depts2.DeptId;
deptInfo2.pid = depts2.ParentId;
deptInfo2.name = depts2.Name;
//获取三级部门用户列表
OapiUserListidRequest reqUsers2 = new OapiUserListidRequest() { DeptId = depts2.DeptId };
OapiUserListidResponse rspUsers2 = userListClient1.Execute(reqUsers2, access_token);
if (rspUsers2.Result != null)
{
//添加三级部门用户
deptInfo2.users = rspUsers2.Result.UseridList;
}
//获取三级部门列表
OapiV2DepartmentListsubRequest reqPartment3 = new OapiV2DepartmentListsubRequest() { DeptId = depts2.DeptId, Language = "zh_CN" };
OapiV2DepartmentListsubResponse rspPartment3 = V2departClient.Execute(reqPartment3, access_token);
if (rspPartment3.Result != null)
{
foreach (var depts3 in rspPartment3.Result)
{
DeptInfo deptInfo3 = new DeptInfo();
deptInfo3.id = depts3.DeptId;
deptInfo3.pid = depts3.ParentId;
deptInfo3.name = depts3.Name;
//获取三级部门用户列表
OapiUserListidRequest reqUsers3 = new OapiUserListidRequest() { DeptId = depts3.DeptId };
OapiUserListidResponse rspUsers3 = userListClient1.Execute(reqUsers3, access_token);
if (rspUsers3.Result != null)
{
//添加三级部门用户
deptInfo3.users = rspUsers3.Result.UseridList;
}
//获取四级部门列表
OapiV2DepartmentListsubRequest reqPartment4 = new OapiV2DepartmentListsubRequest() { DeptId = depts3.DeptId, Language = "zh_CN" };
OapiV2DepartmentListsubResponse rspPartment4 = V2departClient.Execute(reqPartment4, access_token);
if (rspPartment4.Result != null)
{
foreach (var depts4 in rspPartment4.Result)
{
DeptInfo deptInfo4 = new DeptInfo();
deptInfo4.id = depts4.DeptId;
deptInfo4.pid = depts4.ParentId;
deptInfo4.name = depts4.Name;
//获取四级部门用户列表
OapiUserListidRequest reqUsers4 = new OapiUserListidRequest() { DeptId = depts4.DeptId };
OapiUserListidResponse rspUsers4 = userListClient1.Execute(reqUsers4, access_token);
if (rspUsers4.Result != null)
{
//添加四级部门用户
deptInfo4.users = rspUsers4.Result.UseridList;
}
deptlist.Add(deptInfo4);
}
}
deptlist.Add(deptInfo3);
}
}
deptlist.Add(deptInfo2);
}
}
deptlist.Add(deptInfo);
}
}
deptNodes.depts = deptlist;
await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Normal").CreateItemAsync(deptNodes, new Azure.Cosmos.PartitionKey($"DDPartment"));
return Ok(new { state = 200, message = "钉钉的组织架构添加到数据库成功", deptNodes = deptNodes });
}
catch (Exception ex)
{
return Ok(new { state = 1, message = $"访问失败!状态:{ex.StackTrace} 错误:{ex.Message}" });
}
}
#endregion
#region 从数据库获取(设置、修改、)钉钉组织架构信息
///
/// 依据当前部门编号获取下级部门信息
///
///
///
[ProducesDefaultResponseType]
[HttpPost("get-partment")]
public async Task GetPartment(JsonElement jsonElement)
{
try
{
if (!jsonElement.TryGetProperty("pid", out JsonElement pid)) return BadRequest();
var client = _azureCosmos.GetCosmosClient();
List deptInfos = new List();
string sqltxt = $"select a1.id,a1.pid,a1.name,a1.users from c join a1 IN c.depts where a1.pid={pid}";
await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator(queryText: sqltxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("DDPartment") }))
{
deptInfos.Add(item);
}
return Ok(new { state = 200, deptInfos });
}
catch (Exception ex)
{
return Ok(new { state = 1, message = $"访问失败! 状态:{ex.StackTrace} 错误:{ex.Message}" });
}
}
#endregion
}
}