Browse Source

提交仓库
同步入职离职人员

zfc 11 months ago
parent
commit
1469e5f280

+ 4 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/controller/TimerController.java

@@ -2,6 +2,7 @@ package com.malk.lanyun.controller;
 
 import com.malk.lanyun.entity.ProjectAnalysis;
 import com.malk.lanyun.service.NCService;
+import com.malk.lanyun.service.SyncAssetsService;
 import com.malk.lanyun.service.TimerService;
 import com.malk.server.common.McR;
 import lombok.extern.slf4j.Slf4j;
@@ -27,6 +28,9 @@ public class TimerController {
     @Autowired
     private NCService ncService;
 
+    @Autowired
+    private SyncAssetsService syncAssetsService;
+
 
     /**
      * 月度定额更新

+ 37 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/schedule/ScheduleTask.java

@@ -10,6 +10,8 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.GetMapping;
 
+import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
 import java.util.Date;
 
 /**
@@ -69,4 +71,39 @@ public class ScheduleTask {
         syncAssetsService.SynAssetsItem();
     }
 
+    /**
+     * 每月最后一天跑批入职人员
+     */
+    @Scheduled(cron = "0 30 23 28-31 * ?")
+    void SynDingNumber(){
+        // 获取当前日期
+        LocalDate today = LocalDate.now();
+
+        // 获取当月的最后一天
+        LocalDate lastDayOfMonth = today.withDayOfMonth(today.lengthOfMonth());
+        //判断是否相等
+        if (today.equals(lastDayOfMonth)){
+            syncAssetsService.SynDingUserNumber();
+        }
+    }
+
+    /**
+     * 每月最后一天跑批离职人员
+     */
+    @Scheduled(cron = "0 03 23 28-31 * ?")
+    void SynDingLeaveOffice(){
+        // 获取当前日期
+        LocalDate today = LocalDate.now();
+
+        // 获取当月的最后一天
+        LocalDate lastDayOfMonth = today.withDayOfMonth(today.lengthOfMonth());
+        //判断是否相等
+        if (today.equals(lastDayOfMonth)){
+            syncAssetsService.SynDingLeaveUserNumber();
+        }
+
+    }
+
+
+
 }

+ 30 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/service/DingTalkService.java

@@ -0,0 +1,30 @@
+package com.malk.lanyun.service;
+
+import com.malk.server.dingtalk.DDR;
+import com.malk.utils.UtilMap;
+
+import java.util.List;
+import java.util.Map;
+
+public interface DingTalkService {
+
+
+    /**
+     * 获取在职人员
+     * @param access_token
+     * @param status_list
+     * @param offset
+     * @param size
+     * @return
+     */
+    Map getAllUserIdInfo(String access_token, String status_list, Number offset,Number size);
+
+    /**
+     * 获取员工花名册字段信息
+     * @param access_token
+     * @param userId
+     * @return
+     */
+    List<Map> getDDUserInfoById(String access_token, String userId, Number appAgentId);
+
+}

+ 8 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/service/SyncAssetsService.java

@@ -2,7 +2,15 @@ package com.malk.lanyun.service;
 
 public interface SyncAssetsService {
 
+
+    //同步资产档案净值
     void SynAssetsItem();
 
 
+    //同步钉钉在职人员、入职人员
+
+    void SynDingUserNumber();
+
+    //同步钉钉离职人员
+    void SynDingLeaveUserNumber();
 }

+ 34 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/DingTalkServiceImpl.java

@@ -0,0 +1,34 @@
+package com.malk.lanyun.service.impl;
+
+
+import com.malk.lanyun.service.DingTalkService;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.server.dingtalk.DDR;
+import com.malk.server.dingtalk.DDR_New;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class DingTalkServiceImpl implements DingTalkService {
+
+
+    @Override
+    public Map getAllUserIdInfo(String access_token, String status_list, Number offset, Number size) {
+        Map param = UtilMap.map("access_token", access_token);
+        Map body = UtilMap.map("status_list, offset, size", status_list, offset,size);
+        return (Map) DDR.doPost("https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/queryonjob", null, param, body).getResult();
+    }
+
+    @Override
+    public List<Map> getDDUserInfoById(String access_token, String userId, Number appAgentId) {
+        Map param = UtilMap.map("access_token", access_token);
+        Map body = UtilMap.map("userid_list, agentid", userId, appAgentId);
+        return (List<Map>) DDR.doPost("https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/v2/list", null, param, body).getResult();
+    }
+
+}

+ 135 - 4
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/SyncAssetsImpl.java

@@ -1,10 +1,14 @@
 package com.malk.lanyun.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.malk.lanyun.service.DingTalkService;
 import com.malk.lanyun.service.SyncAssetsService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
+import com.malk.server.dingtalk.DDConf;
 import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Contacts;
 import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
@@ -12,10 +16,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.chrono.ChronoLocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 
 
 @Service
@@ -72,4 +78,129 @@ public class SyncAssetsImpl implements SyncAssetsService {
         }
 
     }
+
+    @Autowired
+    DingTalkService dingTalkService;
+
+    @Autowired
+    private DDClient ddClient;
+
+    @Autowired
+    private DDConf ddConf;
+
+
+    /**
+     * 获取在职人员 与当月入职人员信息
+     */
+    @Override
+    public void SynDingUserNumber() {
+        Number nextCursor = 0; // 初始的offset值设置为"0"
+        List<String> allUserIds = new ArrayList<>();
+        while (nextCursor != null ) {
+            Map userIds  =  dingTalkService.getAllUserIdInfo(ddClient.getAccessToken(),"2,3,5",nextCursor,50);
+            //获取在职人员信息
+            List<String> userIdList = (List<String>) userIds.get("data_list");
+            Number newNextCursor = (Number) userIds.getOrDefault("next_cursor", null);
+            if (!userIdList.isEmpty()) {
+                allUserIds.addAll(userIdList);
+            }
+            // 更新nextCursor为下一次请求的offset
+            nextCursor = newNextCursor;
+        }
+        // 获取当前日期
+        LocalDate today = LocalDate.now();
+        // 获取当月的第一天
+        LocalDate firstDayOfMonth = today.withDayOfMonth(1);
+
+        // 获取当月的最后一天
+        LocalDate lastDayOfMonth = today.withDayOfMonth(today.lengthOfMonth());
+
+        log.info("在职人员数量:"+allUserIds.size());
+
+        if (allUserIds.size()>0){
+            for (String strUserId:allUserIds){
+                Map hashMap = new HashMap();
+                List<Map> userinfo = dingTalkService.getDDUserInfoById(ddClient.getAccessToken(), strUserId, ddConf.getAgentId());
+                List<Map> dataList = (List<Map>) userinfo.get(0).get("field_data_list");
+                for (Map map:dataList){
+                    //成员
+                    hashMap.put("employeeField_lwyn4q8k",strUserId);
+                    // 入职时间
+                    if (map.get("field_code").equals("sys00-confirmJoinTime")) {
+                        List<Map> mapList = (List<Map>) map.get("field_value_list");
+                        if (!mapList.isEmpty() && mapList.get(0).containsKey("value")) {
+                            // 假设value是一个可以转换为LocalDate的字符串
+                            Object valueObj = mapList.get(0).get("value");
+                            LocalDate joinDate = null;
+                            if (valueObj instanceof LocalDate) {
+                                joinDate = (LocalDate) valueObj;
+                            } else if (valueObj instanceof String) {
+                                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                                joinDate = LocalDate.parse((String) valueObj, formatter);
+                            }
+                            if (joinDate != null) {
+                                // 判断入职为当月
+                                if (!joinDate.isBefore(ChronoLocalDate.from(firstDayOfMonth.atStartOfDay())) && !joinDate.isAfter(ChronoLocalDate.from(lastDayOfMonth.atStartOfDay()))) {
+                                    hashMap.put("dateField_m0htvxao", UtilDateTime.parse(String.valueOf(today),"yyyy-MM"));
+                                    hashMap.put("textField_m0htvxal",allUserIds.size());
+                                    hashMap.put("employeeField_m0htvxav",strUserId);
+                                    hashMap.put("dateField_m0htvxaw",UtilDateTime.parse(String.valueOf(joinDate),"yyyy-MM-dd"));
+
+                                    ydClient.operateData(YDParam.builder()
+                                            .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                                            .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                                            .formUuid("FORM-C785CE8A85AF4EF79664775A60F3527FXUBX")
+                                            .formDataJson(JSON.toJSONString(hashMap))
+                                            .build(), YDConf.FORM_OPERATION.create);
+                                }
+                            }
+                        }
+                    }
+                }
+
+            }
+        }
+    }
+
+    @Autowired
+    DDClient_Contacts ddClientContacts;
+    @Override
+    public void SynDingLeaveUserNumber() {
+
+
+        Number nextToken = 0; // 初始的offset值设置为"0"
+
+        // 创建一个 LocalDate 对象
+        LocalDate localDate = LocalDate.now(); // 获取当前日期
+
+        // 获取当月的第一天
+        LocalDate firstDayOfMonth = localDate.withDayOfMonth(1);
+
+        // 将 LocalDate 转换为 Date
+        Date date = Date.from(firstDayOfMonth.atStartOfDay(ZoneId.systemDefault()).toInstant());
+
+        Map param = UtilMap.map("nextToken, maxResults", nextToken, 50);
+
+        //查询离职日期   传入开始时间,结束时间默认为当前日期。
+        List<Map<String, String>> mapList = ddClientContacts.getLeaveEmployeeRecords(ddClient.getAccessToken(),date,param);
+
+        log.info("userIds:"+mapList);
+
+        Map hashMap = new HashMap();
+        for (Map<String, String> record : mapList) {
+
+            hashMap.put("dateField_m0htvxao", UtilDateTime.parse(String.valueOf(localDate),"yyyy-MM"));
+            hashMap.put("employeeField_m0htvxav",record.get("userId"));
+            hashMap.put("dateField_m0htvxaw",UtilDateTime.parse(String.valueOf(record.get("leaveTime")),"yyyy-MM-dd"));
+
+            ydClient.operateData(YDParam.builder()
+                    .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                    .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                    .formUuid("FORM-6F080FBEAF924FB8B4412010434966BE4DPF")
+                    .formDataJson(JSON.toJSONString(hashMap))
+                    .build(), YDConf.FORM_OPERATION.create);
+
+        }
+
+    }
 }