package com.tanpu.feo.feojob.jobs; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.digest.MD5; import cn.hutool.json.JSONUtil; import com.tanpu.feo.feojob.constant.BaseConstant; import com.tanpu.feo.feojob.constant.OrgExtConstant; import com.tanpu.feo.feojob.dao.user.entity.*; import com.tanpu.feo.feojob.dto.WorkDataDto; import com.tanpu.feo.feojob.dto.WxCpDepartDto; import com.tanpu.feo.feojob.enums.EmployeeDutyEnum; import com.tanpu.feo.feojob.enums.RoleTypeEnum; import com.tanpu.feo.feojob.service.*; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; import me.chanjar.weixin.cp.bean.Gender; import me.chanjar.weixin.cp.bean.WxCpDepart; import me.chanjar.weixin.cp.bean.WxCpUser; import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author zejia zj wu * @date 2021-05-18 * @Description 从企业微信 同步 组织信息 及 员工信息 */ @Component @Slf4j public class OrgSyncByWxcpJob { final static String keyStr = "{\"corpId\":\"ww08675a3a48c9e8a2\",\"agentId\":\"1000013\",\"corpSecret\":\"l7eLNC5DDNxmucc9emHsEaSXym4VKDy_D5w4IoOpvqk\",\"token\":\"E1zDvDkXWt\",\"aesKey\":\"43P8lbP5yt8AHLOUPGBPS252c60K9Vzofzm5NOxHHeP\",\"sendMessageAppId\":\"wxe177c62fa1e1c602\"}\n"; @Resource private OrgExtService orgExtService; @Resource private OrgService orgService; @Resource private UserInfoService userInfoService; @Resource private DepartmentService departmentService; @Resource private DepartmentEmployeeService departmentEmployeeService; @Resource private EmployeeService employeeService; @Resource private EmployeeRoleService employeeRoleService; @Resource private RoleService roleService; @Resource private OrgSyncService orgSyncService; @Value("${tanpu.sync.job.skipped:true}") private boolean jobSkipped; @Scheduled(cron = "0 30 6,10,15 * * ?") //每日凌晨6点30执行 public void execute() { log.info("====== 开始执行OrgSyncByWxcpJob ======"); try { if (!jobSkipped) { orgSyncByWxcp("Y"); } } catch (Exception e) { log.error("====== 异常结束执行OrgSyncByWxcpJob,错误:{}=======", e.getMessage()); } log.info("====== 结束执行OrgSyncByWxcpJob ======"); } /** * 执行 部门 及 员工 同步任务 * * @param isAuto 任务触发类型 Y 定时任务 / N 手动 */ public void orgSyncByWxcp(String isAuto) { // 1 扫描 org_ext 表 获取需要 执行同步的 机构 List<OrgExtEntity> orgExtList = orgExtService.findOrgExtByModel(OrgExtConstant.MODEL_ONE); for (OrgExtEntity orgExtEntity : orgExtList) { String orgId = orgExtEntity.getOrgId(); log.info("======开始同步机构:{} 的信息======", orgId); //2 根据orgId 查找机构 相关信息 OrgEntity orgEntity = orgService.findById(orgId); //3 从企业微信获取组织信息及员工信息 log.info("======从企业微信获取组织信息及员工信息 开始======"); WxCpDefaultConfigImpl wxCpDefaultConfig = JSONUtil.toBean(orgExtEntity.getJsonWxcpKey(), WxCpDefaultConfigImpl.class); List<WxCpDepart> wxCpDepartList; // 机构信息 List<WxCpDepartDto> wxCpDepartDtoList;//自定义的 部门信息 try { wxCpDepartList = getWxCpDepartList(wxCpDefaultConfig); wxCpDepartDtoList = getWxCpUserList(wxCpDepartList, wxCpDefaultConfig); } catch (Exception e) { log.error("======从企业微信获取组织信息及员工信息失败->机构:{} -> 错误信息-> {}======", orgId, e.getMessage()); continue; } log.info("======从企业微信获取组织信息及员工信息 结束======"); //4 判断是否需要 同步 String digestHex = isExecute(isAuto, wxCpDepartDtoList, orgExtEntity.getMd5WxcpData()); if (StrUtil.isBlank(digestHex)) { log.info("====== 机构:{} 不需要执行同步=======", orgId); continue; } //5 开始比对 5张表 数据 user_info employee department department_employee employee_role log.info("======开始比对 5张表 数据 ======"); String corpId = wxCpDefaultConfig.getCorpId(); WorkDataDto<UserInfoEntity> workUserInfo = userInfoWork(orgEntity.getId(), wxCpDepartDtoList, corpId); WorkDataDto<EmployeeEntity> workEmployee = employeeWork(orgEntity.getId(), wxCpDepartDtoList, corpId); WorkDataDto<DepartmentEntity> workDepartment = departmentWork(orgEntity.getId(), wxCpDepartDtoList); WorkDataDto<DepartmentEmployeeEntity> workDepartmentEmployee = departmentEmployeeWork(orgEntity.getId(), wxCpDepartDtoList, corpId); WorkDataDto<EmployeeRoleEntity> workEmployeeRole = employeeRoleWork(orgEntity.getId(), wxCpDepartDtoList, corpId); log.info("======结束比对 5张表 数据 ======"); //6 数据 更新 orgSyncService.updateData(orgId, workUserInfo, workEmployee, workDepartment, workDepartmentEmployee, workEmployeeRole); //7 讲最新的md5值 存至 orgExtEntity 表中 orgExtEntity.setMd5WxcpData(digestHex); orgExtService.updateById(orgExtEntity); } } /** * @description: 整理 员工与角色关联关系 数据 * @Author: zejia zj wu * @date: 2021/5/27 3:08 下午 */ private WorkDataDto<EmployeeRoleEntity> employeeRoleWork(String orgId, List<WxCpDepartDto> wxCpDepartDtoList, String corpId) { WorkDataDto<EmployeeRoleEntity> workDataDto = new WorkDataDto<>(); List<EmployeeRoleEntity> insertList = new ArrayList<>(); List<EmployeeRoleEntity> deleteList = new ArrayList<>(); List<EmployeeRoleEntity> updateList = new ArrayList<>(); //获取 数据库 部门员工关系 信息 List<EmployeeRoleEntity> employeeRoleList = employeeRoleService.findInfoByOrgId(orgId); // 获取 role Map<String, String> roleMap = roleService.findInfoNoAdmin(); // 预处理 新数据 HashMap<String, WxCpUser> hashMap = new HashMap<>(); for (WxCpDepartDto wxCpDepartDto : wxCpDepartDtoList) { List<WxCpUser> wxCpUserList = wxCpDepartDto.getWxCpUserList(); for (WxCpUser wxCpUser : wxCpUserList) { // key employee_id + '&' + role_id String type = wxCpUser.getIsLeader() == 1 ? RoleTypeEnum.TEAM.code : RoleTypeEnum.IFA.code; hashMap.put(corpId + "_" + wxCpUser.getUserId() + "&" + roleMap.get(type), wxCpUser); } } for (EmployeeRoleEntity employeeRole : employeeRoleList) { String employeeId = employeeRole.getEmployeeId(); String roleId = employeeRole.getRoleId(); String key = employeeId + "&" + roleId; WxCpUser wxCpUser = hashMap.get(key); //删除 if (ObjectUtil.isNull(wxCpUser)) { // 删除 deleteList.add(employeeRole); continue; } // 员工 角色关联关系没有 更新 hashMap.remove(key); } Map<String, List<EmployeeRoleEntity>> map = employeeRoleList.stream().collect(Collectors.groupingBy(EmployeeRoleEntity::getEmployeeId)); String adminRoleId = roleMap.get(RoleTypeEnum.ADMIN.code); for (String key : hashMap.keySet()) { String[] split = key.split("&"); String employeeId = split[0]; String roleId = split[1]; // 如果已经有一个admin的角色,那么就不要插入新的 List<EmployeeRoleEntity> roleList = map.get(employeeId); if (CollectionUtils.isNotEmpty(roleList) && roleList.stream().anyMatch(p -> StringUtils.equals(p.getRoleId(), adminRoleId))) { log.info("成员已经有管理员角色了,不需要再插入, userId: {}, orgId:{}", employeeId, orgId); continue; } EmployeeRoleEntity employeeRole = new EmployeeRoleEntity(); employeeRole.setEmployeeId(employeeId); employeeRole.setRoleId(roleId); employeeRole.setOrgId(orgId); insertList.add(employeeRole); } workDataDto.setDeleteList(deleteList); workDataDto.setInsertList(insertList); workDataDto.setUpdateList(updateList); return workDataDto; } /** * @description: 整理 部门与员工关联关系 数据 * @Author: zejia zj wu * @date: 2021/5/27 3:08 下午 */ private WorkDataDto<DepartmentEmployeeEntity> departmentEmployeeWork(String orgId, List<WxCpDepartDto> wxCpDepartDtoList, String corpId) { WorkDataDto<DepartmentEmployeeEntity> workDataDto = new WorkDataDto<>(); List<DepartmentEmployeeEntity> insertList = new ArrayList<>(); List<DepartmentEmployeeEntity> deleteList = new ArrayList<>(); List<DepartmentEmployeeEntity> updateList = new ArrayList<>(); //获取 数据库 部门员工关系 信息 List<DepartmentEmployeeEntity> departmentEmployeeList = departmentEmployeeService.findInfoByOrgId(orgId); // 预处理 新数据 HashMap<String, WxCpUser> hashMap = new HashMap<>(); for (WxCpDepartDto wxCpDepartDto : wxCpDepartDtoList) { List<WxCpUser> wxCpUserList = wxCpDepartDto.getWxCpUserList(); for (WxCpUser wxCpUser : wxCpUserList) { // key department_id + '&' + employee_id hashMap.put(orgId + "_" + wxCpDepartDto.getId() + "&" + corpId + "_" + wxCpUser.getUserId(), wxCpUser); } } for (DepartmentEmployeeEntity departmentEmployee : departmentEmployeeList) { String departmentId = departmentEmployee.getDepartmentId(); String employeeId = departmentEmployee.getEmployeeId(); String key = departmentId + "&" + employeeId; WxCpUser wxCpUser = hashMap.get(key); if (ObjectUtil.isNull(wxCpUser)) { // 删除 deleteList.add(departmentEmployee); continue; } //更新 String type = wxCpUser.getIsLeader() == 1 ? EmployeeDutyEnum.DIRECTOR.code : EmployeeDutyEnum.STAFF.code; if (!departmentEmployee.getType().equals(type)) { departmentEmployee.setType(type); updateList.add(departmentEmployee); } hashMap.remove(key); } for (String s : hashMap.keySet()) { WxCpUser wxCpUser = hashMap.get(s); String type = wxCpUser.getIsLeader() == 1 ? EmployeeDutyEnum.DIRECTOR.code : EmployeeDutyEnum.STAFF.code; String[] split = s.split("&"); String departmentId = split[0]; String employeeId = split[1]; DepartmentEmployeeEntity departmentEmployee = new DepartmentEmployeeEntity(); departmentEmployee.setEmployeeId(employeeId); departmentEmployee.setDepartmentId(departmentId); departmentEmployee.setType(type); departmentEmployee.setOrgId(orgId); insertList.add(departmentEmployee); } workDataDto.setDeleteList(deleteList); workDataDto.setInsertList(insertList); workDataDto.setUpdateList(updateList); return workDataDto; } /** * @description: 整理 部门机构 数据 * @Author: zejia zj wu * @date: 2021/5/27 3:09 下午 */ private WorkDataDto<DepartmentEntity> departmentWork(String orgId, List<WxCpDepartDto> wxCpDepartDtoList) { WorkDataDto<DepartmentEntity> workDataDto = new WorkDataDto<>(); List<DepartmentEntity> insertList = new ArrayList<>(); List<DepartmentEntity> deleteList = new ArrayList<>(); List<DepartmentEntity> updateList = new ArrayList<>(); //获取 数据库 部门 信息 List<DepartmentEntity> departmentList = departmentService.findDepartmentByOrgId(orgId); // 预处理 新数据 HashMap<String, WxCpDepartDto> hashMap = new HashMap<>(); HashMap<Long, WxCpDepartDto> hashMap2 = new HashMap<>(); for (WxCpDepartDto wxCpDepartDto : wxCpDepartDtoList) { hashMap.put(orgId + "_" + wxCpDepartDto.getId(), wxCpDepartDto); hashMap2.put(wxCpDepartDto.getId(), wxCpDepartDto); } for (DepartmentEntity department : departmentList) { String departmentId = department.getDepartmentId(); WxCpDepartDto wxCpDepartDto = hashMap.get(departmentId); //删除 if (ObjectUtil.isNull(wxCpDepartDto)) { deleteList.add(department); continue; } //更新 Long parentId1 = wxCpDepartDto.getParentId(); String parentId = ObjectUtil.isNull(hashMap2.get(parentId1)) ? null : orgId + "_" + parentId1; Integer level = getLevel(hashMap2, wxCpDepartDto.getId()); if (!department.getDepartmentName().equals(wxCpDepartDto.getName()) || StrUtil.compareIgnoreCase(department.getParentDepartId(), parentId, false) != 0 || !department.getMembers().equals(wxCpDepartDto.getMembers()) || !level.equals(department.getLevel())) { department.setDepartmentName(wxCpDepartDto.getName()); department.setParentDepartId(parentId); department.setMembers(wxCpDepartDto.getMembers()); department.setLevel(level); updateList.add(department); } hashMap.remove(departmentId); } //修改 for (String departmentId : hashMap.keySet()) { WxCpDepartDto wxCpDepartDto = hashMap.get(departmentId); Long parentId1 = wxCpDepartDto.getParentId(); String parentId = ObjectUtil.isNull(hashMap2.get(parentId1)) ? null : orgId + "_" + parentId1; DepartmentEntity department = new DepartmentEntity(); department.setDepartmentId(orgId + "_" + wxCpDepartDto.getId()); department.setParentDepartId(parentId); department.setDepartmentName(wxCpDepartDto.getName()); department.setLevel(getLevel(hashMap2, wxCpDepartDto.getId())); department.setMembers(wxCpDepartDto.getMembers()); department.setOrgId(orgId); insertList.add(department); } workDataDto.setDeleteList(deleteList); workDataDto.setInsertList(insertList); workDataDto.setUpdateList(updateList); return workDataDto; } /** * @description: 获取部门等级 * @Author: zejia zj wu * @date: 2021/5/27 3:09 下午 */ private Integer getLevel(HashMap<Long, WxCpDepartDto> hashMap2, Long id) { Long parentId = hashMap2.get(id).getParentId(); if (ObjectUtil.isNull(hashMap2.get(parentId))) { return 1; } return 1 + getLevel(hashMap2, parentId); } /** * @description: 整理 员工 数据 * @Author: zejia zj wu * @date: 2021/5/27 3:09 下午 */ private WorkDataDto<EmployeeEntity> employeeWork(String orgId, List<WxCpDepartDto> wxCpDepartDtoList, String corpId) { WorkDataDto<EmployeeEntity> workDataDto = new WorkDataDto<>(); List<EmployeeEntity> insertList = new ArrayList<>(); List<EmployeeEntity> deleteList = new ArrayList<>(); List<EmployeeEntity> updateList = new ArrayList<>(); //获取 数据库 员工 信息 List<EmployeeEntity> employeeList = employeeService.getEmployeeSListByOrgId(orgId); // 预处理 新数据 HashMap<String, WxCpUser> hashMap = new HashMap<>(); for (WxCpDepartDto wxCpDepartDto : wxCpDepartDtoList) { List<WxCpUser> wxCpUserList = wxCpDepartDto.getWxCpUserList(); for (WxCpUser wxCpUser : wxCpUserList) { hashMap.put(corpId + "_" + wxCpUser.getUserId(), wxCpUser); } } // 计算 变化数据 for (EmployeeEntity employee : employeeList) { String employeeId = employee.getEmployeeId(); WxCpUser wxCpUser = hashMap.get(employeeId); //删除 if (ObjectUtil.isNull(wxCpUser)) { deleteList.add(employee); continue; } //更新 String status = wxCpUser.getStatus() == 1 ? "on" : "off"; if (!employee.getName().equals(wxCpUser.getName()) || !employee.getMail().equals(wxCpUser.getEmail()) || StrUtil.isBlank(employee.getBoundWechat()) || !employee.getStatus().equals(status)) { employee.setName(wxCpUser.getName()); employee.setMail(wxCpUser.getEmail()); if (StrUtil.isBlankIfStr(employee.getBoundWechat())) { employee.setBoundWechat(orgId + "_" + wxCpUser.getUserId()); } employee.setStatus(status); updateList.add(employee); } hashMap.remove(employeeId); } //修改 for (String key : hashMap.keySet()) { WxCpUser wxCpUser = hashMap.get(key); EmployeeEntity employee = new EmployeeEntity(); employee.setEmployeeId(corpId + "_" + wxCpUser.getUserId()); employee.setName(wxCpUser.getName()); employee.setPhone(wxCpUser.getMobile()); employee.setMail(wxCpUser.getEmail()); employee.setNumber(null); employee.setOrgId(orgId); employee.setBoundWechat(orgId + "_" + wxCpUser.getUserId()); employee.setStatus(wxCpUser.getStatus() == 1 ? BaseConstant.EmployeeStatus.ON_JOB : BaseConstant.EmployeeStatus.DEPARTED); insertList.add(employee); } workDataDto.setDeleteList(deleteList); workDataDto.setInsertList(insertList); workDataDto.setUpdateList(updateList); return workDataDto; } /** * @description: 整理 用户表 数据 * @Author: zejia zj wu * @date: 2021/5/27 3:10 下午 */ private WorkDataDto<UserInfoEntity> userInfoWork(String orgId, List<WxCpDepartDto> wxCpDepartDtoList, String corpId) { WorkDataDto<UserInfoEntity> workDataDto = new WorkDataDto<>(); List<UserInfoEntity> insertList = new ArrayList<>(); List<UserInfoEntity> deleteList = new ArrayList<>(); List<UserInfoEntity> updateList = new ArrayList<>(); //获取 数据库用户信息 List<UserInfoEntity> userInfoList = userInfoService.getUserInfoListByOrgId(orgId); // 预处理 新数据 HashMap<String, WxCpUser> hashMap = new HashMap<>(); for (WxCpDepartDto wxCpDepartDto : wxCpDepartDtoList) { List<WxCpUser> wxCpUserList = wxCpDepartDto.getWxCpUserList(); for (WxCpUser wxCpUser : wxCpUserList) { hashMap.put(corpId + "_" + wxCpUser.getUserId(), wxCpUser); } } // 计算 变化数据 for (UserInfoEntity userInfo : userInfoList) { String id = userInfo.getId(); WxCpUser wxCpUser = hashMap.get(id); // 删除 if (ObjectUtil.isNull(wxCpUser)) { deleteList.add(userInfo); continue; } // 更新 if (!userInfo.getUiUsername().equals(wxCpUser.getName()) || StrUtil.isBlankIfStr(userInfo.getUiHeadimgMp()) || !wxCpUser.getUserId().equals(userInfo.getWxcpUid()) || StrUtil.isBlankIfStr(userInfo.getUiWechatXcxQrcode()) || !userInfo.getUiShenfen().equals(String.valueOf(wxCpUser.getIsLeader()))) { userInfo.setUiUsername(wxCpUser.getName()); userInfo.setUiHeadimgMp(wxCpUser.getThumbAvatar()); userInfo.setWxcpUid(wxCpUser.getUserId()); userInfo.setUiShenfen(String.valueOf(wxCpUser.getIsLeader())); userInfo.setUiWechatXcxQrcode(orgSyncService.createWechatXcxQrcode(userInfo.getId(), wxCpUser.getThumbAvatar())); updateList.add(userInfo); } hashMap.remove(id); } for (String key : hashMap.keySet()) { WxCpUser wxCpUser = hashMap.get(key); UserInfoEntity userInfo = new UserInfoEntity(); userInfo.setUiTelphone(wxCpUser.getMobile()); userInfo.setUiUsername(wxCpUser.getName()); Gender gender = wxCpUser.getGender(); String sex = gender.getCode().equals("1") ? BaseConstant.Gender.MAN : BaseConstant.Gender.WOMEN; userInfo.setUiSex(sex); userInfo.setUiHeadimg(wxCpUser.getThumbAvatar()); userInfo.setUiHeadimgMp(wxCpUser.getThumbAvatar()); userInfo.setOrgId(orgId); userInfo.setId(corpId + "_" + wxCpUser.getUserId()); userInfo.setUiMobilephoneMp(wxCpUser.getMobile()); userInfo.setDeletetag("0"); userInfo.setUiShenfen(String.valueOf(wxCpUser.getIsLeader())); userInfo.setUiEmailMp(wxCpUser.getEmail()); String nickName = wxCpUser.getName(); userInfo.setUiUsername(nickName); userInfo.setUiUsernameMp(nickName); userInfo.setUiRzstatus(1); //默认小名片 0:小名片 1:大名片 userInfo.setUiTypeMp("1"); userInfo.setLevel(2); // 0: 白银 1:黄金 2:钻石 userInfo.setUiGrade("0"); userInfo.setUiSource("pc"); userInfo.setUiRegisterTime(userInfo.getCreatetime()); userInfo.setUiChannel(null); userInfo.setWxcpUid(wxCpUser.getUserId()); userInfo.setUiWechatXcxQrcode(orgSyncService.createWechatXcxQrcode(userInfo.getId(), userInfo.getUiHeadimgMp())); insertList.add(userInfo); } workDataDto.setDeleteList(deleteList); workDataDto.setInsertList(insertList); workDataDto.setUpdateList(updateList); return workDataDto; } /** * @description: 判断是否需要执行 并返回数据MD5 * @Author: zejia zj wu * @date: 2021/5/27 3:10 下午 */ private String isExecute(String isAuto, List<WxCpDepartDto> wxCpDepartDtoList, String md5WxcpData) { String digestHex = MD5.create().digestHex(JSONUtil.toJsonStr(wxCpDepartDtoList)); if (!"Y".equals(isAuto)) { return digestHex; } if (digestHex.equals(md5WxcpData)) { return null; } return digestHex; } /** * @description: 获取 企业微信 用户列表信息 * @Author: zejia zj wu * @date: 2021/5/27 3:11 下午 */ private List<WxCpDepartDto> getWxCpUserList(List<WxCpDepart> wxCpDepartList, WxCpDefaultConfigImpl wxCpDefaultConfig) throws Exception { WxCpService cpService = new WxCpServiceImpl(); cpService.setWxCpConfigStorage(wxCpDefaultConfig); ArrayList<WxCpDepartDto> wxCpDepartDtoArrayList = new ArrayList<>(); for (WxCpDepart wxCpDepart : wxCpDepartList) { try { List<WxCpUser> wxCpUsers = cpService.getUserService().listByDepartment(wxCpDepart.getId(), Boolean.FALSE, 0); WxCpDepartDto wxCpDepartDto = new WxCpDepartDto(); BeanUtil.copyProperties(wxCpDepart, wxCpDepartDto, true); wxCpDepartDto.setWxCpUserList(wxCpUsers); wxCpDepartDto.setMembers(wxCpUsers.size()); wxCpDepartDtoArrayList.add(wxCpDepartDto); } catch (WxErrorException e) { log.error("======根据企业微信key 获取企业微信员工信息调用失败,错误:{}=======", e.getMessage()); throw new Exception("根据企业微信key 获取企业微信组织结构调用失败"); } } return wxCpDepartDtoArrayList; } /** * @description: 获取 企业微信 部门聊表信息 * @Author: zejia zj wu * @date: 2021/5/27 3:11 下午 */ private List<WxCpDepart> getWxCpDepartList(WxCpDefaultConfigImpl wxCpDefaultConfig) throws Exception { WxCpService cpService = new WxCpServiceImpl(); cpService.setWxCpConfigStorage(wxCpDefaultConfig); List<WxCpDepart> wxCpDeparts; try { wxCpDeparts = cpService.getDepartmentService().list(null); } catch (WxErrorException e) { log.error("======根据企业微信key 获取企业微信组织结构调用失败,错误:{}=======", e.getMessage()); throw new Exception("根据企业微信key 获取企业微信组织结构调用失败"); } return wxCpDeparts; } public static void main(String[] args) throws Exception { OrgSyncByWxcpJob orgSyncByWxcpJob = new OrgSyncByWxcpJob(); WxCpDefaultConfigImpl wxCpDefaultConfig = JSONUtil.toBean(keyStr, WxCpDefaultConfigImpl.class); List<WxCpDepart> wxCpDepartList = orgSyncByWxcpJob.getWxCpDepartList(wxCpDefaultConfig); // 机构信息 List<WxCpDepartDto> wxCpDepartDtoList = orgSyncByWxcpJob.getWxCpUserList(wxCpDepartList, wxCpDefaultConfig); log.info("========================="); // log.info(JSONUtil.toJsonStr(wxCpDepartDtoList)); String digestHex = MD5.create().digestHex(JSONUtil.toJsonStr(wxCpDepartDtoList)); log.info(digestHex); } }