package com.qianwen.smartman.modules.sync.service.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Consumer; import java.util.stream.Collectors; import org.jeewx.api.mp.aes.AesException; import org.jeewx.api.mp.aes.WXBizMsgCrypt; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.jeecg.qywx.api.department.vo.Department; import com.qianwen.smartman.common.constant.CommonConstant; import com.qianwen.smartman.common.enums.CommonGroupTypeEnum; import com.qianwen.smartman.modules.cps.entity.CommonGroup; import com.qianwen.smartman.modules.cps.entity.CommonGroupOfItem; import com.qianwen.smartman.modules.cps.entity.Employee; import com.qianwen.smartman.modules.cps.entity.EmployeePost; import com.qianwen.smartman.modules.cps.mapper.CommonGroupMapper; import com.qianwen.smartman.modules.cps.service.IEmployeePostService; import com.qianwen.smartman.modules.cps.service.impl.CommonGroupOfItemServiceImpl; import com.qianwen.smartman.modules.cps.service.impl.CommonGroupServiceImpl; import com.qianwen.smartman.modules.cps.service.impl.EmployeeServiceImpl; import com.qianwen.smartman.modules.sync.api.QyWechatApi; import com.qianwen.smartman.modules.sync.constant.OuterAppConfigConstant; import com.qianwen.smartman.modules.sync.constant.QyWechatConstant; import com.qianwen.smartman.modules.sync.entity.OuterAppConfig; import com.qianwen.smartman.modules.sync.entity.QyTag; import com.qianwen.smartman.modules.sync.entity.QyUser; import com.qianwen.smartman.modules.sync.enums.WechatEventEnum; import com.qianwen.smartman.modules.sync.service.IOuterAppConfigService; import com.qianwen.smartman.modules.sync.service.IWechatCallbackService; import com.qianwen.smartman.modules.sync.vo.WechatCallbackVO; import com.qianwen.smartman.modules.system.entity.Post; import com.qianwen.smartman.modules.system.entity.UserOauth; import com.qianwen.smartman.modules.system.service.impl.PostServiceImpl; import com.qianwen.smartman.modules.system.service.impl.UserOauthServiceImpl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.XmlUtil; @Service /* loaded from: blade-api.jar:BOOT-INF/classes/org/springblade/modules/sync/service/impl/WechatCallbackServiceImpl.class */ public class WechatCallbackServiceImpl implements IWechatCallbackService { private static final Logger log = LoggerFactory.getLogger(WechatCallbackServiceImpl.class); private final Map> xmlParseMap = new HashMap<>(); private final WechatSyncServiceImpl wechatSyncService; private final PostServiceImpl postService; private final IEmployeePostService employeePostService; private final UserOauthServiceImpl userOauthService; private final CommonGroupServiceImpl commonGroupService; private final CommonGroupOfItemServiceImpl commonGroupOfItemService; private final EmployeeServiceImpl employeeService; private final CommonGroupMapper commonGroupMapper; private final IOuterAppConfigService outerAppConfigService; public WechatCallbackServiceImpl(final WechatSyncServiceImpl wechatSyncService, final PostServiceImpl postService, final IEmployeePostService employeePostService, final UserOauthServiceImpl userOauthService, final CommonGroupServiceImpl commonGroupService, final CommonGroupOfItemServiceImpl commonGroupOfItemService, final EmployeeServiceImpl employeeService, final CommonGroupMapper commonGroupMapper, final IOuterAppConfigService outerAppConfigService) { this.xmlParseMap.put(WechatEventEnum.USER_ADD_EVENT, this::parseUserAddEvent); this.xmlParseMap.put(WechatEventEnum.USER_REMOVE_EVENT, this::parseUserRemoveEvent); this.xmlParseMap.put(WechatEventEnum.DEPT_ADD_EVENT, this::parseDeptAddEvent); this.xmlParseMap.put(WechatEventEnum.DEPT_REMOVE_EVENT, this::parseDeptRemoveEvent); this.xmlParseMap.put(WechatEventEnum.TAG_UPDATE_EVENT, this::parseTagModifyEvent); this.wechatSyncService = wechatSyncService; this.postService = postService; this.employeePostService = employeePostService; this.userOauthService = userOauthService; this.commonGroupService = commonGroupService; this.commonGroupOfItemService = commonGroupOfItemService; this.employeeService = employeeService; this.commonGroupMapper = commonGroupMapper; this.outerAppConfigService = outerAppConfigService; } @Override // org.springblade.modules.sync.service.IWechatCallbackService public String callbackVerifyUrl(WechatCallbackVO callbackVO) { OuterAppConfig appConfig = this.outerAppConfigService.getAppConfig(OuterAppConfigConstant.QY_WECHAT); if (Objects.isNull(appConfig) || !appConfig.getStatus().equals(CommonConstant.ENABLE)) { log.info("[企业微信回调事件].[callbackVerifyUrl 配置为空或未启用配置]"); return QyWechatConstant.CALLBACK_RESULT_NULL; } try { WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(appConfig.getWxCallbackToken(), appConfig.getWxAesKey(), appConfig.getWxCorpId()); return wxBizMsgCrypt.verifyUrl(callbackVO.getMsg_signature(), callbackVO.getTimestamp(), callbackVO.getNonce(), callbackVO.getEchostr()); } catch (AesException e) { log.error("[企业微信回调配置校验].[callbackVerifyUrl params={}]", callbackVO, e); return QyWechatConstant.CALLBACK_ERROR; } } @Override // org.springblade.modules.sync.service.IWechatCallbackService @Transactional(rollbackFor = {Exception.class}) public String callbackEvent(WechatCallbackVO callbackVO, String xmlData) { OuterAppConfig appConfig = this.outerAppConfigService.getAppConfig(OuterAppConfigConstant.QY_WECHAT); if (Objects.isNull(appConfig) || !appConfig.getStatus().equals(CommonConstant.ENABLE)) { log.info("[企业微信回调事件].[callbackEvent 配置为空或未启用配置]"); return QyWechatConstant.CALLBACK_RESULT_NULL; } try { WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(appConfig.getWxCallbackToken(), appConfig.getWxAesKey(), appConfig.getWxCorpId()); String msg = wxBizMsgCrypt.decryptMsg(callbackVO.getMsg_signature(), callbackVO.getTimestamp(), callbackVO.getNonce(), xmlData); WechatEventEnum eventType = getEventType(msg); execSyncCallback(eventType, msg); return QyWechatConstant.CALLBACK_RESULT; } catch (Exception e) { log.error("[企业微信回调事件].[WechatCallbackVO error params={}]", callbackVO, e); return QyWechatConstant.CALLBACK_RESULT; } } private WechatEventEnum getEventType(String xmlData) { Document document = XmlUtil.parseXml(xmlData); Element root = document.getDocumentElement(); String type = XmlUtil.elementText(root, QyWechatConstant.EVENT_TYPE); if (StrUtil.isNotEmpty(type)) { return WechatEventEnum.getWechatEventType(type); } return WechatEventEnum.DEFAULT; } private String getUserId(String xmlData) { Document document = XmlUtil.parseXml(xmlData); Element root = document.getDocumentElement(); String userId = XmlUtil.elementText(root, QyWechatConstant.USER_ID); if (StrUtil.isEmpty(userId)) { return ""; } return userId; } private String getDeptId(String xmlData) { Document document = XmlUtil.parseXml(xmlData); Element root = document.getDocumentElement(); String deptId = XmlUtil.elementText(root, QyWechatConstant.DEPT_ID); if (StrUtil.isEmpty(deptId)) { return ""; } return deptId; } private TagModifyBody getTagBody(String xmlData) { Document document = XmlUtil.parseXml(xmlData); Element root = document.getDocumentElement(); String tagId = XmlUtil.elementText(root, QyWechatConstant.TAG_ID); String addUserList = XmlUtil.elementText(root, QyWechatConstant.TAG_ADD_USER); List addUserIds = parseCallbackStr(addUserList); String deleteUserList = XmlUtil.elementText(root, QyWechatConstant.TAG_DELETE_USER); List delUserIds = parseCallbackStr(deleteUserList); String tagName = getTagName(tagId); return TagModifyBody.builder().tagId(tagId).addUserList(addUserIds).deleteList(delUserIds).tagName(tagName).build(); } private List parseCallbackStr(String callbackData) { if (StrUtil.isEmpty(callbackData)) { return new ArrayList<>(); } String[] dataArr = callbackData.split(","); return ListUtil.toList(dataArr); } private String getTagName(String tagId) { List tags = QyWechatApi.getTags(); for (QyTag tag : tags) { if (tag.getTagid().equals(tagId)) { return tag.getTagname(); } } return ""; } /* JADX INFO: Access modifiers changed from: private */ /* loaded from: blade-api.jar:BOOT-INF/classes/org/springblade/modules/sync/service/impl/WechatCallbackServiceImpl$TagModifyBody.class */ public static class TagModifyBody { String tagId; String tagName; List addUserList; List deleteList; public void setTagId(final String tagId) { this.tagId = tagId; } public void setTagName(final String tagName) { this.tagName = tagName; } public void setAddUserList(final List addUserList) { this.addUserList = addUserList; } public void setDeleteList(final List deleteList) { this.deleteList = deleteList; } public TagModifyBody(final String tagId, final String tagName, final List addUserList, final List deleteList) { this.tagId = tagId; this.tagName = tagName; this.addUserList = addUserList; this.deleteList = deleteList; } /* loaded from: blade-api.jar:BOOT-INF/classes/org/springblade/modules/sync/service/impl/WechatCallbackServiceImpl$TagModifyBody$TagModifyBodyBuilder.class */ public static class TagModifyBodyBuilder { private String tagId; private String tagName; private List addUserList; private List deleteList; TagModifyBodyBuilder() { } public TagModifyBodyBuilder tagId(final String tagId) { this.tagId = tagId; return this; } public TagModifyBodyBuilder tagName(final String tagName) { this.tagName = tagName; return this; } public TagModifyBodyBuilder addUserList(final List addUserList) { this.addUserList = addUserList; return this; } public TagModifyBodyBuilder deleteList(final List deleteList) { this.deleteList = deleteList; return this; } public TagModifyBody build() { return new TagModifyBody(this.tagId, this.tagName, this.addUserList, this.deleteList); } public String toString() { return "WechatCallbackServiceImpl.TagModifyBody.TagModifyBodyBuilder(tagId=" + this.tagId + ", tagName=" + this.tagName + ", addUserList=" + this.addUserList + ", deleteList=" + this.deleteList + ")"; } } public TagModifyBody() { } public static TagModifyBodyBuilder builder() { return new TagModifyBodyBuilder(); } public String getTagId() { return this.tagId; } public String getTagName() { return this.tagName; } public List getAddUserList() { return this.addUserList; } public List getDeleteList() { return this.deleteList; } } private void parseUserAddEvent(String xmlData) { String userId = getUserId(xmlData); if (StrUtil.isEmpty(userId)) { return; } QyUser qyUser = QyWechatApi.getUserById(userId); UserOauth userOauth = this.userOauthService.getOne(Wrappers.lambdaQuery().eq(UserOauth::getUuid, userId) .eq(UserOauth::getSource, "WECHAT_ENTERPRISE_WEB"), Boolean.TRUE.booleanValue()); /* UserOauth userOauth = (UserOauth) this.userOauthService.getOne((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getUuid(); }, userId)).eq((v0) -> { return v0.getSource(); }, QyWechatConstant.QY_SOURCE), Boolean.TRUE.booleanValue());*/ this.wechatSyncService.createOrModifyEmployee(qyUser, userOauth); } private void parseUserRemoveEvent(String xmlData) { String userId = getUserId(xmlData); if (StrUtil.isEmpty(userId)) { return; } UserOauth userOauth = this.userOauthService.getOne(Wrappers.lambdaQuery().eq(UserOauth::getUuid, userId)); /* UserOauth userOauth = (UserOauth) this.userOauthService.getOne((Wrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getUuid(); }, userId));*/ if (Objects.isNull(userOauth)) { return; } this.userOauthService.removeById(userOauth.getId()); Employee employee = (Employee) this.employeeService.getById(userOauth.getUserId()); if (Objects.isNull(employee)) { return; } this.employeeService.removeById(employee); this.commonGroupOfItemService.remove(Wrappers.lambdaQuery() .eq(CommonGroupOfItem::getGroupId, employee.getOrganizationId()) .eq(CommonGroupOfItem::getItemId, employee.getId())); /* this.commonGroupOfItemService.remove((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getGroupId(); }, employee.getOrganizationId())).eq((v0) -> { return v0.getItemId(); }, employee.getId()));*/ this.employeePostService.remove(Wrappers.lambdaQuery() .eq(EmployeePost::getPostId, employee.getPostId()) .eq(EmployeePost::getEmployeeId, employee.getId())); /* this.employeePostService.remove((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getPostId(); }, employee.getPostId())).eq((v0) -> { return v0.getEmployeeId(); }, employee.getId()));*/ } private void parseDeptAddEvent(String xmlBody) { String deptId = getDeptId(xmlBody); if (StrUtil.isEmpty(deptId)) { return; } saveCommonGroup(deptId); } private void saveCommonGroup(String deptId) { Department department = QyWechatApi.getDeptById(deptId); CommonGroup commonGroup = this.wechatSyncService.setCommonGroup(department); this.commonGroupService.insert(commonGroup); } private void parseDeptRemoveEvent(String xmlBody) { String deptId = getDeptId(xmlBody); if (StrUtil.isEmpty(deptId)) { return; } String localDeptId = QyWechatConstant.ID_SALT + deptId; long count = this.employeeService.count(Wrappers.lambdaQuery().eq(Employee::getOrganizationId, localDeptId)); /* long count = this.employeeService.count((Wrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getOrganizationId(); }, localDeptId));*/ if (count > 0) { log.warn("[部门删除回调事件].[当前部门下有{}个员工,无法删除]", Long.valueOf(count)); return; } this.commonGroupMapper.removeOrgByIds(ListUtil.of(new String[]{localDeptId})); this.commonGroupOfItemService.remove(Wrappers.lambdaQuery() .eq(CommonGroupOfItem::getGroupId, localDeptId).eq(CommonGroupOfItem::getGroupType, CommonGroupTypeEnum.ORGANIZATION.getName())); /* this.commonGroupOfItemService.remove((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getGroupId(); }, localDeptId)).eq((v0) -> { return v0.getGroupType(); }, CommonGroupTypeEnum.ORGANIZATION.getName()));*/ } private void parseTagModifyEvent(String xmlBody) { TagModifyBody tagBody = getTagBody(xmlBody); Post post = (Post) this.postService.getById(tagBody.getTagId()); if (Objects.isNull(post)) { this.postService.save(this.wechatSyncService.setPost(tagBody.getTagName(), tagBody.getTagId())); } addUsersByTag(tagBody); delUsersByTag(tagBody); } private void delUsersByTag(TagModifyBody tagBody) { if (CollectionUtil.isNotEmpty(tagBody.getDeleteList())) { log.info("[企业微信标签回调事件].[标签删除用户 userList={}]", tagBody.getDeleteList()); List employees = getEmpList(tagBody.getDeleteList()); employees.forEach(emp -> { String handlerPostId = handlerPostId(Boolean.TRUE, emp.getPostId(), tagBody.getTagId()); this.employeePostService.remove(Wrappers.lambdaQuery().eq(EmployeePost::getPostId, tagBody.getTagId()) .eq(EmployeePost::getEmployeeId, emp.getId())); /* this.employeePostService.remove((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getPostId(); }, tagBody.getTagId())).eq((v0) -> { return v0.getEmployeeId(); }, emp.getId()));*/ emp.setPostId(handlerPostId); }); this.employeeService.updateBatchById(employees); } } private String handlerPostId(Boolean isDel, String sourcePostId, String tagPostId) { ArrayList postList; if (StrUtil.isEmpty(sourcePostId)) { postList = new ArrayList<>(); } else { String[] postIds = sourcePostId.split(","); postList = ListUtil.toList(postIds); } if (isDel.booleanValue()) { postList.removeIf(id -> { return id.equals(tagPostId); }); } else { postList.add(tagPostId); } return CollectionUtil.join(postList, ","); } private void addUsersByTag(TagModifyBody tagBody) { if (CollectionUtil.isNotEmpty(tagBody.getAddUserList())) { log.info("[企业微信标签回调事件].[标签新增用户 userList={}]", tagBody.getAddUserList()); List employees = getEmpList(tagBody.getAddUserList()); List employeePosts = new ArrayList<>(); employees.forEach(emp -> { String handlerPostId = handlerPostId(Boolean.FALSE, emp.getPostId(), tagBody.getTagId()); employeePosts.add(this.wechatSyncService.setEmployeePost(tagBody.getTagId(), String.valueOf(emp.getId()))); emp.setPostId(handlerPostId); }); if (CollectionUtil.isNotEmpty(employeePosts)) { this.employeePostService.saveBatch(employeePosts); } this.employeeService.updateBatchById(employees); } } private List getEmpList(List userIds) { List auths = this.userOauthService.list(Wrappers.lambdaQuery().in(UserOauth::getUuid, userIds)); /* List auths = this.userOauthService.list((Wrapper) Wrappers.lambdaQuery().in((v0) -> { return v0.getUuid(); }, userIds));*/ if (CollectionUtil.isEmpty(auths)) { return new ArrayList<>(); } List empIds = auths.parallelStream().map((v0) -> { return v0.getUserId(); }).collect(Collectors.toList()); return this.employeeService.listByIds(empIds); } private void execSyncCallback(WechatEventEnum wechatEventEnum, String xmlData) { Consumer parseMethod = this.xmlParseMap.get(wechatEventEnum); if (parseMethod != null) { parseMethod.accept(xmlData); log.info("[企业微信{}回调事件].[execSyncCallback 解析回调数据,进行同步]", wechatEventEnum.getDesc()); } } }