package org.jeecg.modules.system.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.jeecg.dingtalk.api.base.JdtBaseAPI; import com.jeecg.dingtalk.api.core.response.Response; import com.jeecg.dingtalk.api.core.vo.AccessToken; import com.jeecg.dingtalk.api.core.vo.PageResult; import com.jeecg.dingtalk.api.department.JdtDepartmentAPI; import com.jeecg.dingtalk.api.department.vo.Department; import com.jeecg.dingtalk.api.message.JdtMessageAPI; import com.jeecg.dingtalk.api.message.vo.ActionCardMessage; import com.jeecg.dingtalk.api.message.vo.Message; import com.jeecg.dingtalk.api.message.vo.TextMessage; import com.jeecg.dingtalk.api.user.JdtUserAPI; import com.jeecg.dingtalk.api.user.body.GetUserListBody; import com.jeecg.dingtalk.api.user.vo.User; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.util.PasswordUtil; import org.jeecg.common.util.RestUtil; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.thirdapp.ThirdAppConfig; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper; import org.jeecg.modules.system.model.SysDepartTreeModel; import org.jeecg.modules.system.service.*; import org.jeecg.modules.system.vo.thirdapp.JdtDepartmentTreeVo; import org.jeecg.modules.system.vo.thirdapp.SyncInfoVo; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; /** * 第三方App对接:钉钉实现类 */ @Slf4j @Service public class ThirdAppDingtalkServiceImpl implements IThirdAppService { @Autowired ThirdAppConfig thirdAppConfig; @Autowired private ISysDepartService sysDepartService; @Autowired private ISysUserService sysUserService; @Autowired private ISysThirdAccountService sysThirdAccountService; @Autowired private ISysUserDepartService sysUserDepartService; @Autowired private ISysPositionService sysPositionService; @Autowired private SysAnnouncementSendMapper sysAnnouncementSendMapper; @Override public String getAccessToken() { String appKey = thirdAppConfig.getDingtalk().getClientId(); String appSecret = thirdAppConfig.getDingtalk().getClientSecret(); AccessToken accessToken = JdtBaseAPI.getAccessToken(appKey, appSecret); if (accessToken != null) { return accessToken.getAccessToken(); } log.warn("获取AccessToken失败"); return null; } @Override public boolean syncLocalDepartmentToThirdApp(String ids) { String accessToken = this.getAccessToken(); if (accessToken == null) { return false; } // 获取【钉钉】所有的部门 List departments = JdtDepartmentAPI.listAll(accessToken); // 删除钉钉有但本地没有的部门(以本地部门数据为主)(钉钉不能创建同名部门,只能先删除) List sysDepartList = sysDepartService.list(); for1: for (Department department : departments) { for (SysDepart depart : sysDepartList) { // id相同,代表已存在,不删除 String sourceIdentifier = department.getSource_identifier(); if (sourceIdentifier != null && sourceIdentifier.equals(depart.getId())) { continue for1; } } // 循环到此说明本地没有,删除 int deptId = department.getDept_id(); // 钉钉不允许删除带有用户的部门,所以需要判断下,将有用户的部门的用户移动至根部门 Response> userIdRes = JdtUserAPI.getUserListIdByDeptId(deptId, accessToken); if (userIdRes.isSuccess() && userIdRes.getResult().size() > 0) { for (String userId : userIdRes.getResult()) { User updateUser = new User(); updateUser.setUserid(userId); updateUser.setDept_id_list(1); JdtUserAPI.update(updateUser, accessToken); } } JdtDepartmentAPI.delete(deptId, accessToken); } // 获取本地所有部门树结构 List sysDepartsTree = sysDepartService.queryTreeList(); // -- 钉钉不能创建新的顶级部门,所以新的顶级部门的parentId就为1 Department parent = new Department(); parent.setDept_id(1); // 递归同步部门 departments = JdtDepartmentAPI.listAll(accessToken); this.syncDepartmentRecursion(sysDepartsTree, departments, parent, accessToken); return true; } // 递归同步部门到本地 public void syncDepartmentRecursion(List sysDepartsTree, List departments, Department parent, String accessToken) { if (sysDepartsTree != null && sysDepartsTree.size() != 0) { for1: for (SysDepartTreeModel depart : sysDepartsTree) { for (Department department : departments) { // id相同,代表已存在,执行修改操作 String sourceIdentifier = department.getSource_identifier(); if (sourceIdentifier != null && sourceIdentifier.equals(depart.getId())) { this.sysDepartToDtDepartment(depart, department, parent.getDept_id()); JdtDepartmentAPI.update(department, accessToken); // 紧接着同步子级 this.syncDepartmentRecursion(depart.getChildren(), departments, department, accessToken); // 跳出外部循环 continue for1; } } // 循环到此说明是新部门,直接调接口创建 Department newDepartment = this.sysDepartToDtDepartment(depart, parent.getDept_id()); Response response = JdtDepartmentAPI.create(newDepartment, accessToken); // 创建成功,将返回的id绑定到本地 if (response.getResult() != null) { Department newParent = new Department(); newParent.setDept_id(response.getResult()); // 紧接着同步子级 this.syncDepartmentRecursion(depart.getChildren(), departments, newParent, accessToken); } // 收集错误信息 // this.syncUserCollectErrInfo(errCode, sysUser, errInfo); } } } @Override public SyncInfoVo syncThirdAppDepartmentToLocal(String ids) { SyncInfoVo syncInfo = new SyncInfoVo(); String accessToken = this.getAccessToken(); if (accessToken == null) { syncInfo.addFailInfo("accessToken获取失败!"); return syncInfo; } // 获取【钉钉】所有的部门 List departments = JdtDepartmentAPI.listAll(accessToken); String username = JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest()); List departmentTreeList = JdtDepartmentTreeVo.listToTree(departments); // 递归同步部门 this.syncDepartmentToLocalRecursion(departmentTreeList, null, username, syncInfo, accessToken); return syncInfo; } public void syncDepartmentToLocalRecursion(List departmentTreeList, String sysParentId, String username, SyncInfoVo syncInfo, String accessToken) { if (departmentTreeList != null && departmentTreeList.size() != 0) { for (JdtDepartmentTreeVo departmentTree : departmentTreeList) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); // 根据 source_identifier 字段查询 queryWrapper.eq(SysDepart::getId, departmentTree.getSource_identifier()); SysDepart sysDepart = sysDepartService.getOne(queryWrapper); if (sysDepart != null) { // 执行更新操作 SysDepart updateSysDepart = this.dtDepartmentToSysDepart(departmentTree, sysDepart); if (sysParentId != null) { updateSysDepart.setParentId(sysParentId); } try { sysDepartService.updateDepartDataById(updateSysDepart, username); String str = String.format("部门 %s 更新成功!", updateSysDepart.getDepartName()); syncInfo.addSuccessInfo(str); } catch (Exception e) { this.syncDepartCollectErrInfo(e, departmentTree, syncInfo); } if (departmentTree.hasChildren()) { // 紧接着同步子级 this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), updateSysDepart.getId(), username, syncInfo, accessToken); } } else { // 执行新增操作 SysDepart newSysDepart = this.dtDepartmentToSysDepart(departmentTree, null); if (sysParentId != null) { newSysDepart.setParentId(sysParentId); } try { sysDepartService.saveDepartData(newSysDepart, username); // 更新钉钉 source_identifier Department updateDtDepart = new Department(); updateDtDepart.setDept_id(departmentTree.getDept_id()); updateDtDepart.setSource_identifier(newSysDepart.getId()); Response response = JdtDepartmentAPI.update(updateDtDepart, accessToken); if (!response.isSuccess()) { throw new RuntimeException(response.getErrmsg()); } String str = String.format("部门 %s 创建成功!", newSysDepart.getDepartName()); syncInfo.addSuccessInfo(str); } catch (Exception e) { this.syncDepartCollectErrInfo(e, departmentTree, syncInfo); } // 紧接着同步子级 if (departmentTree.hasChildren()) { this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), newSysDepart.getId(), username, syncInfo, accessToken); } } } } } private boolean syncDepartCollectErrInfo(Exception e, Department department, SyncInfoVo syncInfo) { String msg; if (e instanceof DuplicateKeyException) { msg = e.getCause().getMessage(); } else { msg = e.getMessage(); } String str = String.format("部门 %s(%s) 同步失败!错误信息:%s", department.getName(), department.getDept_id(), msg); syncInfo.addFailInfo(str); return false; } @Override public SyncInfoVo syncLocalUserToThirdApp(String ids) { SyncInfoVo syncInfo = new SyncInfoVo(); String accessToken = this.getAccessToken(); if (accessToken == null) { syncInfo.addFailInfo("accessToken获取失败!"); return syncInfo; } List sysUsers; if (StringUtils.isNotBlank(ids)) { String[] idList = ids.split(","); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(SysUser::getId, (Object[]) idList); // 获取本地指定用户 sysUsers = sysUserService.list(queryWrapper); } else { // 获取本地所有用户 sysUsers = sysUserService.list(); } // 查询钉钉所有的部门,用于同步用户和部门的关系 List allDepartment = JdtDepartmentAPI.listAll(accessToken); for (SysUser sysUser : sysUsers) { // 外部模拟登陆临时账号,不同步 if ("_reserve_user_external".equals(sysUser.getUsername())) { continue; } // 钉钉用户信息,不为null代表已同步过 Response dtUserInfo; /* * 判断是否同步过的逻辑: * 1. 查询 sys_third_account(第三方账号表)是否有数据,如果有代表已同步 * 2. 本地表里没有,就先用手机号判断,不通过再用username判断。 */ SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneBySysUserId(sysUser.getId(), ThirdAppConfig.DINGTALK.toLowerCase()); if (sysThirdAccount != null && oConvertUtils.isNotEmpty(sysThirdAccount.getThirdUserId())) { // sys_third_account 表匹配成功,通过第三方userId查询出第三方userInfo dtUserInfo = JdtUserAPI.getUserById(sysThirdAccount.getThirdUserId(), accessToken); } else { // 手机号匹配 Response thirdUserId = JdtUserAPI.getUseridByMobile(sysUser.getPhone(), accessToken); // 手机号匹配成功 if (thirdUserId.isSuccess() && oConvertUtils.isNotEmpty(thirdUserId.getResult())) { // 通过查询到的userId查询用户详情 dtUserInfo = JdtUserAPI.getUserById(thirdUserId.getResult(), accessToken); } else { // 手机号匹配失败,尝试使用username匹配 dtUserInfo = JdtUserAPI.getUserById(sysUser.getUsername(), accessToken); } } String dtUserId; // api 接口是否执行成功 boolean apiSuccess; // 已同步就更新,否则就创建 if (dtUserInfo != null && dtUserInfo.isSuccess() && dtUserInfo.getResult() != null) { User dtUser = dtUserInfo.getResult(); dtUserId = dtUser.getUserid(); User updateQwUser = this.sysUserToDtUser(sysUser, dtUser, allDepartment); Response updateRes = JdtUserAPI.update(updateQwUser, accessToken); // 收集成功/失败信息 apiSuccess = this.syncUserCollectErrInfo(updateRes, sysUser, syncInfo); } else { User newQwUser = this.sysUserToDtUser(sysUser, allDepartment); Response createRes = JdtUserAPI.create(newQwUser, accessToken); dtUserId = createRes.getResult(); // 收集成功/失败信息 apiSuccess = this.syncUserCollectErrInfo(createRes, sysUser, syncInfo); } // api 接口执行成功,并且 sys_third_account 表匹配失败,就向 sys_third_account 里插入一条数据 if (apiSuccess && (sysThirdAccount == null || oConvertUtils.isEmpty(sysThirdAccount.getThirdUserId()))) { if (sysThirdAccount == null) { sysThirdAccount = new SysThirdAccount(); sysThirdAccount.setSysUserId(sysUser.getId()); sysThirdAccount.setStatus(1); sysThirdAccount.setDelFlag(0); sysThirdAccount.setThirdType(ThirdAppConfig.DINGTALK.toLowerCase()); } // 设置第三方app用户ID sysThirdAccount.setThirdUserId(dtUserId); sysThirdAccountService.saveOrUpdate(sysThirdAccount); } } return syncInfo; } @Override public SyncInfoVo syncThirdAppUserToLocal() { SyncInfoVo syncInfo = new SyncInfoVo(); String accessToken = this.getAccessToken(); if (accessToken == null) { syncInfo.addFailInfo("accessToken获取失败!"); return syncInfo; } // 获取本地用户 List sysUsersList = sysUserService.list(); // 查询钉钉所有的部门,用于同步用户和部门的关系 List allDepartment = JdtDepartmentAPI.listAll(accessToken); // 根据钉钉部门查询所有钉钉用户,用于反向同步到本地 List ddUserList = this.getDtAllUserByDepartment(allDepartment, accessToken); for (User dtUserInfo : ddUserList) { SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(dtUserInfo.getUserid(), ThirdAppConfig.DINGTALK.toLowerCase()); List collect = sysUsersList.stream().filter(user -> (dtUserInfo.getMobile().equals(user.getPhone()) || dtUserInfo.getUserid().equals(user.getUsername())) ).collect(Collectors.toList()); if (collect != null && collect.size() > 0) { SysUser sysUserTemp = collect.get(0); // 循环到此说明用户匹配成功,进行更新操作 SysUser updateSysUser = this.dtUserToSysUser(dtUserInfo, sysUserTemp); try { sysUserService.updateById(updateSysUser); String str = String.format("用户 %s(%s) 更新成功!", updateSysUser.getRealname(), updateSysUser.getUsername()); syncInfo.addSuccessInfo(str); } catch (Exception e) { this.syncUserCollectErrInfo(e, dtUserInfo, syncInfo); } //第三方账号关系表 this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), dtUserInfo.getUserid()); }else{ // 如果没有匹配到用户,则走创建逻辑 SysUser newSysUser = this.dtUserToSysUser(dtUserInfo); try { sysUserService.save(newSysUser); String str = String.format("用户 %s(%s) 创建成功!", newSysUser.getRealname(), newSysUser.getUsername()); syncInfo.addSuccessInfo(str); } catch (Exception e) { this.syncUserCollectErrInfo(e, dtUserInfo, syncInfo); } //第三方账号关系表 this.thirdAccountSaveOrUpdate(null, newSysUser.getId(), dtUserInfo.getUserid()); } } return syncInfo; } private List getDtAllUserByDepartment(List allDepartment, String accessToken) { // 根据钉钉部门查询所有钉钉用户,用于反向同步到本地 List userList = new ArrayList<>(); for (Department department : allDepartment) { this.getUserListByDeptIdRecursion(department.getDept_id(), 0, userList, accessToken); } return userList; } /** * 递归查询所有用户 */ private void getUserListByDeptIdRecursion(int deptId, int cursor, List userList, String accessToken) { // 根据钉钉部门查询所有钉钉用户,用于反向同步到本地 GetUserListBody getUserListBody = new GetUserListBody(deptId, cursor, 100); Response> response = JdtUserAPI.getUserListByDeptId(getUserListBody, accessToken); if (response.isSuccess()) { PageResult page = response.getResult(); userList.addAll(page.getList()); if (page.getHas_more()) { this.getUserListByDeptIdRecursion(deptId, page.getNext_cursor(), userList, accessToken); } } } /** * 保存或修改第三方登录表 * * @param sysThirdAccount 第三方账户表对象,为null就新增数据,否则就修改 * @param sysUserId 本地系统用户ID * @param dtUserId 钉钉用户ID */ private void thirdAccountSaveOrUpdate(SysThirdAccount sysThirdAccount, String sysUserId, String dtUserId) { if (sysThirdAccount == null) { sysThirdAccount = new SysThirdAccount(); sysThirdAccount.setSysUserId(sysUserId); sysThirdAccount.setStatus(1); sysThirdAccount.setDelFlag(0); sysThirdAccount.setThirdType(ThirdAppConfig.DINGTALK.toLowerCase()); } sysThirdAccount.setThirdUserId(dtUserId); sysThirdAccountService.saveOrUpdate(sysThirdAccount); } /** * 【同步用户】收集同步过程中的错误信息 */ private boolean syncUserCollectErrInfo(Response response, SysUser sysUser, SyncInfoVo syncInfo) { if (!response.isSuccess()) { String str = String.format("用户 %s(%s) 同步失败!错误码:%s——%s", sysUser.getUsername(), sysUser.getRealname(), response.getErrcode(), response.getErrmsg()); syncInfo.addFailInfo(str); return false; } else { String str = String.format("用户 %s(%s) 同步成功!", sysUser.getUsername(), sysUser.getRealname()); syncInfo.addSuccessInfo(str); return true; } } /** * 【同步用户】收集同步过程中的错误信息 */ private boolean syncUserCollectErrInfo(Exception e, User dtUser, SyncInfoVo syncInfo) { String msg; if (e instanceof DuplicateKeyException) { msg = e.getCause().getMessage(); } else { msg = e.getMessage(); } String str = String.format("用户 %s(%s) 同步失败!错误信息:%s", dtUser.getUserid(), dtUser.getName(), msg); syncInfo.addFailInfo(str); return false; } /** * 【同步用户】将SysUser转为【钉钉】的User对象(创建新用户) */ private User sysUserToDtUser(SysUser sysUser, List allDepartment) { User user = new User(); // 通过 username 来关联 user.setUserid(sysUser.getUsername()); return this.sysUserToDtUser(sysUser, user, allDepartment); } /** * 【同步用户】将SysUser转为【钉钉】的User对象(更新旧用户) */ private User sysUserToDtUser(SysUser sysUser, User user, List allDepartment) { user.setName(sysUser.getRealname()); user.setMobile(sysUser.getPhone()); user.setTelephone(sysUser.getTelephone()); user.setJob_number(sysUser.getWorkNo()); // 职务翻译 if (oConvertUtils.isNotEmpty(sysUser.getPost())) { SysPosition position = sysPositionService.getByCode(sysUser.getPost()); if (position != null) { user.setTitle(position.getName()); } } user.setEmail(sysUser.getEmail()); // 查询并同步用户部门关系 List departList = this.getUserDepart(sysUser); if (departList != null) { List departmentIdList = new ArrayList<>(); for (SysDepart sysDepart : departList) { // 企业微信的部门id Department department = this.getDepartmentByDepartId(sysDepart.getId(), allDepartment); if (department != null) { departmentIdList.add(department.getDept_id()); } } user.setDept_id_list(departmentIdList.toArray(new Integer[]{})); user.setDept_order_list(null); } if (oConvertUtils.isEmpty(user.getDept_id_list())) { // 没有找到匹配部门,同步到根部门下 user.setDept_id_list(1); user.setDept_order_list(null); } // --- 钉钉没有逻辑删除功能 // sysUser.getDelFlag() // --- 钉钉没有冻结、启用禁用功能 // sysUser.getStatus() return user; } /** * 【同步用户】将【钉钉】的User对象转为SysUser(创建新用户) */ private SysUser dtUserToSysUser(User dtUser) { SysUser sysUser = new SysUser(); sysUser.setDelFlag(0); // 通过 username 来关联 sysUser.setUsername(dtUser.getUserid()); // 密码默认为 “123456”,随机加盐 String password = "123456", salt = oConvertUtils.randomGen(8); String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt); sysUser.setSalt(salt); sysUser.setPassword(passwordEncode); return this.dtUserToSysUser(dtUser, sysUser); } /** * 【同步用户】将【钉钉】的User对象转为SysUser(更新旧用户) */ private SysUser dtUserToSysUser(User dtUser, SysUser oldSysUser) { SysUser sysUser = new SysUser(); BeanUtils.copyProperties(oldSysUser, sysUser); sysUser.setRealname(dtUser.getName()); sysUser.setPhone(dtUser.getMobile()); sysUser.setTelephone(dtUser.getTelephone()); // 因为唯一键约束的原因,如果原数据和旧数据相同,就不更新 if (oConvertUtils.isNotEmpty(dtUser.getEmail()) && !dtUser.getEmail().equals(sysUser.getEmail())) { sysUser.setEmail(dtUser.getEmail()); } else { sysUser.setEmail(null); } // 因为唯一键约束的原因,如果原数据和旧数据相同,就不更新 if (oConvertUtils.isNotEmpty(dtUser.getMobile()) && !dtUser.getMobile().equals(sysUser.getPhone())) { sysUser.setPhone(dtUser.getMobile()); } else { sysUser.setPhone(null); } sysUser.setWorkNo(null); // --- 钉钉没有逻辑删除功能 // sysUser.getDelFlag() // --- 钉钉没有冻结、启用禁用功能 // sysUser.getStatus() return sysUser; } /** * 查询用户和部门的关系 */ private List getUserDepart(SysUser sysUser) { // 根据用户部门关系表查询出用户的部门 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysUserDepart::getUserId, sysUser.getId()); List sysUserDepartList = sysUserDepartService.list(queryWrapper); if (sysUserDepartList.size() == 0) { return null; } // 根据用户部门 LambdaQueryWrapper departQueryWrapper = new LambdaQueryWrapper<>(); List departIdList = sysUserDepartList.stream().map(SysUserDepart::getDepId).collect(Collectors.toList()); departQueryWrapper.in(SysDepart::getId, departIdList); List departList = sysDepartService.list(departQueryWrapper); return departList.size() == 0 ? null : departList; } /** * 根据sysDepartId查询钉钉的部门 */ private Department getDepartmentByDepartId(String departId, List allDepartment) { for (Department department : allDepartment) { if (departId.equals(department.getSource_identifier())) { return department; } } return null; } /** * 【同步部门】将SysDepartTreeModel转为【钉钉】的Department对象(创建新部门) */ private Department sysDepartToDtDepartment(SysDepartTreeModel departTree, Integer parentId) { Department department = new Department(); department.setSource_identifier(departTree.getId()); return this.sysDepartToDtDepartment(departTree, department, parentId); } /** * 【同步部门】将SysDepartTreeModel转为【钉钉】的Department对象 */ private Department sysDepartToDtDepartment(SysDepartTreeModel departTree, Department department, Integer parentId) { department.setName(departTree.getDepartName()); department.setParent_id(parentId); department.setOrder(departTree.getDepartOrder()); return department; } /** * 【同步部门】将【钉钉】的Department对象转为SysDepartTreeModel */ private SysDepart dtDepartmentToSysDepart(Department department, SysDepart departTree) { SysDepart sysDepart = new SysDepart(); if (departTree != null) { BeanUtils.copyProperties(departTree, sysDepart); } sysDepart.setDepartName(department.getName()); sysDepart.setDepartOrder(department.getOrder()); return sysDepart; } @Override public int removeThirdAppUser(List userIdList) { // 判断启用状态 if (!thirdAppConfig.isDingtalkEnabled()) { return -1; } int count = 0; if (userIdList != null && userIdList.size() > 0) { String accessToken = this.getAccessToken(); if (accessToken == null) { return count; } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysThirdAccount::getThirdType, ThirdAppConfig.DINGTALK.toLowerCase()); queryWrapper.in(SysThirdAccount::getSysUserId, userIdList); // 根据userId,获取第三方用户的id List thirdAccountList = sysThirdAccountService.list(queryWrapper); List thirdUserIdList = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); for (String thirdUserId : thirdUserIdList) { if (oConvertUtils.isNotEmpty(thirdUserId)) { // 没有批量删除的接口 Response response = JdtUserAPI.delete(thirdUserId, accessToken); if (response.getErrcode() == 0) { count++; } } } } return count; } @Override public boolean sendMessage(MessageDTO message) { return this.sendMessage(message, false); } /** * 发送消息 * * @param message * @param verifyConfig * @return */ public boolean sendMessage(MessageDTO message, boolean verifyConfig) { Response response = this.sendMessageResponse(message, verifyConfig); if (response != null) { return response.isSuccess(); } return false; } public Response sendMessageResponse(MessageDTO message, boolean verifyConfig) { if (verifyConfig && !thirdAppConfig.isDingtalkEnabled()) { return null; } String accessToken = this.getAccessToken(); if (accessToken == null) { return null; } // 封装钉钉消息 String content = message.getContent(); int agentId = thirdAppConfig.getDingtalk().getAgentIdInt(); Message textMessage = new Message<>(agentId, new TextMessage(content)); if (message.isToAll()) { textMessage.setTo_all_user(true); } else { String[] toUsers = message.getToUser().split(","); // 通过第三方账号表查询出第三方userId List thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(toUsers, ThirdAppConfig.DINGTALK.toLowerCase()); List dtUserIds = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); textMessage.setUserid_list(dtUserIds); } return JdtMessageAPI.sendTextMessage(textMessage, accessToken); } public boolean recallMessage(String msg_task_id) { Response response = this.recallMessageResponse(msg_task_id); if (response == null) { return false; } return response.isSuccess(); } /** * 撤回消息 * * @param msg_task_id * @return */ public Response recallMessageResponse(String msg_task_id) { String accessToken = this.getAccessToken(); if (accessToken == null) { return null; } int agentId = thirdAppConfig.getDingtalk().getAgentIdInt(); return JdtMessageAPI.recallMessage(agentId, msg_task_id, getAccessToken()); } /** * 发送卡片消息(SysAnnouncement定制) * * @param announcement * @param verifyConfig 是否验证配置(未启用的APP会拒绝发送) * @return */ public Response sendActionCardMessage(SysAnnouncement announcement, boolean verifyConfig) { if (verifyConfig && !thirdAppConfig.isDingtalkEnabled()) { return null; } String accessToken = this.getAccessToken(); if (accessToken == null) { return null; } int agentId = thirdAppConfig.getDingtalk().getAgentIdInt(); String markdown = "### " + announcement.getTitile() + "\n" + oConvertUtils.getString(announcement.getMsgAbstract(),"空"); ActionCardMessage actionCard = new ActionCardMessage(markdown); actionCard.setTitle(announcement.getTitile()); actionCard.setSingle_title("详情"); actionCard.setSingle_url(RestUtil.getBaseUrl() + "/sys/annountCement/show/" + announcement.getId()); Message actionCardMessage = new Message<>(agentId, actionCard); if (CommonConstant.MSG_TYPE_ALL.equals(announcement.getMsgType())) { actionCardMessage.setTo_all_user(true); return JdtMessageAPI.sendActionCardMessage(actionCardMessage, accessToken); } else { // 将userId转为username String[] userIds = null; String userId = announcement.getUserIds(); if(oConvertUtils.isNotEmpty(userId)){ userIds = userId.substring(0, (userId.length() - 1)).split(","); }else{ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId()); SysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendMapper.selectOne(queryWrapper); userIds = new String[] {sysAnnouncementSend.getUserId()}; } if(userIds!=null){ String[] usernameList = sysUserService.userIdToUsername(Arrays.asList(userIds)).toArray(new String[]{}); // 通过第三方账号表查询出第三方userId List thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(usernameList, ThirdAppConfig.DINGTALK.toLowerCase()); List dtUserIds = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); actionCardMessage.setUserid_list(dtUserIds); return JdtMessageAPI.sendActionCardMessage(actionCardMessage, accessToken); } } return null; } }