|
@@ -14,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.stream.Collectors;
|
|
@@ -355,6 +356,97 @@ public class KYServiceImpl implements KYService {
|
|
|
return McR.success();
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public Map getUserLeaveInfo(String userId) {
|
|
|
+ long currentTime = System.currentTimeMillis();
|
|
|
+
|
|
|
+ Map leaveMap = new HashMap();
|
|
|
+
|
|
|
+ //年假余额
|
|
|
+ BigDecimal annualLeaveNum = new BigDecimal(0.00);
|
|
|
+
|
|
|
+ //查询员工年假余额
|
|
|
+ List<Map> leaveQuotasList = new ArrayList<>();
|
|
|
+ getLeaveNum("3dcd4b8c-1b88-4206-9b52-cc9e2fde2e38",userId,0,50,leaveQuotasList);
|
|
|
+
|
|
|
+ if (Objects.nonNull(leaveQuotasList)){
|
|
|
+ for (Map leaveQuotas : leaveQuotasList) {
|
|
|
+ if ((long) leaveQuotas.get("start_time") <= currentTime && currentTime <= (long) leaveQuotas.get("end_time")){
|
|
|
+ if (Objects.isNull(leaveQuotas.get("quota_num_per_hour")) && Objects.nonNull(leaveQuotas.get("quota_num_per_day"))){
|
|
|
+ annualLeaveNum = annualLeaveNum.add(new BigDecimal(String.valueOf(leaveQuotas.get("quota_num_per_day"))).divide(new BigDecimal(100)));
|
|
|
+ }
|
|
|
+ if (Objects.nonNull(leaveQuotas.get("used_num_per_day"))){
|
|
|
+ annualLeaveNum = annualLeaveNum.subtract(new BigDecimal(String.valueOf(leaveQuotas.get("used_num_per_day"))).divide(new BigDecimal(100)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (annualLeaveNum.compareTo(new BigDecimal(8)) == 1 || annualLeaveNum.compareTo(new BigDecimal(8)) == 0){
|
|
|
+ annualLeaveNum = annualLeaveNum.subtract(new BigDecimal(8));
|
|
|
+ leaveMap.put("可预支年假",8);
|
|
|
+ leaveMap.put("实际年假余额",annualLeaveNum);
|
|
|
+ leaveMap.put("已预支年假",0);
|
|
|
+ }else {
|
|
|
+ BigDecimal relYearLeave = annualLeaveNum.remainder(new BigDecimal(0.5));
|
|
|
+ leaveMap.put("可预支年假",annualLeaveNum.subtract(relYearLeave));
|
|
|
+ leaveMap.put("实际年假余额",annualLeaveNum.subtract(new BigDecimal(8)));
|
|
|
+ leaveMap.put("已预支年假",new BigDecimal(8).subtract(annualLeaveNum).add(relYearLeave));
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取员工调休假余额
|
|
|
+ List<Map> leaveQuotasList2 = new ArrayList<>();
|
|
|
+ getLeaveNum("b6301b0e-193a-4bce-b225-2f67a5d6244b",userId,0,10,leaveQuotasList2);
|
|
|
+
|
|
|
+ //调休假余额
|
|
|
+ int compensatoryLeaveNum = 0;
|
|
|
+ if (Objects.nonNull(leaveQuotasList2)){
|
|
|
+ for (Map leaveQuotas : leaveQuotasList2) {
|
|
|
+ if ((long) leaveQuotas.get("start_time") <= currentTime && currentTime <= (long) leaveQuotas.get("end_time")){
|
|
|
+ if (Objects.isNull(leaveQuotas.get("quota_num_per_day")) && Objects.nonNull(leaveQuotas.get("quota_num_per_hour"))){
|
|
|
+ compensatoryLeaveNum += ((int) leaveQuotas.get("quota_num_per_hour")) / 100;
|
|
|
+ }
|
|
|
+ if (Objects.nonNull(leaveQuotas.get("used_num_per_hour"))){
|
|
|
+ compensatoryLeaveNum -= ((int) leaveQuotas.get("used_num_per_hour")) / 100;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (compensatoryLeaveNum >= 80){
|
|
|
+ leaveMap.put("可预支调休",80);
|
|
|
+ leaveMap.put("实际加班小时数",compensatoryLeaveNum-80);
|
|
|
+ leaveMap.put("已预支调休",0);
|
|
|
+ }else {
|
|
|
+ leaveMap.put("可预支调休",compensatoryLeaveNum);
|
|
|
+ leaveMap.put("实际加班小时数",0);
|
|
|
+ leaveMap.put("已预支调休",80-compensatoryLeaveNum);
|
|
|
+ }
|
|
|
+
|
|
|
+ return leaveMap;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Map> getLeaveNum(String leave_code,String userId,int offset,int size,List<Map> leaveQuotasList) {
|
|
|
+ Map body = new HashMap();
|
|
|
+ body.put("leave_code",leave_code);
|
|
|
+ body.put("op_userid",ddConf.getOperator());
|
|
|
+ body.put("userids",userId);
|
|
|
+ body.put("offset",offset);
|
|
|
+ body.put("size",size);
|
|
|
+
|
|
|
+ DDR_New ddrNew = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/attendance/vacation/quota/list", null, ddClient.initTokenParams(), body, DDR_New.class);
|
|
|
+ Map result = (Map) ddrNew.getResult();
|
|
|
+ if (Objects.nonNull(result.get("leave_quotas"))){
|
|
|
+ leaveQuotasList.addAll((List<Map>) result.get("leave_quotas"));
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((boolean) result.get("has_more")){
|
|
|
+ getLeaveNum(leave_code,userId,offset+size,size,leaveQuotasList);
|
|
|
+ }
|
|
|
+ return leaveQuotasList;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 检查该更新事件在5s内是否处理过,应对钉钉瞬间重复回调
|
|
|
*
|