Browse Source

修改同步钉钉通讯录逻辑

yingp 6 years ago
parent
commit
3e6cb634e2

+ 13 - 3
dingtalk-sdk/src/main/java/com/usoftchina/dingtalk/sdk/AddrBookSdk.java

@@ -5,6 +5,7 @@ import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.*;
 import com.dingtalk.api.response.*;
 import com.usoftchina.dingtalk.sdk.config.DingTalkProperties;
+import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -163,14 +164,15 @@ public class AddrBookSdk extends BaseSdk {
      *
      * @param agentCode    应用code
      * @param departmentId 部门ID
+     * @param fetchChild 包含下级部门的
      * @return
      */
-    public List<OapiUserListbypageResponse.Userlist> getUserList(String agentCode, long departmentId) {
+    public List<OapiUserListbypageResponse.Userlist> getUserList(String agentCode, long departmentId, boolean fetchChild) {
         List<OapiUserListbypageResponse.Userlist> userList = new ArrayList<>();
         long size = 100;
         int offset = 0;
         while (true) {
-            List<OapiUserListbypageResponse.Userlist> tempList = getUserList(agentCode, departmentId, offset++ + size, size);
+            List<OapiUserListbypageResponse.Userlist> tempList = getUserList(agentCode, departmentId, offset++ * size, size);
             if (null != tempList) {
                 userList.addAll(tempList);
                 if (tempList.size() < size) {
@@ -180,6 +182,14 @@ public class AddrBookSdk extends BaseSdk {
                 break;
             }
         }
+        if (fetchChild) {
+            List<Long> subList = getSubDepartmentIdList(agentCode, departmentId);
+            if (!CollectionUtils.isEmpty(subList)) {
+                for (Long subId : subList) {
+                    userList.addAll(getUserList(agentCode, subId, fetchChild));
+                }
+            }
+        }
         return userList;
     }
 
@@ -192,7 +202,7 @@ public class AddrBookSdk extends BaseSdk {
      * @param size
      * @return
      */
-    public List<OapiUserListbypageResponse.Userlist> getUserList(String agentCode, long departmentId, long offset, long size) {
+    private List<OapiUserListbypageResponse.Userlist> getUserList(String agentCode, long departmentId, long offset, long size) {
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/listbypage");
         OapiUserListbypageRequest req = new OapiUserListbypageRequest();
         req.setDepartmentId(departmentId);

+ 1 - 1
dingtalk-sdk/src/main/java/com/usoftchina/dingtalk/sdk/BaseSdk.java

@@ -40,7 +40,7 @@ public abstract class BaseSdk {
     }
 
     protected void assertOK(TaobaoResponse resp) {
-        if (!"0".equals(resp.getErrorCode())) {
+        if (!"0".equals(resp.getErrorCode()) && !"40103".equals(resp.getErrorCode())) {
             throw new DingTalkInvokeException(resp);
         }
     }

+ 1 - 0
uas-office-dingtalk/src/main/java/com/usoftchina/uas/office/dingtalk/manage/controller/DingTalkAddrBookController.java

@@ -35,6 +35,7 @@ public class DingTalkAddrBookController {
             orgService.sync();
             employeeService.sync();
             orgService.clearUseless();
+            orgService.updateManagerUser();
             return Result.success();
         } finally {
             DataSourceHolder.clear();

+ 6 - 2
uas-office-dingtalk/src/main/java/com/usoftchina/uas/office/dingtalk/service/UasEmployeeService.java

@@ -183,11 +183,15 @@ public class UasEmployeeService extends AbstractService {
             changed = true;
             req.setPosition(employee.getEm_position());
         }
+        if (!ObjectUtils.nullSafeEquals(employee.getEm_code(), user.getJobnumber())) {
+            changed = true;
+            req.setJobnumber(employee.getEm_code());
+        }
 
         List<Long> oldDepList = JSON.parseArray(user.getDepartment(), Long.class);
         oldDepList.sort((o1, o2) -> o1.compareTo(o2));
         List<Long> newDepList = orgList.stream().map(HrOrg::getOr_ding).sorted().collect(Collectors.toList());
-        if (Objects.equals(oldDepList, newDepList)) {
+        if (!Objects.equals(oldDepList, newDepList)) {
             changed = true;
             req.setDepartment(newDepList);
         }
@@ -230,7 +234,7 @@ public class UasEmployeeService extends AbstractService {
         private Map<String, OapiUserListbypageResponse.Userlist> idMap;
 
         public DingTalkUserFactory(Long departmentId) {
-            List<OapiUserListbypageResponse.Userlist> userList = addrBookSdk.getUserList("Uas", departmentId);
+            List<OapiUserListbypageResponse.Userlist> userList = addrBookSdk.getUserList("Uas", departmentId, true);
             mobileGroup = new HashMap<>();
             emailGroup = new HashMap<>();
             nameGroup = new HashMap<>();

+ 63 - 56
uas-office-dingtalk/src/main/java/com/usoftchina/uas/office/dingtalk/service/UasOrgService.java

@@ -1,13 +1,16 @@
 package com.usoftchina.uas.office.dingtalk.service;
 
+import com.alibaba.fastjson.JSON;
 import com.dingtalk.api.request.OapiDepartmentCreateRequest;
 import com.dingtalk.api.request.OapiDepartmentUpdateRequest;
+import com.dingtalk.api.response.OapiDepartmentGetResponse;
 import com.dingtalk.api.response.OapiDepartmentListResponse;
 import com.usoftchina.dingtalk.sdk.AddrBookSdk;
 import com.usoftchina.uas.office.dingtalk.entity.HrOrg;
 import com.usoftchina.uas.office.service.AbstractService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.jdbc.support.rowset.SqlRowSet;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
@@ -39,10 +42,23 @@ public class UasOrgService extends AbstractService {
      * 同步全部 uas组织资料 -> 企业微信部门资料
      */
     public void sync() {
-        List<HrOrg> HrOrgList = queryForBeanList("select * from HrOrg where or_statuscode<>'DISABLE'", HrOrg.class);
-        if (!CollectionUtils.isEmpty(HrOrgList)) {
-            List<OapiDepartmentListResponse.Department> departmentList = addrBookSdk.getDepartmentList("Uas");
-            checkOrg(groupOrgList(HrOrgList), 0, groupDepartmentList(departmentList), 0L);
+        // 同步根部门
+        HrOrg rootOrg = queryForBean("select * from hrorg where or_subof=0 and or_statuscode<>'DISABLE'", HrOrg.class);
+        syncRoot(rootOrg);
+
+        List<HrOrg> orgList = queryForBeanList("select * from HrOrg where or_subof<>0 and or_statuscode<>'DISABLE'", HrOrg.class);
+        if (!CollectionUtils.isEmpty(orgList)) {
+            List<OapiDepartmentListResponse.Department> departmentList = addrBookSdk.getDepartmentList("Uas", 1);
+            checkOrg(groupOrgList(orgList), rootOrg.getOr_id(), groupDepartmentList(departmentList), 1L);
+        }
+    }
+
+    /**
+     * 同步根部门
+     */
+    private void syncRoot(HrOrg rootOrg) {
+        if (null == rootOrg.getOr_ding() || 1 != rootOrg.getOr_ding()) {
+            updateOrgDingId(rootOrg, 1);
         }
     }
 
@@ -50,70 +66,48 @@ public class UasOrgService extends AbstractService {
      * 同步 uas组织资料 -> 企业微信部门资料
      */
     public void sync(HrOrg org) {
+        if (null == org.getOr_subof() || 0 == org.getOr_subof()) {
+            syncRoot(org);
+            return;
+        }
         if (null != org.getOr_ding()) {
-            if (null == org.getOr_subof() || 0 == org.getOr_subof()) {
+            HrOrg parentOrg = getById(org.getOr_subof());
+            if (null != parentOrg) {
                 // 修改部门
                 OapiDepartmentUpdateRequest req = new OapiDepartmentUpdateRequest();
                 req.setId(org.getOr_ding());
                 req.setName(org.getOr_name());
-                req.setParentid("0");
+                req.setParentid(String.valueOf(parentOrg.getOr_ding()));
                 addrBookSdk.updateDepartment("Uas", req);
-            } else {
-                HrOrg parentOrg = getById(org.getOr_subof());
-                if (null != parentOrg) {
-                    // 修改部门
-                    OapiDepartmentUpdateRequest req = new OapiDepartmentUpdateRequest();
-                    req.setId(org.getOr_ding());
-                    req.setName(org.getOr_name());
-                    req.setParentid(String.valueOf(parentOrg.getOr_ding()));
-                    addrBookSdk.updateDepartment("Uas", req);
-                }
             }
         } else {
-            List<OapiDepartmentListResponse.Department> departmentList = addrBookSdk.getDepartmentList("Uas");
-            if (null == org.getOr_subof() || 0 == org.getOr_subof()) {
-                OapiDepartmentListResponse.Department rootDept = null;
+            List<OapiDepartmentListResponse.Department> departmentList = addrBookSdk.getDepartmentList("Uas", 1);
+            try {
+                // 只需考虑父级组织已同步的情况
+                HrOrg parentOrg = getById(org.getOr_subof());
+                OapiDepartmentListResponse.Department dept = null;
                 for (OapiDepartmentListResponse.Department department : departmentList) {
-                    if (department.getParentid() == 0) {
-                        rootDept = department;
+                    if (department.getParentid().equals(parentOrg.getOr_ding()) && department.getName().equals(org.getOr_name())) {
+                        dept = department;
                         break;
                     }
                 }
-                // 修改部门名称
-                OapiDepartmentUpdateRequest req = new OapiDepartmentUpdateRequest();
-                req.setId(rootDept.getId());
-                req.setName(org.getOr_name());
-                req.setParentid("0");
-                addrBookSdk.updateDepartment("Uas", req);
-                updateOrgDingId(org, rootDept.getId());
-            } else {
-                try {
-                    // 只需考虑父级组织已同步的情况
-                    HrOrg parentOrg = getById(org.getOr_subof());
-                    OapiDepartmentListResponse.Department dept = null;
-                    for (OapiDepartmentListResponse.Department department : departmentList) {
-                        if (department.getParentid().equals(parentOrg.getOr_ding()) && department.getName().equals(org.getOr_name())) {
-                            dept = department;
-                            break;
-                        }
-                    }
-                    if (null != dept) {
-                        // 修改部门名称
-                        OapiDepartmentUpdateRequest req = new OapiDepartmentUpdateRequest();
-                        req.setId(dept.getId());
-                        req.setName(org.getOr_name());
-                        addrBookSdk.updateDepartment("Uas", req);
-                        updateOrgDingId(org, dept.getId());
-                    } else {
-                        OapiDepartmentCreateRequest req = new OapiDepartmentCreateRequest();
-                        req.setName(org.getOr_name());
-                        req.setParentid(String.valueOf(parentOrg.getOr_ding()));
-                        req.setCreateDeptGroup(true);
-                        Long departmentId = addrBookSdk.createDepartment("Uas", req);
-                        updateOrgDingId(org, departmentId);
-                    }
-                } catch (EmptyResultDataAccessException e) {
+                if (null != dept) {
+                    // 修改部门名称
+                    OapiDepartmentUpdateRequest req = new OapiDepartmentUpdateRequest();
+                    req.setId(dept.getId());
+                    req.setName(org.getOr_name());
+                    addrBookSdk.updateDepartment("Uas", req);
+                    updateOrgDingId(org, dept.getId());
+                } else {
+                    OapiDepartmentCreateRequest req = new OapiDepartmentCreateRequest();
+                    req.setName(org.getOr_name());
+                    req.setParentid(String.valueOf(parentOrg.getOr_ding()));
+                    req.setCreateDeptGroup(true);
+                    Long departmentId = addrBookSdk.createDepartment("Uas", req);
+                    updateOrgDingId(org, departmentId);
                 }
+            } catch (EmptyResultDataAccessException e) {
             }
         }
     }
@@ -219,11 +213,24 @@ public class UasOrgService extends AbstractService {
         return null;
     }
 
+    /**
+     * 修改部门管理员
+     */
+    public void updateManagerUser() {
+        SqlRowSet orgSet = jdbcTemplate.queryForRowSet("select or_ding,em_ding from HrOrg,employee where or_headmancode=em_code and or_subof<>0 and or_statuscode<>'DISABLE' and or_ding is not null and em_ding is not null");
+        while (orgSet.next()) {
+            OapiDepartmentUpdateRequest req = new OapiDepartmentUpdateRequest();
+            req.setId(orgSet.getLong("or_ding"));
+            req.setDeptManagerUseridList(orgSet.getString("em_ding"));
+            addrBookSdk.updateDepartment("Uas", req);
+        }
+    }
+
     /**
      * 清除下面没有人员的部门
      */
     public void clearUseless() {
-        List<OapiDepartmentListResponse.Department> departmentList = addrBookSdk.getDepartmentList("Uas");
+        List<OapiDepartmentListResponse.Department> departmentList = addrBookSdk.getDepartmentList("Uas", 1);
         Map<Long, List<OapiDepartmentListResponse.Department>> group = groupDepartmentList(departmentList);
         while (!departmentList.isEmpty()) {
             Iterator<OapiDepartmentListResponse.Department> iterator = departmentList.iterator();