Browse Source

企业微信监听新增员工和员工变动部门/上级/姓名

seyason 2 years ago
parent
commit
d8184fe007

+ 108 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -36,6 +36,7 @@ public class WeiXinCorpController {
     public static final String TRANSMIT_SERVER_GET_DEPTDETAIL = "http://47.101.180.183:10010/wxcorp/getCorpDeptDetail?accessToken=ACCESS_TOKEN&deptId=DEPTID";
     public static final String TRANSMIT_SERVER_GET_DEPTMEMBDETAIL = "http://47.101.180.183:10010/wxcorp/getDeptUserDetail?accessToken=ACCESS_TOKEN&deptId=DEPTID";
     public static final String TRANSMIT_SERVER_GET_CONTACT_TOKEN = "http://47.101.180.183:10010/wxcorp/getCorpConcactAccessToken?corpid=CORPID&contactSecret=CONTACT_SECRET";
+    public static final String TRANSMIT_SERVER_GET_USERDETAIL = "http://47.101.180.183:10010/wxcorp/getUserInfoFromTranServer?accessToken=ACCESS_TOKEN&userId=USERID";
 
     public static final String POST_CONVERT_USERID = "https://qyapi.weixin.qq.com/cgi-bin/batch/userid_to_openuserid?access_token=ACCESS_TOKEN";
 
@@ -345,7 +346,7 @@ public class WeiXinCorpController {
                     param.setIndate(LocalDateTime.now());
                     sysConfigMapper.updateById(param);
                 }
-            } else if (jsonObject.has("ChangeType")) {
+            } else if ("change_contact".equals(jsonObject.get("InfoType")) && jsonObject.has("ChangeType")) {
                 //{"xml":{"ChangeType":"delete_user","UserID":"ShanShuiGongZhangTianYiSe",
                 // "SuiteId":"ww4e237fd6abb635af","InfoType":"change_contact","AuthCorpId":"wwf11426cf618e1703",
                 // "TimeStamp":1655908762,"OpenUserID":"woy9TkCAAApdqSxsfJbmK4cBJhbzI5Ug"}}
@@ -356,11 +357,94 @@ public class WeiXinCorpController {
                     String corpWxUserId = jsonObject.getString("UserID");
                     Integer companyId = wxCorpInfoMapper.selectById(corpId).getCompanyId();
                     User user = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_userid", corpWxUserId).eq("company_id", companyId));
-                    if (user.getIsActive() == 1) {
+                    if (user != null && user.getIsActive() == 1) {
                         user.setIsActive(0);
                         user.setInactiveDate(LocalDate.now());
                         userMapper.updateById(user);
                     }
+                } else if ("create_user".equals(changeType)) {
+                    //新增员工
+                    String corpId = jsonObject.getString("AuthCorpId");
+                    String corpWxUserId = jsonObject.getString("UserID");
+                    WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
+                    if (!StringUtils.isEmpty(wxCorpInfo.getContactSecret())) {
+                        Integer companyId = wxCorpInfo.getCompanyId();
+                        SysRole defaultRole = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
+                        //通过通讯录secret获取到员工姓名
+                        String remoteCorpConcactAccessToken = getRemoteCorpConcactAccessToken(wxCorpInfo);
+                        JSONObject userObj = remoteGetUserDetail(remoteCorpConcactAccessToken, corpWxUserId);
+                        if (userObj.getInteger("errcode") == 0) {
+                            //成功获取到通讯录的个人详情
+                            Long id = SnowFlake.nextId();
+                            JSONArray department = userObj.getJSONArray("department");
+                            Integer curUserWXDeptid = department.getInteger(department.size() - 1);
+                            Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
+
+                            User user = new User()
+                                    .setId(id.toString())
+                                    .setRoleId(defaultRole.getId())
+                                    .setRoleName(defaultRole.getRolename())
+                                    .setName(userObj.getString("name"))
+                                    .setPassword(MD5Util.getPassword("000000"))
+                                    .setCorpwxUserid(corpWxUserId)
+                                    .setColor(ColorUtil.randomColor())
+                                    .setCompanyId(companyId);
+                            if (sysDept != null) {
+                                user.setDepartmentId(sysDept.getDepartmentId());
+                            }
+                            if (userObj.containsKey("direct_leader") && userObj.getJSONArray("direct_leader").size() > 0) {
+                                String directLeader = userObj.getJSONArray("direct_leader").getString(0);
+                                User leader = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", companyId).eq("corpwx_userid", directLeader));
+                                if (leader != null) {
+                                    user.setSuperiorId(leader.getId());
+                                }
+                            }
+                            userMapper.insert(user);
+                        }
+                    }
+                } else if ("update_user".equals(changeType)) {
+                    String corpId = jsonObject.getString("AuthCorpId");
+                    String corpWxUserId = jsonObject.getString("UserID");
+                    WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
+                    Integer companyId = wxCorpInfo.getCompanyId();
+                    //只有授权通讯录同步的,才有机会更新部门或者上级
+                    if (!StringUtils.isEmpty(wxCorpInfo.getContactSecret())) {
+                        String remoteCorpConcactAccessToken = getRemoteCorpConcactAccessToken(wxCorpInfo);
+                        JSONObject userObj = remoteGetUserDetail(remoteCorpConcactAccessToken, corpWxUserId);
+                        if (userObj.getInteger("errcode") == 0) {
+                            //成功获取到通讯录的个人详情
+                            JSONArray department = userObj.getJSONArray("department");
+                            Integer curUserWXDeptid = department.getInteger(department.size() - 1);
+                            Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
+
+                            User user = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", companyId).eq("corpwx_userid", corpWxUserId));
+                            User changeUser = new User();
+                            changeUser.setId(user.getId());
+
+                            boolean change = false;
+                            //姓名变化
+                            if (!user.getName().equals(userObj.getString("name"))) {
+                                changeUser.setName(userObj.getString("name"));
+                                change = true;
+                            }
+                            if (sysDept != null && !user.getDepartmentId().equals(sysDept.getDepartmentId())) {
+                                changeUser.setDepartmentId(sysDept.getDepartmentId());
+                                change = true;
+                            }
+                            if (userObj.containsKey("direct_leader") && userObj.getJSONArray("direct_leader").size() > 0) {
+                                String directLeader = userObj.getJSONArray("direct_leader").getString(0);
+                                User leader = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", companyId).eq("corpwx_userid", directLeader));
+                                if (leader != null && !leader.equals(user.getSuperiorId())) {
+                                    changeUser.setSuperiorId(leader.getId());
+                                    change = true;
+                                }
+                            }
+                            if (change) {
+                                userMapper.updateById(changeUser);
+                            }
+                        }
+                    }
+
                 }
             }
         } catch (Exception e) {
@@ -1214,7 +1298,7 @@ public class WeiXinCorpController {
             User oldUser = userMapper.selectOne(new QueryWrapper<User>().select("id, name").eq("corpwx_userid", curUserid).eq("company_id", companyId));
             if (oldUser == null) {
                 //先检查姓名+手机号是否存在,如果存在,则更新corpwxId
-                User sameNameUser = userMapper.selectOne(new QueryWrapper<User>().eq("name", user.getName()).eq("mobile", user.getPhone()).eq("company_id", companyId).isNull("corpwx_userid").last("limit 1"));
+                User sameNameUser = userMapper.selectOne(new QueryWrapper<User>().eq("name", user.getName()).eq("phone", user.getPhone()).eq("company_id", companyId).isNull("corpwx_userid").last("limit 1"));
                 if (sameNameUser != null) {
                     User upUser = new User();
                     upUser.setId(sameNameUser.getId());
@@ -1346,7 +1430,7 @@ public class WeiXinCorpController {
                 User oldUser = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_userid", curUserid).eq("company_id", companyId));
                 if (oldUser == null) {
                     //先检查姓名是否存在,如果存在,则更新corpwxId
-                    User sameNameUser = userMapper.selectOne(new QueryWrapper<User>().eq("name", user.getName()).eq("mobile", user.getPhone()).eq("company_id", companyId).isNull("corpwx_userid").last("limit 1"));
+                    User sameNameUser = userMapper.selectOne(new QueryWrapper<User>().eq("name", user.getName()).eq("phone", user.getPhone()).eq("company_id", companyId).isNull("corpwx_userid").last("limit 1"));
                     if (sameNameUser != null) {
                         User upUser = new User();
                         upUser.setId(sameNameUser.getId());
@@ -1657,6 +1741,15 @@ public class WeiXinCorpController {
         return obj;
     }
 
+    private JSONObject remoteGetUserDetail(String accessToken, String userId) {
+        String url = TRANSMIT_SERVER_GET_USERDETAIL.replace("ACCESS_TOKEN", accessToken).replace("USERID", userId);
+        System.out.println("请求URL="+url);
+        String result = restTemplate.getForObject(url, String.class);
+        System.out.println("远程人员详情:"+result);
+        JSONObject obj = JSONObject.parseObject(JSONObject.parseObject(result).getString("data"));
+        return obj;
+    }
+
     //通过中转服务器,调用通讯录的accessToken
     private String getRemoteCorpConcactAccessToken(WxCorpInfo corpInfo) throws Exception {
         String url = TRANSMIT_SERVER_GET_CONTACT_TOKEN.replace("CORPID", corpInfo.getCorpid()).replace("CONTACT_SECRET", corpInfo.getContactSecret());
@@ -1726,6 +1819,17 @@ public class WeiXinCorpController {
         msg.data = userList.toString();
         return msg;
     }
+    //用于从中转服务器获取企业通讯录的单个人员详情
+    @RequestMapping("/getUserInfoFromTranServer")
+    public HttpRespMsg getUserInfoFromTranServer(String accessToken, String userId) {
+        String url = GET_USER_INFO_URL.replace("ACCESS_TOKEN", accessToken).replace("USERID", userId);
+        String result = restTemplate.getForObject(url, String.class);
+        JSONObject obj = JSONObject.parseObject(result);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = obj.toString();
+        return msg;
+    }
+
 
     private boolean judgeIsLeader(String userId) {
         int cnt = projectAuditorMapper.selectCount(new QueryWrapper<ProjectAuditor>().eq("auditor_id", userId));