|
|
@@ -214,9 +214,13 @@ public class QwDataCallbackService {
|
|
|
|
|
|
String userId = root.getElementsByTagName("UserID").item(0).getTextContent();
|
|
|
String externalUserId = root.getElementsByTagName("ExternalUserID").item(0).getTextContent();
|
|
|
- String cacheKey = "qwApiExternal:" + userId + ":" + corpId + ":" + externalUserId;
|
|
|
- String lockKey = "lock:qwApiExternal:" + userId + ":" + corpId + ":" + externalUserId; // 锁Key(Hash类型,加前缀lock:)
|
|
|
- QwUser qwUser = qwUserMapper.selectQwUserByCorpIdAndUserId(corpId, root.getElementsByTagName("UserID").item(0).getTextContent());
|
|
|
+ String cacheKey = buildQwApiExternalCacheKey(userId, corpId, externalUserId);
|
|
|
+ String lockKey = "lock:" + cacheKey;
|
|
|
+ QwUser qwUser = qwUserMapper.selectQwUserByCorpIdAndUserId(corpId, userId);
|
|
|
+ if (qwUser == null) {
|
|
|
+ log.warn("add_external_contact:未找到企微员工,corpId={}, userId={}, externalUserId={}", corpId, userId, externalUserId);
|
|
|
+ break;
|
|
|
+ }
|
|
|
log.info("qw_user_id:{}:客户进量", qwUser.getId());
|
|
|
|
|
|
// 2. 获取 Redisson 分布式锁
|
|
|
@@ -232,20 +236,27 @@ public class QwDataCallbackService {
|
|
|
try {
|
|
|
// 5. 新增用户
|
|
|
log.info("qw_user_id:{}:进入新增逻辑", qwUser.getId());
|
|
|
- qwExternalContactService.insertQwExternalContactByExternalUserId(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),null,corpId,State,WelcomeCode, qwUser);
|
|
|
+ qwExternalContactService.insertQwExternalContactByExternalUserId(externalUserId, userId, null, corpId, State, WelcomeCode, qwUser);
|
|
|
// 6. 业务逻辑执行成功后,写入 Redis 缓存(有效期 10 分钟)
|
|
|
redisCache.setCacheObject(cacheKey, "1", 10, TimeUnit.MINUTES);
|
|
|
|
|
|
// 广告线索处理
|
|
|
- leadService.updateAddMemberLead(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),corpId,State);
|
|
|
+ leadService.updateAddMemberLead(externalUserId, userId, corpId, State);
|
|
|
} catch (Exception e) {
|
|
|
// 7. 业务逻辑失败时,删除缓存
|
|
|
redisCache.deleteObject(cacheKey);
|
|
|
+ log.error("add_external_contact 处理失败: externalUserId={}, userId={}", externalUserId, userId, e);
|
|
|
}
|
|
|
+ } else {
|
|
|
+ log.info("qw_user_id:{}:命中Redis防重,执行删了又加恢复: externalUserId={}", qwUser.getId(), externalUserId);
|
|
|
+ qwExternalContactService.restoreExternalContactOnReAdd(externalUserId, userId, corpId);
|
|
|
}
|
|
|
+ } else {
|
|
|
+ log.warn("add_external_contact 未获取到锁: externalUserId={}, userId={}", externalUserId, userId);
|
|
|
}
|
|
|
} catch (InterruptedException e) {
|
|
|
- logger.error("中断异常");
|
|
|
+ logger.error("add_external_contact 中断异常", e);
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
} finally {
|
|
|
// 4. 确保锁最终被释放(只有加锁成功的线程才需要释放)
|
|
|
if (isLocked && lock.isHeldByCurrentThread()) {
|
|
|
@@ -258,16 +269,24 @@ public class QwDataCallbackService {
|
|
|
log.info("企业联系人时间变更,edit_external_contact:{}", sMsg);
|
|
|
qwExternalContactService.updateQwExternalContactByExternalUserId(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),corpId);
|
|
|
break;
|
|
|
- case "del_external_contact":
|
|
|
+ case "del_external_contact": {
|
|
|
+ String delUserId = root.getElementsByTagName("UserID").item(0).getTextContent();
|
|
|
+ String delExternalUserId = root.getElementsByTagName("ExternalUserID").item(0).getTextContent();
|
|
|
log.info("企业联系人时间变更,del_external_contact:{}", sMsg);
|
|
|
- qwExternalContactService.deleteQwExternalContactByExternalUserId(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),corpId);
|
|
|
+ redisCache.deleteObject(buildQwApiExternalCacheKey(delUserId, corpId, delExternalUserId));
|
|
|
+ qwExternalContactService.deleteQwExternalContactByExternalUserId(delExternalUserId, delUserId, corpId);
|
|
|
break;
|
|
|
- case "del_follow_user":
|
|
|
+ }
|
|
|
+ case "del_follow_user": {
|
|
|
+ String lossUserId = root.getElementsByTagName("UserID").item(0).getTextContent();
|
|
|
+ String lossExternalUserId = root.getElementsByTagName("ExternalUserID").item(0).getTextContent();
|
|
|
log.info("企业联系人时间变更,del_follow_user:{}", sMsg);
|
|
|
- qwExternalContactService.deletefollowUserByExternalUserId(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),corpId);
|
|
|
+ redisCache.deleteObject(buildQwApiExternalCacheKey(lossUserId, corpId, lossExternalUserId));
|
|
|
+ qwExternalContactService.deletefollowUserByExternalUserId(lossExternalUserId, lossUserId, corpId);
|
|
|
// 广告线索处理
|
|
|
- leadService.updateDeleteMemberLead(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),corpId);
|
|
|
+ leadService.updateDeleteMemberLead(lossExternalUserId, lossUserId, corpId);
|
|
|
break;
|
|
|
+ }
|
|
|
case "transfer_fail":
|
|
|
log.info("企业联系人时间变更,transfer_fail:{}", sMsg);
|
|
|
qwExternalContactService.transferFailByExternalUserId(root.getElementsByTagName("ExternalUserID").item(0).getTextContent(),root.getElementsByTagName("UserID").item(0).getTextContent(),corpId,root.getElementsByTagName("FailReason").item(0).getTextContent());
|
|
|
@@ -881,4 +900,8 @@ public class QwDataCallbackService {
|
|
|
return s;
|
|
|
}
|
|
|
|
|
|
+ private String buildQwApiExternalCacheKey(String userId, String corpId, String externalUserId) {
|
|
|
+ return "qwApiExternal:" + userId + ":" + corpId + ":" + externalUserId;
|
|
|
+ }
|
|
|
+
|
|
|
}
|