钉钉对接接口

AttendanceController.cs 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using DingDingDemo.Common;
  7. using Microsoft.AspNetCore.Mvc;
  8. using Microsoft.Extensions.Caching.Distributed;
  9. using Microsoft.Extensions.Configuration;
  10. using Microsoft.Extensions.Logging;
  11. namespace DingDingDemo.Controllers
  12. {
  13. /// <summary>
  14. /// 考勤
  15. /// </summary>
  16. [Produces("application/json")]
  17. [Route("api/[controller]")]
  18. public class AttendanceController : BaseController
  19. {
  20. private readonly ILogger<AttendanceController> _logger;
  21. private readonly IDistributedCache _cache;
  22. private readonly IConfiguration _configuration;
  23. public AttendanceController(IDistributedCache cache, IConfiguration configuration, ILogger<AttendanceController> logger)
  24. {
  25. _cache = cache;
  26. _logger = logger;
  27. _configuration = configuration;
  28. }
  29. /// <summary>
  30. /// 获取排班列表
  31. /// </summary>
  32. /// <param name="date"></param>
  33. /// <returns></returns>
  34. [HttpGet("getschedulelist")]
  35. public async Task<IActionResult> GetScheduleList(DateTime? date)
  36. {
  37. string strdate = date == null ? DateTime.Now.ToString("yyyy-MM-dd") : date.Value.ToString("yyyy-MM-dd");
  38. TokenHelper th = new TokenHelper(_cache, _configuration);
  39. var strresult = await HttpHelper.HttpGetAsync(string.Format(_configuration["DingTalkSettings:GetSchedule"], th.GetAccessToken()) + "&workDate=" + strdate);
  40. var result = strresult.ToJObject();
  41. if (result["errcode"].ToString() == "0")
  42. {
  43. var rt = result["result"].ToString().ToJObject();
  44. return Success("成功", rt["schedules"]);
  45. }
  46. else
  47. {
  48. return Error(result["errmsg"].ToString());
  49. }
  50. }
  51. /// <summary>
  52. /// 获取考勤组列表
  53. /// </summary>
  54. /// <returns></returns>
  55. [HttpGet("getgrouplist")]
  56. public IActionResult GetGroupList()
  57. {
  58. TokenHelper th = new TokenHelper(_cache, _configuration);
  59. return Success("成功", GetGroups(th.GetAccessToken(), 0, 10));
  60. }
  61. /// <summary>
  62. /// 获取列表
  63. /// </summary>
  64. /// <param name="token"></param>
  65. /// <param name="offset"></param>
  66. /// <param name="size"></param>
  67. /// <returns></returns>
  68. [ApiExplorerSettings(IgnoreApi = true)]
  69. public ArrayList GetGroups(string token, int offset = 0, int size = 10)
  70. {
  71. ArrayList arrresult = new ArrayList();
  72. string url = string.Format(_configuration["DingTalkSettings:GetGroupList"], token);
  73. //url += "&offset=" + index + "&size=" + size;
  74. var param = new
  75. {
  76. offset,
  77. size
  78. };
  79. var strresult = HttpHelper.HttpPost(url, param.ToJson());
  80. var result = strresult.ToJObject();
  81. if (result["errcode"].ToString() == "0")
  82. {
  83. var rt = result["result"].ToString().ToJObject();
  84. var rtlist = rt["groups"].ToJson().ToList<Dictionary<string, object>>();
  85. arrresult.AddRange(rtlist);
  86. if (rt["has_more"].ToString().ToLower() == "true")
  87. {
  88. arrresult.AddRange(GetGroups(token, offset + size, size));
  89. }
  90. }
  91. return arrresult;
  92. }
  93. /// <summary>
  94. /// 获取打卡列表
  95. /// </summary>
  96. /// <param name="userids"></param>
  97. /// <param name="start"></param>
  98. /// <param name="end"></param>
  99. /// <returns></returns>
  100. [HttpGet("getrecordlist")]
  101. public async Task<IActionResult> GetRecordList(string[] userids, DateTime? start, DateTime? end)
  102. {
  103. if (userids.Length==0)
  104. {
  105. return Error("员工id不能为空");
  106. }
  107. if (end != null && start != null && end.Value.Subtract(start.Value).TotalDays > 7)
  108. {
  109. return Error("时间区间不能超过7天");
  110. }
  111. if (start == null && end == null)
  112. {
  113. end = DateTime.Now;
  114. start = end.Value.AddDays(-7);
  115. }
  116. TokenHelper th = new TokenHelper(_cache, _configuration);
  117. string url = string.Format(_configuration["DingTalkSettings:GetRecordList"], th.GetAccessToken());
  118. //string param = "userIds=" + userid + "&checkDateFrom=" + start.Value.ToString("yyyy-MM-dd HH:mm:ss") + "&checkDateTo=" + end.Value.ToString("yyyy-MM-dd HH:mm:ss");
  119. var param = new
  120. {
  121. userIds = userids,
  122. checkDateFrom = start.Value.ToString("yyyy-MM-dd HH:mm:ss"),
  123. checkDateTo = end.Value.ToString("yyyy-MM-dd HH:mm:ss")
  124. };
  125. var strresult = await HttpHelper.HttpPostAsync(url, param.ToJson());
  126. var result = strresult.ToJObject();
  127. if (result["errcode"].ToString() == "0")
  128. {
  129. return Success("成功", result["recordresult"]);
  130. }
  131. else
  132. {
  133. return Error(result["errmsg"].ToString());
  134. }
  135. }
  136. /// <summary>
  137. /// 获取打卡结果列表
  138. /// </summary>
  139. /// <param name="userids"></param>
  140. /// <param name="start"></param>
  141. /// <param name="end"></param>
  142. /// <returns></returns>
  143. [HttpGet("getresultlist")]
  144. public IActionResult GetResultList(string[] userids, DateTime? start, DateTime? end)
  145. {
  146. if (userids.Length==0)
  147. {
  148. return Error("员工id不能为空");
  149. }
  150. if (end != null && start != null && end.Value.Subtract(start.Value).TotalDays > 7)
  151. {
  152. return Error("时间区间不能超过7天");
  153. }
  154. if (start == null && end == null)
  155. {
  156. end = DateTime.Now;
  157. start = end.Value.AddDays(-7);
  158. }
  159. TokenHelper th = new TokenHelper(_cache, _configuration);
  160. return Success("成功", GetResults(th.GetAccessToken(), userids, start.Value, end.Value, 0, 50));
  161. }
  162. /// <summary>
  163. /// 获取列表
  164. /// </summary>
  165. /// <param name="token"></param>
  166. /// <param name="userids"></param>
  167. /// <param name="start"></param>
  168. /// <param name="end"></param>
  169. /// <param name="offset"></param>
  170. /// <param name="size"></param>
  171. /// <returns></returns>
  172. [ApiExplorerSettings(IgnoreApi = true)]
  173. public ArrayList GetResults(string token, string[] userids, DateTime start, DateTime end, int offset = 0, int size = 10)
  174. {
  175. ArrayList arrresult = new ArrayList();
  176. string url = string.Format(_configuration["DingTalkSettings:GetRecordResult"], token);
  177. //url += "&userIdList=" + userid + "&workDateFrom=" + start.ToString("yyyy-MM-dd HH:mm:ss") + "&workDateTo=" + end.ToString("yyyy-MM-dd HH:mm:ss");
  178. //url += "&offset=" + index + "&limit=" + size;
  179. var param = new
  180. {
  181. userIdList= userids,
  182. workDateFrom= start.ToString("yyyy-MM-dd HH:mm:ss"),
  183. workDateTo= end.ToString("yyyy-MM-dd HH:mm:ss"),
  184. offset,
  185. limit= size
  186. };
  187. var strresult = HttpHelper.HttpPost(url, param.ToJson());
  188. var result = strresult.ToJObject();
  189. if (result["errcode"].ToString() == "0")
  190. {
  191. var rtlist = result["recordresult"].ToJson().ToList<Dictionary<string, object>>();
  192. arrresult.AddRange(rtlist);
  193. if (result["hasMore"].ToString().ToLower() == "true")
  194. {
  195. arrresult.AddRange(GetResults(token, userids, start, end, offset + size, size));
  196. }
  197. }
  198. return arrresult;
  199. }
  200. /// <summary>
  201. /// 查询请假状态
  202. /// </summary>
  203. /// <returns></returns>
  204. [HttpGet("getleavestatuslist")]
  205. public IActionResult GetLeaveStatusList(string[] userids, DateTime? start, DateTime? end)
  206. {
  207. if (userids.Length == 0)
  208. {
  209. return Error("员工id不能为空");
  210. }
  211. if (end != null && start != null && end.Value.Subtract(start.Value).TotalDays > 180)
  212. {
  213. return Error("时间区间不能超过180天");
  214. }
  215. if (start == null && end == null)
  216. {
  217. end = DateTime.Now;
  218. start = DateTime.Parse(end.Value.ToString("yyyy-MM") + "-01");
  219. }
  220. TokenHelper th = new TokenHelper(_cache, _configuration);
  221. return Success("成功", GetLeaveStatus(th.GetAccessToken(), userids, start.Value, end.Value, 0, 20));
  222. }
  223. /// <summary>
  224. /// 获取列表
  225. /// </summary>
  226. /// <param name="token"></param>
  227. /// <param name="userids"></param>
  228. /// <param name="start"></param>
  229. /// <param name="end"></param>
  230. /// <param name="offset"></param>
  231. /// <param name="size"></param>
  232. /// <returns></returns>
  233. [ApiExplorerSettings(IgnoreApi = true)]
  234. public ArrayList GetLeaveStatus(string token, string[] userids, DateTime start, DateTime end, int offset = 0, int size = 10)
  235. {
  236. ArrayList arrresult = new ArrayList();
  237. string url = string.Format(_configuration["DingTalkSettings:GetLeaveStatus"], token);
  238. var param = new
  239. {
  240. userid_list = userids,
  241. start_time = Common.Common.GetTimeStamp(start),
  242. end_time = Common.Common.GetTimeStamp(end),
  243. offset,
  244. size
  245. };
  246. var strresult = HttpHelper.HttpPost(url, param.ToJson());
  247. var result = strresult.ToJObject();
  248. if (result["errcode"].ToString() == "0")
  249. {
  250. var rt = result["result"].ToString().ToJObject();
  251. var rtlist = rt["leave_status"].ToJson().ToList<Dictionary<string, object>>();
  252. arrresult.AddRange(rtlist);
  253. if (rt["has_more"].ToString().ToLower() == "true")
  254. {
  255. arrresult.AddRange(GetGroups(token, offset + size, size));
  256. }
  257. }
  258. return arrresult;
  259. }
  260. /// <summary>
  261. /// 获取请假时长
  262. /// </summary>
  263. /// <returns></returns>
  264. [HttpGet("getleaveapproveduration")]
  265. public IActionResult GetLeaveApproveDuration(string userid, DateTime? start, DateTime? end)
  266. {
  267. if (string.IsNullOrEmpty(userid))
  268. {
  269. return Error("员工id不能为空");
  270. }
  271. //if (end != null && start != null && end.Value.Subtract(start.Value).TotalDays > 180)
  272. //{
  273. // return Error("时间区间不能超过180天");
  274. //}
  275. if (start == null && end == null)
  276. {
  277. end = DateTime.Now;
  278. start = DateTime.Parse(end.Value.ToString("yyyy-MM") + "-01");
  279. }
  280. TokenHelper th = new TokenHelper(_cache, _configuration);
  281. string url = string.Format(_configuration["DingTalkSettings:GetLeaveApproveDuration"], th.GetAccessToken());
  282. var param = new
  283. {
  284. userid ,
  285. from_date = start,
  286. to_date = end
  287. };
  288. var strresult = HttpHelper.HttpPost(url, param.ToJson());
  289. var result = strresult.ToJObject();
  290. if (result["errcode"].ToString() == "0")
  291. {
  292. var rt = result["result"].ToString().ToJObject();
  293. return Success("成功", rt["duration_in_minutes"]);
  294. }
  295. else
  296. {
  297. return Error(result["errmsg"].ToString());
  298. }
  299. }
  300. /// <summary>
  301. /// 获取用户考勤组
  302. /// </summary>
  303. /// <param name="userid"></param>
  304. /// <returns></returns>
  305. [HttpGet("getusergroup")]
  306. public async Task<IActionResult> GetUserGroup(string userid)
  307. {
  308. if (string.IsNullOrEmpty(userid))
  309. {
  310. return Error("员工id不能为空");
  311. }
  312. TokenHelper th = new TokenHelper(_cache, _configuration);
  313. var strresult = await HttpHelper.HttpGetAsync(string.Format(_configuration["DingTalkSettings:GetUserGroup"], th.GetAccessToken()) + "&userid=" + userid);
  314. var result = strresult.ToJObject();
  315. if (result["errcode"].ToString() == "0")
  316. {
  317. return Success("成功", result["result"]);
  318. }
  319. else
  320. {
  321. return Error(result["errmsg"].ToString());
  322. }
  323. }
  324. }
  325. }