DDImplService.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package com.malk.service.dingtalk.impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.malk.server.dingtalk.DDConf;
  4. import com.malk.service.dingtalk.DDClient_Attendance;
  5. import com.malk.service.dingtalk.DDClient_Contacts;
  6. import com.malk.service.dingtalk.DDClient_Workflow;
  7. import com.malk.service.dingtalk.DDService;
  8. import com.malk.utils.UtilMap;
  9. import lombok.SneakyThrows;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.scheduling.annotation.Async;
  13. import org.springframework.stereotype.Service;
  14. import java.util.*;
  15. import java.util.concurrent.atomic.AtomicInteger;
  16. import java.util.concurrent.atomic.AtomicReference;
  17. @Service
  18. @Slf4j
  19. public class DDImplService implements DDService {
  20. @Autowired
  21. private DDClient_Workflow ddClient_workflow;
  22. @Autowired
  23. private DDClient_Attendance ddClient_attendance;
  24. @Autowired
  25. private DDClient_Contacts ddClient_contacts;
  26. /**
  27. * 新发起审批15s内不允许撤销, 异步执行 [审批同意/拒绝只能通过节点操作, 系统无法直接介入] -- 异步需要中转一层进行触发, client为原子接口
  28. */
  29. @Async
  30. @Override
  31. @SneakyThrows
  32. public void terminateRunningApprove_async(String access_token, String processInstanceId, boolean isSystem, String subject, String description, String operatingUserId, String noteUserId) {
  33. ddClient_workflow.createTBTask(access_token, noteUserId, subject, description, new Date().getTime() + 16000, Arrays.asList(noteUserId), null, null, false, 20, null);
  34. Thread.sleep(16000);
  35. ddClient_workflow.terminateRunningApprove(access_token, processInstanceId, isSystem, description, operatingUserId);
  36. }
  37. /**
  38. * 钉钉查询假期余额返回是记录, 按照消失/天单位计算该假期类型下的余额
  39. */
  40. @Override
  41. public Map queryVacationQuota_balance(String access_token, String op_userid, String leave_code, String userids, int offset, int size) {
  42. List<Map> records = ddClient_attendance.queryVacationQuota_all(access_token, op_userid, leave_code, userids, offset, size);
  43. if (ObjectUtil.isNull(records)) {
  44. return null;
  45. }
  46. AtomicInteger balance = new AtomicInteger();
  47. AtomicReference<String> unit = new AtomicReference<>("");
  48. records.forEach(item -> {
  49. if (ObjectUtil.isNotNull(item.get("quota_num_per_hour"))) {
  50. balance.set(balance.get() + Integer.valueOf(String.valueOf(item.get("quota_num_per_hour"))) - Integer.valueOf(String.valueOf(item.get("used_num_per_hour"))));
  51. unit.set("小时");
  52. } else {
  53. balance.set(balance.get() + (Integer.valueOf(String.valueOf(item.get("quota_num_per_day"))) - Integer.valueOf(String.valueOf(item.get("used_num_per_day")))));
  54. unit.set("天");
  55. }
  56. });
  57. Map result = new HashMap();
  58. result.put("balance", balance.get() / 100f);
  59. result.put("unit", unit);
  60. return result;
  61. }
  62. /**
  63. * 判断员工是否在指定部门
  64. */
  65. @Override
  66. public boolean matchDepartment(String access_token, String userId, List<Long> deptIds) {
  67. List<Number> deptIdList = (List<Number>) ddClient_contacts.getUserInfoById(access_token, userId).get("dept_id_list");
  68. boolean isMatch = false;
  69. // 兼容多部门场景
  70. for (Number deptId : deptIdList) {
  71. // ppExt: 不要直接使用 Number 作为类型, 不同基本类型比较值时会有偏差 [可以作为父类接受数据, 避免直接强制类型转换错误, 再进行基本类型处理]
  72. isMatch = _matchDepartment(access_token, deptId.longValue(), deptIds);
  73. if (isMatch) {
  74. break;
  75. }
  76. }
  77. return isMatch;
  78. }
  79. /// 递归: 判断员工是否在指定部门
  80. boolean _matchDepartment(String access_token, long dept_id, List<Long> deptIds) {
  81. // 判断入参
  82. if (dept_id == DDConf.TOP_DEPARTMENT) {
  83. return false;
  84. }
  85. if (deptIds.contains(dept_id)) {
  86. return true;
  87. }
  88. Map deptInfo = ddClient_contacts.getDepartmentInfo(access_token, dept_id);
  89. long parentId = UtilMap.getLong(deptInfo, "parent_id");
  90. long deptId = UtilMap.getLong(deptInfo, "dept_id");
  91. _matchDepartment(access_token, parentId, deptIds);
  92. // 判断递归
  93. if (deptId == DDConf.TOP_DEPARTMENT) {
  94. return false;
  95. }
  96. if (deptIds.contains(parentId)) {
  97. return true;
  98. }
  99. return false;
  100. }
  101. }